fumadocs-openapi 10.2.2 → 10.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (278) hide show
  1. package/dist/generate-file.d.ts +53 -49
  2. package/dist/generate-file.d.ts.map +1 -1
  3. package/dist/generate-file.js +88 -102
  4. package/dist/generate-file.js.map +1 -0
  5. package/dist/index.d.ts +6 -6
  6. package/dist/index.js +3 -1
  7. package/dist/playground/client.d.ts +88 -72
  8. package/dist/playground/client.d.ts.map +1 -1
  9. package/dist/playground/client.js +446 -296
  10. package/dist/playground/client.js.map +1 -0
  11. package/dist/playground/components/inputs.js +395 -172
  12. package/dist/playground/components/inputs.js.map +1 -0
  13. package/dist/playground/components/oauth-dialog.js +270 -174
  14. package/dist/playground/components/oauth-dialog.js.map +1 -0
  15. package/dist/playground/components/server-select.js +115 -55
  16. package/dist/playground/components/server-select.js.map +1 -0
  17. package/dist/playground/fetcher.d.ts +10 -18
  18. package/dist/playground/fetcher.d.ts.map +1 -1
  19. package/dist/playground/fetcher.js +67 -75
  20. package/dist/playground/fetcher.js.map +1 -0
  21. package/dist/playground/get-default-values.js +23 -26
  22. package/dist/playground/get-default-values.js.map +1 -0
  23. package/dist/playground/index.d.ts +23 -13
  24. package/dist/playground/index.d.ts.map +1 -1
  25. package/dist/playground/index.js +87 -91
  26. package/dist/playground/index.js.map +1 -0
  27. package/dist/playground/lazy.js +9 -2
  28. package/dist/playground/lazy.js.map +1 -0
  29. package/dist/playground/schema.d.ts +18 -55
  30. package/dist/playground/schema.d.ts.map +1 -1
  31. package/dist/playground/schema.js +117 -106
  32. package/dist/playground/schema.js.map +1 -0
  33. package/dist/playground/status-info.js +49 -37
  34. package/dist/playground/status-info.js.map +1 -0
  35. package/dist/requests/generators/csharp.js +40 -50
  36. package/dist/requests/generators/csharp.js.map +1 -0
  37. package/dist/requests/generators/curl.js +28 -27
  38. package/dist/requests/generators/curl.js.map +1 -0
  39. package/dist/requests/generators/go.js +39 -35
  40. package/dist/requests/generators/go.js.map +1 -0
  41. package/dist/requests/generators/index.js +49 -43
  42. package/dist/requests/generators/index.js.map +1 -0
  43. package/dist/requests/generators/java.js +56 -67
  44. package/dist/requests/generators/java.js.map +1 -0
  45. package/dist/requests/generators/javascript.js +38 -45
  46. package/dist/requests/generators/javascript.js.map +1 -0
  47. package/dist/requests/generators/python.js +33 -37
  48. package/dist/requests/generators/python.js.map +1 -0
  49. package/dist/requests/media/adapter.d.ts +38 -84
  50. package/dist/requests/media/adapter.d.ts.map +1 -1
  51. package/dist/requests/media/adapter.js +122 -169
  52. package/dist/requests/media/adapter.js.map +1 -0
  53. package/dist/requests/media/encode.d.ts +12 -7
  54. package/dist/requests/media/encode.d.ts.map +1 -1
  55. package/dist/requests/media/encode.js +131 -109
  56. package/dist/requests/media/encode.js.map +1 -0
  57. package/dist/requests/media/resolve-adapter.js +28 -28
  58. package/dist/requests/media/resolve-adapter.js.map +1 -0
  59. package/dist/requests/string-utils.js +28 -35
  60. package/dist/requests/string-utils.js.map +1 -0
  61. package/dist/requests/to-python-object.js +16 -28
  62. package/dist/requests/to-python-object.js.map +1 -0
  63. package/dist/requests/types.d.ts +25 -21
  64. package/dist/requests/types.d.ts.map +1 -1
  65. package/dist/scalar/client.js +57 -20
  66. package/dist/scalar/client.js.map +1 -0
  67. package/dist/scalar/index.d.ts +8 -2
  68. package/dist/scalar/index.d.ts.map +1 -1
  69. package/dist/scalar/index.js +29 -19
  70. package/dist/scalar/index.js.map +1 -0
  71. package/dist/server/create.d.ts +29 -25
  72. package/dist/server/create.d.ts.map +1 -1
  73. package/dist/server/create.js +42 -39
  74. package/dist/server/create.js.map +1 -0
  75. package/dist/server/index.d.ts +3 -3
  76. package/dist/server/index.js +4 -2
  77. package/dist/server/proxy.d.ts +28 -28
  78. package/dist/server/proxy.d.ts.map +1 -1
  79. package/dist/server/proxy.js +58 -75
  80. package/dist/server/proxy.js.map +1 -0
  81. package/dist/server/source-api.d.ts +32 -29
  82. package/dist/server/source-api.d.ts.map +1 -1
  83. package/dist/server/source-api.js +82 -75
  84. package/dist/server/source-api.js.map +1 -0
  85. package/dist/types.d.ts +41 -36
  86. package/dist/types.d.ts.map +1 -1
  87. package/dist/ui/api-page.d.ts +140 -136
  88. package/dist/ui/api-page.d.ts.map +1 -1
  89. package/dist/ui/api-page.js +134 -118
  90. package/dist/ui/api-page.js.map +1 -0
  91. package/dist/ui/client/index.d.ts +30 -26
  92. package/dist/ui/client/index.d.ts.map +1 -1
  93. package/dist/ui/client/index.js +8 -2
  94. package/dist/ui/client/index.js.map +1 -0
  95. package/dist/ui/client/storage-key.js +16 -10
  96. package/dist/ui/client/storage-key.js.map +1 -0
  97. package/dist/ui/components/accordion.js +40 -14
  98. package/dist/ui/components/accordion.js.map +1 -0
  99. package/dist/ui/components/dialog.js +51 -15
  100. package/dist/ui/components/dialog.js.map +1 -0
  101. package/dist/ui/components/input.js +18 -8
  102. package/dist/ui/components/input.js.map +1 -0
  103. package/dist/ui/components/method-label.js +38 -33
  104. package/dist/ui/components/method-label.js.map +1 -0
  105. package/dist/ui/components/select.js +66 -15
  106. package/dist/ui/components/select.js.map +1 -0
  107. package/dist/ui/contexts/api.js +96 -85
  108. package/dist/ui/contexts/api.js.map +1 -0
  109. package/dist/ui/contexts/api.lazy.js +9 -2
  110. package/dist/ui/contexts/api.lazy.js.map +1 -0
  111. package/dist/ui/index.d.ts +2 -2
  112. package/dist/ui/index.js +3 -1
  113. package/dist/ui/operation/client.js +65 -27
  114. package/dist/ui/operation/client.js.map +1 -0
  115. package/dist/ui/operation/index.js +403 -186
  116. package/dist/ui/operation/index.js.map +1 -0
  117. package/dist/ui/operation/request-tabs.d.ts +15 -16
  118. package/dist/ui/operation/request-tabs.d.ts.map +1 -1
  119. package/dist/ui/operation/request-tabs.js +151 -131
  120. package/dist/ui/operation/request-tabs.js.map +1 -0
  121. package/dist/ui/operation/response-tabs.d.ts +27 -28
  122. package/dist/ui/operation/response-tabs.d.ts.map +1 -1
  123. package/dist/ui/operation/response-tabs.js +73 -56
  124. package/dist/ui/operation/response-tabs.js.map +1 -0
  125. package/dist/ui/operation/usage-tabs/client.js +117 -88
  126. package/dist/ui/operation/usage-tabs/client.js.map +1 -0
  127. package/dist/ui/operation/usage-tabs/index.d.ts +22 -21
  128. package/dist/ui/operation/usage-tabs/index.d.ts.map +1 -1
  129. package/dist/ui/operation/usage-tabs/index.js +63 -48
  130. package/dist/ui/operation/usage-tabs/index.js.map +1 -0
  131. package/dist/ui/operation/usage-tabs/lazy.js +11 -4
  132. package/dist/ui/operation/usage-tabs/lazy.js.map +1 -0
  133. package/dist/ui/schema/client.d.ts +11 -7
  134. package/dist/ui/schema/client.d.ts.map +1 -1
  135. package/dist/ui/schema/client.js +213 -127
  136. package/dist/ui/schema/client.js.map +1 -0
  137. package/dist/ui/schema/index.d.ts +51 -50
  138. package/dist/ui/schema/index.d.ts.map +1 -1
  139. package/dist/ui/schema/index.js +225 -248
  140. package/dist/ui/schema/index.js.map +1 -0
  141. package/dist/ui/schema/lazy.js +9 -2
  142. package/dist/ui/schema/lazy.js.map +1 -0
  143. package/dist/utils/cn.js +3 -1
  144. package/dist/utils/deep-equal.js +18 -26
  145. package/dist/utils/deep-equal.js.map +1 -0
  146. package/dist/utils/get-typescript-schema.js +21 -19
  147. package/dist/utils/get-typescript-schema.js.map +1 -0
  148. package/dist/utils/id-to-title.js +13 -16
  149. package/dist/utils/id-to-title.js.map +1 -0
  150. package/dist/utils/lazy.js +13 -11
  151. package/dist/utils/lazy.js.map +1 -0
  152. package/dist/utils/merge-schema.js +130 -174
  153. package/dist/utils/merge-schema.js.map +1 -0
  154. package/dist/utils/pages/builder.d.ts +80 -76
  155. package/dist/utils/pages/builder.d.ts.map +1 -1
  156. package/dist/utils/pages/builder.js +101 -118
  157. package/dist/utils/pages/builder.js.map +1 -0
  158. package/dist/utils/pages/preset-auto.d.ts +58 -55
  159. package/dist/utils/pages/preset-auto.d.ts.map +1 -1
  160. package/dist/utils/pages/preset-auto.js +124 -137
  161. package/dist/utils/pages/preset-auto.js.map +1 -0
  162. package/dist/utils/pages/to-body.js +21 -18
  163. package/dist/utils/pages/to-body.js.map +1 -0
  164. package/dist/utils/pages/to-static-data.js +48 -40
  165. package/dist/utils/pages/to-static-data.js.map +1 -0
  166. package/dist/utils/pages/to-text.d.ts +43 -41
  167. package/dist/utils/pages/to-text.d.ts.map +1 -1
  168. package/dist/utils/pages/to-text.js +93 -126
  169. package/dist/utils/pages/to-text.js.map +1 -0
  170. package/dist/utils/process-document.d.ts +18 -19
  171. package/dist/utils/process-document.d.ts.map +1 -1
  172. package/dist/utils/process-document.js +43 -54
  173. package/dist/utils/process-document.js.map +1 -0
  174. package/dist/utils/remove-undefined.js +18 -18
  175. package/dist/utils/remove-undefined.js.map +1 -0
  176. package/dist/utils/schema-to-string.js +46 -64
  177. package/dist/utils/schema-to-string.js.map +1 -0
  178. package/dist/utils/schema.d.ts +11 -27
  179. package/dist/utils/schema.d.ts.map +1 -1
  180. package/dist/utils/schema.js +43 -44
  181. package/dist/utils/schema.js.map +1 -0
  182. package/dist/utils/url.js +35 -56
  183. package/dist/utils/url.js.map +1 -0
  184. package/dist/utils/use-query.js +39 -33
  185. package/dist/utils/use-query.js.map +1 -0
  186. package/package.json +34 -33
  187. package/dist/index.d.ts.map +0 -1
  188. package/dist/playground/components/inputs.d.ts +0 -25
  189. package/dist/playground/components/inputs.d.ts.map +0 -1
  190. package/dist/playground/components/oauth-dialog.d.ts +0 -13
  191. package/dist/playground/components/oauth-dialog.d.ts.map +0 -1
  192. package/dist/playground/components/server-select.d.ts +0 -3
  193. package/dist/playground/components/server-select.d.ts.map +0 -1
  194. package/dist/playground/get-default-values.d.ts +0 -3
  195. package/dist/playground/get-default-values.d.ts.map +0 -1
  196. package/dist/playground/lazy.d.ts +0 -2
  197. package/dist/playground/lazy.d.ts.map +0 -1
  198. package/dist/playground/status-info.d.ts +0 -8
  199. package/dist/playground/status-info.d.ts.map +0 -1
  200. package/dist/requests/generators/csharp.d.ts +0 -3
  201. package/dist/requests/generators/csharp.d.ts.map +0 -1
  202. package/dist/requests/generators/curl.d.ts +0 -3
  203. package/dist/requests/generators/curl.d.ts.map +0 -1
  204. package/dist/requests/generators/go.d.ts +0 -3
  205. package/dist/requests/generators/go.d.ts.map +0 -1
  206. package/dist/requests/generators/index.d.ts +0 -3
  207. package/dist/requests/generators/index.d.ts.map +0 -1
  208. package/dist/requests/generators/java.d.ts +0 -3
  209. package/dist/requests/generators/java.d.ts.map +0 -1
  210. package/dist/requests/generators/javascript.d.ts +0 -3
  211. package/dist/requests/generators/javascript.d.ts.map +0 -1
  212. package/dist/requests/generators/python.d.ts +0 -3
  213. package/dist/requests/generators/python.d.ts.map +0 -1
  214. package/dist/requests/media/resolve-adapter.d.ts +0 -19
  215. package/dist/requests/media/resolve-adapter.d.ts.map +0 -1
  216. package/dist/requests/string-utils.d.ts +0 -7
  217. package/dist/requests/string-utils.d.ts.map +0 -1
  218. package/dist/requests/to-python-object.d.ts +0 -2
  219. package/dist/requests/to-python-object.d.ts.map +0 -1
  220. package/dist/requests/types.js +0 -1
  221. package/dist/scalar/client.d.ts +0 -7
  222. package/dist/scalar/client.d.ts.map +0 -1
  223. package/dist/server/index.d.ts.map +0 -1
  224. package/dist/types.js +0 -1
  225. package/dist/ui/client/storage-key.d.ts +0 -9
  226. package/dist/ui/client/storage-key.d.ts.map +0 -1
  227. package/dist/ui/components/accordion.d.ts +0 -8
  228. package/dist/ui/components/accordion.d.ts.map +0 -1
  229. package/dist/ui/components/dialog.d.ts +0 -20
  230. package/dist/ui/components/dialog.d.ts.map +0 -1
  231. package/dist/ui/components/input.d.ts +0 -6
  232. package/dist/ui/components/input.d.ts.map +0 -1
  233. package/dist/ui/components/method-label.d.ts +0 -10
  234. package/dist/ui/components/method-label.d.ts.map +0 -1
  235. package/dist/ui/components/select.d.ts +0 -14
  236. package/dist/ui/components/select.d.ts.map +0 -1
  237. package/dist/ui/contexts/api.d.ts +0 -33
  238. package/dist/ui/contexts/api.d.ts.map +0 -1
  239. package/dist/ui/contexts/api.lazy.d.ts +0 -2
  240. package/dist/ui/contexts/api.lazy.d.ts.map +0 -1
  241. package/dist/ui/icons.d.ts +0 -49
  242. package/dist/ui/icons.d.ts.map +0 -1
  243. package/dist/ui/icons.js +0 -281
  244. package/dist/ui/index.d.ts.map +0 -1
  245. package/dist/ui/operation/client.d.ts +0 -19
  246. package/dist/ui/operation/client.d.ts.map +0 -1
  247. package/dist/ui/operation/index.d.ts +0 -12
  248. package/dist/ui/operation/index.d.ts.map +0 -1
  249. package/dist/ui/operation/usage-tabs/client.d.ts +0 -23
  250. package/dist/ui/operation/usage-tabs/client.d.ts.map +0 -1
  251. package/dist/ui/operation/usage-tabs/lazy.d.ts +0 -4
  252. package/dist/ui/operation/usage-tabs/lazy.d.ts.map +0 -1
  253. package/dist/ui/schema/lazy.d.ts +0 -2
  254. package/dist/ui/schema/lazy.d.ts.map +0 -1
  255. package/dist/utils/cn.d.ts +0 -2
  256. package/dist/utils/cn.d.ts.map +0 -1
  257. package/dist/utils/deep-equal.d.ts +0 -2
  258. package/dist/utils/deep-equal.d.ts.map +0 -1
  259. package/dist/utils/get-typescript-schema.d.ts +0 -4
  260. package/dist/utils/get-typescript-schema.d.ts.map +0 -1
  261. package/dist/utils/id-to-title.d.ts +0 -2
  262. package/dist/utils/id-to-title.d.ts.map +0 -1
  263. package/dist/utils/lazy.d.ts +0 -5
  264. package/dist/utils/lazy.d.ts.map +0 -1
  265. package/dist/utils/merge-schema.d.ts +0 -7
  266. package/dist/utils/merge-schema.d.ts.map +0 -1
  267. package/dist/utils/pages/to-body.d.ts +0 -4
  268. package/dist/utils/pages/to-body.d.ts.map +0 -1
  269. package/dist/utils/pages/to-static-data.d.ts +0 -10
  270. package/dist/utils/pages/to-static-data.d.ts.map +0 -1
  271. package/dist/utils/remove-undefined.d.ts +0 -2
  272. package/dist/utils/remove-undefined.d.ts.map +0 -1
  273. package/dist/utils/schema-to-string.d.ts +0 -8
  274. package/dist/utils/schema-to-string.d.ts.map +0 -1
  275. package/dist/utils/url.d.ts +0 -11
  276. package/dist/utils/url.d.ts.map +0 -1
  277. package/dist/utils/use-query.d.ts +0 -8
  278. package/dist/utils/use-query.d.ts.map +0 -1
