@scalar/workspace-store 0.19.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +2 -2
  3. package/dist/client.d.ts +40 -4
  4. package/dist/client.d.ts.map +1 -1
  5. package/dist/client.js +58 -23
  6. package/dist/client.js.map +2 -2
  7. package/dist/events/bus.d.ts +13 -1
  8. package/dist/events/bus.d.ts.map +1 -1
  9. package/dist/events/bus.js +46 -10
  10. package/dist/events/bus.js.map +3 -3
  11. package/dist/events/definitions/auth.d.ts +20 -2
  12. package/dist/events/definitions/auth.d.ts.map +1 -1
  13. package/dist/events/definitions/cookie.d.ts +20 -0
  14. package/dist/events/definitions/cookie.d.ts.map +1 -0
  15. package/dist/events/definitions/cookie.js +1 -0
  16. package/dist/events/definitions/cookie.js.map +7 -0
  17. package/dist/events/definitions/document.d.ts +11 -1
  18. package/dist/events/definitions/document.d.ts.map +1 -1
  19. package/dist/events/definitions/index.d.ts +4 -2
  20. package/dist/events/definitions/index.d.ts.map +1 -1
  21. package/dist/events/definitions/operation.d.ts +0 -13
  22. package/dist/events/definitions/operation.d.ts.map +1 -1
  23. package/dist/events/definitions/server.d.ts +20 -28
  24. package/dist/events/definitions/server.d.ts.map +1 -1
  25. package/dist/events/definitions/tabs.d.ts +40 -0
  26. package/dist/events/definitions/tabs.d.ts.map +1 -0
  27. package/dist/events/definitions/tabs.js +1 -0
  28. package/dist/events/definitions/tabs.js.map +7 -0
  29. package/dist/events/definitions/ui.d.ts +39 -4
  30. package/dist/events/definitions/ui.d.ts.map +1 -1
  31. package/dist/events/definitions/workspace.d.ts +18 -0
  32. package/dist/events/definitions/workspace.d.ts.map +1 -0
  33. package/dist/events/definitions/workspace.js +1 -0
  34. package/dist/events/definitions/workspace.js.map +7 -0
  35. package/dist/events/index.d.ts +2 -2
  36. package/dist/events/index.d.ts.map +1 -1
  37. package/dist/events/index.js.map +2 -2
  38. package/dist/helpers/generate-unique-value.d.ts +19 -6
  39. package/dist/helpers/generate-unique-value.d.ts.map +1 -1
  40. package/dist/helpers/generate-unique-value.js +12 -7
  41. package/dist/helpers/generate-unique-value.js.map +2 -2
  42. package/dist/helpers/unpack-proxy.d.ts +14 -1
  43. package/dist/helpers/unpack-proxy.d.ts.map +1 -1
  44. package/dist/helpers/unpack-proxy.js +51 -1
  45. package/dist/helpers/unpack-proxy.js.map +3 -3
  46. package/dist/mutators/auth.d.ts +10 -73
  47. package/dist/mutators/auth.d.ts.map +1 -1
  48. package/dist/mutators/auth.js +47 -111
  49. package/dist/mutators/auth.js.map +2 -2
  50. package/dist/mutators/cookie.d.ts +21 -13
  51. package/dist/mutators/cookie.d.ts.map +1 -1
  52. package/dist/mutators/cookie.js +34 -26
  53. package/dist/mutators/cookie.js.map +3 -3
  54. package/dist/mutators/document.d.ts +13 -0
  55. package/dist/mutators/document.d.ts.map +1 -0
  56. package/dist/mutators/document.js +25 -0
  57. package/dist/mutators/document.js.map +7 -0
  58. package/dist/mutators/index.d.ts +13 -20
  59. package/dist/mutators/index.d.ts.map +1 -1
  60. package/dist/mutators/index.js +49 -8
  61. package/dist/mutators/index.js.map +3 -3
  62. package/dist/mutators/operation.d.ts +23 -101
  63. package/dist/mutators/operation.d.ts.map +1 -1
  64. package/dist/mutators/operation.js +132 -96
  65. package/dist/mutators/operation.js.map +2 -2
  66. package/dist/mutators/server.d.ts +43 -8
  67. package/dist/mutators/server.d.ts.map +1 -1
  68. package/dist/mutators/server.js +113 -20
  69. package/dist/mutators/server.js.map +2 -2
  70. package/dist/mutators/workspace.d.ts +6 -0
  71. package/dist/mutators/workspace.d.ts.map +1 -0
  72. package/dist/mutators/workspace.js +24 -0
  73. package/dist/mutators/workspace.js.map +7 -0
  74. package/dist/navigation/get-navigation-options.d.ts.map +1 -1
  75. package/dist/navigation/get-navigation-options.js +4 -4
  76. package/dist/navigation/get-navigation-options.js.map +2 -2
  77. package/dist/navigation/helpers/traverse-document.d.ts +2 -0
  78. package/dist/navigation/helpers/traverse-document.d.ts.map +1 -1
  79. package/dist/navigation/helpers/traverse-document.js +18 -3
  80. package/dist/navigation/helpers/traverse-document.js.map +2 -2
  81. package/dist/navigation/helpers/traverse-examples.js +2 -2
  82. package/dist/navigation/helpers/traverse-examples.js.map +2 -2
  83. package/dist/navigation/helpers/traverse-paths.d.ts +6 -3
  84. package/dist/navigation/helpers/traverse-paths.d.ts.map +1 -1
  85. package/dist/navigation/helpers/traverse-paths.js +4 -9
  86. package/dist/navigation/helpers/traverse-paths.js.map +2 -2
  87. package/dist/navigation/helpers/traverse-tags.d.ts +0 -1
  88. package/dist/navigation/helpers/traverse-tags.d.ts.map +1 -1
  89. package/dist/navigation/helpers/traverse-tags.js +57 -49
  90. package/dist/navigation/helpers/traverse-tags.js.map +3 -3
  91. package/dist/persistence/index.d.ts +6 -0
  92. package/dist/persistence/index.d.ts.map +1 -1
  93. package/dist/persistence/index.js +18 -0
  94. package/dist/persistence/index.js.map +2 -2
  95. package/dist/persistence/indexdb.d.ts +1 -0
  96. package/dist/persistence/indexdb.d.ts.map +1 -1
  97. package/dist/persistence/indexdb.js +6 -1
  98. package/dist/persistence/indexdb.js.map +2 -2
  99. package/dist/plugins/client/persistence.d.ts +2 -1
  100. package/dist/plugins/client/persistence.d.ts.map +1 -1
  101. package/dist/plugins/client/persistence.js +17 -9
  102. package/dist/plugins/client/persistence.js.map +2 -2
  103. package/dist/schemas/extensions/document/x-scalar-environments.d.ts +1 -0
  104. package/dist/schemas/extensions/document/x-scalar-environments.d.ts.map +1 -1
  105. package/dist/schemas/extensions/document/x-scalar-environments.js.map +2 -2
  106. package/dist/schemas/extensions/document/x-scalar-set-operation-security.d.ts +13 -0
  107. package/dist/schemas/extensions/document/x-scalar-set-operation-security.d.ts.map +1 -0
  108. package/dist/schemas/extensions/document/x-scalar-set-operation-security.js +8 -0
  109. package/dist/schemas/extensions/document/x-scalar-set-operation-security.js.map +7 -0
  110. package/dist/schemas/extensions/general/x-scalar-cookies.d.ts +36 -0
  111. package/dist/schemas/extensions/general/x-scalar-cookies.d.ts.map +1 -0
  112. package/dist/schemas/extensions/general/x-scalar-cookies.js +15 -0
  113. package/dist/schemas/extensions/general/x-scalar-cookies.js.map +7 -0
  114. package/dist/schemas/extensions/general/x-scalar-order.d.ts +12 -0
  115. package/dist/schemas/extensions/general/x-scalar-order.d.ts.map +1 -0
  116. package/dist/schemas/extensions/general/x-scalar-order.js +8 -0
  117. package/dist/schemas/extensions/general/x-scalar-order.js.map +7 -0
  118. package/dist/schemas/extensions/security/x-scalar-selected-security.d.ts +7 -7
  119. package/dist/schemas/extensions/security/x-scalar-selected-security.d.ts.map +1 -1
  120. package/dist/schemas/extensions/security/x-scalar-selected-security.js +2 -2
  121. package/dist/schemas/extensions/security/x-scalar-selected-security.js.map +2 -2
  122. package/dist/schemas/extensions/server/x-scalar-selected-server.d.ts +8 -0
  123. package/dist/schemas/extensions/server/x-scalar-selected-server.d.ts.map +1 -0
  124. package/dist/schemas/extensions/server/x-scalar-selected-server.js +8 -0
  125. package/dist/schemas/extensions/server/x-scalar-selected-server.js.map +7 -0
  126. package/dist/schemas/extensions/tag/x-tag-groups.d.ts +10 -5
  127. package/dist/schemas/extensions/tag/x-tag-groups.d.ts.map +1 -1
  128. package/dist/schemas/extensions/tag/x-tag-groups.js +15 -10
  129. package/dist/schemas/extensions/tag/x-tag-groups.js.map +2 -2
  130. package/dist/schemas/extensions/workspace/x-scalar-active-proxy.d.ts +18 -0
  131. package/dist/schemas/extensions/workspace/x-scalar-active-proxy.d.ts.map +1 -0
  132. package/dist/schemas/extensions/workspace/x-scalar-active-proxy.js +8 -0
  133. package/dist/schemas/extensions/workspace/x-scalar-active-proxy.js.map +7 -0
  134. package/dist/schemas/extensions.d.ts +1 -1
  135. package/dist/schemas/extensions.js +1 -1
  136. package/dist/schemas/extensions.js.map +2 -2
  137. package/dist/schemas/inmemory-workspace.d.ts +59 -33
  138. package/dist/schemas/inmemory-workspace.d.ts.map +1 -1
  139. package/dist/schemas/navigation.d.ts +9 -1
  140. package/dist/schemas/navigation.d.ts.map +1 -1
  141. package/dist/schemas/navigation.js +3 -1
  142. package/dist/schemas/navigation.js.map +2 -2
  143. package/dist/schemas/reference-config/index.d.ts +29 -16
  144. package/dist/schemas/reference-config/index.d.ts.map +1 -1
  145. package/dist/schemas/reference-config/settings.d.ts +29 -16
  146. package/dist/schemas/reference-config/settings.d.ts.map +1 -1
  147. package/dist/schemas/reference-config/settings.js +2 -0
  148. package/dist/schemas/reference-config/settings.js.map +2 -2
  149. package/dist/schemas/v3.1/strict/openapi-document.d.ts +992 -549
  150. package/dist/schemas/v3.1/strict/openapi-document.d.ts.map +1 -1
  151. package/dist/schemas/v3.1/strict/openapi-document.js +14 -6
  152. package/dist/schemas/v3.1/strict/openapi-document.js.map +2 -2
  153. package/dist/schemas/v3.1/strict/operation.d.ts +3 -7
  154. package/dist/schemas/v3.1/strict/operation.d.ts.map +1 -1
  155. package/dist/schemas/v3.1/strict/operation.js +1 -5
  156. package/dist/schemas/v3.1/strict/operation.js.map +2 -2
  157. package/dist/schemas/v3.1/strict/tag.d.ts +4 -1
  158. package/dist/schemas/v3.1/strict/tag.d.ts.map +1 -1
  159. package/dist/schemas/v3.1/strict/tag.js +3 -1
  160. package/dist/schemas/v3.1/strict/tag.js.map +2 -2
  161. package/dist/schemas/v3.1/strict/type-guards.d.ts +6 -0
  162. package/dist/schemas/v3.1/strict/type-guards.d.ts.map +1 -1
  163. package/dist/schemas/v3.1/strict/type-guards.js +4 -0
  164. package/dist/schemas/v3.1/strict/type-guards.js.map +2 -2
  165. package/dist/schemas/workspace-specification/config.d.ts +29 -16
  166. package/dist/schemas/workspace-specification/config.d.ts.map +1 -1
  167. package/dist/schemas/workspace-specification/index.d.ts +30 -17
  168. package/dist/schemas/workspace-specification/index.d.ts.map +1 -1
  169. package/dist/schemas/workspace.d.ts +233 -130
  170. package/dist/schemas/workspace.d.ts.map +1 -1
  171. package/dist/schemas/workspace.js +8 -6
  172. package/dist/schemas/workspace.js.map +2 -2
  173. package/dist/server.d.ts +1 -1
  174. package/dist/workspace-plugin.d.ts +3 -0
  175. package/dist/workspace-plugin.d.ts.map +1 -1
  176. package/package.json +8 -7
  177. package/dist/helpers/debounce.d.ts +0 -28
  178. package/dist/helpers/debounce.d.ts.map +0 -1
  179. package/dist/helpers/debounce.js +0 -31
  180. package/dist/helpers/debounce.js.map +0 -7
  181. package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.d.ts +0 -13
  182. package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.d.ts.map +0 -1
  183. package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.js +0 -9
  184. package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.js.map +0 -7
  185. package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.d.ts +0 -32
  186. package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.d.ts.map +0 -1
  187. package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.js +0 -13
  188. package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.js.map +0 -7
