@scalar/workspace-store 0.49.3 → 0.51.1

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 (152) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/dist/client.d.ts +2 -3
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +58 -25
  5. package/dist/entities/auth/schema.d.ts +25 -5
  6. package/dist/entities/auth/schema.d.ts.map +1 -1
  7. package/dist/events/bus.d.ts +70 -0
  8. package/dist/events/bus.d.ts.map +1 -1
  9. package/dist/events/bus.js +48 -11
  10. package/dist/events/definitions/analytics.d.ts +0 -12
  11. package/dist/events/definitions/analytics.d.ts.map +1 -1
  12. package/dist/events/definitions/auth.d.ts +44 -6
  13. package/dist/events/definitions/auth.d.ts.map +1 -1
  14. package/dist/events/definitions/index.d.ts +3 -2
  15. package/dist/events/definitions/index.d.ts.map +1 -1
  16. package/dist/events/definitions/log.d.ts +18 -0
  17. package/dist/events/definitions/log.d.ts.map +1 -0
  18. package/dist/events/definitions/log.js +1 -0
  19. package/dist/events/definitions/operation.d.ts +1 -1
  20. package/dist/events/definitions/operation.d.ts.map +1 -1
  21. package/dist/events/definitions/ui.d.ts +18 -1
  22. package/dist/events/definitions/ui.d.ts.map +1 -1
  23. package/dist/events/index.d.ts +1 -1
  24. package/dist/events/index.d.ts.map +1 -1
  25. package/dist/helpers/get-resolved-ref.d.ts +6 -0
  26. package/dist/helpers/get-resolved-ref.d.ts.map +1 -1
  27. package/dist/helpers/get-resolved-ref.js +9 -0
  28. package/dist/helpers/is-hidden.d.ts +8 -0
  29. package/dist/helpers/is-hidden.d.ts.map +1 -0
  30. package/dist/helpers/is-hidden.js +5 -0
  31. package/dist/helpers/merge-object.d.ts +1 -1
  32. package/dist/helpers/merge-object.d.ts.map +1 -1
  33. package/dist/mutators/auth.d.ts +22 -3
  34. package/dist/mutators/auth.d.ts.map +1 -1
  35. package/dist/mutators/auth.js +213 -37
  36. package/dist/mutators/cookie.d.ts.map +1 -1
  37. package/dist/mutators/cookie.js +3 -2
  38. package/dist/mutators/document.d.ts.map +1 -1
  39. package/dist/mutators/document.js +5 -4
  40. package/dist/mutators/environment.d.ts.map +1 -1
  41. package/dist/mutators/environment.js +12 -5
  42. package/dist/mutators/index.d.ts +4 -0
  43. package/dist/mutators/index.d.ts.map +1 -1
  44. package/dist/mutators/operation/body.d.ts.map +1 -1
  45. package/dist/mutators/operation/body.js +6 -2
  46. package/dist/mutators/operation/extensions.d.ts.map +1 -1
  47. package/dist/mutators/operation/extensions.js +5 -1
  48. package/dist/mutators/operation/history.d.ts.map +1 -1
  49. package/dist/mutators/operation/history.js +7 -3
  50. package/dist/mutators/operation/operation.d.ts.map +1 -1
  51. package/dist/mutators/operation/operation.js +15 -10
  52. package/dist/mutators/operation/parameters.d.ts.map +1 -1
  53. package/dist/mutators/operation/parameters.js +12 -5
  54. package/dist/mutators/server.d.ts.map +1 -1
  55. package/dist/mutators/server.js +2 -1
  56. package/dist/mutators/tag.d.ts.map +1 -1
  57. package/dist/mutators/tag.js +9 -4
  58. package/dist/navigation/get-navigation-options.d.ts +1 -1
  59. package/dist/navigation/get-navigation-options.d.ts.map +1 -1
  60. package/dist/navigation/get-navigation-options.js +1 -0
  61. package/dist/navigation/helpers/get-openapi-object.d.ts.map +1 -1
  62. package/dist/navigation/helpers/get-openapi-object.js +5 -0
  63. package/dist/navigation/helpers/traverse-document.d.ts.map +1 -1
  64. package/dist/navigation/helpers/traverse-document.js +8 -2
  65. package/dist/navigation/helpers/traverse-paths.d.ts +4 -2
  66. package/dist/navigation/helpers/traverse-paths.d.ts.map +1 -1
  67. package/dist/navigation/helpers/traverse-paths.js +9 -6
  68. package/dist/navigation/helpers/traverse-schemas.d.ts.map +1 -1
  69. package/dist/navigation/helpers/traverse-schemas.js +9 -4
  70. package/dist/navigation/helpers/traverse-tags.d.ts.map +1 -1
  71. package/dist/navigation/helpers/traverse-tags.js +2 -1
  72. package/dist/navigation/helpers/traverse-webhooks.d.ts.map +1 -1
  73. package/dist/navigation/helpers/traverse-webhooks.js +4 -3
  74. package/dist/navigation/helpers/update-order-ids.d.ts.map +1 -1
  75. package/dist/navigation/helpers/update-order-ids.js +4 -1
  76. package/dist/navigation/types.d.ts +4 -0
  77. package/dist/navigation/types.d.ts.map +1 -1
  78. package/dist/persistence/index.d.ts +123 -80
  79. package/dist/persistence/index.d.ts.map +1 -1
  80. package/dist/persistence/index.js +233 -167
  81. package/dist/persistence/migrations/v2-team-to-local.d.ts +22 -5
  82. package/dist/persistence/migrations/v2-team-to-local.d.ts.map +1 -1
  83. package/dist/persistence/migrations/v2-team-to-local.js +195 -137
  84. package/dist/request-example/builder/body/build-request-body.d.ts.map +1 -1
  85. package/dist/request-example/builder/body/build-request-body.js +66 -2
  86. package/dist/request-example/builder/build-request.d.ts +24 -3
  87. package/dist/request-example/builder/build-request.d.ts.map +1 -1
  88. package/dist/request-example/builder/build-request.js +89 -18
  89. package/dist/request-example/builder/index.d.ts +2 -1
  90. package/dist/request-example/builder/index.d.ts.map +1 -1
  91. package/dist/request-example/builder/index.js +2 -1
  92. package/dist/request-example/builder/request-factory.d.ts.map +1 -1
  93. package/dist/request-example/builder/request-factory.js +5 -8
  94. package/dist/request-example/builder/resolve-request-factory-url.d.ts +18 -1
  95. package/dist/request-example/builder/resolve-request-factory-url.d.ts.map +1 -1
  96. package/dist/request-example/builder/resolve-request-factory-url.js +29 -4
  97. package/dist/request-example/context/environment.d.ts.map +1 -1
  98. package/dist/request-example/context/environment.js +2 -1
  99. package/dist/request-example/context/get-request-example-context.d.ts.map +1 -1
  100. package/dist/request-example/context/get-request-example-context.js +7 -0
  101. package/dist/request-example/context/headers.d.ts +28 -13
  102. package/dist/request-example/context/headers.d.ts.map +1 -1
  103. package/dist/request-example/context/headers.js +84 -19
  104. package/dist/request-example/context/index.d.ts +1 -0
  105. package/dist/request-example/context/index.d.ts.map +1 -1
  106. package/dist/request-example/context/index.js +1 -0
  107. package/dist/request-example/context/security/get-selected-security.d.ts.map +1 -1
  108. package/dist/request-example/context/security/get-selected-security.js +3 -6
  109. package/dist/request-example/context/servers.d.ts.map +1 -1
  110. package/dist/request-example/context/servers.js +3 -3
  111. package/dist/request-example/index.d.ts +3 -3
  112. package/dist/request-example/index.d.ts.map +1 -1
  113. package/dist/request-example/index.js +2 -2
  114. package/dist/resolve.d.ts.map +1 -1
  115. package/dist/resolve.js +1 -8
  116. package/dist/schemas/extensions/document/x-scalar-environments.d.ts +6 -6
  117. package/dist/schemas/extensions/document/x-scalar-original-source-url.d.ts +15 -0
  118. package/dist/schemas/extensions/document/x-scalar-original-source-url.d.ts.map +1 -0
  119. package/dist/schemas/extensions/document/x-scalar-original-source-url.js +16 -0
  120. package/dist/schemas/extensions/operation/x-badge.d.ts +2 -2
  121. package/dist/schemas/extensions/operation/x-scalar-stability.d.ts +1 -1
  122. package/dist/schemas/extensions/schema/x-enum-descriptions.d.ts +2 -2
  123. package/dist/schemas/extensions/security/x-scalar-credentials-location.d.ts +1 -1
  124. package/dist/schemas/extensions/security/x-use-pkce.d.ts +1 -1
  125. package/dist/schemas/extensions/workspace/x-scalar-active-proxy.d.ts +1 -1
  126. package/dist/schemas/inmemory-workspace.d.ts +3 -4631
  127. package/dist/schemas/inmemory-workspace.d.ts.map +1 -1
  128. package/dist/schemas/inmemory-workspace.js +1 -15
  129. package/dist/schemas/reference-config/index.d.ts +6 -2
  130. package/dist/schemas/reference-config/index.d.ts.map +1 -1
  131. package/dist/schemas/reference-config/settings.d.ts +5 -1
  132. package/dist/schemas/reference-config/settings.d.ts.map +1 -1
  133. package/dist/schemas/type-guards.d.ts +24 -0
  134. package/dist/schemas/type-guards.d.ts.map +1 -0
  135. package/dist/schemas/type-guards.js +30 -0
  136. package/dist/schemas/v3.1/openapi/index.d.ts +4 -3
  137. package/dist/schemas/v3.1/openapi/index.d.ts.map +1 -1
  138. package/dist/schemas/v3.1/openapi/index.js +2 -3
  139. package/dist/schemas/v3.1/strict/encoding.d.ts +12 -0
  140. package/dist/schemas/v3.1/strict/encoding.d.ts.map +1 -1
  141. package/dist/schemas/v3.1/strict/encoding.js +11 -0
  142. package/dist/schemas/v3.1/strict/openapi-document.d.ts +179 -39
  143. package/dist/schemas/v3.1/strict/openapi-document.d.ts.map +1 -1
  144. package/dist/schemas/v3.1/strict/openapi-document.js +2 -2
  145. package/dist/schemas/workspace-specification/index.d.ts +1 -1
  146. package/dist/schemas/workspace.d.ts +4 -4377
  147. package/dist/schemas/workspace.d.ts.map +1 -1
  148. package/dist/schemas/workspace.js +0 -8
  149. package/dist/schemas.d.ts +2 -1
  150. package/dist/schemas.d.ts.map +1 -1
  151. package/dist/schemas.js +1 -1
  152. package/package.json +8 -7
