@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.
- package/CHANGELOG.md +44 -0
- package/README.md +2 -2
- package/dist/client.d.ts +40 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +58 -23
- package/dist/client.js.map +2 -2
- package/dist/events/bus.d.ts +13 -1
- package/dist/events/bus.d.ts.map +1 -1
- package/dist/events/bus.js +46 -10
- package/dist/events/bus.js.map +3 -3
- package/dist/events/definitions/auth.d.ts +20 -2
- package/dist/events/definitions/auth.d.ts.map +1 -1
- package/dist/events/definitions/cookie.d.ts +20 -0
- package/dist/events/definitions/cookie.d.ts.map +1 -0
- package/dist/events/definitions/cookie.js +1 -0
- package/dist/events/definitions/cookie.js.map +7 -0
- package/dist/events/definitions/document.d.ts +11 -1
- package/dist/events/definitions/document.d.ts.map +1 -1
- package/dist/events/definitions/index.d.ts +4 -2
- package/dist/events/definitions/index.d.ts.map +1 -1
- package/dist/events/definitions/operation.d.ts +0 -13
- package/dist/events/definitions/operation.d.ts.map +1 -1
- package/dist/events/definitions/server.d.ts +20 -28
- package/dist/events/definitions/server.d.ts.map +1 -1
- package/dist/events/definitions/tabs.d.ts +40 -0
- package/dist/events/definitions/tabs.d.ts.map +1 -0
- package/dist/events/definitions/tabs.js +1 -0
- package/dist/events/definitions/tabs.js.map +7 -0
- package/dist/events/definitions/ui.d.ts +39 -4
- package/dist/events/definitions/ui.d.ts.map +1 -1
- package/dist/events/definitions/workspace.d.ts +18 -0
- package/dist/events/definitions/workspace.d.ts.map +1 -0
- package/dist/events/definitions/workspace.js +1 -0
- package/dist/events/definitions/workspace.js.map +7 -0
- package/dist/events/index.d.ts +2 -2
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js.map +2 -2
- package/dist/helpers/generate-unique-value.d.ts +19 -6
- package/dist/helpers/generate-unique-value.d.ts.map +1 -1
- package/dist/helpers/generate-unique-value.js +12 -7
- package/dist/helpers/generate-unique-value.js.map +2 -2
- package/dist/helpers/unpack-proxy.d.ts +14 -1
- package/dist/helpers/unpack-proxy.d.ts.map +1 -1
- package/dist/helpers/unpack-proxy.js +51 -1
- package/dist/helpers/unpack-proxy.js.map +3 -3
- package/dist/mutators/auth.d.ts +10 -73
- package/dist/mutators/auth.d.ts.map +1 -1
- package/dist/mutators/auth.js +47 -111
- package/dist/mutators/auth.js.map +2 -2
- package/dist/mutators/cookie.d.ts +21 -13
- package/dist/mutators/cookie.d.ts.map +1 -1
- package/dist/mutators/cookie.js +34 -26
- package/dist/mutators/cookie.js.map +3 -3
- package/dist/mutators/document.d.ts +13 -0
- package/dist/mutators/document.d.ts.map +1 -0
- package/dist/mutators/document.js +25 -0
- package/dist/mutators/document.js.map +7 -0
- package/dist/mutators/index.d.ts +13 -20
- package/dist/mutators/index.d.ts.map +1 -1
- package/dist/mutators/index.js +49 -8
- package/dist/mutators/index.js.map +3 -3
- package/dist/mutators/operation.d.ts +23 -101
- package/dist/mutators/operation.d.ts.map +1 -1
- package/dist/mutators/operation.js +132 -96
- package/dist/mutators/operation.js.map +2 -2
- package/dist/mutators/server.d.ts +43 -8
- package/dist/mutators/server.d.ts.map +1 -1
- package/dist/mutators/server.js +113 -20
- package/dist/mutators/server.js.map +2 -2
- package/dist/mutators/workspace.d.ts +6 -0
- package/dist/mutators/workspace.d.ts.map +1 -0
- package/dist/mutators/workspace.js +24 -0
- package/dist/mutators/workspace.js.map +7 -0
- package/dist/navigation/get-navigation-options.d.ts.map +1 -1
- package/dist/navigation/get-navigation-options.js +4 -4
- package/dist/navigation/get-navigation-options.js.map +2 -2
- package/dist/navigation/helpers/traverse-document.d.ts +2 -0
- package/dist/navigation/helpers/traverse-document.d.ts.map +1 -1
- package/dist/navigation/helpers/traverse-document.js +18 -3
- package/dist/navigation/helpers/traverse-document.js.map +2 -2
- package/dist/navigation/helpers/traverse-examples.js +2 -2
- package/dist/navigation/helpers/traverse-examples.js.map +2 -2
- package/dist/navigation/helpers/traverse-paths.d.ts +6 -3
- package/dist/navigation/helpers/traverse-paths.d.ts.map +1 -1
- package/dist/navigation/helpers/traverse-paths.js +4 -9
- package/dist/navigation/helpers/traverse-paths.js.map +2 -2
- package/dist/navigation/helpers/traverse-tags.d.ts +0 -1
- package/dist/navigation/helpers/traverse-tags.d.ts.map +1 -1
- package/dist/navigation/helpers/traverse-tags.js +57 -49
- package/dist/navigation/helpers/traverse-tags.js.map +3 -3
- package/dist/persistence/index.d.ts +6 -0
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +18 -0
- package/dist/persistence/index.js.map +2 -2
- package/dist/persistence/indexdb.d.ts +1 -0
- package/dist/persistence/indexdb.d.ts.map +1 -1
- package/dist/persistence/indexdb.js +6 -1
- package/dist/persistence/indexdb.js.map +2 -2
- package/dist/plugins/client/persistence.d.ts +2 -1
- package/dist/plugins/client/persistence.d.ts.map +1 -1
- package/dist/plugins/client/persistence.js +17 -9
- package/dist/plugins/client/persistence.js.map +2 -2
- package/dist/schemas/extensions/document/x-scalar-environments.d.ts +1 -0
- package/dist/schemas/extensions/document/x-scalar-environments.d.ts.map +1 -1
- package/dist/schemas/extensions/document/x-scalar-environments.js.map +2 -2
- package/dist/schemas/extensions/document/x-scalar-set-operation-security.d.ts +13 -0
- package/dist/schemas/extensions/document/x-scalar-set-operation-security.d.ts.map +1 -0
- package/dist/schemas/extensions/document/x-scalar-set-operation-security.js +8 -0
- package/dist/schemas/extensions/document/x-scalar-set-operation-security.js.map +7 -0
- package/dist/schemas/extensions/general/x-scalar-cookies.d.ts +36 -0
- package/dist/schemas/extensions/general/x-scalar-cookies.d.ts.map +1 -0
- package/dist/schemas/extensions/general/x-scalar-cookies.js +15 -0
- package/dist/schemas/extensions/general/x-scalar-cookies.js.map +7 -0
- package/dist/schemas/extensions/general/x-scalar-order.d.ts +12 -0
- package/dist/schemas/extensions/general/x-scalar-order.d.ts.map +1 -0
- package/dist/schemas/extensions/general/x-scalar-order.js +8 -0
- package/dist/schemas/extensions/general/x-scalar-order.js.map +7 -0
- package/dist/schemas/extensions/security/x-scalar-selected-security.d.ts +7 -7
- package/dist/schemas/extensions/security/x-scalar-selected-security.d.ts.map +1 -1
- package/dist/schemas/extensions/security/x-scalar-selected-security.js +2 -2
- package/dist/schemas/extensions/security/x-scalar-selected-security.js.map +2 -2
- package/dist/schemas/extensions/server/x-scalar-selected-server.d.ts +8 -0
- package/dist/schemas/extensions/server/x-scalar-selected-server.d.ts.map +1 -0
- package/dist/schemas/extensions/server/x-scalar-selected-server.js +8 -0
- package/dist/schemas/extensions/server/x-scalar-selected-server.js.map +7 -0
- package/dist/schemas/extensions/tag/x-tag-groups.d.ts +10 -5
- package/dist/schemas/extensions/tag/x-tag-groups.d.ts.map +1 -1
- package/dist/schemas/extensions/tag/x-tag-groups.js +15 -10
- package/dist/schemas/extensions/tag/x-tag-groups.js.map +2 -2
- package/dist/schemas/extensions/workspace/x-scalar-active-proxy.d.ts +18 -0
- package/dist/schemas/extensions/workspace/x-scalar-active-proxy.d.ts.map +1 -0
- package/dist/schemas/extensions/workspace/x-scalar-active-proxy.js +8 -0
- package/dist/schemas/extensions/workspace/x-scalar-active-proxy.js.map +7 -0
- package/dist/schemas/extensions.d.ts +1 -1
- package/dist/schemas/extensions.js +1 -1
- package/dist/schemas/extensions.js.map +2 -2
- package/dist/schemas/inmemory-workspace.d.ts +59 -33
- package/dist/schemas/inmemory-workspace.d.ts.map +1 -1
- package/dist/schemas/navigation.d.ts +9 -1
- package/dist/schemas/navigation.d.ts.map +1 -1
- package/dist/schemas/navigation.js +3 -1
- package/dist/schemas/navigation.js.map +2 -2
- package/dist/schemas/reference-config/index.d.ts +29 -16
- package/dist/schemas/reference-config/index.d.ts.map +1 -1
- package/dist/schemas/reference-config/settings.d.ts +29 -16
- package/dist/schemas/reference-config/settings.d.ts.map +1 -1
- package/dist/schemas/reference-config/settings.js +2 -0
- package/dist/schemas/reference-config/settings.js.map +2 -2
- package/dist/schemas/v3.1/strict/openapi-document.d.ts +992 -549
- package/dist/schemas/v3.1/strict/openapi-document.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/openapi-document.js +14 -6
- package/dist/schemas/v3.1/strict/openapi-document.js.map +2 -2
- package/dist/schemas/v3.1/strict/operation.d.ts +3 -7
- package/dist/schemas/v3.1/strict/operation.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/operation.js +1 -5
- package/dist/schemas/v3.1/strict/operation.js.map +2 -2
- package/dist/schemas/v3.1/strict/tag.d.ts +4 -1
- package/dist/schemas/v3.1/strict/tag.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/tag.js +3 -1
- package/dist/schemas/v3.1/strict/tag.js.map +2 -2
- package/dist/schemas/v3.1/strict/type-guards.d.ts +6 -0
- package/dist/schemas/v3.1/strict/type-guards.d.ts.map +1 -1
- package/dist/schemas/v3.1/strict/type-guards.js +4 -0
- package/dist/schemas/v3.1/strict/type-guards.js.map +2 -2
- package/dist/schemas/workspace-specification/config.d.ts +29 -16
- package/dist/schemas/workspace-specification/config.d.ts.map +1 -1
- package/dist/schemas/workspace-specification/index.d.ts +30 -17
- package/dist/schemas/workspace-specification/index.d.ts.map +1 -1
- package/dist/schemas/workspace.d.ts +233 -130
- package/dist/schemas/workspace.d.ts.map +1 -1
- package/dist/schemas/workspace.js +8 -6
- package/dist/schemas/workspace.js.map +2 -2
- package/dist/server.d.ts +1 -1
- package/dist/workspace-plugin.d.ts +3 -0
- package/dist/workspace-plugin.d.ts.map +1 -1
- package/package.json +8 -7
- package/dist/helpers/debounce.d.ts +0 -28
- package/dist/helpers/debounce.d.ts.map +0 -1
- package/dist/helpers/debounce.js +0 -31
- package/dist/helpers/debounce.js.map +0 -7
- package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.d.ts +0 -13
- package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.d.ts.map +0 -1
- package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.js +0 -9
- package/dist/schemas/extensions/operation/x-scalar-operation-identifiers.js.map +0 -7
- package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.d.ts +0 -32
- package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.d.ts.map +0 -1
- package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.js +0 -13
- package/dist/schemas/v3.1/strict/client-config-extensions/x-scalar-client-config-cookies.js.map +0 -7
|
@@ -1,9 +1,73 @@
|
|
|
1
|
+
import { findVariables } from "@scalar/helpers/regex/find-variables";
|
|
1
2
|
import { getResolvedRef } from "../helpers/get-resolved-ref.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
import { unpackProxyObject } from "../helpers/unpack-proxy.js";
|
|
4
|
+
import { isContentTypeParameterObject } from "../schemas/v3.1/strict/type-guards.js";
|
|
5
|
+
const getParameterPositions = (path, parameters) => {
|
|
6
|
+
const positions = {};
|
|
7
|
+
for (const paramName of parameters) {
|
|
8
|
+
const position = path.indexOf(`{${paramName}}`);
|
|
9
|
+
if (position !== -1) {
|
|
10
|
+
positions[paramName] = position;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return positions;
|
|
14
|
+
};
|
|
15
|
+
const syncParametersForPathChange = (newPath, oldPath, existingParameters) => {
|
|
16
|
+
const oldPathParams = findVariables(oldPath, { includePath: true, includeEnv: false }).filter(
|
|
17
|
+
(v) => v !== void 0
|
|
18
|
+
);
|
|
19
|
+
const newPathParams = findVariables(newPath, { includePath: true, includeEnv: false }).filter(
|
|
20
|
+
(v) => v !== void 0
|
|
21
|
+
);
|
|
22
|
+
const oldPositions = getParameterPositions(oldPath, oldPathParams);
|
|
23
|
+
const newPositions = getParameterPositions(newPath, newPathParams);
|
|
24
|
+
const pathParameters = [];
|
|
25
|
+
const nonPathParameters = [];
|
|
26
|
+
for (const param of existingParameters) {
|
|
27
|
+
const resolved = getResolvedRef(param);
|
|
28
|
+
if (resolved?.in === "path") {
|
|
29
|
+
pathParameters.push(param);
|
|
30
|
+
} else {
|
|
31
|
+
nonPathParameters.push(param);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const existingPathParamsByName = /* @__PURE__ */ new Map();
|
|
35
|
+
for (const param of pathParameters) {
|
|
36
|
+
const resolved = getResolvedRef(param);
|
|
37
|
+
if (resolved?.name) {
|
|
38
|
+
existingPathParamsByName.set(resolved.name, param);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const usedOldParams = /* @__PURE__ */ new Set();
|
|
42
|
+
const syncedPathParameters = [];
|
|
43
|
+
for (const newParamName of newPathParams) {
|
|
44
|
+
if (existingPathParamsByName.has(newParamName)) {
|
|
45
|
+
syncedPathParameters.push(existingPathParamsByName.get(newParamName));
|
|
46
|
+
usedOldParams.add(newParamName);
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
const newParamPosition = newPositions[newParamName];
|
|
50
|
+
const oldParamAtPosition = oldPathParams.find(
|
|
51
|
+
(oldParam) => oldPositions[oldParam] === newParamPosition && !usedOldParams.has(oldParam)
|
|
52
|
+
);
|
|
53
|
+
if (oldParamAtPosition && existingPathParamsByName.has(oldParamAtPosition)) {
|
|
54
|
+
const oldParam = existingPathParamsByName.get(oldParamAtPosition);
|
|
55
|
+
const resolved = getResolvedRef(oldParam);
|
|
56
|
+
if (resolved) {
|
|
57
|
+
resolved.name = newParamName;
|
|
58
|
+
syncedPathParameters.push(oldParam);
|
|
59
|
+
usedOldParams.add(oldParamAtPosition);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
syncedPathParameters.push({
|
|
64
|
+
name: newParamName,
|
|
65
|
+
in: "path"
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
return [...syncedPathParameters, ...nonPathParameters];
|
|
69
|
+
};
|
|
70
|
+
const updateOperationSummary = (document, { meta, payload: { summary } }) => {
|
|
7
71
|
if (!document) {
|
|
8
72
|
return;
|
|
9
73
|
}
|
|
@@ -13,25 +77,21 @@ const updateOperationSummary = ({
|
|
|
13
77
|
}
|
|
14
78
|
operation.summary = summary;
|
|
15
79
|
};
|
|
16
|
-
const
|
|
17
|
-
document
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
}) => {
|
|
21
|
-
if (!document) {
|
|
80
|
+
const updateOperationMethod = (document, { meta, payload: { method } }) => {
|
|
81
|
+
const operation = getResolvedRef(document?.paths?.[meta.path]?.[meta.method]);
|
|
82
|
+
if (!operation) {
|
|
83
|
+
console.error("Operation not found", { meta, document });
|
|
22
84
|
return;
|
|
23
85
|
}
|
|
24
|
-
const
|
|
25
|
-
if (!
|
|
86
|
+
const path = document?.paths?.[meta.path];
|
|
87
|
+
if (!path) {
|
|
88
|
+
console.error("Path not found", { meta, document });
|
|
26
89
|
return;
|
|
27
90
|
}
|
|
28
|
-
|
|
91
|
+
path[method] = unpackProxyObject(operation);
|
|
92
|
+
delete path[meta.method];
|
|
29
93
|
};
|
|
30
|
-
const
|
|
31
|
-
document,
|
|
32
|
-
meta,
|
|
33
|
-
payload: { path }
|
|
34
|
-
}) => {
|
|
94
|
+
const updateOperationPath = (document, { meta, payload: { path } }) => {
|
|
35
95
|
if (!document) {
|
|
36
96
|
return;
|
|
37
97
|
}
|
|
@@ -39,24 +99,35 @@ const updateOperationPathDraft = ({
|
|
|
39
99
|
if (!operation) {
|
|
40
100
|
return;
|
|
41
101
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
102
|
+
if (meta.path === path) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const oldPathParams = findVariables(meta.path, { includePath: true, includeEnv: false }).filter(
|
|
106
|
+
(v) => v !== void 0
|
|
107
|
+
);
|
|
108
|
+
const newPathParams = findVariables(path, { includePath: true, includeEnv: false }).filter(
|
|
109
|
+
(v) => v !== void 0
|
|
110
|
+
);
|
|
111
|
+
if (oldPathParams.length > 0 || newPathParams.length > 0) {
|
|
112
|
+
const existingParameters = operation.parameters ?? [];
|
|
113
|
+
operation.parameters = syncParametersForPathChange(path, meta.path, existingParameters);
|
|
114
|
+
}
|
|
115
|
+
if (!document.paths) {
|
|
116
|
+
document.paths = {};
|
|
117
|
+
}
|
|
118
|
+
if (!document.paths[path]) {
|
|
119
|
+
document.paths[path] = {};
|
|
120
|
+
}
|
|
121
|
+
document.paths[path][meta.method] = unpackProxyObject(operation);
|
|
122
|
+
const oldPath = document.paths[meta.path];
|
|
123
|
+
if (oldPath) {
|
|
124
|
+
delete oldPath[meta.method];
|
|
125
|
+
if (Object.keys(oldPath).length === 0) {
|
|
126
|
+
delete document.paths[meta.path];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
53
129
|
};
|
|
54
|
-
const addOperationParameter = ({
|
|
55
|
-
document,
|
|
56
|
-
meta,
|
|
57
|
-
payload,
|
|
58
|
-
type
|
|
59
|
-
}) => {
|
|
130
|
+
const addOperationParameter = (document, { meta, payload, type }) => {
|
|
60
131
|
if (!document) {
|
|
61
132
|
return;
|
|
62
133
|
}
|
|
@@ -79,13 +150,7 @@ const addOperationParameter = ({
|
|
|
79
150
|
}
|
|
80
151
|
});
|
|
81
152
|
};
|
|
82
|
-
const updateOperationParameter = ({
|
|
83
|
-
document,
|
|
84
|
-
meta,
|
|
85
|
-
type,
|
|
86
|
-
payload,
|
|
87
|
-
index
|
|
88
|
-
}) => {
|
|
153
|
+
const updateOperationParameter = (document, { meta, type, payload, index }) => {
|
|
89
154
|
if (!document) {
|
|
90
155
|
return;
|
|
91
156
|
}
|
|
@@ -99,24 +164,24 @@ const updateOperationParameter = ({
|
|
|
99
164
|
return;
|
|
100
165
|
}
|
|
101
166
|
parameter.name = payload.key ?? parameter.name ?? "";
|
|
102
|
-
if (
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
167
|
+
if (isContentTypeParameterObject(parameter)) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (!parameter.examples) {
|
|
171
|
+
parameter.examples = {};
|
|
172
|
+
}
|
|
173
|
+
const example = getResolvedRef(parameter.examples[meta.exampleKey]);
|
|
174
|
+
if (!example) {
|
|
175
|
+
parameter.examples[meta.exampleKey] = {
|
|
176
|
+
value: payload.value ?? "",
|
|
177
|
+
"x-disabled": payload.isEnabled === void 0 ? false : !payload.isEnabled
|
|
178
|
+
};
|
|
179
|
+
return;
|
|
112
180
|
}
|
|
181
|
+
example.value = payload.value ?? example?.value ?? "";
|
|
182
|
+
example["x-disabled"] = payload.isEnabled === void 0 ? example["x-disabled"] : !payload.isEnabled;
|
|
113
183
|
};
|
|
114
|
-
const deleteOperationParameter = ({
|
|
115
|
-
document,
|
|
116
|
-
meta,
|
|
117
|
-
index,
|
|
118
|
-
type
|
|
119
|
-
}) => {
|
|
184
|
+
const deleteOperationParameter = (document, { meta, index, type }) => {
|
|
120
185
|
if (!document) {
|
|
121
186
|
return;
|
|
122
187
|
}
|
|
@@ -132,11 +197,7 @@ const deleteOperationParameter = ({
|
|
|
132
197
|
const actualIndex = operation.parameters?.findIndex((it) => getResolvedRef(it) === parameter);
|
|
133
198
|
operation.parameters?.splice(actualIndex, 1);
|
|
134
199
|
};
|
|
135
|
-
const deleteAllOperationParameters = ({
|
|
136
|
-
document,
|
|
137
|
-
meta,
|
|
138
|
-
type
|
|
139
|
-
}) => {
|
|
200
|
+
const deleteAllOperationParameters = (document, { meta, type }) => {
|
|
140
201
|
if (!document) {
|
|
141
202
|
return;
|
|
142
203
|
}
|
|
@@ -146,11 +207,7 @@ const deleteAllOperationParameters = ({
|
|
|
146
207
|
}
|
|
147
208
|
operation.parameters = operation.parameters?.filter((it) => getResolvedRef(it).in !== type) ?? [];
|
|
148
209
|
};
|
|
149
|
-
const updateOperationRequestBodyContentType = ({
|
|
150
|
-
document,
|
|
151
|
-
meta,
|
|
152
|
-
payload
|
|
153
|
-
}) => {
|
|
210
|
+
const updateOperationRequestBodyContentType = (document, { meta, payload }) => {
|
|
154
211
|
if (!document) {
|
|
155
212
|
return;
|
|
156
213
|
}
|
|
@@ -170,12 +227,7 @@ const updateOperationRequestBodyContentType = ({
|
|
|
170
227
|
}
|
|
171
228
|
requestBody["x-scalar-selected-content-type"][meta.exampleKey] = payload.contentType;
|
|
172
229
|
};
|
|
173
|
-
const updateOperationRequestBodyExample = ({
|
|
174
|
-
document,
|
|
175
|
-
meta,
|
|
176
|
-
payload,
|
|
177
|
-
contentType
|
|
178
|
-
}) => {
|
|
230
|
+
const updateOperationRequestBodyExample = (document, { meta, payload, contentType }) => {
|
|
179
231
|
if (!document) {
|
|
180
232
|
return;
|
|
181
233
|
}
|
|
@@ -207,12 +259,7 @@ const updateOperationRequestBodyExample = ({
|
|
|
207
259
|
}
|
|
208
260
|
example.value = payload.value;
|
|
209
261
|
};
|
|
210
|
-
const addOperationRequestBodyFormRow = ({
|
|
211
|
-
document,
|
|
212
|
-
meta,
|
|
213
|
-
payload,
|
|
214
|
-
contentType
|
|
215
|
-
}) => {
|
|
262
|
+
const addOperationRequestBodyFormRow = (document, { meta, payload, contentType }) => {
|
|
216
263
|
if (!document) {
|
|
217
264
|
return;
|
|
218
265
|
}
|
|
@@ -253,13 +300,7 @@ const addOperationRequestBodyFormRow = ({
|
|
|
253
300
|
value: payload.value ?? ""
|
|
254
301
|
});
|
|
255
302
|
};
|
|
256
|
-
const updateOperationRequestBodyFormRow = ({
|
|
257
|
-
document,
|
|
258
|
-
meta,
|
|
259
|
-
index,
|
|
260
|
-
payload,
|
|
261
|
-
contentType
|
|
262
|
-
}) => {
|
|
303
|
+
const updateOperationRequestBodyFormRow = (document, { meta, index, payload, contentType }) => {
|
|
263
304
|
if (!document) {
|
|
264
305
|
return;
|
|
265
306
|
}
|
|
@@ -290,12 +331,7 @@ const updateOperationRequestBodyFormRow = ({
|
|
|
290
331
|
value: payload.value === null ? void 0 : payload.value ?? example.value[index]?.value ?? ""
|
|
291
332
|
};
|
|
292
333
|
};
|
|
293
|
-
const deleteOperationRequestBodyFormRow = ({
|
|
294
|
-
document,
|
|
295
|
-
meta,
|
|
296
|
-
index,
|
|
297
|
-
contentType
|
|
298
|
-
}) => {
|
|
334
|
+
const deleteOperationRequestBodyFormRow = (document, { meta, index, contentType }) => {
|
|
299
335
|
if (!document) {
|
|
300
336
|
return;
|
|
301
337
|
}
|
|
@@ -329,9 +365,9 @@ export {
|
|
|
329
365
|
deleteAllOperationParameters,
|
|
330
366
|
deleteOperationParameter,
|
|
331
367
|
deleteOperationRequestBodyFormRow,
|
|
332
|
-
|
|
368
|
+
updateOperationMethod,
|
|
333
369
|
updateOperationParameter,
|
|
334
|
-
|
|
370
|
+
updateOperationPath,
|
|
335
371
|
updateOperationRequestBodyContentType,
|
|
336
372
|
updateOperationRequestBodyExample,
|
|
337
373
|
updateOperationRequestBodyFormRow,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/mutators/operation.ts"],
|
|
4
|
-
"sourcesContent": ["import type { HttpMethod } from '@scalar/helpers/http/http-methods'\n\nimport { getResolvedRef } from '@/helpers/get-resolved-ref'\nimport type { WorkspaceDocument } from '@/schemas'\n\n/**\n * Describes the minimal identity for an operation in the workspace document.\n * It is used by mutators to find the target operation under `paths`.\n *\n * Example:\n * ```ts\n * const meta: OperationMeta = { method: 'get', path: '/users/{id}' }\n * ```\n */\nexport type OperationMeta = {\n method: HttpMethod\n path: string\n}\n\n/**\n * Extends {@link OperationMeta} with an `exampleKey` to address a specific\n * example variant (e.g. per environment or scenario) for request/parameters.\n *\n * Example:\n * ```ts\n * const meta: OperationExampleMeta = {\n * method: 'post',\n * path: '/upload',\n * exampleKey: 'default',\n * }\n * ```\n */\nexport type OperationExampleMeta = OperationMeta & {\n exampleKey: string\n}\n\n/** ------------------------------------------------------------------------------------------------\n * Operation Draft Mutators\n * ------------------------------------------------------------------------------------------------ */\n\n/**\n * Updates the `summary` of an operation.\n * Safely no-ops if the document or operation does not exist.\n *\n * Example:\n * ```ts\n * updateOperationSummary({\n * document,\n * meta: { method: 'get', path: '/users/{id}' },\n * payload: { summary: 'Get a single user' },\n * })\n * ```\n */\nexport const updateOperationSummary = ({\n document,\n meta,\n payload: { summary },\n}: {\n document: WorkspaceDocument | null\n payload: { summary: string }\n meta: OperationMeta\n}) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method as HttpMethod])\n\n if (!operation) {\n return\n }\n\n operation.summary = summary\n}\n\n/**\n * Stores the chosen HTTP method under `x-scalar-method` on the operation.\n * This does not move the operation to a different method slot under `paths`;\n * it records the desired method as an extension for downstream consumers.\n * Safely no-ops if the document or operation does not exist.\n *\n * Example:\n * ```ts\n * updateOperationMethodDraft({\n * document,\n * meta: { method: 'get', path: '/users' },\n * payload: { method: 'post' },\n * })\n * ```\n */\nexport const updateOperationMethodDraft = ({\n document,\n meta,\n payload: { method },\n}: {\n document: WorkspaceDocument | null\n payload: { method: HttpMethod }\n meta: OperationMeta\n}) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n\n if (!operation) {\n return\n }\n\n operation['x-scalar-method'] = method\n}\n\n/**\n * Records a normalized path for the operation under `x-scalar-path`, and\n * synchronizes path parameters in `operation.parameters` with the placeholders\n * present in the provided `path` (e.g. `/users/{id}`). Existing non-path\n * parameters are preserved.\n * Safely no-ops if the document or operation does not exist.\n *\n * Example:\n * ```ts\n * updateOperationPathDraft({\n * document,\n * meta: { method: 'get', path: '/users/{id}' },\n * payload: { path: '/users/{id}' },\n * })\n * ```\n */\nexport const updateOperationPathDraft = ({\n document,\n meta,\n payload: { path },\n}: {\n document: WorkspaceDocument | null\n payload: { path: string }\n meta: OperationMeta\n}) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n\n if (!operation) {\n return\n }\n\n operation['x-scalar-path'] = path\n\n // Extract the path variables from the path\n const pathVariables = Array.from(path.matchAll(/{([^\\/}]+)}/g), (m) => m[1])\n\n // now we need to update the operation path variables\n const pathVariablesWithoutPathParameters = operation.parameters?.filter((it) => getResolvedRef(it).in !== 'path')\n\n operation.parameters = [\n ...(pathVariablesWithoutPathParameters ?? []),\n ...pathVariables.map((it) => ({\n name: it ?? '',\n in: 'path' as const,\n required: true,\n })),\n ]\n}\n\n/** ------------------------------------------------------------------------------------------------\n * Operation Parameters Mutators\n * ------------------------------------------------------------------------------------------------ */\n\n/**\n * Adds a parameter to the operation with an example value tracked by `exampleKey`.\n * For `path` parameters `required` is set to true automatically.\n * Safely no-ops if the document or operation does not exist.\n *\n * Example:\n * ```ts\n * addOperationParameter({\n * document,\n * type: 'query',\n * meta: { method: 'get', path: '/search', exampleKey: 'default' },\n * payload: { key: 'q', value: 'john', isEnabled: true },\n * })\n * ```\n */\nexport const addOperationParameter = ({\n document,\n meta,\n payload,\n type,\n}: {\n document: WorkspaceDocument | null\n type: 'header' | 'path' | 'query' | 'cookie'\n payload: {\n key: string\n value: string\n isEnabled: boolean\n }\n meta: OperationExampleMeta\n}) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n\n // Don't proceed if operation doesn't exist\n if (!operation) {\n return\n }\n\n // Initialize parameters array if it doesn't exist\n if (!operation.parameters) {\n operation.parameters = []\n }\n\n // Add the new parameter\n operation.parameters.push({\n name: payload.key,\n in: type,\n required: type === 'path' ? true : false,\n examples: {\n [meta.exampleKey]: {\n value: payload.value,\n 'x-disabled': !payload.isEnabled,\n },\n },\n })\n}\n\n/**\n * Updates an existing parameter of a given `type` by its index within that\n * type subset (e.g. the N-th query parameter). Supports updating name, value,\n * and enabled state for the targeted example.\n * Safely no-ops if the document, operation, or parameter does not exist.\n *\n * Example:\n * ```ts\n * updateOperationParameter({\n * document,\n * type: 'query',\n * index: 0,\n * meta: { method: 'get', path: '/search', exampleKey: 'default' },\n * payload: { value: 'alice', isEnabled: true },\n * })\n * ```\n */\nexport const updateOperationParameter = ({\n document,\n meta,\n type,\n payload,\n index,\n}: {\n document: WorkspaceDocument | null\n type: 'header' | 'path' | 'query' | 'cookie'\n index: number\n payload: Partial<{\n key: string\n value: string\n isEnabled: boolean\n }>\n meta: OperationExampleMeta\n}) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n\n // Don't proceed if operation doesn't exist\n if (!operation) {\n return\n }\n\n // Get all resolved parameters of the specified type\n // The passed index corresponds to this filtered list\n const resolvedParameters = operation.parameters?.map((it) => getResolvedRef(it)).filter((it) => it.in === type) ?? []\n const parameter = resolvedParameters[index]\n\n // Don't proceed if parameter doesn't exist\n if (!parameter) {\n return\n }\n\n parameter.name = payload.key ?? parameter.name ?? ''\n\n // TODO: handle content-type parameters\n if ('examples' in parameter) {\n if (!parameter.examples) {\n parameter.examples = {}\n }\n\n const example = getResolvedRef(parameter.examples[meta.exampleKey])\n\n if (!example) {\n return\n }\n\n example.value = payload.value ?? example?.value ?? ''\n example['x-disabled'] = payload.isEnabled === undefined ? example['x-disabled'] : !payload.isEnabled\n }\n}\n\n/**\n * Removes a parameter from the operation by resolving its position within\n * the filtered list of parameters of the specified `type`.\n * Safely no-ops if the document, operation, or parameter does not exist.\n *\n * Example:\n * ```ts\n * deleteOperationParameter({\n * document,\n * type: 'header',\n * index: 1,\n * meta: { method: 'get', path: '/users', exampleKey: 'default' },\n * })\n * ```\n */\nexport const deleteOperationParameter = ({\n document,\n meta,\n index,\n type,\n}: {\n document: WorkspaceDocument | null\n type: 'header' | 'path' | 'query' | 'cookie'\n index: number\n meta: OperationExampleMeta\n}) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n\n // Don't proceed if operation doesn't exist\n if (!operation) {\n return\n }\n\n // Translate the index from the filtered list to the actual parameters array\n const resolvedParameters = operation.parameters?.map((it) => getResolvedRef(it)).filter((it) => it.in === type) ?? []\n const parameter = resolvedParameters[index]\n\n // Don't proceed if parameter doesn't exist\n if (!parameter) {\n return\n }\n\n const actualIndex = operation.parameters?.findIndex((it) => getResolvedRef(it) === parameter) as number\n\n // Remove the parameter from the operation\n operation.parameters?.splice(actualIndex, 1)\n}\n\n/**\n * Deletes all parameters of a given `type` from the operation.\n * Safely no-ops if the document or operation does not exist.\n *\n * Example:\n * ```ts\n * deleteAllOperationParameters({\n * document,\n * type: 'cookie',\n * meta: { method: 'get', path: '/users' },\n * })\n * ```\n */\nexport const deleteAllOperationParameters = ({\n document,\n meta,\n type,\n}: {\n document: WorkspaceDocument | null\n type: 'header' | 'path' | 'query' | 'cookie'\n meta: OperationMeta\n}) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n\n // Don't proceed if operation doesn't exist\n if (!operation) {\n return\n }\n\n // Filter out parameters of the specified type\n operation.parameters = operation.parameters?.filter((it) => getResolvedRef(it).in !== type) ?? []\n}\n\n/** ------------------------------------------------------------------------------------------------\n * Operation Request Body Mutators\n * ------------------------------------------------------------------------------------------------ */\n\n/**\n * Sets the selected request-body content type for the current `exampleKey`.\n * This stores the selection under `x-scalar-selected-content-type` on the\n * resolved requestBody. Safely no-ops if the document or operation does not exist.\n *\n * Example:\n * ```ts\n * updateOperationRequestBodyContentType({\n * document,\n * meta: { method: 'post', path: '/upload', exampleKey: 'default' },\n * payload: { contentType: 'multipart/form-data' },\n * })\n * ```\n */\nexport const updateOperationRequestBodyContentType = ({\n document,\n meta,\n payload,\n}: {\n document: WorkspaceDocument | null\n payload: {\n contentType: string\n }\n meta: OperationExampleMeta\n}) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n\n // Don't proceed if operation doesn't exist\n if (!operation) {\n return\n }\n\n let requestBody = getResolvedRef(operation.requestBody)\n\n if (!requestBody) {\n operation.requestBody = {\n content: {},\n }\n requestBody = getResolvedRef(operation.requestBody)\n }\n\n if (!requestBody!['x-scalar-selected-content-type']) {\n requestBody!['x-scalar-selected-content-type'] = {}\n }\n\n requestBody!['x-scalar-selected-content-type'][meta.exampleKey] = payload.contentType\n}\n\n/**\n * Creates or updates a concrete example value for a specific request-body\n * `contentType` and `exampleKey`. Safely no-ops if the document or operation\n * does not exist.\n *\n * Example:\n * ```ts\n * updateOperationRequestBodyExample({\n * document,\n * contentType: 'application/json',\n * meta: { method: 'post', path: '/users', exampleKey: 'default' },\n * payload: { value: JSON.stringify({ name: 'Ada' }) },\n * })\n * ```\n */\nexport const updateOperationRequestBodyExample = ({\n document,\n meta,\n payload,\n contentType,\n}: {\n document: WorkspaceDocument | null\n contentType: string\n payload: {\n value: string | File | undefined\n }\n meta: OperationExampleMeta\n}) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n\n // Don't proceed if operation doesn't exist\n if (!operation) {\n return\n }\n\n let requestBody = getResolvedRef(operation.requestBody)\n\n if (!requestBody) {\n operation.requestBody = {\n content: {},\n }\n requestBody = getResolvedRef(operation.requestBody)\n }\n\n if (!requestBody!.content[contentType]) {\n requestBody!.content[contentType] = {\n examples: {},\n }\n }\n\n // Ensure examples object exists and get a resolved reference\n const mediaType = requestBody!.content[contentType]!\n mediaType.examples ??= {}\n const examples = getResolvedRef(mediaType.examples)!\n\n const example = getResolvedRef(examples[meta.exampleKey])\n\n if (!example) {\n examples[meta.exampleKey] = {\n value: payload.value,\n }\n return\n }\n\n example.value = payload.value\n}\n\n/**\n * Appends a form-data row to the request-body example identified by\n * `contentType` and `exampleKey`. Initializes the example as an array when\n * needed. Safely no-ops if the document or operation does not exist.\n *\n * Example:\n * ```ts\n * addOperationRequestBodyFormRow({\n * document,\n * contentType: 'multipart/form-data',\n * meta: { method: 'post', path: '/upload', exampleKey: 'default' },\n * payload: { key: 'file', value: new File(['x'], 'a.txt') },\n * })\n * ```\n */\nexport const addOperationRequestBodyFormRow = ({\n document,\n meta,\n payload,\n contentType,\n}: {\n document: WorkspaceDocument | null\n payload: Partial<{ key: string; value?: string | File }>\n contentType: string\n meta: OperationExampleMeta\n}) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n\n // Don't proceed if operation doesn't exist\n if (!operation) {\n return\n }\n\n let requestBody = getResolvedRef(operation.requestBody)\n\n if (!requestBody) {\n operation.requestBody = {\n content: {},\n }\n requestBody = getResolvedRef(operation.requestBody)\n }\n\n if (!requestBody!.content[contentType]) {\n requestBody!.content[contentType] = {\n examples: {},\n }\n }\n\n if (!requestBody!.content[contentType]!.examples) {\n requestBody!.content[contentType]!.examples = {}\n }\n\n const examples = getResolvedRef(requestBody!.content[contentType]!.examples)\n\n const example = getResolvedRef(examples[meta.exampleKey])\n\n if (!example || !Array.isArray(example.value)) {\n examples[meta.exampleKey] = {\n value: [\n {\n name: payload.key,\n value: payload.value,\n },\n ],\n }\n return\n }\n\n // Add the new row to the example\n example.value.push({\n name: payload.key ?? '',\n value: payload.value ?? '',\n })\n}\n\n/**\n * Updates a form-data row at a given `index` for the specified example and\n * `contentType`. Setting `payload.value` to `null` clears the value (sets to\n * `undefined`). Safely no-ops if the document, operation, or example does not exist.\n *\n * Example:\n * ```ts\n * updateOperationRequestBodyFormRow({\n * document,\n * index: 0,\n * contentType: 'multipart/form-data',\n * meta: { method: 'post', path: '/upload', exampleKey: 'default' },\n * payload: { key: 'description', value: 'Profile picture' },\n * })\n * ```\n */\nexport const updateOperationRequestBodyFormRow = ({\n document,\n meta,\n index,\n payload,\n contentType,\n}: {\n document: WorkspaceDocument | null\n index: number\n payload: Partial<{ key: string; value: string | File | null }>\n contentType: string\n meta: OperationExampleMeta\n}) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n\n // Don't proceed if operation doesn't exist\n if (!operation) {\n return\n }\n\n let requestBody = getResolvedRef(operation.requestBody)\n\n if (!requestBody) {\n operation.requestBody = {\n content: {},\n }\n requestBody = getResolvedRef(operation.requestBody)\n }\n\n if (!requestBody!.content[contentType]) {\n return\n }\n\n const examples = getResolvedRef(requestBody!.content[contentType]!.examples)\n\n if (!examples) {\n return\n }\n\n const example = getResolvedRef(examples[meta.exampleKey])\n\n if (!example || !Array.isArray(example.value)) {\n return\n }\n\n example.value[index] = {\n name: payload.key ?? example.value[index]?.name ?? '',\n value: payload.value === null ? undefined : (payload.value ?? example.value[index]?.value ?? ''),\n }\n}\n\n/**\n * Deletes a form-data row at a given `index` from the example for the given\n * `contentType`. If the example becomes empty, the example entry is removed.\n * Safely no-ops if the document, operation, example, or row does not exist.\n *\n * Example:\n * ```ts\n * deleteOperationRequestBodyFormRow({\n * document,\n * index: 0,\n * contentType: 'multipart/form-data',\n * meta: { method: 'post', path: '/upload', exampleKey: 'default' },\n * })\n * ```\n */\nexport const deleteOperationRequestBodyFormRow = ({\n document,\n meta,\n index,\n contentType,\n}: {\n document: WorkspaceDocument | null\n index: number\n contentType: string\n meta: OperationExampleMeta\n}) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n\n // Don't proceed if operation doesn't exist\n if (!operation) {\n return\n }\n\n const requestBody = getResolvedRef(operation.requestBody)\n\n if (!requestBody) {\n return\n }\n\n if (!requestBody.content[contentType]) {\n return\n }\n\n const examples = getResolvedRef(requestBody.content[contentType]!.examples)\n\n if (!examples) {\n return\n }\n\n const example = getResolvedRef(examples[meta.exampleKey])\n\n if (!example || !Array.isArray(example.value)) {\n return\n }\n\n example.value.splice(index, 1)\n\n if (example.value.length === 0) {\n delete requestBody.content[contentType]!.examples![meta.exampleKey]\n }\n}\n"],
|
|
5
|
-
"mappings": "
|
|
4
|
+
"sourcesContent": ["import type { HttpMethod } from '@scalar/helpers/http/http-methods'\nimport { findVariables } from '@scalar/helpers/regex/find-variables'\n\nimport type { OperationEvents } from '@/events/definitions/operation'\nimport { getResolvedRef } from '@/helpers/get-resolved-ref'\nimport { unpackProxyObject } from '@/helpers/unpack-proxy'\nimport type { WorkspaceDocument } from '@/schemas'\nimport type { ParameterObject } from '@/schemas/v3.1/strict/openapi-document'\nimport type { ReferenceType } from '@/schemas/v3.1/strict/reference'\nimport { isContentTypeParameterObject } from '@/schemas/v3.1/strict/type-guards'\n\n/**\n * Describes the minimal identity for an operation in the workspace document.\n * It is used by mutators to find the target operation under `paths`.\n *\n * Example:\n * ```ts\n * const meta: OperationMeta = { method: 'get', path: '/users/{id}' }\n * ```\n */\nexport type OperationMeta = {\n method: HttpMethod\n path: string\n}\n\n/**\n * Extends {@link OperationMeta} with an `exampleKey` to address a specific\n * example variant (e.g. per environment or scenario) for request/parameters.\n *\n * Example:\n * ```ts\n * const meta: OperationExampleMeta = {\n * method: 'post',\n * path: '/upload',\n * exampleKey: 'default',\n * }\n * ```\n */\nexport type OperationExampleMeta = OperationMeta & {\n exampleKey: string\n}\n\n/** ------------------------------------------------------------------------------------------------\n * Helper Functions for Path Parameter Synchronization\n * ------------------------------------------------------------------------------------------------ */\n\n/**\n * Creates a map of parameter names to their character positions in a path.\n * Used to detect renamed path parameters by position matching.\n */\nconst getParameterPositions = (path: string, parameters: readonly string[]): Record<string, number> => {\n const positions: Record<string, number> = {}\n\n for (const paramName of parameters) {\n const position = path.indexOf(`{${paramName}}`)\n if (position !== -1) {\n positions[paramName] = position\n }\n }\n\n return positions\n}\n\n/**\n * Syncs path parameters when the path changes.\n *\n * Preserves parameter configurations by:\n * 1. Keeping parameters with matching names\n * 2. Renaming parameters at the same position\n * 3. Creating new parameters with empty examples\n * 4. Removing parameters that no longer exist in the new path\n */\nconst syncParametersForPathChange = (\n newPath: string,\n oldPath: string,\n existingParameters: ReferenceType<ParameterObject>[],\n): ReferenceType<ParameterObject>[] => {\n // Extract path parameter names from both paths\n const oldPathParams = findVariables(oldPath, { includePath: true, includeEnv: false }).filter(\n (v): v is string => v !== undefined,\n )\n const newPathParams = findVariables(newPath, { includePath: true, includeEnv: false }).filter(\n (v): v is string => v !== undefined,\n )\n\n const oldPositions = getParameterPositions(oldPath, oldPathParams)\n const newPositions = getParameterPositions(newPath, newPathParams)\n\n // Separate path and non-path parameters, keeping original references\n const pathParameters: ReferenceType<ParameterObject>[] = []\n const nonPathParameters: ReferenceType<ParameterObject>[] = []\n\n for (const param of existingParameters) {\n const resolved = getResolvedRef(param)\n if (resolved?.in === 'path') {\n pathParameters.push(param)\n } else {\n nonPathParameters.push(param)\n }\n }\n\n // Create a map of existing path parameters by name for quick lookup\n const existingPathParamsByName = new Map<string, ReferenceType<ParameterObject>>()\n for (const param of pathParameters) {\n const resolved = getResolvedRef(param)\n if (resolved?.name) {\n existingPathParamsByName.set(resolved.name, param)\n }\n }\n\n const usedOldParams = new Set<string>()\n const syncedPathParameters: ReferenceType<ParameterObject>[] = []\n\n for (const newParamName of newPathParams) {\n // Case 1: Parameter with same name exists - preserve its config\n if (existingPathParamsByName.has(newParamName)) {\n syncedPathParameters.push(existingPathParamsByName.get(newParamName)!)\n usedOldParams.add(newParamName)\n continue\n }\n\n // Case 2: Check for parameter at same position (likely a rename)\n const newParamPosition = newPositions[newParamName]\n const oldParamAtPosition = oldPathParams.find(\n (oldParam) => oldPositions[oldParam] === newParamPosition && !usedOldParams.has(oldParam),\n )\n\n if (oldParamAtPosition && existingPathParamsByName.has(oldParamAtPosition)) {\n // Rename: transfer the old parameter's config to the new name\n const oldParam = existingPathParamsByName.get(oldParamAtPosition)!\n const resolved = getResolvedRef(oldParam)\n if (resolved) {\n resolved.name = newParamName\n syncedPathParameters.push(oldParam)\n usedOldParams.add(oldParamAtPosition)\n continue\n }\n }\n\n // Case 3: New parameter - create with empty examples\n syncedPathParameters.push({\n name: newParamName,\n in: 'path',\n })\n }\n\n // Return all parameters: synced path parameters + preserved non-path parameters\n return [...syncedPathParameters, ...nonPathParameters]\n}\n\n/** ------------------------------------------------------------------------------------------------\n * Operation Draft Mutators\n * ------------------------------------------------------------------------------------------------ */\n\n/**\n * Updates the `summary` of an operation.\n * Safely no-ops if the document or operation does not exist.\n *\n * Example:\n * ```ts\n * updateOperationSummary(\n * document,\n * {\n * meta: { method: 'get', path: '/users/{id}' },\n * payload: { summary: 'Get a single user' },\n * })\n * ```\n */\nexport const updateOperationSummary = (\n document: WorkspaceDocument | null,\n { meta, payload: { summary } }: OperationEvents['operation:update:summary'],\n) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method as HttpMethod])\n if (!operation) {\n return\n }\n\n operation.summary = summary\n}\n\n/**\n * Stores the chosen HTTP method under `x-scalar-method` on the operation.\n * This does not move the operation to a different method slot under `paths`;\n * it records the desired method as an extension for downstream consumers.\n * Safely no-ops if the document or operation does not exist.\n *\n * Example:\n * ```ts\n * updateOperationMethodDraft({\n * document,\n * meta: { method: 'get', path: '/users' },\n * payload: { method: 'post' },\n * })\n * ```\n */\nexport const updateOperationMethod = (\n document: WorkspaceDocument | null,\n { meta, payload: { method } }: OperationEvents['operation:update:method'],\n) => {\n const operation = getResolvedRef(document?.paths?.[meta.path]?.[meta.method])\n if (!operation) {\n console.error('Operation not found', { meta, document })\n return\n }\n\n /** Ensure the path exists */\n const path = document?.paths?.[meta.path]\n if (!path) {\n console.error('Path not found', { meta, document })\n return\n }\n\n path[method] = unpackProxyObject(operation)\n delete path[meta.method]\n}\n\n/**\n * Moves the operation to a new path in the document and synchronizes path\n * parameters in `operation.parameters` with the placeholders present in the\n * provided `path` (e.g. `/users/{id}`). When path parameters change,\n * intelligently syncs them by preserving configurations for renamed parameters\n * (detected by position) and existing parameters. Existing non-path parameters\n * are preserved. The operation is removed from the old path location.\n *\n * Example:\n * ```ts\n * updateOperationPath({\n * document,\n * meta: { method: 'get', path: '/users/{id}' },\n * payload: { path: '/users/{userId}' },\n * })\n * ```\n */\nexport const updateOperationPath = (\n document: WorkspaceDocument | null,\n { meta, payload: { path } }: OperationEvents['operation:update:path'],\n) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n if (!operation) {\n return\n }\n\n // If the path has not changed, no need to move the operation\n if (meta.path === path) {\n return\n }\n\n // Sync path parameters if either the old or new path has path parameters\n const oldPathParams = findVariables(meta.path, { includePath: true, includeEnv: false }).filter(\n (v): v is string => v !== undefined,\n )\n const newPathParams = findVariables(path, { includePath: true, includeEnv: false }).filter(\n (v): v is string => v !== undefined,\n )\n\n if (oldPathParams.length > 0 || newPathParams.length > 0) {\n const existingParameters = operation.parameters ?? []\n operation.parameters = syncParametersForPathChange(path, meta.path, existingParameters)\n }\n\n // Initialize the paths object if it does not exist\n if (!document.paths) {\n document.paths = {}\n }\n\n // Initialize the new path if it does not exist\n if (!document.paths[path]) {\n document.paths[path] = {}\n }\n\n // Move the operation to the new path\n document.paths[path][meta.method] = unpackProxyObject(operation)\n\n // Remove the operation from the old path\n const oldPath = document.paths[meta.path]\n if (oldPath) {\n delete oldPath[meta.method]\n\n // If the old path has no more operations, remove the path entry\n if (Object.keys(oldPath).length === 0) {\n delete document.paths[meta.path]\n }\n }\n}\n\n/** ------------------------------------------------------------------------------------------------\n * Operation Parameters Mutators\n * ------------------------------------------------------------------------------------------------ */\n\n/**\n * Adds a parameter to the operation with an example value tracked by `exampleKey`.\n * For `path` parameters `required` is set to true automatically.\n * Safely no-ops if the document or operation does not exist.\n *\n * Example:\n * ```ts\n * addOperationParameter({\n * document,\n * type: 'query',\n * meta: { method: 'get', path: '/search', exampleKey: 'default' },\n * payload: { key: 'q', value: 'john', isEnabled: true },\n * })\n * ```\n */\nexport const addOperationParameter = (\n document: WorkspaceDocument | null,\n { meta, payload, type }: OperationEvents['operation:add:parameter'],\n) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n\n // Don't proceed if operation doesn't exist\n if (!operation) {\n return\n }\n\n // Initialize parameters array if it doesn't exist\n if (!operation.parameters) {\n operation.parameters = []\n }\n\n // Add the new parameter\n operation.parameters.push({\n name: payload.key,\n in: type,\n required: type === 'path' ? true : false,\n examples: {\n [meta.exampleKey]: {\n value: payload.value,\n 'x-disabled': !payload.isEnabled,\n },\n },\n })\n}\n\n/**\n * Updates an existing parameter of a given `type` by its index within that\n * type subset (e.g. the N-th query parameter). Supports updating name, value,\n * and enabled state for the targeted example.\n * Safely no-ops if the document, operation, or parameter does not exist.\n *\n * Example:\n * ```ts\n * updateOperationParameter({\n * document,\n * type: 'query',\n * index: 0,\n * meta: { method: 'get', path: '/search', exampleKey: 'default' },\n * payload: { value: 'alice', isEnabled: true },\n * })\n * ```\n */\nexport const updateOperationParameter = (\n document: WorkspaceDocument | null,\n { meta, type, payload, index }: OperationEvents['operation:update:parameter'],\n) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n\n // Don't proceed if operation doesn't exist\n if (!operation) {\n return\n }\n\n // Get all resolved parameters of the specified type\n // The passed index corresponds to this filtered list\n const resolvedParameters = operation.parameters?.map((it) => getResolvedRef(it)).filter((it) => it.in === type) ?? []\n const parameter = resolvedParameters[index]\n if (!parameter) {\n return\n }\n\n parameter.name = payload.key ?? parameter.name ?? ''\n\n if (isContentTypeParameterObject(parameter)) {\n // TODO: handle content-type parameters\n return\n }\n\n if (!parameter.examples) {\n parameter.examples = {}\n }\n\n const example = getResolvedRef(parameter.examples[meta.exampleKey])\n\n // Create the example if it doesn't exist\n if (!example) {\n parameter.examples[meta.exampleKey] = {\n value: payload.value ?? '',\n 'x-disabled': payload.isEnabled === undefined ? false : !payload.isEnabled,\n }\n return\n }\n\n // Update existing example value\n example.value = payload.value ?? example?.value ?? ''\n example['x-disabled'] = payload.isEnabled === undefined ? example['x-disabled'] : !payload.isEnabled\n}\n\n/**\n * Removes a parameter from the operation by resolving its position within\n * the filtered list of parameters of the specified `type`.\n * Safely no-ops if the document, operation, or parameter does not exist.\n *\n * Example:\n * ```ts\n * deleteOperationParameter({\n * document,\n * type: 'header',\n * index: 1,\n * meta: { method: 'get', path: '/users', exampleKey: 'default' },\n * })\n * ```\n */\nexport const deleteOperationParameter = (\n document: WorkspaceDocument | null,\n { meta, index, type }: OperationEvents['operation:delete:parameter'],\n) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n\n // Don't proceed if operation doesn't exist\n if (!operation) {\n return\n }\n\n // Translate the index from the filtered list to the actual parameters array\n const resolvedParameters = operation.parameters?.map((it) => getResolvedRef(it)).filter((it) => it.in === type) ?? []\n const parameter = resolvedParameters[index]\n if (!parameter) {\n return\n }\n\n const actualIndex = operation.parameters?.findIndex((it) => getResolvedRef(it) === parameter) as number\n\n // Remove the parameter from the operation\n operation.parameters?.splice(actualIndex, 1)\n}\n\n/**\n * Deletes all parameters of a given `type` from the operation.\n * Safely no-ops if the document or operation does not exist.\n *\n * Example:\n * ```ts\n * deleteAllOperationParameters({\n * document,\n * type: 'cookie',\n * meta: { method: 'get', path: '/users' },\n * })\n * ```\n */\nexport const deleteAllOperationParameters = (\n document: WorkspaceDocument | null,\n { meta, type }: OperationEvents['operation:delete-all:parameters'],\n) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n if (!operation) {\n return\n }\n\n // Filter out parameters of the specified type\n operation.parameters = operation.parameters?.filter((it) => getResolvedRef(it).in !== type) ?? []\n}\n\n/** ------------------------------------------------------------------------------------------------\n * Operation Request Body Mutators\n * ------------------------------------------------------------------------------------------------ */\n\n/**\n * Sets the selected request-body content type for the current `exampleKey`.\n * This stores the selection under `x-scalar-selected-content-type` on the\n * resolved requestBody. Safely no-ops if the document or operation does not exist.\n *\n * Example:\n * ```ts\n * updateOperationRequestBodyContentType({\n * document,\n * meta: { method: 'post', path: '/upload', exampleKey: 'default' },\n * payload: { contentType: 'multipart/form-data' },\n * })\n * ```\n */\nexport const updateOperationRequestBodyContentType = (\n document: WorkspaceDocument | null,\n { meta, payload }: OperationEvents['operation:update:requestBody:contentType'],\n) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n if (!operation) {\n return\n }\n\n let requestBody = getResolvedRef(operation.requestBody)\n if (!requestBody) {\n operation.requestBody = {\n content: {},\n }\n requestBody = getResolvedRef(operation.requestBody)\n }\n\n if (!requestBody!['x-scalar-selected-content-type']) {\n requestBody!['x-scalar-selected-content-type'] = {}\n }\n\n requestBody!['x-scalar-selected-content-type'][meta.exampleKey] = payload.contentType\n}\n\n/**\n * Creates or updates a concrete example value for a specific request-body\n * `contentType` and `exampleKey`. Safely no-ops if the document or operation\n * does not exist.\n *\n * Example:\n * ```ts\n * updateOperationRequestBodyExample({\n * document,\n * contentType: 'application/json',\n * meta: { method: 'post', path: '/users', exampleKey: 'default' },\n * payload: { value: JSON.stringify({ name: 'Ada' }) },\n * })\n * ```\n */\nexport const updateOperationRequestBodyExample = (\n document: WorkspaceDocument | null,\n { meta, payload, contentType }: OperationEvents['operation:update:requestBody:value'],\n) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n if (!operation) {\n return\n }\n\n let requestBody = getResolvedRef(operation.requestBody)\n if (!requestBody) {\n operation.requestBody = {\n content: {},\n }\n requestBody = getResolvedRef(operation.requestBody)\n }\n\n if (!requestBody!.content[contentType]) {\n requestBody!.content[contentType] = {\n examples: {},\n }\n }\n\n // Ensure examples object exists and get a resolved reference\n const mediaType = requestBody!.content[contentType]!\n mediaType.examples ??= {}\n const examples = getResolvedRef(mediaType.examples)!\n\n const example = getResolvedRef(examples[meta.exampleKey])\n if (!example) {\n examples[meta.exampleKey] = {\n value: payload.value,\n }\n return\n }\n\n example.value = payload.value\n}\n\n/**\n * Appends a form-data row to the request-body example identified by\n * `contentType` and `exampleKey`. Initializes the example as an array when\n * needed. Safely no-ops if the document or operation does not exist.\n *\n * Example:\n * ```ts\n * addOperationRequestBodyFormRow({\n * document,\n * contentType: 'multipart/form-data',\n * meta: { method: 'post', path: '/upload', exampleKey: 'default' },\n * payload: { key: 'file', value: new File(['x'], 'a.txt') },\n * })\n * ```\n */\nexport const addOperationRequestBodyFormRow = (\n document: WorkspaceDocument | null,\n { meta, payload, contentType }: OperationEvents['operation:add:requestBody:formRow'],\n) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n\n // Don't proceed if operation doesn't exist\n if (!operation) {\n return\n }\n\n let requestBody = getResolvedRef(operation.requestBody)\n\n if (!requestBody) {\n operation.requestBody = {\n content: {},\n }\n requestBody = getResolvedRef(operation.requestBody)\n }\n\n if (!requestBody!.content[contentType]) {\n requestBody!.content[contentType] = {\n examples: {},\n }\n }\n\n if (!requestBody!.content[contentType]!.examples) {\n requestBody!.content[contentType]!.examples = {}\n }\n\n const examples = getResolvedRef(requestBody!.content[contentType]!.examples)\n\n const example = getResolvedRef(examples[meta.exampleKey])\n\n if (!example || !Array.isArray(example.value)) {\n examples[meta.exampleKey] = {\n value: [\n {\n name: payload.key,\n value: payload.value,\n },\n ],\n }\n return\n }\n\n // Add the new row to the example\n example.value.push({\n name: payload.key ?? '',\n value: payload.value ?? '',\n })\n}\n\n/**\n * Updates a form-data row at a given `index` for the specified example and\n * `contentType`. Setting `payload.value` to `null` clears the value (sets to\n * `undefined`). Safely no-ops if the document, operation, or example does not exist.\n *\n * Example:\n * ```ts\n * updateOperationRequestBodyFormRow({\n * document,\n * index: 0,\n * contentType: 'multipart/form-data',\n * meta: { method: 'post', path: '/upload', exampleKey: 'default' },\n * payload: { key: 'description', value: 'Profile picture' },\n * })\n * ```\n */\nexport const updateOperationRequestBodyFormRow = (\n document: WorkspaceDocument | null,\n { meta, index, payload, contentType }: OperationEvents['operation:update:requestBody:formRow'],\n) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n if (!operation) {\n return\n }\n\n let requestBody = getResolvedRef(operation.requestBody)\n if (!requestBody) {\n operation.requestBody = {\n content: {},\n }\n requestBody = getResolvedRef(operation.requestBody)\n }\n\n if (!requestBody!.content[contentType]) {\n return\n }\n\n const examples = getResolvedRef(requestBody!.content[contentType]!.examples)\n if (!examples) {\n return\n }\n\n const example = getResolvedRef(examples[meta.exampleKey])\n if (!example || !Array.isArray(example.value)) {\n return\n }\n\n example.value[index] = {\n name: payload.key ?? example.value[index]?.name ?? '',\n value: payload.value === null ? undefined : (payload.value ?? example.value[index]?.value ?? ''),\n }\n}\n\n/**\n * Deletes a form-data row at a given `index` from the example for the given\n * `contentType`. If the example becomes empty, the example entry is removed.\n * Safely no-ops if the document, operation, example, or row does not exist.\n *\n * Example:\n * ```ts\n * deleteOperationRequestBodyFormRow({\n * document,\n * index: 0,\n * contentType: 'multipart/form-data',\n * meta: { method: 'post', path: '/upload', exampleKey: 'default' },\n * })\n * ```\n */\nexport const deleteOperationRequestBodyFormRow = (\n document: WorkspaceDocument | null,\n { meta, index, contentType }: OperationEvents['operation:delete:requestBody:formRow'],\n) => {\n if (!document) {\n return\n }\n\n const operation = getResolvedRef(document.paths?.[meta.path]?.[meta.method])\n if (!operation) {\n return\n }\n\n const requestBody = getResolvedRef(operation.requestBody)\n if (!requestBody) {\n return\n }\n\n if (!requestBody.content[contentType]) {\n return\n }\n\n const examples = getResolvedRef(requestBody.content[contentType]!.examples)\n if (!examples) {\n return\n }\n\n const example = getResolvedRef(examples[meta.exampleKey])\n if (!example || !Array.isArray(example.value)) {\n return\n }\n\n example.value.splice(index, 1)\n\n if (example.value.length === 0) {\n delete requestBody.content[contentType]!.examples![meta.exampleKey]\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,12 +1,47 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ServerEvents } from '../events/definitions/server.js';
|
|
2
|
+
import { type ServerObject } from '../schemas/v3.1/strict/openapi-document.js';
|
|
3
|
+
import type { WorkspaceDocument } from '../schemas/workspace.js';
|
|
2
4
|
/**
|
|
3
|
-
*
|
|
5
|
+
* Adds a new ServerObject to the document.
|
|
4
6
|
*
|
|
5
|
-
* @param
|
|
6
|
-
* @returns
|
|
7
|
+
* @param document - The document to add the server to
|
|
8
|
+
* @returns the new server object or undefined if the document is not found
|
|
7
9
|
*/
|
|
8
|
-
export declare const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
export declare const addServer: (document: WorkspaceDocument | null) => ServerObject | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Updates a ServerObject in the document.
|
|
13
|
+
* When the URL changes, intelligently syncs variables by preserving configurations
|
|
14
|
+
* for renamed variables (detected by position) and existing variables.
|
|
15
|
+
*
|
|
16
|
+
* @param document - The document containing the server to update
|
|
17
|
+
* @param index - The index of the server to update
|
|
18
|
+
* @param server - The partial server object with fields to update
|
|
19
|
+
* @returns the updated server object or undefined if the server is not found
|
|
20
|
+
*/
|
|
21
|
+
export declare const updateServer: (document: WorkspaceDocument | null, { index, server }: ServerEvents["server:update:server"]) => ServerObject | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Deletes a ServerObject at the specified index from the target array.
|
|
24
|
+
*
|
|
25
|
+
* @param document - The document to delete the server from
|
|
26
|
+
* @param index - The index of the server to delete.
|
|
27
|
+
*/
|
|
28
|
+
export declare const deleteServer: (document: WorkspaceDocument | null, { index }: ServerEvents["server:delete:server"]) => void;
|
|
29
|
+
/**
|
|
30
|
+
* Updates a server variable for the selected server
|
|
31
|
+
*
|
|
32
|
+
* @param document - The document to update the server variables in
|
|
33
|
+
* @param index - The index of the server to update
|
|
34
|
+
* @param key - The key of the variable to update
|
|
35
|
+
* @param value - The new value of the variable
|
|
36
|
+
* @returns the updated variable or undefined if the variable is not found
|
|
37
|
+
*/
|
|
38
|
+
export declare const updateServerVariables: (document: WorkspaceDocument | null, { index, key, value }: ServerEvents["server:update:variables"]) => import("../schemas/v3.1/strict/openapi-document.js").ServerVariableObject | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* Updates the selected server for the document
|
|
41
|
+
*
|
|
42
|
+
* @param document - The document to update the selected server in
|
|
43
|
+
* @param index - The index of the server to update
|
|
44
|
+
* @returns the url of the selected server or undefined if the server is not found
|
|
45
|
+
*/
|
|
46
|
+
export declare const updateSelectedServer: (document: WorkspaceDocument | null, { url }: ServerEvents["server:update:selected"]) => string | undefined;
|
|
12
47
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mutators/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mutators/server.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAE/D,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,wCAAwC,CAAA;AAC9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAE5D;;;;;GAKG;AACH,eAAO,MAAM,SAAS,GAAI,UAAU,iBAAiB,GAAG,IAAI,KAAG,YAAY,GAAG,SAc7E,CAAA;AAgFD;;;;;;;;;GASG;AACH,eAAO,MAAM,YAAY,GACvB,UAAU,iBAAiB,GAAG,IAAI,EAClC,mBAAmB,YAAY,CAAC,sBAAsB,CAAC,KACtD,YAAY,GAAG,SA+BjB,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GAAI,UAAU,iBAAiB,GAAG,IAAI,EAAE,WAAW,YAAY,CAAC,sBAAsB,CAAC,SAY/G,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,qBAAqB,GAChC,UAAU,iBAAiB,GAAG,IAAI,EAClC,uBAAuB,YAAY,CAAC,yBAAyB,CAAC,sFAkB/D,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,GAC/B,UAAU,iBAAiB,GAAG,IAAI,EAClC,SAAS,YAAY,CAAC,wBAAwB,CAAC,KAC9C,MAAM,GAAG,SAaX,CAAA"}
|