fumadocs-openapi 10.2.2 → 10.2.3
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/dist/generate-file.d.ts +53 -49
- package/dist/generate-file.d.ts.map +1 -1
- package/dist/generate-file.js +88 -102
- package/dist/generate-file.js.map +1 -0
- package/dist/index.d.ts +6 -6
- package/dist/index.js +3 -1
- package/dist/playground/client.d.ts +88 -72
- package/dist/playground/client.d.ts.map +1 -1
- package/dist/playground/client.js +446 -296
- package/dist/playground/client.js.map +1 -0
- package/dist/playground/components/inputs.js +395 -172
- package/dist/playground/components/inputs.js.map +1 -0
- package/dist/playground/components/oauth-dialog.js +270 -174
- package/dist/playground/components/oauth-dialog.js.map +1 -0
- package/dist/playground/components/server-select.js +115 -55
- package/dist/playground/components/server-select.js.map +1 -0
- package/dist/playground/fetcher.d.ts +10 -18
- package/dist/playground/fetcher.d.ts.map +1 -1
- package/dist/playground/fetcher.js +67 -75
- package/dist/playground/fetcher.js.map +1 -0
- package/dist/playground/get-default-values.js +23 -26
- package/dist/playground/get-default-values.js.map +1 -0
- package/dist/playground/index.d.ts +23 -13
- package/dist/playground/index.d.ts.map +1 -1
- package/dist/playground/index.js +87 -91
- package/dist/playground/index.js.map +1 -0
- package/dist/playground/lazy.js +9 -2
- package/dist/playground/lazy.js.map +1 -0
- package/dist/playground/schema.d.ts +18 -55
- package/dist/playground/schema.d.ts.map +1 -1
- package/dist/playground/schema.js +117 -106
- package/dist/playground/schema.js.map +1 -0
- package/dist/playground/status-info.js +49 -37
- package/dist/playground/status-info.js.map +1 -0
- package/dist/requests/generators/csharp.js +40 -50
- package/dist/requests/generators/csharp.js.map +1 -0
- package/dist/requests/generators/curl.js +28 -27
- package/dist/requests/generators/curl.js.map +1 -0
- package/dist/requests/generators/go.js +39 -35
- package/dist/requests/generators/go.js.map +1 -0
- package/dist/requests/generators/index.js +49 -43
- package/dist/requests/generators/index.js.map +1 -0
- package/dist/requests/generators/java.js +56 -67
- package/dist/requests/generators/java.js.map +1 -0
- package/dist/requests/generators/javascript.js +38 -45
- package/dist/requests/generators/javascript.js.map +1 -0
- package/dist/requests/generators/python.js +33 -37
- package/dist/requests/generators/python.js.map +1 -0
- package/dist/requests/media/adapter.d.ts +38 -84
- package/dist/requests/media/adapter.d.ts.map +1 -1
- package/dist/requests/media/adapter.js +122 -169
- package/dist/requests/media/adapter.js.map +1 -0
- package/dist/requests/media/encode.d.ts +12 -7
- package/dist/requests/media/encode.d.ts.map +1 -1
- package/dist/requests/media/encode.js +129 -109
- package/dist/requests/media/encode.js.map +1 -0
- package/dist/requests/media/resolve-adapter.js +28 -28
- package/dist/requests/media/resolve-adapter.js.map +1 -0
- package/dist/requests/string-utils.js +28 -35
- package/dist/requests/string-utils.js.map +1 -0
- package/dist/requests/to-python-object.js +16 -28
- package/dist/requests/to-python-object.js.map +1 -0
- package/dist/requests/types.d.ts +25 -21
- package/dist/requests/types.d.ts.map +1 -1
- package/dist/scalar/client.js +57 -20
- package/dist/scalar/client.js.map +1 -0
- package/dist/scalar/index.d.ts +8 -2
- package/dist/scalar/index.d.ts.map +1 -1
- package/dist/scalar/index.js +29 -19
- package/dist/scalar/index.js.map +1 -0
- package/dist/server/create.d.ts +29 -25
- package/dist/server/create.d.ts.map +1 -1
- package/dist/server/create.js +42 -39
- package/dist/server/create.js.map +1 -0
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.js +4 -2
- package/dist/server/proxy.d.ts +28 -28
- package/dist/server/proxy.d.ts.map +1 -1
- package/dist/server/proxy.js +58 -75
- package/dist/server/proxy.js.map +1 -0
- package/dist/server/source-api.d.ts +32 -29
- package/dist/server/source-api.d.ts.map +1 -1
- package/dist/server/source-api.js +82 -75
- package/dist/server/source-api.js.map +1 -0
- package/dist/types.d.ts +41 -36
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/api-page.d.ts +140 -136
- package/dist/ui/api-page.d.ts.map +1 -1
- package/dist/ui/api-page.js +134 -118
- package/dist/ui/api-page.js.map +1 -0
- package/dist/ui/client/index.d.ts +30 -26
- package/dist/ui/client/index.d.ts.map +1 -1
- package/dist/ui/client/index.js +8 -2
- package/dist/ui/client/index.js.map +1 -0
- package/dist/ui/client/storage-key.js +16 -10
- package/dist/ui/client/storage-key.js.map +1 -0
- package/dist/ui/components/accordion.js +40 -14
- package/dist/ui/components/accordion.js.map +1 -0
- package/dist/ui/components/dialog.js +51 -15
- package/dist/ui/components/dialog.js.map +1 -0
- package/dist/ui/components/input.js +18 -8
- package/dist/ui/components/input.js.map +1 -0
- package/dist/ui/components/method-label.js +38 -33
- package/dist/ui/components/method-label.js.map +1 -0
- package/dist/ui/components/select.js +66 -15
- package/dist/ui/components/select.js.map +1 -0
- package/dist/ui/contexts/api.js +96 -85
- package/dist/ui/contexts/api.js.map +1 -0
- package/dist/ui/contexts/api.lazy.js +9 -2
- package/dist/ui/contexts/api.lazy.js.map +1 -0
- package/dist/ui/index.d.ts +2 -2
- package/dist/ui/index.js +3 -1
- package/dist/ui/operation/client.js +65 -27
- package/dist/ui/operation/client.js.map +1 -0
- package/dist/ui/operation/index.js +403 -186
- package/dist/ui/operation/index.js.map +1 -0
- package/dist/ui/operation/request-tabs.d.ts +15 -16
- package/dist/ui/operation/request-tabs.d.ts.map +1 -1
- package/dist/ui/operation/request-tabs.js +151 -131
- package/dist/ui/operation/request-tabs.js.map +1 -0
- package/dist/ui/operation/response-tabs.d.ts +27 -28
- package/dist/ui/operation/response-tabs.d.ts.map +1 -1
- package/dist/ui/operation/response-tabs.js +73 -56
- package/dist/ui/operation/response-tabs.js.map +1 -0
- package/dist/ui/operation/usage-tabs/client.js +117 -88
- package/dist/ui/operation/usage-tabs/client.js.map +1 -0
- package/dist/ui/operation/usage-tabs/index.d.ts +22 -21
- package/dist/ui/operation/usage-tabs/index.d.ts.map +1 -1
- package/dist/ui/operation/usage-tabs/index.js +63 -48
- package/dist/ui/operation/usage-tabs/index.js.map +1 -0
- package/dist/ui/operation/usage-tabs/lazy.js +11 -4
- package/dist/ui/operation/usage-tabs/lazy.js.map +1 -0
- package/dist/ui/schema/client.d.ts +11 -7
- package/dist/ui/schema/client.d.ts.map +1 -1
- package/dist/ui/schema/client.js +213 -127
- package/dist/ui/schema/client.js.map +1 -0
- package/dist/ui/schema/index.d.ts +51 -50
- package/dist/ui/schema/index.d.ts.map +1 -1
- package/dist/ui/schema/index.js +225 -248
- package/dist/ui/schema/index.js.map +1 -0
- package/dist/ui/schema/lazy.js +9 -2
- package/dist/ui/schema/lazy.js.map +1 -0
- package/dist/utils/cn.js +3 -1
- package/dist/utils/deep-equal.js +18 -26
- package/dist/utils/deep-equal.js.map +1 -0
- package/dist/utils/get-typescript-schema.js +21 -19
- package/dist/utils/get-typescript-schema.js.map +1 -0
- package/dist/utils/id-to-title.js +13 -16
- package/dist/utils/id-to-title.js.map +1 -0
- package/dist/utils/lazy.js +13 -11
- package/dist/utils/lazy.js.map +1 -0
- package/dist/utils/merge-schema.js +130 -174
- package/dist/utils/merge-schema.js.map +1 -0
- package/dist/utils/pages/builder.d.ts +80 -76
- package/dist/utils/pages/builder.d.ts.map +1 -1
- package/dist/utils/pages/builder.js +101 -118
- package/dist/utils/pages/builder.js.map +1 -0
- package/dist/utils/pages/preset-auto.d.ts +58 -55
- package/dist/utils/pages/preset-auto.d.ts.map +1 -1
- package/dist/utils/pages/preset-auto.js +124 -137
- package/dist/utils/pages/preset-auto.js.map +1 -0
- package/dist/utils/pages/to-body.js +21 -18
- package/dist/utils/pages/to-body.js.map +1 -0
- package/dist/utils/pages/to-static-data.js +48 -40
- package/dist/utils/pages/to-static-data.js.map +1 -0
- package/dist/utils/pages/to-text.d.ts +43 -41
- package/dist/utils/pages/to-text.d.ts.map +1 -1
- package/dist/utils/pages/to-text.js +93 -126
- package/dist/utils/pages/to-text.js.map +1 -0
- package/dist/utils/process-document.d.ts +18 -19
- package/dist/utils/process-document.d.ts.map +1 -1
- package/dist/utils/process-document.js +43 -54
- package/dist/utils/process-document.js.map +1 -0
- package/dist/utils/remove-undefined.js +18 -18
- package/dist/utils/remove-undefined.js.map +1 -0
- package/dist/utils/schema-to-string.js +46 -64
- package/dist/utils/schema-to-string.js.map +1 -0
- package/dist/utils/schema.d.ts +11 -27
- package/dist/utils/schema.d.ts.map +1 -1
- package/dist/utils/schema.js +43 -44
- package/dist/utils/schema.js.map +1 -0
- package/dist/utils/url.js +35 -56
- package/dist/utils/url.js.map +1 -0
- package/dist/utils/use-query.js +39 -33
- package/dist/utils/use-query.js.map +1 -0
- package/package.json +33 -32
- package/dist/index.d.ts.map +0 -1
- package/dist/playground/components/inputs.d.ts +0 -25
- package/dist/playground/components/inputs.d.ts.map +0 -1
- package/dist/playground/components/oauth-dialog.d.ts +0 -13
- package/dist/playground/components/oauth-dialog.d.ts.map +0 -1
- package/dist/playground/components/server-select.d.ts +0 -3
- package/dist/playground/components/server-select.d.ts.map +0 -1
- package/dist/playground/get-default-values.d.ts +0 -3
- package/dist/playground/get-default-values.d.ts.map +0 -1
- package/dist/playground/lazy.d.ts +0 -2
- package/dist/playground/lazy.d.ts.map +0 -1
- package/dist/playground/status-info.d.ts +0 -8
- package/dist/playground/status-info.d.ts.map +0 -1
- package/dist/requests/generators/csharp.d.ts +0 -3
- package/dist/requests/generators/csharp.d.ts.map +0 -1
- package/dist/requests/generators/curl.d.ts +0 -3
- package/dist/requests/generators/curl.d.ts.map +0 -1
- package/dist/requests/generators/go.d.ts +0 -3
- package/dist/requests/generators/go.d.ts.map +0 -1
- package/dist/requests/generators/index.d.ts +0 -3
- package/dist/requests/generators/index.d.ts.map +0 -1
- package/dist/requests/generators/java.d.ts +0 -3
- package/dist/requests/generators/java.d.ts.map +0 -1
- package/dist/requests/generators/javascript.d.ts +0 -3
- package/dist/requests/generators/javascript.d.ts.map +0 -1
- package/dist/requests/generators/python.d.ts +0 -3
- package/dist/requests/generators/python.d.ts.map +0 -1
- package/dist/requests/media/resolve-adapter.d.ts +0 -19
- package/dist/requests/media/resolve-adapter.d.ts.map +0 -1
- package/dist/requests/string-utils.d.ts +0 -7
- package/dist/requests/string-utils.d.ts.map +0 -1
- package/dist/requests/to-python-object.d.ts +0 -2
- package/dist/requests/to-python-object.d.ts.map +0 -1
- package/dist/requests/types.js +0 -1
- package/dist/scalar/client.d.ts +0 -7
- package/dist/scalar/client.d.ts.map +0 -1
- package/dist/server/index.d.ts.map +0 -1
- package/dist/types.js +0 -1
- package/dist/ui/client/storage-key.d.ts +0 -9
- package/dist/ui/client/storage-key.d.ts.map +0 -1
- package/dist/ui/components/accordion.d.ts +0 -8
- package/dist/ui/components/accordion.d.ts.map +0 -1
- package/dist/ui/components/dialog.d.ts +0 -20
- package/dist/ui/components/dialog.d.ts.map +0 -1
- package/dist/ui/components/input.d.ts +0 -6
- package/dist/ui/components/input.d.ts.map +0 -1
- package/dist/ui/components/method-label.d.ts +0 -10
- package/dist/ui/components/method-label.d.ts.map +0 -1
- package/dist/ui/components/select.d.ts +0 -14
- package/dist/ui/components/select.d.ts.map +0 -1
- package/dist/ui/contexts/api.d.ts +0 -33
- package/dist/ui/contexts/api.d.ts.map +0 -1
- package/dist/ui/contexts/api.lazy.d.ts +0 -2
- package/dist/ui/contexts/api.lazy.d.ts.map +0 -1
- package/dist/ui/icons.d.ts +0 -49
- package/dist/ui/icons.d.ts.map +0 -1
- package/dist/ui/icons.js +0 -281
- package/dist/ui/index.d.ts.map +0 -1
- package/dist/ui/operation/client.d.ts +0 -19
- package/dist/ui/operation/client.d.ts.map +0 -1
- package/dist/ui/operation/index.d.ts +0 -12
- package/dist/ui/operation/index.d.ts.map +0 -1
- package/dist/ui/operation/usage-tabs/client.d.ts +0 -23
- package/dist/ui/operation/usage-tabs/client.d.ts.map +0 -1
- package/dist/ui/operation/usage-tabs/lazy.d.ts +0 -4
- package/dist/ui/operation/usage-tabs/lazy.d.ts.map +0 -1
- package/dist/ui/schema/lazy.d.ts +0 -2
- package/dist/ui/schema/lazy.d.ts.map +0 -1
- package/dist/utils/cn.d.ts +0 -2
- package/dist/utils/cn.d.ts.map +0 -1
- package/dist/utils/deep-equal.d.ts +0 -2
- package/dist/utils/deep-equal.d.ts.map +0 -1
- package/dist/utils/get-typescript-schema.d.ts +0 -4
- package/dist/utils/get-typescript-schema.d.ts.map +0 -1
- package/dist/utils/id-to-title.d.ts +0 -2
- package/dist/utils/id-to-title.d.ts.map +0 -1
- package/dist/utils/lazy.d.ts +0 -5
- package/dist/utils/lazy.d.ts.map +0 -1
- package/dist/utils/merge-schema.d.ts +0 -7
- package/dist/utils/merge-schema.d.ts.map +0 -1
- package/dist/utils/pages/to-body.d.ts +0 -4
- package/dist/utils/pages/to-body.d.ts.map +0 -1
- package/dist/utils/pages/to-static-data.d.ts +0 -10
- package/dist/utils/pages/to-static-data.d.ts.map +0 -1
- package/dist/utils/remove-undefined.d.ts +0 -2
- package/dist/utils/remove-undefined.d.ts.map +0 -1
- package/dist/utils/schema-to-string.d.ts +0 -8
- package/dist/utils/schema-to-string.d.ts.map +0 -1
- package/dist/utils/url.d.ts +0 -11
- package/dist/utils/url.d.ts.map +0 -1
- package/dist/utils/use-query.d.ts +0 -8
- package/dist/utils/use-query.d.ts.map +0 -1
|
@@ -1,113 +1,133 @@
|
|
|
1
|
-
import { resolveMediaAdapter } from
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
continue;
|
|
50
|
-
}
|
|
51
|
-
if (field.in === 'query') {
|
|
52
|
-
const style = field.style ?? 'form';
|
|
53
|
-
if (style in FormDelimiter)
|
|
54
|
-
sep = FormDelimiter[style];
|
|
55
|
-
}
|
|
56
|
-
output[key] = {
|
|
57
|
-
value: prefix + value.map(String).join(sep),
|
|
58
|
-
};
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
if (typeof value === 'object' && value) {
|
|
62
|
-
// header & path creates key-value pairs
|
|
63
|
-
if (explode && (field.in === 'header' || field.in === 'path')) {
|
|
64
|
-
output[key] = {
|
|
65
|
-
value: prefix +
|
|
66
|
-
Object.entries(value)
|
|
67
|
-
.map(([k, v]) => `${k}=${v}`)
|
|
68
|
-
.join(sep),
|
|
69
|
-
};
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
if (explode || field.style === 'deepObject') {
|
|
73
|
-
writeObject(key, value, field.style === 'deepObject', output);
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
output[key] = {
|
|
77
|
-
value: prefix + Object.entries(value).flat().join(sep),
|
|
78
|
-
};
|
|
79
|
-
continue;
|
|
80
|
-
}
|
|
81
|
-
output[key] = {
|
|
82
|
-
value: prefix + String(value),
|
|
83
|
-
};
|
|
84
|
-
}
|
|
85
|
-
result[type] = output;
|
|
86
|
-
}
|
|
87
|
-
return result;
|
|
1
|
+
import { resolveMediaAdapter } from "./resolve-adapter.js";
|
|
2
|
+
import "./adapter.js";
|
|
3
|
+
|
|
4
|
+
//#region src/requests/media/encode.ts
|
|
5
|
+
/**
|
|
6
|
+
* serialize parameters, see https://swagger.io/docs/specification/v3_0/serialization.
|
|
7
|
+
*/
|
|
8
|
+
function encodeRequestData(from, adapters, parameters) {
|
|
9
|
+
const result = {
|
|
10
|
+
method: from.method,
|
|
11
|
+
body: from.body,
|
|
12
|
+
bodyMediaType: from.bodyMediaType,
|
|
13
|
+
cookie: {},
|
|
14
|
+
header: {},
|
|
15
|
+
path: {},
|
|
16
|
+
query: {}
|
|
17
|
+
};
|
|
18
|
+
for (const type of [
|
|
19
|
+
"cookie",
|
|
20
|
+
"query",
|
|
21
|
+
"header",
|
|
22
|
+
"path"
|
|
23
|
+
]) for (const key in from[type]) {
|
|
24
|
+
const value = from[type][key];
|
|
25
|
+
if (value == null) continue;
|
|
26
|
+
const field = parameters.find((p) => p.name === key && p.in === type);
|
|
27
|
+
if (!field) continue;
|
|
28
|
+
const encoder = getMediaEncoder(field, adapters);
|
|
29
|
+
if (encoder) {
|
|
30
|
+
result[type][key] = { value: encoder(value) };
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
switch (type) {
|
|
34
|
+
case "path":
|
|
35
|
+
serializePathParameter(field, value, result.path);
|
|
36
|
+
break;
|
|
37
|
+
case "query":
|
|
38
|
+
serializeQueryParameter(field, value, result.query);
|
|
39
|
+
break;
|
|
40
|
+
case "header":
|
|
41
|
+
result.header[key] = { value: serializeSimple(value, field.explode ?? false) };
|
|
42
|
+
break;
|
|
43
|
+
case "cookie":
|
|
44
|
+
serializeCookieParameter(field, value, result.cookie);
|
|
45
|
+
break;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
88
49
|
}
|
|
89
50
|
function getMediaEncoder(field, adapters) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
return (v) => String(adapter.encode({ body: v }));
|
|
96
|
-
}
|
|
97
|
-
}
|
|
51
|
+
if (!field.content) return;
|
|
52
|
+
for (const k in field.content) {
|
|
53
|
+
const adapter = resolveMediaAdapter(k, adapters);
|
|
54
|
+
if (adapter) return (v) => String(adapter.encode({ body: v }));
|
|
55
|
+
}
|
|
98
56
|
}
|
|
99
|
-
function
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
continue;
|
|
104
|
-
const key = deep ? `${parentKey}[${k}]` : k;
|
|
105
|
-
if (!deep || typeof prop !== 'object') {
|
|
106
|
-
output[key] = {
|
|
107
|
-
value: String(prop),
|
|
108
|
-
};
|
|
109
|
-
continue;
|
|
110
|
-
}
|
|
111
|
-
writeObject(key, value, deep, output);
|
|
112
|
-
}
|
|
57
|
+
function serializeSimple(value, explode) {
|
|
58
|
+
if (Array.isArray(value)) return value.join(",");
|
|
59
|
+
if (typeof value === "object") return explode ? Object.entries(value).map(([k, v]) => `${k}=${v}`).join(",") : Object.entries(value).flat().join(",");
|
|
60
|
+
return String(value);
|
|
113
61
|
}
|
|
62
|
+
function serializePathParameter(field, value, output) {
|
|
63
|
+
const { explode = false, name } = field;
|
|
64
|
+
switch (field.style) {
|
|
65
|
+
case "label":
|
|
66
|
+
if (Array.isArray(value)) {
|
|
67
|
+
output[field.name] = { value: "." + value.join(explode ? "." : ",") };
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
if (typeof value === "object") {
|
|
71
|
+
output[field.name] = { value: "." + (explode ? Object.entries(value).map(([k, v]) => `${k}=${v}`).join(".") : Object.entries(value).flat().join(",")) };
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
output[field.name] = { value: `.${value}` };
|
|
75
|
+
break;
|
|
76
|
+
case "matrix": {
|
|
77
|
+
const specifier = `;${name}=`;
|
|
78
|
+
if (Array.isArray(value)) {
|
|
79
|
+
output[field.name] = { value: explode ? `${specifier}${value.join(",")}` : `${specifier}${value.join(specifier)}` };
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
if (typeof value === "object") {
|
|
83
|
+
output[field.name] = { value: explode ? Object.entries(value).map(([k, v]) => `;${k}=${v}`).join("") : specifier + Object.entries(value).flat().join(",") };
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
output[field.name] = { value: `${specifier}${value}` };
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
default: output[field.name] = { value: serializeSimple(value, explode) };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function serializeQueryParameter(field, value, output) {
|
|
93
|
+
const { explode = true } = field;
|
|
94
|
+
switch (field.style) {
|
|
95
|
+
case "spaceDelimited": if (!explode && Array.isArray(value)) {
|
|
96
|
+
output[field.name] = { values: [value.join(" ")] };
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
case "pipeDelimited": if (!explode && Array.isArray(value)) {
|
|
100
|
+
output[field.name] = { values: [value.join("|")] };
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
case "deepObject": if (!Array.isArray(value) && typeof value === "object") {
|
|
104
|
+
for (const [k, v] of Object.entries(value)) output[`${field.name}[${k}]`] = { values: Array.isArray(v) ? v : [String(v)] };
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
default:
|
|
108
|
+
if (Array.isArray(value)) {
|
|
109
|
+
output[field.name] = { values: explode ? value : [value.join(",")] };
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
if (typeof value === "object" && explode) {
|
|
113
|
+
for (const [k, v] of Object.entries(value)) output[k] = { values: [String(v)] };
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
if (typeof value === "object") {
|
|
117
|
+
output[field.name] = { values: [Object.entries(value).flat().join(",")] };
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
output[field.name] = { values: [String(value)] };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function serializeCookieParameter(field, value, output) {
|
|
124
|
+
const { explode = true } = field;
|
|
125
|
+
if (Array.isArray(value)) output[field.name] = { value: explode ? value.map((v) => `${field.name}=${v}`).join("&") : value.join(",") };
|
|
126
|
+
else if (typeof value === "object" && explode) for (const [k, v] of Object.entries(value)) output[k] = { value: String(v) };
|
|
127
|
+
else if (typeof value === "object") output[field.name] = { value: Object.entries(value).flat().join(",") };
|
|
128
|
+
else output[field.name] = { value: String(value) };
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
//#endregion
|
|
132
|
+
export { encodeRequestData };
|
|
133
|
+
//# sourceMappingURL=encode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.js","names":["result: RequestData"],"sources":["../../../src/requests/media/encode.ts"],"sourcesContent":["import type { MediaAdapter } from '@/requests/media/adapter';\nimport { resolveMediaAdapter } from '@/requests/media/adapter';\nimport type { NoReference } from '@/utils/schema';\nimport type { ParameterObject } from '@/types';\nimport type { RawRequestData, RequestData } from '@/requests/types';\n\nexport interface EncodedParameter {\n readonly value: string;\n}\n\nexport interface EncodedParameterMultiple {\n readonly values: string[];\n}\n\n/**\n * serialize parameters, see https://swagger.io/docs/specification/v3_0/serialization.\n */\nexport function encodeRequestData(\n from: RawRequestData,\n adapters: Record<string, MediaAdapter>,\n parameters: NoReference<ParameterObject>[],\n): RequestData {\n const result: RequestData = {\n method: from.method,\n body: from.body,\n bodyMediaType: from.bodyMediaType,\n cookie: {},\n header: {},\n path: {},\n query: {},\n };\n\n for (const type of ['cookie', 'query', 'header', 'path'] as const) {\n for (const key in from[type]) {\n const value = from[type][key];\n if (value == null) continue;\n\n const field = parameters.find((p) => p.name === key && p.in === type);\n // skip unknown parameters\n if (!field) continue;\n\n const encoder = getMediaEncoder(field, adapters);\n if (encoder) {\n result[type][key] = { value: encoder(value) };\n continue;\n }\n\n switch (type) {\n case 'path':\n serializePathParameter(field, value, result.path);\n break;\n case 'query':\n serializeQueryParameter(field, value, result.query);\n break;\n case 'header': {\n result.header[key] = {\n value: serializeSimple(value, field.explode ?? false),\n };\n break;\n }\n case 'cookie':\n serializeCookieParameter(field, value, result.cookie);\n break;\n }\n }\n }\n\n return result;\n}\n\nfunction getMediaEncoder(\n field: NoReference<ParameterObject>,\n adapters: Record<string, MediaAdapter>,\n) {\n if (!field.content) return;\n\n for (const k in field.content) {\n const adapter = resolveMediaAdapter(k, adapters);\n if (adapter) {\n return (v: unknown) => String(adapter.encode({ body: v }));\n }\n }\n}\n\nfunction serializeSimple(value: NonNullable<unknown>, explode: boolean): string {\n if (Array.isArray(value)) {\n return value.join(',');\n }\n if (typeof value === 'object') {\n return explode\n ? Object.entries(value)\n .map(([k, v]) => `${k}=${v}`)\n .join(',')\n : Object.entries(value).flat().join(',');\n }\n return String(value);\n}\n\nfunction serializePathParameter(\n field: NoReference<ParameterObject>,\n value: NonNullable<unknown>,\n // write output\n output: Record<string, EncodedParameter>,\n): void {\n const { explode = false, name } = field;\n\n switch (field.style) {\n case 'label':\n if (Array.isArray(value)) {\n output[field.name] = {\n value: '.' + value.join(explode ? '.' : ','),\n };\n break;\n }\n if (typeof value === 'object') {\n output[field.name] = {\n value:\n '.' +\n (explode\n ? Object.entries(value)\n .map(([k, v]) => `${k}=${v}`)\n .join('.')\n : Object.entries(value).flat().join(',')),\n };\n break;\n }\n output[field.name] = {\n value: `.${value}`,\n };\n break;\n case 'matrix': {\n const specifier = `;${name}=`;\n\n if (Array.isArray(value)) {\n output[field.name] = {\n value: explode\n ? `${specifier}${value.join(',')}`\n : `${specifier}${value.join(specifier)}`,\n };\n break;\n }\n if (typeof value === 'object') {\n output[field.name] = {\n value: explode\n ? Object.entries(value)\n .map(([k, v]) => `;${k}=${v}`)\n .join('')\n : specifier + Object.entries(value).flat().join(','),\n };\n break;\n }\n\n output[field.name] = {\n value: `${specifier}${value}`,\n };\n break;\n }\n // simple\n default:\n output[field.name] = {\n value: serializeSimple(value, explode),\n };\n }\n}\n\nfunction serializeQueryParameter(\n field: NoReference<ParameterObject>,\n value: NonNullable<unknown>,\n // write output\n output: Record<string, EncodedParameterMultiple>,\n): void {\n const { explode = true } = field;\n\n switch (field.style) {\n case 'spaceDelimited':\n if (!explode && Array.isArray(value)) {\n output[field.name] = {\n values: [value.join(' ')],\n };\n break;\n }\n case 'pipeDelimited':\n if (!explode && Array.isArray(value)) {\n output[field.name] = {\n values: [value.join('|')],\n };\n break;\n }\n case 'deepObject':\n if (!Array.isArray(value) && typeof value === 'object') {\n for (const [k, v] of Object.entries(value)) {\n output[`${field.name}[${k}]`] = {\n // note: the behaviour of nested array is undefined, we do this to avoid edge cases\n values: Array.isArray(v) ? v : [String(v)],\n };\n }\n break;\n }\n // form\n default:\n if (Array.isArray(value)) {\n output[field.name] = {\n values: explode ? value : [value.join(',')],\n };\n break;\n }\n\n if (typeof value === 'object' && explode) {\n for (const [k, v] of Object.entries(value)) {\n output[k] = {\n values: [String(v)],\n };\n }\n break;\n }\n\n if (typeof value === 'object') {\n output[field.name] = {\n values: [Object.entries(value).flat().join(',')],\n };\n break;\n }\n\n output[field.name] = {\n values: [String(value)],\n };\n }\n}\n\nfunction serializeCookieParameter(\n field: NoReference<ParameterObject>,\n value: NonNullable<unknown>,\n // write output\n output: Record<string, EncodedParameter>,\n) {\n const { explode = true } = field;\n\n // form\n if (Array.isArray(value)) {\n output[field.name] = {\n value: explode ? value.map((v) => `${field.name}=${v}`).join('&') : value.join(','),\n };\n } else if (typeof value === 'object' && explode) {\n for (const [k, v] of Object.entries(value)) {\n output[k] = {\n value: String(v),\n };\n }\n } else if (typeof value === 'object') {\n output[field.name] = {\n value: Object.entries(value).flat().join(','),\n };\n } else {\n output[field.name] = {\n value: String(value),\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
+
//#region src/requests/media/resolve-adapter.ts
|
|
1
2
|
const VariantMediaTypeRegex = /^(?<dir>[a-zA-Z0-9._-]+)\/(?<content>[a-zA-Z0-9._-]+)\+(?<variant>[a-zA-Z0-9._-]+)$/;
|
|
2
3
|
/**
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
const baseType = `${match.groups.dir}/${match.groups.variant}`;
|
|
19
|
-
if (baseType in adapters) {
|
|
20
|
-
return adapters[baseType];
|
|
21
|
-
}
|
|
22
|
-
}
|
|
4
|
+
* Resolve a media adapter for a given media type.
|
|
5
|
+
* Supports exact matches and pattern matching (e.g., +json suffix).
|
|
6
|
+
*
|
|
7
|
+
* @param mediaType - The media type to resolve (e.g., "application/json", "application/json-patch+json")
|
|
8
|
+
* @param adapters - Record of media adapters
|
|
9
|
+
* @returns The resolved adapter or undefined if not found
|
|
10
|
+
*/
|
|
11
|
+
function resolveMediaAdapter(mediaType, adapters) {
|
|
12
|
+
const normalized = mediaType.split(";", 2)[0].trim().toLowerCase();
|
|
13
|
+
if (normalized in adapters) return adapters[normalized];
|
|
14
|
+
const match = VariantMediaTypeRegex.exec(normalized);
|
|
15
|
+
if (match?.groups) {
|
|
16
|
+
const baseType = `${match.groups.dir}/${match.groups.variant}`;
|
|
17
|
+
if (baseType in adapters) return adapters[baseType];
|
|
18
|
+
}
|
|
23
19
|
}
|
|
24
20
|
/**
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
21
|
+
* Check if a media type is supported by the given adapters.
|
|
22
|
+
*
|
|
23
|
+
* @param mediaType - The media type to check
|
|
24
|
+
* @param adapters - Record of media adapters
|
|
25
|
+
* @returns true if the media type is supported
|
|
26
|
+
*/
|
|
27
|
+
function isMediaTypeSupported(mediaType, adapters) {
|
|
28
|
+
return resolveMediaAdapter(mediaType, adapters) !== void 0;
|
|
33
29
|
}
|
|
30
|
+
|
|
31
|
+
//#endregion
|
|
32
|
+
export { isMediaTypeSupported, resolveMediaAdapter };
|
|
33
|
+
//# sourceMappingURL=resolve-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve-adapter.js","names":[],"sources":["../../../src/requests/media/resolve-adapter.ts"],"sourcesContent":["import type { MediaAdapter } from './adapter';\n\nconst VariantMediaTypeRegex =\n /^(?<dir>[a-zA-Z0-9._-]+)\\/(?<content>[a-zA-Z0-9._-]+)\\+(?<variant>[a-zA-Z0-9._-]+)$/;\n\n/**\n * Resolve a media adapter for a given media type.\n * Supports exact matches and pattern matching (e.g., +json suffix).\n *\n * @param mediaType - The media type to resolve (e.g., \"application/json\", \"application/json-patch+json\")\n * @param adapters - Record of media adapters\n * @returns The resolved adapter or undefined if not found\n */\nexport function resolveMediaAdapter(\n mediaType: string,\n adapters: Record<string, MediaAdapter>,\n): MediaAdapter | undefined {\n // Normalize media type (remove parameters like charset)\n const normalized = mediaType.split(';', 2)[0].trim().toLowerCase();\n\n if (normalized in adapters) {\n return adapters[normalized];\n }\n\n const match = VariantMediaTypeRegex.exec(normalized);\n if (match?.groups) {\n const baseType = `${match.groups.dir}/${match.groups.variant}`;\n\n if (baseType in adapters) {\n return adapters[baseType];\n }\n }\n}\n\n/**\n * Check if a media type is supported by the given adapters.\n *\n * @param mediaType - The media type to check\n * @param adapters - Record of media adapters\n * @returns true if the media type is supported\n */\nexport function isMediaTypeSupported(\n mediaType: string,\n adapters: Record<string, MediaAdapter>,\n): boolean {\n return resolveMediaAdapter(mediaType, adapters) !== undefined;\n}\n"],"mappings":";AAEA,MAAM,wBACJ;;;;;;;;;AAUF,SAAgB,oBACd,WACA,UAC0B;CAE1B,MAAM,aAAa,UAAU,MAAM,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,aAAa;AAElE,KAAI,cAAc,SAChB,QAAO,SAAS;CAGlB,MAAM,QAAQ,sBAAsB,KAAK,WAAW;AACpD,KAAI,OAAO,QAAQ;EACjB,MAAM,WAAW,GAAG,MAAM,OAAO,IAAI,GAAG,MAAM,OAAO;AAErD,MAAI,YAAY,SACd,QAAO,SAAS;;;;;;;;;;AAYtB,SAAgB,qBACd,WACA,UACS;AACT,QAAO,oBAAoB,WAAW,SAAS,KAAK"}
|
|
@@ -1,39 +1,32 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import js2xml from "xml-js/lib/js2xml";
|
|
2
|
+
|
|
3
|
+
//#region src/requests/string-utils.ts
|
|
3
4
|
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
throw new Error(`For url encoded data, \`value\` must be an object, but received: ${typeof value}`);
|
|
21
|
-
for (const key in value) {
|
|
22
|
-
if (value[key])
|
|
23
|
-
params.set(key, String(value[key]));
|
|
24
|
-
}
|
|
25
|
-
return params.toString();
|
|
26
|
-
}
|
|
27
|
-
return js2xml(value, { compact: true, spaces: 2 });
|
|
5
|
+
* Convert input value to hardcoded string (with quotes)
|
|
6
|
+
*/
|
|
7
|
+
function inputToString(value, format = "application/json") {
|
|
8
|
+
if (typeof value === "string") return value;
|
|
9
|
+
if (format === "application/json") return JSON.stringify(value, null, 2);
|
|
10
|
+
if (format === "application/x-ndjson") return Array.isArray(value) ? value.map((v) => JSON.stringify(v)).join("\n") : JSON.stringify(value, null, 2);
|
|
11
|
+
if (format === "application/x-www-form-urlencoded") {
|
|
12
|
+
const params = new URLSearchParams();
|
|
13
|
+
if (typeof value !== "object") throw new Error(`For url encoded data, \`value\` must be an object, but received: ${typeof value}`);
|
|
14
|
+
for (const key in value) if (value[key]) params.set(key, String(value[key]));
|
|
15
|
+
return params.toString();
|
|
16
|
+
}
|
|
17
|
+
return js2xml(value, {
|
|
18
|
+
compact: true,
|
|
19
|
+
spaces: 2
|
|
20
|
+
});
|
|
28
21
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return `${delimit}${str.replaceAll(delimit, `\\${delimit}`)}${delimit}`;
|
|
22
|
+
function escapeString(str, delimit) {
|
|
23
|
+
if (!delimit) return JSON.stringify(str);
|
|
24
|
+
return `${delimit}${str.replaceAll(delimit, `\\${delimit}`)}${delimit}`;
|
|
33
25
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
.split('\n')
|
|
37
|
-
.map((v) => ' '.repeat(tab) + v)
|
|
38
|
-
.join('\n');
|
|
26
|
+
function ident(code, tab = 1) {
|
|
27
|
+
return code.split("\n").map((v) => " ".repeat(tab) + v).join("\n");
|
|
39
28
|
}
|
|
29
|
+
|
|
30
|
+
//#endregion
|
|
31
|
+
export { escapeString, ident, inputToString };
|
|
32
|
+
//# sourceMappingURL=string-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"string-utils.js","names":[],"sources":["../../src/requests/string-utils.ts"],"sourcesContent":["// @ts-expect-error -- nothing\nimport js2xml from 'xml-js/lib/js2xml';\n\n/**\n * Convert input value to hardcoded string (with quotes)\n */\nexport function inputToString(\n value: unknown,\n format:\n | 'application/x-www-form-urlencoded'\n | 'application/x-ndjson'\n | 'application/json'\n | 'application/xml' = 'application/json',\n): string {\n if (typeof value === 'string') return value;\n\n if (format === 'application/json') {\n return JSON.stringify(value, null, 2);\n }\n\n if (format === 'application/x-ndjson') {\n return Array.isArray(value)\n ? value.map((v) => JSON.stringify(v)).join('\\n')\n : JSON.stringify(value, null, 2);\n }\n\n if (format === 'application/x-www-form-urlencoded') {\n const params = new URLSearchParams();\n if (typeof value !== 'object')\n throw new Error(\n `For url encoded data, \\`value\\` must be an object, but received: ${typeof value}`,\n );\n\n for (const key in value) {\n if (value[key as keyof object]) params.set(key, String(value[key as keyof object]));\n }\n\n return params.toString();\n }\n\n return js2xml(value, { compact: true, spaces: 2 });\n}\n\nexport function escapeString(str: string, delimit?: string): string {\n if (!delimit) return JSON.stringify(str);\n\n return `${delimit}${str.replaceAll(delimit, `\\\\${delimit}`)}${delimit}`;\n}\n\nexport function ident(code: string, tab: number = 1) {\n return code\n .split('\\n')\n .map((v) => ' '.repeat(tab) + v)\n .join('\\n');\n}\n"],"mappings":";;;;;;AAMA,SAAgB,cACd,OACA,SAIwB,oBAChB;AACR,KAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,KAAI,WAAW,mBACb,QAAO,KAAK,UAAU,OAAO,MAAM,EAAE;AAGvC,KAAI,WAAW,uBACb,QAAO,MAAM,QAAQ,MAAM,GACvB,MAAM,KAAK,MAAM,KAAK,UAAU,EAAE,CAAC,CAAC,KAAK,KAAK,GAC9C,KAAK,UAAU,OAAO,MAAM,EAAE;AAGpC,KAAI,WAAW,qCAAqC;EAClD,MAAM,SAAS,IAAI,iBAAiB;AACpC,MAAI,OAAO,UAAU,SACnB,OAAM,IAAI,MACR,oEAAoE,OAAO,QAC5E;AAEH,OAAK,MAAM,OAAO,MAChB,KAAI,MAAM,KAAsB,QAAO,IAAI,KAAK,OAAO,MAAM,KAAqB,CAAC;AAGrF,SAAO,OAAO,UAAU;;AAG1B,QAAO,OAAO,OAAO;EAAE,SAAS;EAAM,QAAQ;EAAG,CAAC;;AAGpD,SAAgB,aAAa,KAAa,SAA0B;AAClE,KAAI,CAAC,QAAS,QAAO,KAAK,UAAU,IAAI;AAExC,QAAO,GAAG,UAAU,IAAI,WAAW,SAAS,KAAK,UAAU,GAAG;;AAGhE,SAAgB,MAAM,MAAc,MAAc,GAAG;AACnD,QAAO,KACJ,MAAM,KAAK,CACX,KAAK,MAAM,KAAK,OAAO,IAAI,GAAG,EAAE,CAChC,KAAK,KAAK"}
|
|
@@ -1,29 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
else if (Array.isArray(v)) {
|
|
15
|
-
const items = v.map((item) => generatePythonObject(item, imports));
|
|
16
|
-
return `[${items.join(', ')}]`;
|
|
17
|
-
}
|
|
18
|
-
else if (v instanceof Date) {
|
|
19
|
-
imports.add('datetime');
|
|
20
|
-
return `datetime.datetime(${v.getFullYear()}, ${v.getMonth() + 1}, ${v.getDate()}, ${v.getHours()}, ${v.getMinutes()}, ${v.getSeconds()}, ${v.getMilliseconds()})`;
|
|
21
|
-
}
|
|
22
|
-
else if (typeof v === 'object') {
|
|
23
|
-
const entries = Object.entries(v).map(([key, value]) => ` ${JSON.stringify(key)}: ${generatePythonObject(value, imports)}`);
|
|
24
|
-
return `{\n${entries.join(', \n')}\n}`;
|
|
25
|
-
}
|
|
26
|
-
else {
|
|
27
|
-
throw new Error(`Unsupported type: ${typeof v}`);
|
|
28
|
-
}
|
|
1
|
+
//#region src/requests/to-python-object.ts
|
|
2
|
+
function generatePythonObject(v, imports = /* @__PURE__ */ new Set()) {
|
|
3
|
+
if (v === null) return "None";
|
|
4
|
+
else if (typeof v === "boolean") return v ? "True" : "False";
|
|
5
|
+
else if (typeof v === "string") return JSON.stringify(v);
|
|
6
|
+
else if (typeof v === "number") return v.toString();
|
|
7
|
+
else if (Array.isArray(v)) return `[${v.map((item) => generatePythonObject(item, imports)).join(", ")}]`;
|
|
8
|
+
else if (v instanceof Date) {
|
|
9
|
+
imports.add("datetime");
|
|
10
|
+
return `datetime.datetime(${v.getFullYear()}, ${v.getMonth() + 1}, ${v.getDate()}, ${v.getHours()}, ${v.getMinutes()}, ${v.getSeconds()}, ${v.getMilliseconds()})`;
|
|
11
|
+
} else if (typeof v === "object") return `{\n${Object.entries(v).map(([key, value]) => ` ${JSON.stringify(key)}: ${generatePythonObject(value, imports)}`).join(", \n")}\n}`;
|
|
12
|
+
else throw new Error(`Unsupported type: ${typeof v}`);
|
|
29
13
|
}
|
|
14
|
+
|
|
15
|
+
//#endregion
|
|
16
|
+
export { generatePythonObject };
|
|
17
|
+
//# sourceMappingURL=to-python-object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-python-object.js","names":[],"sources":["../../src/requests/to-python-object.ts"],"sourcesContent":["export function generatePythonObject(v: unknown, imports = new Set()): string {\n if (v === null) {\n return 'None';\n } else if (typeof v === 'boolean') {\n return v ? 'True' : 'False';\n } else if (typeof v === 'string') {\n return JSON.stringify(v);\n } else if (typeof v === 'number') {\n return v.toString();\n } else if (Array.isArray(v)) {\n const items = v.map((item) => generatePythonObject(item, imports));\n return `[${items.join(', ')}]`;\n } else if (v instanceof Date) {\n imports.add('datetime');\n return `datetime.datetime(${v.getFullYear()}, ${v.getMonth() + 1}, ${v.getDate()}, ${v.getHours()}, ${v.getMinutes()}, ${v.getSeconds()}, ${v.getMilliseconds()})`;\n } else if (typeof v === 'object') {\n const entries = Object.entries(v).map(\n ([key, value]) => ` ${JSON.stringify(key)}: ${generatePythonObject(value, imports)}`,\n );\n return `{\\n${entries.join(', \\n')}\\n}`;\n } else {\n throw new Error(`Unsupported type: ${typeof v}`);\n }\n}\n"],"mappings":";AAAA,SAAgB,qBAAqB,GAAY,0BAAU,IAAI,KAAK,EAAU;AAC5E,KAAI,MAAM,KACR,QAAO;UACE,OAAO,MAAM,UACtB,QAAO,IAAI,SAAS;UACX,OAAO,MAAM,SACtB,QAAO,KAAK,UAAU,EAAE;UACf,OAAO,MAAM,SACtB,QAAO,EAAE,UAAU;UACV,MAAM,QAAQ,EAAE,CAEzB,QAAO,IADO,EAAE,KAAK,SAAS,qBAAqB,MAAM,QAAQ,CAAC,CACjD,KAAK,KAAK,CAAC;UACnB,aAAa,MAAM;AAC5B,UAAQ,IAAI,WAAW;AACvB,SAAO,qBAAqB,EAAE,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,iBAAiB,CAAC;YACvJ,OAAO,MAAM,SAItB,QAAO,MAHS,OAAO,QAAQ,EAAE,CAAC,KAC/B,CAAC,KAAK,WAAW,KAAK,KAAK,UAAU,IAAI,CAAC,IAAI,qBAAqB,OAAO,QAAQ,GACpF,CACoB,KAAK,OAAO,CAAC;KAElC,OAAM,IAAI,MAAM,qBAAqB,OAAO,IAAI"}
|
package/dist/requests/types.d.ts
CHANGED
|
@@ -1,25 +1,29 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import { MediaAdapter } from "./media/adapter.js";
|
|
2
|
+
import { EncodedParameter, EncodedParameterMultiple } from "./media/encode.js";
|
|
3
|
+
|
|
4
|
+
//#region src/requests/types.d.ts
|
|
5
|
+
type SampleGenerator<ServerContext = unknown> = (url: string, data: RequestData, context: {
|
|
6
|
+
mediaAdapters: Record<string, MediaAdapter>;
|
|
7
|
+
server: ServerContext;
|
|
6
8
|
}) => string;
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
interface RawRequestData {
|
|
10
|
+
method: string;
|
|
11
|
+
path: Record<string, unknown>;
|
|
12
|
+
query: Record<string, unknown>;
|
|
13
|
+
header: Record<string, unknown>;
|
|
14
|
+
cookie: Record<string, unknown>;
|
|
15
|
+
body?: unknown;
|
|
16
|
+
bodyMediaType?: string;
|
|
15
17
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
interface RequestData {
|
|
19
|
+
method: string;
|
|
20
|
+
path: Record<string, EncodedParameter>;
|
|
21
|
+
query: Record<string, EncodedParameterMultiple>;
|
|
22
|
+
header: Record<string, EncodedParameter>;
|
|
23
|
+
cookie: Record<string, EncodedParameter>;
|
|
24
|
+
body?: unknown;
|
|
25
|
+
bodyMediaType?: string;
|
|
24
26
|
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { RawRequestData, RequestData, SampleGenerator };
|
|
25
29
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../../src/requests/types.ts"],"sourcesContent":[],"mappings":";;;;KAGY,+DAEJ;iBAEW,eAAe;EAJtB,MAAA,EAKA,aALe;CAEnB,EAAA,GAAA,MAAA;AAE0B,UAKjB,cAAA,CALiB;EAAf,MAAA,EAAA,MAAA;EACP,IAAA,EAOJ,MAPI,CAAA,MAAA,EAAA,OAAA,CAAA;EAAa,KAAA,EAQhB,MARgB,CAAA,MAAA,EAAA,OAAA,CAAA;EAIR,MAAA,EAKP,MALO,CAAA,MAAc,EAAA,OAAA,CAAA;EAGvB,MAAA,EAGE,MAHF,CAAA,MAAA,EAAA,OAAA,CAAA;EACC,IAAA,CAAA,EAAA,OAAA;EACC,aAAA,CAAA,EAAA,MAAA;;AACM,UAMC,WAAA,CAND;EAMC,MAAA,EAAA,MAAW;EAGL,IAAA,EAAf,MAAe,CAAA,MAAA,EAAA,gBAAA,CAAA;EAAf,KAAA,EACC,MADD,CAAA,MAAA,EACgB,wBADhB,CAAA;EACgB,MAAA,EACd,MADc,CAAA,MAAA,EACC,gBADD,CAAA;EAAf,MAAA,EAEC,MAFD,CAAA,MAAA,EAEgB,gBAFhB,CAAA;EACgB,IAAA,CAAA,EAAA,OAAA;EAAf,aAAA,CAAA,EAAA,MAAA"}
|
package/dist/scalar/client.js
CHANGED
|
@@ -1,24 +1,61 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
|
|
3
|
-
import { cn } from
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
2
|
+
|
|
3
|
+
import { cn } from "../utils/cn.js";
|
|
4
|
+
import { MethodLabel } from "../ui/components/method-label.js";
|
|
5
|
+
import { useEffect, useState } from "react";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
import { buttonVariants } from "fumadocs-ui/components/ui/button";
|
|
8
|
+
import { ApiClientModalProvider, useApiClientModal } from "@scalar/api-client-react";
|
|
9
|
+
import { useTheme } from "next-themes";
|
|
10
|
+
import "@scalar/api-client-react/style.css";
|
|
11
|
+
|
|
12
|
+
//#region src/scalar/client.tsx
|
|
13
|
+
function ScalarPlayground({ path, method, spec }) {
|
|
14
|
+
const { resolvedTheme } = useTheme();
|
|
15
|
+
const [mounted, setMounted] = useState(false);
|
|
16
|
+
useEffect(() => {
|
|
17
|
+
setMounted(true);
|
|
18
|
+
}, []);
|
|
19
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
20
|
+
className: cn("flex flex-row items-center gap-2.5 p-3 rounded-xl border bg-fd-card text-fd-card-foreground not-prose", mounted ? `${resolvedTheme}-mode` : null),
|
|
21
|
+
children: [
|
|
22
|
+
/* @__PURE__ */ jsx(MethodLabel, {
|
|
23
|
+
className: "text-xs",
|
|
24
|
+
children: method
|
|
25
|
+
}),
|
|
26
|
+
/* @__PURE__ */ jsx("code", {
|
|
27
|
+
className: "flex-1 overflow-auto text-nowrap text-[0.8125rem] text-fd-muted-foreground",
|
|
28
|
+
children: path
|
|
29
|
+
}),
|
|
30
|
+
/* @__PURE__ */ jsx(ApiClientModalProvider, {
|
|
31
|
+
configuration: {
|
|
32
|
+
theme: "moon",
|
|
33
|
+
content: spec
|
|
34
|
+
},
|
|
35
|
+
children: /* @__PURE__ */ jsx(Trigger, {
|
|
36
|
+
path,
|
|
37
|
+
method
|
|
38
|
+
})
|
|
39
|
+
})
|
|
40
|
+
]
|
|
41
|
+
});
|
|
20
42
|
}
|
|
21
43
|
function Trigger({ path, method }) {
|
|
22
|
-
|
|
23
|
-
|
|
44
|
+
const client = useApiClientModal();
|
|
45
|
+
return /* @__PURE__ */ jsx("button", {
|
|
46
|
+
type: "submit",
|
|
47
|
+
className: cn(buttonVariants({
|
|
48
|
+
color: "primary",
|
|
49
|
+
size: "sm"
|
|
50
|
+
}), "px-3 py-1.5"),
|
|
51
|
+
onClick: () => client?.open({
|
|
52
|
+
path,
|
|
53
|
+
method
|
|
54
|
+
}),
|
|
55
|
+
children: "Test"
|
|
56
|
+
});
|
|
24
57
|
}
|
|
58
|
+
|
|
59
|
+
//#endregion
|
|
60
|
+
export { ScalarPlayground as default };
|
|
61
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","names":[],"sources":["../../src/scalar/client.tsx"],"sourcesContent":["'use client';\nimport { cn } from '@/utils/cn';\nimport { buttonVariants } from 'fumadocs-ui/components/ui/button';\nimport { ApiClientModalProvider, useApiClientModal } from '@scalar/api-client-react';\nimport { MethodLabel } from '@/ui/components/method-label';\nimport { useTheme } from 'next-themes';\nimport { useEffect, useState } from 'react';\nimport type { OpenAPIV3_1 } from 'openapi-types';\nimport '@scalar/api-client-react/style.css';\n\nexport default function ScalarPlayground({\n path,\n method,\n spec,\n}: {\n spec: object;\n path: string;\n method: string;\n}) {\n const { resolvedTheme } = useTheme();\n const [mounted, setMounted] = useState(false);\n\n useEffect(() => {\n setMounted(true);\n }, []);\n\n return (\n <div\n className={cn(\n 'flex flex-row items-center gap-2.5 p-3 rounded-xl border bg-fd-card text-fd-card-foreground not-prose',\n mounted ? `${resolvedTheme}-mode` : null,\n )}\n >\n <MethodLabel className=\"text-xs\">{method}</MethodLabel>\n <code className=\"flex-1 overflow-auto text-nowrap text-[0.8125rem] text-fd-muted-foreground\">\n {path}\n </code>\n <ApiClientModalProvider\n configuration={{\n theme: 'moon',\n content: spec,\n }}\n >\n <Trigger path={path} method={method} />\n </ApiClientModalProvider>\n </div>\n );\n}\n\nfunction Trigger({ path, method }: { path: string; method: string }) {\n const client = useApiClientModal();\n\n return (\n <button\n type=\"submit\"\n className={cn(buttonVariants({ color: 'primary', size: 'sm' }), 'px-3 py-1.5')}\n onClick={() => client?.open({ path, method: method as OpenAPIV3_1.HttpMethods })}\n >\n Test\n </button>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAUA,SAAwB,iBAAiB,EACvC,MACA,QACA,QAKC;CACD,MAAM,EAAE,kBAAkB,UAAU;CACpC,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;AAE7C,iBAAgB;AACd,aAAW,KAAK;IACf,EAAE,CAAC;AAEN,QACE,qBAAC;EACC,WAAW,GACT,yGACA,UAAU,GAAG,cAAc,SAAS,KACrC;;GAED,oBAAC;IAAY,WAAU;cAAW;KAAqB;GACvD,oBAAC;IAAK,WAAU;cACb;KACI;GACP,oBAAC;IACC,eAAe;KACb,OAAO;KACP,SAAS;KACV;cAED,oBAAC;KAAc;KAAc;MAAU;KAChB;;GACrB;;AAIV,SAAS,QAAQ,EAAE,MAAM,UAA4C;CACnE,MAAM,SAAS,mBAAmB;AAElC,QACE,oBAAC;EACC,MAAK;EACL,WAAW,GAAG,eAAe;GAAE,OAAO;GAAW,MAAM;GAAM,CAAC,EAAE,cAAc;EAC9E,eAAe,QAAQ,KAAK;GAAE;GAAc;GAAmC,CAAC;YACjF;GAEQ"}
|