@@ -7,6 +7,7 @@ import { syncParametersForPathChange } from '../../mutators/operation/helpers/sy
7
7
  import { getOperationEntries } from '../../navigation/index.js';
8
8
  import { getNavigationOptions } from '../../navigation/get-navigation-options.js';
9
9
  import { updateOrderIds } from '../../navigation/helpers/update-order-ids.js';
10
+ import { isOpenApiDocument } from '../../schemas/type-guards.js';
10
11
  /**
11
12
  * Creates a new operation at a specific path and method in the document.
12
13
  * Automatically normalizes the path to ensure it starts with a slash.
@@ -25,7 +26,7 @@ import { updateOrderIds } from '../../navigation/helpers/update-order-ids.js';
25
26
  */
26
27
  export const createOperation = (workspaceStore, payload) => {
27
28
  const document = workspaceStore?.workspace.documents[payload.documentName];
28
- if (!document) {
29
+ if (!isOpenApiDocument(document)) {
29
30
  payload.callback?.(false);
30
31
  return undefined;
31
32
  }
@@ -83,7 +84,7 @@ export const createOperation = (workspaceStore, payload) => {
83
84
  * ```
84
85
  */
85
86
  export const updateOperationMeta = (store, document, { meta, payload }) => {
86
- if (!document || !store) {
87
+ if (!store || !isOpenApiDocument(document)) {
87
88
  return;
88
89
  }
89
90
  const documentName = document['x-scalar-navigation']?.name;
@@ -130,14 +131,18 @@ export const updateOperationPathMethod = (document, store, { meta, payload: { me
130
131
  // Determine the final method and path
131
132
  const finalMethod = methodChanged ? method : meta.method;
132
133
  const finalPath = pathChanged ? path : meta.path;
134
+ if (!store || !isOpenApiDocument(document)) {
135
+ console.error('Document or workspace not found', { document });
136
+ return;
137
+ }
133
138
  // Check for conflicts at the target location
134
- if (document?.paths?.[finalPath]?.[finalMethod]) {
139
+ if (document.paths?.[finalPath]?.[finalMethod]) {
135
140
  callback('conflict', blurTargetSelector);
136
141
  return;
137
142
  }
138
- const documentNavigation = document?.['x-scalar-navigation'];
139
- if (!documentNavigation || !store) {
140
- console.error('Document or workspace not found', { document });
143
+ const documentNavigation = document['x-scalar-navigation'];
144
+ if (!documentNavigation) {
145
+ console.error('Document navigation missing', { document });
141
146
  return;
142
147
  }
143
148
  const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method]);
@@ -207,7 +212,7 @@ export const updateOperationPathMethod = (document, store, { meta, payload: { me
207
212
  */
208
213
  export const deleteOperation = (workspace, { meta, documentName }) => {
209
214
  const document = workspace?.workspace.documents[documentName];
210
- if (!document) {
215
+ if (!isOpenApiDocument(document)) {
211
216
  return;
212
217
  }
213
218
  preventPollution(meta.path);
@@ -227,7 +232,7 @@ export const deleteOperation = (workspace, { meta, documentName }) => {
227
232
  */
228
233
  export const createOperationDraftExample = (workspace, { meta: { path, method }, documentName, exampleName }) => {
229
234
  const document = workspace?.workspace.documents[documentName];
230
- if (!document) {
235
+ if (!isOpenApiDocument(document)) {
231
236
  console.error('Document not found', { documentName });
232
237
  return;
233
238
  }
@@ -255,7 +260,7 @@ export const createOperationDraftExample = (workspace, { meta: { path, method },
255
260
  export const deleteOperationExample = (workspace, { meta: { path, method, exampleKey }, documentName }) => {
256
261
  // Find the document in workspace based on documentName
257
262
  const document = workspace?.workspace.documents[documentName];
258
- if (!document) {
263
+ if (!isOpenApiDocument(document)) {
259
264
  return;
260
265
  }
261
266
  // Get the operation object for the given path and method
@@ -306,7 +311,7 @@ export const deleteOperationExample = (workspace, { meta: { path, method, exampl
306
311
  */
307
312
  export const renameOperationExample = (workspace, { meta: { path, method, exampleKey }, documentName, payload }) => {
308
313
  const document = workspace?.workspace.documents[documentName];
309
- if (!document) {
314
+ if (!isOpenApiDocument(document)) {
310
315
  return;
311
316
  }
312
317
  const operation = getResolvedRef(document.paths?.[path]?.[method]);
@@ -1 +1 @@
1
- {"version":3,"file":"parameters.d.ts","sourceRoot":"","sources":["../../../src/mutators/operation/parameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAGrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAKlD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,wBAAwB,GACnC,UAAU,iBAAiB,GAAG,IAAI,EAClC,4CAA4C,eAAe,CAAC,4BAA4B,CAAC,SA+C1F,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,8BAA8B,GACzC,UAAU,iBAAiB,GAAG,IAAI,EAClC,uCAAuC,eAAe,CAAC,mCAAmC,CAAC,SA8C5F,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,wBAAwB,GACnC,UAAU,iBAAiB,GAAG,IAAI,EAClC,6BAA6B,eAAe,CAAC,4BAA4B,CAAC,SA0B3E,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,4BAA4B,GACvC,UAAU,iBAAiB,GAAG,IAAI,EAClC,gBAAgB,eAAe,CAAC,iCAAiC,CAAC,SAanE,CAAA"}
1
+ {"version":3,"file":"parameters.d.ts","sourceRoot":"","sources":["../../../src/mutators/operation/parameters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAGrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAMlD;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,wBAAwB,GACnC,UAAU,iBAAiB,GAAG,IAAI,EAClC,4CAA4C,eAAe,CAAC,4BAA4B,CAAC,SAkD1F,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,8BAA8B,GACzC,UAAU,iBAAiB,GAAG,IAAI,EAClC,uCAAuC,eAAe,CAAC,mCAAmC,CAAC,SA8C5F,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,wBAAwB,GACnC,UAAU,iBAAiB,GAAG,IAAI,EAClC,6BAA6B,eAAe,CAAC,4BAA4B,CAAC,SA6B3E,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,4BAA4B,GACvC,UAAU,iBAAiB,GAAG,IAAI,EAClC,gBAAgB,eAAe,CAAC,iCAAiC,CAAC,SAanE,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { getResolvedRef } from '../../helpers/get-resolved-ref.js';
2
2
  import { unpackProxyObject } from '../../helpers/unpack-proxy.js';
3
+ import { isOpenApiDocument } from '../../schemas/type-guards.js';
3
4
  /**
4
5
  * Updates an existing parameter of a given `type` by its index within that
5
6
  * type subset (e.g. the N-th query parameter). Supports updating name, value,
@@ -38,7 +39,10 @@ export const upsertOperationParameter = (document, { meta, type, payload, origin
38
39
  return;
39
40
  }
40
41
  // We are adding a new parameter
41
- const operation = getResolvedRef(document?.paths?.[meta.path]?.[meta.method]);
42
+ if (!isOpenApiDocument(document)) {
43
+ return;
44
+ }
45
+ const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method]);
42
46
  if (!operation) {
43
47
  console.error('Operation not found', { meta, document });
44
48
  return;
@@ -76,7 +80,7 @@ export const upsertOperationParameter = (document, { meta, type, payload, origin
76
80
  */
77
81
  export const updateOperationExtraParameters = (document, { type, meta, payload, in: location }) => {
78
82
  // Ensure there's a valid document
79
- if (!document) {
83
+ if (!isOpenApiDocument(document)) {
80
84
  return;
81
85
  }
82
86
  // Resolve the referenced operation from the document using the path and method
@@ -123,7 +127,10 @@ export const updateOperationExtraParameters = (document, { type, meta, payload,
123
127
  * ```
124
128
  */
125
129
  export const deleteOperationParameter = (document, { meta, originalParameter }) => {
126
- const operation = getResolvedRef(document?.paths?.[meta.path]?.[meta.method]);
130
+ if (!isOpenApiDocument(document)) {
131
+ return;
132
+ }
133
+ const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method]);
127
134
  // Lets check if its on the operation first as its more likely
128
135
  const operationIndex = operation?.parameters?.findIndex((it) => getResolvedRef(it) === originalParameter) ?? -1;
129
136
  // We cannot call splice on a proxy object, so we unwrap the array and filter it
@@ -132,7 +139,7 @@ export const deleteOperationParameter = (document, { meta, originalParameter })
132
139
  return;
133
140
  }
134
141
  // If it wasn't on the operation it might be on the path
135
- const path = getResolvedRef(document?.paths?.[meta.path]);
142
+ const path = getResolvedRef(document.paths?.[meta.path]);
136
143
  const pathIndex = path?.parameters?.findIndex((it) => getResolvedRef(it) === originalParameter) ?? -1;
137
144
  if (path && pathIndex >= 0) {
138
145
  path.parameters = unpackProxyObject(path.parameters?.filter((_, i) => i !== pathIndex), { depth: 1 });
@@ -152,7 +159,7 @@ export const deleteOperationParameter = (document, { meta, originalParameter })
152
159
  * ```
153
160
  */
154
161
  export const deleteAllOperationParameters = (document, { meta, type }) => {
155
- if (!document) {
162
+ if (!isOpenApiDocument(document)) {
156
163
  return;
157
164
  }
158
165
  const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method]);
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mutators/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,6BAA6B,CAAA;AAI3E,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,wCAAwC,CAAA;AAC9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAyB5D;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAC5B,UAAU,iBAAiB,GAAG,IAAI,EAClC,UAAU,YAAY,CAAC,2BAA2B,CAAC,+BAUpD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GACpB,UAAU,iBAAiB,GAAG,IAAI,EAClC,uBAAuB,YAAY,CAAC,mBAAmB,CAAC,KACvD,YAAY,GAAG,SAmBjB,CAAA;AAgFD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,iBAAiB,GAAG,IAAI,EAClC,yBAAyB,YAAY,CAAC,sBAAsB,CAAC,KAC5D,YAAY,GAAG,SAgCjB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,iBAAiB,GAAG,IAAI,EAClC,iBAAiB,YAAY,CAAC,sBAAsB,CAAC,SAatD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,UAAU,iBAAiB,GAAG,IAAI,EAAE,UAAU,YAAY,CAAC,sBAAsB,CAAC,SAS9G,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,GAChC,UAAU,iBAAiB,GAAG,IAAI,EAClC,6BAA6B,YAAY,CAAC,yBAAyB,CAAC,sFAWrE,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,GAC/B,UAAU,iBAAiB,GAAG,IAAI,EAClC,eAAe,YAAY,CAAC,wBAAwB,CAAC,KACpD,MAAM,GAAG,SAaX,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,cAAc;IAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAA;CAAE;iCAEzD,YAAY,CAAC,2BAA2B,CAAC;yBACjD,YAAY,CAAC,mBAAmB,CAAC;4BAC9B,YAAY,CAAC,sBAAsB,CAAC;4BACpC,YAAY,CAAC,sBAAsB,CAAC;4BACpC,YAAY,CAAC,sBAAsB,CAAC;qCAC3B,YAAY,CAAC,yBAAyB,CAAC;oCAExC,YAAY,CAAC,wBAAwB,CAAC;CAEzE,CAAA"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mutators/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,6BAA6B,CAAA;AAK3E,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,wCAAwC,CAAA;AAC9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAyB5D;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,GAC5B,UAAU,iBAAiB,GAAG,IAAI,EAClC,UAAU,YAAY,CAAC,2BAA2B,CAAC,+BAUpD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GACpB,UAAU,iBAAiB,GAAG,IAAI,EAClC,uBAAuB,YAAY,CAAC,mBAAmB,CAAC,KACvD,YAAY,GAAG,SAmBjB,CAAA;AAgFD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,iBAAiB,GAAG,IAAI,EAClC,yBAAyB,YAAY,CAAC,sBAAsB,CAAC,KAC5D,YAAY,GAAG,SAgCjB,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,iBAAiB,GAAG,IAAI,EAClC,iBAAiB,YAAY,CAAC,sBAAsB,CAAC,SAatD,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,UAAU,iBAAiB,GAAG,IAAI,EAAE,UAAU,YAAY,CAAC,sBAAsB,CAAC,SAS9G,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,GAChC,UAAU,iBAAiB,GAAG,IAAI,EAClC,6BAA6B,YAAY,CAAC,yBAAyB,CAAC,sFAWrE,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,GAC/B,UAAU,iBAAiB,GAAG,IAAI,EAClC,eAAe,YAAY,CAAC,wBAAwB,CAAC,KACpD,MAAM,GAAG,SAaX,CAAA;AAED,eAAO,MAAM,qBAAqB,GAAI,cAAc;IAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAA;CAAE;iCAEzD,YAAY,CAAC,2BAA2B,CAAC;yBACjD,YAAY,CAAC,mBAAmB,CAAC;4BAC9B,YAAY,CAAC,sBAAsB,CAAC;4BACpC,YAAY,CAAC,sBAAsB,CAAC;4BACpC,YAAY,CAAC,sBAAsB,CAAC;qCAC3B,YAAY,CAAC,yBAAyB,CAAC;oCAExC,YAAY,CAAC,wBAAwB,CAAC;CAEzE,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { findVariables } from '@scalar/helpers/regex/find-variables';
2
2
  import { getResolvedRef } from '../helpers/get-resolved-ref.js';
3
3
  import { unpackProxyObject } from '../helpers/unpack-proxy.js';
4
+ import { isOpenApiDocument } from '../schemas/type-guards.js';
4
5
  import { coerceValue } from '../schemas/typebox-coerce.js';
5
6
  import { ServerObjectSchema } from '../schemas/v3.1/strict/openapi-document.js';
6
7
  /**
@@ -8,7 +9,7 @@ import { ServerObjectSchema } from '../schemas/v3.1/strict/openapi-document.js';
8
9
  * Document-level servers live on the document; operation-level servers on the operation object.
9
10
  */
10
11
  const getServerTarget = (document, meta) => {
11
- if (!document) {
12
+ if (!isOpenApiDocument(document)) {
12
13
  return null;
13
14
  }
14
15
  if (meta.type === 'document') {
@@ -1 +1 @@
1
- {"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../src/mutators/tag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAOzD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GAAI,OAAO,cAAc,GAAG,IAAI,EAAE,SAAS,SAAS,CAAC,gBAAgB,CAAC,SAe3F,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,OAAO,GAAI,OAAO,cAAc,GAAG,IAAI,EAAE,SAAS,SAAS,CAAC,cAAc,CAAC,SAiEvF,CAAA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,GAAI,WAAW,cAAc,GAAG,IAAI,EAAE,SAAS,SAAS,CAAC,gBAAgB,CAAC,SAwC/F,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,WAAW;IAAE,KAAK,EAAE,cAAc,GAAG,IAAI,CAAA;CAAE;yBAErD,SAAS,CAAC,gBAAgB,CAAC;uBAC7B,SAAS,CAAC,cAAc,CAAC;yBACvB,SAAS,CAAC,gBAAgB,CAAC;CAEnD,CAAA"}
1
+ {"version":3,"file":"tag.d.ts","sourceRoot":"","sources":["../../src/mutators/tag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAQzD;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GAAI,OAAO,cAAc,GAAG,IAAI,EAAE,SAAS,SAAS,CAAC,gBAAgB,CAAC,SAe3F,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,OAAO,GAAI,OAAO,cAAc,GAAG,IAAI,EAAE,SAAS,SAAS,CAAC,cAAc,CAAC,SAqEvF,CAAA;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,SAAS,GAAI,WAAW,cAAc,GAAG,IAAI,EAAE,SAAS,SAAS,CAAC,gBAAgB,CAAC,SAwC/F,CAAA;AAED,eAAO,MAAM,kBAAkB,GAAI,WAAW;IAAE,KAAK,EAAE,cAAc,GAAG,IAAI,CAAA;CAAE;yBAErD,SAAS,CAAC,gBAAgB,CAAC;uBAC7B,SAAS,CAAC,cAAc,CAAC;yBACvB,SAAS,CAAC,gBAAgB,CAAC;CAEnD,CAAA"}
@@ -3,6 +3,7 @@ import { unpackProxyObject } from '../helpers/unpack-proxy.js';
3
3
  import { getNavigationOptions } from '../navigation/get-navigation-options.js';
4
4
  import { getTagEntries } from '../navigation/helpers/get-tag-entries.js';
5
5
  import { updateOrderIds } from '../navigation/helpers/update-order-ids.js';
6
+ import { isOpenApiDocument } from '../schemas/type-guards.js';
6
7
  /**
7
8
  * Adds a new tag to the WorkspaceDocument's `tags` array.
8
9
  *
@@ -13,7 +14,7 @@ import { updateOrderIds } from '../navigation/helpers/update-order-ids.js';
13
14
  */
14
15
  export const createTag = (store, payload) => {
15
16
  const document = store?.workspace.documents[payload.documentName];
16
- if (!document) {
17
+ if (!isOpenApiDocument(document)) {
17
18
  console.error('Document not found', { payload, store });
18
19
  return;
19
20
  }
@@ -32,11 +33,15 @@ export const createTag = (store, payload) => {
32
33
  */
33
34
  export const editTag = (store, payload) => {
34
35
  const document = store?.workspace.documents[payload.documentName];
35
- const documentNavigation = document?.['x-scalar-navigation'];
36
- if (!document || !documentNavigation) {
36
+ if (!store || !isOpenApiDocument(document)) {
37
37
  console.error('Document not found', { payload, store });
38
38
  return;
39
39
  }
40
+ const documentNavigation = document['x-scalar-navigation'];
41
+ if (!documentNavigation) {
42
+ console.error('Document navigation missing', { payload, store });
43
+ return;
44
+ }
40
45
  const oldName = payload.tag.name;
41
46
  const newName = payload.newName;
42
47
  if (document.tags?.length) {
@@ -99,7 +104,7 @@ export const editTag = (store, payload) => {
99
104
  */
100
105
  export const deleteTag = (workspace, payload) => {
101
106
  const document = workspace?.workspace.documents[payload.documentName];
102
- if (!document) {
107
+ if (!isOpenApiDocument(document)) {
103
108
  return;
104
109
  }
105
110
  // Clear tags from all operations that have this tag
@@ -1,6 +1,6 @@
1
1
  import type { ApiReferenceConfigurationRaw } from '@scalar/types/api-reference';
2
2
  import type { TraverseSpecOptions } from '../navigation/types.js';
3
- export type NavigationOptions = Partial<Pick<ApiReferenceConfigurationRaw, 'generateHeadingSlug' | 'generateTagSlug' | 'generateOperationSlug' | 'generateWebhookSlug' | 'generateModelSlug' | 'operationsSorter' | 'tagsSorter' | 'hideModels'>> | undefined;
3
+ export type NavigationOptions = Partial<Pick<ApiReferenceConfigurationRaw, 'generateHeadingSlug' | 'generateTagSlug' | 'generateOperationSlug' | 'generateWebhookSlug' | 'generateModelSlug' | 'operationsSorter' | 'tagsSorter' | 'hideModels' | 'operationTitleSource'>> | undefined;
4
4
  /**
5
5
  * Returns options for traversing an OpenAPI document, allowing customization of
6
6
  * how IDs and slugs are generated for tags, headings, models, operations, and webhooks.
@@ -1 +1 @@
1
- {"version":3,"file":"get-navigation-options.d.ts","sourceRoot":"","sources":["../../src/navigation/get-navigation-options.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAA;AAE/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAG7D,MAAM,MAAM,iBAAiB,GACzB,OAAO,CACL,IAAI,CACF,4BAA4B,EAC1B,qBAAqB,GACrB,iBAAiB,GACjB,uBAAuB,GACvB,qBAAqB,GACrB,mBAAmB,GACnB,kBAAkB,GAClB,YAAY,GACZ,YAAY,CACf,CACF,GACD,SAAS,CAAA;AAEb;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,cAAc,MAAM,EAAE,UAAU,iBAAiB,KAAG,mBAiHxF,CAAA"}
1
+ {"version":3,"file":"get-navigation-options.d.ts","sourceRoot":"","sources":["../../src/navigation/get-navigation-options.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAA;AAE/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAG7D,MAAM,MAAM,iBAAiB,GACzB,OAAO,CACL,IAAI,CACF,4BAA4B,EAC1B,qBAAqB,GACrB,iBAAiB,GACjB,uBAAuB,GACvB,qBAAqB,GACrB,mBAAmB,GACnB,kBAAkB,GAClB,YAAY,GACZ,YAAY,GACZ,sBAAsB,CACzB,CACF,GACD,SAAS,CAAA;AAEb;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAAI,cAAc,MAAM,EAAE,UAAU,iBAAiB,KAAG,mBAkHxF,CAAA"}
@@ -96,6 +96,7 @@ export const getNavigationOptions = (documentName, options) => {
96
96
  hideModels: options?.hideModels ?? false,
97
97
  operationsSorter: options?.operationsSorter,
98
98
  tagsSorter: options?.tagsSorter,
99
+ operationTitleSource: options?.operationTitleSource,
99
100
  generateId,
100
101
  };
101
102
  };
@@ -1 +1 @@
1
- {"version":3,"file":"get-openapi-object.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/get-openapi-object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAE9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAC/G,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAIxF,KAAK,kBAAkB,GAAG,iBAAiB,GAAG,YAAY,GAAG,kBAAkB,CAAA;AAE/E,KAAK,gBAAgB,CAAC,KAAK,SAAS,kBAAkB,IAAI,KAAK,SAAS,iBAAiB,GACrF,iBAAiB,GACjB,KAAK,SAAS,YAAY,GACxB,SAAS,GACT,KAAK,SAAS,kBAAkB,GAC9B,eAAe,GACf,KAAK,CAAA;AAEb,0EAA0E;AAC1E,eAAO,MAAM,YAAY,GAAI,OAAO,cAAc,KAAG,KAAK,IAAI,kBACmB,CAAA;AAEjF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,gBAAgB,GAAI,KAAK,SAAS,kBAAkB,EAAE,mBAGhE;IACD,KAAK,EAAE,cAAc,CAAA;IACrB,KAAK,EAAE,KAAK,CAAA;CACb,KAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,IA2B7B,CAAA"}
1
+ {"version":3,"file":"get-openapi-object.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/get-openapi-object.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAE9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAE/G,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAIxF,KAAK,kBAAkB,GAAG,iBAAiB,GAAG,YAAY,GAAG,kBAAkB,CAAA;AAE/E,KAAK,gBAAgB,CAAC,KAAK,SAAS,kBAAkB,IAAI,KAAK,SAAS,iBAAiB,GACrF,iBAAiB,GACjB,KAAK,SAAS,YAAY,GACxB,SAAS,GACT,KAAK,SAAS,kBAAkB,GAC9B,eAAe,GACf,KAAK,CAAA;AAEb,0EAA0E;AAC1E,eAAO,MAAM,YAAY,GAAI,OAAO,cAAc,KAAG,KAAK,IAAI,kBACmB,CAAA;AAEjF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,gBAAgB,GAAI,KAAK,SAAS,kBAAkB,EAAE,mBAGhE;IACD,KAAK,EAAE,cAAc,CAAA;IACrB,KAAK,EAAE,KAAK,CAAA;CACb,KAAG,gBAAgB,CAAC,KAAK,CAAC,GAAG,IAgC7B,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { getResolvedRef } from '../../helpers/get-resolved-ref.js';
2
+ import { isOpenApiDocument } from '../../schemas/type-guards.js';
2
3
  import { getParentEntry } from './get-parent-entry.js';
3
4
  /** Type guard which checks if the entry has an x-scalar-order property */
4
5
  export const canHaveOrder = (entry) => entry.type === 'document' || entry.type === 'tag' || entry.type === 'operation';
@@ -35,6 +36,10 @@ export const getOpenapiObject = ({ store, entry, }) => {
35
36
  if (entry.type === 'document') {
36
37
  return document;
37
38
  }
39
+ // Tag and operation lookups only make sense on OpenAPI documents.
40
+ if (!isOpenApiDocument(document)) {
41
+ return null;
42
+ }
38
43
  if (entry.type === 'tag') {
39
44
  // Find the tag by name in the document's tags array
40
45
  return document.tags?.find((tag) => tag.name === entry.name) ?? null;
@@ -1 +1 @@
1
- {"version":3,"file":"traverse-document.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-document.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,iBAAiB,EAAwB,MAAM,qCAAqC,CAAA;AAElG,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AAQ7E;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,GAAI,cAAc,MAAM,EAAE,UAAU,eAAe,EAAE,UAAU,iBAAiB;;;;;;;CAoH5G,CAAA"}
1
+ {"version":3,"file":"traverse-document.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-document.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,iBAAiB,EAAwB,MAAM,qCAAqC,CAAA;AAElG,OAAO,KAAK,EAAqB,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AAQ7E;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,GAAI,cAAc,MAAM,EAAE,UAAU,eAAe,EAAE,UAAU,iBAAiB;;;;;;;CA6H5G,CAAA"}
@@ -15,7 +15,7 @@ import { traverseWebhooks } from './traverse-webhooks.js';
15
15
  * - Optional schema/model documentation
16
16
  */
17
17
  export const traverseDocument = (documentName, document, options) => {
18
- const { hideModels, tagsSorter, operationsSorter, generateId } = getNavigationOptions(documentName, options);
18
+ const { hideModels, tagsSorter, operationsSorter, generateId, operationTitleSource } = getNavigationOptions(documentName, options);
19
19
  const documentId = generateId({
20
20
  type: 'document',
21
21
  info: document.info,
@@ -33,7 +33,13 @@ export const traverseDocument = (documentName, document, options) => {
33
33
  info: document.info,
34
34
  });
35
35
  /** Traverse all the document path */
36
- const { untaggedOperations } = traversePaths({ document, tagsMap, generateId, documentId });
36
+ const { untaggedOperations } = traversePaths({
37
+ document,
38
+ tagsMap,
39
+ generateId,
40
+ documentId,
41
+ operationTitleSource,
42
+ });
37
43
  const untaggedWebhooksParentId = generateId({
38
44
  type: 'webhook',
39
45
  name: '',
@@ -1,4 +1,4 @@
1
- import type { TagsMap, TraverseSpecOptions } from '../../navigation/types.js';
1
+ import type { OperationTitleSource, TagsMap, TraverseSpecOptions } from '../../navigation/types.js';
2
2
  import type { TraversedOperation } from '../../schemas/navigation.js';
3
3
  import type { OpenApiDocument, OperationObject } from '../../schemas/v3.1/strict/openapi-document.js';
4
4
  export declare const isDeprecatedOperation: (operation: OperationObject) => boolean;
@@ -19,7 +19,7 @@ export declare const isDeprecatedOperation: (operation: OperationObject) => bool
19
19
  * @param getOperationId - Function to generate unique IDs for operations
20
20
  * @returns Object containing the tagsMap and an array of untagged operations
21
21
  */
22
- export declare const traversePaths: ({ document, tagsMap, generateId, documentId, }: {
22
+ export declare const traversePaths: ({ document, tagsMap, generateId, documentId, operationTitleSource, }: {
23
23
  document: OpenApiDocument;
24
24
  /** Map of tags and their entries */
25
25
  tagsMap: TagsMap;
@@ -27,6 +27,8 @@ export declare const traversePaths: ({ document, tagsMap, generateId, documentId
27
27
  generateId: TraverseSpecOptions["generateId"];
28
28
  /** Document ID */
29
29
  documentId: string;
30
+ /** Whether to use the operation summary or the operation path for sidebar titles */
31
+ operationTitleSource?: OperationTitleSource;
30
32
  }) => {
31
33
  untaggedOperations: TraversedOperation[];
32
34
  };
@@ -1 +1 @@
1
- {"version":3,"file":"traverse-paths.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-paths.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAEtE,OAAO,KAAK,EAA+B,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AAI9F,eAAO,MAAM,qBAAqB,GAAI,WAAW,eAAe,YAE/D,CAAA;AAoED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa,GAAI,gDAK3B;IACD,QAAQ,EAAE,eAAe,CAAA;IACzB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,0DAA0D;IAC1D,UAAU,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAA;IAC7C,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAA;CACnB,KAAG;IAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAA;CA2D7C,CAAA"}
1
+ {"version":3,"file":"traverse-paths.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-paths.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAE5F,OAAO,KAAK,EAA+B,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,wCAAwC,CAAA;AAI9F,eAAO,MAAM,qBAAqB,GAAI,WAAW,eAAe,YAE/D,CAAA;AAsED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,aAAa,GAAI,sEAM3B;IACD,QAAQ,EAAE,eAAe,CAAA;IACzB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,0DAA0D;IAC1D,UAAU,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAA;IAC7C,kBAAkB;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,oFAAoF;IACpF,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;CAC5C,KAAG;IAAE,kBAAkB,EAAE,kBAAkB,EAAE,CAAA;CA6D7C,CAAA"}
@@ -1,7 +1,8 @@
1
1
  import { isHttpMethod } from '@scalar/helpers/http/is-http-method';
2
2
  import { objectKeys } from '@scalar/helpers/object/object-keys';
3
3
  import { escapeJsonPointer } from '@scalar/json-magic/helpers/escape-json-pointer';
4
- import { getResolvedRef } from '../../helpers/get-resolved-ref.js';
4
+ import { getResolvedRef, mergeSiblingReferences } from '../../helpers/get-resolved-ref.js';
5
+ import { isHidden } from '../../helpers/is-hidden.js';
5
6
  import { traverseOperationExamples } from '../../navigation/helpers/traverse-examples.js';
6
7
  import { XScalarStabilityValues } from '../../schemas/extensions/operation/index.js';
7
8
  import { getTag } from './get-tag.js';
@@ -20,7 +21,7 @@ export const isDeprecatedOperation = (operation) => {
20
21
  * @param getOperationId - Function to generate unique IDs for operations
21
22
  * @returns A traversed operation entry with ID, title, path, method and reference
22
23
  */
23
- const createOperationEntry = ({ ref, operation, method, path, generateId, parentId, parentTag, }) => {
24
+ const createOperationEntry = ({ ref, operation, method, path, generateId, parentId, parentTag, operationTitleSource, }) => {
24
25
  const id = generateId({
25
26
  type: 'operation',
26
27
  operation,
@@ -29,7 +30,7 @@ const createOperationEntry = ({ ref, operation, method, path, generateId, parent
29
30
  path: path,
30
31
  parentId: parentId,
31
32
  });
32
- const title = operation.summary?.trim() ? operation.summary : path;
33
+ const title = operationTitleSource === 'path' ? path : operation.summary?.trim() ? operation.summary : path;
33
34
  const isDeprecated = isDeprecatedOperation(operation);
34
35
  const examples = traverseOperationExamples(operation).map((example) => ({
35
36
  type: 'example',
@@ -70,19 +71,19 @@ const createOperationEntry = ({ ref, operation, method, path, generateId, parent
70
71
  * @param getOperationId - Function to generate unique IDs for operations
71
72
  * @returns Object containing the tagsMap and an array of untagged operations
72
73
  */
73
- export const traversePaths = ({ document, tagsMap, generateId, documentId, }) => {
74
+ export const traversePaths = ({ document, tagsMap, generateId, documentId, operationTitleSource, }) => {
74
75
  const untaggedOperations = [];
75
76
  // Traverse paths
76
77
  Object.entries(document.paths ?? {}).forEach(([path, pathItemObject]) => {
77
78
  const pathKeys = objectKeys(pathItemObject ?? {}).filter((key) => isHttpMethod(key));
78
79
  pathKeys.forEach((method) => {
79
80
  const _operation = pathItemObject?.[method];
80
- const operation = getResolvedRef(_operation);
81
+ const operation = getResolvedRef(_operation, mergeSiblingReferences);
81
82
  if (!operation) {
82
83
  return;
83
84
  }
84
85
  // Skip if the operation is internal or scalar-ignore
85
- if (operation['x-internal'] || operation['x-scalar-ignore'] || !isHttpMethod(method)) {
86
+ if (isHidden(operation) || !isHttpMethod(method)) {
86
87
  return;
87
88
  }
88
89
  const ref = `#/paths/${escapeJsonPointer(path)}/${method}`;
@@ -103,6 +104,7 @@ export const traversePaths = ({ document, tagsMap, generateId, documentId, }) =>
103
104
  parentTag: { tag, id: tagId },
104
105
  generateId,
105
106
  parentId: tagId,
107
+ operationTitleSource,
106
108
  }));
