@scalar/workspace-store 0.20.0 → 0.22.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 (260) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/README.md +2 -2
  3. package/dist/client.d.ts +54 -6
  4. package/dist/client.d.ts.map +1 -1
  5. package/dist/client.js +66 -29
  6. package/dist/client.js.map +2 -2
  7. package/dist/events/bus.d.ts +14 -2
  8. package/dist/events/bus.d.ts.map +1 -1
  9. package/dist/events/bus.js +46 -10
  10. package/dist/events/bus.js.map +3 -3
  11. package/dist/events/definitions/auth.d.ts +2 -1
  12. package/dist/events/definitions/auth.d.ts.map +1 -1
  13. package/dist/events/definitions/cookie.d.ts +20 -0
  14. package/dist/events/definitions/cookie.d.ts.map +1 -0
  15. package/dist/events/definitions/cookie.js +1 -0
  16. package/dist/events/definitions/cookie.js.map +7 -0
  17. package/dist/events/definitions/document.d.ts +19 -2
  18. package/dist/events/definitions/document.d.ts.map +1 -1
  19. package/dist/events/definitions/index.d.ts +6 -1
  20. package/dist/events/definitions/index.d.ts.map +1 -1
  21. package/dist/events/definitions/operation.d.ts +20 -14
  22. package/dist/events/definitions/operation.d.ts.map +1 -1
  23. package/dist/events/definitions/server.d.ts +2 -2
  24. package/dist/events/definitions/server.d.ts.map +1 -1
  25. package/dist/events/definitions/tabs.d.ts +55 -0
  26. package/dist/events/definitions/tabs.d.ts.map +1 -0
  27. package/dist/events/definitions/tabs.js +1 -0
  28. package/dist/events/definitions/tabs.js.map +7 -0
  29. package/dist/events/definitions/tag.d.ts +15 -0
  30. package/dist/events/definitions/tag.d.ts.map +1 -0
  31. package/dist/events/definitions/tag.js +1 -0
  32. package/dist/events/definitions/tag.js.map +7 -0
  33. package/dist/events/definitions/ui.d.ts +131 -39
  34. package/dist/events/definitions/ui.d.ts.map +1 -1
  35. package/dist/events/definitions/workspace.d.ts +18 -0
  36. package/dist/events/definitions/workspace.d.ts.map +1 -0
  37. package/dist/events/definitions/workspace.js +1 -0
  38. package/dist/events/definitions/workspace.js.map +7 -0
  39. package/dist/events/index.d.ts +1 -1
  40. package/dist/events/index.d.ts.map +1 -1
  41. package/dist/events/index.js.map +2 -2
  42. package/dist/helpers/generate-unique-value.d.ts +19 -6
  43. package/dist/helpers/generate-unique-value.d.ts.map +1 -1
  44. package/dist/helpers/generate-unique-value.js +12 -7
  45. package/dist/helpers/generate-unique-value.js.map +2 -2
  46. package/dist/helpers/unpack-proxy.d.ts +14 -1
  47. package/dist/helpers/unpack-proxy.d.ts.map +1 -1
  48. package/dist/helpers/unpack-proxy.js +51 -1
  49. package/dist/helpers/unpack-proxy.js.map +3 -3
  50. package/dist/mutators/auth.d.ts +7 -2
  51. package/dist/mutators/auth.d.ts.map +1 -1
  52. package/dist/mutators/auth.js +24 -21
  53. package/dist/mutators/auth.js.map +2 -2
  54. package/dist/mutators/cookie.d.ts +21 -13
  55. package/dist/mutators/cookie.d.ts.map +1 -1
  56. package/dist/mutators/cookie.js +34 -26
  57. package/dist/mutators/cookie.js.map +3 -3
  58. package/dist/mutators/document.d.ts +12 -2
  59. package/dist/mutators/document.d.ts.map +1 -1
  60. package/dist/mutators/document.js +42 -3
  61. package/dist/mutators/document.js.map +2 -2
  62. package/dist/mutators/index.d.ts +30 -20
  63. package/dist/mutators/index.d.ts.map +1 -1
  64. package/dist/mutators/index.js +38 -9
  65. package/dist/mutators/index.js.map +2 -2
  66. package/dist/mutators/operation.d.ts +49 -108
  67. package/dist/mutators/operation.d.ts.map +1 -1
  68. package/dist/mutators/operation.js +198 -94
  69. package/dist/mutators/operation.js.map +2 -2
  70. package/dist/mutators/request.d.ts +2 -1
  71. package/dist/mutators/request.d.ts.map +1 -1
  72. package/dist/mutators/request.js.map +1 -1
  73. package/dist/mutators/server.d.ts +1 -1
  74. package/dist/mutators/server.d.ts.map +1 -1
  75. package/dist/mutators/server.js +6 -5
  76. package/dist/mutators/server.js.map +2 -2
  77. package/dist/mutators/tabs.d.ts +44 -0
  78. package/dist/mutators/tabs.d.ts.map +1 -0
  79. package/dist/mutators/tabs.js +133 -0
  80. package/dist/mutators/tabs.js.map +7 -0
  81. package/dist/mutators/tag.d.ts +12 -0
  82. package/dist/mutators/tag.d.ts.map +1 -0
  83. package/dist/mutators/tag.js +19 -0
  84. package/dist/mutators/tag.js.map +7 -0
  85. package/dist/mutators/workspace.d.ts +6 -0
  86. package/dist/mutators/workspace.d.ts.map +1 -0
  87. package/dist/mutators/workspace.js +24 -0
  88. package/dist/mutators/workspace.js.map +7 -0
  89. package/dist/navigation/get-navigation-options.d.ts.map +1 -1
  90. package/dist/navigation/get-navigation-options.js +4 -4
  91. package/dist/navigation/get-navigation-options.js.map +2 -2
  92. package/dist/navigation/helpers/get-openapi-object.d.ts +35 -0
  93. package/dist/navigation/helpers/get-openapi-object.d.ts.map +1 -0
  94. package/dist/navigation/helpers/get-openapi-object.js +31 -0
  95. package/dist/navigation/helpers/get-openapi-object.js.map +7 -0
  96. package/dist/navigation/helpers/get-operation-entries.d.ts +24 -0
  97. package/dist/navigation/helpers/get-operation-entries.d.ts.map +1 -0
  98. package/dist/navigation/helpers/get-operation-entries.js +33 -0
  99. package/dist/navigation/helpers/get-operation-entries.js.map +7 -0
  100. package/dist/navigation/helpers/get-parent-entry.d.ts +15 -0
  101. package/dist/navigation/helpers/get-parent-entry.d.ts.map +1 -0
  102. package/dist/navigation/helpers/get-parent-entry.js +13 -0
  103. package/dist/navigation/helpers/get-parent-entry.js.map +7 -0
  104. package/dist/navigation/helpers/traverse-description.d.ts +0 -1
  105. package/dist/navigation/helpers/traverse-description.d.ts.map +1 -1
  106. package/dist/navigation/helpers/traverse-description.js +0 -1
  107. package/dist/navigation/helpers/traverse-description.js.map +2 -2
  108. package/dist/navigation/helpers/traverse-document.d.ts +1 -0
  109. package/dist/navigation/helpers/traverse-document.d.ts.map +1 -1
  110. package/dist/navigation/helpers/traverse-document.js +16 -2
  111. package/dist/navigation/helpers/traverse-document.js.map +2 -2
  112. package/dist/navigation/helpers/traverse-examples.js +2 -2
  113. package/dist/navigation/helpers/traverse-examples.js.map +2 -2
  114. package/dist/navigation/helpers/traverse-paths.d.ts +6 -3
  115. package/dist/navigation/helpers/traverse-paths.d.ts.map +1 -1
  116. package/dist/navigation/helpers/traverse-paths.js +5 -10
  117. package/dist/navigation/helpers/traverse-paths.js.map +2 -2
  118. package/dist/navigation/helpers/traverse-tags.d.ts +0 -1
  119. package/dist/navigation/helpers/traverse-tags.d.ts.map +1 -1
  120. package/dist/navigation/helpers/traverse-tags.js +57 -49
  121. package/dist/navigation/helpers/traverse-tags.js.map +3 -3
  122. package/dist/navigation/helpers/utils.d.ts +2 -1
  123. package/dist/navigation/helpers/utils.d.ts.map +1 -1
  124. package/dist/navigation/helpers/utils.js.map +1 -1
  125. package/dist/navigation/index.d.ts +2 -1
  126. package/dist/navigation/index.d.ts.map +1 -1
  127. package/dist/navigation/index.js +5 -3
  128. package/dist/navigation/index.js.map +2 -2
  129. package/dist/persistence/index.d.ts +6 -0
  130. package/dist/persistence/index.d.ts.map +1 -1
  131. package/dist/persistence/index.js +18 -0
  132. package/dist/persistence/index.js.map +2 -2
  133. package/dist/persistence/indexdb.d.ts +1 -0
  134. package/dist/persistence/indexdb.d.ts.map +1 -1
  135. package/dist/persistence/indexdb.js +6 -1
  136. package/dist/persistence/indexdb.js.map +2 -2
  137. package/dist/plugins/client/persistence.d.ts.map +1 -1
  138. package/dist/plugins/client/persistence.js +6 -0
  139. package/dist/plugins/client/persistence.js.map +2 -2
  140. package/dist/schemas/extensions/document/x-scalar-environments.d.ts +1 -0
  141. package/dist/schemas/extensions/document/x-scalar-environments.d.ts.map +1 -1
  142. package/dist/schemas/extensions/document/x-scalar-environments.js.map +2 -2
  143. package/dist/schemas/extensions/document/x-scalar-set-operation-security.d.ts +13 -0
  144. package/dist/schemas/extensions/document/x-scalar-set-operation-security.d.ts.map +1 -0
  145. package/dist/schemas/extensions/document/x-scalar-set-operation-security.js +8 -0
  146. package/dist/schemas/extensions/document/x-scalar-set-operation-security.js.map +7 -0
  147. package/dist/schemas/extensions/general/x-scalar-cookies.d.ts +36 -0
  148. package/dist/schemas/extensions/general/x-scalar-cookies.d.ts.map +1 -0
  149. package/dist/schemas/extensions/general/x-scalar-cookies.js +15 -0
  150. package/dist/schemas/extensions/general/x-scalar-cookies.js.map +7 -0
  151. package/dist/schemas/extensions/general/x-scalar-order.d.ts +12 -0
  152. package/dist/schemas/extensions/general/x-scalar-order.d.ts.map +1 -0
  153. package/dist/schemas/extensions/general/x-scalar-order.js +8 -0
  154. package/dist/schemas/extensions/general/x-scalar-order.js.map +7 -0
  155. package/dist/schemas/extensions/operation/index.d.ts +4 -1
  156. package/dist/schemas/extensions/operation/index.d.ts.map +1 -1
  157. package/dist/schemas/extensions/operation/index.js +22 -0
  158. package/dist/schemas/extensions/operation/index.js.map +3 -3
  159. package/dist/schemas/extensions/operation/x-code-samples.d.ts +0 -5
  160. package/dist/schemas/extensions/operation/x-code-samples.d.ts.map +1 -1
  161. package/dist/schemas/extensions/operation/x-code-samples.js +0 -1
  162. package/dist/schemas/extensions/operation/x-code-samples.js.map +2 -2
  163. package/dist/schemas/extensions/operation/x-post-response.d.ts +0 -18
  164. package/dist/schemas/extensions/operation/x-post-response.d.ts.map +1 -1
  165. package/dist/schemas/extensions/operation/x-post-response.js.map +1 -1
  166. package/dist/schemas/extensions/tag/x-tag-groups.d.ts +8 -14
  167. package/dist/schemas/extensions/tag/x-tag-groups.d.ts.map +1 -1
  168. package/dist/schemas/extensions/tag/x-tag-groups.js +15 -11
  169. package/dist/schemas/extensions/tag/x-tag-groups.js.map +2 -2
  170. package/dist/schemas/extensions/workspace/index.d.ts +4 -0
  171. package/dist/schemas/extensions/workspace/index.d.ts.map +1 -0
  172. package/dist/schemas/extensions/workspace/index.js +15 -0
  173. package/dist/schemas/extensions/workspace/index.js.map +7 -0
  174. package/dist/schemas/extensions/workspace/x-scalar-active-proxy.d.ts +18 -0
  175. package/dist/schemas/extensions/workspace/x-scalar-active-proxy.d.ts.map +1 -0
  176. package/dist/schemas/extensions/workspace/x-scalar-active-proxy.js +8 -0
  177. package/dist/schemas/extensions/workspace/x-scalar-active-proxy.js.map +7 -0
  178. package/dist/schemas/extensions/workspace/x-scalar-tabs.d.ts +36 -0
  179. package/dist/schemas/extensions/workspace/x-scalar-tabs.d.ts.map +1 -0
  180. package/dist/schemas/extensions/workspace/x-scalar-tabs.js +16 -0
  181. package/dist/schemas/extensions/workspace/x-scalar-tabs.js.map +7 -0
  182. package/dist/schemas/extensions.d.ts +1 -1
  183. package/dist/schemas/extensions.js +1 -1
  184. package/dist/schemas/extensions.js.map +2 -2
  185. package/dist/schemas/inmemory-workspace.d.ts +46 -33
  186. package/dist/schemas/inmemory-workspace.d.ts.map +1 -1
  187. package/dist/schemas/navigation.d.ts +12 -1
  188. package/dist/schemas/navigation.d.ts.map +1 -1
  189. package/dist/schemas/navigation.js +2 -1
  190. package/dist/schemas/navigation.js.map +2 -2
  191. package/dist/schemas/reference-config/index.d.ts +22 -16
  192. package/dist/schemas/reference-config/index.d.ts.map +1 -1
  193. package/dist/schemas/reference-config/settings.d.ts +22 -16
  194. package/dist/schemas/reference-config/settings.d.ts.map +1 -1
  195. package/dist/schemas/reference-config/settings.js +2 -0
  196. package/dist/schemas/reference-config/settings.js.map +2 -2
  197. package/dist/schemas/v3.1/strict/header.d.ts +0 -45
  198. package/dist/schemas/v3.1/strict/header.d.ts.map +1 -1
  199. package/dist/schemas/v3.1/strict/header.js +1 -3
  200. package/dist/schemas/v3.1/strict/header.js.map +2 -2
  201. package/dist/schemas/v3.1/strict/oauth-flow.d.ts +0 -99
  202. package/dist/schemas/v3.1/strict/oauth-flow.d.ts.map +1 -1
  203. package/dist/schemas/v3.1/strict/oauth-flow.js +0 -7
  204. package/dist/schemas/v3.1/strict/oauth-flow.js.map +2 -2
  205. package/dist/schemas/v3.1/strict/openapi-document.d.ts +756 -552
  206. package/dist/schemas/v3.1/strict/openapi-document.d.ts.map +1 -1
  207. package/dist/schemas/v3.1/strict/openapi-document.js +10 -11
  208. package/dist/schemas/v3.1/strict/openapi-document.js.map +2 -2
  209. package/dist/schemas/v3.1/strict/operation.d.ts +1 -5
  210. package/dist/schemas/v3.1/strict/operation.d.ts.map +1 -1
  211. package/dist/schemas/v3.1/strict/operation.js +1 -5
  212. package/dist/schemas/v3.1/strict/operation.js.map +2 -2
  213. package/dist/schemas/v3.1/strict/parameter.d.ts +1 -101
  214. package/dist/schemas/v3.1/strict/parameter.d.ts.map +1 -1
  215. package/dist/schemas/v3.1/strict/parameter.js +1 -4
  216. package/dist/schemas/v3.1/strict/parameter.js.map +2 -2
  217. package/dist/schemas/v3.1/strict/ref-definitions.d.ts +0 -1
  218. package/dist/schemas/v3.1/strict/ref-definitions.d.ts.map +1 -1
  219. package/dist/schemas/v3.1/strict/ref-definitions.js +0 -2
  220. package/dist/schemas/v3.1/strict/ref-definitions.js.map +2 -2
  221. package/dist/schemas/v3.1/strict/schema.d.ts +28 -11
  222. package/dist/schemas/v3.1/strict/schema.d.ts.map +1 -1
  223. package/dist/schemas/v3.1/strict/schema.js +2 -2
  224. package/dist/schemas/v3.1/strict/schema.js.map +2 -2
  225. package/dist/schemas/v3.1/strict/security-scheme.d.ts +1 -54
  226. package/dist/schemas/v3.1/strict/security-scheme.d.ts.map +1 -1
  227. package/dist/schemas/v3.1/strict/security-scheme.js +0 -5
  228. package/dist/schemas/v3.1/strict/security-scheme.js.map +2 -2
  229. package/dist/schemas/v3.1/strict/tag.d.ts +4 -1
  230. package/dist/schemas/v3.1/strict/tag.d.ts.map +1 -1
  231. package/dist/schemas/v3.1/strict/tag.js +3 -1
  232. package/dist/schemas/v3.1/strict/tag.js.map +2 -2
  233. package/dist/schemas/v3.1/strict/type-guards.d.ts +6 -0
  234. package/dist/schemas/v3.1/strict/type-guards.d.ts.map +1 -1
  235. package/dist/schemas/v3.1/strict/type-guards.js +4 -0
  236. package/dist/schemas/v3.1/strict/type-guards.js.map +2 -2
  237. package/dist/schemas/workspace-specification/config.d.ts +22 -16
  238. package/dist/schemas/workspace-specification/config.d.ts.map +1 -1
  239. package/dist/schemas/workspace-specification/index.d.ts +23 -17
  240. package/dist/schemas/workspace-specification/index.d.ts.map +1 -1
  241. package/dist/schemas/workspace.d.ts +204 -130
  242. package/dist/schemas/workspace.d.ts.map +1 -1
  243. package/dist/schemas/workspace.js +18 -11
  244. package/dist/schemas/workspace.js.map +2 -2
  245. package/dist/server.d.ts +1 -1
  246. package/dist/workspace-plugin.d.ts +3 -0
  247. package/dist/workspace-plugin.d.ts.map +1 -1
  248. package/package.json +50 -35
  249. package/dist/schemas/extensions/document/x-scalar-document-security.d.ts +0 -13
  250. package/dist/schemas/extensions/document/x-scalar-document-security.d.ts.map +0 -1
  251. package/dist/schemas/extensions/document/x-scalar-document-security.js +0 -8
  252. package/dist/schemas/extensions/document/x-scalar-document-security.js.map +0 -7
  253. package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.d.ts +0 -13
  254. package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.d.ts.map +0 -1
  255. package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.js +0 -9
  256. package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.js.map +0 -7
  257. package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.d.ts +0 -32
  258. package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.d.ts.map +0 -1
  259. package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.js +0 -13
  260. package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.js.map +0 -7
