@scalar/snippetz 0.2.20 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/httpsnippet-lite/esm/targets/c/libcurl/client.d.ts.map +1 -1
  2. package/dist/httpsnippet-lite/esm/targets/c/libcurl/client.js +37 -8
  3. package/dist/httpsnippet-lite/esm/targets/c/libcurl/client.js.map +2 -2
  4. package/dist/httpsnippet-lite/esm/targets/go/native/client.d.ts.map +1 -1
  5. package/dist/httpsnippet-lite/esm/targets/go/native/client.js +76 -30
  6. package/dist/httpsnippet-lite/esm/targets/go/native/client.js.map +2 -2
  7. package/dist/httpsnippet-lite/esm/targets/java/okhttp/client.d.ts.map +1 -1
  8. package/dist/httpsnippet-lite/esm/targets/java/okhttp/client.js +25 -9
  9. package/dist/httpsnippet-lite/esm/targets/java/okhttp/client.js.map +2 -2
  10. package/dist/httpsnippet-lite/esm/targets/kotlin/okhttp/client.d.ts.map +1 -1
  11. package/dist/httpsnippet-lite/esm/targets/kotlin/okhttp/client.js +25 -9
  12. package/dist/httpsnippet-lite/esm/targets/kotlin/okhttp/client.js.map +2 -2
  13. package/dist/httpsnippet-lite/esm/targets/shell/httpie/client.d.ts.map +1 -1
  14. package/dist/httpsnippet-lite/esm/targets/shell/httpie/client.js +11 -0
  15. package/dist/httpsnippet-lite/esm/targets/shell/httpie/client.js.map +2 -2
  16. package/dist/plugins/c/libcurl/libcurl.test.js +19 -11
  17. package/dist/plugins/c/libcurl/libcurl.test.js.map +2 -2
  18. package/dist/plugins/go/native/native.test.js +35 -36
  19. package/dist/plugins/go/native/native.test.js.map +2 -2
  20. package/dist/plugins/java/okhttp/okhttp.test.js +164 -0
  21. package/dist/plugins/java/okhttp/okhttp.test.js.map +7 -0
  22. package/dist/plugins/js/axios/index.d.ts +1 -1
  23. package/dist/plugins/js/axios/index.d.ts.map +1 -1
  24. package/dist/plugins/js/axios/index.js +4 -1
  25. package/dist/plugins/js/axios/index.js.map +2 -2
  26. package/dist/plugins/js/fetch/fetch.d.ts.map +1 -1
  27. package/dist/plugins/js/fetch/fetch.js +30 -9
  28. package/dist/plugins/js/fetch/fetch.js.map +2 -2
  29. package/dist/plugins/js/fetch/fetch.test.js +103 -0
  30. package/dist/plugins/js/fetch/fetch.test.js.map +2 -2
  31. package/dist/plugins/js/fetch/index.d.ts +1 -1
  32. package/dist/plugins/js/fetch/index.d.ts.map +1 -1
  33. package/dist/plugins/js/fetch/index.js +4 -1
  34. package/dist/plugins/js/fetch/index.js.map +2 -2
  35. package/dist/plugins/js/ofetch/ofetch.d.ts.map +1 -1
  36. package/dist/plugins/js/ofetch/ofetch.js +1 -10
  37. package/dist/plugins/js/ofetch/ofetch.js.map +2 -2
  38. package/dist/plugins/js/ofetch/ofetch.test.js +7 -4
  39. package/dist/plugins/js/ofetch/ofetch.test.js.map +2 -2
  40. package/dist/plugins/kotlin/okhttp/okhttp.test.js +164 -0
  41. package/dist/plugins/kotlin/okhttp/okhttp.test.js.map +7 -0
  42. package/dist/plugins/node/fetch/fetch.d.ts.map +1 -1
  43. package/dist/plugins/node/fetch/fetch.js +37 -9
  44. package/dist/plugins/node/fetch/fetch.js.map +2 -2
  45. package/dist/plugins/node/fetch/fetch.test.js +89 -0
  46. package/dist/plugins/node/fetch/fetch.test.js.map +2 -2
  47. package/dist/plugins/node/ofetch/ofetch.d.ts.map +1 -1
  48. package/dist/plugins/node/ofetch/ofetch.js +1 -10
  49. package/dist/plugins/node/ofetch/ofetch.js.map +2 -2
  50. package/dist/plugins/node/ofetch/ofetch.test.js +7 -4
  51. package/dist/plugins/node/ofetch/ofetch.test.js.map +2 -2
  52. package/dist/plugins/node/undici/undici.d.ts.map +1 -1
  53. package/dist/plugins/node/undici/undici.js +4 -6
  54. package/dist/plugins/node/undici/undici.js.map +2 -2
  55. package/dist/plugins/python/requests/requests.d.ts.map +1 -1
  56. package/dist/plugins/python/requests/requests.js +4 -3
  57. package/dist/plugins/python/requests/requests.js.map +3 -3
  58. package/dist/plugins/python/requests/requests.test.js +31 -2
  59. package/dist/plugins/python/requests/requests.test.js.map +2 -2
  60. package/dist/plugins/shell/httpie/httpie.test.js +3 -3
  61. package/dist/plugins/shell/httpie/httpie.test.js.map +2 -2
  62. package/dist/utils/create-search-params.d.ts +4 -0
  63. package/dist/utils/create-search-params.d.ts.map +1 -0
  64. package/dist/utils/create-search-params.js +11 -0
  65. package/dist/utils/create-search-params.js.map +7 -0
  66. package/dist/utils/create-search-params.test.js +49 -0
  67. package/dist/utils/create-search-params.test.js.map +7 -0
  68. package/dist/utils/index.d.ts +0 -1
  69. package/dist/utils/index.d.ts.map +1 -1
  70. package/dist/utils/index.js +0 -1
  71. package/dist/utils/index.js.map +2 -2
  72. package/dist/utils/objectToString.d.ts +8 -0
  73. package/dist/utils/objectToString.d.ts.map +1 -1
  74. package/dist/utils/objectToString.js +20 -15
  75. package/dist/utils/objectToString.js.map +2 -2
  76. package/package.json +5 -5
  77. package/dist/utils/arrayToObject.d.ts +0 -8
  78. package/dist/utils/arrayToObject.d.ts.map +0 -1
  79. package/dist/utils/arrayToObject.js +0 -10
  80. package/dist/utils/arrayToObject.js.map +0 -7