107
109
  });
108
110
  }
@@ -115,6 +117,7 @@ export const traversePaths = ({ document, tagsMap, generateId, documentId, }) =>
115
117
  path,
116
118
  generateId,
117
119
  parentId: documentId,
120
+ operationTitleSource,
118
121
  }));
119
122
  }
120
123
  });
@@ -1 +1 @@
1
- {"version":3,"file":"traverse-schemas.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-schemas.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,KAAK,EAAa,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,wCAAwC,CAAA;AA2C3F;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,gDAK7B;IACD,QAAQ,EAAE,eAAe,CAAA;IACzB,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAA;IAC7C,UAAU,EAAE,MAAM,CAAA;CACnB,KAAG,eAAe,EA4ClB,CAAA"}
1
+ {"version":3,"file":"traverse-schemas.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-schemas.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,KAAK,EAAa,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,wCAAwC,CAAA;AA2C3F;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,GAAI,gDAK7B;IACD,QAAQ,EAAE,eAAe,CAAA;IACzB,wCAAwC;IACxC,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAA;IAC7C,UAAU,EAAE,MAAM,CAAA;CACnB,KAAG,eAAe,EAiDlB,CAAA"}
@@ -1,4 +1,5 @@
1
- import { getResolvedRef } from '../../helpers/get-resolved-ref.js';
1
+ import { getResolvedRef, mergeSiblingReferences } from '../../helpers/get-resolved-ref.js';
2
+ import { isHidden } from '../../helpers/is-hidden.js';
2
3
  import { getTag } from '../../navigation/helpers/get-tag.js';