@@ -0,0 +1,13 @@
1
+ const getParentEntry = (type, node) => {
2
+ if (!node) {
3
+ return void 0;
4
+ }
5
+ if (node.type === type) {
6
+ return node;
7
+ }
8
+ return getParentEntry(type, node.parent);
9
+ };
10
+ export {
11
+ getParentEntry
12
+ };
13
+ //# sourceMappingURL=get-parent-entry.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/navigation/helpers/get-parent-entry.ts"],
4
+ "sourcesContent": ["import type { TraversedEntry } from '@/schemas/navigation'\n\n/**\n * Traverses up the tree to find and return the closest parent node (including self) of a specified type.\n *\n * @template Type - The type of node to look for.\n * @param type - The type to match in the parent chain.\n * @param node - The node from which traversal begins.\n * @returns The closest parent node of the specified type, or undefined if not found.\n */\nexport const getParentEntry = <Type extends TraversedEntry['type']>(\n type: Type,\n node?: TraversedEntry & { parent?: TraversedEntry },\n): (TraversedEntry & { type: Type }) | undefined => {\n if (!node) {\n return undefined\n }\n\n if (node.type === type) {\n return node as TraversedEntry & { type: Type }\n }\n\n return getParentEntry(type, node.parent)\n}\n"],
5
+ "mappings": "AAUO,MAAM,iBAAiB,CAC5B,MACA,SACkD;AAClD,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,MAAI,KAAK,SAAS,MAAM;AACtB,WAAO;AAAA,EACT;AAEA,SAAO,eAAe,MAAM,KAAK,MAAM;AACzC;",
6
+ "names": []
7
+ }
@@ -1,7 +1,6 @@
1
1
  import type { TraverseSpecOptions } from '../../navigation/types.js';
2
2
  import type { TraversedDescription } from '../../schemas/navigation.js';
3
3
  import type { InfoObject } from '../../schemas/v3.1/strict/info.js';