@@ -1,7 +1,6 @@
1
1
  import type { HttpMethod } from '@scalar/helpers/http/http-methods';
2
+ import type { AuthEvents } from '../events/definitions/auth.js';
2
3
  import type { WorkspaceDocument } from '../schemas.js';
3
- import type { SecurityRequirementObject } from '../schemas/v3.1/strict/security-requirement.js';
4
- import type { SecuritySchemeObject } from '../schemas/v3.1/strict/security-scheme.js';
5
4
  /**
6
5
  * AuthMeta defines the meta information needed to specify whether the authentication operation
7
6
  * is being performed at the document level (entire API), or for a specific operation (specific path and method).
@@ -40,52 +39,7 @@ export type AuthMeta = {
40
39
  * })
41
40
  * ```
42
41
  */
43
- export declare const updateSelectedSecuritySchemes: ({ document, selectedRequirements, newSchemes, meta, }: {
44
- document: WorkspaceDocument | null;
45
- selectedRequirements: SecurityRequirementObject[];
46
- newSchemes: {
47
- name: string;
48
- scheme: SecuritySchemeObject;
49
- }[];
50
- meta: AuthMeta;
51
- }) => void;
52
- /**
53
- * SecuritySchemeUpdate represents the possible updates that can be made
54
- * to an OpenAPI security scheme object via UI interactions.
55
- *
56
- * - `http`: Updates to HTTP type schemes (e.g. basic, bearer), allowing token, username, and password changes.
57
- * - `apiKey`: Updates to API Key type schemes, allowing the key name and its value to be updated.
58
- * - `oauth2`: Updates to OAuth2 type schemes for each supported OAuth2 flow.
59
- * - Can set various properties such as auth/token URLs, tokens, PKCE method, client credentials, etc.
60
- */
61
- export type SecuritySchemeUpdate = {
62
- type: 'http';
63
- payload: Partial<{
64
- token: string;
65
- username: string;
66
- password: string;
67
- }>;
68
- } | {
69
- type: 'apiKey';
70
- payload: Partial<{
71
- name: string;
72
- value: string;
73
- }>;
74
- } | {
75
- type: 'oauth2';
76
- flow: 'implicit' | 'password' | 'clientCredentials' | 'authorizationCode';
77
- payload: Partial<{
78
- authUrl: string;
79
- tokenUrl: string;
80
- token: string;
81
- redirectUrl: string;
82
- clientId: string;
83
- clientSecret: string;
84
- usePkce: 'no' | 'SHA-256' | 'plain';
85
- username: string;
86
- password: string;
87
- }>;
88
- };
42
+ export declare const updateSelectedSecuritySchemes: (document: WorkspaceDocument | null, { selectedRequirements, newSchemes, meta }: AuthEvents["auth:update:selected-security-schemes"]) => Promise<void>;
89
43
  /**
90
44
  * Updates a security scheme in the OpenAPI document's components object.
91
45
  * Handles updates for HTTP, API Key, and OAuth2 types, saving secret information and configuration for UI-auth flows.
@@ -109,15 +63,11 @@ export type SecuritySchemeUpdate = {
109
63
  * name: 'MyHttpAuth',
110
64
  * })
111
65
  */
112
- export declare const updateSecurityScheme: ({ document, data, name, }: {
113
- document: WorkspaceDocument | null;
114
- data: SecuritySchemeUpdate;
115
- name: string;
116
- }) => void;
66
+ export declare const updateSecurityScheme: (document: WorkspaceDocument | null, { payload, name }: AuthEvents["auth:update:security-scheme"]) => import("../schemas/v3.1/strict/security-scheme.js").ApiKeyObject | import("../schemas/v3.1/strict/security-scheme.js").HttpObject | import("../schemas/v3.1/strict/security-scheme.js").OAuth2Object | import("../schemas/v3.1/strict/security-scheme.js").OpenIdConnectObject | undefined;
117
67
  /**
118
68
  * Sets the selected authentication tab (scheme) index for the given OpenAPI document or operation.
119
- * - When on the document level, updates the 'x-selected-index' on the document's x-scalar-selected-security extension.
120
- * - When on an operation (endpoint) level, updates the 'x-selected-index' for that operation's x-scalar-selected-security.
69
+ * - When on the document level, updates the 'selectedIndex' on the document's x-scalar-selected-security extension.
70
+ * - When on an operation (endpoint) level, updates the 'selectedIndex' for that operation's x-scalar-selected-security.
121
71
  *
122
72
  * Also initializes the x-scalar-selected-security extension if it does not exist.
123
73
  *
@@ -140,11 +90,7 @@ export declare const updateSecurityScheme: ({ document, data, name, }: {
140
90
  * meta: { type: 'operation', path: '/pets', method: 'get' }
141
91
  * });
142
92
  */
143
- export declare const updateSelectedAuthTab: ({ document, index, meta, }: {
144
- document: WorkspaceDocument | null;
145
- index: number;
146
- meta: AuthMeta;
147
- }) => void;
93
+ export declare const updateSelectedAuthTab: (document: WorkspaceDocument | null, { index, meta }: AuthEvents["auth:update:active-index"]) => void;
148
94
  /**
149
95
  * Updates the scopes for a specific security requirement in the selected security schemes of
150
96
  * a document or operation.
@@ -160,8 +106,8 @@ export declare const updateSelectedAuthTab: ({ document, index, meta, }: {
160
106
  * ```ts
161
107
  * // Suppose your document (or operation) x-scalar-selected-security looks like:
162
108
  * // "x-scalar-selected-security": {
163
- * // "x-selected-index": 0,
164
- * // "x-schemes": [
109
+ * // selectedIndex: 0,
110
+ * // selectedSchemes: [
165
111
  * // { "OAuth": ["read:pets"] },
166
112
  * // { "ApiKeyAuth": [] }
167
113
  * // ]
@@ -177,13 +123,7 @@ export declare const updateSelectedAuthTab: ({ document, index, meta, }: {
177
123
  * // After, the first scheme becomes: { "OAuth": ["write:pets"] }
178
124
  * ```
179
125
  */