@@ -42,6 +42,7 @@ describe("jsFetch", () => {
42
42
  it("has JSON body", () => {
43
43
  const result = jsFetch.generate({
44
44
  url: "https://example.com",
45
+ method: "POST",
45
46
  headers: [
46
47
  {
47
48
  name: "Content-Type",
@@ -56,12 +57,36 @@ describe("jsFetch", () => {
56
57
  }
57
58
  });
58
59
  expect(result).toBe(`fetch('https://example.com', {
60
+ method: 'POST',
59
61
  headers: {
60
62
  'Content-Type': 'application/json'
61
63
  },
62
64
  body: JSON.stringify({
63
65
  hello: 'world'
64
66
  })
67
+ })`);
68
+ });
69
+ it("has raw body", () => {
70
+ const result = jsFetch.generate({
71
+ url: "https://example.com",
72
+ method: "POST",
73
+ headers: [
74
+ {
75
+ name: "Content-Type",
76
+ value: "application/octet-stream"
77
+ }
78
+ ],
79
+ postData: {
80
+ mimeType: "application/octet-stream",
81
+ text: "hello world"
82
+ }
83
+ });
84
+ expect(result).toBe(`fetch('https://example.com', {
85
+ method: 'POST',
86
+ headers: {
87
+ 'Content-Type': 'application/octet-stream'
88
+ },
89
+ body: 'hello world'
65
90
  })`);
66
91
  });
67
92
  it("has query string", () => {
@@ -80,6 +105,22 @@ describe("jsFetch", () => {
80
105
  });
81
106
  expect(result).toBe(`fetch('https://example.com?foo=bar&bar=foo')`);
82
107
  });
108
+ it("has query string with array values", () => {
109
+ const result = jsFetch.generate({
110
+ url: "https://example.com",
111
+ queryString: [
112
+ {
113
+ name: "foo",
114
+ value: "bar"
115
+ },
116
+ {
117
+ name: "foo",
118
+ value: "baz"
119
+ }
120
+ ]
121
+ });
122
+ expect(result).toBe(`fetch('https://example.com?foo=bar&foo=baz')`);
123
+ });
83
124
  it("has cookies", () => {
84
125
  const result = jsFetch.generate({
85
126
  url: "https://example.com",
@@ -107,5 +148,67 @@ describe("jsFetch", () => {
107
148
  });
108
149
  expect(result).toBe(`fetch('https://example.com')`);
109
150
  });
151
+ it("has urlencoded body", () => {
152
+ const result = jsFetch.generate({
153
+ url: "https://example.com",
154
+ method: "POST",
155
+ headers: [
156
+ {
157
+ name: "Content-Type",
158
+ value: "application/x-www-form-urlencoded"
159
+ }
160
+ ],
161
+ postData: {
162
+ mimeType: "application/x-www-form-urlencoded",
163
+ params: [
164
+ {
165
+ name: "foo",
166
+ value: "bar"
167
+ },
168
+ {
169
+ name: "baz",
170
+ value: "foo"
171
+ }
172
+ ]
173
+ }
174
+ });
175
+ expect(result).toBe(`fetch('https://example.com', {
176
+ method: 'POST',
177
+ headers: {
178
+ 'Content-Type': 'application/x-www-form-urlencoded'
179
+ },
180
+ body: new URLSearchParams({
181
+ foo: 'bar',
182
+ baz: 'foo'
183
+ })
184
+ })`);
185
+ });
186
+ it("has multipart body", () => {
187
+ const result = jsFetch.generate({
188
+ url: "https://example.com",
189
+ method: "POST",
190
+ postData: {
191
+ mimeType: "multipart/form-data",
192
+ params: [
193
+ {
194
+ name: "foo",
195
+ value: "bar"
196
+ },
197
+ {
198
+ name: "file",
199
+ fileName: "baz.txt"
200
+ }
201
+ ]
202
+ }
203
+ });
204
+ expect(result).toBe(`const formData = new FormData()
205
+ formData.append('foo', 'bar')
206
+ formData.append('file', new Blob([]), 'baz.txt')
207
+
208
+ fetch('https://example.com', {
209
+ method: 'POST',
210
+ body: formData
211
+ })`);
212
+ });
110
213
  });
111
214
  //# sourceMappingURL=fetch.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/plugins/js/fetch/fetch.test.ts"],
4
- "sourcesContent": ["import { describe, expect, it } from 'vitest'\n\nimport { jsFetch } from './fetch'\n\ndescribe('jsFetch', () => {\n it('returns a basic request', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n })\n\n expect(result).toBe(`fetch('https://example.com')`)\n })\n\n it('returns a POST request', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n method: 'post',\n })\n\n expect(result).toBe(`fetch('https://example.com', {\n method: 'POST'\n})`)\n })\n\n it('has headers', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n headers: [\n {\n name: 'Content-Type',\n value: 'application/json',\n },\n ],\n })\n\n expect(result).toBe(`fetch('https://example.com', {\n headers: {\n 'Content-Type': 'application/json'\n }\n})`)\n })\n\n it('doesn\u2019t add empty headers', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n headers: [],\n })\n\n expect(result).toBe(`fetch('https://example.com')`)\n })\n\n it('has JSON body', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n headers: [\n {\n name: 'Content-Type',\n value: 'application/json',\n },\n ],\n postData: {\n mimeType: 'application/json',\n text: JSON.stringify({\n hello: 'world',\n }),\n },\n })\n\n expect(result).toBe(`fetch('https://example.com', {\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n hello: 'world'\n })\n})`)\n })\n\n it('has query string', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n queryString: [\n {\n name: 'foo',\n value: 'bar',\n },\n {\n name: 'bar',\n value: 'foo',\n },\n ],\n })\n\n expect(result).toBe(`fetch('https://example.com?foo=bar&bar=foo')`)\n })\n\n it('has cookies', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n cookies: [\n {\n name: 'foo',\n value: 'bar',\n },\n {\n name: 'bar',\n value: 'foo',\n },\n ],\n })\n\n expect(result).toBe(`fetch('https://example.com', {\n headers: {\n 'Set-Cookie': 'foo=bar; bar=foo'\n }\n})`)\n })\n\n it('doesn\u2019t add empty cookies', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n cookies: [],\n })\n\n expect(result).toBe(`fetch('https://example.com')`)\n })\n})\n"],
5
- "mappings": "AAAA,SAAS,UAAU,QAAQ,UAAU;AAErC,SAAS,eAAe;AAExB,SAAS,WAAW,MAAM;AACxB,KAAG,2BAA2B,MAAM;AAClC,UAAM,SAAS,QAAQ,SAAS;AAAA,MAC9B,KAAK;AAAA,IACP,CAAC;AAED,WAAO,MAAM,EAAE,KAAK,8BAA8B;AAAA,EACpD,CAAC;AAED,KAAG,0BAA0B,MAAM;AACjC,UAAM,SAAS,QAAQ,SAAS;AAAA,MAC9B,KAAK;AAAA,MACL,QAAQ;AAAA,IACV,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA,GAErB;AAAA,EACD,CAAC;AAED,KAAG,eAAe,MAAM;AACtB,UAAM,SAAS,QAAQ,SAAS;AAAA,MAC9B,KAAK;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA,GAIrB;AAAA,EACD,CAAC;AAED,KAAG,kCAA6B,MAAM;AACpC,UAAM,SAAS,QAAQ,SAAS;AAAA,MAC9B,KAAK;AAAA,MACL,SAAS,CAAC;AAAA,IACZ,CAAC;AAED,WAAO,MAAM,EAAE,KAAK,8BAA8B;AAAA,EACpD,CAAC;AAED,KAAG,iBAAiB,MAAM;AACxB,UAAM,SAAS,QAAQ,SAAS;AAAA,MAC9B,KAAK;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,UAAU;AAAA,QACR,UAAU;AAAA,QACV,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOrB;AAAA,EACD,CAAC;AAED,KAAG,oBAAoB,MAAM;AAC3B,UAAM,SAAS,QAAQ,SAAS;AAAA,MAC9B,KAAK;AAAA,MACL,aAAa;AAAA,QACX;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,MAAM,EAAE,KAAK,8CAA8C;AAAA,EACpE,CAAC;AAED,KAAG,eAAe,MAAM;AACtB,UAAM,SAAS,QAAQ,SAAS;AAAA,MAC9B,KAAK;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA,GAIrB;AAAA,EACD,CAAC;AAED,KAAG,kCAA6B,MAAM;AACpC,UAAM,SAAS,QAAQ,SAAS;AAAA,MAC9B,KAAK;AAAA,MACL,SAAS,CAAC;AAAA,IACZ,CAAC;AAED,WAAO,MAAM,EAAE,KAAK,8BAA8B;AAAA,EACpD,CAAC;AACH,CAAC;",
4
+ "sourcesContent": ["import { describe, expect, it } from 'vitest'\n\nimport { jsFetch } from './fetch'\n\ndescribe('jsFetch', () => {\n it('returns a basic request', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n })\n\n expect(result).toBe(`fetch('https://example.com')`)\n })\n\n it('returns a POST request', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n method: 'post',\n })\n\n expect(result).toBe(`fetch('https://example.com', {\n method: 'POST'\n})`)\n })\n\n it('has headers', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n headers: [\n {\n name: 'Content-Type',\n value: 'application/json',\n },\n ],\n })\n\n expect(result).toBe(`fetch('https://example.com', {\n headers: {\n 'Content-Type': 'application/json'\n }\n})`)\n })\n\n it('doesn\u2019t add empty headers', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n headers: [],\n })\n\n expect(result).toBe(`fetch('https://example.com')`)\n })\n\n it('has JSON body', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n method: 'POST',\n headers: [\n {\n name: 'Content-Type',\n value: 'application/json',\n },\n ],\n postData: {\n mimeType: 'application/json',\n text: JSON.stringify({\n hello: 'world',\n }),\n },\n })\n\n expect(result).toBe(`fetch('https://example.com', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n hello: 'world'\n })\n})`)\n })\n\n it('has raw body', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n method: 'POST',\n headers: [\n {\n name: 'Content-Type',\n value: 'application/octet-stream',\n },\n ],\n postData: {\n mimeType: 'application/octet-stream',\n text: 'hello world',\n },\n })\n\n expect(result).toBe(`fetch('https://example.com', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/octet-stream'\n },\n body: 'hello world'\n})`)\n })\n\n it('has query string', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n queryString: [\n {\n name: 'foo',\n value: 'bar',\n },\n {\n name: 'bar',\n value: 'foo',\n },\n ],\n })\n\n expect(result).toBe(`fetch('https://example.com?foo=bar&bar=foo')`)\n })\n\n it('has query string with array values', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n queryString: [\n {\n name: 'foo',\n value: 'bar',\n },\n {\n name: 'foo',\n value: 'baz',\n },\n ],\n })\n\n expect(result).toBe(`fetch('https://example.com?foo=bar&foo=baz')`)\n })\n\n it('has cookies', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n cookies: [\n {\n name: 'foo',\n value: 'bar',\n },\n {\n name: 'bar',\n value: 'foo',\n },\n ],\n })\n\n expect(result).toBe(`fetch('https://example.com', {\n headers: {\n 'Set-Cookie': 'foo=bar; bar=foo'\n }\n})`)\n })\n\n it('doesn\u2019t add empty cookies', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n cookies: [],\n })\n\n expect(result).toBe(`fetch('https://example.com')`)\n })\n\n it('has urlencoded body', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n method: 'POST',\n headers: [\n {\n name: 'Content-Type',\n value: 'application/x-www-form-urlencoded',\n },\n ],\n postData: {\n mimeType: 'application/x-www-form-urlencoded',\n params: [\n {\n name: 'foo',\n value: 'bar',\n },\n {\n name: 'baz',\n value: 'foo',\n },\n ],\n },\n })\n\n expect(result).toBe(`fetch('https://example.com', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded'\n },\n body: new URLSearchParams({\n foo: 'bar',\n baz: 'foo'\n })\n})`)\n })\n\n it('has multipart body', () => {\n const result = jsFetch.generate({\n url: 'https://example.com',\n method: 'POST',\n postData: {\n mimeType: 'multipart/form-data',\n params: [\n {\n name: 'foo',\n value: 'bar',\n },\n {\n name: 'file',\n fileName: 'baz.txt',\n },\n ],\n },\n })\n\n expect(result).toBe(`const formData = new FormData()\nformData.append('foo', 'bar')\nformData.append('file', new Blob([]), 'baz.txt')\n\nfetch('https://example.com', {\n method: 'POST',\n body: formData\n})`)\n })\n})\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- export * from './fetch.js';
1
+ export { jsFetch } from './fetch.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/js/fetch/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/plugins/js/fetch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA"}
@@ -1,2 +1,5 @@
1
- export * from "./fetch.js";
1
+ import { jsFetch } from "./fetch.js";
2
+ export {
3
+ jsFetch
4
+ };
2
5
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/plugins/js/fetch/index.ts"],
4
- "sourcesContent": ["export * from './fetch'\n"],
5
- "mappings": "AAAA,cAAc;",
4
+ "sourcesContent": ["export { jsFetch } from './fetch'\n"],
5
+ "mappings": "AAAA,SAAS,eAAe;",
6
6
  "names": []
7
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ofetch.d.ts","sourceRoot":"","sources":["../../../../src/plugins/js/ofetch/ofetch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAEpD;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,MA6EtB,CAAA"}
1
+ {"version":3,"file":"ofetch.d.ts","sourceRoot":"","sources":["../../../../src/plugins/js/ofetch/ofetch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAEpD;;GAEG;AACH,eAAO,MAAM,QAAQ,EAAE,MAoEtB,CAAA"}
@@ -1,4 +1,3 @@
1
- import { arrayToObject } from "../../../utils/arrayToObject.js";
2
1
  import { objectToString } from "../../../utils/objectToString.js";
3
2
  const jsOfetch = {
4
3
  target: "js",
@@ -13,15 +12,7 @@ const jsOfetch = {
13
12
  const options = {
14
13
  method: normalizedRequest.method === "GET" ? void 0 : normalizedRequest.method
15
14
  };
16
- const searchParams = new URLSearchParams(
17
- normalizedRequest.queryString ? arrayToObject(normalizedRequest.queryString) : void 0
18
- );
19
- if (searchParams.size) {
20
- options.query = {};
21
- searchParams.forEach((value, key) => {
22
- options.query[key] = value;
23
- });
24
- }
15
+ options.query = normalizedRequest.queryString;
25
16
  if (normalizedRequest.headers?.length) {
26
17
  options.headers = {};
27
18
  normalizedRequest.headers.forEach((header) => {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/plugins/js/ofetch/ofetch.ts"],
4
- "sourcesContent": ["import { arrayToObject } from '@/utils/arrayToObject'\nimport { objectToString } from '@/utils/objectToString'\nimport type { Plugin } from '@scalar/types/snippetz'\n\n/**\n * js/ofetch\n */\nexport const jsOfetch: Plugin = {\n target: 'js',\n client: 'ofetch',\n title: 'ofetch',\n generate(request) {\n // Defaults\n const normalizedRequest = {\n method: 'GET',\n ...request,\n }\n\n // Normalization\n normalizedRequest.method = normalizedRequest.method.toUpperCase()\n\n // Reset fetch defaults\n const options: Record<string, any> = {\n method: normalizedRequest.method === 'GET' ? undefined : normalizedRequest.method,\n }\n\n // Query\n const searchParams = new URLSearchParams(\n normalizedRequest.queryString ? arrayToObject(normalizedRequest.queryString) : undefined,\n )\n\n if (searchParams.size) {\n options.query = {}\n searchParams.forEach((value, key) => {\n options.query[key] = value\n })\n }\n\n // Headers\n if (normalizedRequest.headers?.length) {\n options.headers = {}\n\n normalizedRequest.headers.forEach((header) => {\n options.headers![header.name] = header.value\n })\n }\n\n // Cookies\n if (normalizedRequest.cookies?.length) {\n options.headers = options.headers || {}\n\n normalizedRequest.cookies.forEach((cookie) => {\n options.headers!['Set-Cookie'] = options.headers!['Set-Cookie']\n ? `${options.headers!['Set-Cookie']}; ${cookie.name}=${cookie.value}`\n : `${cookie.name}=${cookie.value}`\n })\n }\n\n // Remove undefined keys\n Object.keys(options).forEach((key) => {\n if (options[key] === undefined) {\n delete options[key]\n }\n })\n\n // Add body\n if (normalizedRequest.postData) {\n // Plain text\n options.body = normalizedRequest.postData.text\n\n // JSON\n if (normalizedRequest.postData.mimeType === 'application/json') {\n options.body = JSON.parse(options.body)\n }\n }\n\n // Transform to JSON\n const jsonOptions = Object.keys(options).length ? `, ${objectToString(options)}` : ''\n\n // Code Template\n return `import { ofetch } from 'ofetch'\n\nofetch('${normalizedRequest.url}'${jsonOptions})`\n },\n}\n"],
5
- "mappings": "AAAA,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAMxB,MAAM,WAAmB;AAAA,EAC9B,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS,SAAS;AAEhB,UAAM,oBAAoB;AAAA,MACxB,QAAQ;AAAA,MACR,GAAG;AAAA,IACL;AAGA,sBAAkB,SAAS,kBAAkB,OAAO,YAAY;AAGhE,UAAM,UAA+B;AAAA,MACnC,QAAQ,kBAAkB,WAAW,QAAQ,SAAY,kBAAkB;AAAA,IAC7E;AAGA,UAAM,eAAe,IAAI;AAAA,MACvB,kBAAkB,cAAc,cAAc,kBAAkB,WAAW,IAAI;AAAA,IACjF;AAEA,QAAI,aAAa,MAAM;AACrB,cAAQ,QAAQ,CAAC;AACjB,mBAAa,QAAQ,CAAC,OAAO,QAAQ;AACnC,gBAAQ,MAAM,GAAG,IAAI;AAAA,MACvB,CAAC;AAAA,IACH;AAGA,QAAI,kBAAkB,SAAS,QAAQ;AACrC,cAAQ,UAAU,CAAC;AAEnB,wBAAkB,QAAQ,QAAQ,CAAC,WAAW;AAC5C,gBAAQ,QAAS,OAAO,IAAI,IAAI,OAAO;AAAA,MACzC,CAAC;AAAA,IACH;AAGA,QAAI,kBAAkB,SAAS,QAAQ;AACrC,cAAQ,UAAU,QAAQ,WAAW,CAAC;AAEtC,wBAAkB,QAAQ,QAAQ,CAAC,WAAW;AAC5C,gBAAQ,QAAS,YAAY,IAAI,QAAQ,QAAS,YAAY,IAC1D,GAAG,QAAQ,QAAS,YAAY,CAAC,KAAK,OAAO,IAAI,IAAI,OAAO,KAAK,KACjE,GAAG,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,MACpC,CAAC;AAAA,IACH;AAGA,WAAO,KAAK,OAAO,EAAE,QAAQ,CAAC,QAAQ;AACpC,UAAI,QAAQ,GAAG,MAAM,QAAW;AAC9B,eAAO,QAAQ,GAAG;AAAA,MACpB;AAAA,IACF,CAAC;AAGD,QAAI,kBAAkB,UAAU;AAE9B,cAAQ,OAAO,kBAAkB,SAAS;AAG1C,UAAI,kBAAkB,SAAS,aAAa,oBAAoB;AAC9D,gBAAQ,OAAO,KAAK,MAAM,QAAQ,IAAI;AAAA,MACxC;AAAA,IACF;AAGA,UAAM,cAAc,OAAO,KAAK,OAAO,EAAE,SAAS,KAAK,eAAe,OAAO,CAAC,KAAK;AAGnF,WAAO;AAAA;AAAA,UAED,kBAAkB,GAAG,IAAI,WAAW;AAAA,EAC5C;AACF;",
4
+ "sourcesContent": ["import { objectToString } from '@/utils/objectToString'\nimport type { Plugin } from '@scalar/types/snippetz'\n\n/**\n * js/ofetch\n */\nexport const jsOfetch: Plugin = {\n target: 'js',\n client: 'ofetch',\n title: 'ofetch',\n generate(request) {\n // Defaults\n const normalizedRequest = {\n method: 'GET',\n ...request,\n }\n\n // Normalization\n normalizedRequest.method = normalizedRequest.method.toUpperCase()\n\n // Reset fetch defaults\n const options: Record<string, any> = {\n method: normalizedRequest.method === 'GET' ? undefined : normalizedRequest.method,\n }\n\n // Query\n options.query = normalizedRequest.queryString\n\n // Headers\n if (normalizedRequest.headers?.length) {\n options.headers = {}\n\n normalizedRequest.headers.forEach((header) => {\n options.headers![header.name] = header.value\n })\n }\n\n // Cookies\n if (normalizedRequest.cookies?.length) {\n options.headers = options.headers || {}\n\n normalizedRequest.cookies.forEach((cookie) => {\n options.headers!['Set-Cookie'] = options.headers!['Set-Cookie']\n ? `${options.headers!['Set-Cookie']}; ${cookie.name}=${cookie.value}`\n : `${cookie.name}=${cookie.value}`\n })\n }\n\n // Remove undefined keys\n Object.keys(options).forEach((key) => {\n if (options[key] === undefined) {\n delete options[key]\n }\n })\n\n // Add body\n if (normalizedRequest.postData) {\n // Plain text\n options.body = normalizedRequest.postData.text\n\n // JSON\n if (normalizedRequest.postData.mimeType === 'application/json') {\n options.body = JSON.parse(options.body)\n }\n }\n\n // Transform to JSON\n const jsonOptions = Object.keys(options).length ? `, ${objectToString(options)}` : ''\n\n // Code Template\n return `import { ofetch } from 'ofetch'\n\nofetch('${normalizedRequest.url}'${jsonOptions})`\n },\n}\n"],
5
+ "mappings": "AAAA,SAAS,sBAAsB;AAMxB,MAAM,WAAmB;AAAA,EAC9B,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS,SAAS;AAEhB,UAAM,oBAAoB;AAAA,MACxB,QAAQ;AAAA,MACR,GAAG;AAAA,IACL;AAGA,sBAAkB,SAAS,kBAAkB,OAAO,YAAY;AAGhE,UAAM,UAA+B;AAAA,MACnC,QAAQ,kBAAkB,WAAW,QAAQ,SAAY,kBAAkB;AAAA,IAC7E;AAGA,YAAQ,QAAQ,kBAAkB;AAGlC,QAAI,kBAAkB,SAAS,QAAQ;AACrC,cAAQ,UAAU,CAAC;AAEnB,wBAAkB,QAAQ,QAAQ,CAAC,WAAW;AAC5C,gBAAQ,QAAS,OAAO,IAAI,IAAI,OAAO;AAAA,MACzC,CAAC;AAAA,IACH;AAGA,QAAI,kBAAkB,SAAS,QAAQ;AACrC,cAAQ,UAAU,QAAQ,WAAW,CAAC;AAEtC,wBAAkB,QAAQ,QAAQ,CAAC,WAAW;AAC5C,gBAAQ,QAAS,YAAY,IAAI,QAAQ,QAAS,YAAY,IAC1D,GAAG,QAAQ,QAAS,YAAY,CAAC,KAAK,OAAO,IAAI,IAAI,OAAO,KAAK,KACjE,GAAG,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,MACpC,CAAC;AAAA,IACH;AAGA,WAAO,KAAK,OAAO,EAAE,QAAQ,CAAC,QAAQ;AACpC,UAAI,QAAQ,GAAG,MAAM,QAAW;AAC9B,eAAO,QAAQ,GAAG;AAAA,MACpB;AAAA,IACF,CAAC;AAGD,QAAI,kBAAkB,UAAU;AAE9B,cAAQ,OAAO,kBAAkB,SAAS;AAG1C,UAAI,kBAAkB,SAAS,aAAa,oBAAoB;AAC9D,gBAAQ,OAAO,KAAK,MAAM,QAAQ,IAAI;AAAA,MACxC;AAAA,IACF;AAGA,UAAM,cAAc,OAAO,KAAK,OAAO,EAAE,SAAS,KAAK,eAAe,OAAO,CAAC,KAAK;AAGnF,WAAO;AAAA;AAAA,UAED,kBAAkB,GAAG,IAAI,WAAW;AAAA,EAC5C;AACF;",
6
6
  "names": []
7
7
  }
@@ -82,10 +82,13 @@ ofetch('https://example.com', {
82
82
  expect(result).toBe(`import { ofetch } from 'ofetch'
83
83
 
84
84
  ofetch('https://example.com', {
85
- query: {
86
- foo: 'bar',
87
- bar: 'foo'
88
- }
85
+ query: [{
86
+ name: 'foo',
87
+ value: 'bar'
88
+ }, {
89
+ name: 'bar',
90
+ value: 'foo'
91
+ }]
89
92
  })`);
90
93
  });
91
94
  it("has cookies", () => {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/plugins/js/ofetch/ofetch.test.ts"],
4
- "sourcesContent": ["import { describe, expect, it } from 'vitest'\n\nimport { jsOfetch } from './ofetch'\n\ndescribe('jsOfetch', () => {\n it('returns a basic request', () => {\n const result = jsOfetch.generate({\n url: 'https://example.com',\n })\n\n expect(result).toBe(`import { ofetch } from 'ofetch'\n\nofetch('https://example.com')`)\n })\n\n it('returns a POST request', () => {\n const result = jsOfetch.generate({\n url: 'https://example.com',\n method: 'post',\n })\n\n expect(result).toBe(`import { ofetch } from 'ofetch'\n\nofetch('https://example.com', {\n method: 'POST'\n})`)\n })\n\n it('has headers', () => {\n const result = jsOfetch.generate({\n url: 'https://example.com',\n headers: [\n {\n name: 'Content-Type',\n value: 'application/json',\n },\n ],\n })\n\n expect(result).toBe(`import { ofetch } from 'ofetch'\n\nofetch('https://example.com', {\n headers: {\n 'Content-Type': 'application/json'\n }\n})`)\n })\n\n it('doesn\u2019t add empty headers', () => {\n const result = jsOfetch.generate({\n url: 'https://example.com',\n headers: [],\n })\n\n expect(result).toBe(`import { ofetch } from 'ofetch'\n\nofetch('https://example.com')`)\n })\n\n it('has JSON body', () => {\n const result = jsOfetch.generate({\n url: 'https://example.com',\n postData: {\n mimeType: 'application/json',\n text: JSON.stringify({\n hello: 'world',\n }),\n },\n })\n\n expect(result).toBe(`import { ofetch } from 'ofetch'\n\nofetch('https://example.com', {\n body: {\n hello: 'world'\n }\n})`)\n })\n\n it('has query string', () => {\n const result = jsOfetch.generate({\n url: 'https://example.com',\n queryString: [\n {\n name: 'foo',\n value: 'bar',\n },\n {\n name: 'bar',\n value: 'foo',\n },\n ],\n })\n\n expect(result).toBe(`import { ofetch } from 'ofetch'\n\nofetch('https://example.com', {\n query: {\n foo: 'bar',\n bar: 'foo'\n }\n})`)\n })\n\n it('has cookies', () => {\n const result = jsOfetch.generate({\n url: 'https://example.com',\n cookies: [\n {\n name: 'foo',\n value: 'bar',\n },\n {\n name: 'bar',\n value: 'foo',\n },\n ],\n })\n\n expect(result).toBe(`import { ofetch } from 'ofetch'\n\nofetch('https://example.com', {\n headers: {\n 'Set-Cookie': 'foo=bar; bar=foo'\n }\n})`)\n })\n\n it('doesn\u2019t add empty cookies', () => {\n const result = jsOfetch.generate({\n url: 'https://example.com',\n cookies: [],\n })\n\n expect(result).toBe(`import { ofetch } from 'ofetch'\n\nofetch('https://example.com')`)\n })\n})\n"],
5
- "mappings": "AAAA,SAAS,UAAU,QAAQ,UAAU;AAErC,SAAS,gBAAgB;AAEzB,SAAS,YAAY,MAAM;AACzB,KAAG,2BAA2B,MAAM;AAClC,UAAM,SAAS,SAAS,SAAS;AAAA,MAC/B,KAAK;AAAA,IACP,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA,8BAEM;AAAA,EAC5B,CAAC;AAED,KAAG,0BAA0B,MAAM;AACjC,UAAM,SAAS,SAAS,SAAS;AAAA,MAC/B,KAAK;AAAA,MACL,QAAQ;AAAA,IACV,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA,GAIrB;AAAA,EACD,CAAC;AAED,KAAG,eAAe,MAAM;AACtB,UAAM,SAAS,SAAS,SAAS;AAAA,MAC/B,KAAK;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMrB;AAAA,EACD,CAAC;AAED,KAAG,kCAA6B,MAAM;AACpC,UAAM,SAAS,SAAS,SAAS;AAAA,MAC/B,KAAK;AAAA,MACL,SAAS,CAAC;AAAA,IACZ,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA,8BAEM;AAAA,EAC5B,CAAC;AAED,KAAG,iBAAiB,MAAM;AACxB,UAAM,SAAS,SAAS,SAAS;AAAA,MAC/B,KAAK;AAAA,MACL,UAAU;AAAA,QACR,UAAU;AAAA,QACV,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMrB;AAAA,EACD,CAAC;AAED,KAAG,oBAAoB,MAAM;AAC3B,UAAM,SAAS,SAAS,SAAS;AAAA,MAC/B,KAAK;AAAA,MACL,aAAa;AAAA,QACX;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOrB;AAAA,EACD,CAAC;AAED,KAAG,eAAe,MAAM;AACtB,UAAM,SAAS,SAAS,SAAS;AAAA,MAC/B,KAAK;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMrB;AAAA,EACD,CAAC;AAED,KAAG,kCAA6B,MAAM;AACpC,UAAM,SAAS,SAAS,SAAS;AAAA,MAC/B,KAAK;AAAA,MACL,SAAS,CAAC;AAAA,IACZ,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA,8BAEM;AAAA,EAC5B,CAAC;AACH,CAAC;",
4
+ "sourcesContent": ["import { describe, expect, it } from 'vitest'\n\nimport { jsOfetch } from './ofetch'\n\ndescribe('jsOfetch', () => {\n it('returns a basic request', () => {\n const result = jsOfetch.generate({\n url: 'https://example.com',\n })\n\n expect(result).toBe(`import { ofetch } from 'ofetch'\n\nofetch('https://example.com')`)\n })\n\n it('returns a POST request', () => {\n const result = jsOfetch.generate({\n url: 'https://example.com',\n method: 'post',\n })\n\n expect(result).toBe(`import { ofetch } from 'ofetch'\n\nofetch('https://example.com', {\n method: 'POST'\n})`)\n })\n\n it('has headers', () => {\n const result = jsOfetch.generate({\n url: 'https://example.com',\n headers: [\n {\n name: 'Content-Type',\n value: 'application/json',\n },\n ],\n })\n\n expect(result).toBe(`import { ofetch } from 'ofetch'\n\nofetch('https://example.com', {\n headers: {\n 'Content-Type': 'application/json'\n }\n})`)\n })\n\n it('doesn\u2019t add empty headers', () => {\n const result = jsOfetch.generate({\n url: 'https://example.com',\n headers: [],\n })\n\n expect(result).toBe(`import { ofetch } from 'ofetch'\n\nofetch('https://example.com')`)\n })\n\n it('has JSON body', () => {\n const result = jsOfetch.generate({\n url: 'https://example.com',\n postData: {\n mimeType: 'application/json',\n text: JSON.stringify({\n hello: 'world',\n }),\n },\n })\n\n expect(result).toBe(`import { ofetch } from 'ofetch'\n\nofetch('https://example.com', {\n body: {\n hello: 'world'\n }\n})`)\n })\n\n it('has query string', () => {\n const result = jsOfetch.generate({\n url: 'https://example.com',\n queryString: [\n {\n name: 'foo',\n value: 'bar',\n },\n {\n name: 'bar',\n value: 'foo',\n },\n ],\n })\n\n expect(result).toBe(`import { ofetch } from 'ofetch'\n\nofetch('https://example.com', {\n query: [{\n name: 'foo',\n value: 'bar'\n }, {\n name: 'bar',\n value: 'foo'\n }]\n})`)\n })\n\n it('has cookies', () => {\n const result = jsOfetch.generate({\n url: 'https://example.com',\n cookies: [\n {\n name: 'foo',\n value: 'bar',\n },\n {\n name: 'bar',\n value: 'foo',\n },\n ],\n })\n\n expect(result).toBe(`import { ofetch } from 'ofetch'\n\nofetch('https://example.com', {\n headers: {\n 'Set-Cookie': 'foo=bar; bar=foo'\n }\n})`)\n })\n\n it('doesn\u2019t add empty cookies', () => {\n const result = jsOfetch.generate({\n url: 'https://example.com',\n cookies: [],\n })\n\n expect(result).toBe(`import { ofetch } from 'ofetch'\n\nofetch('https://example.com')`)\n })\n})\n"],
5
+ "mappings": "AAAA,SAAS,UAAU,QAAQ,UAAU;AAErC,SAAS,gBAAgB;AAEzB,SAAS,YAAY,MAAM;AACzB,KAAG,2BAA2B,MAAM;AAClC,UAAM,SAAS,SAAS,SAAS;AAAA,MAC/B,KAAK;AAAA,IACP,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA,8BAEM;AAAA,EAC5B,CAAC;AAED,KAAG,0BAA0B,MAAM;AACjC,UAAM,SAAS,SAAS,SAAS;AAAA,MAC/B,KAAK;AAAA,MACL,QAAQ;AAAA,IACV,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA,GAIrB;AAAA,EACD,CAAC;AAED,KAAG,eAAe,MAAM;AACtB,UAAM,SAAS,SAAS,SAAS;AAAA,MAC/B,KAAK;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMrB;AAAA,EACD,CAAC;AAED,KAAG,kCAA6B,MAAM;AACpC,UAAM,SAAS,SAAS,SAAS;AAAA,MAC/B,KAAK;AAAA,MACL,SAAS,CAAC;AAAA,IACZ,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA,8BAEM;AAAA,EAC5B,CAAC;AAED,KAAG,iBAAiB,MAAM;AACxB,UAAM,SAAS,SAAS,SAAS;AAAA,MAC/B,KAAK;AAAA,MACL,UAAU;AAAA,QACR,UAAU;AAAA,QACV,MAAM,KAAK,UAAU;AAAA,UACnB,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMrB;AAAA,EACD,CAAC;AAED,KAAG,oBAAoB,MAAM;AAC3B,UAAM,SAAS,SAAS,SAAS;AAAA,MAC/B,KAAK;AAAA,MACL,aAAa;AAAA,QACX;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAUrB;AAAA,EACD,CAAC;AAED,KAAG,eAAe,MAAM;AACtB,UAAM,SAAS,SAAS,SAAS;AAAA,MAC/B,KAAK;AAAA,MACL,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMrB;AAAA,EACD,CAAC;AAED,KAAG,kCAA6B,MAAM;AACpC,UAAM,SAAS,SAAS,SAAS;AAAA,MAC/B,KAAK;AAAA,MACL,SAAS,CAAC;AAAA,IACZ,CAAC;AAED,WAAO,MAAM,EAAE,KAAK;AAAA;AAAA,8BAEM;AAAA,EAC5B,CAAC;AACH,CAAC;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,164 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { kotlinOkhttp } from "./okhttp.js";
3
+ describe("kotlinOkhttp", () => {
4
+ it("returns a basic request", () => {
5
+ const result = kotlinOkhttp.generate({
6
+ url: "https://example.com"
7
+ });
8
+ expect(result).toBe(`val client = OkHttpClient()
9
+
10
+ val request = Request.Builder()
11
+ .url("https://example.com")
12
+ .get()
13
+ .build()
14
+
15
+ val response = client.newCall(request).execute()`);
16
+ });
17
+ it("returns a POST request", () => {
18
+ const result = kotlinOkhttp.generate({
19
+ url: "https://example.com",
20
+ method: "post"
21
+ });
22
+ expect(result).toBe(`val client = OkHttpClient()
23
+
24
+ val request = Request.Builder()
25
+ .url("https://example.com")
26
+ .post(null)
27
+ .build()
28
+
29
+ val response = client.newCall(request).execute()`);
30
+ });
31
+ it("has headers", () => {
32
+ const result = kotlinOkhttp.generate({
33
+ url: "https://example.com",
34
+ headers: [
35
+ {
36
+ name: "Content-Type",
37
+ value: "application/json"
38
+ }
39
+ ]
40
+ });
41
+ expect(result).toBe(`val client = OkHttpClient()
42
+
43
+ val request = Request.Builder()
44
+ .url("https://example.com")
45
+ .get()
46
+ .addHeader("Content-Type", "application/json")
47
+ .build()
48
+
49
+ val response = client.newCall(request).execute()`);
50
+ });
51
+ it("handles multipart form data with files", () => {
52
+ const result = kotlinOkhttp.generate({
53
+ url: "https://example.com",
54
+ method: "POST",
55
+ postData: {
56
+ mimeType: "multipart/form-data",
57
+ params: [
58
+ {
59
+ name: "file",
60
+ fileName: "test.txt"
61
+ },
62
+ {
63
+ name: "field",
64
+ value: "value"
65
+ }
66
+ ]
67
+ }
68
+ });
69
+ expect(result).toBe(`val client = OkHttpClient()
70
+
71
+ val body = MultipartBody.Builder()
72
+ .setType(MultipartBody.FORM)
73
+ .addFormDataPart("file", "test.txt", RequestBody.create(MediaType.parse("application/octet-stream"), File("test.txt")))
74
+ .addFormDataPart("field", "value")
75
+ .build()
76
+
77
+ val request = Request.Builder()
78
+ .url("https://example.com")
79
+ .post(body)
80
+ .build()
81
+
82
+ val response = client.newCall(request).execute()`);
83
+ });
84
+ it("handles binary data", () => {
85
+ const result = kotlinOkhttp.generate({
86
+ url: "https://example.com",
87
+ method: "POST",
88
+ postData: {
89
+ mimeType: "application/octet-stream",
90
+ text: "binary content"
91
+ }
92
+ });
93
+ expect(result).toBe(`val client = OkHttpClient()
94
+
95
+ val mediaType = MediaType.parse("application/octet-stream")
96
+ val body = RequestBody.create(mediaType, "binary content")
97
+ val request = Request.Builder()
98
+ .url("https://example.com")
99
+ .post(body)
100
+ .build()
101
+
102
+ val response = client.newCall(request).execute()`);
103
+ });
104
+ it("handles special characters in URL", () => {
105
+ const result = kotlinOkhttp.generate({
106
+ url: "https://example.com/path with spaces/[brackets]"
107
+ });
108
+ expect(result).toBe(`val client = OkHttpClient()
109
+
110
+ val request = Request.Builder()
111
+ .url("https://example.com/path%20with%20spaces/[brackets]")
112
+ .get()
113
+ .build()
114
+
115
+ val response = client.newCall(request).execute()`);
116
+ });
117
+ it("handles multiple headers with same name", () => {
118
+ const result = kotlinOkhttp.generate({
119
+ url: "https://example.com",
120
+ headers: [
121
+ { name: "X-Custom", value: "value1" },
122
+ { name: "X-Custom", value: "value2" }
123
+ ]
124
+ });
125
+ expect(result).toBe(`val client = OkHttpClient()
126
+
127
+ val request = Request.Builder()
128
+ .url("https://example.com")
129
+ .get()
130
+ .addHeader("X-Custom", "value2")
131
+ .build()
132
+
133
+ val response = client.newCall(request).execute()`);
134
+ });
135
+ it("handles headers with empty values", () => {
136
+ const result = kotlinOkhttp.generate({
137
+ url: "https://example.com",
138
+ headers: [{ name: "X-Empty", value: "" }]
139
+ });
140
+ expect(result).toBe(`val client = OkHttpClient()
141
+
142
+ val request = Request.Builder()
143
+ .url("https://example.com")
144
+ .get()
145
+ .addHeader("X-Empty", "")
146
+ .build()
147
+
148
+ val response = client.newCall(request).execute()`);
149
+ });
150
+ it("handles query string parameters", () => {
151
+ const result = kotlinOkhttp.generate({
152
+ url: "https://example.com/api?param1=value1&param2=special value&param3=123"
153
+ });
154
+ expect(result).toBe(`val client = OkHttpClient()
155
+
156
+ val request = Request.Builder()
157
+ .url("https://example.com/api?param1=value1&param2=special%20value&param3=123")
158
+ .get()
159
+ .build()
160
+
161
+ val response = client.newCall(request).execute()`);
162
+ });
163
+ });
164
+ //# sourceMappingURL=okhttp.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/plugins/kotlin/okhttp/okhttp.test.ts"],
4
+ "sourcesContent": ["import { describe, expect, it } from 'vitest'\n\nimport { kotlinOkhttp } from './okhttp'\n\ndescribe('kotlinOkhttp', () => {\n it('returns a basic request', () => {\n const result = kotlinOkhttp.generate({\n url: 'https://example.com',\n })\n\n expect(result).toBe(`val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://example.com\")\n .get()\n .build()\n\nval response = client.newCall(request).execute()`)\n })\n\n it('returns a POST request', () => {\n const result = kotlinOkhttp.generate({\n url: 'https://example.com',\n method: 'post',\n })\n\n expect(result).toBe(`val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://example.com\")\n .post(null)\n .build()\n\nval response = client.newCall(request).execute()`)\n })\n\n it('has headers', () => {\n const result = kotlinOkhttp.generate({\n url: 'https://example.com',\n headers: [\n {\n name: 'Content-Type',\n value: 'application/json',\n },\n ],\n })\n expect(result).toBe(`val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://example.com\")\n .get()\n .addHeader(\"Content-Type\", \"application/json\")\n .build()\n\nval response = client.newCall(request).execute()`)\n })\n\n it('handles multipart form data with files', () => {\n const result = kotlinOkhttp.generate({\n url: 'https://example.com',\n method: 'POST',\n postData: {\n mimeType: 'multipart/form-data',\n params: [\n {\n name: 'file',\n fileName: 'test.txt',\n },\n {\n name: 'field',\n value: 'value',\n },\n ],\n },\n })\n\n expect(result).toBe(`val client = OkHttpClient()\n\nval body = MultipartBody.Builder()\n .setType(MultipartBody.FORM)\n .addFormDataPart(\"file\", \"test.txt\", RequestBody.create(MediaType.parse(\"application/octet-stream\"), File(\"test.txt\")))\n .addFormDataPart(\"field\", \"value\")\n .build()\n\nval request = Request.Builder()\n .url(\"https://example.com\")\n .post(body)\n .build()\n\nval response = client.newCall(request).execute()`)\n })\n\n it('handles binary data', () => {\n const result = kotlinOkhttp.generate({\n url: 'https://example.com',\n method: 'POST',\n postData: {\n mimeType: 'application/octet-stream',\n text: 'binary content',\n },\n })\n\n expect(result).toBe(`val client = OkHttpClient()\n\nval mediaType = MediaType.parse(\"application/octet-stream\")\nval body = RequestBody.create(mediaType, \"binary content\")\nval request = Request.Builder()\n .url(\"https://example.com\")\n .post(body)\n .build()\n\nval response = client.newCall(request).execute()`)\n })\n\n it('handles special characters in URL', () => {\n const result = kotlinOkhttp.generate({\n url: 'https://example.com/path with spaces/[brackets]',\n })\n\n expect(result).toBe(`val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://example.com/path%20with%20spaces/[brackets]\")\n .get()\n .build()\n\nval response = client.newCall(request).execute()`)\n })\n\n it('handles multiple headers with same name', () => {\n const result = kotlinOkhttp.generate({\n url: 'https://example.com',\n headers: [\n { name: 'X-Custom', value: 'value1' },\n { name: 'X-Custom', value: 'value2' },\n ],\n })\n\n expect(result).toBe(`val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://example.com\")\n .get()\n .addHeader(\"X-Custom\", \"value2\")\n .build()\n\nval response = client.newCall(request).execute()`)\n })\n\n it('handles headers with empty values', () => {\n const result = kotlinOkhttp.generate({\n url: 'https://example.com',\n headers: [{ name: 'X-Empty', value: '' }],\n })\n\n expect(result).toBe(`val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://example.com\")\n .get()\n .addHeader(\"X-Empty\", \"\")\n .build()\n\nval response = client.newCall(request).execute()`)\n })\n\n it('handles query string parameters', () => {\n const result = kotlinOkhttp.generate({\n url: 'https://example.com/api?param1=value1&param2=special value&param3=123',\n })\n\n expect(result).toBe(`val client = OkHttpClient()\n\nval request = Request.Builder()\n .url(\"https://example.com/api?param1=value1&param2=special%20value&param3=123\")\n .get()\n .build()\n\nval response = client.newCall(request).execute()`)\n })\n})\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../src/plugins/node/fetch/fetch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAEpD;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,MAqEvB,CAAA"}
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../../src/plugins/node/fetch/fetch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAEpD;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,MA4FvB,CAAA"}
@@ -1,5 +1,5 @@
1
- import { arrayToObject } from "../../../utils/arrayToObject.js";
2
- import { objectToString } from "../../../utils/objectToString.js";
1
+ import { createSearchParams } from "../../../utils/create-search-params.js";
2
+ import { objectToString, Unquoted } from "../../../utils/objectToString.js";
3
3
  const nodeFetch = {
4
4
  target: "node",
5
5
  client: "fetch",
@@ -9,13 +9,12 @@ const nodeFetch = {
9
9
  method: "GET",
10
10
  ...request
11
11
  };
12
+ let prefix = "";
12
13
  normalizedRequest.method = normalizedRequest.method.toUpperCase();
13
14
  const options = {
14
15
  method: normalizedRequest.method === "GET" ? void 0 : normalizedRequest.method
15
16
  };
16
- const searchParams = new URLSearchParams(
17
- normalizedRequest.queryString ? arrayToObject(normalizedRequest.queryString) : void 0
18
- );
17
+ const searchParams = createSearchParams(normalizedRequest.queryString);
19
18
  const queryString = searchParams.size ? `?${searchParams.toString()}` : "";
20
19
  if (normalizedRequest.headers?.length) {
21
20
  options.headers = {};
@@ -35,13 +34,42 @@ const nodeFetch = {
35
34
  }
36
35
  });
37
36
  if (normalizedRequest.postData) {
38
- options.body = normalizedRequest.postData.text;
39
- if (normalizedRequest.postData.mimeType === "application/json") {
40
- options.body = `JSON.stringify(${objectToString(JSON.parse(options.body))})`;
37
+ const { mimeType, text, params } = normalizedRequest.postData;
38
+ let hasFsImport = false;
39
+ if (mimeType === "application/json" && text) {
40
+ try {
41
+ options.body = new Unquoted(`JSON.stringify(${objectToString(JSON.parse(text))})`);
42
+ } catch (e) {
43
+ options.body = text;
44
+ }
45
+ } else if (mimeType === "multipart/form-data" && params) {
46
+ prefix = "const formData = new FormData()\n";
47
+ params.forEach((param) => {
48
+ if (param.fileName !== void 0) {
49
+ if (!hasFsImport) {
50
+ prefix = `import fs from 'node:fs'
51
+
52
+ ${prefix}`;
53
+ hasFsImport = true;
54
+ }
55
+ prefix += `formData.append('${param.name}', new Blob([fs.readFileSync('${param.fileName}')]), '${param.fileName}')
56
+ `;
57
+ } else if (param.value !== void 0) {
58
+ prefix += `formData.append('${param.name}', '${param.value}')
59
+ `;
60
+ }
61
+ });
62
+ prefix += "\n";
63
+ options.body = new Unquoted("formData");
64
+ } else if (mimeType === "application/x-www-form-urlencoded" && params) {
65
+ const form = Object.fromEntries(params.map((p) => [p.name, p.value]));
66
+ options.body = new Unquoted(`new URLSearchParams(${objectToString(form)})`);
67
+ } else {
68
+ options.body = normalizedRequest.postData.text;
41
69
  }
42
70
  }
43
71
  const jsonOptions = Object.keys(options).length ? `, ${objectToString(options)}` : "";
44
- return `fetch('${normalizedRequest.url}${queryString}'${jsonOptions})`;
72
+ return `${prefix}fetch('${normalizedRequest.url}${queryString}'${jsonOptions})`;
45
73
  }
46
74
  };
47
75
  export {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/plugins/node/fetch/fetch.ts"],
4
- "sourcesContent": ["import { arrayToObject } from '@/utils/arrayToObject'\nimport { objectToString } from '@/utils/objectToString'\nimport type { Plugin } from '@scalar/types/snippetz'\n\n/**\n * node/fetch\n */\nexport const nodeFetch: Plugin = {\n target: 'node',\n client: 'fetch',\n title: 'Fetch',\n generate(request) {\n // Defaults\n const normalizedRequest = {\n method: 'GET',\n ...request,\n }\n\n // Normalization\n normalizedRequest.method = normalizedRequest.method.toUpperCase()\n\n // Reset fetch defaults\n const options: Record<string, any> = {\n method: normalizedRequest.method === 'GET' ? undefined : normalizedRequest.method,\n }\n\n // Query\n const searchParams = new URLSearchParams(\n normalizedRequest.queryString ? arrayToObject(normalizedRequest.queryString) : undefined,\n )\n const queryString = searchParams.size ? `?${searchParams.toString()}` : ''\n\n // Headers\n if (normalizedRequest.headers?.length) {\n options.headers = {}\n\n normalizedRequest.headers.forEach((header) => {\n options.headers![header.name] = header.value\n })\n }\n\n // Cookies\n if (normalizedRequest.cookies?.length) {\n options.headers = options.headers || {}\n\n normalizedRequest.cookies.forEach((cookie) => {\n options.headers!['Set-Cookie'] = options.headers!['Set-Cookie']\n ? `${options.headers!['Set-Cookie']}; ${cookie.name}=${cookie.value}`\n : `${cookie.name}=${cookie.value}`\n })\n }\n\n // Remove undefined keys\n Object.keys(options).forEach((key) => {\n if (options[key] === undefined) {\n delete options[key]\n }\n })\n\n // Add body\n if (normalizedRequest.postData) {\n // Plain text\n options.body = normalizedRequest.postData.text\n\n // JSON\n if (normalizedRequest.postData.mimeType === 'application/json') {\n options.body = `JSON.stringify(${objectToString(JSON.parse(options.body))})`\n }\n }\n\n // Transform to JSON\n const jsonOptions = Object.keys(options).length ? `, ${objectToString(options)}` : ''\n\n // Code Template\n return `fetch('${normalizedRequest.url}${queryString}'${jsonOptions})`\n },\n}\n"],
5
- "mappings": "AAAA,SAAS,qBAAqB;AAC9B,SAAS,sBAAsB;AAMxB,MAAM,YAAoB;AAAA,EAC/B,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS,SAAS;AAEhB,UAAM,oBAAoB;AAAA,MACxB,QAAQ;AAAA,MACR,GAAG;AAAA,IACL;AAGA,sBAAkB,SAAS,kBAAkB,OAAO,YAAY;AAGhE,UAAM,UAA+B;AAAA,MACnC,QAAQ,kBAAkB,WAAW,QAAQ,SAAY,kBAAkB;AAAA,IAC7E;AAGA,UAAM,eAAe,IAAI;AAAA,MACvB,kBAAkB,cAAc,cAAc,kBAAkB,WAAW,IAAI;AAAA,IACjF;AACA,UAAM,cAAc,aAAa,OAAO,IAAI,aAAa,SAAS,CAAC,KAAK;AAGxE,QAAI,kBAAkB,SAAS,QAAQ;AACrC,cAAQ,UAAU,CAAC;AAEnB,wBAAkB,QAAQ,QAAQ,CAAC,WAAW;AAC5C,gBAAQ,QAAS,OAAO,IAAI,IAAI,OAAO;AAAA,MACzC,CAAC;AAAA,IACH;AAGA,QAAI,kBAAkB,SAAS,QAAQ;AACrC,cAAQ,UAAU,QAAQ,WAAW,CAAC;AAEtC,wBAAkB,QAAQ,QAAQ,CAAC,WAAW;AAC5C,gBAAQ,QAAS,YAAY,IAAI,QAAQ,QAAS,YAAY,IAC1D,GAAG,QAAQ,QAAS,YAAY,CAAC,KAAK,OAAO,IAAI,IAAI,OAAO,KAAK,KACjE,GAAG,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,MACpC,CAAC;AAAA,IACH;AAGA,WAAO,KAAK,OAAO,EAAE,QAAQ,CAAC,QAAQ;AACpC,UAAI,QAAQ,GAAG,MAAM,QAAW;AAC9B,eAAO,QAAQ,GAAG;AAAA,MACpB;AAAA,IACF,CAAC;AAGD,QAAI,kBAAkB,UAAU;AAE9B,cAAQ,OAAO,kBAAkB,SAAS;AAG1C,UAAI,kBAAkB,SAAS,aAAa,oBAAoB;AAC9D,gBAAQ,OAAO,kBAAkB,eAAe,KAAK,MAAM,QAAQ,IAAI,CAAC,CAAC;AAAA,MAC3E;AAAA,IACF;AAGA,UAAM,cAAc,OAAO,KAAK,OAAO,EAAE,SAAS,KAAK,eAAe,OAAO,CAAC,KAAK;AAGnF,WAAO,UAAU,kBAAkB,GAAG,GAAG,WAAW,IAAI,WAAW;AAAA,EACrE;AACF;",
4
+ "sourcesContent": ["import { createSearchParams } from '@/utils/create-search-params'\nimport { objectToString, Unquoted } from '@/utils/objectToString'\nimport type { Plugin } from '@scalar/types/snippetz'\n\n/**\n * node/fetch\n */\nexport const nodeFetch: Plugin = {\n target: 'node',\n client: 'fetch',\n title: 'Fetch',\n generate(request) {\n // Defaults\n const normalizedRequest = {\n method: 'GET',\n ...request,\n }\n\n let prefix = ''\n\n // Normalization\n normalizedRequest.method = normalizedRequest.method.toUpperCase()\n\n // Reset fetch defaults\n const options: Record<string, any> = {\n method: normalizedRequest.method === 'GET' ? undefined : normalizedRequest.method,\n }\n\n // Query\n const searchParams = createSearchParams(normalizedRequest.queryString)\n const queryString = searchParams.size ? `?${searchParams.toString()}` : ''\n\n // Headers\n if (normalizedRequest.headers?.length) {\n options.headers = {}\n\n normalizedRequest.headers.forEach((header) => {\n options.headers![header.name] = header.value\n })\n }\n\n // Cookies\n if (normalizedRequest.cookies?.length) {\n options.headers = options.headers || {}\n\n normalizedRequest.cookies.forEach((cookie) => {\n options.headers!['Set-Cookie'] = options.headers!['Set-Cookie']\n ? `${options.headers!['Set-Cookie']}; ${cookie.name}=${cookie.value}`\n : `${cookie.name}=${cookie.value}`\n })\n }\n\n // Remove undefined keys\n Object.keys(options).forEach((key) => {\n if (options[key] === undefined) {\n delete options[key]\n }\n })\n\n // Add body\n if (normalizedRequest.postData) {\n const { mimeType, text, params } = normalizedRequest.postData\n let hasFsImport = false\n\n if (mimeType === 'application/json' && text) {\n try {\n options.body = new Unquoted(`JSON.stringify(${objectToString(JSON.parse(text))})`)\n } catch (e) {\n options.body = text\n }\n } else if (mimeType === 'multipart/form-data' && params) {\n prefix = 'const formData = new FormData()\\n'\n params.forEach((param) => {\n if (param.fileName !== undefined) {\n if (!hasFsImport) {\n prefix = `import fs from 'node:fs'\\n\\n${prefix}`\n hasFsImport = true\n }\n prefix += `formData.append('${param.name}', new Blob([fs.readFileSync('${param.fileName}')]), '${param.fileName}')\\n`\n } else if (param.value !== undefined) {\n prefix += `formData.append('${param.name}', '${param.value}')\\n`\n }\n })\n prefix += '\\n'\n options.body = new Unquoted('formData')\n } else if (mimeType === 'application/x-www-form-urlencoded' && params) {\n const form = Object.fromEntries(params.map((p) => [p.name, p.value]))\n options.body = new Unquoted(`new URLSearchParams(${objectToString(form)})`)\n } else {\n options.body = normalizedRequest.postData.text\n }\n }\n\n // Transform to JSON\n const jsonOptions = Object.keys(options).length ? `, ${objectToString(options)}` : ''\n\n // Code Template\n return `${prefix}fetch('${normalizedRequest.url}${queryString}'${jsonOptions})`\n },\n}\n"],
5
+ "mappings": "AAAA,SAAS,0BAA0B;AACnC,SAAS,gBAAgB,gBAAgB;AAMlC,MAAM,YAAoB;AAAA,EAC/B,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS,SAAS;AAEhB,UAAM,oBAAoB;AAAA,MACxB,QAAQ;AAAA,MACR,GAAG;AAAA,IACL;AAEA,QAAI,SAAS;AAGb,sBAAkB,SAAS,kBAAkB,OAAO,YAAY;AAGhE,UAAM,UAA+B;AAAA,MACnC,QAAQ,kBAAkB,WAAW,QAAQ,SAAY,kBAAkB;AAAA,IAC7E;AAGA,UAAM,eAAe,mBAAmB,kBAAkB,WAAW;AACrE,UAAM,cAAc,aAAa,OAAO,IAAI,aAAa,SAAS,CAAC,KAAK;AAGxE,QAAI,kBAAkB,SAAS,QAAQ;AACrC,cAAQ,UAAU,CAAC;AAEnB,wBAAkB,QAAQ,QAAQ,CAAC,WAAW;AAC5C,gBAAQ,QAAS,OAAO,IAAI,IAAI,OAAO;AAAA,MACzC,CAAC;AAAA,IACH;AAGA,QAAI,kBAAkB,SAAS,QAAQ;AACrC,cAAQ,UAAU,QAAQ,WAAW,CAAC;AAEtC,wBAAkB,QAAQ,QAAQ,CAAC,WAAW;AAC5C,gBAAQ,QAAS,YAAY,IAAI,QAAQ,QAAS,YAAY,IAC1D,GAAG,QAAQ,QAAS,YAAY,CAAC,KAAK,OAAO,IAAI,IAAI,OAAO,KAAK,KACjE,GAAG,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,MACpC,CAAC;AAAA,IACH;AAGA,WAAO,KAAK,OAAO,EAAE,QAAQ,CAAC,QAAQ;AACpC,UAAI,QAAQ,GAAG,MAAM,QAAW;AAC9B,eAAO,QAAQ,GAAG;AAAA,MACpB;AAAA,IACF,CAAC;AAGD,QAAI,kBAAkB,UAAU;AAC9B,YAAM,EAAE,UAAU,MAAM,OAAO,IAAI,kBAAkB;AACrD,UAAI,cAAc;AAElB,UAAI,aAAa,sBAAsB,MAAM;AAC3C,YAAI;AACF,kBAAQ,OAAO,IAAI,SAAS,kBAAkB,eAAe,KAAK,MAAM,IAAI,CAAC,CAAC,GAAG;AAAA,QACnF,SAAS,GAAG;AACV,kBAAQ,OAAO;AAAA,QACjB;AAAA,MACF,WAAW,aAAa,yBAAyB,QAAQ;AACvD,iBAAS;AACT,eAAO,QAAQ,CAAC,UAAU;AACxB,cAAI,MAAM,aAAa,QAAW;AAChC,gBAAI,CAAC,aAAa;AAChB,uBAAS;AAAA;AAAA,EAA+B,MAAM;AAC9C,4BAAc;AAAA,YAChB;AACA,sBAAU,oBAAoB,MAAM,IAAI,iCAAiC,MAAM,QAAQ,UAAU,MAAM,QAAQ;AAAA;AAAA,UACjH,WAAW,MAAM,UAAU,QAAW;AACpC,sBAAU,oBAAoB,MAAM,IAAI,OAAO,MAAM,KAAK;AAAA;AAAA,UAC5D;AAAA,QACF,CAAC;AACD,kBAAU;AACV,gBAAQ,OAAO,IAAI,SAAS,UAAU;AAAA,MACxC,WAAW,aAAa,uCAAuC,QAAQ;AACrE,cAAM,OAAO,OAAO,YAAY,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AACpE,gBAAQ,OAAO,IAAI,SAAS,uBAAuB,eAAe,IAAI,CAAC,GAAG;AAAA,MAC5E,OAAO;AACL,gBAAQ,OAAO,kBAAkB,SAAS;AAAA,MAC5C;AAAA,IACF;AAGA,UAAM,cAAc,OAAO,KAAK,OAAO,EAAE,SAAS,KAAK,eAAe,OAAO,CAAC,KAAK;AAGnF,WAAO,GAAG,MAAM,UAAU,kBAAkB,GAAG,GAAG,WAAW,IAAI,WAAW;AAAA,EAC9E;AACF;",
6
6
  "names": []
7
7
  }