4
- export declare const DEFAULT_INTRODUCTION_SLUG = "introduction";
5
4
  /**
6
5
  * Creates a hierarchical navigation structure from markdown headings in an OpenAPI description.
7
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"traverse-description.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-description.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAW,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAE5D,eAAO,MAAM,yBAAyB,iBAAiB,CAAA;AAEvD;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,mBAAmB,GAAI,iCAIjC;IACD,UAAU,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAA;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,UAAU,CAAA;CACjB,KAAG,oBAAoB,EAoEvB,CAAA"}
1
+ {"version":3,"file":"traverse-description.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-description.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAW,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAA;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAI5D;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,mBAAmB,GAAI,iCAIjC;IACD,UAAU,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAA;IAC7C,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,UAAU,CAAA;CACjB,KAAG,oBAAoB,EAoEvB,CAAA"}
@@ -61,7 +61,6 @@ const traverseDescription = ({
61
61
  return entries;
62
62
  };
63
63
  export {
64
- DEFAULT_INTRODUCTION_SLUG,
65
64
  traverseDescription
66
65
  };
67
66
  //# sourceMappingURL=traverse-description.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/navigation/helpers/traverse-description.ts"],
4
- "sourcesContent": ["import { getHeadingsFromMarkdown, getLowestHeadingLevel } from '@/navigation/helpers/utils'\nimport type { Heading, TraverseSpecOptions } from '@/navigation/types'\nimport type { TraversedDescription } from '@/schemas/navigation'\nimport type { InfoObject } from '@/schemas/v3.1/strict/info'\n\nexport const DEFAULT_INTRODUCTION_SLUG = 'introduction'\n\n/**\n * Creates a hierarchical navigation structure from markdown headings in an OpenAPI description.\n *\n * The function processes markdown headings to create a two-level navigation tree:\n * - Level 1: Main sections (based on the lowest heading level found)\n * - Level 2: Subsections (one level deeper than the main sections)\n *\n * If the description starts with content rather than a heading, an \"Introduction\" section\n * is automatically added as the first entry.\n *\n * @param description - The markdown description text to process\n * @param entitiesMap - Map to store heading IDs and titles for mobile header navigation\n * @param getHeadingId - Function to generate unique IDs for headings\n * @returns Array of navigation entries with their hierarchy\n */\nexport const traverseDescription = ({\n generateId,\n parentId,\n info,\n}: {\n generateId: TraverseSpecOptions['generateId']\n parentId: string\n info: InfoObject\n}): TraversedDescription[] => {\n if (!info.description?.trim()) {\n return []\n }\n\n const headings = getHeadingsFromMarkdown(info.description)\n const lowestLevel = getLowestHeadingLevel(headings)\n\n const entries: TraversedDescription[] = []\n let currentParent: TraversedDescription | null = null\n\n // Add \"Introduction\" as the first heading\n if (info.description && !info.description.trim().startsWith('#')) {\n const heading: Heading = {\n depth: 1,\n value: 'Introduction',\n slug: DEFAULT_INTRODUCTION_SLUG,\n }\n\n const id = generateId({\n type: 'text',\n depth: heading.depth,\n slug: heading.slug,\n parentId: parentId,\n info: info,\n value: heading.value,\n })\n const title = heading.value\n\n const entry = {\n id,\n title,\n type: 'text',\n } satisfies TraversedDescription\n\n // Push to entries\n entries.push(entry)\n }\n\n // Traverse for the rest\n for (const heading of headings) {\n if (heading.depth !== lowestLevel && heading.depth !== lowestLevel + 1) {\n continue\n }\n\n const entry: TraversedDescription = {\n id: generateId({\n type: 'text',\n depth: heading.depth,\n slug: heading.slug,\n parentId: parentId,\n info: info,\n value: heading.value,\n }),\n title: heading.value,\n type: 'text',\n }\n\n if (heading.depth === lowestLevel) {\n entry.children = []\n entries.push(entry)\n currentParent = entry\n } else if (currentParent) {\n currentParent.children?.push(entry)\n }\n }\n\n return entries\n}\n"],
5
- "mappings": "AAAA,SAAS,yBAAyB,6BAA6B;AAKxD,MAAM,4BAA4B;AAiBlC,MAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AACF,MAI8B;AAC5B,MAAI,CAAC,KAAK,aAAa,KAAK,GAAG;AAC7B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAW,wBAAwB,KAAK,WAAW;AACzD,QAAM,cAAc,sBAAsB,QAAQ;AAElD,QAAM,UAAkC,CAAC;AACzC,MAAI,gBAA6C;AAGjD,MAAI,KAAK,eAAe,CAAC,KAAK,YAAY,KAAK,EAAE,WAAW,GAAG,GAAG;AAChE,UAAM,UAAmB;AAAA,MACvB,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAEA,UAAM,KAAK,WAAW;AAAA,MACpB,MAAM;AAAA,MACN,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ;AAAA,MACd;AAAA,MACA;AAAA,MACA,OAAO,QAAQ;AAAA,IACjB,CAAC;AACD,UAAM,QAAQ,QAAQ;AAEtB,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IACR;AAGA,YAAQ,KAAK,KAAK;AAAA,EACpB;AAGA,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,UAAU,eAAe,QAAQ,UAAU,cAAc,GAAG;AACtE;AAAA,IACF;AAEA,UAAM,QAA8B;AAAA,MAClC,IAAI,WAAW;AAAA,QACb,MAAM;AAAA,QACN,OAAO,QAAQ;AAAA,QACf,MAAM,QAAQ;AAAA,QACd;AAAA,QACA;AAAA,QACA,OAAO,QAAQ;AAAA,MACjB,CAAC;AAAA,MACD,OAAO,QAAQ;AAAA,MACf,MAAM;AAAA,IACR;AAEA,QAAI,QAAQ,UAAU,aAAa;AACjC,YAAM,WAAW,CAAC;AAClB,cAAQ,KAAK,KAAK;AAClB,sBAAgB;AAAA,IAClB,WAAW,eAAe;AACxB,oBAAc,UAAU,KAAK,KAAK;AAAA,IACpC;AAAA,EACF;AAEA,SAAO;AACT;",
4
+ "sourcesContent": ["import { getHeadingsFromMarkdown, getLowestHeadingLevel } from '@/navigation/helpers/utils'\nimport type { Heading, TraverseSpecOptions } from '@/navigation/types'\nimport type { TraversedDescription } from '@/schemas/navigation'\nimport type { InfoObject } from '@/schemas/v3.1/strict/info'\n\nconst DEFAULT_INTRODUCTION_SLUG = 'introduction'\n\n/**\n * Creates a hierarchical navigation structure from markdown headings in an OpenAPI description.\n *\n * The function processes markdown headings to create a two-level navigation tree:\n * - Level 1: Main sections (based on the lowest heading level found)\n * - Level 2: Subsections (one level deeper than the main sections)\n *\n * If the description starts with content rather than a heading, an \"Introduction\" section\n * is automatically added as the first entry.\n *\n * @param description - The markdown description text to process\n * @param entitiesMap - Map to store heading IDs and titles for mobile header navigation\n * @param getHeadingId - Function to generate unique IDs for headings\n * @returns Array of navigation entries with their hierarchy\n */\nexport const traverseDescription = ({\n generateId,\n parentId,\n info,\n}: {\n generateId: TraverseSpecOptions['generateId']\n parentId: string\n info: InfoObject\n}): TraversedDescription[] => {\n if (!info.description?.trim()) {\n return []\n }\n\n const headings = getHeadingsFromMarkdown(info.description)\n const lowestLevel = getLowestHeadingLevel(headings)\n\n const entries: TraversedDescription[] = []\n let currentParent: TraversedDescription | null = null\n\n // Add \"Introduction\" as the first heading\n if (info.description && !info.description.trim().startsWith('#')) {\n const heading: Heading = {\n depth: 1,\n value: 'Introduction',\n slug: DEFAULT_INTRODUCTION_SLUG,\n }\n\n const id = generateId({\n type: 'text',\n depth: heading.depth,\n slug: heading.slug,\n parentId: parentId,\n info: info,\n value: heading.value,\n })\n const title = heading.value\n\n const entry = {\n id,\n title,\n type: 'text',\n } satisfies TraversedDescription\n\n // Push to entries\n entries.push(entry)\n }\n\n // Traverse for the rest\n for (const heading of headings) {\n if (heading.depth !== lowestLevel && heading.depth !== lowestLevel + 1) {\n continue\n }\n\n const entry: TraversedDescription = {\n id: generateId({\n type: 'text',\n depth: heading.depth,\n slug: heading.slug,\n parentId: parentId,\n info: info,\n value: heading.value,\n }),\n title: heading.value,\n type: 'text',\n }\n\n if (heading.depth === lowestLevel) {\n entry.children = []\n entries.push(entry)\n currentParent = entry\n } else if (currentParent) {\n currentParent.children?.push(entry)\n }\n }\n\n return entries\n}\n"],
5
+ "mappings": "AAAA,SAAS,yBAAyB,6BAA6B;AAK/D,MAAM,4BAA4B;AAiB3B,MAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AACF,MAI8B;AAC5B,MAAI,CAAC,KAAK,aAAa,KAAK,GAAG;AAC7B,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAW,wBAAwB,KAAK,WAAW;AACzD,QAAM,cAAc,sBAAsB,QAAQ;AAElD,QAAM,UAAkC,CAAC;AACzC,MAAI,gBAA6C;AAGjD,MAAI,KAAK,eAAe,CAAC,KAAK,YAAY,KAAK,EAAE,WAAW,GAAG,GAAG;AAChE,UAAM,UAAmB;AAAA,MACvB,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAEA,UAAM,KAAK,WAAW;AAAA,MACpB,MAAM;AAAA,MACN,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ;AAAA,MACd;AAAA,MACA;AAAA,MACA,OAAO,QAAQ;AAAA,IACjB,CAAC;AACD,UAAM,QAAQ,QAAQ;AAEtB,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA,MAAM;AAAA,IACR;AAGA,YAAQ,KAAK,KAAK;AAAA,EACpB;AAGA,aAAW,WAAW,UAAU;AAC9B,QAAI,QAAQ,UAAU,eAAe,QAAQ,UAAU,cAAc,GAAG;AACtE;AAAA,IACF;AAEA,UAAM,QAA8B;AAAA,MAClC,IAAI,WAAW;AAAA,QACb,MAAM;AAAA,QACN,OAAO,QAAQ;AAAA,QACf,MAAM,QAAQ;AAAA,QACd;AAAA,QACA;AAAA,QACA,OAAO,QAAQ;AAAA,MACjB,CAAC;AAAA,MACD,OAAO,QAAQ;AAAA,MACf,MAAM;AAAA,IACR;AAEA,QAAI,QAAQ,UAAU,aAAa;AACjC,YAAM,WAAW,CAAC;AAClB,cAAQ,KAAK,KAAK;AAClB,sBAAgB;AAAA,IAClB,WAAW,eAAe;AACxB,oBAAc,UAAU,KAAK,KAAK;AAAA,IACpC;AAAA,EACF;AAEA,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -16,5 +16,6 @@ export declare const traverseDocument: (documentName: string, document: OpenApiD
16
16
  title: string;
17
17
  name: string;
18
18
  children: TraversedEntry[];
19
+ icon: string | undefined;
19
20
  };
20
21
  //# sourceMappingURL=traverse-document.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"traverse-document.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-document.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AAC7E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAA;AAQrF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,GAAI,cAAc,MAAM,EAAE,UAAU,eAAe,EAAE,SAAS,qBAAqB;;;;;;CA8F/G,CAAA"}
1
+ {"version":3,"file":"traverse-document.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-document.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AAC7E,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAA;AAQrF;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,GAAI,cAAc,MAAM,EAAE,UAAU,eAAe,EAAE,SAAS,qBAAqB;;;;;;;CAkH/G,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { unpackProxyObject } from "../../helpers/unpack-proxy.js";
1
2
  import { getNavigationOptions } from "../../navigation/get-navigation-options.js";
2
3
  import { traverseDescription } from "./traverse-description.js";
3
4
  import { traversePaths } from "./traverse-paths.js";
@@ -22,7 +23,7 @@ const traverseDocument = (documentName, document, config) => {
22
23
  parentId: documentId,
23
24
  info: document.info
24
25
  });
25
- traversePaths({ document, tagsMap, generateId, documentId });
26
+ const { untaggedOperations } = traversePaths({ document, tagsMap, generateId, documentId });
26
27
  const untaggedWebhooksParentId = generateId({
27
28
  type: "webhook",
28
29
  name: "",
@@ -42,6 +43,7 @@ const traverseDocument = (documentName, document, config) => {
42
43
  options: { tagsSorter, operationsSorter, generateId }
43
44
  });
44
45
  entries.push(...tagsEntries);
46
+ entries.push(...untaggedOperations);
45
47
  if (untaggedWebhooks.length) {
46
48
  entries.push({
47
49
  type: "tag",
@@ -73,12 +75,24 @@ const traverseDocument = (documentName, document, config) => {
73
75
  });
74
76
  }
75
77
  }
78
+ const sortOrder = document["x-scalar-order"];
79
+ if (sortOrder) {
80
+ entries.sort((a, b) => {
81
+ const indexA = sortOrder.indexOf(a.id);
82
+ const indexB = sortOrder.indexOf(b.id);
83
+ const safeIndexA = indexA === -1 ? Number.POSITIVE_INFINITY : indexA;
84
+ const safeIndexB = indexB === -1 ? Number.POSITIVE_INFINITY : indexB;
85
+ return safeIndexA - safeIndexB;
86
+ });
87
+ }
88
+ document["x-scalar-order"] = unpackProxyObject(entries.map((entry) => entry.id));
76
89
  return {
77
90
  id: documentId,
78
91
  type: "document",
79
92
  title: document.info.title,
80
93
  name: documentName,
81
- children: entries
94
+ children: entries,
95
+ icon: document["x-scalar-icon"]
82
96
  };
83
97
  };