180
- export declare const updateSelectedScopes: ({ document, id, name, scopes, meta, }: {
181
- document: WorkspaceDocument | null;
182
- id: string[];
183
- name: string;
184
- scopes: string[];
185
- meta: AuthMeta;
186
- }) => void;
126
+ export declare const updateSelectedScopes: (document: WorkspaceDocument | null, { id, name, scopes, meta }: AuthEvents["auth:update:selected-scopes"]) => void;
187
127
  /**
188
128
  * Deletes one or more security schemes from an OpenAPI WorkspaceDocument,
189
129
  * and removes all references to those schemes from selected security, document-level security,
@@ -203,8 +143,5 @@ export declare const updateSelectedScopes: ({ document, id, name, scopes, meta,
203
143
  * - All document-level and operation-level security entries referencing those schemes are removed.
204
144
  * - Any extended x-scalar-selected-security references to those schemes are also removed.
205
145
  */
206
- export declare const deleteSecurityScheme: ({ document, names }: {
207
- document: WorkspaceDocument | null;
208
- names: string[];
209
- }) => void;
146
+ export declare const deleteSecurityScheme: (document: WorkspaceDocument | null, { names }: AuthEvents["auth:delete:security-scheme"]) => void;
210
147
  //# sourceMappingURL=auth.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/mutators/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAInE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAA;AAC3F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAA;AAEjF;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,GAChB;IACE,IAAI,EAAE,UAAU,CAAA;CACjB,GACD;IACE,IAAI,EAAE,WAAW,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,UAAU,CAAA;CACnB,CAAA;AAEL;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,6BAA6B,GAAI,uDAK3C;IACD,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAClC,oBAAoB,EAAE,yBAAyB,EAAE,CAAA;IACjD,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,oBAAoB,CAAA;KAAE,EAAE,CAAA;IAC5D,IAAI,EAAE,QAAQ,CAAA;CACf,SA4EA,CAAA;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,oBAAoB,GAC5B;IACE,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,OAAO,CAAC;QACf,KAAK,EAAE,MAAM,CAAA;QACb,QAAQ,EAAE,MAAM,CAAA;QAChB,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAC,CAAA;CACH,GACD;IACE,IAAI,EAAE,QAAQ,CAAA;IACd,OAAO,EAAE,OAAO,CAAC;QACf,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;KACd,CAAC,CAAA;CACH,GACD;IACE,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,mBAAmB,GAAG,mBAAmB,CAAA;IACzE,OAAO,EAAE,OAAO,CAAC;QACf,OAAO,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,MAAM,CAAA;QAChB,KAAK,EAAE,MAAM,CAAA;QACb,WAAW,EAAE,MAAM,CAAA;QACnB,QAAQ,EAAE,MAAM,CAAA;QAChB,YAAY,EAAE,MAAM,CAAA;QACpB,OAAO,EAAE,IAAI,GAAG,SAAS,GAAG,OAAO,CAAA;QACnC,QAAQ,EAAE,MAAM,CAAA;QAChB,QAAQ,EAAE,MAAM,CAAA;KACjB,CAAC,CAAA;CACH,CAAA;AAEL;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,oBAAoB,GAAI,2BAIlC;IACD,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAClC,IAAI,EAAE,oBAAoB,CAAA;IAC1B,IAAI,EAAE,MAAM,CAAA;CACb,SAwEA,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,qBAAqB,GAAI,4BAInC;IACD,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAClC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,QAAQ,CAAA;CACf,SA8BA,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,oBAAoB,GAAI,uCAMlC;IACD,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAA;IAClC,EAAE,EAAE,MAAM,EAAE,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,IAAI,EAAE,QAAQ,CAAA;CACf,SAoCA,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,oBAAoB,GAAI,qBAAqB;IAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,SA4DhH,CAAA"}
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/mutators/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAA;AAEnE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AAI3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAGlD;;;;;;GAMG;AACH,MAAM,MAAM,QAAQ,GAChB;IACE,IAAI,EAAE,UAAU,CAAA;CACjB,GACD;IACE,IAAI,EAAE,WAAW,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,UAAU,CAAA;CACnB,CAAA;AAEL;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,6BAA6B,GACxC,UAAU,iBAAiB,GAAG,IAAI,EAClC,4CAA4C,UAAU,CAAC,uCAAuC,CAAC,kBA+EhG,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,oBAAoB,GAC/B,UAAU,iBAAiB,GAAG,IAAI,EAClC,mBAAmB,UAAU,CAAC,6BAA6B,CAAC,mRAc7D,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,qBAAqB,GAChC,UAAU,iBAAiB,GAAG,IAAI,EAClC,iBAAiB,UAAU,CAAC,0BAA0B,CAAC,SA+BxD,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,oBAAoB,GAC/B,UAAU,iBAAiB,GAAG,IAAI,EAClC,4BAA4B,UAAU,CAAC,6BAA6B,CAAC,SAqCtE,CAAA;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,oBAAoB,GAC/B,UAAU,iBAAiB,GAAG,IAAI,EAClC,WAAW,UAAU,CAAC,6BAA6B,CAAC,SA6DrD,CAAA"}
@@ -1,11 +1,7 @@
1
1
  import { generateUniqueValue } from "../helpers/generate-unique-value.js";
2
2
  import { getResolvedRef } from "../helpers/get-resolved-ref.js";
