@scalar/workspace-store 0.40.2 → 0.40.4

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 (368) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/client.d.ts +7 -2
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +820 -681
  5. package/dist/entities/auth/index.js +96 -101
  6. package/dist/entities/auth/schema.d.ts +10 -0
  7. package/dist/entities/auth/schema.d.ts.map +1 -1
  8. package/dist/entities/auth/schema.js +42 -116
  9. package/dist/entities/history/index.js +80 -60
  10. package/dist/entities/history/schema.js +94 -88
  11. package/dist/events/bus.js +146 -93
  12. package/dist/events/definitions/analytics.js +1 -1
  13. package/dist/events/definitions/auth.js +1 -1
  14. package/dist/events/definitions/common.js +1 -1
  15. package/dist/events/definitions/cookie.js +1 -1
  16. package/dist/events/definitions/document.js +1 -1
  17. package/dist/events/definitions/environment.js +1 -1
  18. package/dist/events/definitions/hooks.js +1 -1
  19. package/dist/events/definitions/index.js +1 -1
  20. package/dist/events/definitions/meta.js +1 -1
  21. package/dist/events/definitions/operation.js +1 -1
  22. package/dist/events/definitions/server.js +1 -1
  23. package/dist/events/definitions/tabs.js +1 -1
  24. package/dist/events/definitions/tag.js +1 -1
  25. package/dist/events/definitions/ui.js +1 -1
  26. package/dist/events/definitions/workspace.js +1 -1
  27. package/dist/events/index.js +3 -9
  28. package/dist/events/listeners.js +20 -22
  29. package/dist/events/old-definitions.js +15 -12
  30. package/dist/helpers/deep-clone.js +33 -17
  31. package/dist/helpers/detect-changes-proxy.js +95 -57
  32. package/dist/helpers/general.js +78 -23
  33. package/dist/helpers/generate-unique-value.js +77 -45
  34. package/dist/helpers/get-fetch.js +12 -10
  35. package/dist/helpers/get-resolved-ref.js +11 -10
  36. package/dist/helpers/is-non-optional-security-requirement.js +3 -6
  37. package/dist/helpers/merge-object.js +71 -30
  38. package/dist/helpers/overrides-proxy.js +98 -58
  39. package/dist/helpers/unpack-proxy.js +60 -58
  40. package/dist/mutators/auth.js +358 -230
  41. package/dist/mutators/cookie.js +59 -42
  42. package/dist/mutators/document.js +104 -66
  43. package/dist/mutators/environment.js +97 -72
  44. package/dist/mutators/helpers.js +9 -13
  45. package/dist/mutators/index.js +62 -49
  46. package/dist/mutators/operation/body.js +88 -57
  47. package/dist/mutators/operation/extensions.js +20 -12
  48. package/dist/mutators/operation/helpers/fetch-request-to-har.js +144 -107
  49. package/dist/mutators/operation/helpers/fetch-response-to-har.js +143 -95
  50. package/dist/mutators/operation/helpers/get-parameter-position.js +12 -12
  51. package/dist/mutators/operation/helpers/har-to-operation.js +169 -132
  52. package/dist/mutators/operation/helpers/sync-path-parameters.js +109 -60
  53. package/dist/mutators/operation/history.js +60 -64
  54. package/dist/mutators/operation/index.js +25 -49
  55. package/dist/mutators/operation/operation.js +349 -240
  56. package/dist/mutators/operation/parameters.js +157 -93
  57. package/dist/mutators/server.js +213 -152
  58. package/dist/mutators/tabs.js +173 -130
  59. package/dist/mutators/tag.js +131 -97
  60. package/dist/mutators/workspace.js +72 -42
  61. package/dist/navigation/get-navigation-options.js +97 -84
  62. package/dist/navigation/helpers/get-openapi-object.js +46 -29
  63. package/dist/navigation/helpers/get-operation-entries.js +72 -32
  64. package/dist/navigation/helpers/get-parent-entry.js +16 -12
  65. package/dist/navigation/helpers/get-tag-entries.js +56 -29
  66. package/dist/navigation/helpers/get-tag.js +22 -23
  67. package/dist/navigation/helpers/get-x-keys.js +13 -9
  68. package/dist/navigation/helpers/traverse-description.js +90 -72
  69. package/dist/navigation/helpers/traverse-document.js +111 -98
  70. package/dist/navigation/helpers/traverse-examples.js +35 -31
  71. package/dist/navigation/helpers/traverse-paths.js +118 -106
  72. package/dist/navigation/helpers/traverse-schemas.js +65 -64
  73. package/dist/navigation/helpers/traverse-tags.js +158 -129
  74. package/dist/navigation/helpers/traverse-webhooks.js +96 -90
  75. package/dist/navigation/helpers/update-order-ids.js +59 -51
  76. package/dist/navigation/helpers/utils.js +71 -21
  77. package/dist/navigation/index.js +5 -13
  78. package/dist/navigation/types.js +1 -1
  79. package/dist/persistence/index.js +283 -285
  80. package/dist/persistence/indexdb.js +263 -126
  81. package/dist/plugins/bundler/helpers.js +21 -12
  82. package/dist/plugins/bundler/index.d.ts +7 -0
  83. package/dist/plugins/bundler/index.d.ts.map +1 -1
  84. package/dist/plugins/bundler/index.js +305 -171
  85. package/dist/plugins/client/index.js +1 -5
  86. package/dist/plugins/client/persistence.js +95 -90
  87. package/dist/resolve.js +18 -25
  88. package/dist/schemas/compose.js +6 -7
  89. package/dist/schemas/extensions/document/x-internal.js +3 -7
  90. package/dist/schemas/extensions/document/x-scalar-environments.js +16 -22
  91. package/dist/schemas/extensions/document/x-scalar-icon.js +3 -7
  92. package/dist/schemas/extensions/document/x-scalar-ignore.js +3 -7
  93. package/dist/schemas/extensions/document/x-scalar-is-dirty.js +21 -8
  94. package/dist/schemas/extensions/document/x-scalar-original-document-hash.js +17 -8
  95. package/dist/schemas/extensions/document/x-scalar-registry-meta.js +15 -21
  96. package/dist/schemas/extensions/document/x-scalar-sdk-installation.js +5 -13
  97. package/dist/schemas/extensions/document/x-scalar-watch-mode.js +4 -8
  98. package/dist/schemas/extensions/document/x-tags.js +3 -7
  99. package/dist/schemas/extensions/example/x-disabled.js +17 -7
  100. package/dist/schemas/extensions/general/x-scalar-active-environment.js +4 -7
  101. package/dist/schemas/extensions/general/x-scalar-cookies.js +9 -14
  102. package/dist/schemas/extensions/general/x-scalar-order.js +8 -7
  103. package/dist/schemas/extensions/operation/index.js +4 -23
  104. package/dist/schemas/extensions/operation/x-badge.js +42 -50
  105. package/dist/schemas/extensions/operation/x-code-samples.js +8 -12
  106. package/dist/schemas/extensions/operation/x-draft-examples.js +3 -7
  107. package/dist/schemas/extensions/operation/x-post-response.js +18 -7
  108. package/dist/schemas/extensions/operation/x-scalar-disable-parameters.js +57 -13
  109. package/dist/schemas/extensions/operation/x-scalar-selected-content-type.js +9 -7
  110. package/dist/schemas/extensions/operation/x-scalar-stability.js +15 -14
  111. package/dist/schemas/extensions/parameter/x-global.js +12 -7
  112. package/dist/schemas/extensions/schema/x-additional-properties-name.js +10 -7
  113. package/dist/schemas/extensions/schema/x-enum-descriptions.js +17 -12
  114. package/dist/schemas/extensions/schema/x-enum-varnames.js +21 -8
  115. package/dist/schemas/extensions/schema/x-examples.js +3 -7
  116. package/dist/schemas/extensions/schema/x-variable.js +3 -7
  117. package/dist/schemas/extensions/security/index.js +1 -1
  118. package/dist/schemas/extensions/security/x-default-scopes.js +16 -7
  119. package/dist/schemas/extensions/security/x-scalar-credentials-location.js +16 -7
  120. package/dist/schemas/extensions/security/x-scalar-security-body.js +14 -7
  121. package/dist/schemas/extensions/security/x-scalar-security-query.js +14 -7
  122. package/dist/schemas/extensions/security/x-scalar-security-secrets.js +66 -37
  123. package/dist/schemas/extensions/security/x-tokenName.js +11 -7
  124. package/dist/schemas/extensions/security/x-use-pkce.js +6 -10
  125. package/dist/schemas/extensions/server/x-scalar-selected-server.js +3 -7
  126. package/dist/schemas/extensions/tag/index.js +1 -1
  127. package/dist/schemas/extensions/tag/x-display-name.js +11 -7
  128. package/dist/schemas/extensions/tag/x-tag-groups.js +13 -15
  129. package/dist/schemas/extensions/workspace/index.js +2 -11
  130. package/dist/schemas/extensions/workspace/x-scalar-active-proxy.js +13 -7
  131. package/dist/schemas/extensions/workspace/x-scalar-tabs.js +15 -13
  132. package/dist/schemas/extensions.js +11 -15
  133. package/dist/schemas/inmemory-workspace.d.ts +6 -0
  134. package/dist/schemas/inmemory-workspace.d.ts.map +1 -1
  135. package/dist/schemas/inmemory-workspace.js +13 -21
  136. package/dist/schemas/navigation.js +48 -85
  137. package/dist/schemas/reference-config/appearance.js +15 -22
  138. package/dist/schemas/reference-config/features.js +14 -21
  139. package/dist/schemas/reference-config/index.d.ts +2 -0
  140. package/dist/schemas/reference-config/index.d.ts.map +1 -1
  141. package/dist/schemas/reference-config/index.js +42 -44
  142. package/dist/schemas/reference-config/meta.js +11 -18
  143. package/dist/schemas/reference-config/routing.js +7 -14
  144. package/dist/schemas/reference-config/settings.d.ts +2 -0
  145. package/dist/schemas/reference-config/settings.d.ts.map +1 -1
  146. package/dist/schemas/reference-config/settings.js +10 -17
  147. package/dist/schemas/typebox-coerce.js +23 -6
  148. package/dist/schemas/v3.1/strict/callback.js +6 -12
  149. package/dist/schemas/v3.1/strict/components.js +26 -48
  150. package/dist/schemas/v3.1/strict/contact.js +9 -12
  151. package/dist/schemas/v3.1/strict/discriminator.js +11 -10
  152. package/dist/schemas/v3.1/strict/encoding.js +15 -12
  153. package/dist/schemas/v3.1/strict/example.js +11 -13
  154. package/dist/schemas/v3.1/strict/external-documentation.js +7 -10
  155. package/dist/schemas/v3.1/strict/header.js +27 -28
  156. package/dist/schemas/v3.1/strict/info.js +10 -16
  157. package/dist/schemas/v3.1/strict/license.js +9 -12
  158. package/dist/schemas/v3.1/strict/link.js +22 -19
  159. package/dist/schemas/v3.1/strict/media-type.js +17 -16
  160. package/dist/schemas/v3.1/strict/oauth-flow.js +28 -62
  161. package/dist/schemas/v3.1/strict/oauthflows.js +14 -20
  162. package/dist/schemas/v3.1/strict/openapi-document.d.ts +70 -0
  163. package/dist/schemas/v3.1/strict/openapi-document.d.ts.map +1 -1
  164. package/dist/schemas/v3.1/strict/openapi-document.js +126 -210
  165. package/dist/schemas/v3.1/strict/operation.js +16 -43
  166. package/dist/schemas/v3.1/strict/parameter.d.ts +6 -0
  167. package/dist/schemas/v3.1/strict/parameter.d.ts.map +1 -1
  168. package/dist/schemas/v3.1/strict/parameter.js +29 -35
  169. package/dist/schemas/v3.1/strict/path-item.js +36 -40
  170. package/dist/schemas/v3.1/strict/paths.js +8 -11
  171. package/dist/schemas/v3.1/strict/ref-definitions.js +76 -100
  172. package/dist/schemas/v3.1/strict/reference.js +18 -21
  173. package/dist/schemas/v3.1/strict/request-body.js +8 -16
  174. package/dist/schemas/v3.1/strict/response.js +12 -16
  175. package/dist/schemas/v3.1/strict/responses.js +13 -11
  176. package/dist/schemas/v3.1/strict/schema.js +149 -157
  177. package/dist/schemas/v3.1/strict/security-requirement.js +13 -12
  178. package/dist/schemas/v3.1/strict/security-scheme.js +29 -41
  179. package/dist/schemas/v3.1/strict/server-variable.js +9 -12
  180. package/dist/schemas/v3.1/strict/server.js +10 -13
  181. package/dist/schemas/v3.1/strict/tag.js +11 -20
  182. package/dist/schemas/v3.1/strict/type-guards.js +20 -20
  183. package/dist/schemas/v3.1/strict/xml.js +17 -16
  184. package/dist/schemas/workspace-specification/index.js +11 -23
  185. package/dist/schemas/workspace-specification/info.js +4 -8
  186. package/dist/schemas/workspace.d.ts +6 -0
  187. package/dist/schemas/workspace.d.ts.map +1 -1
  188. package/dist/schemas/workspace.js +25 -51
  189. package/dist/schemas.js +2 -6
  190. package/dist/server.js +286 -176
  191. package/dist/workspace-plugin.js +1 -1
  192. package/package.json +13 -19
  193. package/dist/client.js.map +0 -7
  194. package/dist/entities/auth/index.js.map +0 -7
  195. package/dist/entities/auth/schema.js.map +0 -7
  196. package/dist/entities/history/index.js.map +0 -7
  197. package/dist/entities/history/schema.js.map +0 -7
  198. package/dist/events/bus.js.map +0 -7
  199. package/dist/events/definitions/analytics.js.map +0 -7
  200. package/dist/events/definitions/auth.js.map +0 -7
  201. package/dist/events/definitions/common.js.map +0 -7
  202. package/dist/events/definitions/cookie.js.map +0 -7
  203. package/dist/events/definitions/document.js.map +0 -7
  204. package/dist/events/definitions/environment.js.map +0 -7
  205. package/dist/events/definitions/hooks.js.map +0 -7
  206. package/dist/events/definitions/index.js.map +0 -7
  207. package/dist/events/definitions/meta.js.map +0 -7
  208. package/dist/events/definitions/operation.js.map +0 -7
  209. package/dist/events/definitions/server.js.map +0 -7
  210. package/dist/events/definitions/tabs.js.map +0 -7
  211. package/dist/events/definitions/tag.js.map +0 -7
  212. package/dist/events/definitions/ui.js.map +0 -7
  213. package/dist/events/definitions/workspace.js.map +0 -7
  214. package/dist/events/index.js.map +0 -7
  215. package/dist/events/listeners.js.map +0 -7
  216. package/dist/events/old-definitions.js.map +0 -7
  217. package/dist/helpers/apply-selective-updates.d.ts +0 -19
  218. package/dist/helpers/apply-selective-updates.d.ts.map +0 -1
  219. package/dist/helpers/apply-selective-updates.js +0 -37
  220. package/dist/helpers/apply-selective-updates.js.map +0 -7
  221. package/dist/helpers/deep-clone.js.map +0 -7
  222. package/dist/helpers/detect-changes-proxy.js.map +0 -7
  223. package/dist/helpers/general.js.map +0 -7
  224. package/dist/helpers/generate-unique-value.js.map +0 -7
  225. package/dist/helpers/get-fetch.js.map +0 -7
  226. package/dist/helpers/get-resolved-ref.js.map +0 -7
  227. package/dist/helpers/is-non-optional-security-requirement.js.map +0 -7
  228. package/dist/helpers/merge-object.js.map +0 -7
  229. package/dist/helpers/overrides-proxy.js.map +0 -7
  230. package/dist/helpers/unpack-proxy.js.map +0 -7
  231. package/dist/mutators/auth.js.map +0 -7
  232. package/dist/mutators/cookie.js.map +0 -7
  233. package/dist/mutators/document.js.map +0 -7
  234. package/dist/mutators/environment.js.map +0 -7
  235. package/dist/mutators/helpers.js.map +0 -7
  236. package/dist/mutators/index.js.map +0 -7
  237. package/dist/mutators/operation/body.js.map +0 -7
  238. package/dist/mutators/operation/extensions.js.map +0 -7
  239. package/dist/mutators/operation/helpers/fetch-request-to-har.js.map +0 -7
  240. package/dist/mutators/operation/helpers/fetch-response-to-har.js.map +0 -7
  241. package/dist/mutators/operation/helpers/get-parameter-position.js.map +0 -7
  242. package/dist/mutators/operation/helpers/har-to-operation.js.map +0 -7
  243. package/dist/mutators/operation/helpers/sync-path-parameters.js.map +0 -7
  244. package/dist/mutators/operation/history.js.map +0 -7
  245. package/dist/mutators/operation/index.js.map +0 -7
  246. package/dist/mutators/operation/operation.js.map +0 -7
  247. package/dist/mutators/operation/parameters.js.map +0 -7
  248. package/dist/mutators/server.js.map +0 -7
  249. package/dist/mutators/tabs.js.map +0 -7
  250. package/dist/mutators/tag.js.map +0 -7
  251. package/dist/mutators/workspace.js.map +0 -7
  252. package/dist/navigation/get-navigation-options.js.map +0 -7
  253. package/dist/navigation/helpers/get-openapi-object.js.map +0 -7
  254. package/dist/navigation/helpers/get-operation-entries.js.map +0 -7
  255. package/dist/navigation/helpers/get-parent-entry.js.map +0 -7
  256. package/dist/navigation/helpers/get-tag-entries.js.map +0 -7
  257. package/dist/navigation/helpers/get-tag.js.map +0 -7
  258. package/dist/navigation/helpers/get-x-keys.js.map +0 -7
  259. package/dist/navigation/helpers/traverse-description.js.map +0 -7
  260. package/dist/navigation/helpers/traverse-document.js.map +0 -7
  261. package/dist/navigation/helpers/traverse-examples.js.map +0 -7
  262. package/dist/navigation/helpers/traverse-paths.js.map +0 -7
  263. package/dist/navigation/helpers/traverse-schemas.js.map +0 -7
  264. package/dist/navigation/helpers/traverse-tags.js.map +0 -7
  265. package/dist/navigation/helpers/traverse-webhooks.js.map +0 -7
  266. package/dist/navigation/helpers/update-order-ids.js.map +0 -7
  267. package/dist/navigation/helpers/utils.js.map +0 -7
  268. package/dist/navigation/index.js.map +0 -7
  269. package/dist/navigation/types.js.map +0 -7
  270. package/dist/persistence/index.js.map +0 -7
  271. package/dist/persistence/indexdb.js.map +0 -7
  272. package/dist/plugins/bundler/helpers.js.map +0 -7
  273. package/dist/plugins/bundler/index.js.map +0 -7
  274. package/dist/plugins/client/index.js.map +0 -7
  275. package/dist/plugins/client/persistence.js.map +0 -7
  276. package/dist/resolve.js.map +0 -7
  277. package/dist/schemas/compose.js.map +0 -7
  278. package/dist/schemas/extensions/document/x-internal.js.map +0 -7
  279. package/dist/schemas/extensions/document/x-scalar-environments.js.map +0 -7
  280. package/dist/schemas/extensions/document/x-scalar-icon.js.map +0 -7
  281. package/dist/schemas/extensions/document/x-scalar-ignore.js.map +0 -7
  282. package/dist/schemas/extensions/document/x-scalar-is-dirty.js.map +0 -7
  283. package/dist/schemas/extensions/document/x-scalar-original-document-hash.js.map +0 -7
  284. package/dist/schemas/extensions/document/x-scalar-registry-meta.js.map +0 -7
  285. package/dist/schemas/extensions/document/x-scalar-sdk-installation.js.map +0 -7
  286. package/dist/schemas/extensions/document/x-scalar-watch-mode.js.map +0 -7
  287. package/dist/schemas/extensions/document/x-tags.js.map +0 -7
  288. package/dist/schemas/extensions/example/x-disabled.js.map +0 -7
  289. package/dist/schemas/extensions/general/x-scalar-active-environment.js.map +0 -7
  290. package/dist/schemas/extensions/general/x-scalar-cookies.js.map +0 -7
  291. package/dist/schemas/extensions/general/x-scalar-order.js.map +0 -7
  292. package/dist/schemas/extensions/operation/index.js.map +0 -7
  293. package/dist/schemas/extensions/operation/x-badge.js.map +0 -7
  294. package/dist/schemas/extensions/operation/x-code-samples.js.map +0 -7
  295. package/dist/schemas/extensions/operation/x-draft-examples.js.map +0 -7
  296. package/dist/schemas/extensions/operation/x-post-response.js.map +0 -7
  297. package/dist/schemas/extensions/operation/x-scalar-disable-parameters.js.map +0 -7
  298. package/dist/schemas/extensions/operation/x-scalar-selected-content-type.js.map +0 -7
  299. package/dist/schemas/extensions/operation/x-scalar-stability.js.map +0 -7
  300. package/dist/schemas/extensions/parameter/x-global.js.map +0 -7
  301. package/dist/schemas/extensions/schema/x-additional-properties-name.js.map +0 -7
  302. package/dist/schemas/extensions/schema/x-enum-descriptions.js.map +0 -7
  303. package/dist/schemas/extensions/schema/x-enum-varnames.js.map +0 -7
  304. package/dist/schemas/extensions/schema/x-examples.js.map +0 -7
  305. package/dist/schemas/extensions/schema/x-variable.js.map +0 -7
  306. package/dist/schemas/extensions/security/index.js.map +0 -7
  307. package/dist/schemas/extensions/security/x-default-scopes.js.map +0 -7
  308. package/dist/schemas/extensions/security/x-scalar-credentials-location.js.map +0 -7
  309. package/dist/schemas/extensions/security/x-scalar-security-body.js.map +0 -7
  310. package/dist/schemas/extensions/security/x-scalar-security-query.js.map +0 -7
  311. package/dist/schemas/extensions/security/x-scalar-security-secrets.js.map +0 -7
  312. package/dist/schemas/extensions/security/x-tokenName.js.map +0 -7
  313. package/dist/schemas/extensions/security/x-use-pkce.js.map +0 -7
  314. package/dist/schemas/extensions/server/x-scalar-selected-server.js.map +0 -7
  315. package/dist/schemas/extensions/tag/index.js.map +0 -7
  316. package/dist/schemas/extensions/tag/x-display-name.js.map +0 -7
  317. package/dist/schemas/extensions/tag/x-tag-groups.js.map +0 -7
  318. package/dist/schemas/extensions/workspace/index.js.map +0 -7
  319. package/dist/schemas/extensions/workspace/x-scalar-active-proxy.js.map +0 -7
  320. package/dist/schemas/extensions/workspace/x-scalar-tabs.js.map +0 -7
  321. package/dist/schemas/extensions.js.map +0 -7
  322. package/dist/schemas/inmemory-workspace.js.map +0 -7
  323. package/dist/schemas/navigation.js.map +0 -7
  324. package/dist/schemas/reference-config/appearance.js.map +0 -7
  325. package/dist/schemas/reference-config/features.js.map +0 -7
  326. package/dist/schemas/reference-config/index.js.map +0 -7
  327. package/dist/schemas/reference-config/meta.js.map +0 -7
  328. package/dist/schemas/reference-config/routing.js.map +0 -7
  329. package/dist/schemas/reference-config/settings.js.map +0 -7
  330. package/dist/schemas/typebox-coerce.js.map +0 -7
  331. package/dist/schemas/v3.1/strict/callback.js.map +0 -7
  332. package/dist/schemas/v3.1/strict/components.js.map +0 -7
  333. package/dist/schemas/v3.1/strict/contact.js.map +0 -7
  334. package/dist/schemas/v3.1/strict/discriminator.js.map +0 -7
  335. package/dist/schemas/v3.1/strict/encoding.js.map +0 -7
  336. package/dist/schemas/v3.1/strict/example.js.map +0 -7
  337. package/dist/schemas/v3.1/strict/external-documentation.js.map +0 -7
  338. package/dist/schemas/v3.1/strict/header.js.map +0 -7
  339. package/dist/schemas/v3.1/strict/info.js.map +0 -7
  340. package/dist/schemas/v3.1/strict/license.js.map +0 -7
  341. package/dist/schemas/v3.1/strict/link.js.map +0 -7
  342. package/dist/schemas/v3.1/strict/media-type.js.map +0 -7
  343. package/dist/schemas/v3.1/strict/oauth-flow.js.map +0 -7
  344. package/dist/schemas/v3.1/strict/oauthflows.js.map +0 -7
  345. package/dist/schemas/v3.1/strict/openapi-document.js.map +0 -7
  346. package/dist/schemas/v3.1/strict/operation.js.map +0 -7
  347. package/dist/schemas/v3.1/strict/parameter.js.map +0 -7
  348. package/dist/schemas/v3.1/strict/path-item.js.map +0 -7
  349. package/dist/schemas/v3.1/strict/paths.js.map +0 -7
  350. package/dist/schemas/v3.1/strict/ref-definitions.js.map +0 -7
  351. package/dist/schemas/v3.1/strict/reference.js.map +0 -7
  352. package/dist/schemas/v3.1/strict/request-body.js.map +0 -7
  353. package/dist/schemas/v3.1/strict/response.js.map +0 -7
  354. package/dist/schemas/v3.1/strict/responses.js.map +0 -7
  355. package/dist/schemas/v3.1/strict/schema.js.map +0 -7
  356. package/dist/schemas/v3.1/strict/security-requirement.js.map +0 -7
  357. package/dist/schemas/v3.1/strict/security-scheme.js.map +0 -7
  358. package/dist/schemas/v3.1/strict/server-variable.js.map +0 -7
  359. package/dist/schemas/v3.1/strict/server.js.map +0 -7
  360. package/dist/schemas/v3.1/strict/tag.js.map +0 -7
  361. package/dist/schemas/v3.1/strict/type-guards.js.map +0 -7
  362. package/dist/schemas/v3.1/strict/xml.js.map +0 -7
  363. package/dist/schemas/workspace-specification/index.js.map +0 -7
  364. package/dist/schemas/workspace-specification/info.js.map +0 -7
  365. package/dist/schemas/workspace.js.map +0 -7
  366. package/dist/schemas.js.map +0 -7
  367. package/dist/server.js.map +0 -7
  368. package/dist/workspace-plugin.js.map +0 -7
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/mutators/operation/parameters.ts"],
4
- "sourcesContent": ["import type { OperationEvents } from '@/events/definitions/operation'\nimport { getResolvedRef } from '@/helpers/get-resolved-ref'\nimport { unpackProxyObject } from '@/helpers/unpack-proxy'\nimport type { WorkspaceDocument } from '@/schemas'\nimport type { DisableParametersConfig } from '@/schemas/extensions/operation/x-scalar-disable-parameters'\nimport type { ExampleObject } from '@/schemas/v3.1/strict/example'\nimport type { ReferenceType } from '@/schemas/v3.1/strict/reference'\n\n/**\n * Updates an existing parameter of a given `type` by its index within that\n * type subset (e.g. the N-th query parameter). Supports updating name, value,\n * and enabled state for the targeted example.\n * Safely no-ops if the document, operation, or parameter does not exist.\n *\n * Example:\n * ```ts\n * updateOperationParameter({\n * document,\n * type: 'query',\n * index: 0,\n * meta: { method: 'get', path: '/search', exampleKey: 'default' },\n * payload: { value: 'alice', isDisabled: false },\n * })\n * ```\n */\nexport const upsertOperationParameter = (\n document: WorkspaceDocument | null,\n { meta, type, payload, originalParameter }: OperationEvents['operation:upsert:parameter'],\n) => {\n // We are editing an existing parameter\n if (originalParameter) {\n // To support content-type parameters in the API client, we just assume an\n // examples property can be set.\n const param = originalParameter as typeof originalParameter & {\n examples: Record<string, ReferenceType<ExampleObject>>\n }\n param.name = payload.name\n if (!param.examples) {\n param.examples = {}\n }\n\n // Create the example if it doesn't exist\n if (!param.examples[meta.exampleKey]) {\n param.examples[meta.exampleKey] = {}\n }\n const example = getResolvedRef(param.examples[meta.exampleKey])!\n\n // Update the example value and disabled state\n example.value = payload.value\n example['x-disabled'] = payload.isDisabled\n return\n }\n\n // We are adding a new parameter\n const operation = getResolvedRef(document?.paths?.[meta.path]?.[meta.method])\n if (!operation) {\n console.error('Operation not found', { meta, document })\n return\n }\n\n operation.parameters ||= []\n operation.parameters.push({\n name: payload.name,\n in: type,\n required: type === 'path' ? true : false,\n examples: {\n [meta.exampleKey]: {\n value: payload.value,\n // We always want a new parameter to be enabled by default\n 'x-disabled': false,\n },\n },\n })\n return\n}\n\n/**\n * Updates the disabled state of a default parameter for an operation.\n * Default parameters are inherited from higher-level configurations (like collection or server defaults)\n * and this allows individual operations to selectively disable them without removing them entirely.\n *\n * The disabled state is stored in the `x-scalar-disable-parameters` extension object, organized by\n * parameter type and example key. Missing objects are initialized automatically.\n *\n * @param document - The current workspace document\n * @param type - The parameter type (e.g., 'header'). Determines the storage key ('default-headers' for headers)\n * @param meta.path - Path of the operation (e.g., '/users')\n * @param meta.method - HTTP method of the operation (e.g., 'get')\n * @param meta.exampleKey - Key identifying the relevant example\n * @param meta.key - The specific parameter key being updated\n * @param payload.isDisabled - Whether the parameter should be disabled\n */\nexport const updateOperationExtraParameters = (\n document: WorkspaceDocument | null,\n { type, meta, payload, in: location }: OperationEvents['operation:update:extra-parameters'],\n) => {\n type Type = OperationEvents['operation:update:extra-parameters']['type']\n type In = OperationEvents['operation:update:extra-parameters']['in']\n\n // Ensure there's a valid document\n if (!document) {\n return\n }\n\n // Resolve the referenced operation from the document using the path and method\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n if (!operation) {\n return\n }\n\n // Initialize the 'x-scalar-disable-parameters' object if it doesn't exist\n if (!operation['x-scalar-disable-parameters']) {\n operation['x-scalar-disable-parameters'] = {}\n }\n\n /**\n * Maps parameter type and location to the corresponding config key.\n * Only valid combinations are defined here.\n */\n const mapping: Partial<Record<Type, Partial<Record<In, keyof DisableParametersConfig>>>> = {\n global: { cookie: 'global-cookies' },\n default: { header: 'default-headers' },\n }\n\n const key = mapping[type]?.[location]\n\n if (!key) {\n return\n }\n\n // Initialize the 'default-headers' object within 'x-scalar-disable-parameters' if it doesn't exist\n if (!operation['x-scalar-disable-parameters'][key]) {\n operation['x-scalar-disable-parameters'][key] = {}\n }\n\n // Update (or create) the entry for the specific example and key, preserving any existing settings\n operation['x-scalar-disable-parameters'][key][meta.exampleKey] = {\n ...(operation['x-scalar-disable-parameters'][key][meta.exampleKey] ?? {}),\n [meta.name]: payload.isDisabled ?? false,\n }\n}\n\n/**\n * Removes a parameter from the operation OR path\n *\n * Example:\n * ```ts\n * deleteOperationParameter({\n * document,\n * originalParameter,\n * meta: { method: 'get', path: '/users', exampleKey: 'default' },\n * })\n * ```\n */\nexport const deleteOperationParameter = (\n document: WorkspaceDocument | null,\n { meta, originalParameter }: OperationEvents['operation:delete:parameter'],\n) => {\n const operation = getResolvedRef(document?.paths?.[meta.path]?.[meta.method])\n\n // Lets check if its on the operation first as its more likely\n const operationIndex = operation?.parameters?.findIndex((it) => getResolvedRef(it) === originalParameter) ?? -1\n\n // We cannot call splice on a proxy object, so we unwrap the array and filter it\n if (operation && operationIndex >= 0) {\n operation.parameters = unpackProxyObject(\n operation.parameters?.filter((_, i) => i !== operationIndex),\n { depth: 1 },\n )\n return\n }\n\n // If it wasn't on the operation it might be on the path\n const path = getResolvedRef(document?.paths?.[meta.path])\n const pathIndex = path?.parameters?.findIndex((it) => getResolvedRef(it) === originalParameter) ?? -1\n\n if (path && pathIndex >= 0) {\n path.parameters = unpackProxyObject(\n path.parameters?.filter((_, i) => i !== pathIndex),\n { depth: 1 },\n )\n }\n}\n\n/**\n * Deletes all parameters of a given `type` from the operation.\n * Safely no-ops if the document or operation does not exist.\n *\n * Example:\n * ```ts\n * deleteAllOperationParameters({\n * document,\n * type: 'cookie',\n * meta: { method: 'get', path: '/users' },\n * })\n * ```\n */\nexport const deleteAllOperationParameters = (\n document: WorkspaceDocument | null,\n { meta, type }: OperationEvents['operation:delete-all:parameters'],\n) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n if (!operation) {\n return\n }\n\n // Filter out parameters of the specified type\n operation.parameters = operation.parameters?.filter((it) => getResolvedRef(it).in !== type) ?? []\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/mutators/server.ts"],
4
- "sourcesContent": ["import { findVariables } from '@scalar/helpers/regex/find-variables'\n\nimport type { ServerEvents, ServerMeta } from '@/events/definitions/server'\nimport { getResolvedRef } from '@/helpers/get-resolved-ref'\nimport { unpackProxyObject } from '@/helpers/unpack-proxy'\nimport { coerceValue } from '@/schemas/typebox-coerce'\nimport { type ServerObject, ServerObjectSchema } from '@/schemas/v3.1/strict/openapi-document'\nimport type { WorkspaceDocument } from '@/schemas/workspace'\n\n/**\n * Target for server mutators: has a servers array and optional selected-server storage.\n * Document and (resolved) operation both have this shape.\n */\ntype ServerTarget = {\n servers?: ServerObject[]\n 'x-scalar-selected-server'?: string\n}\n\n/**\n * Resolves the server target (document or operation) from meta.\n * Document-level servers live on the document; operation-level servers on the operation object.\n */\nconst getServerTarget = (document: WorkspaceDocument | null, meta: ServerMeta): ServerTarget | null => {\n if (!document) {\n return null\n }\n if (meta.type === 'document') {\n return document\n }\n return getResolvedRef(document.paths?.[meta.path]?.[meta.method]) ?? null\n}\n\n/**\n * Initializes the servers for the document or operation based on meta.\n *\n * @param document - The document to initialize the servers for\n * @param meta - Target context (document or operation)\n */\nexport const initializeServers = (\n document: WorkspaceDocument | null,\n { meta }: ServerEvents['server:initialize:servers'],\n) => {\n const target = getServerTarget(document, meta)\n\n if (!target) {\n console.error('Target not found', meta)\n return undefined\n }\n target.servers = []\n return target.servers\n}\n\n/**\n * Adds a new ServerObject to the document or operation based on meta.\n *\n * @param document - The document to add the server to\n * @returns the new server object or undefined if the target is not found\n */\nexport const addServer = (\n document: WorkspaceDocument | null,\n { meta }: ServerEvents['server:add:server'],\n): ServerObject | undefined => {\n const target = getServerTarget(document, meta)\n if (!target) {\n console.error('Target not found', meta)\n return undefined\n }\n\n const parsed = coerceValue(ServerObjectSchema, {})\n\n if (!target.servers) {\n target.servers = []\n }\n target.servers.push(parsed)\n return parsed\n}\n\n/**\n * Creates a map of variable names to their character positions in a URL.\n * Used to detect renamed variables by position matching.\n */\nconst getVariablePositions = (url: string, variables: readonly string[]): Record<string, number> => {\n const positions: Record<string, number> = {}\n\n for (const varName of variables) {\n const position = url.indexOf(`{${varName}}`)\n if (position !== -1) {\n positions[varName] = position\n }\n }\n\n return positions\n}\n\ntype VariableConfig = {\n description?: string\n default?: string\n enum?: string[]\n}\n\n/**\n * Syncs server variables when the URL changes.\n *\n * Preserves variable configurations by:\n * 1. Keeping variables with matching names\n * 2. Renaming variables at the same position\n * 3. Creating new variables with empty defaults\n */\nconst syncVariablesForUrlChange = (\n newUrl: string,\n oldUrl: string,\n existingVariables: Record<string, VariableConfig>,\n): Record<string, VariableConfig> => {\n // Filter out undefined values from findVariables results\n const oldVariables = findVariables(oldUrl, { includePath: true, includeEnv: false }).filter(\n (v): v is string => v !== undefined,\n )\n const newVariables = findVariables(newUrl, { includePath: true, includeEnv: false }).filter(\n (v): v is string => v !== undefined,\n )\n\n const oldPositions = getVariablePositions(oldUrl, oldVariables)\n const newPositions = getVariablePositions(newUrl, newVariables)\n\n const usedOldVariables = new Set<string>()\n const syncedVariables: Record<string, VariableConfig> = {}\n\n for (const newVar of newVariables) {\n // Case 1: Variable with same name exists - preserve its config\n if (existingVariables[newVar]) {\n syncedVariables[newVar] = existingVariables[newVar]\n usedOldVariables.add(newVar)\n continue\n }\n\n // Case 2: Check for variable at same position (likely a rename)\n const newVarPosition = newPositions[newVar]\n const oldVarAtPosition = oldVariables.find(\n (oldVar) => oldPositions[oldVar] === newVarPosition && !usedOldVariables.has(oldVar),\n )\n\n if (oldVarAtPosition && existingVariables[oldVarAtPosition]) {\n // Rename: transfer the old variable's config to the new name\n syncedVariables[newVar] = existingVariables[oldVarAtPosition]\n usedOldVariables.add(oldVarAtPosition)\n continue\n }\n\n // Case 3: New variable - create with empty default\n syncedVariables[newVar] = { default: '' }\n }\n\n return syncedVariables\n}\n\n/**\n * Updates a ServerObject in the document or operation based on meta.\n * When the URL changes, intelligently syncs variables by preserving configurations\n * for renamed variables (detected by position) and existing variables.\n *\n * @param document - The document containing the server to update\n * @param index - The index of the server to update\n * @param server - The partial server object with fields to update\n * @param meta - Target context (document or operation)\n * @returns the updated server object or undefined if the server is not found\n */\nexport const updateServer = (\n document: WorkspaceDocument | null,\n { index, server, meta }: ServerEvents['server:update:server'],\n): ServerObject | undefined => {\n const target = getServerTarget(document, meta)\n if (!target) {\n return undefined\n }\n\n const oldServer = unpackProxyObject(target.servers?.[index], { depth: 1 })\n if (!oldServer) {\n console.error('Server not found at index:', index)\n return undefined\n }\n\n const oldUrl = oldServer.url\n const updatedServer = coerceValue(ServerObjectSchema, { ...oldServer, ...server })\n\n const hasUrlChanged = oldUrl && oldUrl !== updatedServer.url\n if (hasUrlChanged) {\n const existingVariables = updatedServer.variables ?? {}\n updatedServer.variables = syncVariablesForUrlChange(updatedServer.url, oldUrl, existingVariables)\n\n if (target['x-scalar-selected-server'] === oldUrl) {\n target['x-scalar-selected-server'] = updatedServer.url\n }\n }\n\n if (!target.servers) {\n target.servers = [updatedServer]\n } else {\n target.servers[index] = updatedServer\n }\n\n return updatedServer\n}\n\n/**\n * Deletes a ServerObject at the specified index from the document or operation based on meta.\n *\n * @param document - The document to delete the server from\n * @param index - The index of the server to delete\n * @param meta - Target context (document or operation)\n */\nexport const deleteServer = (\n document: WorkspaceDocument | null,\n { index, meta }: ServerEvents['server:delete:server'],\n) => {\n const target = getServerTarget(document, meta)\n if (!target?.servers) {\n return\n }\n\n const url = target.servers[index]?.url\n target.servers.splice(index, 1)\n\n if (target['x-scalar-selected-server'] === url) {\n target['x-scalar-selected-server'] = target.servers[0]?.url ?? undefined\n }\n}\n\n/**\n * Clears all servers from the document or operation based on meta.\n *\n * @param document - The document to clear the servers from\n * @param meta - Target context (document or operation)\n */\nexport const clearServers = (document: WorkspaceDocument | null, { meta }: ServerEvents['server:clear:servers']) => {\n const target = getServerTarget(document, meta)\n if (!target) {\n return\n }\n // Remove the servers array\n target.servers = undefined\n // Clear the selected server\n target['x-scalar-selected-server'] = undefined\n}\n\n/**\n * Updates a server variable for the document or operation based on meta.\n *\n * @param document - The document to update the server variables in\n * @param index - The index of the server to update\n * @param key - The key of the variable to update\n * @param value - The new value of the variable\n * @param meta - Target context (document or operation)\n * @returns the updated variable or undefined if the variable is not found\n */\nexport const updateServerVariables = (\n document: WorkspaceDocument | null,\n { index, key, value, meta }: ServerEvents['server:update:variables'],\n) => {\n const target = getServerTarget(document, meta)\n const variable = target?.servers?.[index]?.variables?.[key]\n if (!variable) {\n console.error('Variable not found', key, index)\n return\n }\n\n variable.default = value\n return variable\n}\n\n/**\n * Updates the selected server for the document or operation based on meta.\n *\n * @param document - The document to update the selected server in\n * @param url - The URL of the server to select (or '' to clear)\n * @param meta - Target context (document or operation)\n * @returns the url of the selected server or undefined if the target is not found\n */\nexport const updateSelectedServer = (\n document: WorkspaceDocument | null,\n { url, meta }: ServerEvents['server:update:selected'],\n): string | undefined => {\n const target = getServerTarget(document, meta)\n if (!target) {\n return\n }\n\n if (url === '') {\n target['x-scalar-selected-server'] = ''\n return ''\n }\n\n target['x-scalar-selected-server'] = target['x-scalar-selected-server'] === url ? '' : url\n return target['x-scalar-selected-server']\n}\n\nexport const serverMutatorsFactory = ({ document }: { document: WorkspaceDocument | null }) => {\n return {\n initializeServers: (payload: ServerEvents['server:initialize:servers']) => initializeServers(document, payload),\n addServer: (payload: ServerEvents['server:add:server']) => addServer(document, payload),\n updateServer: (payload: ServerEvents['server:update:server']) => updateServer(document, payload),\n deleteServer: (payload: ServerEvents['server:delete:server']) => deleteServer(document, payload),\n clearServers: (payload: ServerEvents['server:clear:servers']) => clearServers(document, payload),\n updateServerVariables: (payload: ServerEvents['server:update:variables']) =>\n updateServerVariables(document, payload),\n updateSelectedServer: (payload: ServerEvents['server:update:selected']) => updateSelectedServer(document, payload),\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/mutators/tabs.ts"],
4
- "sourcesContent": ["import type { TabEvents } from '@/events/definitions/tabs'\nimport { unpackProxyObject } from '@/helpers/unpack-proxy'\nimport type { Workspace } from '@/schemas'\n\n/**\n * Depth level for unpacking tab proxy objects.\n * We only need shallow unpacking since tabs are a flat array.\n */\nconst TAB_UNPACK_DEPTH = 1\n\n/**\n * Helper to validate that workspace has tabs configured.\n * Returns false if workspace or tabs are not available.\n */\nconst hasValidTabs = (\n workspace: Workspace | null,\n): workspace is Workspace & { 'x-scalar-tabs': NonNullable<Workspace['x-scalar-tabs']> } => {\n return workspace !== null && workspace['x-scalar-tabs'] !== undefined\n}\n\n/**\n * Helper to get the unpacked tabs array from workspace.\n * Returns the tabs as a plain array, not a proxy.\n */\nconst getUnpackedTabs = (\n workspace: Workspace & { 'x-scalar-tabs': NonNullable<Workspace['x-scalar-tabs']> },\n): ReturnType<typeof unpackProxyObject<NonNullable<Workspace['x-scalar-tabs']>>> => {\n return unpackProxyObject(workspace['x-scalar-tabs']!, { depth: TAB_UNPACK_DEPTH })\n}\n\n/**\n * Helper to get the current active tab index.\n * Defaults to 0 if not set.\n */\nconst getActiveIndex = (workspace: Workspace): number => {\n return workspace['x-scalar-active-tab'] ?? 0\n}\n\n/**\n * Updates the tabs and active tab index in the workspace.\n * This is used for bulk updates when synchronizing state.\n */\nexport const updateTabs = (workspace: Workspace | null, payload: TabEvents['tabs:update:tabs']): void => {\n if (!workspace) {\n return\n }\n\n if (payload['x-scalar-tabs']) {\n workspace['x-scalar-tabs'] = payload['x-scalar-tabs']\n }\n\n if (payload['x-scalar-active-tab'] !== undefined) {\n workspace['x-scalar-active-tab'] = payload['x-scalar-active-tab']\n }\n}\n\n/**\n * Adds a new tab by duplicating the currently active tab.\n * This preserves the user's context when opening a new tab.\n */\nexport const addTab = (workspace: Workspace | null, _payload: TabEvents['tabs:add:tab']): boolean => {\n if (!hasValidTabs(workspace)) {\n return false\n }\n\n const tabs = getUnpackedTabs(workspace)\n const activeIndex = getActiveIndex(workspace)\n const currentTab = tabs[activeIndex]\n\n if (!currentTab) {\n return false\n }\n\n const newTabs = [...tabs, { ...currentTab }]\n\n workspace['x-scalar-tabs'] = newTabs\n workspace['x-scalar-active-tab'] = newTabs.length - 1\n return true\n}\n\n/**\n * Closes the currently active tab.\n * Prevents closing if only one tab remains, to ensure the user always has a tab open.\n * Adjusts the active index if needed to keep it in bounds.\n */\nexport const closeTab = (workspace: Workspace | null, payload: TabEvents['tabs:close:tab']): boolean => {\n const getInputIndex = (): number => {\n if ('event' in payload) {\n return payload.event.code.startsWith('Digit') ? Number.parseInt(payload.event.key, 10) - 1 : Number.NaN\n }\n return payload.index\n }\n\n if (!hasValidTabs(workspace)) {\n return false\n }\n\n const index = getInputIndex()\n const activeIndex = getActiveIndex(workspace)\n const filteredTabs = getUnpackedTabs(workspace).filter((_, i) => i !== index)\n\n if (filteredTabs.length <= 0) {\n return false\n }\n\n workspace['x-scalar-tabs'] = filteredTabs\n\n /**\n * Adjust active index so it stays in bounds and points to the same logical tab when possible.\n * - Closing a tab before the active: decrement so we stay on the same tab (now at index - 1).\n * - Closing the active tab or one after: clamp to the new length so we never go out of bounds.\n */\n const newActiveIndex = index < activeIndex ? activeIndex - 1 : Math.min(activeIndex, filteredTabs.length - 1)\n workspace['x-scalar-active-tab'] = newActiveIndex\n\n return true\n}\n\n/**\n * Closes all other tabs except the one at the given index\n */\nexport const closeOtherTabs = (workspace: Workspace | null, payload: TabEvents['tabs:close:other-tabs']): boolean => {\n if (!hasValidTabs(workspace)) {\n return false\n }\n\n const tabs = getUnpackedTabs(workspace)\n\n if (tabs.length <= 1) {\n return false\n }\n\n workspace['x-scalar-tabs'] = tabs.filter((_, index) => index === payload.index)\n // set the active tab to the first tab since we closed all other tabs\n workspace['x-scalar-active-tab'] = 0\n return true\n}\n\n/**\n * Navigates to the previous tab in the list.\n * Does nothing if already at the first tab.\n */\nexport const navigatePreviousTab = (\n workspace: Workspace | null,\n _payload: TabEvents['tabs:navigate:previous'],\n): boolean => {\n if (!hasValidTabs(workspace)) {\n return false\n }\n\n const activeIndex = getActiveIndex(workspace)\n\n if (activeIndex <= 0) {\n return false\n }\n\n workspace['x-scalar-active-tab'] = activeIndex - 1\n return true\n}\n\n/**\n * Navigates to the next tab in the list.\n * Does nothing if already at the last tab.\n */\nexport const navigateNextTab = (workspace: Workspace | null, _payload: TabEvents['tabs:navigate:next']): boolean => {\n if (!hasValidTabs(workspace)) {\n return false\n }\n\n const tabs = getUnpackedTabs(workspace)\n const activeIndex = getActiveIndex(workspace)\n\n if (activeIndex >= tabs.length - 1) {\n return false\n }\n\n workspace['x-scalar-active-tab'] = activeIndex + 1\n return true\n}\n\n/**\n * Focuses a specific tab based on keyboard number input (1-9).\n * Extracts the digit from the keyboard event and focuses that tab.\n * Tab numbering starts at 1 for user convenience but uses 0-based indexing internally.\n */\nexport const focusTab = (workspace: Workspace | null, payload: TabEvents['tabs:focus:tab']): boolean => {\n if (!hasValidTabs(workspace)) {\n return false\n }\n\n const getInputIndex = (): number => {\n if ('event' in payload) {\n return payload.event.code.startsWith('Digit') ? Number.parseInt(payload.event.key, 10) - 1 : Number.NaN\n }\n return payload.index\n }\n\n const tabs = getUnpackedTabs(workspace)\n\n const newActiveIndex = getInputIndex()\n\n if (Number.isNaN(newActiveIndex) || newActiveIndex < 0 || newActiveIndex >= tabs.length) {\n return false\n }\n\n workspace['x-scalar-active-tab'] = newActiveIndex\n return true\n}\n\n/**\n * Focuses the last tab in the list.\n * This provides a quick way to jump to the end, regardless of how many tabs exist.\n */\nexport const focusLastTab = (workspace: Workspace | null, _payload: TabEvents['tabs:focus:tab-last']): boolean => {\n if (!hasValidTabs(workspace)) {\n return false\n }\n\n const tabs = getUnpackedTabs(workspace)\n\n if (tabs.length <= 1) {\n return false\n }\n\n workspace['x-scalar-active-tab'] = tabs.length - 1\n return true\n}\n\nexport const tabsMutatorsFactory = ({ workspace }: { workspace: Workspace | null }) => {\n return {\n updateTabs: (payload: TabEvents['tabs:update:tabs']) => updateTabs(workspace, payload),\n addTab: (payload: TabEvents['tabs:add:tab']) => addTab(workspace, payload),\n closeTab: (payload: TabEvents['tabs:close:tab']) => closeTab(workspace, payload),\n closeOtherTabs: (payload: TabEvents['tabs:close:other-tabs']) => closeOtherTabs(workspace, payload),\n navigatePreviousTab: (payload: TabEvents['tabs:navigate:previous']) => navigatePreviousTab(workspace, payload),\n navigateNextTab: (payload: TabEvents['tabs:navigate:next']) => navigateNextTab(workspace, payload),\n focusTab: (payload: TabEvents['tabs:focus:tab']) => focusTab(workspace, payload),\n focusLastTab: (payload: TabEvents['tabs:focus:tab-last']) => focusLastTab(workspace, payload),\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/mutators/tag.ts"],
4
- "sourcesContent": ["import type { WorkspaceStore } from '@/client'\nimport type { TagEvents } from '@/events/definitions/tag'\nimport { getResolvedRef } from '@/helpers/get-resolved-ref'\nimport { unpackProxyObject } from '@/helpers/unpack-proxy'\nimport { getNavigationOptions } from '@/navigation/get-navigation-options'\nimport { getTagEntries } from '@/navigation/helpers/get-tag-entries'\nimport { updateOrderIds } from '@/navigation/helpers/update-order-ids'\n\n/**\n * Adds a new tag to the WorkspaceDocument's `tags` array.\n *\n * If the document or its tags property does not exist, the function safely no-ops or initializes `tags` as needed.\n *\n * @param document - The target WorkspaceDocument\n * @param payload - The name of the tag to add\n */\nexport const createTag = (store: WorkspaceStore | null, payload: TagEvents['tag:create:tag']) => {\n const document = store?.workspace.documents[payload.documentName]\n\n if (!document) {\n console.error('Document not found', { payload, store })\n return\n }\n\n if (!document.tags) {\n document.tags = []\n }\n\n document.tags.push({\n name: payload.name,\n })\n}\n\n/**\n * Edits a tag in the WorkspaceDocument's\n *\n * @param document - The target WorkspaceDocument\n * @param payload - holds the old tag and the new name\n */\nexport const editTag = (store: WorkspaceStore | null, payload: TagEvents['tag:edit:tag']) => {\n const document = store?.workspace.documents[payload.documentName]\n const documentNavigation = document?.['x-scalar-navigation']\n if (!document || !documentNavigation) {\n console.error('Document not found', { payload, store })\n return\n }\n\n const oldName = payload.tag.name\n const newName = payload.newName\n\n if (document.tags?.length) {\n // const plainTags = unpackProxyObject(document.tags, { depth: null })\n document.tags = document.tags.map((_tag) => {\n const tag = unpackProxyObject(_tag)\n return tag.name === oldName ? { ...tag, name: newName } : tag\n })\n }\n\n // Update the tag name in all child operations and webhooks\n payload.tag.children?.forEach((child) => {\n // Operation\n if (child.type === 'operation') {\n const operation = getResolvedRef(document.paths?.[child.path]?.[child.method])\n\n if (operation && 'tags' in operation) {\n const plainTags = unpackProxyObject(operation.tags, { depth: null })\n operation.tags = plainTags?.map((tag) => (tag === oldName ? newName : tag))\n }\n }\n\n // Webhook\n else if (child.type === 'webhook') {\n const webhook = getResolvedRef(document.webhooks?.[child.name]?.[child.method])\n\n if (webhook && 'tags' in webhook) {\n const plainTags = unpackProxyObject(webhook.tags, { depth: null })\n webhook.tags = plainTags?.map((tag) => (tag === oldName ? newName : tag))\n }\n }\n })\n\n // Update x-tagGroups references to the renamed tag\n if (document['x-tagGroups']) {\n const plainGroups = unpackProxyObject(document['x-tagGroups'], { depth: null })\n document['x-tagGroups'] = plainGroups.map((group) => ({\n ...group,\n tags: group.tags.map((tag) => (tag === oldName ? newName : tag)),\n }))\n }\n\n /**\n * We don't pass navigation options as we don't have config on the client,\n * and we don't change path or method on the references\n */\n const { generateId } = getNavigationOptions(documentNavigation.name)\n\n /** Grabs all sidebar entries for the tag that is being renamed */\n const tagEntriesMap = getTagEntries(documentNavigation)\n const entries = tagEntriesMap.get(oldName)\n\n // Updates the order ID so we don't lose the sidebar ordering when it rebuilds.\n if (entries) {\n updateOrderIds({ store, tag: { name: newName }, generateId, entries })\n }\n}\n\n/**\n * Deletes a tag from the workspace\n *\n * Example:\n * ```ts\n * deleteTag({\n * document,\n * name: 'tag',\n * })\n * ```\n */\nexport const deleteTag = (workspace: WorkspaceStore | null, payload: TagEvents['tag:delete:tag']) => {\n const document = workspace?.workspace.documents[payload.documentName]\n if (!document) {\n return\n }\n\n // Clear tags from all operations that have this tag\n Object.values(document.paths ?? {}).forEach((path) => {\n Object.values(path).forEach((operation) => {\n // Only process operations that are objects\n if (typeof operation !== 'object' || Array.isArray(operation)) {\n return\n }\n\n const resolvedOperation = getResolvedRef(operation)\n\n if ('tags' in resolvedOperation) {\n const plainTags = unpackProxyObject(resolvedOperation.tags, { depth: 1 })\n resolvedOperation.tags = plainTags?.filter((tag) => tag !== payload.name)\n }\n })\n })\n\n // Remove the tag from all webhooks that have this tag\n Object.values(document.webhooks ?? {}).forEach((webhook) => {\n Object.values(webhook).forEach((operation) => {\n if (typeof operation !== 'object' || Array.isArray(operation)) {\n return\n }\n\n const resolvedOperation = getResolvedRef(operation)\n\n const plainTags = unpackProxyObject(resolvedOperation.tags, { depth: 1 })\n resolvedOperation.tags = plainTags?.filter((tag) => tag !== payload.name)\n })\n })\n\n // Remove the tag from the document tags array\n const plainDocTags = unpackProxyObject(document.tags, { depth: null })\n document.tags = plainDocTags?.filter((tag) => tag.name !== payload.name)\n}\n\nexport const tagMutatorsFactory = ({ store }: { store: WorkspaceStore | null }) => {\n return {\n createTag: (payload: TagEvents['tag:create:tag']) => createTag(store, payload),\n editTag: (payload: TagEvents['tag:edit:tag']) => editTag(store, payload),\n deleteTag: (payload: TagEvents['tag:delete:tag']) => deleteTag(store, payload),\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/mutators/workspace.ts"],
4
- "sourcesContent": ["import type { WorkspaceEvents } from '@/events/definitions/workspace'\nimport type { Workspace } from '@/schemas'\n\n/**\n * Updates the active proxy for the given workspace.\n *\n * @param workspace - The workspace to update\n * @param payload - The new active proxy value\n */\nexport const updateActiveProxy = (\n workspace: Workspace | null,\n payload: WorkspaceEvents['workspace:update:active-proxy'],\n) => {\n // If workspace is null, exit early\n if (!workspace) {\n return\n }\n // Set or clear the active proxy in the workspace object\n workspace['x-scalar-active-proxy'] = payload\n}\n\n/**\n * Updates the color mode for the given workspace.\n *\n * @param workspace - The workspace to update\n * @param payload - The new color mode value\n */\nexport const updateColorMode = (\n workspace: Workspace | null,\n payload: WorkspaceEvents['workspace:update:color-mode'],\n) => {\n // If workspace is null, do nothing\n if (!workspace) {\n return\n }\n // Set the color mode in the workspace object\n workspace['x-scalar-color-mode'] = payload\n}\n\n/**\n * Updates the theme for the given workspace.\n *\n * @param workspace - The workspace to update\n * @param payload - The new theme value\n */\nexport const updateTheme = (workspace: Workspace | null, payload: WorkspaceEvents['workspace:update:theme']) => {\n // If workspace is null, exit early\n if (!workspace) {\n return\n }\n // Set the theme in the workspace object\n workspace['x-scalar-theme'] = payload\n}\n\n/**\n * Updates the active environment for the given workspace.\n *\n * @param workspace - The workspace to update\n * @param payload - The new active environment value\n */\nexport const updateActiveEnvironment = (\n workspace: Workspace | null,\n payload: WorkspaceEvents['workspace:update:active-environment'],\n) => {\n // If workspace is null, exit early\n if (!workspace) {\n return\n }\n // Set the active environment in the workspace object\n workspace['x-scalar-active-environment'] = payload ?? undefined\n}\n\n/**\n * Updates the selected http client on the workspace\n *\n * @param workspace - The workspace to update the selected http client in\n * @param payload - The payload to update the selected client with\n * @returns\n */\nexport const updateSelectedClient = (\n workspace: Workspace | null,\n payload: WorkspaceEvents['workspace:update:selected-client'],\n) => {\n if (!workspace) {\n return\n }\n workspace['x-scalar-default-client'] = payload\n}\n\nexport const workspaceMutatorsFactory = ({ workspace }: { workspace: Workspace | null }) => {\n return {\n updateActiveProxy: (payload: WorkspaceEvents['workspace:update:active-proxy']) =>\n updateActiveProxy(workspace, payload),\n updateColorMode: (payload: WorkspaceEvents['workspace:update:color-mode']) => updateColorMode(workspace, payload),\n updateTheme: (payload: WorkspaceEvents['workspace:update:theme']) => updateTheme(workspace, payload),\n updateSelectedClient: (payload: WorkspaceEvents['workspace:update:selected-client']) =>\n updateSelectedClient(workspace, payload),\n updateActiveEnvironment: (payload: WorkspaceEvents['workspace:update:active-environment']) =>\n updateActiveEnvironment(workspace, payload),\n }\n}\n"],
5
- "mappings": "AASO,MAAM,oBAAoB,CAC/B,WACA,YACG;AAEH,MAAI,CAAC,WAAW;AACd;AAAA,EACF;AAEA,YAAU,uBAAuB,IAAI;AACvC;AAQO,MAAM,kBAAkB,CAC7B,WACA,YACG;AAEH,MAAI,CAAC,WAAW;AACd;AAAA,EACF;AAEA,YAAU,qBAAqB,IAAI;AACrC;AAQO,MAAM,cAAc,CAAC,WAA6B,YAAuD;AAE9G,MAAI,CAAC,WAAW;AACd;AAAA,EACF;AAEA,YAAU,gBAAgB,IAAI;AAChC;AAQO,MAAM,0BAA0B,CACrC,WACA,YACG;AAEH,MAAI,CAAC,WAAW;AACd;AAAA,EACF;AAEA,YAAU,6BAA6B,IAAI,WAAW;AACxD;AASO,MAAM,uBAAuB,CAClC,WACA,YACG;AACH,MAAI,CAAC,WAAW;AACd;AAAA,EACF;AACA,YAAU,yBAAyB,IAAI;AACzC;AAEO,MAAM,2BAA2B,CAAC,EAAE,UAAU,MAAuC;AAC1F,SAAO;AAAA,IACL,mBAAmB,CAAC,YAClB,kBAAkB,WAAW,OAAO;AAAA,IACtC,iBAAiB,CAAC,YAA4D,gBAAgB,WAAW,OAAO;AAAA,IAChH,aAAa,CAAC,YAAuD,YAAY,WAAW,OAAO;AAAA,IACnG,sBAAsB,CAAC,YACrB,qBAAqB,WAAW,OAAO;AAAA,IACzC,yBAAyB,CAAC,YACxB,wBAAwB,WAAW,OAAO;AAAA,EAC9C;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/navigation/get-navigation-options.ts"],
4
- "sourcesContent": ["import type { ApiReferenceConfigurationRaw } from '@scalar/types/api-reference'\nimport { slug } from 'github-slugger'\n\nimport type { TraverseSpecOptions } from '@/navigation/types'\nimport type { IdGenerator } from '@/schemas/navigation'\n\nexport type NavigationOptions =\n | Partial<\n Pick<\n ApiReferenceConfigurationRaw,\n | 'generateHeadingSlug'\n | 'generateTagSlug'\n | 'generateOperationSlug'\n | 'generateWebhookSlug'\n | 'generateModelSlug'\n | 'operationsSorter'\n | 'tagsSorter'\n | 'hideModels'\n >\n >\n | undefined\n\n/**\n * Returns options for traversing an OpenAPI document, allowing customization of\n * how IDs and slugs are generated for tags, headings, models, operations, and webhooks.\n * The returned options can be influenced by the provided DocumentConfiguration\n */\nexport const getNavigationOptions = (documentName: string, options?: NavigationOptions): TraverseSpecOptions => {\n const generateId: IdGenerator = (props) => {\n const documentId = `${slug(documentName)}`\n\n // -------- Default text id generation logic --------\n if (props.type === 'text') {\n if (options?.generateHeadingSlug) {\n return options?.generateHeadingSlug({ slug: props.slug })\n }\n\n if (props.slug) {\n return `${documentId}/description/${props.slug}`\n }\n\n return `${documentId}/`\n }\n\n // -------- Default tag id generation logic --------\n if (props.type === 'tag') {\n if (options?.generateTagSlug) {\n return `${documentId}/tag/${options.generateTagSlug(props.tag)}`\n }\n\n return `${documentId}/tag/${slug(props.tag.name ?? '')}`\n }\n\n // -------- Default operation id generation logic --------\n if (props.type === 'operation') {\n const prefixTag = props.parentTag\n ? `${generateId({\n type: 'tag',\n tag: props.parentTag.tag,\n parentId: props.parentTag.id,\n })}/`\n : `${documentId}/`\n\n if (options?.generateOperationSlug) {\n return `${prefixTag}${options.generateOperationSlug({\n path: props.path,\n operationId: props.operation.operationId,\n method: props.method.toUpperCase(),\n summary: props.operation.summary,\n })}`\n }\n\n return `${prefixTag}${props.method.toUpperCase()}${props.path}`\n }\n\n // -------- Default webhook id generation logic --------\n if (props.type === 'webhook') {\n const prefixTag = props.parentTag\n ? `${generateId({\n type: 'tag',\n parentId: props.parentTag.id,\n tag: props.parentTag.tag,\n })}/`\n : `${documentId}/`\n\n if (options?.generateWebhookSlug) {\n return `${prefixTag}webhook/${options.generateWebhookSlug({\n name: props.name,\n method: props.method?.toUpperCase(),\n })}`\n }\n\n return `${prefixTag}webhook/${props.method?.toUpperCase()}/${slug(props.name)}`\n }\n\n // -------- Default model id generation logic --------\n if (props.type === 'model') {\n if (!props.name) {\n return `${documentId}/models`\n }\n\n const prefixTag = props.parentTag\n ? `${generateId({\n type: 'tag',\n parentId: props.parentTag.id,\n tag: props.parentTag.tag,\n })}/`\n : `${documentId}/`\n\n if (options?.generateModelSlug) {\n return `${prefixTag}model/${options.generateModelSlug({\n name: props.name,\n })}`\n }\n\n return `${prefixTag}model/${slug(props.name, true)}`\n }\n\n if (props.type === 'example') {\n return `${props.parentId}/example/${slug(props.name)}`\n }\n\n if (props.type === 'document') {\n // -------- Default document id generation logic --------\n return documentId\n }\n\n console.warn('[WARNING]: unhandled id generation for navigation item:', props)\n return 'unknown-id'\n }\n\n return {\n hideModels: options?.hideModels ?? false,\n operationsSorter: options?.operationsSorter,\n tagsSorter: options?.tagsSorter,\n generateId,\n }\n}\n"],
5
- "mappings": "AACA,SAAS,YAAY;AA0Bd,MAAM,uBAAuB,CAAC,cAAsB,YAAqD;AAC9G,QAAM,aAA0B,CAAC,UAAU;AACzC,UAAM,aAAa,GAAG,KAAK,YAAY,CAAC;AAGxC,QAAI,MAAM,SAAS,QAAQ;AACzB,UAAI,SAAS,qBAAqB;AAChC,eAAO,SAAS,oBAAoB,EAAE,MAAM,MAAM,KAAK,CAAC;AAAA,MAC1D;AAEA,UAAI,MAAM,MAAM;AACd,eAAO,GAAG,UAAU,gBAAgB,MAAM,IAAI;AAAA,MAChD;AAEA,aAAO,GAAG,UAAU;AAAA,IACtB;AAGA,QAAI,MAAM,SAAS,OAAO;AACxB,UAAI,SAAS,iBAAiB;AAC5B,eAAO,GAAG,UAAU,QAAQ,QAAQ,gBAAgB,MAAM,GAAG,CAAC;AAAA,MAChE;AAEA,aAAO,GAAG,UAAU,QAAQ,KAAK,MAAM,IAAI,QAAQ,EAAE,CAAC;AAAA,IACxD;AAGA,QAAI,MAAM,SAAS,aAAa;AAC9B,YAAM,YAAY,MAAM,YACpB,GAAG,WAAW;AAAA,QACZ,MAAM;AAAA,QACN,KAAK,MAAM,UAAU;AAAA,QACrB,UAAU,MAAM,UAAU;AAAA,MAC5B,CAAC,CAAC,MACF,GAAG,UAAU;AAEjB,UAAI,SAAS,uBAAuB;AAClC,eAAO,GAAG,SAAS,GAAG,QAAQ,sBAAsB;AAAA,UAClD,MAAM,MAAM;AAAA,UACZ,aAAa,MAAM,UAAU;AAAA,UAC7B,QAAQ,MAAM,OAAO,YAAY;AAAA,UACjC,SAAS,MAAM,UAAU;AAAA,QAC3B,CAAC,CAAC;AAAA,MACJ;AAEA,aAAO,GAAG,SAAS,GAAG,MAAM,OAAO,YAAY,CAAC,GAAG,MAAM,IAAI;AAAA,IAC/D;AAGA,QAAI,MAAM,SAAS,WAAW;AAC5B,YAAM,YAAY,MAAM,YACpB,GAAG,WAAW;AAAA,QACZ,MAAM;AAAA,QACN,UAAU,MAAM,UAAU;AAAA,QAC1B,KAAK,MAAM,UAAU;AAAA,MACvB,CAAC,CAAC,MACF,GAAG,UAAU;AAEjB,UAAI,SAAS,qBAAqB;AAChC,eAAO,GAAG,SAAS,WAAW,QAAQ,oBAAoB;AAAA,UACxD,MAAM,MAAM;AAAA,UACZ,QAAQ,MAAM,QAAQ,YAAY;AAAA,QACpC,CAAC,CAAC;AAAA,MACJ;AAEA,aAAO,GAAG,SAAS,WAAW,MAAM,QAAQ,YAAY,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC;AAAA,IAC/E;AAGA,QAAI,MAAM,SAAS,SAAS;AAC1B,UAAI,CAAC,MAAM,MAAM;AACf,eAAO,GAAG,UAAU;AAAA,MACtB;AAEA,YAAM,YAAY,MAAM,YACpB,GAAG,WAAW;AAAA,QACZ,MAAM;AAAA,QACN,UAAU,MAAM,UAAU;AAAA,QAC1B,KAAK,MAAM,UAAU;AAAA,MACvB,CAAC,CAAC,MACF,GAAG,UAAU;AAEjB,UAAI,SAAS,mBAAmB;AAC9B,eAAO,GAAG,SAAS,SAAS,QAAQ,kBAAkB;AAAA,UACpD,MAAM,MAAM;AAAA,QACd,CAAC,CAAC;AAAA,MACJ;AAEA,aAAO,GAAG,SAAS,SAAS,KAAK,MAAM,MAAM,IAAI,CAAC;AAAA,IACpD;AAEA,QAAI,MAAM,SAAS,WAAW;AAC5B,aAAO,GAAG,MAAM,QAAQ,YAAY,KAAK,MAAM,IAAI,CAAC;AAAA,IACtD;AAEA,QAAI,MAAM,SAAS,YAAY;AAE7B,aAAO;AAAA,IACT;AAEA,YAAQ,KAAK,2DAA2D,KAAK;AAC7E,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,YAAY,SAAS,cAAc;AAAA,IACnC,kBAAkB,SAAS;AAAA,IAC3B,YAAY,SAAS;AAAA,IACrB;AAAA,EACF;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/navigation/helpers/get-openapi-object.ts"],
4
- "sourcesContent": ["import type { WorkspaceStore } from '@/client'\nimport { getResolvedRef } from '@/helpers/get-resolved-ref'\nimport type { WorkspaceDocument } from '@/schemas'\nimport type { TraversedDocument, TraversedEntry, TraversedOperation, TraversedTag } from '@/schemas/navigation'\nimport type { OperationObject, TagObject } from '@/schemas/v3.1/strict/openapi-document'\n\nimport { getParentEntry } from './get-parent-entry'\n\ntype TraversedOrderable = TraversedDocument | TraversedTag | TraversedOperation\n\ntype GetOpenapiObject<Entry extends TraversedOrderable> = Entry extends TraversedDocument\n ? WorkspaceDocument\n : Entry extends TraversedTag\n ? TagObject\n : Entry extends TraversedOperation\n ? OperationObject\n : never\n\n/** Type guard which checks if the entry has an x-scalar-order property */\nexport const canHaveOrder = (entry: TraversedEntry): entry is TraversedOrderable =>\n entry.type === 'document' || entry.type === 'tag' || entry.type === 'operation'\n\n/**\n * Retrieves the corresponding OpenAPI object (document, tag, or operation) from the workspace store based on the provided entry.\n *\n * This helper abstracts the common lookup logic for working with sidebar/drag-and-drop entries and their associated OpenAPI objects.\n * Returns `null` when the lookup cannot be completed (e.g., document/tag/operation not found).\n *\n * @template Entry Either TraversedDocument, TraversedTag, or TraversedOperation.\n * @param store - The workspace store containing loaded documents.\n * @param entry - The sidebar entry (document, tag, or operation).\n * @returns The corresponding OpenAPI object (WorkspaceDocument, TagObject, or OperationObject) or `null` if not found.\n *\n * @example\n * // For a Document entry:\n * const document = getOpenapiObject({ store, entry: documentEntry })\n *\n * // For a Tag entry:\n * const tag = getOpenapiObject({ store, entry: tagEntry })\n *\n * // For an Operation entry:\n * const operation = getOpenapiObject({ store, entry: operationEntry })\n */\nexport const getOpenapiObject = <Entry extends TraversedOrderable>({\n store,\n entry,\n}: {\n store: WorkspaceStore\n entry: Entry\n}): GetOpenapiObject<Entry> | null => {\n const documentEntry = getParentEntry('document', entry)\n if (!documentEntry) {\n return null\n }\n\n const document = store.workspace.documents[documentEntry.name]\n if (!document) {\n return null\n }\n\n if (entry.type === 'document') {\n return document as GetOpenapiObject<Entry>\n }\n\n if (entry.type === 'tag') {\n // Find the tag by name in the document's tags array\n return (document.tags?.find((tag) => tag.name === entry.name) as GetOpenapiObject<Entry> | undefined) ?? null\n }\n\n if (entry.type === 'operation') {\n // Fetch and resolve the referenced operation object at the given path/method\n return (getResolvedRef(document.paths?.[entry.path]?.[entry.method]) as GetOpenapiObject<Entry> | undefined) ?? null\n }\n\n // If entry type is unknown, return null\n return null\n}\n"],
5
- "mappings": "AACA,SAAS,sBAAsB;AAK/B,SAAS,sBAAsB;AAaxB,MAAM,eAAe,CAAC,UAC3B,MAAM,SAAS,cAAc,MAAM,SAAS,SAAS,MAAM,SAAS;AAuB/D,MAAM,mBAAmB,CAAmC;AAAA,EACjE;AAAA,EACA;AACF,MAGsC;AACpC,QAAM,gBAAgB,eAAe,YAAY,KAAK;AACtD,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,MAAM,UAAU,UAAU,cAAc,IAAI;AAC7D,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,YAAY;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,OAAO;AAExB,WAAQ,SAAS,MAAM,KAAK,CAAC,QAAQ,IAAI,SAAS,MAAM,IAAI,KAA6C;AAAA,EAC3G;AAEA,MAAI,MAAM,SAAS,aAAa;AAE9B,WAAQ,eAAe,SAAS,QAAQ,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC,KAA6C;AAAA,EAClH;AAGA,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/navigation/helpers/get-operation-entries.ts"],
4
- "sourcesContent": ["import type {\n TraversedDocument,\n TraversedEntry,\n TraversedOperation,\n TraversedWebhook,\n WithParent,\n} from '@/schemas/navigation'\n\nexport type OperationEntriesMap = Map<string, (WithParent<TraversedOperation> | WithParent<TraversedWebhook>)[]>\n\n/**\n * Builds a map of all operations and webhooks in a document, indexed by path/name and method.\n *\n * This function recursively traverses the document structure and collects all operation and webhook\n * entries. Multiple entries can share the same path|method key (for example, when operations are\n * duplicated across different tags or groups).\n *\n * ~Performance note: If this function is called frequently, consider generating this map once when\n * creating the sidebar state rather than recalculating it in mutators.~\n * Update: we are now generating it features/operation and its drilled down from there\n *\n * @param document - The traversed OpenAPI document to extract operations from\n * @returns A map where keys are `path|method` (for operations) or `name|method` (for webhooks),\n * and values are arrays of matching entries. The pipe separator is used to create a\n * unique composite key from the two parts.\n *\n * @example\n * const entries = getOperationEntries(document)\n * const getUsers = entries.get('/users|get') // Array of all GET /users operations\n */\nexport const getOperationEntries = (document: TraversedDocument): OperationEntriesMap => {\n const map: OperationEntriesMap = new Map()\n\n /**\n * Helper function to add an entry to the map under the specified key.\n * If the key already exists, appends to the array; otherwise creates a new array.\n *\n * @param key - The composite key (path|method or name|method)\n * @param entry - The operation or webhook entry to add (with parent information)\n */\n const addToMap = (key: string, entry: WithParent<TraversedOperation> | WithParent<TraversedWebhook>): void => {\n const existing = map.get(key)\n if (existing) {\n existing.push(entry)\n } else {\n map.set(key, [entry])\n }\n }\n\n /**\n * Recursively traverses the document tree to find all operations and webhooks.\n * Handles three entry types:\n * - operations: collected into the map using path|method as key\n * - webhooks: collected into the map using name|method as key\n * - containers (tags, groups): recursively traversed for their children\n *\n * @param entries - Array of entries to traverse (may be undefined for empty sections)\n * @param parent - The parent entry of the current entries (if any)\n */\n const traverse = (\n entries: TraversedEntry[] | undefined,\n parent: WithParent<TraversedEntry> | TraversedDocument,\n ): void => {\n if (!entries) {\n return\n }\n\n for (const entry of entries) {\n // Handle operations - use path and method to create unique key\n if (entry.type === 'operation') {\n const key = `${entry.path}|${entry.method}`\n addToMap(key, { ...entry, parent })\n }\n // Handle webhooks - use name and method to create unique key\n else if (entry.type === 'webhook') {\n const key = `${entry.name}|${entry.method}`\n addToMap(key, { ...entry, parent })\n }\n // Handle containers - recursively traverse children, passing current entry as parent\n else if ('children' in entry && entry.children) {\n traverse(entry.children, { ...entry, parent })\n }\n }\n }\n\n // Start traversal from document root\n traverse(document.children, document)\n\n return map\n}\n"],
5
- "mappings": "AA8BO,MAAM,sBAAsB,CAAC,aAAqD;AACvF,QAAM,MAA2B,oBAAI,IAAI;AASzC,QAAM,WAAW,CAAC,KAAa,UAA+E;AAC5G,UAAM,WAAW,IAAI,IAAI,GAAG;AAC5B,QAAI,UAAU;AACZ,eAAS,KAAK,KAAK;AAAA,IACrB,OAAO;AACL,UAAI,IAAI,KAAK,CAAC,KAAK,CAAC;AAAA,IACtB;AAAA,EACF;AAYA,QAAM,WAAW,CACf,SACA,WACS;AACT,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,eAAW,SAAS,SAAS;AAE3B,UAAI,MAAM,SAAS,aAAa;AAC9B,cAAM,MAAM,GAAG,MAAM,IAAI,IAAI,MAAM,MAAM;AACzC,iBAAS,KAAK,EAAE,GAAG,OAAO,OAAO,CAAC;AAAA,MACpC,WAES,MAAM,SAAS,WAAW;AACjC,cAAM,MAAM,GAAG,MAAM,IAAI,IAAI,MAAM,MAAM;AACzC,iBAAS,KAAK,EAAE,GAAG,OAAO,OAAO,CAAC;AAAA,MACpC,WAES,cAAc,SAAS,MAAM,UAAU;AAC9C,iBAAS,MAAM,UAAU,EAAE,GAAG,OAAO,OAAO,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAGA,WAAS,SAAS,UAAU,QAAQ;AAEpC,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
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 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/navigation/helpers/get-tag-entries.ts"],
4
- "sourcesContent": ["import type { TraversedDocument, TraversedEntry, TraversedTag, WithParent } from '@/schemas/navigation'\n\n/** Maps tag names to all matching tag entries (with parent info) found in the document. */\nexport type TagEntriesMap = Map<string, WithParent<TraversedTag>[]>\n\n/**\n * Builds a map of all tag entries in a document, indexed by tag name.\n *\n * Tags with the same name can appear more than once (for example, when the same tag\n * is referenced in multiple x-tagGroups), so each key maps to an array of matches.\n *\n * This is the tag-side counterpart to `getOperationEntries`. Keep them separate so\n * callers only pay for the traversal they actually need.\n *\n * @param document - The traversed OpenAPI document to extract tags from\n * @returns A map where keys are tag names and values are arrays of matching tag entries,\n * each decorated with a `parent` reference for walking up the tree.\n *\n * @example\n * const tags = getTagEntries(document)\n * const userTagEntries = tags.get('Users') // All tag entries named \"Users\"\n */\nexport const getTagEntries = (document: TraversedDocument): TagEntriesMap => {\n const map: TagEntriesMap = new Map()\n\n /**\n * Appends an entry to the array stored at `key`, creating the array if needed.\n */\n const addToMap = (key: string, entry: WithParent<TraversedTag>): void => {\n const existing = map.get(key)\n if (existing) {\n existing.push(entry)\n } else {\n map.set(key, [entry])\n }\n }\n\n /**\n * Recursively walks the document tree collecting tag entries.\n * Tags can be nested (e.g. inside x-tagGroups), so we recurse into their children too.\n *\n * @param entries - The current level of entries to walk (may be undefined)\n * @param parent - The parent entry or document at this level\n */\n const traverse = (\n entries: TraversedEntry[] | undefined,\n parent: WithParent<TraversedEntry> | TraversedDocument,\n ): void => {\n if (!entries) {\n return\n }\n\n for (const entry of entries) {\n if (entry.type === 'tag') {\n // Record this tag entry, then keep walking its children \u2014 tags can be nested\n addToMap(entry.name, { ...entry, parent })\n traverse(entry.children, { ...entry, parent })\n } else if ('children' in entry && entry.children) {\n // Non-tag containers (models, documents) may still hold tags inside them\n traverse(entry.children, { ...entry, parent })\n }\n }\n }\n\n traverse(document.children, document)\n\n return map\n}\n"],
5
- "mappings": "AAsBO,MAAM,gBAAgB,CAAC,aAA+C;AAC3E,QAAM,MAAqB,oBAAI,IAAI;AAKnC,QAAM,WAAW,CAAC,KAAa,UAA0C;AACvE,UAAM,WAAW,IAAI,IAAI,GAAG;AAC5B,QAAI,UAAU;AACZ,eAAS,KAAK,KAAK;AAAA,IACrB,OAAO;AACL,UAAI,IAAI,KAAK,CAAC,KAAK,CAAC;AAAA,IACtB;AAAA,EACF;AASA,QAAM,WAAW,CACf,SACA,WACS;AACT,QAAI,CAAC,SAAS;AACZ;AAAA,IACF;AAEA,eAAW,SAAS,SAAS;AAC3B,UAAI,MAAM,SAAS,OAAO;AAExB,iBAAS,MAAM,MAAM,EAAE,GAAG,OAAO,OAAO,CAAC;AACzC,iBAAS,MAAM,UAAU,EAAE,GAAG,OAAO,OAAO,CAAC;AAAA,MAC/C,WAAW,cAAc,SAAS,MAAM,UAAU;AAEhD,iBAAS,MAAM,UAAU,EAAE,GAAG,OAAO,OAAO,CAAC;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,WAAS,SAAS,UAAU,QAAQ;AAEpC,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/navigation/helpers/get-tag.ts"],
4
- "sourcesContent": ["import type { TagsMap, TraverseSpecOptions } from '@/navigation/types'\n\ntype TagMapValue = NonNullable<TagsMap extends Map<string, infer V> ? V : never>\n\n/**\n * Gets or creates a tag in the tags dictionary.\n * If the tag doesn't exist, it creates a new tag object with the given name.\n *\n * @param tagsDict - Map of tag names to tag objects\n * @param name - Name of the tag to get or create\n * @returns The tag object for the given name\n */\nexport const getTag = ({\n tagsMap,\n name,\n documentId,\n generateId,\n}: {\n tagsMap: TagsMap\n name: string\n documentId: string\n generateId: TraverseSpecOptions['generateId']\n}): TagMapValue => {\n if (!tagsMap.get(name)) {\n tagsMap.set(name, {\n id: generateId({\n type: 'tag',\n tag: { name },\n parentId: documentId,\n }),\n parentId: documentId,\n entries: [],\n tag: { name },\n })\n }\n\n return tagsMap.get(name)! // We can safely assert non-null since we just set the value if it didn't exist\n}\n"],
5
- "mappings": "AAYO,MAAM,SAAS,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAKmB;AACjB,MAAI,CAAC,QAAQ,IAAI,IAAI,GAAG;AACtB,YAAQ,IAAI,MAAM;AAAA,MAChB,IAAI,WAAW;AAAA,QACb,MAAM;AAAA,QACN,KAAK,EAAE,KAAK;AAAA,QACZ,UAAU;AAAA,MACZ,CAAC;AAAA,MACD,UAAU;AAAA,MACV,SAAS,CAAC;AAAA,MACV,KAAK,EAAE,KAAK;AAAA,IACd,CAAC;AAAA,EACH;AAEA,SAAO,QAAQ,IAAI,IAAI;AACzB;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/navigation/helpers/get-x-keys.ts"],
4
- "sourcesContent": ["/**\n * Utility function to extract all keys starting with 'x-' (OpenAPI extensions) from an object.\n *\n * @param object - The object from which to extract extension keys.\n * @returns An object containing only the entries whose keys start with 'x-'.\n */\nexport const getXKeysFromObject = (object?: Record<string, unknown>) => {\n if (!object) {\n // Return an empty object if input is undefined or null\n return {}\n }\n // Filter and return only the entries whose keys start with 'x-'\n return Object.fromEntries(Object.entries(object).filter(([key]) => key.startsWith('x-')))\n}\n"],
5
- "mappings": "AAMO,MAAM,qBAAqB,CAAC,WAAqC;AACtE,MAAI,CAAC,QAAQ;AAEX,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,OAAO,YAAY,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,IAAI,WAAW,IAAI,CAAC,CAAC;AAC1F;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 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\nconst DEFAULT_DESCRIPTION_ENTRY = {\n TITLE: 'Introduction',\n SLUG: 'introduction',\n} as const\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 generateId - Function to generate unique IDs for headings\n * @param parentId - The ID of the parent entry\n * @param info - OpenAPI Info Object\n *\n * @returns Array of TraversedDescription 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 const description = info.description?.trim()\n\n // No description, return empty array\n if (!description) {\n return []\n }\n\n const headings = getHeadingsFromMarkdown(description)\n const lowestLevel = getLowestHeadingLevel(headings)\n\n const entries: TraversedDescription[] = []\n\n let descriptionHeadingsEntry: TraversedDescription | null = null\n let currentParent: TraversedDescription | null = null\n\n // Add \"Introduction\" as the first heading\n if (!description.startsWith('#')) {\n const heading: Heading = {\n depth: 1,\n value: DEFAULT_DESCRIPTION_ENTRY.TITLE,\n slug: DEFAULT_DESCRIPTION_ENTRY.SLUG,\n }\n\n const id = generateId({\n type: 'text',\n depth: heading.depth,\n slug: heading.slug,\n parentId: parentId,\n info,\n value: heading.value,\n })\n\n const entry = {\n id,\n title: heading.value,\n type: 'text',\n } satisfies TraversedDescription\n\n // Push to entries\n entries.push(entry)\n\n descriptionHeadingsEntry = entry\n }\n\n // Go through each heading\n for (const heading of headings) {\n // Skip if not a main or sub heading\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\n // Add to description headings to the 'Introduction' entry\n if (descriptionHeadingsEntry) {\n if (!descriptionHeadingsEntry.children) {\n descriptionHeadingsEntry.children = []\n }\n descriptionHeadingsEntry.children.push(entry)\n }\n // If no 'Introduction' entry, add to entries\n else {\n entries.push(entry)\n }\n\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;AAAA,EAChC,OAAO;AAAA,EACP,MAAM;AACR;AAmBO,MAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AACF,MAI8B;AAC5B,QAAM,cAAc,KAAK,aAAa,KAAK;AAG3C,MAAI,CAAC,aAAa;AAChB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,WAAW,wBAAwB,WAAW;AACpD,QAAM,cAAc,sBAAsB,QAAQ;AAElD,QAAM,UAAkC,CAAC;AAEzC,MAAI,2BAAwD;AAC5D,MAAI,gBAA6C;AAGjD,MAAI,CAAC,YAAY,WAAW,GAAG,GAAG;AAChC,UAAM,UAAmB;AAAA,MACvB,OAAO;AAAA,MACP,OAAO,0BAA0B;AAAA,MACjC,MAAM,0BAA0B;AAAA,IAClC;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;AAED,UAAM,QAAQ;AAAA,MACZ;AAAA,MACA,OAAO,QAAQ;AAAA,MACf,MAAM;AAAA,IACR;AAGA,YAAQ,KAAK,KAAK;AAElB,+BAA2B;AAAA,EAC7B;AAGA,aAAW,WAAW,UAAU;AAE9B,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;AAGlB,UAAI,0BAA0B;AAC5B,YAAI,CAAC,yBAAyB,UAAU;AACtC,mCAAyB,WAAW,CAAC;AAAA,QACvC;AACA,iCAAyB,SAAS,KAAK,KAAK;AAAA,MAC9C,OAEK;AACH,gBAAQ,KAAK,KAAK;AAAA,MACpB;AAEA,sBAAgB;AAAA,IAClB,WAAW,eAAe;AACxB,oBAAc,UAAU,KAAK,KAAK;AAAA,IACpC;AAAA,EACF;AAEA,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/navigation/helpers/traverse-document.ts"],
4
- "sourcesContent": ["import { unpackProxyObject } from '@/helpers/unpack-proxy'\nimport { type NavigationOptions, 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'\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, options?: NavigationOptions) => {\n const { hideModels, tagsSorter, operationsSorter, generateId } = getNavigationOptions(documentName, options)\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 const documentTitle = document.info?.title?.trim() || 'Untitled Document'\n\n return {\n id: documentId,\n type: 'document',\n title: documentTitle,\n name: documentName,\n children: entries,\n icon: document['x-scalar-icon'],\n } satisfies TraversedDocument\n}\n"],
5
- "mappings": "AAAA,SAAS,yBAAyB;AAClC,SAAiC,4BAA4B;AAK7D,SAAS,2BAA2B;AACpC,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AAW1B,MAAM,mBAAmB,CAAC,cAAsB,UAA2B,YAAgC;AAChH,QAAM,EAAE,YAAY,YAAY,kBAAkB,WAAW,IAAI,qBAAqB,cAAc,OAAO;AAE3G,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,QAAM,gBAAgB,SAAS,MAAM,OAAO,KAAK,KAAK;AAEtD,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,MAAM,SAAS,eAAe;AAAA,EAChC;AACF;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 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 // Add all examples from draft examples\n const examples = new Set<string>(operation['x-draft-examples'] ?? [])\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 return Array.from(examples)\n}\n"],
5
- "mappings": "AAAA,SAAS,sBAAsB;AAQxB,MAAM,4BAA4B,CAAC,cAA+B;AAEvE,QAAM,WAAW,IAAI,IAAY,UAAU,kBAAkB,KAAK,CAAC,CAAC;AAGpE,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;AAEA,SAAO,MAAM,KAAK,QAAQ;AAC5B;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 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'\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
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/navigation/helpers/traverse-schemas.ts"],
4
- "sourcesContent": ["import { getResolvedRef } from '@/helpers/get-resolved-ref'\nimport { getTag } from '@/navigation/helpers/get-tag'\nimport type { TagsMap, TraverseSpecOptions } from '@/navigation/types'\nimport type { ParentTag, TraversedSchema } from '@/schemas/navigation'\nimport type { OpenApiDocument, SchemaObject } from '@/schemas/v3.1/strict/openapi-document'\n\n/** Creates a traversed schema entry from an OpenAPI schema object.\n *\n * @param ref - JSON pointer reference to the schema in the OpenAPI document\n * @param name - Name of the schema, defaults to 'Unknown'\n * @param entriesMap - Map to store schema IDs and titles for mobile header navigation\n * @param getModelId - Function to generate unique IDs for schemas\n * @returns A traversed schema entry with ID, title, name and reference\n */\nconst createSchemaEntry = ({\n ref,\n name,\n generateId,\n parentTag,\n _schema,\n parentId,\n}: {\n ref: string\n name: string\n generateId: TraverseSpecOptions['generateId']\n parentTag?: ParentTag\n _schema?: SchemaObject\n parentId: string\n}): TraversedSchema => {\n const id = generateId({ name, type: 'model', parentTag, parentId, schema: _schema })\n const schema = getResolvedRef(_schema)\n\n // Use schema.title if available, otherwise fall back to name\n // @see https://json-schema.org/draft/2020-12/json-schema-core#section-4.3.5\n const title = (schema && 'title' in schema && (schema.title as string)) || name\n\n const entry = {\n id,\n title,\n name,\n ref,\n type: 'model',\n } satisfies TraversedSchema\n\n return entry\n}\n\n/** Traverses the schemas in an OpenAPI document to build an array of model entries.\n *\n * This function processes each schema in components.schemas to:\n * - Filter out internal schemas (marked with x-internal) and schemas to ignore (marked with x-scalar-ignore)\n * - Create model entries with unique references and IDs\n * - Store model IDs and titles for mobile header navigation\n */\nexport const traverseSchemas = ({\n document,\n tagsMap,\n generateId,\n documentId,\n}: {\n document: OpenApiDocument\n /** Map of tagNames and their entries */\n tagsMap: TagsMap\n generateId: TraverseSpecOptions['generateId']\n documentId: string\n}): TraversedSchema[] => {\n const schemas = document.components?.schemas ?? {}\n const untagged: TraversedSchema[] = []\n\n // biome-ignore lint/suspicious/useGuardForIn: we do have an if statement after de-ref\n for (const name in schemas) {\n const schema = getResolvedRef(schemas[name])\n\n if (schema?.['x-internal'] || schema?.['x-scalar-ignore'] || !Object.hasOwn(schemas, name)) {\n continue\n }\n\n const ref = `#/components/schemas/${name}`\n\n // Add to tags\n if (schema?.['x-tags']) {\n schema['x-tags'].forEach((tagName: string) => {\n const { tag, id: tagId } = getTag({ tagsMap, name: tagName, documentId, generateId })\n tagsMap.get(tagName)?.entries.push(\n createSchemaEntry({\n ref,\n name,\n generateId,\n parentTag: { tag, id: tagId },\n parentId: documentId,\n }),\n )\n })\n }\n // Add to untagged\n else {\n untagged.push(\n createSchemaEntry({\n ref,\n name,\n generateId,\n _schema: getResolvedRef(schemas[name]),\n parentId: documentId,\n }),\n )\n }\n }\n\n return untagged\n}\n"],
5
- "mappings": "AAAA,SAAS,sBAAsB;AAC/B,SAAS,cAAc;AAavB,MAAM,oBAAoB,CAAC;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAOuB;AACrB,QAAM,KAAK,WAAW,EAAE,MAAM,MAAM,SAAS,WAAW,UAAU,QAAQ,QAAQ,CAAC;AACnF,QAAM,SAAS,eAAe,OAAO;AAIrC,QAAM,QAAS,UAAU,WAAW,UAAW,OAAO,SAAqB;AAE3E,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AAEA,SAAO;AACT;AASO,MAAM,kBAAkB,CAAC;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAMyB;AACvB,QAAM,UAAU,SAAS,YAAY,WAAW,CAAC;AACjD,QAAM,WAA8B,CAAC;AAGrC,aAAW,QAAQ,SAAS;AAC1B,UAAM,SAAS,eAAe,QAAQ,IAAI,CAAC;AAE3C,QAAI,SAAS,YAAY,KAAK,SAAS,iBAAiB,KAAK,CAAC,OAAO,OAAO,SAAS,IAAI,GAAG;AAC1F;AAAA,IACF;AAEA,UAAM,MAAM,wBAAwB,IAAI;AAGxC,QAAI,SAAS,QAAQ,GAAG;AACtB,aAAO,QAAQ,EAAE,QAAQ,CAAC,YAAoB;AAC5C,cAAM,EAAE,KAAK,IAAI,MAAM,IAAI,OAAO,EAAE,SAAS,MAAM,SAAS,YAAY,WAAW,CAAC;AACpF,gBAAQ,IAAI,OAAO,GAAG,QAAQ;AAAA,UAC5B,kBAAkB;AAAA,YAChB;AAAA,YACA;AAAA,YACA;AAAA,YACA,WAAW,EAAE,KAAK,IAAI,MAAM;AAAA,YAC5B,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH,OAEK;AACH,eAAS;AAAA,QACP,kBAAkB;AAAA,UAChB;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS,eAAe,QAAQ,IAAI,CAAC;AAAA,UACrC,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/navigation/helpers/traverse-tags.ts"],
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
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/navigation/helpers/traverse-webhooks.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'\n\nimport { getResolvedRef } from '@/helpers/get-resolved-ref'\nimport { isDeprecatedOperation } from '@/navigation/helpers/traverse-paths'\nimport type { TagsMap, TraverseSpecOptions } from '@/navigation/types'\nimport type { ParentTag, TraversedWebhook } from '@/schemas/navigation'\nimport type { OpenApiDocument, OperationObject, TagObject } from '@/schemas/v3.1/strict/openapi-document'\n\nimport { getTag } from './get-tag'\n\n/** Creates a traversed webhook entry from an OpenAPI webhook object.\n *\n * @param ref - JSON pointer reference to the webhook in the OpenAPI document\n * @param method - HTTP method of the webhook\n * @param name - Name of the webhook, defaults to 'Unknown'\n * @param title - Title of the webhook, defaults to 'Unknown'\n * @param entitiesMap - Map to store webhook IDs and titles for mobile header navigation\n * @param getWebhookId - Function to generate unique IDs for webhooks\n * @param tag - Optional tag object associated with the webhook\n * @returns A traversed webhook entry with ID, title, name, method and reference\n */\nconst createWebhookEntry = ({\n ref,\n method,\n name,\n title,\n generateId,\n parentTag,\n webhook,\n isDeprecated,\n parentId,\n}: {\n ref: string\n method: HttpMethod\n webhook: OperationObject\n name: string\n title: string\n generateId: TraverseSpecOptions['generateId']\n tag?: TagObject\n parentId: string\n parentTag?: ParentTag\n isDeprecated?: boolean\n}): TraversedWebhook => {\n const id = generateId({\n type: 'webhook',\n name,\n method,\n webhook: webhook,\n parentTag,\n parentId: parentId,\n })\n\n const entry = {\n id,\n title,\n name,\n ref,\n method: method,\n type: 'webhook',\n isDeprecated,\n } satisfies TraversedWebhook\n\n return entry\n}\n\n/** Traverses the webhooks in an OpenAPI document to build an array of webhook entries.\n *\n * This function processes each webhook in the document to:\n * - Filter out internal webhooks (marked with x-internal) and webhooks to ignore (marked with x-scalar-ignore)\n * - Group webhooks by their tags\n * - Create webhook entries with unique references and IDs\n * - Store webhook IDs and titles for mobile header navigation\n *\n * @param content - The OpenAPI document to traverse\n * @param tagsMap - Map of tag names to arrays of traversed entries from operations\n * @param tagsDict - Dictionary mapping tag names to their OpenAPI tag objects\n * @param entitiesMap - Map to store webhook IDs and titles for mobile header navigation\n * @param getWebhookId - Function to generate unique IDs for webhooks\n * @returns Array of untagged webhook entries\n */\nexport const traverseWebhooks = ({\n document,\n tagsMap,\n generateId,\n untaggedWebhooksParentId,\n documentId,\n}: {\n /** Openapi document */\n document: OpenApiDocument\n /** The tag map from from traversing paths */\n tagsMap: TagsMap\n generateId: TraverseSpecOptions['generateId']\n untaggedWebhooksParentId: string\n documentId: string\n}): TraversedWebhook[] => {\n const untagged: TraversedWebhook[] = []\n\n // Traverse webhooks\n Object.entries(document.webhooks ?? {}).forEach(([name, 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']) {\n return\n }\n\n const ref = `#/webhooks/${name}/${method}`\n\n if (operation.tags?.length) {\n operation.tags.forEach((tagName: string) => {\n const { tag, id: tagId } = getTag({ tagsMap, name: tagName, documentId, generateId })\n tagsMap.get(tagName)?.entries.push(\n createWebhookEntry({\n ref,\n method,\n name,\n title: operation.summary ?? name,\n webhook: operation,\n generateId: generateId,\n parentTag: { tag, id: tagId },\n parentId: tagId,\n isDeprecated: isDeprecatedOperation(operation),\n }),\n )\n })\n }\n // Add to untagged\n else {\n untagged.push(\n createWebhookEntry({\n ref,\n method,\n name,\n title: operation.summary ?? name,\n generateId,\n isDeprecated: isDeprecatedOperation(operation),\n webhook: operation,\n parentId: untaggedWebhooksParentId,\n }),\n )\n }\n })\n })\n\n return untagged\n}\n"],
5
- "mappings": "AACA,SAAS,oBAAoB;AAC7B,SAAS,kBAAkB;AAE3B,SAAS,sBAAsB;AAC/B,SAAS,6BAA6B;AAKtC,SAAS,cAAc;AAavB,MAAM,qBAAqB,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAWwB;AACtB,QAAM,KAAK,WAAW;AAAA,IACpB,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN;AAAA,EACF;AAEA,SAAO;AACT;AAiBO,MAAM,mBAAmB,CAAC;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAQ0B;AACxB,QAAM,WAA+B,CAAC;AAGtC,SAAO,QAAQ,SAAS,YAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,MAAM,cAAc,MAAM;AAC1E,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,GAAG;AAC3D;AAAA,MACF;AAEA,YAAM,MAAM,cAAc,IAAI,IAAI,MAAM;AAExC,UAAI,UAAU,MAAM,QAAQ;AAC1B,kBAAU,KAAK,QAAQ,CAAC,YAAoB;AAC1C,gBAAM,EAAE,KAAK,IAAI,MAAM,IAAI,OAAO,EAAE,SAAS,MAAM,SAAS,YAAY,WAAW,CAAC;AACpF,kBAAQ,IAAI,OAAO,GAAG,QAAQ;AAAA,YAC5B,mBAAmB;AAAA,cACjB;AAAA,cACA;AAAA,cACA;AAAA,cACA,OAAO,UAAU,WAAW;AAAA,cAC5B,SAAS;AAAA,cACT;AAAA,cACA,WAAW,EAAE,KAAK,IAAI,MAAM;AAAA,cAC5B,UAAU;AAAA,cACV,cAAc,sBAAsB,SAAS;AAAA,YAC/C,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAAA,MACH,OAEK;AACH,iBAAS;AAAA,UACP,mBAAmB;AAAA,YACjB;AAAA,YACA;AAAA,YACA;AAAA,YACA,OAAO,UAAU,WAAW;AAAA,YAC5B;AAAA,YACA,cAAc,sBAAsB,SAAS;AAAA,YAC7C,SAAS;AAAA,YACT,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/navigation/helpers/update-order-ids.ts"],
4
- "sourcesContent": ["import type { HttpMethod } from '@scalar/helpers/http/http-methods'\n\nimport type { WorkspaceStore } from '@/client'\nimport { canHaveOrder, getOpenapiObject } from '@/navigation/helpers/get-openapi-object'\nimport { getParentEntry } from '@/navigation/helpers/get-parent-entry'\nimport type { IdGenerator, TraversedOperation, TraversedTag, TraversedWebhook, WithParent } from '@/schemas/navigation'\nimport type { TagObject } from '@/schemas/v3.1/strict/openapi-document'\nimport type { OperationObject } from '@/schemas/v3.1/strict/operation'\n\ntype UpdateOrderIdParams = {\n store: WorkspaceStore\n generateId: IdGenerator\n} & (\n | {\n /** Operation or webhook entries to update the order ID for */\n entries: (WithParent<TraversedOperation> | WithParent<TraversedWebhook>)[]\n operation: OperationObject\n method: HttpMethod\n path: string\n }\n | {\n /** Tag entries to update the order ID for */\n entries: WithParent<TraversedTag>[]\n tag: TagObject\n }\n)\n\n/**\n * Updates the order ID of an entry (operation or tag) in the sidebar.\n * Used when changing path, method, or tag name so we do not lose the sidebar ordering.\n *\n * Accepts either operation/webhook entries or tag entries via a discriminated union,\n * so the correct ID generation props are enforced at the call site.\n */\nexport const updateOrderIds = ({ store, generateId, ...rest }: UpdateOrderIdParams) => {\n // Loop over the entries and replace the ID in the x-scalar-order with the new ID\n rest.entries?.forEach((entry) => {\n if (!canHaveOrder(entry.parent)) {\n return\n }\n\n // Ensure we have an x-scalar-order property\n const parentOpenAPIObject = getOpenapiObject({ store, entry: entry.parent })\n if (!parentOpenAPIObject || !('x-scalar-order' in parentOpenAPIObject)) {\n return\n }\n\n const order = parentOpenAPIObject['x-scalar-order']\n const index = order?.indexOf(entry.id)\n if (!Array.isArray(order) || typeof index !== 'number' || index < 0) {\n return\n }\n\n // Tag entries: generate a new tag ID using the updated tag object\n if ('tag' in rest) {\n const oldTagId = entry.id\n const newTagId = generateId({\n type: 'tag',\n parentId: entry.parent.id,\n tag: rest.tag,\n })\n order[index] = newTagId\n\n // Ensure we update the children as well, so we don't lose the sidebar ordering when it rebuilds\n if (oldTagId !== newTagId) {\n const documentEntry = getParentEntry('document', entry)\n const document = documentEntry ? store.workspace.documents[documentEntry.name] : null\n const renamedTagObj = document?.tags?.find((t) => t.name === rest.tag.name)\n const childOrder = renamedTagObj?.['x-scalar-order']\n\n if (renamedTagObj && Array.isArray(childOrder)) {\n const oldPrefix = `${oldTagId}/`\n const newPrefix = `${newTagId}/`\n renamedTagObj['x-scalar-order'] = childOrder.map((id: string) =>\n id.startsWith(oldPrefix) ? newPrefix + id.slice(oldPrefix.length) : id,\n )\n }\n }\n\n return\n }\n\n // Operation/webhook entries: generate a new operation ID with the updated path and method\n const parentTag =\n entry.parent.type === 'tag' && 'name' in parentOpenAPIObject\n ? { tag: parentOpenAPIObject, id: entry.parent.id }\n : undefined\n\n order[index] = generateId({\n type: 'operation',\n path: rest.path,\n method: rest.method,\n operation: rest.operation,\n parentId: entry.parent.id,\n parentTag,\n })\n })\n}\n"],
5
- "mappings": "AAGA,SAAS,cAAc,wBAAwB;AAC/C,SAAS,sBAAsB;AA8BxB,MAAM,iBAAiB,CAAC,EAAE,OAAO,YAAY,GAAG,KAAK,MAA2B;AAErF,OAAK,SAAS,QAAQ,CAAC,UAAU;AAC/B,QAAI,CAAC,aAAa,MAAM,MAAM,GAAG;AAC/B;AAAA,IACF;AAGA,UAAM,sBAAsB,iBAAiB,EAAE,OAAO,OAAO,MAAM,OAAO,CAAC;AAC3E,QAAI,CAAC,uBAAuB,EAAE,oBAAoB,sBAAsB;AACtE;AAAA,IACF;AAEA,UAAM,QAAQ,oBAAoB,gBAAgB;AAClD,UAAM,QAAQ,OAAO,QAAQ,MAAM,EAAE;AACrC,QAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,QAAQ,GAAG;AACnE;AAAA,IACF;AAGA,QAAI,SAAS,MAAM;AACjB,YAAM,WAAW,MAAM;AACvB,YAAM,WAAW,WAAW;AAAA,QAC1B,MAAM;AAAA,QACN,UAAU,MAAM,OAAO;AAAA,QACvB,KAAK,KAAK;AAAA,MACZ,CAAC;AACD,YAAM,KAAK,IAAI;AAGf,UAAI,aAAa,UAAU;AACzB,cAAM,gBAAgB,eAAe,YAAY,KAAK;AACtD,cAAM,WAAW,gBAAgB,MAAM,UAAU,UAAU,cAAc,IAAI,IAAI;AACjF,cAAM,gBAAgB,UAAU,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,IAAI;AAC1E,cAAM,aAAa,gBAAgB,gBAAgB;AAEnD,YAAI,iBAAiB,MAAM,QAAQ,UAAU,GAAG;AAC9C,gBAAM,YAAY,GAAG,QAAQ;AAC7B,gBAAM,YAAY,GAAG,QAAQ;AAC7B,wBAAc,gBAAgB,IAAI,WAAW;AAAA,YAAI,CAAC,OAChD,GAAG,WAAW,SAAS,IAAI,YAAY,GAAG,MAAM,UAAU,MAAM,IAAI;AAAA,UACtE;AAAA,QACF;AAAA,MACF;AAEA;AAAA,IACF;AAGA,UAAM,YACJ,MAAM,OAAO,SAAS,SAAS,UAAU,sBACrC,EAAE,KAAK,qBAAqB,IAAI,MAAM,OAAO,GAAG,IAChD;AAEN,UAAM,KAAK,IAAI,WAAW;AAAA,MACxB,MAAM;AAAA,MACN,MAAM,KAAK;AAAA,MACX,QAAQ,KAAK;AAAA,MACb,WAAW,KAAK;AAAA,MAChB,UAAU,MAAM,OAAO;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/navigation/helpers/utils.ts"],
4
- "sourcesContent": ["import { getHeadings } from '@scalar/code-highlight/markdown'\nimport GithubSlugger from 'github-slugger'\n\nimport type { Heading } from '@/navigation/types'\n\n/**\n * Adds URL-friendly slugs to each heading in the array.\n * Uses GithubSlugger to generate consistent slugs that match GitHub's heading anchor format.\n *\n * @param headings - Array of heading objects containing value and depth\n * @param slugger - GithubSlugger instance for generating consistent slugs\n * @returns Array of headings with added slug property\n *\n * @example\n * const headings = [\n * { value: 'Getting Started', depth: 1 },\n * { value: 'Installation', depth: 2 }\n * ]\n * const slugger = new GithubSlugger()\n * withSlugs(headings, slugger)\n * // Returns:\n * // [\n * // { value: 'Getting Started', depth: 1, slug: 'getting-started' },\n * // { value: 'Installation', depth: 2, slug: 'installation' }\n * // ]\n */\nconst withSlugs = (headings: Heading[], slugger: GithubSlugger): Heading[] =>\n headings.map((heading) => {\n return {\n ...heading,\n slug: slugger.slug(heading.value),\n }\n })\n\n/**\n * Extracts all headings from a Markdown string and adds URL-friendly slugs to each heading.\n * Uses GithubSlugger to generate consistent slugs that match GitHub's heading anchor format.\n *\n * @param input - The Markdown string to extract headings from\n * @returns Array of heading objects containing value, depth, and slug\n *\n * @example\n * const markdown = `\n * # Getting Started\n * ## Installation\n * ### Requirements\n * `\n * const headings = getHeadingsFromMarkdown(markdown)\n * // Returns:\n * // [\n * // { value: 'Getting Started', depth: 1, slug: 'getting-started' },\n * // { value: 'Installation', depth: 2, slug: 'installation' },\n * // { value: 'Requirements', depth: 3, slug: 'requirements' }\n * // ]\n */\nexport function getHeadingsFromMarkdown(input: string): Heading[] {\n const slugger = new GithubSlugger()\n\n const headings = getHeadings(input)\n\n return withSlugs(headings as Heading[], slugger)\n}\n\ntype HeadingLevels = 1 | 2 | 3 | 4 | 5 | 6\n\n/**\n * Returns the lowest heading level from a list of headings.\n *\n * @param headings - Array of heading objects containing depth property\n * @returns The lowest heading level (1-6) or 1 if no valid headings found\n *\n * @example\n * const headings = [\n * { value: 'Getting Started', depth: 1 },\n * { value: 'Installation', depth: 2 }\n * ]\n * getLowestHeadingLevel(headings) // Returns: 1\n */\nexport const getLowestHeadingLevel = (headings: Heading[]): HeadingLevels => {\n const lowestLevel = Math.min(...headings.map((heading) => heading.depth))\n\n if (lowestLevel >= 1 && lowestLevel <= 6) {\n return lowestLevel as HeadingLevels\n }\n\n return 1\n}\n"],
5
- "mappings": "AAAA,SAAS,mBAAmB;AAC5B,OAAO,mBAAmB;AAyB1B,MAAM,YAAY,CAAC,UAAqB,YACtC,SAAS,IAAI,CAAC,YAAY;AACxB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,QAAQ,KAAK,QAAQ,KAAK;AAAA,EAClC;AACF,CAAC;AAuBI,SAAS,wBAAwB,OAA0B;AAChE,QAAM,UAAU,IAAI,cAAc;AAElC,QAAM,WAAW,YAAY,KAAK;AAElC,SAAO,UAAU,UAAuB,OAAO;AACjD;AAiBO,MAAM,wBAAwB,CAAC,aAAuC;AAC3E,QAAM,cAAc,KAAK,IAAI,GAAG,SAAS,IAAI,CAAC,YAAY,QAAQ,KAAK,CAAC;AAExE,MAAI,eAAe,KAAK,eAAe,GAAG;AACxC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/navigation/index.ts"],
4
- "sourcesContent": ["export { getOpenapiObject } from './helpers/get-openapi-object'\nexport { type OperationEntriesMap, getOperationEntries } from './helpers/get-operation-entries'\nexport { getParentEntry } from './helpers/get-parent-entry'\nexport { type TagEntriesMap, getTagEntries } from './helpers/get-tag-entries'\nexport { traverseDocument as createNavigation } from './helpers/traverse-document'\nexport type { TraverseSpecOptions as createNavigationOptions } from './types'\n"],
5
- "mappings": "AAAA,SAAS,wBAAwB;AACjC,SAAmC,2BAA2B;AAC9D,SAAS,sBAAsB;AAC/B,SAA6B,qBAAqB;AAClD,SAA6B,wBAAwB;",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/persistence/index.ts"],
4
- "sourcesContent": ["import { Type } from '@scalar/typebox'\n\nimport type { PathMethodHistory } from '@/entities/history/schema'\nimport { createIndexDbConnection } from '@/persistence/indexdb'\nimport type { InMemoryWorkspace } from '@/schemas/inmemory-workspace'\nimport type { WorkspaceMeta } from '@/schemas/workspace'\n\ntype WorkspaceKey = {\n namespace?: string\n slug: string\n}\n\ntype WorkspaceStoreShape = {\n teamUid: string\n name: string\n workspace: InMemoryWorkspace\n}\n\n/** Generates a workspace ID from namespace and slug. */\nexport const getWorkspaceId = (namespace: string, slug: string) => `${namespace}/${slug}`\n\n/**\n * Creates the persistence layer for the workspace store using IndexedDB.\n * This sets up all the required tables for storing workspace chunk information,\n * such as workspace meta, documents, original documents, intermediate documents, overrides, etc.\n * Each logical group (meta, documents, etc) gets its own table keyed appropriately for efficient sub-document access.\n * Returns an object containing `meta`, `documents`, `originalDocuments`, `intermediateDocuments`, `overrides`,\n * `documentMeta`, `documentConfigs`, and `workspace` sections, each exposing a `setItem` method\n * for upsetting records, and in the case of `workspace`, also `getItem` and `deleteItem`.\n */\nexport const createWorkspaceStorePersistence = async () => {\n // Create the database connection and setup all required tables for workspace storage.\n const connection = await createIndexDbConnection({\n name: 'scalar-workspace-store',\n version: 1,\n tables: {\n workspace: {\n schema: Type.Object({\n /** Visual name for a given workspace */\n name: Type.String(),\n /** When logged in all new workspaces (remote and local) are scoped to a team */\n teamUid: Type.String({ default: 'local' }),\n /** Namespace associated with a remote workspace */\n namespace: Type.String({ default: 'local' }),\n /** Slug associated with a remote workspace */\n slug: Type.String({ default: 'local' }),\n }),\n keyPath: ['namespace', 'slug'],\n indexes: {\n teamUid: ['teamUid'],\n },\n },\n meta: {\n schema: Type.Object({ workspaceId: Type.String(), data: Type.Any() }),\n keyPath: ['workspaceId'],\n },\n documents: {\n schema: Type.Object({ workspaceId: Type.String(), documentName: Type.String(), data: Type.Any() }),\n keyPath: ['workspaceId', 'documentName'],\n },\n originalDocuments: {\n schema: Type.Object({ workspaceId: Type.String(), documentName: Type.String(), data: Type.Any() }),\n keyPath: ['workspaceId', 'documentName'],\n },\n intermediateDocuments: {\n schema: Type.Object({ workspaceId: Type.String(), documentName: Type.String(), data: Type.Any() }),\n keyPath: ['workspaceId', 'documentName'],\n },\n overrides: {\n schema: Type.Object({ workspaceId: Type.String(), documentName: Type.String(), data: Type.Any() }),\n keyPath: ['workspaceId', 'documentName'],\n },\n history: {\n schema: Type.Object({ workspaceId: Type.String(), documentName: Type.String(), data: Type.Any() }),\n keyPath: ['workspaceId', 'documentName'],\n },\n auth: {\n schema: Type.Object({ workspaceId: Type.String(), documentName: Type.String(), data: Type.Any() }),\n keyPath: ['workspaceId', 'documentName'],\n },\n },\n })\n\n // Tables wrappers for each logical section.\n const workspaceTable = connection.get('workspace')\n const metaTable = connection.get('meta')\n const documentsTable = connection.get('documents')\n const originalDocumentTable = connection.get('originalDocuments')\n const intermediateDocumentTable = connection.get('intermediateDocuments')\n const overridesTable = connection.get('overrides')\n const historyTable = connection.get('history')\n const authTable = connection.get('auth')\n\n // The returned persistence API with logical sections for each table and mapping.\n return {\n close: () => {\n connection.closeDatabase()\n },\n meta: {\n /**\n * Set meta data for a workspace.\n */\n setItem: async (workspaceId: string, data: WorkspaceMeta) => {\n await metaTable.addItem({ workspaceId }, { data })\n },\n },\n documents: {\n /**\n * Set (persist) a workspace document using workspaceId and documentName as composite key.\n */\n setItem: async (workspaceId: string, documentName: string, data: InMemoryWorkspace['documents'][string]) => {\n await documentsTable.addItem({ workspaceId, documentName }, { data })\n },\n },\n originalDocuments: {\n /**\n * Set an original (raw) document for a workspace/document pair.\n */\n setItem: async (\n workspaceId: string,\n documentName: string,\n data: InMemoryWorkspace['originalDocuments'][string],\n ) => {\n await originalDocumentTable.addItem({ workspaceId, documentName }, { data })\n },\n },\n intermediateDocuments: {\n /**\n * Set an intermediate (transformed) document for a workspace/document pair.\n */\n setItem: async (\n workspaceId: string,\n documentName: string,\n data: InMemoryWorkspace['intermediateDocuments'][string],\n ) => {\n await intermediateDocumentTable.addItem({ workspaceId, documentName }, { data })\n },\n },\n overrides: {\n /**\n * Set document overrides for a workspace/document pair.\n */\n setItem: async (workspaceId: string, documentName: string, data: InMemoryWorkspace['overrides'][string]) => {\n await overridesTable.addItem({ workspaceId, documentName }, { data })\n },\n },\n history: {\n /**\n * Set history for a document.\n */\n setItem: async (workspaceId: string, documentName: string, data: PathMethodHistory) => {\n await historyTable.addItem({ workspaceId, documentName }, { data })\n },\n },\n auth: {\n /**\n * Set auth for a document.\n */\n setItem: async (workspaceId: string, documentName: string, data: InMemoryWorkspace['auth'][string]) => {\n await authTable.addItem({ workspaceId, documentName }, { data })\n },\n },\n workspace: {\n /**\n * Retrieves a workspace by its ID.\n * Returns undefined if the workspace does not exist.\n * Gathers all workspace 'chunk' tables and assembles a full workspace shape.\n */\n getItem: async ({\n namespace,\n slug,\n }: Required<WorkspaceKey>): Promise<(WorkspaceStoreShape & Required<WorkspaceKey>) | undefined> => {\n const workspace = await workspaceTable.getItem({ namespace, slug })\n\n if (!workspace) {\n return undefined\n }\n\n // Create a composite key for the workspace chunks.\n const id = getWorkspaceId(namespace, slug)\n\n // Retrieve all chunk records for this workspace.\n const workspaceDocuments = await documentsTable.getRange([id])\n const workspaceOriginalDocuments = await originalDocumentTable.getRange([id])\n const workspaceIntermediateDocuments = await intermediateDocumentTable.getRange([id])\n const workspaceOverrides = await overridesTable.getRange([id])\n const workspaceMeta = await metaTable.getItem({ workspaceId: id })\n const workspaceHistory = await historyTable.getRange([id])\n const workspaceAuth = await authTable.getRange([id])\n\n // Compose the workspace structure from table records.\n return {\n name: workspace.name,\n teamUid: workspace.teamUid,\n namespace: workspace.namespace,\n slug: workspace.slug,\n workspace: {\n documents: Object.fromEntries(workspaceDocuments.map((item) => [item.documentName, item.data])),\n originalDocuments: Object.fromEntries(\n workspaceOriginalDocuments.map((item) => [item.documentName, item.data]),\n ),\n intermediateDocuments: Object.fromEntries(\n workspaceIntermediateDocuments.map((item) => [item.documentName, item.data]),\n ),\n overrides: Object.fromEntries(workspaceOverrides.map((item) => [item.documentName, item.data])),\n meta: workspaceMeta?.data,\n history: Object.fromEntries(workspaceHistory.map((item) => [item.documentName, item.data])),\n auth: Object.fromEntries(workspaceAuth.map((item) => [item.documentName, item.data])),\n },\n }\n },\n\n /**\n * Retrieves all workspaces from the database.\n * Returns only the workspace ID and name for each workspace.\n * To get the full workspace data including documents and metadata, use getItem() with a specific ID.\n * Returns an empty array if no workspaces exist.\n */\n getAll: async () => {\n return await workspaceTable.getAll()\n },\n\n /**\n * Retrieves all workspaces for a given team UID.\n */\n getAllByTeamUid: async (teamUid: string) => {\n return await workspaceTable.getRange([teamUid], 'teamUid')\n },\n\n /**\n * Saves a workspace to the database.\n * All chunks (meta, documents, configs, etc.) are upsert in their respective tables.\n * If a workspace with the same ID already exists, it will be replaced.\n */\n setItem: async (\n { namespace = 'local', slug }: WorkspaceKey,\n value: Omit<WorkspaceStoreShape, 'teamUid'> & Partial<Pick<WorkspaceStoreShape, 'teamUid'>>,\n ) => {\n const workspace = await workspaceTable.addItem(\n { namespace, slug },\n {\n name: value.name,\n teamUid: value.teamUid ?? 'local',\n },\n )\n const id = getWorkspaceId(namespace, slug)\n\n // Save all meta info for workspace.\n await metaTable.addItem({ workspaceId: id }, { data: value.workspace.meta })\n\n // Persist all workspace documents (chunks).\n await Promise.all(\n Object.entries(value.workspace.documents ?? {}).map(([name, data]) => {\n return documentsTable.addItem({ workspaceId: id, documentName: name }, { data })\n }),\n )\n\n // Persist all original documents.\n await Promise.all(\n Object.entries(value.workspace.originalDocuments ?? {}).map(([name, data]) => {\n return originalDocumentTable.addItem({ workspaceId: id, documentName: name }, { data })\n }),\n )\n\n // Persist all intermediate documents.\n await Promise.all(\n Object.entries(value.workspace.intermediateDocuments ?? {}).map(([name, data]) => {\n return intermediateDocumentTable.addItem({ workspaceId: id, documentName: name }, { data })\n }),\n )\n\n // Persist all document overrides.\n await Promise.all(\n Object.entries(value.workspace.overrides ?? {}).map(([name, data]) => {\n return overridesTable.addItem({ workspaceId: id, documentName: name }, { data })\n }),\n )\n\n // Persist all history.\n await Promise.all(\n Object.entries(value.workspace.history ?? {}).map(([name, data]) => {\n return historyTable.addItem({ workspaceId: id, documentName: name }, { data })\n }),\n )\n\n // Persist all auth.\n await Promise.all(\n Object.entries(value.workspace.auth ?? {}).map(([name, data]) => {\n return authTable.addItem({ workspaceId: id, documentName: name }, { data })\n }),\n )\n\n return workspace\n },\n\n /**\n * Deletes an entire workspace and all associated chunk records from all tables by ID.\n */\n deleteItem: async ({ namespace, slug }: Required<WorkspaceKey>): Promise<void> => {\n const id = getWorkspaceId(namespace, slug)\n\n await workspaceTable.deleteItem({ namespace, slug })\n\n // Remove all workspace-related records from all chunk tables.\n await Promise.all([\n // By id\n metaTable.deleteItem({ workspaceId: id }),\n\n // By range (composite-key tables)\n documentsTable.deleteRange([id]),\n originalDocumentTable.deleteRange([id]),\n intermediateDocumentTable.deleteRange([id]),\n overridesTable.deleteRange([id]),\n historyTable.deleteRange([id]),\n authTable.deleteRange([id]),\n ])\n },\n\n /**\n * Deletes a single document and all related records (overrides, history, auth, etc.)\n * for the given workspace and document name from all relevant tables.\n */\n deleteDocument: async (workspaceId: string, documentName: string): Promise<void> => {\n await Promise.all([\n documentsTable.deleteItem({ workspaceId, documentName }),\n intermediateDocumentTable.deleteItem({ workspaceId, documentName }),\n originalDocumentTable.deleteItem({ workspaceId, documentName }),\n overridesTable.deleteItem({ workspaceId, documentName }),\n historyTable.deleteItem({ workspaceId, documentName }),\n authTable.deleteItem({ workspaceId, documentName }),\n ])\n },\n\n /**\n * Updates the name of an existing workspace.\n * Returns the updated workspace object, or undefined if the workspace does not exist.\n */\n updateName: async ({ namespace, slug }: Required<WorkspaceKey>, name: string) => {\n const workspace = await workspaceTable.getItem({ namespace, slug })\n if (!workspace) {\n return undefined\n }\n\n // Update the workspace name\n return await workspaceTable.addItem({ namespace, slug }, { ...workspace, name })\n },\n\n /**\n * Checks if a workspace with the given ID exists in the store.\n */\n has: async ({ namespace, slug }: Required<WorkspaceKey>): Promise<boolean> => {\n return (await workspaceTable.getItem({ namespace, slug })) !== undefined\n },\n },\n clear: async () => {\n await workspaceTable.deleteAll()\n },\n }\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/persistence/indexdb.ts"],
4
- "sourcesContent": ["import type { Static, TObject, TRecord } from '@scalar/typebox'\n\ntype TableEntry<S extends TObject, K extends readonly (keyof Static<S>)[]> = {\n schema: S\n keyPath: K\n indexes?: Record<string, readonly (keyof Static<S>)[]>\n}\n\n/**\n * Initializes and manages an IndexedDB database connection for table-based persistence.\n *\n * @param name - The database name. Defaults to 'scalar-workspace-store'.\n * @param tables - Table definitions: the tables to create and their key schemas.\n * @param version - The database version. Bump this to trigger upgrades (default: 1).\n * @param migrations - Optional migration steps to run for version upgrades.\n * @returns An object with the following methods:\n * - `get(tableName)` \u2014 Get a wrapper to interact with the object store for the given table name.\n * - `closeDatabase()` \u2014 Closes the database connection.\n *\n * Example usage:\n * ```ts\n * import { Type } from '@scalar/typebox'\n * import { createIndexDbConnection } from './indexdb'\n *\n * // Define a schema for a user\n * const UserSchema = Type.Object({\n * id: Type.String(),\n * name: Type.String(),\n * age: Type.Number(),\n * })\n *\n * // Define tables in the database\n * const dbConfig = {\n * users: {\n * schema: UserSchema,\n * index: ['id'] as const,\n * },\n * }\n *\n * // Open the database connection and get table API\n * const { get, closeDatabase } = await createIndexDbConnection({\n * name: 'my-app-db',\n * tables: dbConfig,\n * version: 1,\n * })\n *\n * // Get a strongly-typed users table API\n * const usersTable = get('users')\n *\n * // Add a user\n * await usersTable.addItem({ id: 'user-1' }, { name: 'Alice', age: 25 })\n *\n * // Retrieve a user by id\n * const user = await usersTable.getItem({ id: 'user-1' })\n *\n * // Don't forget to close the database when done!\n * closeDatabase()\n * ```\n */\nexport const createIndexDbConnection = async <T extends Record<string, TableEntry<any, readonly (keyof any)[]>>>({\n name = 'scalar-workspace-store',\n tables,\n version = 1,\n migrations = [],\n}: {\n name: string\n tables: T\n version: number\n migrations?: { version: number; exec: (db: IDBDatabase, event: IDBVersionChangeEvent) => {} }[]\n}) => {\n const db = indexedDB.open(name, version)\n\n db.onupgradeneeded = (e) => {\n // Initial setup of object stores\n if (e.oldVersion < 1) {\n const database = db.result\n\n // Initialize all the tables\n Object.entries(tables).forEach(([name, options]) => {\n if (!database.objectStoreNames.contains(name)) {\n const objectStore = database.createObjectStore(name, {\n keyPath: options.keyPath.length === 1 ? (options.keyPath[0] as string) : (options.keyPath as string[]),\n })\n\n // Create any indexes for the object store\n Object.entries(options.indexes ?? {}).forEach(([indexName, indexPath]) => {\n objectStore.createIndex(indexName, indexPath as string[])\n })\n }\n })\n }\n\n // Run any future migrations here\n migrations.forEach((migration) => {\n if (e.oldVersion < migration.version) {\n migration.exec(db.result, e)\n }\n })\n }\n\n await new Promise((resolve, reject) => {\n db.onsuccess = () => resolve(true)\n db.onerror = () => reject(db.error)\n })\n\n return {\n get: <Name extends keyof T>(name: Name) => {\n return createTableWrapper<T[Name]['schema'], T[Name]['keyPath'][number]>(name as string, db.result)\n },\n closeDatabase: () => {\n db.result.close()\n },\n }\n}\n\n/**\n * Utility wrapper for interacting with an IndexedDB object store, typed by the schema.\n *\n * Usage example:\n * ```\n * // Define a TypeBox schema for users\n * const UserSchema = Type.Object({\n * id: Type.String(),\n * name: Type.String(),\n * age: Type.Number(),\n * })\n * \n * // Open or create the users table\n * const usersTable = createTableWrapper<typeof UserSchema, 'id'>('users', openDatabase)\n * \n * // Add a user\n await usersTable.addItem({ id: 'user-1' }, { name: 'Alice', age: 24 })\n * \n * // Get a user by id\n * const alic = await usersTable.getItem({ id: 'user-1' })\n * \n * // Get users with a partial key (use [] if no composite key)\n * const users = await usersTable.getRange(['user-1'])\n * \n * // Get all users\n * const allUsers = await usersTable.getAll()\n * ```\n *\n * @template T TypeBox schema type for objects in the store\n * @template K Key property names that compose the primary key\n *\n * @param name - Object store name\n * @param getDb - Function returning a Promise for the IDBDatabase\n * @returns Methods to interact with the object store\n */\nfunction createTableWrapper<T extends TRecord | TObject, const K extends keyof Static<T>>(\n name: string,\n db: IDBDatabase,\n) {\n /**\n * Gets the object store from the latest DB connection, for the given transaction mode.\n */\n const getStore = (mode: IDBTransactionMode): IDBObjectStore => {\n const tx = db.transaction(name, mode)\n return tx.objectStore(name)\n }\n\n /**\n * Adds or updates an item in the store.\n * @param key - The primary key values, as { key1, key2 }\n * @param value - The value for the other properties, omitting keys\n * @returns The full inserted/updated object\n */\n async function addItem(key: Record<K, IDBValidKey>, value: Omit<Static<T>, K>): Promise<Static<T>> {\n const store = getStore('readwrite')\n const finalValue = { ...value, ...key }\n await requestAsPromise(store.put(finalValue))\n\n return finalValue\n }\n\n /**\n * Retrieves a single item by composite key.\n * @param key - Key values. For a single key: { id: '...' }\n * @returns The found object or undefined\n */\n function getItem(key: Record<K, IDBValidKey>): Promise<Static<T> | undefined> {\n const store = getStore('readonly')\n const keyValues = Object.values(key)\n // For single keys, pass value directly; for compound keys, pass array\n const keyToUse = keyValues.length === 1 ? keyValues[0] : keyValues\n return requestAsPromise(store.get(keyToUse as IDBValidKey))\n }\n\n /**\n * Returns all records matching a partial (prefix) key. Use for composite keys.\n * For non-compound keys, pass single-element array: getRange(['some-id'])\n * For prefix search, pass subset of key parts.\n * @param partialKey - Array of partial key values\n * @returns Matching objects\n *\n * Example (composite [a,b]):\n * getRange(['foo']) // All with a === 'foo'\n * getRange(['foo', 'bar']) // All with a === 'foo' and b === 'bar'\n */\n function getRange(partialKey: IDBValidKey[], indexName?: string): Promise<Static<T>[]> {\n const store = getStore('readonly')\n const objectStoreOrIndex = indexName ? store.index(indexName as string) : store\n\n const results: Static<T>[] = []\n\n // Construct upper bound to match all keys starting with partialKey\n const upperBound = [...partialKey]\n upperBound.push([]) // ensures upper bound includes all keys with this prefix\n const range = IDBKeyRange.bound(partialKey, upperBound, false, true)\n\n return new Promise((resolve, reject) => {\n const request = objectStoreOrIndex.openCursor(range)\n request.onerror = () => reject(request.error)\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result\n if (cursor) {\n results.push(cursor.value)\n cursor.continue()\n } else {\n resolve(results)\n }\n }\n })\n }\n\n /**\n * Deletes an item from the store by its composite key.\n * @param key - Key values. For a single key: { id: '...' }\n * @returns void\n */\n async function deleteItem(key: Record<K, IDBValidKey>): Promise<void> {\n const store = getStore('readwrite')\n const keyValues = Object.values(key)\n // For single keys, pass value directly; for compound keys, pass array\n const keyToUse = keyValues.length === 1 ? keyValues[0] : keyValues\n await requestAsPromise(store.delete(keyToUse as IDBValidKey))\n }\n\n /**\n * Deletes all records matching a partial (prefix) key. Use for composite keys.\n * For non-compound keys, pass single-element array: deleteRange(['some-id'])\n * For prefix deletion, pass subset of key parts.\n * @param partialKey - Array of partial key values\n * @returns Number of deleted items\n *\n * Example (composite [a,b]):\n * deleteRange(['foo']) // Delete all with a === 'foo'\n * deleteRange(['foo', 'bar']) // Delete all with a === 'foo' and b === 'bar'\n */\n function deleteRange(partialKey: IDBValidKey[]): Promise<number> {\n const store = getStore('readwrite')\n let deletedCount = 0\n\n // Construct upper bound to match all keys starting with partialKey\n const upperBound = [...partialKey]\n upperBound.push([]) // ensures upper bound includes all keys with this prefix\n const range = IDBKeyRange.bound(partialKey, upperBound, false, true)\n\n return new Promise((resolve, reject) => {\n const request = store.openCursor(range)\n request.onerror = () => reject(request.error)\n request.onsuccess = (event) => {\n const cursor = (event.target as IDBRequest<IDBCursorWithValue>).result\n if (cursor) {\n cursor.delete()\n deletedCount++\n cursor.continue()\n } else {\n resolve(deletedCount)\n }\n }\n })\n }\n\n /**\n * Deletes all items from the table.\n * @returns void\n */\n async function deleteAll(): Promise<void> {\n const store = getStore('readwrite')\n await requestAsPromise(store.clear())\n }\n\n /**\n * Retrieves all items from the table.\n * @returns Array of all objects in the store\n */\n function getAll(): Promise<Static<T>[]> {\n const store = getStore('readonly')\n return requestAsPromise(store.getAll())\n }\n\n return {\n addItem,\n getItem,\n getRange,\n deleteItem,\n deleteRange,\n getAll,\n deleteAll,\n }\n}\n\n// ---- Utility ----\nfunction requestAsPromise<T>(req: IDBRequest<T>): Promise<T> {\n return new Promise((resolve, reject) => {\n req.onsuccess = () => resolve(req.result)\n req.onerror = () => reject(req.error)\n })\n}\n"],
5
- "mappings": "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",
6
- "names": ["name"]
7
- }