@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
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014-2016 Nick Carneiro
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,153 @@
1
+ # [curlconverter](https://curlconverter.com)
2
+
3
+ Transpile [`curl`](https://en.wikipedia.org/wiki/CURL) commands into C, C#, ColdFusion, Clojure, Dart, Elixir, Go, HTTPie, Java, JavaScript, Julia, Kotlin, Lua, MATLAB, Objective-C, OCaml, Perl, PHP, PowerShell, Python, R, Ruby, Rust, Swift, Wget, Ansible, HAR, HTTP or JSON.
4
+
5
+ Try it on [curlconverter.com](https://curlconverter.com) or as a drop-in `curl` replacement:
6
+
7
+ ```shell
8
+ $ curlconverter --data "hello=world" example.com
9
+ import requests
10
+
11
+ data = {
12
+ 'hello': 'world',
13
+ }
14
+
15
+ response = requests.post('http://example.com', data=data)
16
+ ```
17
+
18
+ Features:
19
+
20
+ - Implements a lot of curl's argument parsing logic
21
+ - Knows about all 255 curl arguments but most are ignored
22
+ - Supports shortening `-O -v -X POST` to `-OvXPOST`
23
+ - `--data @filename` generates code that reads that file and `@-` reads stdin
24
+ - Understands Bash syntax
25
+ - [ANSI-C quoted](https://www.gnu.org/software/bash/manual/bash.html#ANSI_002dC-Quoting) strings
26
+ - stdin redirects and [heredocs](https://www.gnu.org/software/bash/manual/bash.html#Here-Documents)
27
+ - Generated code reads environment variables and runs subcommands
28
+ - Ignores comments
29
+ - Reports syntax errors
30
+ - Converts JSON data to native objects
31
+ - Warns about issues with the conversion
32
+
33
+ Limitations:
34
+
35
+ - Only HTTP is supported
36
+ - Code generators for other languages are less thorough than the Python generator
37
+ - curl doesn't follow redirects or decompress gzip-compressed responses by default, but the generated code will do whatever the default is for that runtime, to keep it shorter. For example Python's Requests library [follows redirects by default](https://requests.readthedocs.io/en/latest/user/quickstart/#redirection-and-history), so unless you explicitly set the redirect policy with `-L`/`--location`/`--no-location`, the generated code will not handle redirects the same way as the curl command
38
+ - Shell variables can arbitrarily change how the command would be parsed at runtime. The command `curl $VAR` can do anything, depending on what's in `$VAR`. curlconverter assumes that environment variables don't contain characters that would affect parsing
39
+ - Only simple subcommands such as `curl $(echo example.com)` work, more complicated subcommands (such as nested commands or subcommands that redirect the output) won't generate valid code
40
+ - The Bash parser doesn't support all Bash syntax
41
+ - and much more
42
+
43
+ ## Install
44
+
45
+ Install the command line tool with
46
+
47
+ ```sh
48
+ npm install --global curlconverter
49
+ ```
50
+
51
+ Install the JavaScript library for use in your own projects with
52
+
53
+ ```sh
54
+ npm install curlconverter
55
+ ```
56
+
57
+ curlconverter requires Node 12+.
58
+
59
+ ## Usage
60
+
61
+ ### Usage from the command line
62
+
63
+ `curlconverter` acts as a drop-in replacement for curl. Take any curl command, change "`curl`" to "`curlconverter`" and it will print code instead of making the request
64
+
65
+ ```shell
66
+ $ curlconverter example.com
67
+ import requests
68
+
69
+ response = requests.get('http://example.com')
70
+ ```
71
+
72
+ To read the curl command from stdin, pass `-`
73
+
74
+ ```shell
75
+ $ echo 'curl example.com' | curlconverter -
76
+ import requests
77
+
78
+ response = requests.get('http://example.com')
79
+ ```
80
+
81
+ Choose the output language by passing `--language <language>`. The options are
82
+
83
+ - `ansible`
84
+ - `c`
85
+ - `cfml`
86
+ - `clojure`
87
+ - `csharp`
88
+ - `dart`
89
+ - `elixir`
90
+ - `go`
91
+ - `har`
92
+ - `http`
93
+ - `httpie`
94
+ - `java`, `java-httpurlconnection`, `java-jsoup`, `java-okhttp`
95
+ - `javascript`, `javascript-jquery`, `javascript-xhr`
96
+ - `json`
97
+ - `julia`
98
+ - `kotlin`
99
+ - `lua`
100
+ - `matlab`
101
+ - `node`, `node-http`, `node-axios`, `node-got`, `node-ky`, `node-request`, `node-superagent`
102
+ - `objc`
103
+ - `ocaml`
104
+ - `perl`
105
+ - `php`, `php-guzzle`, `php-requests`
106
+ - `powershell`, `powershell-webrequest`
107
+ - `python` (the default), `python-http`
108
+ - `r`, `r-httr2`
109
+ - `ruby`, `ruby-httparty`
110
+ - `rust`
111
+ - `swift`
112
+ - `wget`
113
+
114
+ `--verbose` enables printing of conversion warnings and error tracebacks.
115
+
116
+ ### Usage as a library
117
+
118
+ The JavaScript API is a bunch of functions that can take either a string of Bash code or an array of already-parsed arguments (like [`process.argv`](https://nodejs.org/docs/latest/api/process.html#processargv)) and return a string with the resulting program:
119
+
120
+ ```js
121
+ import * as curlconverter from 'curlconverter';
122
+
123
+ curlconverter.toPython('curl example.com');
124
+ curlconverter.toPython(['curl', 'example.com']);
125
+ // "import requests\n\nresponse = requests.get('http://example.com')\n"
126
+ ```
127
+
128
+ **Note**: add `"type": "module",` to your package.json for the `import` statement above to work. curlconverter must be imported as an ES module with `import` this way and not with `require()` because it uses [top-level `await`](https://v8.dev/features/top-level-await).
129
+
130
+ There's a corresponding set of functions that also return an array of warnings if there are any issues with the conversion:
131
+
132
+ ```js
133
+ curlconverter.toPythonWarn('curl ftp://example.com');
134
+ curlconverter.toPythonWarn(['curl', 'ftp://example.com']);
135
+ // [
136
+ // "import requests\n\nresponse = requests.get('ftp://example.com')\n",
137
+ // [ [ 'bad-scheme', 'Protocol "ftp" not supported' ] ]
138
+ // ]
139
+ ```
140
+
141
+ If you want to host curlconverter yourself and use it in the browser, it needs two [WASM](https://developer.mozilla.org/en-US/docs/WebAssembly) files to work, `tree-sitter.wasm` and `tree-sitter-bash.wasm`, which it will request from the root directory of your web server. If you are hosting a static website and using Webpack, you need to copy these files from the node_modules/ directory to your server's root directory in order to serve them. You can look at the [webpack.config.js](https://github.com/curlconverter/curlconverter.github.io/blob/2e1722891be22b1bb5c47976fb7873f6eb86b94d/webpack.config.js#L130-L131) for [curlconverter.com](https://curlconverter.com/) to see how this is done. You will also need to set `{module: {experiments: {topLevelAwait: true}}}` in your webpack.config.js.
142
+
143
+ ### Usage in VS Code
144
+
145
+ There's a VS Code extension that adds a "Paste cURL as \<language\>" option to the right-click menu: [https://marketplace.visualstudio.com/items?itemName=curlconverter.curlconverter](https://marketplace.visualstudio.com/items?itemName=curlconverter.curlconverter). It doesn't support the same languages, curl arguments or Bash syntax as the current version because it has to [use an old version of curlconverter](https://github.com/curlconverter/curlconverter-vscode/issues/1).
146
+
147
+ ## Contributing
148
+
149
+ See [CONTRIBUTING.md](./CONTRIBUTING.md)
150
+
151
+ ## License
152
+
153
+ MIT © [Nick Carneiro](http://trillworks.com)
@@ -0,0 +1,23 @@
1
+ import { Word } from "./shell/Word.js";
2
+ import type { Warnings } from "./Warnings.js";
3
+ export declare class Headers implements Iterable<[Word, Word | null]> {
4
+ readonly headers: [Word, Word | null][];
5
+ readonly lowercase: boolean;
6
+ constructor(headerArgs?: Word[], warnings?: Warnings, argName?: string);
7
+ get length(): number;
8
+ [Symbol.iterator](): Iterator<[Word, Word | null]>;
9
+ get(header: string): Word | null | undefined;
10
+ getContentType(): string | null | undefined;
11
+ has(header: Word | string): boolean;
12
+ setIfMissing(header: string, value: Word | string): boolean;
13
+ prependIfMissing(header: string, value: Word | string): boolean;
14
+ set(header: string, value: Word | string): void;
15
+ delete(header: string): void;
16
+ clearNulls(): void;
17
+ count(header: string): number;
18
+ toBool(): boolean;
19
+ }
20
+ export type Cookie = [Word, Word];
21
+ export type Cookies = Array<Cookie>;
22
+ export declare function parseCookiesStrict(cookieString: Word): Cookies | null;
23
+ export declare function parseCookies(cookieString: Word): Cookies | null;
@@ -0,0 +1,287 @@
1
+ import { Word, eq, joinWords } from "./shell/Word.js";
2
+ // https://en.wikipedia.org/wiki/List_of_HTTP_header_fields#Standard_request_fields
3
+ // and then searched for "#" in the RFCs that define each header
4
+ const COMMA_SEPARATED = new Set([
5
+ "A-IM",
6
+ "Accept",
7
+ "Accept-Charset",
8
+ // "Accept-Datetime",
9
+ "Accept-Encoding",
10
+ "Accept-Language",
11
+ // "Access-Control-Request-Method",
12
+ "Access-Control-Request-Headers",
13
+ // TODO: auth-scheme [ 1*SP ( token68 / #auth-param ) ]
14
+ // "Authorization",
15
+ "Cache-Control",
16
+ "Connection",
17
+ "Content-Encoding",
18
+ // "Content-Length",
19
+ // "Content-MD5",
20
+ // "Content-Type", // semicolon
21
+ // "Cookie", // semicolon
22
+ // "Date",
23
+ "Expect",
24
+ "Forwarded",
25
+ // "From",
26
+ // "Host",
27
+ // "HTTP2-Settings",
28
+ "If-Match",
29
+ // "If-Modified-Since",
30
+ "If-None-Match",
31
+ // "If-Range",
32
+ // "If-Unmodified-Since",
33
+ // "Max-Forwards",
34
+ // "Origin",
35
+ // "Pragma",
36
+ // "Prefer", // semicolon
37
+ // "Proxy-Authorization",
38
+ "Range",
39
+ // "Referer",
40
+ "TE",
41
+ "Trailer",
42
+ "Transfer-Encoding",
43
+ // "User-Agent",
44
+ "Upgrade",
45
+ "Via",
46
+ "Warning",
47
+ ].map((h) => h.toLowerCase()));
48
+ const SEMICOLON_SEPARATED = new Set(["Content-Type", "Cookie", "Prefer"].map((h) => h.toLowerCase()));
49
+ export class Headers {
50
+ constructor(headerArgs, warnings = [],
51
+ // Used for warnings
52
+ argName = "--header/H") {
53
+ let headers = [];
54
+ if (headerArgs) {
55
+ for (const header of headerArgs) {
56
+ if (header.startsWith("@")) {
57
+ warnings.push([
58
+ "header-file",
59
+ "passing a file for " +
60
+ argName +
61
+ " is not supported: " +
62
+ JSON.stringify(header.toString()),
63
+ ]);
64
+ continue;
65
+ }
66
+ if (header.includes(":")) {
67
+ const [name, value] = header.split(":", 2);
68
+ // Passing -H 'Header-Name:' disables sending of that header.
69
+ // If the colon is followed by just spaces they're ignored
70
+ // unless it's -H 'Host: '
71
+ // https://github.com/curl/curl/issues/12782
72
+ const hasValue = value && (eq(name, "Host") ? value : value.trim()).toBool();
73
+ const headerValue = hasValue ? value.removeFirstChar(" ") : null;
74
+ headers.push([name, headerValue]);
75
+ }
76
+ else if (header.includes(";")) {
77
+ const [name] = header.split(";", 2);
78
+ headers.push([name, new Word()]);
79
+ }
80
+ else {
81
+ // TODO: warn that this header arg is ignored?
82
+ }
83
+ }
84
+ }
85
+ this.lowercase =
86
+ headers.length > 0 && headers.every((h) => eq(h[0], h[0].toLowerCase()));
87
+ // Handle repeated headers
88
+ // For Cookie and Accept, merge the values using ';' and ',' respectively
89
+ // For other headers, warn about the repeated header
90
+ const uniqueHeaders = {};
91
+ for (const [name, value] of headers) {
92
+ // TODO: something better, at least warn that variable is ignored
93
+ const lowerName = name.toLowerCase().toString();
94
+ if (!uniqueHeaders[lowerName]) {
95
+ uniqueHeaders[lowerName] = [];
96
+ }
97
+ uniqueHeaders[lowerName].push([name, value]);
98
+ }
99
+ headers = [];
100
+ for (const [lowerName, repeatedHeaders] of Object.entries(uniqueHeaders)) {
101
+ if (repeatedHeaders.length === 1) {
102
+ headers.push(repeatedHeaders[0]);
103
+ continue;
104
+ }
105
+ // If they're all null, just use the first one
106
+ if (repeatedHeaders.every((h) => h[1] === null)) {
107
+ const lastRepeat = repeatedHeaders[repeatedHeaders.length - 1];
108
+ // Warn users if some are capitalized differently
109
+ if (new Set(repeatedHeaders.map((h) => h[0])).size > 1) {
110
+ warnings.push([
111
+ "repeated-header",
112
+ `"${lastRepeat[0]}" header unset ${repeatedHeaders.length} times`,
113
+ ]);
114
+ }
115
+ headers.push(lastRepeat);
116
+ continue;
117
+ }
118
+ // Otherwise there's at least one non-null value, so we can ignore the nulls
119
+ // TODO: if the values of the repeated headers are the same, just use the first one
120
+ // 'content-type': 'application/json; application/json',
121
+ // doesn't really make sense
122
+ const nonEmptyHeaders = repeatedHeaders.filter((h) => h[1] !== null);
123
+ if (nonEmptyHeaders.length === 1) {
124
+ headers.push(nonEmptyHeaders[0]);
125
+ continue;
126
+ }
127
+ let mergeChar = "";
128
+ if (COMMA_SEPARATED.has(lowerName)) {
129
+ mergeChar = ", ";
130
+ }
131
+ else if (SEMICOLON_SEPARATED.has(lowerName)) {
132
+ mergeChar = "; ";
133
+ }
134
+ if (mergeChar) {
135
+ const merged = joinWords(nonEmptyHeaders.map((h) => h[1]), mergeChar);
136
+ warnings.push([
137
+ "repeated-header",
138
+ `merged ${nonEmptyHeaders.length} "${nonEmptyHeaders[nonEmptyHeaders.length - 1][0]}" headers together with "${mergeChar.trim()}"`,
139
+ ]);
140
+ headers.push([nonEmptyHeaders[0][0], merged]);
141
+ continue;
142
+ }
143
+ warnings.push([
144
+ "repeated-header",
145
+ `found ${nonEmptyHeaders.length} "${nonEmptyHeaders[nonEmptyHeaders.length - 1][0]}" headers, only the last one will be sent`,
146
+ ]);
147
+ headers = headers.concat(nonEmptyHeaders);
148
+ }
149
+ this.headers = headers;
150
+ }
151
+ get length() {
152
+ return this.headers.length;
153
+ }
154
+ *[Symbol.iterator]() {
155
+ for (const h of this.headers) {
156
+ yield h;
157
+ }
158
+ }
159
+ // Gets the first header, matching case-insensitively
160
+ get(header) {
161
+ const lookup = header.toLowerCase();
162
+ for (const [h, v] of this.headers) {
163
+ if (h.toLowerCase().toString() === lookup) {
164
+ return v;
165
+ }
166
+ }
167
+ return undefined;
168
+ }
169
+ getContentType() {
170
+ const contentTypeHeader = this.get("content-type");
171
+ if (!contentTypeHeader) {
172
+ return contentTypeHeader;
173
+ }
174
+ return contentTypeHeader.split(";")[0].trim().toString();
175
+ }
176
+ has(header) {
177
+ const lookup = header.toLowerCase();
178
+ for (const h of this.headers) {
179
+ if (eq(h[0].toLowerCase(), lookup)) {
180
+ return true;
181
+ }
182
+ }
183
+ return false;
184
+ }
185
+ // Doesn't overwrite existing headers
186
+ setIfMissing(header, value) {
187
+ if (this.has(header)) {
188
+ return false;
189
+ }
190
+ if (this.lowercase) {
191
+ header = header.toLowerCase();
192
+ }
193
+ const k = typeof header === "string" ? new Word(header) : header;
194
+ const v = typeof value === "string" ? new Word(value) : value;
195
+ this.headers.push([k, v]);
196
+ return true;
197
+ }
198
+ prependIfMissing(header, value) {
199
+ if (this.has(header)) {
200
+ return false;
201
+ }
202
+ if (this.lowercase) {
203
+ header = header.toLowerCase();
204
+ }
205
+ const k = typeof header === "string" ? new Word(header) : header;
206
+ const v = typeof value === "string" ? new Word(value) : value;
207
+ this.headers.unshift([k, v]);
208
+ return true;
209
+ }
210
+ set(header, value) {
211
+ if (this.lowercase) {
212
+ header = header.toLowerCase();
213
+ }
214
+ const k = typeof header === "string" ? new Word(header) : header;
215
+ const v = typeof value === "string" ? new Word(value) : value;
216
+ // keep it in the same place if we overwrite
217
+ const searchHeader = k.toLowerCase().toString();
218
+ for (let i = 0; i < this.headers.length; i++) {
219
+ if (eq(this.headers[i][0].toLowerCase(), searchHeader)) {
220
+ this.headers[i][1] = v;
221
+ return;
222
+ }
223
+ }
224
+ this.headers.push([k, v]);
225
+ }
226
+ delete(header) {
227
+ const lookup = header.toLowerCase();
228
+ for (let i = this.headers.length - 1; i >= 0; i--) {
229
+ if (this.headers[i][0].toLowerCase().toString() === lookup) {
230
+ this.headers.splice(i, 1);
231
+ }
232
+ }
233
+ }
234
+ // TODO: doesn't this skip the next element after deleting?
235
+ clearNulls() {
236
+ for (let i = this.headers.length - 1; i >= 0; i--) {
237
+ if (this.headers[i][1] === null) {
238
+ this.headers.splice(i, 1);
239
+ }
240
+ }
241
+ }
242
+ // TODO: shouldn't be used
243
+ count(header) {
244
+ let count = 0;
245
+ const lookup = header.toLowerCase();
246
+ for (const h of this.headers || []) {
247
+ if (h[0].toLowerCase().toString() === lookup) {
248
+ count += 1;
249
+ }
250
+ }
251
+ return count;
252
+ }
253
+ toBool() {
254
+ return this.headers.length > 0 && this.headers.some((h) => h[1] !== null);
255
+ }
256
+ }
257
+ export function parseCookiesStrict(cookieString) {
258
+ const cookies = [];
259
+ for (let cookie of cookieString.split(";")) {
260
+ cookie = cookie.replace(/^ /, "");
261
+ const [name, value] = cookie.split("=", 2);
262
+ if (value === undefined) {
263
+ return null;
264
+ }
265
+ cookies.push([name, value]);
266
+ }
267
+ if (new Set(cookies.map((c) => c[0])).size !== cookies.length) {
268
+ return null;
269
+ }
270
+ return cookies;
271
+ }
272
+ export function parseCookies(cookieString) {
273
+ const cookies = [];
274
+ for (let cookie of cookieString.split(";")) {
275
+ cookie = cookie.trim();
276
+ if (!cookie) {
277
+ continue;
278
+ }
279
+ const [name, value] = cookie.split("=", 2);
280
+ cookies.push([name.trim(), (value || "").trim()]);
281
+ }
282
+ if (new Set(cookies.map((c) => c[0])).size !== cookies.length) {
283
+ return null;
284
+ }
285
+ return cookies;
286
+ }
287
+ //# sourceMappingURL=Headers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Headers.js","sourceRoot":"","sources":["../../src/Headers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Word } from "./shell/Word.js";
2
+ export type QueryList = Array<[Word, Word]>;
3
+ export type QueryDict = Array<[Word, Word | Array<Word>]>;
4
+ export type Query = [QueryList, QueryDict | null] | [null, null];
5
+ export declare function percentEncode(s: Word): Word;
6
+ export declare function percentEncodePlus(s: Word): Word;
7
+ export declare function wordDecodeURIComponent(s: Word): Word;
8
+ export declare function parseQueryString(s: Word | null): Query;
@@ -0,0 +1,136 @@
1
+ import { Word, eq } from "./shell/Word.js";
2
+ import { UTF8encoder } from "./utils.js";
3
+ // Match Python's urllib.parse.quote() behavior
4
+ // https://github.com/python/cpython/blob/3.11/Lib/urllib/parse.py#L826
5
+ // curl and Python let you send non-ASCII characters by encoding each UTF-8 byte.
6
+ // TODO: ignore hex case?
7
+ function _percentEncode(s) {
8
+ return [...UTF8encoder.encode(s)]
9
+ .map((b) => {
10
+ if (
11
+ // A-Z
12
+ (b >= 0x41 && b <= 0x5a) ||
13
+ // a-z
14
+ (b >= 0x61 && b <= 0x7a) ||
15
+ // 0-9
16
+ (b >= 0x30 && b <= 0x39) ||
17
+ // -._~
18
+ b === 0x2d ||
19
+ b === 0x2e ||
20
+ b === 0x5f ||
21
+ b === 0x7e) {
22
+ return String.fromCharCode(b);
23
+ }
24
+ return "%" + b.toString(16).toUpperCase().padStart(2, "0");
25
+ })
26
+ .join("");
27
+ }
28
+ export function percentEncode(s) {
29
+ const newTokens = [];
30
+ for (const token of s.tokens) {
31
+ if (typeof token === "string") {
32
+ newTokens.push(_percentEncode(token));
33
+ }
34
+ else {
35
+ newTokens.push(token);
36
+ }
37
+ }
38
+ return new Word(newTokens);
39
+ }
40
+ export function percentEncodePlus(s) {
41
+ const newTokens = [];
42
+ for (const token of s.tokens) {
43
+ if (typeof token === "string") {
44
+ newTokens.push(_percentEncode(token).replace(/%20/g, "+"));
45
+ }
46
+ else {
47
+ newTokens.push(token);
48
+ }
49
+ }
50
+ return new Word(newTokens);
51
+ }
52
+ // Reimplements decodeURIComponent but ignores variables/commands
53
+ export function wordDecodeURIComponent(s) {
54
+ const newTokens = [];
55
+ for (const token of s.tokens) {
56
+ if (typeof token === "string") {
57
+ newTokens.push(decodeURIComponent(token));
58
+ }
59
+ else {
60
+ newTokens.push(token);
61
+ }
62
+ }
63
+ return new Word(newTokens);
64
+ }
65
+ // if url is 'example.com?' the s is ''
66
+ // if url is 'example.com' the s is null
67
+ export function parseQueryString(s) {
68
+ if (!s || s.isEmpty()) {
69
+ return [null, null];
70
+ }
71
+ const asList = [];
72
+ for (const param of s.split("&")) {
73
+ // Most software libraries don't let you distinguish between a=&b= and a&b,
74
+ // so if we get an `a&b`-type query string, don't bother.
75
+ if (!param.includes("=")) {
76
+ return [null, null];
77
+ }
78
+ const [key, val] = param.split("=", 2);
79
+ let decodedKey;
80
+ let decodedVal;
81
+ try {
82
+ // https://url.spec.whatwg.org/#urlencoded-parsing
83
+ // recommends replacing + with space before decoding.
84
+ decodedKey = wordDecodeURIComponent(key.replace(/\+/g, " "));
85
+ decodedVal = wordDecodeURIComponent(val.replace(/\+/g, " "));
86
+ }
87
+ catch (e) {
88
+ if (e instanceof URIError) {
89
+ // Query string contains invalid percent encoded characters,
90
+ // we cannot properly convert it.
91
+ return [null, null];
92
+ }
93
+ throw e;
94
+ }
95
+ // If the query string doesn't round-trip, we cannot properly convert it.
96
+ // TODO: this is a bit Python-specific, ideally we would check how each runtime/library
97
+ // percent-encodes query strings. For example, a %27 character in the input query
98
+ // string will be decoded to a ' but won't be re-encoded into a %27 by encodeURIComponent
99
+ const roundTripKey = percentEncode(decodedKey);
100
+ const roundTripVal = percentEncode(decodedVal);
101
+ // If the original data used %20 instead of + (what requests will send), that's close enough
102
+ if ((!eq(roundTripKey, key) && !eq(roundTripKey.replace(/%20/g, "+"), key)) ||
103
+ (!eq(roundTripVal, val) && !eq(roundTripVal.replace(/%20/g, "+"), val))) {
104
+ return [null, null];
105
+ }
106
+ asList.push([decodedKey, decodedVal]);
107
+ }
108
+ // Group keys
109
+ const keyWords = {};
110
+ const uniqueKeys = {};
111
+ let prevKey = null;
112
+ for (const [key, val] of asList) {
113
+ const keyStr = key.toString(); // TODO: do this better
114
+ if (prevKey === keyStr) {
115
+ uniqueKeys[keyStr].push(val);
116
+ }
117
+ else if (!Object.prototype.hasOwnProperty.call(uniqueKeys, keyStr)) {
118
+ uniqueKeys[keyStr] = [val];
119
+ keyWords[keyStr] = key;
120
+ }
121
+ else {
122
+ // If there's a repeated key with a different key between
123
+ // one of its repetitions, there is no way to represent
124
+ // this query string as a dictionary.
125
+ return [asList, null];
126
+ }
127
+ prevKey = keyStr;
128
+ }
129
+ // Convert lists with 1 element to the element
130
+ const asDict = [];
131
+ for (const [keyStr, val] of Object.entries(uniqueKeys)) {
132
+ asDict.push([keyWords[keyStr], val.length === 1 ? val[0] : val]);
133
+ }
134
+ return [asList, asDict];
135
+ }
136
+ //# sourceMappingURL=Query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Query.js","sourceRoot":"","sources":["../../src/Query.ts"],"names":[],"mappings":"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"}