3
4
  /** Creates a traversed schema entry from an OpenAPI schema object.
4
5
  *
@@ -33,10 +34,14 @@ const createSchemaEntry = ({ ref, name, generateId, parentTag, _schema, parentId
33
34
  export const traverseSchemas = ({ document, tagsMap, generateId, documentId, }) => {
34
35
  const schemas = document.components?.schemas ?? {};
35
36
  const untagged = [];
36
- // biome-ignore lint/suspicious/useGuardForIn: we do have an if statement after de-ref
37
37
  for (const name in schemas) {
38
- const schema = getResolvedRef(schemas[name]);
39
- if (schema?.['x-internal'] || schema?.['x-scalar-ignore'] || !Object.hasOwn(schemas, name)) {
38
+ if (!Object.hasOwn(schemas, name)) {
39
+ continue;
40
+ }
41
+ // Merge wrapper siblings onto the dereferenced schema so x-internal / x-scalar-ignore
42
+ // set alongside a $ref are honored (e.g. https://github.com/scalar/scalar/issues/9114).
43
+ const schema = getResolvedRef(schemas[name], mergeSiblingReferences);
44
+ if (isHidden(schema)) {
40
45
  continue;
41
46
  }
42
47
  const ref = `#/components/schemas/${name}`;
@@ -1 +1 @@
1
- {"version":3,"file":"traverse-tags.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-tags.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,sBAAsB,CAAA;AACxE,OAAO,KAAK,EAAE,eAAe,EAAa,MAAM,wCAAwC,CAAA;AAIxF,KAAK,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,kBAAkB,GAAG,YAAY,CAAC,CAAA;AA4K1F;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,2FAK1B;IACD,QAAQ,EAAE,eAAe,CAAA;IACzB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;CACjB,KAAG,cAAc,EAyCjB,CAAA"}
1
+ {"version":3,"file":"traverse-tags.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-tags.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,sBAAsB,CAAA;AACxE,OAAO,KAAK,EAAE,eAAe,EAAa,MAAM,wCAAwC,CAAA;AAIxF,KAAK,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,YAAY,GAAG,kBAAkB,GAAG,YAAY,CAAC,CAAA;AA4K1F;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,2FAK1B;IACD,QAAQ,EAAE,eAAe,CAAA;IACzB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,EAAE,OAAO,CAAA;CACjB,KAAG,cAAc,EAyCjB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { sortByOrder } from '@scalar/helpers/array/sort-by-order';
2
+ import { isHidden } from '../../helpers/is-hidden.js';
2
3
  import { unpackProxyObject } from '../../helpers/unpack-proxy.js';
3
4
  import { getXKeysFromObject } from '../../navigation/helpers/get-x-keys.js';
4
5
  import { getTag } from './get-tag.js';
@@ -61,7 +62,7 @@ const getSortedTagEntries = ({ _keys, tagsMap, options: { tagsSorter, operations
61
62
  const entries = _keys.flatMap((key) => {
62
63
  const { tag, entries } = getTag({ tagsMap, name: key, documentId, generateId });
63
64
  // Skip if the tag is internal or scalar-ignore
64
- if (tag['x-internal'] || tag['x-scalar-ignore']) {
65
+ if (isHidden(tag)) {
65
66
  return [];
66
67
  }
67
68
  const sortOrder = tag['x-scalar-order'];
@@ -1 +1 @@
1
- {"version":3,"file":"traverse-webhooks.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-webhooks.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,KAAK,EAAa,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvE,OAAO,KAAK,EAAE,eAAe,EAA8B,MAAM,wCAAwC,CAAA;AA2DzG;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,GAAI,0EAM9B;IACD,uBAAuB;IACvB,QAAQ,EAAE,eAAe,CAAA;IACzB,6CAA6C;IAC7C,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAA;IAC7C,wBAAwB,EAAE,MAAM,CAAA;IAChC,UAAU,EAAE,MAAM,CAAA;CACnB,KAAG,gBAAgB,EA0DnB,CAAA"}
1
+ {"version":3,"file":"traverse-webhooks.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/traverse-webhooks.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,KAAK,EAAa,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvE,OAAO,KAAK,EAAE,eAAe,EAA8B,MAAM,wCAAwC,CAAA;AA2DzG;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,GAAI,0EAM9B;IACD,uBAAuB;IACvB,QAAQ,EAAE,eAAe,CAAA;IACzB,6CAA6C;IAC7C,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAA;IAC7C,wBAAwB,EAAE,MAAM,CAAA;IAChC,UAAU,EAAE,MAAM,CAAA;CACnB,KAAG,gBAAgB,EA0DnB,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { isHttpMethod } from '@scalar/helpers/http/is-http-method';
2
2
  import { objectKeys } from '@scalar/helpers/object/object-keys';
3
- import { getResolvedRef } from '../../helpers/get-resolved-ref.js';
3
+ import { getResolvedRef, mergeSiblingReferences } from '../../helpers/get-resolved-ref.js';
4
+ import { isHidden } from '../../helpers/is-hidden.js';
4
5
  import { isDeprecatedOperation } from '../../navigation/helpers/traverse-paths.js';
5
6
  import { getTag } from './get-tag.js';
6
7
  /** Creates a traversed webhook entry from an OpenAPI webhook object.
@@ -56,12 +57,12 @@ export const traverseWebhooks = ({ document, tagsMap, generateId, untaggedWebhoo
56
57
  const pathKeys = objectKeys(pathItemObject ?? {}).filter((key) => isHttpMethod(key));
57
58
  pathKeys.forEach((method) => {
58
59
  const _operation = pathItemObject?.[method];
59
- const operation = getResolvedRef(_operation);
60
+ const operation = getResolvedRef(_operation, mergeSiblingReferences);
60
61
  if (!operation) {
61
62
  return;
62
63
  }
63
64
  // Skip if the operation is internal or scalar-ignore
64
- if (operation['x-internal'] || operation['x-scalar-ignore']) {
65
+ if (isHidden(operation)) {
65
66
  return;
66
67
  }
67
68
  const ref = `#/webhooks/${name}/${method}`;
@@ -1 +1 @@
1
- {"version":3,"file":"update-order-ids.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/update-order-ids.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAEnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAG9C,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACvH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAEtE,KAAK,mBAAmB,GAAG;IACzB,KAAK,EAAE,cAAc,CAAA;IACrB,UAAU,EAAE,WAAW,CAAA;CACxB,GAAG,CACA;IACE,8DAA8D;IAC9D,OAAO,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAA;IAC1E,SAAS,EAAE,eAAe,CAAA;IAC1B,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;CACb,GACD;IACE,6CAA6C;IAC7C,OAAO,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,CAAA;IACnC,GAAG,EAAE,SAAS,CAAA;CACf,CACJ,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,gCAAgC,mBAAmB,SA+DjF,CAAA"}
1
+ {"version":3,"file":"update-order-ids.d.ts","sourceRoot":"","sources":["../../../src/navigation/helpers/update-order-ids.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAEnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAA;AAG9C,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEvH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAEtE,KAAK,mBAAmB,GAAG;IACzB,KAAK,EAAE,cAAc,CAAA;IACrB,UAAU,EAAE,WAAW,CAAA;CACxB,GAAG,CACA;IACE,8DAA8D;IAC9D,OAAO,EAAE,CAAC,UAAU,CAAC,kBAAkB,CAAC,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAA;IAC1E,SAAS,EAAE,eAAe,CAAA;IAC1B,MAAM,EAAE,UAAU,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;CACb,GACD;IACE,6CAA6C;IAC7C,OAAO,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,CAAA;IACnC,GAAG,EAAE,SAAS,CAAA;CACf,CACJ,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,gCAAgC,mBAAmB,SAiEjF,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { canHaveOrder, getOpenapiObject } from '../../navigation/helpers/get-openapi-object.js';
2
2
  import { getParentEntry } from '../../navigation/helpers/get-parent-entry.js';
3
+ import { isOpenApiDocument } from '../../schemas/type-guards.js';
3
4
  /**
4
5
  * Updates the order ID of an entry (operation or tag) in the sidebar.
5
6
  * Used when changing path, method, or tag name so we do not lose the sidebar ordering.
@@ -36,7 +37,9 @@ export const updateOrderIds = ({ store, generateId, ...rest }) => {
36
37
  if (oldTagId !== newTagId) {
37
38
  const documentEntry = getParentEntry('document', entry);
38
39
  const document = documentEntry ? store.workspace.documents[documentEntry.name] : null;
39
- const renamedTagObj = document?.tags?.find((t) => t.name === rest.tag.name);
40
+ const renamedTagObj = isOpenApiDocument(document)
41
+ ? document.tags?.find((t) => t.name === rest.tag.name)
42
+ : undefined;
40
43
  const childOrder = renamedTagObj?.['x-scalar-order'];
41
44
  if (renamedTagObj && Array.isArray(childOrder)) {
42
45
  const oldPrefix = `${oldTagId}/`;
@@ -14,6 +14,8 @@ type OperationSortValue = {
14
14
  /** @deprecated use method instead */