3
- const updateSelectedSecuritySchemes = ({
4
- document,
5
- selectedRequirements,
6
- newSchemes,
7
- meta
8
- }) => {
3
+ import { mergeObjects } from "../helpers/merge-object.js";
4
+ const updateSelectedSecuritySchemes = async (document, { selectedRequirements, newSchemes, meta }) => {
9
5
  if (!document) {
10
6
  return;
11
7
  }
@@ -15,26 +11,29 @@ const updateSelectedSecuritySchemes = ({
15
11
  }
16
12
  return getResolvedRef(document.paths?.[meta.path]?.[meta.method]);
17
13
  };
18
- const createdSchemes = newSchemes.map((scheme) => {
19
- const name = generateUniqueValue({
20
- defaultValue: scheme.name,
21
- validation: (value) => !document.components?.securitySchemes?.[value],
22
- maxRetries: 100
23
- });
24
- if (!name) {
25
- return;
26
- }
27
- if (!document.components) {
28
- document.components = {};
29
- }
30
- if (!document.components.securitySchemes) {
31
- document.components.securitySchemes = {};
32
- }
33
- document.components.securitySchemes[name] = scheme.scheme;
34
- return {
35
- [name]: []
36
- };
37
- }).filter(Boolean);
14
+ const createdSecurityRequirements = await Promise.all(
15
+ newSchemes.map(async (newScheme) => {
16
+ const uniqueSchemeName = await generateUniqueValue({
17
+ defaultValue: newScheme.name,
18
+ validation: (value) => !document.components?.securitySchemes?.[value],
19
+ maxRetries: 100
20
+ });
21
+ if (!uniqueSchemeName) {
22
+ return;
23
+ }
24
+ if (!document.components) {
25
+ document.components = {};
26
+ }
27
+ if (!document.components.securitySchemes) {
28
+ document.components.securitySchemes = {};
29
+ }
30
+ document.components.securitySchemes[uniqueSchemeName] = newScheme.scheme;
31
+ return {
32
+ [uniqueSchemeName]: []
33
+ };
34
+ })
35
+ );
36
+ const createdSchemes = createdSecurityRequirements.filter(Boolean);
38
37
  const target = getTarget();
39
38
  const newSelectedSecuritySchemes = [...selectedRequirements, ...createdSchemes];
40
39
  if (!target) {
@@ -42,88 +41,31 @@ const updateSelectedSecuritySchemes = ({
42
41
  }
43
42
  if (!target["x-scalar-selected-security"]) {
44
43
  target["x-scalar-selected-security"] = {
45
- "x-selected-index": -1,
46
- "x-schemes": []
44
+ selectedIndex: -1,
45
+ selectedSchemes: []
47
46
  };
48
47
  }
49
- const selectedIndex = target["x-scalar-selected-security"]["x-selected-index"];
50
- target["x-scalar-selected-security"]["x-schemes"] = newSelectedSecuritySchemes;
48
+ const selectedIndex = target["x-scalar-selected-security"].selectedIndex;
49
+ target["x-scalar-selected-security"].selectedSchemes = newSelectedSecuritySchemes;
51
50
  if (newSelectedSecuritySchemes.length > 0 && selectedIndex < 0) {
52
- target["x-scalar-selected-security"]["x-selected-index"] = 0;
51
+ target["x-scalar-selected-security"].selectedIndex = 0;
53
52
  }
54
53
  if (selectedIndex >= newSelectedSecuritySchemes.length) {
55
- target["x-scalar-selected-security"]["x-selected-index"] = newSelectedSecuritySchemes.length - 1;
54
+ target["x-scalar-selected-security"].selectedIndex = newSelectedSecuritySchemes.length - 1;
56
55
  }
57
56
  };
58
- const updateSecurityScheme = ({
59
- document,
60
- data,
61
- name
62
- }) => {
63
- if (!document) {
64
- return;
65
- }
66
- const target = getResolvedRef(document.components?.securitySchemes?.[name]);
57
+ const updateSecurityScheme = (document, { payload, name }) => {
58
+ const target = getResolvedRef(document?.components?.securitySchemes?.[name]);
67
59
  if (!target) {
60
+ console.error(`Security scheme ${name} not found`);
68
61
  return;
69
62
  }
70
- if (target.type === "http" && data.type === "http") {
71
- if (data.payload.username) {
72
- target["x-scalar-secret-username"] = data.payload.username;
73
- }
74
- if (data.payload.password) {
75
- target["x-scalar-secret-password"] = data.payload.password;
76
- }
77
- if (data.payload.token) {
78
- target["x-scalar-secret-token"] = data.payload.token;
79
- }
80
- } else if (target.type === "apiKey" && data.type === "apiKey") {
81
- if (data.payload.name) {
82
- target.name = data.payload.name;
83
- }
84
- if (data.payload.value) {
85
- target["x-scalar-secret-token"] = data.payload.value;
86
- }
87
- } else if (target.type === "oauth2" && data.type === "oauth2") {
88
- const flow = target.flows[data.flow];
89
- if (!flow) {
90
- return;
91
- }
92
- if (data.payload.authUrl && "authorizationUrl" in flow) {
93
- flow.authorizationUrl = data.payload.authUrl;
94
- }
95
- if (data.payload.tokenUrl && "tokenUrl" in flow) {
96
- flow.tokenUrl = data.payload.tokenUrl;
97
- }
98
- if (data.payload.token && "x-scalar-secret-token" in flow) {
99
- flow["x-scalar-secret-token"] = data.payload.token;
100
- }
101
- if (data.payload.redirectUrl && "x-scalar-secret-redirect-uri" in flow) {
102
- flow["x-scalar-secret-redirect-uri"] = data.payload.redirectUrl;
103
- }
104
- if (data.payload.clientId && "x-scalar-secret-client-id" in flow) {
105
- flow["x-scalar-secret-client-id"] = data.payload.clientId;
106
- }
107
- if (data.payload.clientSecret && "x-scalar-secret-client-secret" in flow) {
108
- flow["x-scalar-secret-client-secret"] = data.payload.clientSecret;
109
- }
110
- if (data.payload.usePkce && "x-usePkce" in flow) {
111
- flow["x-usePkce"] = data.payload.usePkce;
112
- }
113
- if (data.payload.username && "x-scalar-secret-username" in flow) {
114
- flow["x-scalar-secret-username"] = data.payload.username;
115
- }
116
- if (data.payload.password && "x-scalar-secret-password" in flow) {
117
- flow["x-scalar-secret-password"] = data.payload.password;
118
- }
63
+ if (target.type === payload.type) {
64
+ mergeObjects(target, payload);
119
65
  }
120
- return;
66
+ return target;
121
67
  };
122
- const updateSelectedAuthTab = ({
123
- document,
124
- index,
125
- meta
126
- }) => {
68
+ const updateSelectedAuthTab = (document, { index, meta }) => {
127
69
  if (!document) {
128
70
  return;
129
71
  }
@@ -139,19 +81,13 @@ const updateSelectedAuthTab = ({
139
81
  }
140
82
  if (!target["x-scalar-selected-security"]) {
141
83
  target["x-scalar-selected-security"] = {
142
- "x-selected-index": 0,
143
- "x-schemes": []
84
+ selectedIndex: 0,
85
+ selectedSchemes: []
144
86
  };
145
87
  }
146
- target["x-scalar-selected-security"]["x-selected-index"] = index;
88
+ target["x-scalar-selected-security"].selectedIndex = index;
147
89
  };
148
- const updateSelectedScopes = ({
149
- document,
150
- id,
151
- name,
152
- scopes,
153
- meta
154
- }) => {
90
+ const updateSelectedScopes = (document, { id, name, scopes, meta }) => {
155
91
  if (!document) {
156
92
  return;
157
93
  }
@@ -165,7 +101,7 @@ const updateSelectedScopes = ({
165
101
  if (!target) {
166
102
  return;
167
103
  }
168
- const selectedSchemes = target["x-scalar-selected-security"]?.["x-schemes"];
104
+ const selectedSchemes = target["x-scalar-selected-security"]?.selectedSchemes;
169
105
  if (!selectedSchemes) {
170
106
  return;
171
107
  }
@@ -175,7 +111,7 @@ const updateSelectedScopes = ({
175
111
  }
176
112
  scheme[name] = scopes;
177
113
  };
178
- const deleteSecurityScheme = ({ document, names }) => {
114
+ const deleteSecurityScheme = (document, { names }) => {
179
115
  if (!document) {
180
116
  return;
181
117
  }
@@ -191,7 +127,7 @@ const deleteSecurityScheme = ({ document, names }) => {
191
127
  };
192
128
  if (document["x-scalar-selected-security"]) {
193
129
  const selectedSecurity = document["x-scalar-selected-security"];
194
- selectedSecurity["x-schemes"] = filterSecuritySchemes(selectedSecurity["x-schemes"]);
130
+ selectedSecurity.selectedSchemes = filterSecuritySchemes(selectedSecurity.selectedSchemes);
195
131
  }
196
132
  if (document["security"]) {
197
133
  document["security"] = filterSecuritySchemes(document["security"]);
@@ -206,8 +142,8 @@ const deleteSecurityScheme = ({ document, names }) => {
206
142
  resolvedOperation["security"] = filterSecuritySchemes(resolvedOperation["security"]);
207
143
  }
208
144
  if ("x-scalar-selected-security" in resolvedOperation && resolvedOperation["x-scalar-selected-security"]) {
209
- resolvedOperation["x-scalar-selected-security"]["x-schemes"] = filterSecuritySchemes(
210
- resolvedOperation["x-scalar-selected-security"]["x-schemes"]
145
+ resolvedOperation["x-scalar-selected-security"].selectedSchemes = filterSecuritySchemes(
146
+ resolvedOperation["x-scalar-selected-security"].selectedSchemes
211
147
  );
212
148
  }
213
149
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/mutators/auth.ts"],
4
- "sourcesContent": ["import type { HttpMethod } from '@scalar/helpers/http/http-methods'\n\nimport { generateUniqueValue } from '@/helpers/generate-unique-value'\nimport { getResolvedRef } from '@/helpers/get-resolved-ref'\nimport type { WorkspaceDocument } from '@/schemas'\nimport type { SecurityRequirementObject } from '@/schemas/v3.1/strict/security-requirement'\nimport type { SecuritySchemeObject } from '@/schemas/v3.1/strict/security-scheme'\n\n/**\n * AuthMeta defines the meta information needed to specify whether the authentication operation\n * is being performed at the document level (entire API), or for a specific operation (specific path and method).\n *\n * - If type is 'document', the operation applies to the whole OpenAPI document.\n * - If type is 'operation', it targets a specific operation, identified by its path and method.\n */\nexport type AuthMeta =\n | {\n type: 'document'\n }\n | {\n type: 'operation'\n path: string\n method: HttpMethod\n }\n\n/**\n * Updates the selected security schemes for either the entire document or a specific operation.\n * - Adds newly created security schemes (if any) to the workspace document's components.\n * - Ensures that each new scheme name is unique within the document by using `generateUniqueValue`.\n * - Updates the `x-scalar-selected-security` property on the target (document or operation) to reflect the new set of selected security schemes.\n * - Corrects and maintains the selected index so it points to a valid security scheme.\n *\n * @param document - The workspace OpenAPI document to mutate (can be null, in which case nothing happens)\n * @param selectedSecuritySchemes - The current list of selected security scheme objects\n * @param create - Array of new schemes to create, each with a name and a scheme definition\n * @param meta - Location to update: whole document or a specific operation (`{ type: 'document' }` or `{ type: 'operation', path, method }`)\n *\n * Example usage:\n * ```\n * updateSelectedSecuritySchemes({\n * document,\n * selectedSecuritySchemes: [{ bearerAuth: [] }],\n * create: [\n * { name: 'ApiKeyAuth', scheme: { type: 'apiKey', in: 'header', name: 'X-API-Key' } }\n * ],\n * meta: { type: 'document' }\n * })\n * ```\n */\nexport const updateSelectedSecuritySchemes = ({\n document,\n selectedRequirements,\n newSchemes,\n meta,\n}: {\n document: WorkspaceDocument | null\n selectedRequirements: SecurityRequirementObject[]\n newSchemes: { name: string; scheme: SecuritySchemeObject }[]\n meta: AuthMeta\n}) => {\n if (!document) {\n return\n }\n\n // Helper to get the target (whole document or a specific operation)\n const getTarget = () => {\n if (meta.type === 'document') {\n return document\n }\n\n return getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n }\n\n // Create any new security schemes required, ensuring unique names for the components\n const createdSchemes = newSchemes\n .map((scheme) => {\n const name = generateUniqueValue({\n defaultValue: scheme.name,\n validation: (value) => !document.components?.securitySchemes?.[value],\n maxRetries: 100,\n })\n\n if (!name) {\n return\n }\n\n // Ensure components and securitySchemes exist\n if (!document.components) {\n document.components = {}\n }\n if (!document.components.securitySchemes) {\n document.components.securitySchemes = {}\n }\n\n // Add the new security scheme definition\n document.components.securitySchemes[name] = scheme.scheme\n\n // Return an OpenAPI Security Requirement Object for this new scheme (empty scope array)\n return {\n [name]: [],\n }\n })\n .filter(Boolean) as SecurityRequirementObject[]\n\n const target = getTarget()\n\n const newSelectedSecuritySchemes = [...selectedRequirements, ...createdSchemes]\n\n // If the target (document/operation) doesn't exist, do nothing\n if (!target) {\n return\n }\n\n // Ensure the x-scalar-selected-security structure exists on the target\n if (!target['x-scalar-selected-security']) {\n target['x-scalar-selected-security'] = {\n 'x-selected-index': -1,\n 'x-schemes': [],\n }\n }\n\n const selectedIndex = target['x-scalar-selected-security']['x-selected-index']\n\n // Update the schemes array\n target['x-scalar-selected-security']['x-schemes'] = newSelectedSecuritySchemes\n\n // Adjust selected index if there are schemes and the index is unset/invalid\n if (newSelectedSecuritySchemes.length > 0 && selectedIndex < 0) {\n target['x-scalar-selected-security']['x-selected-index'] = 0\n }\n\n // If the selected index is now out of bounds, select the last available\n if (selectedIndex >= newSelectedSecuritySchemes.length) {\n target['x-scalar-selected-security']['x-selected-index'] = newSelectedSecuritySchemes.length - 1\n }\n}\n\n/**\n * SecuritySchemeUpdate represents the possible updates that can be made\n * to an OpenAPI security scheme object via UI interactions.\n *\n * - `http`: Updates to HTTP type schemes (e.g. basic, bearer), allowing token, username, and password changes.\n * - `apiKey`: Updates to API Key type schemes, allowing the key name and its value to be updated.\n * - `oauth2`: Updates to OAuth2 type schemes for each supported OAuth2 flow.\n * - Can set various properties such as auth/token URLs, tokens, PKCE method, client credentials, etc.\n */\nexport type SecuritySchemeUpdate =\n | {\n type: 'http'\n payload: Partial<{\n token: string\n username: string\n password: string\n }>\n }\n | {\n type: 'apiKey'\n payload: Partial<{\n name: string\n value: string\n }>\n }\n | {\n type: 'oauth2'\n flow: 'implicit' | 'password' | 'clientCredentials' | 'authorizationCode'\n payload: Partial<{\n authUrl: string\n tokenUrl: string\n token: string\n redirectUrl: string\n clientId: string\n clientSecret: string\n usePkce: 'no' | 'SHA-256' | 'plain'\n username: string\n password: string\n }>\n }\n\n/**\n * Updates a security scheme in the OpenAPI document's components object.\n * Handles updates for HTTP, API Key, and OAuth2 types, saving secret information and configuration for UI-auth flows.\n *\n * @param document - The OpenAPI workspace document (can be null)\n * @param data - The update information, including type and payload\n * @param name - The name of the security scheme in document.components.securitySchemes\n *\n * Example usage:\n *\n * updateSecurityScheme({\n * document,\n * data: {\n * type: 'http',\n * payload: {\n * username: 'user123',\n * password: 'pw123',\n * token: 'tokenval'\n * }\n * },\n * name: 'MyHttpAuth',\n * })\n */\nexport const updateSecurityScheme = ({\n document,\n data,\n name,\n}: {\n document: WorkspaceDocument | null\n data: SecuritySchemeUpdate\n name: string\n}) => {\n if (!document) {\n return\n }\n\n const target = getResolvedRef(document.components?.securitySchemes?.[name])\n\n if (!target) {\n return\n }\n\n // Handle HTTP (basic, bearer, etc.)\n if (target.type === 'http' && data.type === 'http') {\n if (data.payload.username) {\n target['x-scalar-secret-username'] = data.payload.username\n }\n if (data.payload.password) {\n target['x-scalar-secret-password'] = data.payload.password\n }\n if (data.payload.token) {\n target['x-scalar-secret-token'] = data.payload.token\n }\n\n // Handle API Key\n } else if (target.type === 'apiKey' && data.type === 'apiKey') {\n if (data.payload.name) {\n target.name = data.payload.name\n }\n if (data.payload.value) {\n target['x-scalar-secret-token'] = data.payload.value\n }\n\n // Handle OAuth2 (various flows)\n } else if (target.type === 'oauth2' && data.type === 'oauth2') {\n const flow = target.flows[data.flow]\n if (!flow) {\n // If the flow is not found, do nothing\n return\n }\n\n if (data.payload.authUrl && 'authorizationUrl' in flow) {\n flow.authorizationUrl = data.payload.authUrl\n }\n if (data.payload.tokenUrl && 'tokenUrl' in flow) {\n flow.tokenUrl = data.payload.tokenUrl\n }\n if (data.payload.token && 'x-scalar-secret-token' in flow) {\n flow['x-scalar-secret-token'] = data.payload.token\n }\n if (data.payload.redirectUrl && 'x-scalar-secret-redirect-uri' in flow) {\n flow['x-scalar-secret-redirect-uri'] = data.payload.redirectUrl\n }\n if (data.payload.clientId && 'x-scalar-secret-client-id' in flow) {\n flow['x-scalar-secret-client-id'] = data.payload.clientId\n }\n if (data.payload.clientSecret && 'x-scalar-secret-client-secret' in flow) {\n flow['x-scalar-secret-client-secret'] = data.payload.clientSecret\n }\n if (data.payload.usePkce && 'x-usePkce' in flow) {\n flow['x-usePkce'] = data.payload.usePkce\n }\n if (data.payload.username && 'x-scalar-secret-username' in flow) {\n flow['x-scalar-secret-username'] = data.payload.username\n }\n if (data.payload.password && 'x-scalar-secret-password' in flow) {\n flow['x-scalar-secret-password'] = data.payload.password\n }\n }\n\n // TODO: handle openid connect type in the future\n\n return\n}\n\n/**\n * Sets the selected authentication tab (scheme) index for the given OpenAPI document or operation.\n * - When on the document level, updates the 'x-selected-index' on the document's x-scalar-selected-security extension.\n * - When on an operation (endpoint) level, updates the 'x-selected-index' for that operation's x-scalar-selected-security.\n *\n * Also initializes the x-scalar-selected-security extension if it does not exist.\n *\n * @param document The OpenAPI document object (may be null)\n * @param index The index to set as selected\n * @param meta Context where the selection applies ('document' or specific operation)\n *\n * @example\n * // Document-level tab selection\n * updateSelectedAuthTab({\n * document,\n * index: 1,\n * meta: { type: 'document' }\n * });\n *\n * // Operation-level tab selection (e.g., GET /pets)\n * updateSelectedAuthTab({\n * document,\n * index: 0,\n * meta: { type: 'operation', path: '/pets', method: 'get' }\n * });\n */\nexport const updateSelectedAuthTab = ({\n document,\n index,\n meta,\n}: {\n document: WorkspaceDocument | null\n index: number\n meta: AuthMeta\n}) => {\n if (!document) {\n return\n }\n\n // Determine the target object for setting the auth tab index:\n // - Document/root level\n // - Operation/endpoint level (if meta specifies operation)\n const getTarget = () => {\n if (meta.type === 'document') {\n return document\n }\n return getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n }\n\n const target = getTarget()\n if (!target) {\n return\n }\n\n // Ensure the 'x-scalar-selected-security' extension exists\n if (!target['x-scalar-selected-security']) {\n target['x-scalar-selected-security'] = {\n 'x-selected-index': 0,\n 'x-schemes': [],\n }\n }\n\n // Set the selected auth tab index\n target['x-scalar-selected-security']['x-selected-index'] = index\n}\n\n/**\n * Updates the scopes for a specific security requirement in the selected security schemes of\n * a document or operation.\n *\n * @param document - The OpenAPI WorkspaceDocument to update.\n * @param id - An array of scheme names that uniquely identifies the target security requirement.\n * For example: ['OAuth', 'ApiKeyAuth']\n * @param name - The security scheme name to update scopes for (e.g., 'OAuth').\n * @param scopes - The new list of scopes to set. For example: ['read:pets', 'write:pets']\n * @param meta - The context specifying whether the update is at the document-level or operation-level.\n *\n * Example usage:\n * ```ts\n * // Suppose your document (or operation) x-scalar-selected-security looks like:\n * // \"x-scalar-selected-security\": {\n * // \"x-selected-index\": 0,\n * // \"x-schemes\": [\n * // { \"OAuth\": [\"read:pets\"] },\n * // { \"ApiKeyAuth\": [] }\n * // ]\n * // }\n *\n * updateSelectedScopes({\n * document,\n * id: [\"OAuth\"], // identifies the scheme object: { \"OAuth\": [...] }\n * name: \"OAuth\", // scheme name to update within this security requirement\n * scopes: [\"write:pets\"], // new scopes array\n * meta: { type: \"document\" }\n * })\n * // After, the first scheme becomes: { \"OAuth\": [\"write:pets\"] }\n * ```\n */\nexport const updateSelectedScopes = ({\n document,\n id,\n name,\n scopes,\n meta,\n}: {\n document: WorkspaceDocument | null\n id: string[]\n name: string\n scopes: string[]\n meta: AuthMeta\n}) => {\n if (!document) {\n return\n }\n\n // Determine the target object (document or the operation)\n const getTarget = () => {\n if (meta.type === 'document') {\n return document\n }\n return getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n }\n\n const target = getTarget()\n\n if (!target) {\n return\n }\n\n // Array of security requirement objects under x-scalar-selected-security\n const selectedSchemes = target['x-scalar-selected-security']?.['x-schemes']\n\n if (!selectedSchemes) {\n return\n }\n\n // Find the security requirement that matches the given id (scheme key names)\n // For example: if id = [\"OAuth\"], matches { OAuth: [...] }\n const scheme = selectedSchemes.find((scheme) => JSON.stringify(Object.keys(scheme)) === JSON.stringify(id))\n\n if (!scheme) {\n return\n }\n\n // Set the scopes array for the named security scheme within the found security requirement\n scheme[name] = scopes\n}\n\n/**\n * Deletes one or more security schemes from an OpenAPI WorkspaceDocument,\n * and removes all references to those schemes from selected security, document-level security,\n * and operation-level security/selected security (e.g., on paths).\n *\n * Example usage:\n *\n * ```ts\n * deleteSecurityScheme({\n * document, // The OpenAPI document to update\n * names: ['ApiKeyAuth', 'BearerAuth'], // The names of security schemes you want to delete\n * });\n * ```\n *\n * After running this function:\n * - The named security schemes are removed from the components.securitySchemes section.\n * - All document-level and operation-level security entries referencing those schemes are removed.\n * - Any extended x-scalar-selected-security references to those schemes are also removed.\n */\nexport const deleteSecurityScheme = ({ document, names }: { document: WorkspaceDocument | null; names: string[] }) => {\n if (!document) {\n // Early exit if there is no document to modify\n return\n }\n\n // Get the mutable reference to securitySchemes in components (may be a proxy/resolved reference)\n const target = getResolvedRef(document.components?.securitySchemes)\n\n if (!target) {\n // If there are no security schemes to delete from, return early\n return\n }\n\n // Remove each named security scheme from the components.securitySchemes object\n names.forEach((name) => {\n delete target[name]\n })\n\n // Function to remove any security requirement objects that reference given scheme names.\n const filterSecuritySchemes = (schemes: SecurityRequirementObject[]) => {\n // Remove schemes whose key is included in the `names` to be deleted.\n return schemes.filter((scheme) => !names.some((name) => Object.keys(scheme).includes(name)))\n }\n\n // -- Remove from document-level `x-scalar-selected-security` extension, if present\n if (document['x-scalar-selected-security']) {\n const selectedSecurity = document['x-scalar-selected-security']\n selectedSecurity['x-schemes'] = filterSecuritySchemes(selectedSecurity['x-schemes'])\n }\n\n // -- Remove from document-level `security` property, if present\n if (document['security']) {\n document['security'] = filterSecuritySchemes(document['security'])\n }\n\n // -- For each path and operation, remove deleted security schemes from operation-level security and custom extension\n Object.values(document.paths ?? {}).forEach((path) => {\n Object.values(path).forEach((operation) => {\n if (typeof operation !== 'object') {\n // Ignore operations that are not objects (could be undefined)\n return\n }\n\n // Get mutable reference for the operation (could resolve $ref proxies)\n const resolvedOperation = getResolvedRef(operation)\n\n // Remove from operation-level security array\n if ('security' in resolvedOperation && resolvedOperation['security']) {\n resolvedOperation['security'] = filterSecuritySchemes(resolvedOperation['security'])\n }\n\n // Remove from operation-level x-scalar-selected-security array\n if ('x-scalar-selected-security' in resolvedOperation && resolvedOperation['x-scalar-selected-security']) {\n resolvedOperation['x-scalar-selected-security']['x-schemes'] = filterSecuritySchemes(\n resolvedOperation['x-scalar-selected-security']['x-schemes'],\n )\n }\n })\n })\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { HttpMethod } from '@scalar/helpers/http/http-methods'\n\nimport type { AuthEvents } from '@/events/definitions/auth'\nimport { generateUniqueValue } from '@/helpers/generate-unique-value'\nimport { getResolvedRef } from '@/helpers/get-resolved-ref'\nimport { mergeObjects } from '@/helpers/merge-object'\nimport type { WorkspaceDocument } from '@/schemas'\nimport type { SecurityRequirementObject } from '@/schemas/v3.1/strict/security-requirement'\n\n/**\n * AuthMeta defines the meta information needed to specify whether the authentication operation\n * is being performed at the document level (entire API), or for a specific operation (specific path and method).\n *\n * - If type is 'document', the operation applies to the whole OpenAPI document.\n * - If type is 'operation', it targets a specific operation, identified by its path and method.\n */\nexport type AuthMeta =\n | {\n type: 'document'\n }\n | {\n type: 'operation'\n path: string\n method: HttpMethod\n }\n\n/**\n * Updates the selected security schemes for either the entire document or a specific operation.\n * - Adds newly created security schemes (if any) to the workspace document's components.\n * - Ensures that each new scheme name is unique within the document by using `generateUniqueValue`.\n * - Updates the `x-scalar-selected-security` property on the target (document or operation) to reflect the new set of selected security schemes.\n * - Corrects and maintains the selected index so it points to a valid security scheme.\n *\n * @param document - The workspace OpenAPI document to mutate (can be null, in which case nothing happens)\n * @param selectedSecuritySchemes - The current list of selected security scheme objects\n * @param create - Array of new schemes to create, each with a name and a scheme definition\n * @param meta - Location to update: whole document or a specific operation (`{ type: 'document' }` or `{ type: 'operation', path, method }`)\n *\n * Example usage:\n * ```\n * updateSelectedSecuritySchemes({\n * document,\n * selectedSecuritySchemes: [{ bearerAuth: [] }],\n * create: [\n * { name: 'ApiKeyAuth', scheme: { type: 'apiKey', in: 'header', name: 'X-API-Key' } }\n * ],\n * meta: { type: 'document' }\n * })\n * ```\n */\nexport const updateSelectedSecuritySchemes = async (\n document: WorkspaceDocument | null,\n { selectedRequirements, newSchemes, meta }: AuthEvents['auth:update:selected-security-schemes'],\n) => {\n if (!document) {\n return\n }\n\n // Helper to get the target (whole document or a specific operation)\n const getTarget = () => {\n if (meta.type === 'document') {\n return document\n }\n\n return getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n }\n\n const createdSecurityRequirements = await Promise.all(\n newSchemes.map(async (newScheme) => {\n const uniqueSchemeName = await generateUniqueValue({\n defaultValue: newScheme.name,\n validation: (value) => !document.components?.securitySchemes?.[value],\n maxRetries: 100,\n })\n\n if (!uniqueSchemeName) {\n return\n }\n\n // Ensure components and securitySchemes exist\n if (!document.components) {\n document.components = {}\n }\n if (!document.components.securitySchemes) {\n document.components.securitySchemes = {}\n }\n\n // Add the new security scheme definition\n document.components.securitySchemes[uniqueSchemeName] = newScheme.scheme\n\n // Return an OpenAPI Security Requirement Object for this new scheme (empty scope array)\n return {\n [uniqueSchemeName]: [],\n }\n }),\n )\n\n // Create any new security schemes required, ensuring unique names for the components\n const createdSchemes = createdSecurityRequirements.filter(Boolean) as SecurityRequirementObject[]\n\n const target = getTarget()\n\n const newSelectedSecuritySchemes = [...selectedRequirements, ...createdSchemes]\n\n // If the target (document/operation) doesn't exist, do nothing\n if (!target) {\n return\n }\n\n // Ensure the x-scalar-selected-security structure exists on the target\n if (!target['x-scalar-selected-security']) {\n target['x-scalar-selected-security'] = {\n selectedIndex: -1,\n selectedSchemes: [],\n }\n }\n\n const selectedIndex = target['x-scalar-selected-security'].selectedIndex\n\n // Update the schemes array\n target['x-scalar-selected-security'].selectedSchemes = newSelectedSecuritySchemes\n\n // Adjust selected index if there are schemes and the index is unset/invalid\n if (newSelectedSecuritySchemes.length > 0 && selectedIndex < 0) {\n target['x-scalar-selected-security'].selectedIndex = 0\n }\n\n // If the selected index is now out of bounds, select the last available\n if (selectedIndex >= newSelectedSecuritySchemes.length) {\n target['x-scalar-selected-security'].selectedIndex = newSelectedSecuritySchemes.length - 1\n }\n}\n\n/**\n * Updates a security scheme in the OpenAPI document's components object.\n * Handles updates for HTTP, API Key, and OAuth2 types, saving secret information and configuration for UI-auth flows.\n *\n * @param document - The OpenAPI workspace document (can be null)\n * @param data - The update information, including type and payload\n * @param name - The name of the security scheme in document.components.securitySchemes\n *\n * Example usage:\n *\n * updateSecurityScheme({\n * document,\n * data: {\n * type: 'http',\n * payload: {\n * username: 'user123',\n * password: 'pw123',\n * token: 'tokenval'\n * }\n * },\n * name: 'MyHttpAuth',\n * })\n */\nexport const updateSecurityScheme = (\n document: WorkspaceDocument | null,\n { payload, name }: AuthEvents['auth:update:security-scheme'],\n) => {\n const target = getResolvedRef(document?.components?.securitySchemes?.[name])\n if (!target) {\n console.error(`Security scheme ${name} not found`)\n return\n }\n\n // Handle HTTP (basic, bearer, etc.)\n if (target.type === payload.type) {\n mergeObjects(target, payload)\n }\n\n return target\n}\n\n/**\n * Sets the selected authentication tab (scheme) index for the given OpenAPI document or operation.\n * - When on the document level, updates the 'selectedIndex' on the document's x-scalar-selected-security extension.\n * - When on an operation (endpoint) level, updates the 'selectedIndex' for that operation's x-scalar-selected-security.\n *\n * Also initializes the x-scalar-selected-security extension if it does not exist.\n *\n * @param document The OpenAPI document object (may be null)\n * @param index The index to set as selected\n * @param meta Context where the selection applies ('document' or specific operation)\n *\n * @example\n * // Document-level tab selection\n * updateSelectedAuthTab({\n * document,\n * index: 1,\n * meta: { type: 'document' }\n * });\n *\n * // Operation-level tab selection (e.g., GET /pets)\n * updateSelectedAuthTab({\n * document,\n * index: 0,\n * meta: { type: 'operation', path: '/pets', method: 'get' }\n * });\n */\nexport const updateSelectedAuthTab = (\n document: WorkspaceDocument | null,\n { index, meta }: AuthEvents['auth:update:active-index'],\n) => {\n if (!document) {\n return\n }\n\n // Determine the target object for setting the auth tab index:\n // - Document/root level\n // - Operation/endpoint level (if meta specifies operation)\n const getTarget = () => {\n if (meta.type === 'document') {\n return document\n }\n return getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n }\n\n const target = getTarget()\n if (!target) {\n return\n }\n\n // Ensure the 'x-scalar-selected-security' extension exists\n if (!target['x-scalar-selected-security']) {\n target['x-scalar-selected-security'] = {\n selectedIndex: 0,\n selectedSchemes: [],\n }\n }\n\n // Set the selected auth tab index\n target['x-scalar-selected-security'].selectedIndex = index\n}\n\n/**\n * Updates the scopes for a specific security requirement in the selected security schemes of\n * a document or operation.\n *\n * @param document - The OpenAPI WorkspaceDocument to update.\n * @param id - An array of scheme names that uniquely identifies the target security requirement.\n * For example: ['OAuth', 'ApiKeyAuth']\n * @param name - The security scheme name to update scopes for (e.g., 'OAuth').\n * @param scopes - The new list of scopes to set. For example: ['read:pets', 'write:pets']\n * @param meta - The context specifying whether the update is at the document-level or operation-level.\n *\n * Example usage:\n * ```ts\n * // Suppose your document (or operation) x-scalar-selected-security looks like:\n * // \"x-scalar-selected-security\": {\n * // selectedIndex: 0,\n * // selectedSchemes: [\n * // { \"OAuth\": [\"read:pets\"] },\n * // { \"ApiKeyAuth\": [] }\n * // ]\n * // }\n *\n * updateSelectedScopes({\n * document,\n * id: [\"OAuth\"], // identifies the scheme object: { \"OAuth\": [...] }\n * name: \"OAuth\", // scheme name to update within this security requirement\n * scopes: [\"write:pets\"], // new scopes array\n * meta: { type: \"document\" }\n * })\n * // After, the first scheme becomes: { \"OAuth\": [\"write:pets\"] }\n * ```\n */\nexport const updateSelectedScopes = (\n document: WorkspaceDocument | null,\n { id, name, scopes, meta }: AuthEvents['auth:update:selected-scopes'],\n) => {\n if (!document) {\n return\n }\n\n // Determine the target object (document or the operation)\n const getTarget = () => {\n if (meta.type === 'document') {\n return document\n }\n return getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n }\n\n const target = getTarget()\n\n if (!target) {\n return\n }\n\n // Array of security requirement objects under x-scalar-selected-security\n const selectedSchemes = target['x-scalar-selected-security']?.selectedSchemes\n\n if (!selectedSchemes) {\n return\n }\n\n // Find the security requirement that matches the given id (scheme key names)\n // For example: if id = [\"OAuth\"], matches { OAuth: [...] }\n const scheme = selectedSchemes.find((scheme) => JSON.stringify(Object.keys(scheme)) === JSON.stringify(id))\n\n if (!scheme) {\n return\n }\n\n // Set the scopes array for the named security scheme within the found security requirement\n scheme[name] = scopes\n}\n\n/**\n * Deletes one or more security schemes from an OpenAPI WorkspaceDocument,\n * and removes all references to those schemes from selected security, document-level security,\n * and operation-level security/selected security (e.g., on paths).\n *\n * Example usage:\n *\n * ```ts\n * deleteSecurityScheme({\n * document, // The OpenAPI document to update\n * names: ['ApiKeyAuth', 'BearerAuth'], // The names of security schemes you want to delete\n * });\n * ```\n *\n * After running this function:\n * - The named security schemes are removed from the components.securitySchemes section.\n * - All document-level and operation-level security entries referencing those schemes are removed.\n * - Any extended x-scalar-selected-security references to those schemes are also removed.\n */\nexport const deleteSecurityScheme = (\n document: WorkspaceDocument | null,\n { names }: AuthEvents['auth:delete:security-scheme'],\n) => {\n if (!document) {\n // Early exit if there is no document to modify\n return\n }\n\n // Get the mutable reference to securitySchemes in components (may be a proxy/resolved reference)\n const target = getResolvedRef(document.components?.securitySchemes)\n\n if (!target) {\n // If there are no security schemes to delete from, return early\n return\n }\n\n // Remove each named security scheme from the components.securitySchemes object\n names.forEach((name) => {\n delete target[name]\n })\n\n // Function to remove any security requirement objects that reference given scheme names.\n const filterSecuritySchemes = (schemes: SecurityRequirementObject[]) => {\n // Remove schemes whose key is included in the `names` to be deleted.\n return schemes.filter((scheme) => !names.some((name) => Object.keys(scheme).includes(name)))\n }\n\n // -- Remove from document-level `x-scalar-selected-security` extension, if present\n if (document['x-scalar-selected-security']) {\n const selectedSecurity = document['x-scalar-selected-security']\n selectedSecurity.selectedSchemes = filterSecuritySchemes(selectedSecurity.selectedSchemes)\n }\n\n // -- Remove from document-level `security` property, if present\n if (document['security']) {\n document['security'] = filterSecuritySchemes(document['security'])\n }\n\n // -- For each path and operation, remove deleted security schemes from operation-level security and custom extension\n Object.values(document.paths ?? {}).forEach((path) => {\n Object.values(path).forEach((operation) => {\n if (typeof operation !== 'object') {\n // Ignore operations that are not objects (could be undefined)\n return\n }\n\n // Get mutable reference for the operation (could resolve $ref proxies)\n const resolvedOperation = getResolvedRef(operation)\n\n // Remove from operation-level security array\n if ('security' in resolvedOperation && resolvedOperation['security']) {\n resolvedOperation['security'] = filterSecuritySchemes(resolvedOperation['security'])\n }\n\n // Remove from operation-level x-scalar-selected-security array\n if ('x-scalar-selected-security' in resolvedOperation && resolvedOperation['x-scalar-selected-security']) {\n resolvedOperation['x-scalar-selected-security'].selectedSchemes = filterSecuritySchemes(\n resolvedOperation['x-scalar-selected-security'].selectedSchemes,\n )\n }\n })\n })\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["scheme"]
7
7
  }
@@ -1,17 +1,25 @@
1
- import type { UnknownObject } from '../helpers/general.js';
2
- import type { XScalarClientConfigCookie, XScalarClientConfigCookies } from '../schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.js';
1
+ import type { CookieEvents } from '../events/definitions/cookie.js';
2
+ import type { Workspace, WorkspaceDocument } from '../schemas.js';
3
+ import { type XScalarCookie } from '../schemas/extensions/general/x-scalar-cookies.js';
3
4
  /**
4
- * Cookie mutators for managing client configuration cookies in OpenAPI documents.
5
- * Provides functions to add and delete cookies from the document's x-scalar-client-config-cookies extension.
5
+ * Adds OR updates a cookie to the document or workspace.
6
6
  *
7
- * @param store - The workspace store containing the documents
8
- * @param documentName - The name of the document to operate on
9
- * @returns Object containing addCookie and deleteCookie functions
7
+ * @param document - current document if available
8
+ * @param workspace - current workspace if available
9
+ * @param payload - The cookie configuration to add or update
10
+ * @param index - Optional index for updating an existing cookie
11
+ * @param collectionType - Whether this is for a document or workspace
12
+ * @returns the parsed cookie that was added or updated or undefined if the collection is not found
10
13
  */
11
- export declare const cookieMutators: (document?: UnknownObject & {
12
- "x-scalar-client-config-cookies"?: XScalarClientConfigCookies;
13
- }) => {
14
- addCookie: (cookie: XScalarClientConfigCookie) => boolean;
15
- deleteCookie: (cookieName: string) => boolean;
16
- };
14
+ export declare const upsertCookie: (collection: WorkspaceDocument | Workspace | null, { payload, index }: CookieEvents["cookie:upsert:cookie"]) => XScalarCookie | undefined;
15
+ /**
16
+ * Deletes a cookie from the document or workspace by index.
17
+ *
18
+ * @param document - current document if available
19
+ * @param workspace - current workspace if available
20
+ * @param index - Index of the cookie to delete
21
+ * @param collectionType - Whether this is for a document or workspace
22
+ * @returns true if the cookie was deleted, false otherwise
23
+ */
24
+ export declare const deleteCookie: (collection: WorkspaceDocument | Workspace | null, { index }: CookieEvents["cookie:delete:cookie"]) => boolean;
17
25
  //# sourceMappingURL=cookie.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cookie.d.ts","sourceRoot":"","sources":["../../src/mutators/cookie.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,KAAK,EACV,yBAAyB,EACzB,0BAA0B,EAC3B,MAAM,+EAA+E,CAAA;AAEtF;;;;;;;GAOG;AACH,eAAO,MAAM,cAAc,GACzB,WAAW,aAAa,GAAG;IAAE,gCAAgC,CAAC,EAAE,0BAA0B,CAAA;CAAE;wBAwBjE,yBAAyB;+BA+BlB,MAAM;CAazC,CAAA"}
1
+ {"version":3,"file":"cookie.d.ts","sourceRoot":"","sources":["../../src/mutators/cookie.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAC7D,OAAO,EAAE,KAAK,aAAa,EAAuB,MAAM,+CAA+C,CAAA;AAGvG;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,GACvB,YAAY,iBAAiB,GAAG,SAAS,GAAG,IAAI,EAChD,oBAAoB,YAAY,CAAC,sBAAsB,CAAC,KACvD,aAAa,GAAG,SA8BlB,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,GACvB,YAAY,iBAAiB,GAAG,SAAS,GAAG,IAAI,EAChD,WAAW,YAAY,CAAC,sBAAsB,CAAC,KAC9C,OAWF,CAAA"}
@@ -1,31 +1,39 @@
1
- const cookieMutators = (document) => {
2
- const addCookie = (cookie) => {
3
- if (!document) {
4
- return false;
1
+ import { xScalarCookieSchema } from "../schemas/extensions/general/x-scalar-cookies.js";
2
+ import { coerceValue } from "../schemas/typebox-coerce.js";
3
+ const upsertCookie = (collection, { payload, index }) => {
4
+ if (!collection) {
5
+ return;
6
+ }
7
+ if (!collection["x-scalar-cookies"]) {
8
+ collection["x-scalar-cookies"] = [];
9
+ }
10
+ if (index !== void 0) {
11
+ if (index < 0 || index >= collection["x-scalar-cookies"].length) {
12
+ return;
5
13
  }
6
- if (!document["x-scalar-client-config-cookies"]) {
7
- document["x-scalar-client-config-cookies"] = {};
8
- }
9
- if (document["x-scalar-client-config-cookies"][cookie.name]) {
10
- console.warn(`Cookie with name "${cookie.name}" already exists in the document.`);
11
- return false;
12
- }
13
- document["x-scalar-client-config-cookies"][cookie.name] = cookie;
14
- return true;
15
- };
16
- const deleteCookie = (cookieName) => {
17
- if (!document || !document["x-scalar-client-config-cookies"]) {
18
- return false;
19
- }
20
- delete document["x-scalar-client-config-cookies"][cookieName];
21
- return true;
22
- };
23
- return {
24
- addCookie,
25
- deleteCookie
26
- };
14
+ const parsed2 = coerceValue(xScalarCookieSchema, {
15
+ ...collection["x-scalar-cookies"][index],
16
+ ...payload
17
+ });
18
+ collection["x-scalar-cookies"][index] = parsed2;
19
+ return parsed2;
20
+ }
21
+ const parsed = coerceValue(xScalarCookieSchema, payload);
22
+ collection["x-scalar-cookies"].push(parsed);
23
+ return parsed;
24
+ };
25
+ const deleteCookie = (collection, { index }) => {
26
+ if (!collection || !collection["x-scalar-cookies"]) {
27
+ return false;
28
+ }
29
+ if (index < 0 || index >= collection["x-scalar-cookies"].length) {
30
+ return false;
31
+ }
32
+ collection["x-scalar-cookies"].splice(index, 1);
33
+ return true;
27
34
  };
28
35
  export {
29
- cookieMutators
36
+ deleteCookie,
37
+ upsertCookie
30
38
  };
31
39
  //# sourceMappingURL=cookie.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/mutators/cookie.ts"],
4
- "sourcesContent": ["import type { UnknownObject } from '@/helpers/general'\nimport type {\n XScalarClientConfigCookie,\n XScalarClientConfigCookies,\n} from '@/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies'\n\n/**\n * Cookie mutators for managing client configuration cookies in OpenAPI documents.\n * Provides functions to add and delete cookies from the document's x-scalar-client-config-cookies extension.\n *\n * @param store - The workspace store containing the documents\n * @param documentName - The name of the document to operate on\n * @returns Object containing addCookie and deleteCookie functions\n */\nexport const cookieMutators = (\n document?: UnknownObject & { 'x-scalar-client-config-cookies'?: XScalarClientConfigCookies },\n) => {\n /**\n * Adds a new cookie to the document's client configuration.\n * If a cookie with the same name already exists, it will log a warning and return false.\n *\n * @param cookie - The cookie configuration to add\n * @returns true if the cookie was added successfully, false if it already exists\n *\n * @example\n * // Add a new authentication cookie\n * const success = addCookie({\n * name: 'auth-token',\n * value: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',\n * domain: '.example.com',\n * path: '/'\n * })\n *\n * if (success) {\n * console.log('Cookie added successfully')\n * } else {\n * console.log('Cookie already exists')\n * }\n */\n const addCookie = (cookie: XScalarClientConfigCookie) => {\n if (!document) {\n return false\n }\n\n if (!document['x-scalar-client-config-cookies']) {\n document['x-scalar-client-config-cookies'] = {}\n }\n\n if (document['x-scalar-client-config-cookies'][cookie.name]) {\n console.warn(`Cookie with name \"${cookie.name}\" already exists in the document.`)\n return false\n }\n\n document['x-scalar-client-config-cookies'][cookie.name] = cookie\n return true\n }\n\n /**\n * Removes a cookie from the document's x-scalar-client-config-cookies extension by its name.\n * Returns false if the document or cookies object does not exist, otherwise deletes the cookie and returns true.\n *\n * @param cookieName - The name of the cookie to remove\n *\n * @example\n * // Remove an authentication cookie\n * deleteCookie('auth-token')\n *\n * // Remove a session cookie\n * deleteCookie('session-id')\n */\n const deleteCookie = (cookieName: string) => {\n if (!document || !document['x-scalar-client-config-cookies']) {\n return false\n }\n\n delete document['x-scalar-client-config-cookies'][cookieName]\n return true\n }\n\n return {\n addCookie,\n deleteCookie,\n }\n}\n"],
5
- "mappings": "AAcO,MAAM,iBAAiB,CAC5B,aACG;AAuBH,QAAM,YAAY,CAAC,WAAsC;AACvD,QAAI,CAAC,UAAU;AACb,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,SAAS,gCAAgC,GAAG;AAC/C,eAAS,gCAAgC,IAAI,CAAC;AAAA,IAChD;AAEA,QAAI,SAAS,gCAAgC,EAAE,OAAO,IAAI,GAAG;AAC3D,cAAQ,KAAK,qBAAqB,OAAO,IAAI,mCAAmC;AAChF,aAAO;AAAA,IACT;AAEA,aAAS,gCAAgC,EAAE,OAAO,IAAI,IAAI;AAC1D,WAAO;AAAA,EACT;AAeA,QAAM,eAAe,CAAC,eAAuB;AAC3C,QAAI,CAAC,YAAY,CAAC,SAAS,gCAAgC,GAAG;AAC5D,aAAO;AAAA,IACT;AAEA,WAAO,SAAS,gCAAgC,EAAE,UAAU;AAC5D,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;",
6
- "names": []
4
+ "sourcesContent": ["import type { CookieEvents } from '@/events/definitions/cookie'\nimport type { Workspace, WorkspaceDocument } from '@/schemas'\nimport { type XScalarCookie, xScalarCookieSchema } from '@/schemas/extensions/general/x-scalar-cookies'\nimport { coerceValue } from '@/schemas/typebox-coerce'\n\n/**\n * Adds OR updates a cookie to the document or workspace.\n *\n * @param document - current document if available\n * @param workspace - current workspace if available\n * @param payload - The cookie configuration to add or update\n * @param index - Optional index for updating an existing cookie\n * @param collectionType - Whether this is for a document or workspace\n * @returns the parsed cookie that was added or updated or undefined if the collection is not found\n */\nexport const upsertCookie = (\n collection: WorkspaceDocument | Workspace | null,\n { payload, index }: CookieEvents['cookie:upsert:cookie'],\n): XScalarCookie | undefined => {\n if (!collection) {\n return\n }\n\n if (!collection['x-scalar-cookies']) {\n collection['x-scalar-cookies'] = []\n }\n\n if (index !== undefined) {\n // Update existing cookie at index\n if (index < 0 || index >= collection['x-scalar-cookies'].length) {\n return\n }\n\n // Ensure we parse the payload but keep the existing cookie data\n const parsed = coerceValue(xScalarCookieSchema, {\n ...collection['x-scalar-cookies'][index],\n ...payload,\n })\n\n // Update\n collection['x-scalar-cookies'][index] = parsed\n return parsed\n }\n\n // Add new cookie\n const parsed = coerceValue(xScalarCookieSchema, payload)\n collection['x-scalar-cookies'].push(parsed)\n return parsed\n}\n\n/**\n * Deletes a cookie from the document or workspace by index.\n *\n * @param document - current document if available\n * @param workspace - current workspace if available\n * @param index - Index of the cookie to delete\n * @param collectionType - Whether this is for a document or workspace\n * @returns true if the cookie was deleted, false otherwise\n */\nexport const deleteCookie = (\n collection: WorkspaceDocument | Workspace | null,\n { index }: CookieEvents['cookie:delete:cookie'],\n): boolean => {\n if (!collection || !collection['x-scalar-cookies']) {\n return false\n }\n\n if (index < 0 || index >= collection['x-scalar-cookies'].length) {\n return false\n }\n\n collection['x-scalar-cookies'].splice(index, 1)\n return true\n}\n"],
5
+ "mappings": "AAEA,SAA6B,2BAA2B;AACxD,SAAS,mBAAmB;AAYrB,MAAM,eAAe,CAC1B,YACA,EAAE,SAAS,MAAM,MACa;AAC9B,MAAI,CAAC,YAAY;AACf;AAAA,EACF;AAEA,MAAI,CAAC,WAAW,kBAAkB,GAAG;AACnC,eAAW,kBAAkB,IAAI,CAAC;AAAA,EACpC;AAEA,MAAI,UAAU,QAAW;AAEvB,QAAI,QAAQ,KAAK,SAAS,WAAW,kBAAkB,EAAE,QAAQ;AAC/D;AAAA,IACF;AAGA,UAAMA,UAAS,YAAY,qBAAqB;AAAA,MAC9C,GAAG,WAAW,kBAAkB,EAAE,KAAK;AAAA,MACvC,GAAG;AAAA,IACL,CAAC;AAGD,eAAW,kBAAkB,EAAE,KAAK,IAAIA;AACxC,WAAOA;AAAA,EACT;AAGA,QAAM,SAAS,YAAY,qBAAqB,OAAO;AACvD,aAAW,kBAAkB,EAAE,KAAK,MAAM;AAC1C,SAAO;AACT;AAWO,MAAM,eAAe,CAC1B,YACA,EAAE,MAAM,MACI;AACZ,MAAI,CAAC,cAAc,CAAC,WAAW,kBAAkB,GAAG;AAClD,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,KAAK,SAAS,WAAW,kBAAkB,EAAE,QAAQ;AAC/D,WAAO;AAAA,EACT;AAEA,aAAW,kBAAkB,EAAE,OAAO,OAAO,CAAC;AAC9C,SAAO;AACT;",
6
+ "names": ["parsed"]
7
7
  }