@ohos-ports/curlconverter 4.12.0-beta.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 (270) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +153 -0
  3. package/dist/src/Headers.d.ts +23 -0
  4. package/dist/src/Headers.js +287 -0
  5. package/dist/src/Headers.js.map +1 -0
  6. package/dist/src/Query.d.ts +8 -0
  7. package/dist/src/Query.js +136 -0
  8. package/dist/src/Query.js.map +1 -0
  9. package/dist/src/Request.d.ts +200 -0
  10. package/dist/src/Request.js +1191 -0
  11. package/dist/src/Request.js.map +1 -0
  12. package/dist/src/Warnings.d.ts +15 -0
  13. package/dist/src/Warnings.js +111 -0
  14. package/dist/src/Warnings.js.map +1 -0
  15. package/dist/src/cli.d.ts +2 -0
  16. package/dist/src/cli.js +333 -0
  17. package/dist/src/cli.js.map +1 -0
  18. package/dist/src/curl/auth.d.ts +12 -0
  19. package/dist/src/curl/auth.js +40 -0
  20. package/dist/src/curl/auth.js.map +1 -0
  21. package/dist/src/curl/form.d.ts +28 -0
  22. package/dist/src/curl/form.js +218 -0
  23. package/dist/src/curl/form.js.map +1 -0
  24. package/dist/src/curl/opts.d.ts +2052 -0
  25. package/dist/src/curl/opts.js +1000 -0
  26. package/dist/src/curl/opts.js.map +1 -0
  27. package/dist/src/curl/url.d.ts +14 -0
  28. package/dist/src/curl/url.js +218 -0
  29. package/dist/src/curl/url.js.map +1 -0
  30. package/dist/src/generators/ansible.d.ts +5 -0
  31. package/dist/src/generators/ansible.js +282 -0
  32. package/dist/src/generators/ansible.js.map +1 -0
  33. package/dist/src/generators/c.d.ts +12 -0
  34. package/dist/src/generators/c.js +1230 -0
  35. package/dist/src/generators/c.js.map +1 -0
  36. package/dist/src/generators/cfml.d.ts +5 -0
  37. package/dist/src/generators/cfml.js +134 -0
  38. package/dist/src/generators/cfml.js.map +1 -0
  39. package/dist/src/generators/clojure.d.ts +7 -0
  40. package/dist/src/generators/clojure.js +436 -0
  41. package/dist/src/generators/clojure.js.map +1 -0
  42. package/dist/src/generators/csharp.d.ts +8 -0
  43. package/dist/src/generators/csharp.js +356 -0
  44. package/dist/src/generators/csharp.js.map +1 -0
  45. package/dist/src/generators/dart.d.ts +5 -0
  46. package/dist/src/generators/dart.js +273 -0
  47. package/dist/src/generators/dart.js.map +1 -0
  48. package/dist/src/generators/elixir.d.ts +8 -0
  49. package/dist/src/generators/elixir.js +296 -0
  50. package/dist/src/generators/elixir.js.map +1 -0
  51. package/dist/src/generators/go.d.ts +5 -0
  52. package/dist/src/generators/go.js +228 -0
  53. package/dist/src/generators/go.js.map +1 -0
  54. package/dist/src/generators/har.d.ts +7 -0
  55. package/dist/src/generators/har.js +115 -0
  56. package/dist/src/generators/har.js.map +1 -0
  57. package/dist/src/generators/http.d.ts +7 -0
  58. package/dist/src/generators/http.js +165 -0
  59. package/dist/src/generators/http.js.map +1 -0
  60. package/dist/src/generators/httpie.d.ts +5 -0
  61. package/dist/src/generators/httpie.js +446 -0
  62. package/dist/src/generators/httpie.js.map +1 -0
  63. package/dist/src/generators/java/httpurlconnection.d.ts +5 -0
  64. package/dist/src/generators/java/httpurlconnection.js +123 -0
  65. package/dist/src/generators/java/httpurlconnection.js.map +1 -0
  66. package/dist/src/generators/java/java.d.ts +8 -0
  67. package/dist/src/generators/java/java.js +247 -0
  68. package/dist/src/generators/java/java.js.map +1 -0
  69. package/dist/src/generators/java/jsoup.d.ts +5 -0
  70. package/dist/src/generators/java/jsoup.js +152 -0
  71. package/dist/src/generators/java/jsoup.js.map +1 -0
  72. package/dist/src/generators/java/okhttp.d.ts +5 -0
  73. package/dist/src/generators/java/okhttp.js +232 -0
  74. package/dist/src/generators/java/okhttp.js.map +1 -0
  75. package/dist/src/generators/javascript/axios.d.ts +5 -0
  76. package/dist/src/generators/javascript/axios.js +332 -0
  77. package/dist/src/generators/javascript/axios.js.map +1 -0
  78. package/dist/src/generators/javascript/got.d.ts +5 -0
  79. package/dist/src/generators/javascript/got.js +277 -0
  80. package/dist/src/generators/javascript/got.js.map +1 -0
  81. package/dist/src/generators/javascript/http.d.ts +8 -0
  82. package/dist/src/generators/javascript/http.js +183 -0
  83. package/dist/src/generators/javascript/http.js.map +1 -0
  84. package/dist/src/generators/javascript/javascript.d.ts +37 -0
  85. package/dist/src/generators/javascript/javascript.js +676 -0
  86. package/dist/src/generators/javascript/javascript.js.map +1 -0
  87. package/dist/src/generators/javascript/jquery.d.ts +15 -0
  88. package/dist/src/generators/javascript/jquery.js +297 -0
  89. package/dist/src/generators/javascript/jquery.js.map +1 -0
  90. package/dist/src/generators/javascript/ky.d.ts +7 -0
  91. package/dist/src/generators/javascript/ky.js +245 -0
  92. package/dist/src/generators/javascript/ky.js.map +1 -0
  93. package/dist/src/generators/javascript/request.d.ts +5 -0
  94. package/dist/src/generators/javascript/request.js +113 -0
  95. package/dist/src/generators/javascript/request.js.map +1 -0
  96. package/dist/src/generators/javascript/superagent.d.ts +10 -0
  97. package/dist/src/generators/javascript/superagent.js +301 -0
  98. package/dist/src/generators/javascript/superagent.js.map +1 -0
  99. package/dist/src/generators/javascript/xhr.d.ts +8 -0
  100. package/dist/src/generators/javascript/xhr.js +147 -0
  101. package/dist/src/generators/javascript/xhr.js.map +1 -0
  102. package/dist/src/generators/json.d.ts +45 -0
  103. package/dist/src/generators/json.js +197 -0
  104. package/dist/src/generators/json.js.map +1 -0
  105. package/dist/src/generators/julia.d.ts +8 -0
  106. package/dist/src/generators/julia.js +365 -0
  107. package/dist/src/generators/julia.js.map +1 -0
  108. package/dist/src/generators/kotlin.d.ts +8 -0
  109. package/dist/src/generators/kotlin.js +325 -0
  110. package/dist/src/generators/kotlin.js.map +1 -0
  111. package/dist/src/generators/lua.d.ts +5 -0
  112. package/dist/src/generators/lua.js +192 -0
  113. package/dist/src/generators/lua.js.map +1 -0
  114. package/dist/src/generators/matlab/common.d.ts +16 -0
  115. package/dist/src/generators/matlab/common.js +238 -0
  116. package/dist/src/generators/matlab/common.js.map +1 -0
  117. package/dist/src/generators/matlab/httpinterface.d.ts +2 -0
  118. package/dist/src/generators/matlab/httpinterface.js +211 -0
  119. package/dist/src/generators/matlab/httpinterface.js.map +1 -0
  120. package/dist/src/generators/matlab/matlab.d.ts +5 -0
  121. package/dist/src/generators/matlab/matlab.js +29 -0
  122. package/dist/src/generators/matlab/matlab.js.map +1 -0
  123. package/dist/src/generators/matlab/webservices.d.ts +2 -0
  124. package/dist/src/generators/matlab/webservices.js +191 -0
  125. package/dist/src/generators/matlab/webservices.js.map +1 -0
  126. package/dist/src/generators/objectivec.d.ts +8 -0
  127. package/dist/src/generators/objectivec.js +269 -0
  128. package/dist/src/generators/objectivec.js.map +1 -0
  129. package/dist/src/generators/ocaml.d.ts +8 -0
  130. package/dist/src/generators/ocaml.js +150 -0
  131. package/dist/src/generators/ocaml.js.map +1 -0
  132. package/dist/src/generators/perl.d.ts +9 -0
  133. package/dist/src/generators/perl.js +209 -0
  134. package/dist/src/generators/perl.js.map +1 -0
  135. package/dist/src/generators/php/guzzle.d.ts +5 -0
  136. package/dist/src/generators/php/guzzle.js +328 -0
  137. package/dist/src/generators/php/guzzle.js.map +1 -0
  138. package/dist/src/generators/php/php.d.ts +8 -0
  139. package/dist/src/generators/php/php.js +217 -0
  140. package/dist/src/generators/php/php.js.map +1 -0
  141. package/dist/src/generators/php/requests.d.ts +5 -0
  142. package/dist/src/generators/php/requests.js +89 -0
  143. package/dist/src/generators/php/requests.js.map +1 -0
  144. package/dist/src/generators/powershell.d.ts +11 -0
  145. package/dist/src/generators/powershell.js +377 -0
  146. package/dist/src/generators/powershell.js.map +1 -0
  147. package/dist/src/generators/python/http.d.ts +5 -0
  148. package/dist/src/generators/python/http.js +128 -0
  149. package/dist/src/generators/python/http.js.map +1 -0
  150. package/dist/src/generators/python/python.d.ts +22 -0
  151. package/dist/src/generators/python/python.js +1693 -0
  152. package/dist/src/generators/python/python.js.map +1 -0
  153. package/dist/src/generators/r/httr.d.ts +10 -0
  154. package/dist/src/generators/r/httr.js +298 -0
  155. package/dist/src/generators/r/httr.js.map +1 -0
  156. package/dist/src/generators/r/httr2.d.ts +5 -0
  157. package/dist/src/generators/r/httr2.js +214 -0
  158. package/dist/src/generators/r/httr2.js.map +1 -0
  159. package/dist/src/generators/ruby/httparty.d.ts +6 -0
  160. package/dist/src/generators/ruby/httparty.js +308 -0
  161. package/dist/src/generators/ruby/httparty.js.map +1 -0
  162. package/dist/src/generators/ruby/ruby.d.ts +14 -0
  163. package/dist/src/generators/ruby/ruby.js +515 -0
  164. package/dist/src/generators/ruby/ruby.js.map +1 -0
  165. package/dist/src/generators/rust.d.ts +8 -0
  166. package/dist/src/generators/rust.js +177 -0
  167. package/dist/src/generators/rust.js.map +1 -0
  168. package/dist/src/generators/swift.d.ts +8 -0
  169. package/dist/src/generators/swift.js +219 -0
  170. package/dist/src/generators/swift.js.map +1 -0
  171. package/dist/src/generators/wget.d.ts +8 -0
  172. package/dist/src/generators/wget.js +472 -0
  173. package/dist/src/generators/wget.js.map +1 -0
  174. package/dist/src/index.d.ts +53 -0
  175. package/dist/src/index.js +54 -0
  176. package/dist/src/index.js.map +1 -0
  177. package/dist/src/parse.d.ts +13 -0
  178. package/dist/src/parse.js +43 -0
  179. package/dist/src/parse.js.map +1 -0
  180. package/dist/src/shell/Parser.d.ts +4 -0
  181. package/dist/src/shell/Parser.js +6 -0
  182. package/dist/src/shell/Parser.js.map +1 -0
  183. package/dist/src/shell/Word.d.ts +48 -0
  184. package/dist/src/shell/Word.js +486 -0
  185. package/dist/src/shell/Word.js.map +1 -0
  186. package/dist/src/shell/tokenizer.d.ts +3 -0
  187. package/dist/src/shell/tokenizer.js +610 -0
  188. package/dist/src/shell/tokenizer.js.map +1 -0
  189. package/dist/src/shell/webParser.d.ts +4 -0
  190. package/dist/src/shell/webParser.js +15 -0
  191. package/dist/src/shell/webParser.js.map +1 -0
  192. package/dist/src/utils.d.ts +6 -0
  193. package/dist/src/utils.js +21 -0
  194. package/dist/src/utils.js.map +1 -0
  195. package/dist/tools/compare-requests.d.ts +2 -0
  196. package/dist/tools/compare-requests.js +448 -0
  197. package/dist/tools/compare-requests.js.map +1 -0
  198. package/dist/tools/gen-test.d.ts +2 -0
  199. package/dist/tools/gen-test.js +114 -0
  200. package/dist/tools/gen-test.js.map +1 -0
  201. package/dist/tree-sitter-bash.wasm +0 -0
  202. package/index.d.ts +3 -0
  203. package/package.json +97 -0
  204. package/src/Headers.ts +334 -0
  205. package/src/Query.ts +147 -0
  206. package/src/Request.ts +1649 -0
  207. package/src/Warnings.ts +154 -0
  208. package/src/cli.ts +561 -0
  209. package/src/curl/auth.ts +45 -0
  210. package/src/curl/form.ts +297 -0
  211. package/src/curl/opts.ts +1417 -0
  212. package/src/curl/url.ts +241 -0
  213. package/src/generators/ansible.ts +364 -0
  214. package/src/generators/c.ts +1371 -0
  215. package/src/generators/cfml.ts +155 -0
  216. package/src/generators/clojure.ts +521 -0
  217. package/src/generators/csharp.ts +383 -0
  218. package/src/generators/dart.ts +293 -0
  219. package/src/generators/elixir.ts +349 -0
  220. package/src/generators/go.ts +269 -0
  221. package/src/generators/har.ts +147 -0
  222. package/src/generators/http.ts +194 -0
  223. package/src/generators/httpie.ts +506 -0
  224. package/src/generators/java/httpurlconnection.ts +151 -0
  225. package/src/generators/java/java.ts +280 -0
  226. package/src/generators/java/jsoup.ts +172 -0
  227. package/src/generators/java/okhttp.ts +257 -0
  228. package/src/generators/javascript/axios.ts +395 -0
  229. package/src/generators/javascript/got.ts +362 -0
  230. package/src/generators/javascript/http.ts +232 -0
  231. package/src/generators/javascript/javascript.ts +825 -0
  232. package/src/generators/javascript/jquery.ts +360 -0
  233. package/src/generators/javascript/ky.ts +315 -0
  234. package/src/generators/javascript/request.ts +152 -0
  235. package/src/generators/javascript/superagent.ts +373 -0
  236. package/src/generators/javascript/xhr.ts +192 -0
  237. package/src/generators/json.ts +293 -0
  238. package/src/generators/julia.ts +398 -0
  239. package/src/generators/kotlin.ts +355 -0
  240. package/src/generators/lua.ts +209 -0
  241. package/src/generators/matlab/common.ts +281 -0
  242. package/src/generators/matlab/httpinterface.ts +284 -0
  243. package/src/generators/matlab/matlab.ts +39 -0
  244. package/src/generators/matlab/webservices.ts +263 -0
  245. package/src/generators/objectivec.ts +297 -0
  246. package/src/generators/ocaml.ts +168 -0
  247. package/src/generators/perl.ts +237 -0
  248. package/src/generators/php/guzzle.ts +368 -0
  249. package/src/generators/php/php.ts +239 -0
  250. package/src/generators/php/requests.ts +103 -0
  251. package/src/generators/powershell.ts +430 -0
  252. package/src/generators/python/http.ts +167 -0
  253. package/src/generators/python/python.ts +1934 -0
  254. package/src/generators/r/httr.ts +328 -0
  255. package/src/generators/r/httr2.ts +268 -0
  256. package/src/generators/ruby/httparty.ts +351 -0
  257. package/src/generators/ruby/ruby.ts +564 -0
  258. package/src/generators/rust.ts +243 -0
  259. package/src/generators/swift.ts +235 -0
  260. package/src/generators/wget.ts +533 -0
  261. package/src/index.ts +89 -0
  262. package/src/parse.ts +72 -0
  263. package/src/shell/Parser.ts +8 -0
  264. package/src/shell/Word.ts +531 -0
  265. package/src/shell/tokenizer.ts +736 -0
  266. package/src/shell/webParser.ts +18 -0
  267. package/src/utils.ts +25 -0
  268. package/tools/compare-requests.ts +571 -0
  269. package/tools/extract_curl_args.py +511 -0
  270. package/tools/gen-test.ts +129 -0