84
98
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/navigation/helpers/traverse-document.ts"],
4
- "sourcesContent": ["import { getNavigationOptions } from '@/navigation/get-navigation-options'\nimport type { TagsMap } from '@/navigation/types'\nimport type { TraversedDocument, TraversedEntry } from '@/schemas/navigation'\nimport type { OpenApiDocument } from '@/schemas/v3.1/strict/openapi-document'\nimport type { DocumentConfiguration } from '@/schemas/workspace-specification/config'\n\nimport { traverseDescription } from './traverse-description'\nimport { traversePaths } from './traverse-paths'\nimport { traverseSchemas } from './traverse-schemas'\nimport { traverseTags } from './traverse-tags'\nimport { traverseWebhooks } from './traverse-webhooks'\n\n/**\n * Traverses an OpenAPI Document to generate navigation structure and metadata.\n *\n * This function processes the OpenAPI document to create:\n * - A hierarchical navigation structure for the sidebar\n * - A mapping of IDs to titles for mobile header navigation\n * - Tag-based organization of operations and webhooks\n * - Optional schema/model documentation\n */\nexport const traverseDocument = (documentName: string, document: OpenApiDocument, config?: DocumentConfiguration) => {\n const { hideModels, tagsSorter, operationsSorter, generateId } = getNavigationOptions(documentName, config)\n\n const documentId = generateId({\n type: 'document',\n info: document.info,\n name: documentName,\n })\n\n /** Map of tags and their entries */\n const tagsMap: TagsMap = new Map(\n document.tags?.map((tag) => [\n tag.name ?? 'Untitled Tag',\n { id: generateId({ type: 'tag', tag, parentId: documentId }), parentId: documentId, tag, entries: [] },\n ]) ?? [],\n )\n\n /** Generate entries for the document info description field */\n const entries: TraversedEntry[] = traverseDescription({\n generateId,\n parentId: documentId,\n info: document.info,\n })\n\n /** Traverse all the document path */\n traversePaths({ document, tagsMap, generateId, documentId })\n\n const untaggedWebhooksParentId = generateId({\n type: 'webhook',\n name: '',\n parentId: documentId,\n })\n\n const untaggedWebhooks = traverseWebhooks({\n document,\n generateId,\n tagsMap,\n untaggedWebhooksParentId,\n documentId,\n })\n\n const tagsEntries = traverseTags({\n document,\n tagsMap,\n documentId,\n options: { tagsSorter, operationsSorter, generateId },\n })\n\n // Add tagged operations, webhooks and tagGroups\n entries.push(...tagsEntries)\n\n // Add untagged webhooks\n if (untaggedWebhooks.length) {\n entries.push({\n type: 'tag',\n id: untaggedWebhooksParentId,\n title: 'Webhooks',\n name: 'Webhooks',\n children: untaggedWebhooks,\n isGroup: false,\n isWebhooks: true,\n })\n }\n\n // Add models if they are not hidden\n if (!hideModels && document.components?.schemas) {\n const untaggedModels = traverseSchemas({\n documentId,\n document,\n generateId,\n tagsMap,\n })\n\n if (untaggedModels.length) {\n entries.push({\n type: 'models',\n id: generateId({\n type: 'model',\n parentId: documentId,\n }),\n title: 'Models',\n name: 'Models',\n children: untaggedModels,\n })\n }\n }\n\n return {\n id: documentId,\n type: 'document',\n title: document.info.title,\n name: documentName,\n children: entries,\n } satisfies TraversedDocument\n}\n"],
5
- "mappings": "AAAA,SAAS,4BAA4B;AAMrC,SAAS,2BAA2B;AACpC,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AAW1B,MAAM,mBAAmB,CAAC,cAAsB,UAA2B,WAAmC;AACnH,QAAM,EAAE,YAAY,YAAY,kBAAkB,WAAW,IAAI,qBAAqB,cAAc,MAAM;AAE1G,QAAM,aAAa,WAAW;AAAA,IAC5B,MAAM;AAAA,IACN,MAAM,SAAS;AAAA,IACf,MAAM;AAAA,EACR,CAAC;AAGD,QAAM,UAAmB,IAAI;AAAA,IAC3B,SAAS,MAAM,IAAI,CAAC,QAAQ;AAAA,MAC1B,IAAI,QAAQ;AAAA,MACZ,EAAE,IAAI,WAAW,EAAE,MAAM,OAAO,KAAK,UAAU,WAAW,CAAC,GAAG,UAAU,YAAY,KAAK,SAAS,CAAC,EAAE;AAAA,IACvG,CAAC,KAAK,CAAC;AAAA,EACT;AAGA,QAAM,UAA4B,oBAAoB;AAAA,IACpD;AAAA,IACA,UAAU;AAAA,IACV,MAAM,SAAS;AAAA,EACjB,CAAC;AAGD,gBAAc,EAAE,UAAU,SAAS,YAAY,WAAW,CAAC;AAE3D,QAAM,2BAA2B,WAAW;AAAA,IAC1C,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,mBAAmB,iBAAiB;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,cAAc,aAAa;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,EAAE,YAAY,kBAAkB,WAAW;AAAA,EACtD,CAAC;AAGD,UAAQ,KAAK,GAAG,WAAW;AAG3B,MAAI,iBAAiB,QAAQ;AAC3B,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,cAAc,SAAS,YAAY,SAAS;AAC/C,UAAM,iBAAiB,gBAAgB;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,eAAe,QAAQ;AACzB,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,IAAI,WAAW;AAAA,UACb,MAAM;AAAA,UACN,UAAU;AAAA,QACZ,CAAC;AAAA,QACD,OAAO;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO,SAAS,KAAK;AAAA,IACrB,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AACF;",
4
+ "sourcesContent": ["import { unpackProxyObject } from '@/helpers/unpack-proxy'\nimport { getNavigationOptions } from '@/navigation/get-navigation-options'\nimport type { TagsMap } from '@/navigation/types'\nimport type { TraversedDocument, TraversedEntry } from '@/schemas/navigation'\nimport type { OpenApiDocument } from '@/schemas/v3.1/strict/openapi-document'\nimport type { DocumentConfiguration } from '@/schemas/workspace-specification/config'\n\nimport { traverseDescription } from './traverse-description'\nimport { traversePaths } from './traverse-paths'\nimport { traverseSchemas } from './traverse-schemas'\nimport { traverseTags } from './traverse-tags'\nimport { traverseWebhooks } from './traverse-webhooks'\n\n/**\n * Traverses an OpenAPI Document to generate navigation structure and metadata.\n *\n * This function processes the OpenAPI document to create:\n * - A hierarchical navigation structure for the sidebar\n * - A mapping of IDs to titles for mobile header navigation\n * - Tag-based organization of operations and webhooks\n * - Optional schema/model documentation\n */\nexport const traverseDocument = (documentName: string, document: OpenApiDocument, config?: DocumentConfiguration) => {\n const { hideModels, tagsSorter, operationsSorter, generateId } = getNavigationOptions(documentName, config)\n\n const documentId = generateId({\n type: 'document',\n info: document.info,\n name: documentName,\n })\n\n /** Map of tags and their entries */\n const tagsMap: TagsMap = new Map(\n document.tags?.map((tag) => [\n tag.name ?? 'Untitled Tag',\n { id: generateId({ type: 'tag', tag, parentId: documentId }), parentId: documentId, tag, entries: [] },\n ]) ?? [],\n )\n\n /** Generate entries for the document info description field */\n const entries: TraversedEntry[] = traverseDescription({\n generateId,\n parentId: documentId,\n info: document.info,\n })\n\n /** Traverse all the document path */\n const { untaggedOperations } = traversePaths({ document, tagsMap, generateId, documentId })\n\n const untaggedWebhooksParentId = generateId({\n type: 'webhook',\n name: '',\n parentId: documentId,\n })\n\n const untaggedWebhooks = traverseWebhooks({\n document,\n generateId,\n tagsMap,\n untaggedWebhooksParentId,\n documentId,\n })\n\n const tagsEntries = traverseTags({\n document,\n tagsMap,\n documentId,\n options: { tagsSorter, operationsSorter, generateId },\n })\n\n // Add tagged operations, webhooks and tagGroups\n entries.push(...tagsEntries)\n // Add untagged operations\n entries.push(...untaggedOperations)\n\n // Add untagged webhooks\n if (untaggedWebhooks.length) {\n entries.push({\n type: 'tag',\n id: untaggedWebhooksParentId,\n title: 'Webhooks',\n name: 'Webhooks',\n children: untaggedWebhooks,\n isGroup: false,\n isWebhooks: true,\n })\n }\n\n // Add models if they are not hidden\n if (!hideModels && document.components?.schemas) {\n const untaggedModels = traverseSchemas({\n documentId,\n document,\n generateId,\n tagsMap,\n })\n\n if (untaggedModels.length) {\n entries.push({\n type: 'models',\n id: generateId({\n type: 'model',\n parentId: documentId,\n }),\n title: 'Models',\n name: 'Models',\n children: untaggedModels,\n })\n }\n }\n\n const sortOrder = document['x-scalar-order']\n\n // Try to sort the entries using the x-scalar-order\n if (sortOrder) {\n entries.sort((a, b) => {\n const indexA = sortOrder.indexOf(a.id)\n const indexB = sortOrder.indexOf(b.id)\n // If an id is not found, treat it as \"infinity\" so those items go last.\n const safeIndexA = indexA === -1 ? Number.POSITIVE_INFINITY : indexA\n const safeIndexB = indexB === -1 ? Number.POSITIVE_INFINITY : indexB\n return safeIndexA - safeIndexB\n })\n }\n\n // Now update the sort order of the entries\n document['x-scalar-order'] = unpackProxyObject(entries.map((entry) => entry.id))\n\n return {\n id: documentId,\n type: 'document',\n title: document.info.title,\n name: documentName,\n children: entries,\n icon: document['x-scalar-icon'],\n } satisfies TraversedDocument\n}\n"],
5
+ "mappings": "AAAA,SAAS,yBAAyB;AAClC,SAAS,4BAA4B;AAMrC,SAAS,2BAA2B;AACpC,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AAW1B,MAAM,mBAAmB,CAAC,cAAsB,UAA2B,WAAmC;AACnH,QAAM,EAAE,YAAY,YAAY,kBAAkB,WAAW,IAAI,qBAAqB,cAAc,MAAM;AAE1G,QAAM,aAAa,WAAW;AAAA,IAC5B,MAAM;AAAA,IACN,MAAM,SAAS;AAAA,IACf,MAAM;AAAA,EACR,CAAC;AAGD,QAAM,UAAmB,IAAI;AAAA,IAC3B,SAAS,MAAM,IAAI,CAAC,QAAQ;AAAA,MAC1B,IAAI,QAAQ;AAAA,MACZ,EAAE,IAAI,WAAW,EAAE,MAAM,OAAO,KAAK,UAAU,WAAW,CAAC,GAAG,UAAU,YAAY,KAAK,SAAS,CAAC,EAAE;AAAA,IACvG,CAAC,KAAK,CAAC;AAAA,EACT;AAGA,QAAM,UAA4B,oBAAoB;AAAA,IACpD;AAAA,IACA,UAAU;AAAA,IACV,MAAM,SAAS;AAAA,EACjB,CAAC;AAGD,QAAM,EAAE,mBAAmB,IAAI,cAAc,EAAE,UAAU,SAAS,YAAY,WAAW,CAAC;AAE1F,QAAM,2BAA2B,WAAW;AAAA,IAC1C,MAAM;AAAA,IACN,MAAM;AAAA,IACN,UAAU;AAAA,EACZ,CAAC;AAED,QAAM,mBAAmB,iBAAiB;AAAA,IACxC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,cAAc,aAAa;AAAA,IAC/B;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,EAAE,YAAY,kBAAkB,WAAW;AAAA,EACtD,CAAC;AAGD,UAAQ,KAAK,GAAG,WAAW;AAE3B,UAAQ,KAAK,GAAG,kBAAkB;AAGlC,MAAI,iBAAiB,QAAQ;AAC3B,YAAQ,KAAK;AAAA,MACX,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,cAAc,SAAS,YAAY,SAAS;AAC/C,UAAM,iBAAiB,gBAAgB;AAAA,MACrC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,eAAe,QAAQ;AACzB,cAAQ,KAAK;AAAA,QACX,MAAM;AAAA,QACN,IAAI,WAAW;AAAA,UACb,MAAM;AAAA,UACN,UAAU;AAAA,QACZ,CAAC;AAAA,QACD,OAAO;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,YAAY,SAAS,gBAAgB;AAG3C,MAAI,WAAW;AACb,YAAQ,KAAK,CAAC,GAAG,MAAM;AACrB,YAAM,SAAS,UAAU,QAAQ,EAAE,EAAE;AACrC,YAAM,SAAS,UAAU,QAAQ,EAAE,EAAE;AAErC,YAAM,aAAa,WAAW,KAAK,OAAO,oBAAoB;AAC9D,YAAM,aAAa,WAAW,KAAK,OAAO,oBAAoB;AAC9D,aAAO,aAAa;AAAA,IACtB,CAAC;AAAA,EACH;AAGA,WAAS,gBAAgB,IAAI,kBAAkB,QAAQ,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC;AAE/E,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO,SAAS,KAAK;AAAA,IACrB,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM,SAAS,eAAe;AAAA,EAChC;AACF;",
6
6
  "names": []
7
7
  }
@@ -11,7 +11,7 @@ const traverseOperationExamples = (operation) => {
11
11
  }