15
15
  httpVerb: string;
16
16
  };
17
+ /** Whether to use the operation summary or the operation path for sidebar and search titles */
18
+ export type OperationTitleSource = 'summary' | 'path';
17
19
  /** Configuration options for traversing an OpenAPI specification document.
18
20
  *
19
21
  * These options control how the document is processed and organized, including:
@@ -28,6 +30,8 @@ export type TraverseSpecOptions = {
28
30
  operationsSorter?: 'alpha' | 'method' | ((a: OperationSortValue, b: OperationSortValue) => number);
29
31
  /** Whether to hide model schemas from the navigation */
30
32
  hideModels: boolean;
33
+ /** Whether to derive operation titles from the operation summary or the path */
34
+ operationTitleSource?: OperationTitleSource;
31
35
  generateId: IdGenerator;
32
36
  };
33
37
  export type Heading = {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/navigation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAEvE,wCAAwC;AACxC,MAAM,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,cAAc,EAAE,CAAA;CAAE,CAAC,CAAA;AAE9G,KAAK,kBAAkB,GAAG;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,2FAA2F;IAC3F,UAAU,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,KAAK,MAAM,CAAC,CAAA;IAE/D,sGAAsG;IACtG,gBAAgB,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,KAAK,MAAM,CAAC,CAAA;IAElG,wDAAwD;IACxD,UAAU,EAAE,OAAO,CAAA;IAEnB,UAAU,EAAE,WAAW,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/navigation/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACvE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAEvE,wCAAwC;AACxC,MAAM,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,cAAc,EAAE,CAAA;CAAE,CAAC,CAAA;AAE9G,KAAK,kBAAkB,GAAG;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,+FAA+F;AAC/F,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,MAAM,CAAA;AAErD;;;;;;GAMG;AACH,MAAM,MAAM,mBAAmB,GAAG;IAChC,2FAA2F;IAC3F,UAAU,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,KAAK,MAAM,CAAC,CAAA;IAE/D,sGAAsG;IACtG,gBAAgB,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,CAAC,EAAE,kBAAkB,KAAK,MAAM,CAAC,CAAA;IAElG,wDAAwD;IACxD,UAAU,EAAE,OAAO,CAAA;IAEnB,gFAAgF;IAChF,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;IAE3C,UAAU,EAAE,WAAW,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,OAAO,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA"}