@@ -0,0 +1,676 @@
1
+ import { warnIfPartsIgnored } from "../../Warnings.js";
2
+ import { Word, eq, joinWords } from "../../shell/Word.js";
3
+ import { parse, COMMON_SUPPORTED_ARGS } from "../../parse.js";
4
+ import { parseQueryString } from "../../Query.js";
5
+ import jsescObj from "jsesc";
6
+ export const javaScriptSupportedArgs = new Set([
7
+ ...COMMON_SUPPORTED_ARGS,
8
+ "upload-file",
9
+ "form",
10
+ "form-string",
11
+ "digest",
12
+ "no-digest",
13
+ "next",
14
+ // --no-compressed (the default) is unsupported though
15
+ "compressed",
16
+ ]);
17
+ export const nodeSupportedArgs = new Set([...javaScriptSupportedArgs, "proxy"]);
18
+ // https://fetch.spec.whatwg.org/#forbidden-method
19
+ export const FORBIDDEN_METHODS = ["CONNECT", "TRACE", "TRACK"];
20
+ // https://fetch.spec.whatwg.org/#forbidden-request-header
21
+ export const FORBIDDEN_HEADERS = [
22
+ "Accept-Charset",
23
+ "Accept-Encoding",
24
+ "Access-Control-Request-Headers",
25
+ "Access-Control-Request-Method",
26
+ "Connection",
27
+ "Content-Length",
28
+ "Cookie",
29
+ "Cookie2",
30
+ "Date",
31
+ "DNT",
32
+ "Expect",
33
+ "Host",
34
+ "Keep-Alive",
35
+ "Origin",
36
+ "Referer",
37
+ "Set-Cookie",
38
+ "TE",
39
+ "Trailer",
40
+ "Transfer-Encoding",
41
+ "Upgrade",
42
+ "Via",
43
+ ].map((h) => h.toLowerCase());
44
+ // TODO: implement?
45
+ export function reprObj(value, indentLevel) {
46
+ const escaped = jsescObj(value, {
47
+ quotes: "single",
48
+ minimal: false,
49
+ compact: false,
50
+ indent: " ",
51
+ indentLevel: indentLevel ? indentLevel : 0,
52
+ });
53
+ if (typeof value === "string") {
54
+ return "'" + escaped + "'";
55
+ }
56
+ return escaped;
57
+ }
58
+ export function reprPairs(d, indentLevel = 0, indent = " ", list = true, imports) {
59
+ if (d.length === 0) {
60
+ return list ? "[]" : "{}";
61
+ }
62
+ let code = list ? "[\n" : "{\n";
63
+ for (const [i, [key, value]] of d.entries()) {
64
+ code += indent.repeat(indentLevel + 1);
65
+ if (list) {
66
+ code += "[" + repr(key, imports) + ", " + repr(value, imports) + "]";
67
+ }
68
+ else {
69
+ code += repr(key, imports) + ": " + repr(value, imports);
70
+ }
71
+ code += i < d.length - 1 ? ",\n" : "\n";
72
+ }
73
+ code += indent.repeat(indentLevel) + (list ? "]" : "}");
74
+ return code;
75
+ }
76
+ export function reprAsStringToStringDict(d, indentLevel = 0, imports, indent = " ") {
77
+ return reprPairs(d, indentLevel, indent, false, imports);
78
+ }
79
+ export function reprAsStringTuples(d, indentLevel = 0, imports, indent = " ") {
80
+ return reprPairs(d, indentLevel, indent, true, imports);
81
+ }
82
+ export function reprStringToStringList(d, indentLevel = 0, imports, indent = " ", list = true) {
83
+ if (d.length === 0) {
84
+ return list ? "[]" : "{}";
85
+ }
86
+ let code = "{\n";
87
+ for (const [i, [key, value]] of d.entries()) {
88
+ let valueStr;
89
+ if (Array.isArray(value)) {
90
+ valueStr = "[" + value.map((v) => repr(v, imports)).join(", ") + "]";
91
+ }
92
+ else {
93
+ valueStr = repr(value, imports);
94
+ }
95
+ code += indent.repeat(indentLevel + 1);
96
+ code += repr(key, imports) + ": " + valueStr;
97
+ code += i < d.length - 1 ? ",\n" : "\n";
98
+ }
99
+ code += indent.repeat(indentLevel) + "}";
100
+ return code;
101
+ }
102
+ // Backtick quotes are not supported
103
+ const regexEscape = /'|"|\\|\p{C}|[^ \P{Z}]/gu;
104
+ const regexDigit = /[0-9]/;
105
+ export function esc(s, quote = "'") {
106
+ return s.replace(regexEscape, (c, index, string) => {
107
+ switch (c[0]) {
108
+ // https://mathiasbynens.be/notes/javascript-escapes#single
109
+ case "\\":
110
+ return "\\\\";
111
+ case "\b":
112
+ return "\\b";
113
+ case "\f":
114
+ return "\\f";
115
+ case "\n":
116
+ return "\\n";
117
+ case "\r":
118
+ return "\\r";
119
+ case "\t":
120
+ return "\\t";
121
+ case "\v":
122
+ return "\\v";
123
+ case "'":
124
+ case '"':
125
+ return c === quote ? "\\" + c : c;
126
+ case "\0":
127
+ // \0 is null but \01 is an octal escape
128
+ // if we have ['\0', '1', '2']
129
+ // and we converted it to '\\012', it would be interpreted as octal
130
+ // so it needs to be converted to '\\x0012'
131
+ if (!regexDigit.test(string.charAt(index + 1))) {
132
+ return "\\0";
133
+ }
134
+ break;
135
+ }
136
+ if (c.length === 2) {
137
+ const first = c.charCodeAt(0);
138
+ const second = c.charCodeAt(1);
139
+ return ("\\u" +
140
+ first.toString(16).padStart(4, "0") +
141
+ "\\u" +
142
+ second.toString(16).padStart(4, "0"));
143
+ }
144
+ const hex = c.charCodeAt(0).toString(16);
145
+ if (hex.length > 2) {
146
+ return "\\u" + hex.padStart(4, "0");
147
+ }
148
+ return "\\x" + hex.padStart(2, "0");
149
+ });
150
+ }
151
+ export function reprStr(s, quote) {
152
+ if (quote === undefined) {
153
+ quote = "'";
154
+ if (s.includes("'") && !s.includes('"')) {
155
+ quote = '"';
156
+ }
157
+ }
158
+ return quote + esc(s, quote) + quote;
159
+ }
160
+ export function addImport(imports, name, from) {
161
+ // TODO: this is linear
162
+ for (const [n, f] of imports) {
163
+ if (n === name && f === from)
164
+ return;
165
+ }
166
+ imports.push([name, from]);
167
+ }
168
+ export function reprImports(imports) {
169
+ let ret = "";
170
+ for (const [name, from] of imports.sort(bySecondElem)) {
171
+ if (name.startsWith("* as")) {
172
+ ret += `import ${name} from ${reprStr(from)};\n`;
173
+ }
174
+ else {
175
+ ret += `import { ${name} } from ${reprStr(from)};\n`;
176
+ }
177
+ }
178
+ return ret;
179
+ }
180
+ export function reprImportsRequire(imports) {
181
+ const ret = [];
182
+ if (imports.length === 0) {
183
+ return "";
184
+ }
185
+ for (const [name, from] of imports.sort(bySecondElem)) {
186
+ if (name.startsWith("* as ")) {
187
+ ret.push(`const ${name.slice("* as ".length)} = require(${reprStr(from)});`);
188
+ }
189
+ else if (name.includes(".")) {
190
+ ret.push(`const ${name} = require(${reprStr(from)}).${name};`);
191
+ }
192
+ else {
193
+ ret.push(`const ${name} = require(${reprStr(from)});`);
194
+ }
195
+ }
196
+ return ret.join("\n") + "\n";
197
+ }
198
+ export function repr(w, imports) {
199
+ // Node
200
+ const ret = [];
201
+ for (const t of w.tokens) {
202
+ if (typeof t === "string") {
203
+ ret.push(reprStr(t));
204
+ }
205
+ else if (t.type === "variable") {
206
+ ret.push("process.env[" + reprStr(t.value) + "]");
207
+ }
208
+ else {
209
+ ret.push("execSync(" + reprStr(t.value) + ").stdout");
210
+ addImport(imports, "execSync", "node:child_process");
211
+ }
212
+ }
213
+ return ret.join(" + ");
214
+ }
215
+ export function reprBrowser(w, warnings) {
216
+ const ret = [];
217
+ for (const t of w.tokens) {
218
+ if (typeof t === "string") {
219
+ ret.push(reprStr(t));
220
+ }
221
+ else {
222
+ ret.push(reprStr(t.text));
223
+ if (t.type === "variable") {
224
+ warnings.push([
225
+ "browser-has-no-env",
226
+ "Can't access environment variable in browser JS: " +
227
+ JSON.stringify(t.value),
228
+ ]);
229
+ }
230
+ else {
231
+ warnings.push([
232
+ "browser-has-no-shell",
233
+ "Can't run subcommands in browser JS: " + JSON.stringify(t.value),
234
+ ]);
235
+ }
236
+ }
237
+ }
238
+ return ret.join(" + ");
239
+ }
240
+ export function reprFetch(w, isNode, imports) {
241
+ if (!isNode) {
242
+ // TODO: warn
243
+ return reprStr(w.toString());
244
+ }
245
+ return repr(w, imports);
246
+ }
247
+ export function asParseFloat(w, imports) {
248
+ if (w.isString()) {
249
+ const originalValue = w.toString();
250
+ // TODO: reimplement curl's float parsing instead of parseFloat()
251
+ const asFloat = parseFloat(originalValue);
252
+ if (!isNaN(asFloat)) {
253
+ return originalValue;
254
+ }
255
+ }
256
+ return "parseFloat(" + repr(w, imports) + ")";
257
+ }
258
+ export function asParseFloatTimes1000(w, imports) {
259
+ if (w.isString()) {
260
+ const originalValue = w.toString();
261
+ // TODO: reimplement curl's float parsing instead of parseFloat()
262
+ // TODO: check overflow
263
+ const asFloat = parseFloat(originalValue) * 1000;
264
+ if (!isNaN(asFloat)) {
265
+ return asFloat.toString();
266
+ }
267
+ }
268
+ return "parseFloat(" + repr(w, imports) + ") * 1000";
269
+ }
270
+ export function asParseInt(w, imports) {
271
+ if (w.isString()) {
272
+ const originalValue = w.toString();
273
+ // TODO: reimplement curl's int parsing instead of parseInt()
274
+ const asInt = parseInt(originalValue);
275
+ if (!isNaN(asInt)) {
276
+ return originalValue;
277
+ }
278
+ }
279
+ return "parseInt(" + repr(w, imports) + ")";
280
+ }
281
+ export function bySecondElem(a, b) {
282
+ return a[1].localeCompare(b[1]);
283
+ }
284
+ export function toURLSearchParams(query, imports, indent = 1) {
285
+ const [queryList, queryDict] = query;
286
+ const queryObj = queryDict && queryDict.every((q) => !Array.isArray(q[1]))
287
+ ? reprAsStringToStringDict(queryDict, indent, imports)
288
+ : reprAsStringTuples(queryList, indent, imports);
289
+ return "new URLSearchParams(" + queryObj + ")";
290
+ }
291
+ export function toDictOrURLSearchParams(query, imports, indent = 1) {
292
+ const [queryList, queryDict] = query;
293
+ if (queryDict && queryDict.every((v) => !Array.isArray(v[1]))) {
294
+ return reprAsStringToStringDict(queryDict, indent, imports);
295
+ }
296
+ return ("new URLSearchParams(" +
297
+ reprAsStringTuples(queryList, indent, imports) +
298
+ ")");
299
+ }
300
+ export function toFormData(multipartUploads, imports, fetchImports, warnings, isNode = true) {
301
+ let code = "new FormData();\n";
302
+ for (const m of multipartUploads) {
303
+ // TODO: use .set() if all names are unique?
304
+ code += "form.append(" + reprFetch(m.name, isNode, imports) + ", ";
305
+ if ("contentFile" in m) {
306
+ if (isNode) {
307
+ if (eq(m.contentFile, "-")) {
308
+ addImport(imports, "* as fs", "fs");
309
+ code += "fs.readFileSync(0).toString()";
310
+ if (m.filename) {
311
+ code += ", " + reprFetch(m.filename, isNode, imports);
312
+ }
313
+ }
314
+ else {
315
+ fetchImports.add("fileFromSync");
316
+ // TODO: do this in a way that doesn't set filename="" if we don't have filename
317
+ code +=
318
+ "fileFromSync(" + reprFetch(m.contentFile, isNode, imports) + ")";
319
+ }
320
+ }
321
+ else {
322
+ // TODO: does the second argument get sent as filename="" ?
323
+ code +=
324
+ "File(['<data goes here>'], " +
325
+ reprFetch(m.contentFile, isNode, imports) +
326
+ ")";
327
+ // TODO: (massive todo) we could read the file if we're running in the command line
328
+ warnings.push([
329
+ "--form",
330
+ "you can't read a file for --form/-F in the browser",
331
+ ]);
332
+ }
333
+ }
334
+ else {
335
+ code += reprFetch(m.content, isNode, imports);
336
+ }
337
+ code += ");\n";
338
+ }
339
+ return code;
340
+ }
341
+ function getDataString(request, data, isNode, imports) {
342
+ const originalStringRepr = reprFetch(data, isNode, imports);
343
+ const contentType = request.headers.getContentType();
344
+ if (contentType === "application/json") {
345
+ try {
346
+ const dataStr = data.toString();
347
+ const parsed = JSON.parse(dataStr);
348
+ // Only bother for arrays and {}
349
+ if (typeof parsed !== "object" || parsed === null) {
350
+ return [originalStringRepr, null];
351
+ }
352
+ const roundtrips = JSON.stringify(parsed) === dataStr;
353
+ const jsonAsJavaScript = reprObj(parsed, 1);
354
+ const dataString = "JSON.stringify(" + jsonAsJavaScript + ")";
355
+ return [dataString, roundtrips ? null : originalStringRepr];
356
+ }
357
+ catch (_a) {
358
+ return [originalStringRepr, null];
359
+ }
360
+ }
361
+ if (contentType === "application/x-www-form-urlencoded") {
362
+ try {
363
+ const [queryList, queryDict] = parseQueryString(data);
364
+ if (queryList) {
365
+ // Technically node-fetch sends
366
+ // application/x-www-form-urlencoded;charset=utf-8
367
+ // TODO: handle repeated content-type header
368
+ if (eq(request.headers.get("content-type"), "application/x-www-form-urlencoded")) {
369
+ request.headers.delete("content-type");
370
+ }
371
+ // TODO: check roundtrip, add a comment
372
+ // TODO: this isn't a dict anymore
373
+ return [toURLSearchParams([queryList, queryDict], imports), null];
374
+ }
375
+ return [originalStringRepr, null];
376
+ }
377
+ catch (_b) {
378
+ return [originalStringRepr, null];
379
+ }
380
+ }
381
+ return [originalStringRepr, null];
382
+ }
383
+ export function getData(request, isNode, imports) {
384
+ if (!request.dataArray || request.multipartUploads) {
385
+ return ["", null];
386
+ }
387
+ if (request.dataArray.length === 1 &&
388
+ request.dataArray[0] instanceof Word &&
389
+ request.dataArray[0].isString()) {
390
+ try {
391
+ return getDataString(request, request.dataArray[0], isNode, imports);
392
+ }
393
+ catch (_a) { }
394
+ }
395
+ const parts = [];
396
+ const hasBinary = request.dataArray.some((d) => !(d instanceof Word) && d.filetype === "binary");
397
+ const encoding = hasBinary ? "" : ", 'utf-8'";
398
+ for (const d of request.dataArray) {
399
+ if (d instanceof Word) {
400
+ parts.push(repr(d, imports));
401
+ }
402
+ else {
403
+ const { filetype, name, filename } = d;
404
+ if (filetype === "urlencode" && name) {
405
+ // TODO: add this to the previous Word
406
+ parts.push(reprFetch(name, isNode, imports));
407
+ }
408
+ // TODO: use the filetype
409
+ if (eq(filename, "-")) {
410
+ if (isNode) {
411
+ addImport(imports, "* as fs", "fs");
412
+ parts.push("fs.readFileSync(0" + encoding + ")");
413
+ }
414
+ else {
415
+ // TODO: something else
416
+ // TODO: warn that file needs content
417
+ parts.push("new File([/* contents */], '<stdin>')");
418
+ }
419
+ }
420
+ else {
421
+ if (isNode) {
422
+ addImport(imports, "* as fs", "fs");
423
+ parts.push("fs.readFileSync(" +
424
+ reprFetch(filename, isNode, imports) +
425
+ encoding +
426
+ ")");
427
+ }
428
+ else {
429
+ // TODO: warn that file needs content
430
+ parts.push("new File([/* contents */], " +
431
+ reprFetch(filename, isNode, imports) +
432
+ ")");
433
+ }
434
+ }
435
+ }
436
+ }
437
+ if (parts.length === 0) {
438
+ return ["''", null];
439
+ }
440
+ if (parts.length === 1) {
441
+ return [parts[0], null];
442
+ }
443
+ let [start, joiner, end] = ["new ArrayBuffer(", ", ", ")"];
444
+ const totalLength = parts.reduce((a, b) => a + b.length, 0);
445
+ if (totalLength > 80) {
446
+ start += "\n ";
447
+ joiner = ",\n ";
448
+ end = "\n )";
449
+ }
450
+ return [start + parts.join(joiner) + end, null];
451
+ }
452
+ function requestToJavaScriptOrNode(request, warnings, fetchImports, imports, isNode) {
453
+ warnIfPartsIgnored(request, warnings, {
454
+ multipleUrls: true,
455
+ dataReadsFile: true,
456
+ // Not actually supported, just warned per-URL
457
+ queryReadsFile: true,
458
+ });
459
+ let code = "";
460
+ if (request.multipartUploads) {
461
+ if (isNode) {
462
+ // TODO: remove once Node 16 is EOL'd on 2023-09-11
463
+ fetchImports.add("FormData");
464
+ }
465
+ code +=
466
+ "const form = " +
467
+ toFormData(request.multipartUploads, imports, fetchImports, warnings, isNode);
468
+ code += "\n";
469
+ }
470
+ // Can delete content-type header
471
+ const [dataString, commentedOutDataString] = getData(request, isNode, imports);
472
+ let fn = "fetch";
473
+ if (request.urls[0].auth && request.authType === "digest") {
474
+ // TODO: if 'Authorization:' header is specified, don't set this
475
+ const [user, password] = request.urls[0].auth;
476
+ addImport(imports, "* as DigestFetch", "digest-fetch");
477
+ code +=
478
+ "const client = new DigestFetch(" +
479
+ reprFetch(user, isNode, imports) +
480
+ ", " +
481
+ reprFetch(password, isNode, imports) +
482
+ ");\n";
483
+ fn = "client.fetch";
484
+ }
485
+ for (const urlObj of request.urls) {
486
+ code += fn + "(" + reprFetch(urlObj.url, isNode, imports);
487
+ if (urlObj.queryReadsFile) {
488
+ warnings.push([
489
+ "unsafe-query",
490
+ // TODO: better wording
491
+ "the URL query string is not correct, " +
492
+ JSON.stringify("@" + urlObj.queryReadsFile) +
493
+ " means it should read the file " +
494
+ JSON.stringify(urlObj.queryReadsFile),
495
+ ]);
496
+ }
497
+ const method = urlObj.method.toLowerCase();
498
+ const methodStr = urlObj.method.toString();
499
+ if (method.isString() && FORBIDDEN_METHODS.includes(methodStr)) {
500
+ warnings.push([
501
+ "forbidden-method",
502
+ "the method " +
503
+ JSON.stringify(methodStr) +
504
+ " is not allowed in fetch()",
505
+ ]);
506
+ }
507
+ let optionsCode = "";
508
+ if (!eq(method, "get")) {
509
+ // TODO: If you pass a weird method to fetch() it won't uppercase it
510
+ // const methods = []
511
+ // const method = methods.includes(request.method.toLowerCase()) ? request.method.toUpperCase() : request.method
512
+ optionsCode +=
513
+ " method: " + reprFetch(urlObj.method, isNode, imports) + ",\n";
514
+ }
515
+ if (request.headers.length ||
516
+ (urlObj.auth && request.authType === "basic")) {
517
+ optionsCode += " headers: {\n";
518
+ for (const [headerName, headerValue] of request.headers) {
519
+ optionsCode +=
520
+ " " +
521
+ reprFetch(headerName, isNode, imports) +
522
+ ": " +
523
+ reprFetch(headerValue || new Word(), isNode, imports) +
524
+ ",\n";
525
+ if (!isNode &&
526
+ headerName.isString() &&
527
+ FORBIDDEN_HEADERS.includes(headerName.toString().toLowerCase())) {
528
+ warnings.push([
529
+ "forbidden-header",
530
+ JSON.stringify(headerName.toString()) +
531
+ " header is forbidden in fetch()",
532
+ ]);
533
+ }
534
+ }
535
+ if (urlObj.auth && request.authType === "basic") {
536
+ // TODO: if -H 'Authorization:' is passed, don't set this
537
+ optionsCode +=
538
+ " 'Authorization': 'Basic ' + btoa(" +
539
+ reprFetch(joinWords(urlObj.auth, ":"), isNode, imports) +
540
+ "),\n";
541
+ }
542
+ if (optionsCode.endsWith(",\n")) {
543
+ optionsCode = optionsCode.slice(0, -2);
544
+ optionsCode += "\n";
545
+ }
546
+ optionsCode += " },\n";
547
+ }
548
+ if (urlObj.uploadFile) {
549
+ if (isNode) {
550
+ fetchImports.add("fileFromSync");
551
+ optionsCode +=
552
+ " body: fileFromSync(" +
553
+ reprFetch(urlObj.uploadFile, isNode, imports) +
554
+ "),\n";
555
+ }
556
+ else {
557
+ optionsCode +=
558
+ " body: File(['<data goes here>'], " +
559
+ reprFetch(urlObj.uploadFile, isNode, imports) +
560
+ "),\n";
561
+ warnings.push([
562
+ "--form",
563
+ "you can't read a file for --upload-file/-F in the browser",
564
+ ]);
565
+ }
566
+ }
567
+ else if (request.multipartUploads) {
568
+ optionsCode += " body: form,\n";
569
+ }
570
+ else if (request.data) {
571
+ if (commentedOutDataString) {
572
+ optionsCode += " // body: " + commentedOutDataString + ",\n";
573
+ }
574
+ optionsCode += " body: " + dataString + ",\n";
575
+ }
576
+ if (isNode && request.proxy) {
577
+ // TODO: do this parsing in utils.ts
578
+ const proxy = request.proxy.includes("://")
579
+ ? request.proxy
580
+ : request.proxy.prepend("http://");
581
+ // TODO: could be more accurate
582
+ let [protocol] = proxy.split("://", 2);
583
+ protocol = protocol.toLowerCase();
584
+ if (!protocol.toBool()) {
585
+ protocol = new Word("http");
586
+ }
587
+ if (eq(protocol, "socks")) {
588
+ protocol = new Word("socks4");
589
+ proxy.replace(/^socks/, "socks4");
590
+ }
591
+ if (eq(protocol, "socks4") ||
592
+ eq(protocol, "socks5") ||
593
+ eq(protocol, "socks5h") ||
594
+ eq(protocol, "socks4a")) {
595
+ addImport(imports, "{ SocksProxyAgent }", "socks-proxy-agent");
596
+ optionsCode +=
597
+ " agent: new SocksProxyAgent(" +
598
+ reprFetch(proxy, isNode, imports) +
599
+ "),\n";
600
+ }
601
+ else if (eq(protocol, "http") || eq(protocol, "https")) {
602
+ addImport(imports, "HttpsProxyAgent", "https-proxy-agent");
603
+ optionsCode +=
604
+ " agent: new HttpsProxyAgent(" +
605
+ reprFetch(proxy, isNode, imports) +
606
+ "),\n";
607
+ }
608
+ else {
609
+ warnings.push([
610
+ "--proxy",
611
+ "failed to parse --proxy/-x or unknown protocol: " + protocol,
612
+ ]);
613
+ // or this?
614
+ // throw new CCError('Unsupported proxy scheme for ' + reprFetch(request.proxy))
615
+ }
616
+ }
617
+ if (optionsCode) {
618
+ if (optionsCode.endsWith(",\n")) {
619
+ optionsCode = optionsCode.slice(0, -2);
620
+ }
621
+ code += ", {\n";
622
+ code += optionsCode;
623
+ code += "\n}";
624
+ }
625
+ code += ");\n";
626
+ }
627
+ // TODO: generate some code for the output, like .json() if 'Accept': 'application/json'
628
+ return code;
629
+ }
630
+ export function _toJavaScriptOrNode(requests, warnings, isNode) {
631
+ const fetchImports = new Set();
632
+ const imports = [];
633
+ const code = requests
634
+ .map((r) => requestToJavaScriptOrNode(r, warnings, fetchImports, imports, isNode))
635
+ .join("\n");
636
+ let importCode = "";
637
+ if (isNode) {
638
+ importCode += "import fetch";
639
+ if (fetchImports.size) {
640
+ importCode += ", { " + Array.from(fetchImports).sort().join(", ") + " }";
641
+ }
642
+ importCode += " from 'node-fetch';\n";
643
+ }
644
+ if (imports.length) {
645
+ for (const [varName, imp] of Array.from(imports).sort(bySecondElem)) {
646
+ // TODO: check this
647
+ importCode += "import " + varName + " from " + reprStr(imp) + ";\n";
648
+ }
649
+ }
650
+ if (importCode) {
651
+ return importCode + "\n" + code;
652
+ }
653
+ return code;
654
+ }
655
+ export function _toJavaScript(requests, warnings = []) {
656
+ return _toJavaScriptOrNode(requests, warnings, false);
657
+ }
658
+ export function _toNode(requests, warnings = []) {
659
+ return _toJavaScriptOrNode(requests, warnings, true);
660
+ }
661
+ export function toJavaScriptWarn(curlCommand, warnings = []) {
662
+ const requests = parse(curlCommand, javaScriptSupportedArgs, warnings);
663
+ return [_toJavaScript(requests, warnings), warnings];
664
+ }
665
+ export function toJavaScript(curlCommand) {
666
+ const [result] = toJavaScriptWarn(curlCommand);
667
+ return result;
668
+ }
669
+ export function toNodeWarn(curlCommand, warnings = []) {
670
+ const requests = parse(curlCommand, nodeSupportedArgs, warnings);
671
+ return [_toNode(requests, warnings), warnings];
672
+ }
673
+ export function toNode(curlCommand) {
674
+ return toNodeWarn(curlCommand)[0];
675
+ }
676
+ //# sourceMappingURL=javascript.js.map