12
12
  if (operation.parameters) {
13
13
  operation.parameters.forEach((_parameter) => {
14
- const parameter = getResolvedRef(_parameter);
14
+ const parameter = getResolvedRef(_parameter) ?? {};
15
15
  if ("content" in parameter && parameter.content) {
16
16
  Object.values(parameter.content).forEach((mediaType) => {
17
17
  Object.keys(mediaType.examples ?? {}).forEach((key) => {
@@ -28,7 +28,7 @@ const traverseOperationExamples = (operation) => {
28
28
  }
29
29
  if (operation.responses) {
30
30
  Object.values(operation.responses).forEach((response) => {
31
- const resolvedResponse = getResolvedRef(response);
31
+ const resolvedResponse = getResolvedRef(response) ?? {};
32
32
  if ("content" in resolvedResponse && resolvedResponse.content) {
33
33
  Object.values(resolvedResponse.content ?? {}).forEach((mediaType) => {
34
34
  Object.keys(mediaType.examples ?? {}).forEach((key) => {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/navigation/helpers/traverse-examples.ts"],
4
- "sourcesContent": ["import { getResolvedRef } from '@/helpers/get-resolved-ref'\nimport type { OperationObject } from '@/schemas/v3.1/strict/openapi-document'\n\n/**\n * Traverse the OpenAPI operation object and extract all example values.\n *\n * @param operation - The OpenAPI operation object to extract examples from\n */\nexport const traverseOperationExamples = (operation: OperationObject) => {\n const examples = new Set<string>()\n\n // Add all examples from request bodies\n if (operation.requestBody) {\n const requestBody = getResolvedRef(operation.requestBody)\n\n Object.values(requestBody.content ?? {}).forEach((mediaType) => {\n Object.keys(mediaType.examples ?? {}).forEach((key) => {\n examples.add(key)\n })\n })\n }\n\n // Add all examples from parameters\n if (operation.parameters) {\n operation.parameters.forEach((_parameter) => {\n const parameter = getResolvedRef(_parameter)\n\n if ('content' in parameter && parameter.content) {\n Object.values(parameter.content).forEach((mediaType) => {\n Object.keys(mediaType.examples ?? {}).forEach((key) => {\n examples.add(key)\n })\n })\n }\n\n if ('examples' in parameter && parameter.examples) {\n Object.keys(parameter.examples ?? {}).forEach((key) => {\n examples.add(key)\n })\n }\n })\n }\n\n // Add all examples from responses\n if (operation.responses) {\n Object.values(operation.responses).forEach((response) => {\n const resolvedResponse = getResolvedRef(response)\n\n if ('content' in resolvedResponse && resolvedResponse.content) {\n Object.values(resolvedResponse.content ?? {}).forEach((mediaType) => {\n Object.keys(mediaType.examples ?? {}).forEach((key) => {\n examples.add(key)\n })\n })\n }\n\n // TODO: handle headers?\n })\n }\n\n return Array.from(examples)\n}\n"],
5
- "mappings": "AAAA,SAAS,sBAAsB;AAQxB,MAAM,4BAA4B,CAAC,cAA+B;AACvE,QAAM,WAAW,oBAAI,IAAY;AAGjC,MAAI,UAAU,aAAa;AACzB,UAAM,cAAc,eAAe,UAAU,WAAW;AAExD,WAAO,OAAO,YAAY,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,cAAc;AAC9D,aAAO,KAAK,UAAU,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ;AACrD,iBAAS,IAAI,GAAG;AAAA,MAClB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAGA,MAAI,UAAU,YAAY;AACxB,cAAU,WAAW,QAAQ,CAAC,eAAe;AAC3C,YAAM,YAAY,eAAe,UAAU;AAE3C,UAAI,aAAa,aAAa,UAAU,SAAS;AAC/C,eAAO,OAAO,UAAU,OAAO,EAAE,QAAQ,CAAC,cAAc;AACtD,iBAAO,KAAK,UAAU,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ;AACrD,qBAAS,IAAI,GAAG;AAAA,UAClB,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAEA,UAAI,cAAc,aAAa,UAAU,UAAU;AACjD,eAAO,KAAK,UAAU,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ;AACrD,mBAAS,IAAI,GAAG;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,UAAU,WAAW;AACvB,WAAO,OAAO,UAAU,SAAS,EAAE,QAAQ,CAAC,aAAa;AACvD,YAAM,mBAAmB,eAAe,QAAQ;AAEhD,UAAI,aAAa,oBAAoB,iBAAiB,SAAS;AAC7D,eAAO,OAAO,iBAAiB,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,cAAc;AACnE,iBAAO,KAAK,UAAU,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ;AACrD,qBAAS,IAAI,GAAG;AAAA,UAClB,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IAGF,CAAC;AAAA,EACH;AAEA,SAAO,MAAM,KAAK,QAAQ;AAC5B;",
4
+ "sourcesContent": ["import { getResolvedRef } from '@/helpers/get-resolved-ref'\nimport type { OperationObject } from '@/schemas/v3.1/strict/openapi-document'\n\n/**\n * Traverse the OpenAPI operation object and extract all example values.\n *\n * @param operation - The OpenAPI operation object to extract examples from\n */\nexport const traverseOperationExamples = (operation: OperationObject) => {\n const examples = new Set<string>()\n\n // Add all examples from request bodies\n if (operation.requestBody) {\n const requestBody = getResolvedRef(operation.requestBody)\n\n Object.values(requestBody.content ?? {}).forEach((mediaType) => {\n Object.keys(mediaType.examples ?? {}).forEach((key) => {\n examples.add(key)\n })\n })\n }\n\n // Add all examples from parameters\n if (operation.parameters) {\n operation.parameters.forEach((_parameter) => {\n const parameter = getResolvedRef(_parameter) ?? {}\n\n if ('content' in parameter && parameter.content) {\n Object.values(parameter.content).forEach((mediaType) => {\n Object.keys(mediaType.examples ?? {}).forEach((key) => {\n examples.add(key)\n })\n })\n }\n\n if ('examples' in parameter && parameter.examples) {\n Object.keys(parameter.examples ?? {}).forEach((key) => {\n examples.add(key)\n })\n }\n })\n }\n\n // Add all examples from responses\n if (operation.responses) {\n Object.values(operation.responses).forEach((response) => {\n const resolvedResponse = getResolvedRef(response) ?? {}\n\n if ('content' in resolvedResponse && resolvedResponse.content) {\n Object.values(resolvedResponse.content ?? {}).forEach((mediaType) => {\n Object.keys(mediaType.examples ?? {}).forEach((key) => {\n examples.add(key)\n })\n })\n }\n\n // TODO: handle headers?\n })\n }\n\n return Array.from(examples)\n}\n"],
5
+ "mappings": "AAAA,SAAS,sBAAsB;AAQxB,MAAM,4BAA4B,CAAC,cAA+B;AACvE,QAAM,WAAW,oBAAI,IAAY;AAGjC,MAAI,UAAU,aAAa;AACzB,UAAM,cAAc,eAAe,UAAU,WAAW;AAExD,WAAO,OAAO,YAAY,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,cAAc;AAC9D,aAAO,KAAK,UAAU,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ;AACrD,iBAAS,IAAI,GAAG;AAAA,MAClB,CAAC;AAAA,IACH,CAAC;AAAA,EACH;AAGA,MAAI,UAAU,YAAY;AACxB,cAAU,WAAW,QAAQ,CAAC,eAAe;AAC3C,YAAM,YAAY,eAAe,UAAU,KAAK,CAAC;AAEjD,UAAI,aAAa,aAAa,UAAU,SAAS;AAC/C,eAAO,OAAO,UAAU,OAAO,EAAE,QAAQ,CAAC,cAAc;AACtD,iBAAO,KAAK,UAAU,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ;AACrD,qBAAS,IAAI,GAAG;AAAA,UAClB,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAEA,UAAI,cAAc,aAAa,UAAU,UAAU;AACjD,eAAO,KAAK,UAAU,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ;AACrD,mBAAS,IAAI,GAAG;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,UAAU,WAAW;AACvB,WAAO,OAAO,UAAU,SAAS,EAAE,QAAQ,CAAC,aAAa;AACvD,YAAM,mBAAmB,eAAe,QAAQ,KAAK,CAAC;AAEtD,UAAI,aAAa,oBAAoB,iBAAiB,SAAS;AAC7D,eAAO,OAAO,iBAAiB,WAAW,CAAC,CAAC,EAAE,QAAQ,CAAC,cAAc;AACnE,iBAAO,KAAK,UAAU,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,QAAQ;AACrD,qBAAS,IAAI,GAAG;AAAA,UAClB,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,IAGF,CAAC;AAAA,EACH;AAEA,SAAO,MAAM,KAAK,QAAQ;AAC5B;",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,5 @@
1
1
  import type { TagsMap, TraverseSpecOptions } from '../../navigation/types.js';
2
+ import type { TraversedOperation } from '../../schemas/navigation.js';
2
3
  import type { OpenApiDocument, OperationObject } from '../../schemas/v3.1/strict/openapi-document.js';
3
4
  export declare const isDeprecatedOperation: (operation: OperationObject) => boolean;
4
5
  /**
@@ -7,7 +8,7 @@ export declare const isDeprecatedOperation: (operation: OperationObject) => bool
7
8
  * This function processes each path and its operations to:
8
9
  * - Filter out internal operations (marked with x-internal) and operations to ignore (marked with x-scalar-ignore)
9
10
  * - Group operations by their tags
10
- * - Create a default tag group for untagged operations
11
+ * - Collect operations without tags to be added at the document level
11
12
  * - Generate unique references and IDs for each operation
12
13
  *
13
14
  * TODO: filter out internal and scalar-ignore tags
@@ -16,7 +17,7 @@ export declare const isDeprecatedOperation: (operation: OperationObject) => bool
16
17
  * @param tagsDict - Dictionary mapping tag names to their OpenAPI tag objects
17
18
  * @param entitiesMap - Map to store operation IDs and titles for mobile header navigation
18
19
  * @param getOperationId - Function to generate unique IDs for operations
19
- * @returns Map of tag names to arrays of traversed operations
20
+ * @returns Object containing the tagsMap and an array of untagged operations
20
21
  */
21
22
  export declare const traversePaths: ({ document, tagsMap, generateId, documentId, }: {
22
23
  document: OpenApiDocument;
@@ -26,5 +27,7 @@ export declare const traversePaths: ({ document, tagsMap, generateId, documentId
26
27
  generateId: TraverseSpecOptions["generateId"];
27
28
  /** Document ID */
28
29
  documentId: string;
29
- }) => void;
30
+ }) => {
31
+ untaggedOperations: TraversedOperation[];
32
+ };
30
33
  //# sourceMappingURL=traverse-paths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"traverse-paths.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-paths.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAGtE,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AAI9F,eAAO,MAAM,qBAAqB,GAAI,WAAW,eAAe,YAE/D,CAAA;AAoED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa,GAAI,gDAK3B;IACD,QAAQ,EAAE,eAAe,CAAA;IACzB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,0DAA0D;IAC1D,UAAU,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAA;IAC7C,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB,SA+DA,CAAA"}
1
+ {"version":3,"file":"traverse-paths.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-paths.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAEtE,OAAO,KAAK,EAA+B,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AAI9F,eAAO,MAAM,qBAAqB,GAAI,WAAW,eAAe,YAE/D,CAAA;AAoED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa,GAAI,gDAK3B;IACD,QAAQ,EAAE,eAAe,CAAA;IACzB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,0DAA0D;IAC1D,UAAU,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAA;IAC7C,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB,KAAG;IAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAA;CA2D7C,CAAA"}
@@ -3,7 +3,7 @@ import { objectKeys } from "@scalar/helpers/object/object-keys";
3
3
  import { escapeJsonPointer } from "@scalar/json-magic/helpers/escape-json-pointer";
4
4
  import { getResolvedRef } from "../../helpers/get-resolved-ref.js";
5
5
  import { traverseOperationExamples } from "../../navigation/helpers/traverse-examples.js";
6
- import { XScalarStabilityValues } from "../../schemas/extensions/operation/x-scalar-stability.js";
6
+ import { XScalarStabilityValues } from "../../schemas/extensions/operation/index.js";
7
7
  import { getTag } from "./get-tag.js";
8
8
  const isDeprecatedOperation = (operation) => {
9
9
  return operation.deprecated || operation["x-scalar-stability"] === XScalarStabilityValues.Deprecated;
@@ -55,6 +55,7 @@ const traversePaths = ({
55
55
  generateId,
56
56
  documentId
57
57
  }) => {
58
+ const untaggedOperations = [];
58
59
  Object.entries(document.paths ?? {}).forEach(([path, pathItemObject]) => {
59
60
  const pathKeys = objectKeys(pathItemObject ?? {}).filter((key) => isHttpMethod(key));
60
61
  pathKeys.forEach((method) => {
@@ -88,26 +89,20 @@ const traversePaths = ({
88
89
  );
89
90
  });
90
91
  } else {
91
- const { tag, id: tagId } = getTag({
92
- tagsMap,
93
- name: "default",
94
- documentId,
95
- generateId
96
- });
97
- tagsMap.get("default")?.entries.push(
92
+ untaggedOperations.push(
98
93
  createOperationEntry({
99
94
  ref,
100
95
  operation,
101
96
  method,
102
97
  path,
103
- parentTag: { tag, id: tagId },
104
98
  generateId,
105
- parentId: tagId
99
+ parentId: documentId
106
100
  })
107
101
  );
108
102
  }
109
103
  });
110
104
  });
105
+ return { untaggedOperations };
111
106
  };
112
107
  export {
113
108
  isDeprecatedOperation,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/navigation/helpers/traverse-paths.ts"],
4
- "sourcesContent": ["import type { HttpMethod } from '@scalar/helpers/http/http-methods'\nimport { isHttpMethod } from '@scalar/helpers/http/is-http-method'\nimport { objectKeys } from '@scalar/helpers/object/object-keys'\nimport { escapeJsonPointer } from '@scalar/json-magic/helpers/escape-json-pointer'\n\nimport { getResolvedRef } from '@/helpers/get-resolved-ref'\nimport { traverseOperationExamples } from '@/navigation/helpers/traverse-examples'\nimport type { TagsMap, TraverseSpecOptions } from '@/navigation/types'\nimport { XScalarStabilityValues } from '@/schemas/extensions/operation/x-scalar-stability'\nimport type { ParentTag, TraversedExample, TraversedOperation } from '@/schemas/navigation'\nimport type { OpenApiDocument, OperationObject } from '@/schemas/v3.1/strict/openapi-document'\n\nimport { getTag } from './get-tag'\n\nexport const isDeprecatedOperation = (operation: OperationObject) => {\n return operation.deprecated || operation['x-scalar-stability'] === XScalarStabilityValues.Deprecated\n}\n\n/**\n * Creates a traversed operation entry from an OpenAPI operation object.\n *\n * @param ref - JSON pointer reference to the operation in the OpenAPI document\n * @param operation - The OpenAPI operation object\n * @param method - HTTP method of the operation\n * @param path - API path of the operation, defaults to 'Unknown'\n * @param tag - Tag object associated with the operation\n * @param entitiesMap - Map to store operation IDs and titles for mobile header navigation\n * @param getOperationId - Function to generate unique IDs for operations\n * @returns A traversed operation entry with ID, title, path, method and reference\n */\nconst createOperationEntry = ({\n ref,\n operation,\n method,\n path,\n generateId,\n parentId,\n parentTag,\n}: {\n ref: string\n operation: OperationObject\n method: HttpMethod\n path: string\n parentTag: ParentTag\n generateId: TraverseSpecOptions['generateId']\n parentId: string\n}): TraversedOperation => {\n const id = generateId({\n type: 'operation',\n operation,\n parentTag,\n method: method,\n path: path,\n parentId: parentId,\n })\n const title = operation.summary?.trim() ? operation.summary : path\n\n const isDeprecated = isDeprecatedOperation(operation)\n\n const examples: TraversedExample[] = traverseOperationExamples(operation).map((example) => ({\n type: 'example',\n id: generateId({\n type: 'example',\n parentId: id,\n name: example,\n }),\n title: example,\n name: example,\n }))\n\n const entry = {\n id,\n title,\n path,\n method,\n ref,\n type: 'operation',\n isDeprecated,\n children: examples.length ? examples : undefined,\n } satisfies TraversedOperation\n\n return entry\n}\n\n/**\n * Traverses the paths in an OpenAPI document to build a map of operations organized by tags.\n *\n * This function processes each path and its operations to:\n * - Filter out internal operations (marked with x-internal) and operations to ignore (marked with x-scalar-ignore)\n * - Group operations by their tags\n * - Create a default tag group for untagged operations\n * - Generate unique references and IDs for each operation\n *\n * TODO: filter out internal and scalar-ignore tags\n *\n * @param content - The OpenAPI document to traverse\n * @param tagsDict - Dictionary mapping tag names to their OpenAPI tag objects\n * @param entitiesMap - Map to store operation IDs and titles for mobile header navigation\n * @param getOperationId - Function to generate unique IDs for operations\n * @returns Map of tag names to arrays of traversed operations\n */\nexport const traversePaths = ({\n document,\n tagsMap,\n generateId,\n documentId,\n}: {\n document: OpenApiDocument\n /** Map of tags and their entries */\n tagsMap: TagsMap\n /** Function used to generate unique IDs for operations */\n generateId: TraverseSpecOptions['generateId']\n /** Document ID */\n documentId: string\n}) => {\n // Traverse paths\n Object.entries(document.paths ?? {}).forEach(([path, pathItemObject]) => {\n const pathKeys = objectKeys(pathItemObject ?? {}).filter((key) => isHttpMethod(key))\n\n pathKeys.forEach((method) => {\n const _operation = pathItemObject?.[method]\n const operation = getResolvedRef(_operation)\n if (!operation) {\n return\n }\n\n // Skip if the operation is internal or scalar-ignore\n if (operation['x-internal'] || operation['x-scalar-ignore'] || !isHttpMethod(method)) {\n return\n }\n\n const ref = `#/paths/${escapeJsonPointer(path)}/${method}`\n\n // Traverse tags\n if (operation.tags?.length) {\n operation.tags.forEach((tagName: string) => {\n const { tag, id: tagId } = getTag({\n tagsMap,\n name: tagName,\n documentId,\n generateId,\n })\n tagsMap.get(tagName)?.entries.push(\n createOperationEntry({\n ref,\n operation,\n method,\n path,\n parentTag: { tag, id: tagId },\n generateId,\n parentId: tagId,\n }),\n )\n })\n }\n // Add to default tag\n else {\n const { tag, id: tagId } = getTag({\n tagsMap,\n name: 'default',\n documentId,\n generateId,\n })\n tagsMap.get('default')?.entries.push(\n createOperationEntry({\n ref,\n operation,\n method,\n path,\n parentTag: { tag, id: tagId },\n generateId,\n parentId: tagId,\n }),\n )\n }\n })\n })\n}\n"],
5
- "mappings": "AACA,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,yBAAyB;AAElC,SAAS,sBAAsB;AAC/B,SAAS,iCAAiC;AAE1C,SAAS,8BAA8B;AAIvC,SAAS,cAAc;AAEhB,MAAM,wBAAwB,CAAC,cAA+B;AACnE,SAAO,UAAU,cAAc,UAAU,oBAAoB,MAAM,uBAAuB;AAC5F;AAcA,MAAM,uBAAuB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAQ0B;AACxB,QAAM,KAAK,WAAW;AAAA,IACpB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,QAAQ,UAAU,SAAS,KAAK,IAAI,UAAU,UAAU;AAE9D,QAAM,eAAe,sBAAsB,SAAS;AAEpD,QAAM,WAA+B,0BAA0B,SAAS,EAAE,IAAI,CAAC,aAAa;AAAA,IAC1F,MAAM;AAAA,IACN,IAAI,WAAW;AAAA,MACb,MAAM;AAAA,MACN,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,IACD,OAAO;AAAA,IACP,MAAM;AAAA,EACR,EAAE;AAEF,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,UAAU,SAAS,SAAS,WAAW;AAAA,EACzC;AAEA,SAAO;AACT;AAmBO,MAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAQM;AAEJ,SAAO,QAAQ,SAAS,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,MAAM,cAAc,MAAM;AACvE,UAAM,WAAW,WAAW,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,aAAa,GAAG,CAAC;AAEnF,aAAS,QAAQ,CAAC,WAAW;AAC3B,YAAM,aAAa,iBAAiB,MAAM;AAC1C,YAAM,YAAY,eAAe,UAAU;AAC3C,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AAGA,UAAI,UAAU,YAAY,KAAK,UAAU,iBAAiB,KAAK,CAAC,aAAa,MAAM,GAAG;AACpF;AAAA,MACF;AAEA,YAAM,MAAM,WAAW,kBAAkB,IAAI,CAAC,IAAI,MAAM;AAGxD,UAAI,UAAU,MAAM,QAAQ;AAC1B,kBAAU,KAAK,QAAQ,CAAC,YAAoB;AAC1C,gBAAM,EAAE,KAAK,IAAI,MAAM,IAAI,OAAO;AAAA,YAChC;AAAA,YACA,MAAM;AAAA,YACN;AAAA,YACA;AAAA,UACF,CAAC;AACD,kBAAQ,IAAI,OAAO,GAAG,QAAQ;AAAA,YAC5B,qBAAqB;AAAA,cACnB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,WAAW,EAAE,KAAK,IAAI,MAAM;AAAA,cAC5B;AAAA,cACA,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH,OAEK;AACH,cAAM,EAAE,KAAK,IAAI,MAAM,IAAI,OAAO;AAAA,UAChC;AAAA,UACA,MAAM;AAAA,UACN;AAAA,UACA;AAAA,QACF,CAAC;AACD,gBAAQ,IAAI,SAAS,GAAG,QAAQ;AAAA,UAC9B,qBAAqB;AAAA,YACnB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,WAAW,EAAE,KAAK,IAAI,MAAM;AAAA,YAC5B;AAAA,YACA,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;",
4
+ "sourcesContent": ["import type { HttpMethod } from '@scalar/helpers/http/http-methods'\nimport { isHttpMethod } from '@scalar/helpers/http/is-http-method'\nimport { objectKeys } from '@scalar/helpers/object/object-keys'\nimport { escapeJsonPointer } from '@scalar/json-magic/helpers/escape-json-pointer'\n\nimport { getResolvedRef } from '@/helpers/get-resolved-ref'\nimport { traverseOperationExamples } from '@/navigation/helpers/traverse-examples'\nimport type { TagsMap, TraverseSpecOptions } from '@/navigation/types'\nimport { XScalarStabilityValues } from '@/schemas/extensions/operation'\nimport type { ParentTag, TraversedExample, TraversedOperation } from '@/schemas/navigation'\nimport type { OpenApiDocument, OperationObject } from '@/schemas/v3.1/strict/openapi-document'\n\nimport { getTag } from './get-tag'\n\nexport const isDeprecatedOperation = (operation: OperationObject) => {\n return operation.deprecated || operation['x-scalar-stability'] === XScalarStabilityValues.Deprecated\n}\n\n/**\n * Creates a traversed operation entry from an OpenAPI operation object.\n *\n * @param ref - JSON pointer reference to the operation in the OpenAPI document\n * @param operation - The OpenAPI operation object\n * @param method - HTTP method of the operation\n * @param path - API path of the operation, defaults to 'Unknown'\n * @param tag - Tag object associated with the operation\n * @param entitiesMap - Map to store operation IDs and titles for mobile header navigation\n * @param getOperationId - Function to generate unique IDs for operations\n * @returns A traversed operation entry with ID, title, path, method and reference\n */\nconst createOperationEntry = ({\n ref,\n operation,\n method,\n path,\n generateId,\n parentId,\n parentTag,\n}: {\n ref: string\n operation: OperationObject\n method: HttpMethod\n path: string\n parentTag?: ParentTag\n generateId: TraverseSpecOptions['generateId']\n parentId: string\n}): TraversedOperation => {\n const id = generateId({\n type: 'operation',\n operation,\n parentTag,\n method: method,\n path: path,\n parentId: parentId,\n })\n const title = operation.summary?.trim() ? operation.summary : path\n\n const isDeprecated = isDeprecatedOperation(operation)\n\n const examples: TraversedExample[] = traverseOperationExamples(operation).map((example) => ({\n type: 'example',\n id: generateId({\n type: 'example',\n parentId: id,\n name: example,\n }),\n title: example,\n name: example,\n }))\n\n const entry = {\n id,\n title,\n path,\n method,\n ref,\n type: 'operation',\n isDeprecated,\n children: examples.length ? examples : undefined,\n } satisfies TraversedOperation\n\n return entry\n}\n\n/**\n * Traverses the paths in an OpenAPI document to build a map of operations organized by tags.\n *\n * This function processes each path and its operations to:\n * - Filter out internal operations (marked with x-internal) and operations to ignore (marked with x-scalar-ignore)\n * - Group operations by their tags\n * - Collect operations without tags to be added at the document level\n * - Generate unique references and IDs for each operation\n *\n * TODO: filter out internal and scalar-ignore tags\n *\n * @param content - The OpenAPI document to traverse\n * @param tagsDict - Dictionary mapping tag names to their OpenAPI tag objects\n * @param entitiesMap - Map to store operation IDs and titles for mobile header navigation\n * @param getOperationId - Function to generate unique IDs for operations\n * @returns Object containing the tagsMap and an array of untagged operations\n */\nexport const traversePaths = ({\n document,\n tagsMap,\n generateId,\n documentId,\n}: {\n document: OpenApiDocument\n /** Map of tags and their entries */\n tagsMap: TagsMap\n /** Function used to generate unique IDs for operations */\n generateId: TraverseSpecOptions['generateId']\n /** Document ID */\n documentId: string\n}): { untaggedOperations: TraversedOperation[] } => {\n const untaggedOperations: TraversedOperation[] = []\n\n // Traverse paths\n Object.entries(document.paths ?? {}).forEach(([path, pathItemObject]) => {\n const pathKeys = objectKeys(pathItemObject ?? {}).filter((key) => isHttpMethod(key))\n\n pathKeys.forEach((method) => {\n const _operation = pathItemObject?.[method]\n const operation = getResolvedRef(_operation)\n if (!operation) {\n return\n }\n\n // Skip if the operation is internal or scalar-ignore\n if (operation['x-internal'] || operation['x-scalar-ignore'] || !isHttpMethod(method)) {\n return\n }\n\n const ref = `#/paths/${escapeJsonPointer(path)}/${method}`\n\n // Traverse tags\n if (operation.tags?.length) {\n operation.tags.forEach((tagName: string) => {\n const { tag, id: tagId } = getTag({\n tagsMap,\n name: tagName,\n documentId,\n generateId,\n })\n tagsMap.get(tagName)?.entries.push(\n createOperationEntry({\n ref,\n operation,\n method,\n path,\n parentTag: { tag, id: tagId },\n generateId,\n parentId: tagId,\n }),\n )\n })\n } else {\n // Collect operations without tags (no parentTag)\n untaggedOperations.push(\n createOperationEntry({\n ref,\n operation,\n method,\n path,\n generateId,\n parentId: documentId,\n }),\n )\n }\n })\n })\n\n return { untaggedOperations }\n}\n"],
5
+ "mappings": "AACA,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAC3B,SAAS,yBAAyB;AAElC,SAAS,sBAAsB;AAC/B,SAAS,iCAAiC;AAE1C,SAAS,8BAA8B;AAIvC,SAAS,cAAc;AAEhB,MAAM,wBAAwB,CAAC,cAA+B;AACnE,SAAO,UAAU,cAAc,UAAU,oBAAoB,MAAM,uBAAuB;AAC5F;AAcA,MAAM,uBAAuB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAQ0B;AACxB,QAAM,KAAK,WAAW;AAAA,IACpB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,QAAQ,UAAU,SAAS,KAAK,IAAI,UAAU,UAAU;AAE9D,QAAM,eAAe,sBAAsB,SAAS;AAEpD,QAAM,WAA+B,0BAA0B,SAAS,EAAE,IAAI,CAAC,aAAa;AAAA,IAC1F,MAAM;AAAA,IACN,IAAI,WAAW;AAAA,MACb,MAAM;AAAA,MACN,UAAU;AAAA,MACV,MAAM;AAAA,IACR,CAAC;AAAA,IACD,OAAO;AAAA,IACP,MAAM;AAAA,EACR,EAAE;AAEF,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,UAAU,SAAS,SAAS,WAAW;AAAA,EACzC;AAEA,SAAO;AACT;AAmBO,MAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAQoD;AAClD,QAAM,qBAA2C,CAAC;AAGlD,SAAO,QAAQ,SAAS,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,MAAM,cAAc,MAAM;AACvE,UAAM,WAAW,WAAW,kBAAkB,CAAC,CAAC,EAAE,OAAO,CAAC,QAAQ,aAAa,GAAG,CAAC;AAEnF,aAAS,QAAQ,CAAC,WAAW;AAC3B,YAAM,aAAa,iBAAiB,MAAM;AAC1C,YAAM,YAAY,eAAe,UAAU;AAC3C,UAAI,CAAC,WAAW;AACd;AAAA,MACF;AAGA,UAAI,UAAU,YAAY,KAAK,UAAU,iBAAiB,KAAK,CAAC,aAAa,MAAM,GAAG;AACpF;AAAA,MACF;AAEA,YAAM,MAAM,WAAW,kBAAkB,IAAI,CAAC,IAAI,MAAM;AAGxD,UAAI,UAAU,MAAM,QAAQ;AAC1B,kBAAU,KAAK,QAAQ,CAAC,YAAoB;AAC1C,gBAAM,EAAE,KAAK,IAAI,MAAM,IAAI,OAAO;AAAA,YAChC;AAAA,YACA,MAAM;AAAA,YACN;AAAA,YACA;AAAA,UACF,CAAC;AACD,kBAAQ,IAAI,OAAO,GAAG,QAAQ;AAAA,YAC5B,qBAAqB;AAAA,cACnB;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,WAAW,EAAE,KAAK,IAAI,MAAM;AAAA,cAC5B;AAAA,cACA,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH,OAAO;AAEL,2BAAmB;AAAA,UACjB,qBAAqB;AAAA,YACnB;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO,EAAE,mBAAmB;AAC9B;",
6
6
  "names": []
7
7
  }
@@ -9,7 +9,6 @@ type Options = Pick<TraverseSpecOptions, 'tagsSorter' | 'operationsSorter' | 'ge
9
9
  * - Handle tag groups if specified via x-tagGroups
10
10
  * - Sort tags and their operations according to provided sorters
11
11
  * - Create navigation entries for each tag or tag group
12
- * - Flatten default tag entries if it's the only tag present
13
12
  */
14
13
  export declare const traverseTags: ({ document, tagsMap, documentId, options: { generateId, tagsSorter, operationsSorter }, }: {
15
14
  document: OpenApiDocument;
@@ -1 +1 @@
1
- {"version":3,"file":"traverse-tags.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-tags.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,sBAAsB,CAAA;AACxE,OAAO,KAAK,EAAE,eAAe,EAAa,MAAM,wCAAwC,CAAA;AAIxF,KAAK,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,kBAAkB,GAAG,YAAY,CAAC,CAAA;AAkK1F;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,GAAI,2FAK1B;IACD,QAAQ,EAAE,eAAe,CAAA;IACzB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;CACjB,KAAG,cAAc,EAuCjB,CAAA"}
1
+ {"version":3,"file":"traverse-tags.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-tags.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,sBAAsB,CAAA;AACxE,OAAO,KAAK,EAAE,eAAe,EAAa,MAAM,wCAAwC,CAAA;AAIxF,KAAK,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,kBAAkB,GAAG,YAAY,CAAC,CAAA;AA2K1F;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,2FAK1B;IACD,QAAQ,EAAE,eAAe,CAAA;IACzB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;CACjB,KAAG,cAAc,EAyCjB,CAAA"}
@@ -1,3 +1,5 @@
1
+ import { sortByOrder } from "@scalar/object-utils/arrays";
2
+ import { unpackProxyObject } from "../../helpers/unpack-proxy.js";
1
3
  import { getXKeysFromObject } from "../../navigation/helpers/get-x-keys.js";
2
4
  import { getTag } from "./get-tag.js";
3
5
  const createTagEntry = ({
@@ -13,6 +15,7 @@ const createTagEntry = ({
13
15
  parentId
14
16
  });
15
17
  const title = tag["x-displayName"] ?? tag.name ?? "Untitled Tag";
18
+ tag["x-scalar-order"] = children.map((child) => child.id);
16
19
  const entry = {
17
20
  id,
18
21
  title,
@@ -22,7 +25,7 @@ const createTagEntry = ({
22
25
  isGroup,
23
26
  isWebhooks: false,
24
27
  type: "tag",
25
- xKeys: getXKeysFromObject(tag)
28
+ xKeys: getXKeysFromObject(unpackProxyObject(tag))
26
29
  };
27
30
  return entry;
28
31
  };
@@ -30,62 +33,67 @@ const getSortedTagEntries = ({
30
33
  _keys,
31
34
  tagsMap,
32
35
  options: { tagsSorter, operationsSorter, generateId },
33
- documentId
36
+ documentId,
37
+ sortOrder
34
38
  }) => {
35
- const hasDefault = _keys.includes("default");
36
- const keys = hasDefault ? _keys.filter((key) => key !== "default") : _keys;
39
+ const entries = _keys.flatMap((key) => {
40
+ const { tag, entries: entries2 } = getTag({ tagsMap, name: key, documentId, generateId });
41
+ if (tag["x-internal"] || tag["x-scalar-ignore"]) {
42
+ return [];
43
+ }
44
+ const sortOrder2 = tag["x-scalar-order"];
45
+ if (sortOrder2 === void 0) {
46
+ if (operationsSorter === "alpha") {
47
+ entries2.sort((a, b) => a.type === "operation" && b.type === "operation" ? a.title.localeCompare(b.title) : 0);
48
+ } else if (operationsSorter === "method") {
49
+ entries2.sort(
50
+ (a, b) => a.type === "operation" && b.type === "operation" ? a.method.localeCompare(b.method) : 0
51
+ );
52
+ } else if (typeof operationsSorter === "function") {
53
+ entries2.sort((a, b) => {
54
+ if (!(a.type === "operation" || a.type === "webhook") || !(b.type === "operation" || b.type === "webhook")) {
55
+ return 0;
56
+ }
57
+ const pathA = a.type === "operation" ? a.path : a.name;
58
+ const pathB = b.type === "operation" ? b.path : b.name;
59
+ return operationsSorter(
60
+ { method: a.method, path: pathA, ref: a.ref, httpVerb: a.method },
61
+ { method: b.method, path: pathB, ref: b.ref, httpVerb: b.method }
62
+ );
63
+ });
64
+ }
65
+ }
66
+ return createTagEntry({
67
+ tag,
68
+ generateId,
69
+ children: sortOrder2 ? sortByOrder(entries2, sortOrder2, "id") : entries2,
70
+ parentId: documentId,
71
+ isGroup: false
72
+ });
73
+ });
74
+ if (sortOrder) {
75
+ return sortByOrder(entries, sortOrder, "id");
76
+ }
37
77
  if (tagsSorter === "alpha") {
38
- keys.sort((a, b) => {
78
+ entries.sort((a, b) => {
39
79
  const nameA = getTag({
40
80
  tagsMap,
41
- name: a,
81
+ name: a.title,
42
82
  documentId,
43
83
  generateId
44
- }).tag["x-displayName"] || a || "Untitled Tag";
45
- const nameB = getTag({ tagsMap, name: b, documentId, generateId }).tag["x-displayName"] || b || "Untitled Tag";
84
+ }).tag["x-displayName"] || a.title || "Untitled Tag";
85
+ const nameB = getTag({ tagsMap, name: b.title, documentId, generateId }).tag["x-displayName"] || b.title || "Untitled Tag";
46
86
  return nameA.localeCompare(nameB);
47
87
  });
48
88
  } else if (typeof tagsSorter === "function") {
49
- keys.sort(
89
+ entries.sort(
50
90
  (a, b) => tagsSorter(
51
- getTag({ tagsMap, name: a, documentId, generateId }).tag,
52
- getTag({ tagsMap, name: b, documentId, generateId }).tag
91
+ getTag({ tagsMap, name: a.name, documentId, generateId }).tag,
92
+ getTag({ tagsMap, name: b.name, documentId, generateId }).tag
53
93
  )
54
94
  );
55
95
  }
56
- if (hasDefault) {
57
- keys.push("default");
58
- }
59
- return keys.flatMap((key) => {
60
- const { tag, entries } = getTag({ tagsMap, name: key, documentId, generateId });
61
- if (tag["x-internal"] || tag["x-scalar-ignore"]) {
62
- return [];
63
- }
64
- if (operationsSorter === "alpha") {
65
- entries.sort((a, b) => a.type === "operation" && b.type === "operation" ? a.title.localeCompare(b.title) : 0);
66
- } else if (operationsSorter === "method") {
67
- entries.sort((a, b) => a.type === "operation" && b.type === "operation" ? a.method.localeCompare(b.method) : 0);
68
- } else if (typeof operationsSorter === "function") {
69
- entries.sort((a, b) => {
70
- if (!(a.type === "operation" || a.type === "webhook") || !(b.type === "operation" || b.type === "webhook")) {
71
- return 0;
72
- }
73
- const pathA = a.type === "operation" ? a.path : a.name;
74
- const pathB = b.type === "operation" ? b.path : b.name;
75
- return operationsSorter(
76
- { method: a.method, path: pathA, ref: a.ref, httpVerb: a.method },
77
- { method: b.method, path: pathB, ref: b.ref, httpVerb: b.method }
78
- );
79
- });
80
- }
81
- return entries.length ? createTagEntry({
82
- tag,
83
- generateId,
84
- children: entries,
85
- parentId: documentId,
86
- isGroup: false
87
- }) : [];
88
- });
96
+ return entries;
89
97
  };
90
98
  const traverseTags = ({
91
99
  document,
@@ -100,8 +108,10 @@ const traverseTags = ({
100
108
  _keys: tagGroup.tags,
101
109
  tagsMap,
102
110
  options: { tagsSorter, operationsSorter, generateId },
103
- documentId
111
+ documentId,
112
+ sortOrder: tagGroup["x-scalar-order"]
104
113
  });
114
+ tagGroup["x-scalar-order"] = entries.map((entry) => entry.id);
105
115
  return entries.length ? createTagEntry({
106
116
  tag: tagGroup,
107
117
  generateId,
@@ -116,11 +126,9 @@ const traverseTags = ({
116
126
  _keys: keys,
117
127
  tagsMap,
118
128
  options: { generateId, tagsSorter, operationsSorter },
119
- documentId
129
+ documentId,
130
+ sortOrder: document["x-scalar-order"]
120
131
  });
121
- if (tags.length === 1 && tags[0]?.title === "default") {
122
- return tags[0]?.children ?? [];
123
- }
124
132
  return tags;
125
133
  };
126
134
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/navigation/helpers/traverse-tags.ts"],
4
- "sourcesContent": ["import { getXKeysFromObject } from '@/navigation/helpers/get-x-keys'\nimport type { TagsMap, TraverseSpecOptions } from '@/navigation/types'\nimport type { TraversedEntry, TraversedTag } from '@/schemas/navigation'\nimport type { OpenApiDocument, TagObject } from '@/schemas/v3.1/strict/openapi-document'\n\nimport { getTag } from './get-tag'\n\ntype Options = Pick<TraverseSpecOptions, 'tagsSorter' | 'operationsSorter' | 'generateId'>\n\n/** Creates a traversed tag entry from an OpenAPI tag object.\n *\n * @param tag - The OpenAPI tag object\n * @param entriesMap - Map to store tag IDs and titles for mobile header navigation\n * @param getTagId - Function to generate unique IDs for tags\n * @param children - Array of child entries (operations, webhooks, etc.)\n * @param isGroup - Whether this tag represents a group of tags\n * @returns A traversed tag entry with ID, title, name and children\n */\nconst createTagEntry = ({\n tag,\n generateId,\n children,\n isGroup = false,\n parentId,\n}: {\n tag: TagObject\n generateId: TraverseSpecOptions['generateId']\n children: TraversedEntry[]\n isGroup: boolean\n parentId: string\n}): TraversedTag => {\n const id = generateId({\n type: 'tag',\n tag,\n parentId,\n })\n const title = tag['x-displayName'] ?? tag.name ?? 'Untitled Tag'\n\n const entry = {\n id,\n title,\n name: tag.name || title,\n description: tag.description,\n children,\n isGroup,\n isWebhooks: false,\n type: 'tag',\n xKeys: getXKeysFromObject(tag),\n } satisfies TraversedTag\n\n return entry\n}\n\n/** Sorts and processes tags to create a hierarchical structure of tag entries.\n *\n * This function handles:\n * - Sorting tags alphabetically or using a custom sort function\n * - Ensuring the default tag appears last\n * - Sorting operations within tags by title, method, or custom function\n * - Filtering out internal and ignored tags\n * - Creating tag entries with their associated operations\n *\n * @param _keys - Array of tag keys to process\n * @param tagsMap - Map of tags and their entries\n * @param tagsDict - Dictionary of OpenAPI tags by name\n * @param titlesMap - Map of titles for the mobile header\n * @param options - Sorting and ID generation options\n * @returns Array of processed and sorted tag entries\n */\n/** Sorts tags and returns entries */\nconst getSortedTagEntries = ({\n _keys,\n tagsMap,\n options: { tagsSorter, operationsSorter, generateId },\n documentId,\n}: {\n _keys: string[]\n /** Map of tags and their entries */\n tagsMap: TagsMap\n options: Options\n documentId: string\n}) => {\n // Ensure that default is last if it exists\n const hasDefault = _keys.includes('default')\n const keys = hasDefault ? _keys.filter((key) => key !== 'default') : _keys\n\n // Alpha sort\n if (tagsSorter === 'alpha') {\n keys.sort((a, b) => {\n const nameA =\n getTag({\n tagsMap,\n name: a,\n documentId,\n generateId,\n }).tag['x-displayName'] ||\n a ||\n 'Untitled Tag'\n const nameB = getTag({ tagsMap, name: b, documentId, generateId }).tag['x-displayName'] || b || 'Untitled Tag'\n return nameA.localeCompare(nameB)\n })\n }\n // Custom sort\n else if (typeof tagsSorter === 'function') {\n keys.sort((a, b) =>\n tagsSorter(\n getTag({ tagsMap, name: a, documentId, generateId }).tag,\n getTag({ tagsMap, name: b, documentId, generateId }).tag,\n ),\n )\n }\n\n if (hasDefault) {\n keys.push('default')\n }\n\n /**\n * Process each tag and its entries:\n * - Skip internal and ignored tags\n * - Sort operations within tags\n * - Create tag entries with sorted operations\n */\n return keys.flatMap((key) => {\n const { tag, entries } = getTag({ tagsMap, name: key, documentId, generateId })\n\n // Skip if the tag is internal or scalar-ignore\n if (tag['x-internal'] || tag['x-scalar-ignore']) {\n return []\n }\n\n // Alpha sort\n if (operationsSorter === 'alpha') {\n entries.sort((a, b) => (a.type === 'operation' && b.type === 'operation' ? a.title.localeCompare(b.title) : 0))\n }\n // Method sort\n else if (operationsSorter === 'method') {\n entries.sort((a, b) => (a.type === 'operation' && b.type === 'operation' ? a.method.localeCompare(b.method) : 0))\n }\n // Custom sort\n else if (typeof operationsSorter === 'function') {\n entries.sort((a, b) => {\n // Guard against tags\n if (!(a.type === 'operation' || a.type === 'webhook') || !(b.type === 'operation' || b.type === 'webhook')) {\n return 0\n }\n\n // Handle webhooks as well as operations\n const pathA = a.type === 'operation' ? a.path : a.name\n const pathB = b.type === 'operation' ? b.path : b.name\n\n return operationsSorter(\n { method: a.method, path: pathA, ref: a.ref, httpVerb: a.method },\n { method: b.method, path: pathB, ref: b.ref, httpVerb: b.method },\n )\n })\n }\n\n return entries.length\n ? createTagEntry({\n tag,\n generateId,\n children: entries,\n parentId: documentId,\n isGroup: false,\n })\n : []\n })\n}\n\n/**\n * Traverses the tags map to create navigation entries, handling both grouped and ungrouped tags.\n *\n * This function processes the OpenAPI document's tags to:\n * - Handle tag groups if specified via x-tagGroups\n * - Sort tags and their operations according to provided sorters\n * - Create navigation entries for each tag or tag group\n * - Flatten default tag entries if it's the only tag present\n */\nexport const traverseTags = ({\n document,\n tagsMap,\n documentId,\n options: { generateId, tagsSorter, operationsSorter },\n}: {\n document: OpenApiDocument\n /** Map of tags and their entries */\n tagsMap: TagsMap\n documentId: string\n options: Options\n}): TraversedEntry[] => {\n // x-tagGroups\n if (document['x-tagGroups']) {\n const tagGroups = document['x-tagGroups']\n\n return tagGroups.flatMap((tagGroup) => {\n const entries = getSortedTagEntries({\n _keys: tagGroup.tags,\n tagsMap,\n options: { tagsSorter, operationsSorter, generateId },\n documentId: documentId,\n })\n return entries.length\n ? createTagEntry({\n tag: tagGroup,\n generateId,\n children: entries,\n parentId: documentId,\n isGroup: true,\n })\n : []\n })\n }\n\n // Ungrouped regular tags\n const keys = Array.from(tagsMap.keys())\n const tags = getSortedTagEntries({\n _keys: keys,\n tagsMap,\n options: { generateId, tagsSorter, operationsSorter },\n documentId: documentId,\n })\n\n // Flatten if we only have default tag\n if (tags.length === 1 && tags[0]?.title === 'default') {\n return tags[0]?.children ?? []\n }\n\n return tags\n}\n"],
5
- "mappings": "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",
6
- "names": []
4
+ "sourcesContent": ["import { sortByOrder } from '@scalar/object-utils/arrays'\n\nimport { unpackProxyObject } from '@/helpers/unpack-proxy'\nimport { getXKeysFromObject } from '@/navigation/helpers/get-x-keys'\nimport type { TagsMap, TraverseSpecOptions } from '@/navigation/types'\nimport type { TraversedEntry, TraversedTag } from '@/schemas/navigation'\nimport type { OpenApiDocument, TagObject } from '@/schemas/v3.1/strict/openapi-document'\n\nimport { getTag } from './get-tag'\n\ntype Options = Pick<TraverseSpecOptions, 'tagsSorter' | 'operationsSorter' | 'generateId'>\n\n/** Creates a traversed tag entry from an OpenAPI tag object.\n *\n * @param tag - The OpenAPI tag object\n * @param entriesMap - Map to store tag IDs and titles for mobile header navigation\n * @param getTagId - Function to generate unique IDs for tags\n * @param children - Array of child entries (operations, webhooks, etc.)\n * @param isGroup - Whether this tag represents a group of tags\n * @returns A traversed tag entry with ID, title, name and children\n */\nconst createTagEntry = ({\n tag,\n generateId,\n children,\n isGroup = false,\n parentId,\n}: {\n tag: TagObject\n generateId: TraverseSpecOptions['generateId']\n children: TraversedEntry[]\n isGroup: boolean\n parentId: string\n}): TraversedTag => {\n const id = generateId({\n type: 'tag',\n tag,\n parentId,\n })\n const title = tag['x-displayName'] ?? tag.name ?? 'Untitled Tag'\n\n // Update the order of the children based on the items\n // This will ensure that the sort order is always in sync with the items\n tag['x-scalar-order'] = children.map((child) => child.id)\n\n const entry = {\n id,\n title,\n name: tag.name || title,\n description: tag.description,\n children,\n isGroup,\n isWebhooks: false,\n type: 'tag',\n xKeys: getXKeysFromObject(unpackProxyObject(tag)),\n } satisfies TraversedTag\n\n return entry\n}\n\n/** Sorts and processes tags to create a hierarchical structure of tag entries.\n *\n * This function handles:\n * - Sorting tags alphabetically or using a custom sort function\n * - Sorting operations within tags by title, method, or custom function\n * - Filtering out internal and ignored tags\n * - Creating tag entries with their associated operations\n *\n * @param _keys - Array of tag keys to process\n * @param tagsMap - Map of tags and their entries\n * @param tagsDict - Dictionary of OpenAPI tags by name\n * @param titlesMap - Map of titles for the mobile header\n * @param options - Sorting and ID generation options\n * @returns Array of processed and sorted tag entries\n */\n/** Sorts tags and returns entries */\nconst getSortedTagEntries = ({\n _keys,\n tagsMap,\n options: { tagsSorter, operationsSorter, generateId },\n documentId,\n sortOrder,\n}: {\n _keys: string[]\n /** Map of tags and their entries */\n tagsMap: TagsMap\n options: Options\n documentId: string\n sortOrder: string[] | undefined\n}) => {\n /**\n * Process each tag and its entries:\n * - Skip internal and ignored tags\n * - Sort operations within tags\n * - Create tag entries with sorted operations\n */\n const entries = _keys.flatMap((key) => {\n const { tag, entries } = getTag({ tagsMap, name: key, documentId, generateId })\n\n // Skip if the tag is internal or scalar-ignore\n if (tag['x-internal'] || tag['x-scalar-ignore']) {\n return []\n }\n\n const sortOrder = tag['x-scalar-order']\n\n if (sortOrder === undefined) {\n // Alpha sort\n if (operationsSorter === 'alpha') {\n entries.sort((a, b) => (a.type === 'operation' && b.type === 'operation' ? a.title.localeCompare(b.title) : 0))\n }\n // Method sort\n else if (operationsSorter === 'method') {\n entries.sort((a, b) =>\n a.type === 'operation' && b.type === 'operation' ? a.method.localeCompare(b.method) : 0,\n )\n }\n // Custom sort\n else if (typeof operationsSorter === 'function') {\n entries.sort((a, b) => {\n // Guard against tags\n if (!(a.type === 'operation' || a.type === 'webhook') || !(b.type === 'operation' || b.type === 'webhook')) {\n return 0\n }\n\n // Handle webhooks as well as operations\n const pathA = a.type === 'operation' ? a.path : a.name\n const pathB = b.type === 'operation' ? b.path : b.name\n\n return operationsSorter(\n { method: a.method, path: pathA, ref: a.ref, httpVerb: a.method },\n { method: b.method, path: pathB, ref: b.ref, httpVerb: b.method },\n )\n })\n }\n }\n\n return createTagEntry({\n tag,\n generateId,\n children: sortOrder ? sortByOrder(entries, sortOrder, 'id') : entries,\n parentId: documentId,\n isGroup: false,\n })\n })\n\n // If a custom 'x-scalar-order' is specified in the tag, sort the entries by this order using sortByOrder\n if (sortOrder) {\n return sortByOrder(entries, sortOrder, 'id')\n }\n\n // Alpha sort\n if (tagsSorter === 'alpha') {\n entries.sort((a, b) => {\n const nameA =\n getTag({\n tagsMap,\n name: a.title,\n documentId,\n generateId,\n }).tag['x-displayName'] ||\n a.title ||\n 'Untitled Tag'\n const nameB =\n getTag({ tagsMap, name: b.title, documentId, generateId }).tag['x-displayName'] || b.title || 'Untitled Tag'\n return nameA.localeCompare(nameB)\n })\n }\n // Custom sort\n else if (typeof tagsSorter === 'function') {\n entries.sort((a, b) =>\n tagsSorter(\n getTag({ tagsMap, name: a.name, documentId, generateId }).tag,\n getTag({ tagsMap, name: b.name, documentId, generateId }).tag,\n ),\n )\n }\n\n return entries\n}\n\n/**\n * Traverses the tags map to create navigation entries, handling both grouped and ungrouped tags.\n *\n * This function processes the OpenAPI document's tags to:\n * - Handle tag groups if specified via x-tagGroups\n * - Sort tags and their operations according to provided sorters\n * - Create navigation entries for each tag or tag group\n */\nexport const traverseTags = ({\n document,\n tagsMap,\n documentId,\n options: { generateId, tagsSorter, operationsSorter },\n}: {\n document: OpenApiDocument\n /** Map of tags and their entries */\n tagsMap: TagsMap\n documentId: string\n options: Options\n}): TraversedEntry[] => {\n // x-tagGroups\n if (document['x-tagGroups']) {\n const tagGroups = document['x-tagGroups']\n\n return tagGroups.flatMap((tagGroup) => {\n const entries = getSortedTagEntries({\n _keys: tagGroup.tags,\n tagsMap,\n options: { tagsSorter, operationsSorter, generateId },\n documentId: documentId,\n sortOrder: tagGroup['x-scalar-order'],\n })\n\n // Try to update the sort order of the tag group to keep it in sync with the items\n tagGroup['x-scalar-order'] = entries.map((entry) => entry.id)\n\n return entries.length\n ? createTagEntry({\n tag: tagGroup,\n generateId,\n children: entries,\n parentId: documentId,\n isGroup: true,\n })\n : []\n })\n }\n\n // Ungrouped regular tags\n const keys = Array.from(tagsMap.keys())\n\n const tags = getSortedTagEntries({\n _keys: keys,\n tagsMap,\n options: { generateId, tagsSorter, operationsSorter },\n documentId: documentId,\n sortOrder: document['x-scalar-order'],\n })\n\n return tags\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["entries", "sortOrder"]
7
7
  }
@@ -21,7 +21,7 @@ import type { Heading } from '../../navigation/types.js';
21
21
  * // ]
22
22
  */
23
23
  export declare function getHeadingsFromMarkdown(input: string): Heading[];
24
- export type HeadingLevels = 1 | 2 | 3 | 4 | 5 | 6;
24
+ type HeadingLevels = 1 | 2 | 3 | 4 | 5 | 6;
25
25
  /**
26
26
  * Returns the lowest heading level from a list of headings.
27
27
  *
@@ -36,4 +36,5 @@ export type HeadingLevels = 1 | 2 | 3 | 4 | 5 | 6;
36
36
  * getLowestHeadingLevel(headings) // Returns: 1
37
37
  */
38
38
  export declare const getLowestHeadingLevel: (headings: Heading[]) => HeadingLevels;
39
+ export {};
39
40
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AA+BjD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAMhE;AAED,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAEjD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,GAAI,UAAU,OAAO,EAAE,KAAG,aAQ3D,CAAA"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AA+BjD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAMhE;AAED,KAAK,aAAa,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAE1C;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,GAAI,UAAU,OAAO,EAAE,KAAG,aAQ3D,CAAA"}