@@ -1,113 +1,135 @@
1
- import { resolveMediaAdapter } from '../../requests/media/adapter.js';
2
- const FormDelimiter = {
3
- spaceDelimited: ' ',
4
- pipeDelimited: '|',
5
- };
6
- const PathPrefix = {
7
- label: '.',
8
- matrix: ';',
9
- };
10
- export function encodeRequestData(from, adapters, parameters) {
11
- const result = {
12
- method: from.method,
13
- body: from.body,
14
- bodyMediaType: from.bodyMediaType,
15
- };
16
- for (const type of ['cookie', 'query', 'header', 'path']) {
17
- const output = {};
18
- for (const key in from[type]) {
19
- const value = from[type][key];
20
- if (value == null)
21
- continue;
22
- const field = parameters.find((p) => p.name === key && p.in === type);
23
- if (!field) {
24
- output[key] = { value: String(value) };
25
- continue;
26
- }
27
- const encoder = getMediaEncoder(field, adapters);
28
- if (encoder) {
29
- output[key] = { value: encoder(value) };
30
- continue;
31
- }
32
- const explode = field.explode ?? true;
33
- let prefix = '';
34
- let sep = ',';
35
- if (field.in === 'path') {
36
- const style = field.style ?? 'simple';
37
- if (style in PathPrefix) {
38
- prefix = PathPrefix[style];
39
- if (explode)
40
- sep = prefix;
41
- }
42
- }
43
- if (Array.isArray(value)) {
44
- // header & cookie doesn't support explode for array values
45
- if (explode && field.in !== 'header' && field.in !== 'cookie') {
46
- output[key] = {
47
- value: prefix + value.map(String),
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
+ name: key,
28
+ in: type
29
+ };
30
+ const encoder = getMediaEncoder(field, adapters);
31
+ if (encoder) {
32
+ result[type][key] = { value: encoder(value) };
33
+ continue;
34
+ }
35
+ switch (type) {
36
+ case "path":
37
+ serializePathParameter(field, value, result.path);
38
+ break;
39
+ case "query":
40
+ serializeQueryParameter(field, value, result.query);
41
+ break;
42
+ case "header":
43
+ result.header[key] = { value: serializeSimple(value, field.explode ?? false) };
44
+ break;
45
+ case "cookie":
46
+ serializeCookieParameter(field, value, result.cookie);
47
+ break;
48
+ }
49
+ }
50
+ return result;
88
51
  }
89
52
  function getMediaEncoder(field, adapters) {
90
- if (!field.content)
91
- return;
92
- for (const k in field.content) {
93
- const adapter = resolveMediaAdapter(k, adapters);
94
- if (adapter) {
95
- return (v) => String(adapter.encode({ body: v }));
96
- }
97
- }
53
+ if (!field.content) return;
54
+ for (const k in field.content) {
55
+ const adapter = resolveMediaAdapter(k, adapters);
56
+ if (adapter) return (v) => String(adapter.encode({ body: v }));
57
+ }
98
58
  }
99
- function writeObject(parentKey, value, deep, output) {
100
- for (const k in value) {
101
- const prop = value[k];
102
- if (prop == null)
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
- }
59
+ function serializeSimple(value, explode) {
60
+ if (Array.isArray(value)) return value.join(",");
61
+ if (typeof value === "object") return explode ? Object.entries(value).map(([k, v]) => `${k}=${v}`).join(",") : Object.entries(value).flat().join(",");
62
+ return String(value);
113
63
  }
64
+ function serializePathParameter(field, value, output) {
65
+ const { explode = false, name } = field;
66
+ switch (field.style) {
67
+ case "label":
68
+ if (Array.isArray(value)) {
69
+ output[field.name] = { value: "." + value.join(explode ? "." : ",") };
70
+ break;
71
+ }
72
+ if (typeof value === "object") {
73
+ output[field.name] = { value: "." + (explode ? Object.entries(value).map(([k, v]) => `${k}=${v}`).join(".") : Object.entries(value).flat().join(",")) };
74
+ break;
75
+ }
76
+ output[field.name] = { value: `.${value}` };
77
+ break;
78
+ case "matrix": {
79
+ const specifier = `;${name}=`;
80
+ if (Array.isArray(value)) {
81
+ output[field.name] = { value: explode ? `${specifier}${value.join(",")}` : `${specifier}${value.join(specifier)}` };
82
+ break;
83
+ }
84
+ if (typeof value === "object") {
85
+ output[field.name] = { value: explode ? Object.entries(value).map(([k, v]) => `;${k}=${v}`).join("") : specifier + Object.entries(value).flat().join(",") };
86
+ break;
87
+ }
88
+ output[field.name] = { value: `${specifier}${value}` };
89
+ break;
90
+ }
91
+ default: output[field.name] = { value: serializeSimple(value, explode) };
92
+ }
93
+ }
94
+ function serializeQueryParameter(field, value, output) {
95
+ const { explode = true } = field;
96
+ switch (field.style) {
97
+ case "spaceDelimited": if (!explode && Array.isArray(value)) {
98
+ output[field.name] = { values: [value.join(" ")] };
99
+ break;
100
+ }
101
+ case "pipeDelimited": if (!explode && Array.isArray(value)) {
102
+ output[field.name] = { values: [value.join("|")] };
103
+ break;
104
+ }
105
+ case "deepObject": if (!Array.isArray(value) && typeof value === "object") {
106
+ for (const [k, v] of Object.entries(value)) output[`${field.name}[${k}]`] = { values: Array.isArray(v) ? v : [String(v)] };
107
+ break;
108
+ }
109
+ default:
110
+ if (Array.isArray(value)) {
111
+ output[field.name] = { values: explode ? value : [value.join(",")] };
112
+ break;
113
+ }
114
+ if (typeof value === "object" && explode) {
115
+ for (const [k, v] of Object.entries(value)) output[k] = { values: [String(v)] };
116
+ break;
117
+ }
118
+ if (typeof value === "object") {
119
+ output[field.name] = { values: [Object.entries(value).flat().join(",")] };
120
+ break;
121
+ }
122
+ output[field.name] = { values: [String(value)] };
123
+ }
124
+ }
125
+ function serializeCookieParameter(field, value, output) {
126
+ const { explode = true } = field;
127
+ if (Array.isArray(value)) output[field.name] = { value: explode ? value.map((v) => `${field.name}=${v}`).join("&") : value.join(",") };
128
+ else if (typeof value === "object" && explode) for (const [k, v] of Object.entries(value)) output[k] = { value: String(v) };
129
+ else if (typeof value === "object") output[field.name] = { value: Object.entries(value).flat().join(",") };
130
+ else output[field.name] = { value: String(value) };
131
+ }
132
+
133
+ //#endregion
134
+ export { encodeRequestData };
135
+ //# sourceMappingURL=encode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encode.js","names":["result: RequestData","field: NoReference<ParameterObject>"],"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: NoReference<ParameterObject> = parameters.find(\n (p) => p.name === key && p.in === type,\n ) ?? {\n name: key,\n in: type,\n };\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
- * Resolve a media adapter for a given media type.
4
- * Supports exact matches and pattern matching (e.g., +json suffix).
5
- *
6
- * @param mediaType - The media type to resolve (e.g., "application/json", "application/json-patch+json")
7
- * @param adapters - Record of media adapters
8
- * @returns The resolved adapter or undefined if not found
9
- */
10
- export function resolveMediaAdapter(mediaType, adapters) {
11
- // Normalize media type (remove parameters like charset)
12
- const normalized = mediaType.split(';', 2)[0].trim().toLowerCase();
13
- if (normalized in adapters) {
14
- return adapters[normalized];
15
- }
16
- const match = VariantMediaTypeRegex.exec(normalized);
17
- if (match?.groups) {
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
- * Check if a media type is supported by the given adapters.
26
- *
27
- * @param mediaType - The media type to check
28
- * @param adapters - Record of media adapters
29
- * @returns true if the media type is supported
30
- */
31
- export function isMediaTypeSupported(mediaType, adapters) {
32
- return resolveMediaAdapter(mediaType, adapters) !== undefined;
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
- // @ts-expect-error -- nothing
2
- import js2xml from 'xml-js/lib/js2xml';
1
+ import js2xml from "xml-js/lib/js2xml";
2
+
3
+ //#region src/requests/string-utils.ts
3
4
  /**
4
- * Convert input value to hardcoded string (with quotes)
5
- */
6
- export function inputToString(value, format = 'application/json') {
7
- if (typeof value === 'string')
8
- return value;
9
- if (format === 'application/json') {
10
- return JSON.stringify(value, null, 2);
11
- }
12
- if (format === 'application/x-ndjson') {
13
- return Array.isArray(value)
14
- ? value.map((v) => JSON.stringify(v)).join('\n')
15
- : JSON.stringify(value, null, 2);
16
- }
17
- if (format === 'application/x-www-form-urlencoded') {
18
- const params = new URLSearchParams();
19
- if (typeof value !== 'object')
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
- export function escapeString(str, delimit) {
30
- if (!delimit)
31
- return JSON.stringify(str);
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
- export function ident(code, tab = 1) {
35
- return code
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
- export function generatePythonObject(v, imports = new Set()) {
2
- if (v === null) {
3
- return 'None';
4
- }
5
- else if (typeof v === 'boolean') {
6
- return v ? 'True' : 'False';
7
- }
8
- else if (typeof v === 'string') {
9
- return JSON.stringify(v);
10
- }
11
- else if (typeof v === 'number') {
12
- return v.toString();
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"}
@@ -1,25 +1,29 @@
1
- import type { MediaAdapter } from '../requests/media/adapter.js';
2
- import type { EncodedParameter } from '../requests/media/encode.js';
3
- export type SampleGenerator<ServerContext = unknown> = (url: string, data: RequestData, context: {
4
- mediaAdapters: Record<string, MediaAdapter>;
5
- server: ServerContext;
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
- export interface RawRequestData {
8
- method: string;
9
- path: Record<string, unknown>;
10
- query: Record<string, unknown>;
11
- header: Record<string, unknown>;
12
- cookie: Record<string, unknown>;
13
- body?: unknown;
14
- bodyMediaType?: string;
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
- export interface RequestData {
17
- method: string;
18
- path: Record<string, EncodedParameter>;
19
- query: Record<string, EncodedParameter>;
20
- header: Record<string, EncodedParameter>;
21
- cookie: Record<string, EncodedParameter>;
22
- body?: unknown;
23
- bodyMediaType?: string;
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","sourceRoot":"","sources":["../../src/requests/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,MAAM,eAAe,CAAC,aAAa,GAAG,OAAO,IAAI,CACrD,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE;IACP,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC5C,MAAM,EAAE,aAAa,CAAC;CACvB,KACE,MAAM,CAAC;AAEZ,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IAEf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEhC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IAEf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IACzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAEzC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB"}
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"}
@@ -1,24 +1,61 @@
1
1
  'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { cn } from '../utils/cn.js';
4
- import { buttonVariants } from 'fumadocs-ui/components/ui/button';
5
- import { ApiClientModalProvider, useApiClientModal, } from '@scalar/api-client-react';
6
- import { MethodLabel } from '../ui/components/method-label.js';
7
- import { useTheme } from 'next-themes';
8
- import { useEffect, useState } from 'react';
9
- import '@scalar/api-client-react/style.css';
10
- export default function ScalarPlayground({ path, method, spec, }) {
11
- const { resolvedTheme } = useTheme();
12
- const [mounted, setMounted] = useState(false);
13
- useEffect(() => {
14
- setMounted(true);
15
- }, []);
16
- return (_jsxs("div", { 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), children: [_jsx(MethodLabel, { className: "text-xs", children: method }), _jsx("code", { className: "flex-1 overflow-auto text-nowrap text-[0.8125rem] text-fd-muted-foreground", children: path }), _jsx(ApiClientModalProvider, { configuration: {
17
- theme: 'moon',
18
- content: spec,
19
- }, children: _jsx(Trigger, { path: path, method: method }) })] }));
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
- const client = useApiClientModal();
23
- return (_jsx("button", { type: "submit", className: cn(buttonVariants({ color: 'primary', size: 'sm' }), 'px-3 py-1.5'), onClick: () => client?.open({ path, method: method }), children: "Test" }));
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"}