Full Code of jhawthorn/curl-to-ruby for AI

gh-pages 24abdb538dd2 cached
19 files
66.2 KB
23.3k tokens
55 symbols
1 requests
Download .txt
Repository: jhawthorn/curl-to-ruby
Branch: gh-pages
Commit: 24abdb538dd2
Files: 19
Total size: 66.2 KB

Directory structure:
gitextract_7qxwwb6z/

├── .github/
│   └── workflows/
│       └── test.yml
├── .gitignore
├── Gemfile
├── LICENSE.txt
├── README.md
├── index.html
├── package.json
├── resources/
│   ├── css/
│   │   ├── color-brewer.css
│   │   └── common.css
│   └── js/
│       ├── curl-to-ruby.js
│       └── default.js
├── src/
│   ├── curl-to-ruby.js
│   ├── curlToRuby.js
│   ├── default.js
│   ├── highlight.pack.js
│   ├── jsonToRuby.js
│   └── parseCommand.js
├── test.rb
└── webpack.config.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/test.yml
================================================
name: Test

on:
  push:
    branches:
    - gh-pages
  pull_request:
    branches:
    - gh-pages

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - name: Set up Ruby 2.6
      uses: actions/setup-ruby@v1
      with:
        ruby-version: 2.6.x
    - name: Set up Node.js 8.x
      uses: actions/setup-node@v1
      with:
        node-version: 8.x
    - name: Install dependencies
      run: |
        gem install bundler
        bundle install --jobs 4 --retry 3
        yarn
    - name: Build and run tests
      run: |
        yarn run compile
        bundle exec ruby test.rb


================================================
FILE: .gitignore
================================================
.DS_Store
Thumbs.db
_gitignore
node_modules


================================================
FILE: Gemfile
================================================
source 'https://rubygems.org'
gem 'execjs'
gem 'execjs-fastnode'
gem 'minitest'
gem 'pry'


================================================
FILE: LICENSE.txt
================================================
The MIT License (MIT)

Copyright (c) 2016 Matthew Holt

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

================================================
FILE: README.md
================================================
curl-to-ruby
============

curl-to-ruby is a tool to instantly convert [curl](http://curl.haxx.se) commands to ruby code using [net/http](http://ruby-doc.org/stdlib-2.1.1/libdoc/net/http/rdoc/Net/HTTP.html) in the browser. It does *not* guarantee high-fidelity conversions, but it's good enough for most API docs that have curl samples.

### Try it

**[Check it out!](https://jhawthorn.github.io/curl-to-ruby)** It works inside your browser.


### FAQ

#### Does any curl command work?

Any curl command should work, but only certain flags are understood and converted into ruby code. The rest of the flags will be ignored.

#### Which kinds of curl commands are understood?

Mostly simple HTTP commands (headers, basic auth, body, etc).

#### Will you consider supporting *this-or-that* flag?

curl has like a bajillion options, so don't expect all of them to be implemented; just the most common/important ones to stub out code from API samples and docs, etc. But feel free to open an issue or submit a pull request!



### Credits

Updated to ruby by John Hawthorn ([jhawthorn](https://twitter.com/jhawthorn))

Based on [curl-to-Go](https://github.com/mholt/curl-to-go) by Matt Holt ([mholt6](https://twitter.com/mholt6)).


================================================
FILE: index.html
================================================
<!DOCTYPE html>
<html>
  <head>
    <title>curl-to-ruby: Convert curl commands to ruby's net/http</title>
    <meta charset="utf-8">
    <link rel="stylesheet" href="resources/css/color-brewer.css">
    <link rel="stylesheet" href="resources/css/common.css">
  </head>
  <body>

    <header>
      <h1>curl-to-ruby</h1>
      <h2>Instantly convert <a href="http://curl.haxx.se/">curl</a> commands to <a href="https://www.ruby-lang.org/">Ruby</a>'s <a href="http://ruby-doc.org/stdlib/libdoc/net/http/rdoc/Net/HTTP.html">net/http</a></h2>

      <p>
        Ruby's <code>net/http</code> is notorious for not having the friendliest API, but it isn't all that bad.
        Ruby has great gems like <a href="https://github.com/lostisland/faraday">faraday</a>, but in libraries and small utilities it's better to <a href="http://www.mikeperham.com/2016/02/09/kill-your-dependencies/">kill your dependencies</a> and use what the stdlib provides.
      </p>
      <p>
        This tool turns a curl command into ruby (2.0+) code using <code>net/http</code>. Currently, it knows the following options: <code>-d</code>/<code>--data</code>, <code>-H</code>/<code>--header</code>, <code>-I</code>/<code>--head</code>, <code>-u</code>/<code>--user</code>, <code>-k</code>/<code>--insecure</code>, <code>--url</code>, and <code>-X</code>/<code>--request</code>.
      </p>
      <p>
        There's probably bugs; please <a href="https://github.com/jhawthorn/curl-to-ruby">contribute on GitHub</a>. Based on <a href="https://mholt.github.io/curl-to-go">curl-to-go</a>.
      </p>

      <p class="examples">
        <a href="javascript: useExample('example1')">Simple</a> &middot;
        <a href="javascript: useExample('example2')">Basic Auth</a> &middot;
        <a href="javascript: useExample('example3')">JSON</a> &middot;
        <a href="javascript: useExample('example4')">Complex JSON</a> &middot;
        <a href="javascript: useExample('example5')">Form Data</a>
      </p>

    </header>
    <main>
<script id="example1" language="text/x-shellscript">curl echoip.com</script>
<script id="example2" language="text/x-shellscript">
curl https://api.example.com/surprise \
     -u banana:coconuts \
     -d "sample data"
</script>
<script id="example3" language="text/x-shellscript">
curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer b7d03a6947b217efb6f3ec3bd3504582" -d '{"type":"A","name":"www","data":"162.10.66.0","priority":null,"port":null,"weight":null}' "https://api.digitalocean.com/v2/domains/example.com/records"
</script>
<script id="example4" language="text/x-shellscript">
     curl -u "demo:" -X POST -H "Content-Type: application/json" -d '{"array": [1,2,3], "object": {"foo": "bar", "nested": {"baz": true}}}' https://example.com/
</script>
<script id="example5" language="text/x-shellscript">
curl -X POST https://api.easypost.com/v2/shipments \
     -u API_KEY: \
     -d 'shipment[to_address][id]=adr_HrBKVA85' \
     -d 'shipment[from_address][id]=adr_VtuTOj7o' \
     -d 'shipment[parcel][id]=prcl_WDv2VzHp' \
     -d 'shipment[is_return]=true' \
     -d 'shipment[customs_info][id]=cstinfo_bl5sE20Y'
</script>

      <textarea id="input" rows="4" placeholder="Paste curl here"></textarea>
      <div id="output"></div>
    </main>
    <footer>
      <p>
        Protip™: Both chrome and firefox allow <a href="https://daniel.haxx.se/blog/2015/11/23/copy-as-curl/">copying any request as curl</a>.
      </p>
    </footer>
    <script src="resources/js/default.js"></script>
  </body>
</html>


================================================
FILE: package.json
================================================
{
  "name": "curl-to-ruby",
  "version": "1.0.0",
  "private": true,
  "description": "curl-to-ruby ============",
  "scripts": {
    "watch": "webpack --watch --colors --progress --display-error-details",
    "compile": "webpack --no-colors -p --display-error-details",
    "eslint": "eslint src"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/jhawthorn/curl-to-ruby.git"
  },
  "author": "John Hawthorn",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/jhawthorn/curl-to-ruby/issues"
  },
  "homepage": "https://github.com/jhawthorn/curl-to-ruby#readme",
  "dependencies": {
    "@babel/core": "^7.5.5",
    "@babel/preset-env": "^7.5.5",
    "babel-loader": "^8.0.6",
    "highlight.js": "^9.4.0",
    "query-string": "^6.8.2",
    "shell-quote": "^1.6.0",
    "webpack": "^4.39.2"
  },
  "devDependencies": {
    "babel-eslint": "^10.0.2",
    "expose-loader": "^0.7.1",
    "webpack-cli": "^3.3.6"
  }
}


================================================
FILE: resources/css/color-brewer.css
================================================
/*

Colorbrewer theme
Original: https://github.com/mbostock/colorbrewer-theme (c) Mike Bostock <mike@ocks.org>
Ported by Fabrício Tavares de Oliveira

*/

.hljs {
  display: block;
  overflow-x: auto;
  padding: 0.5em;
  background: #fff;
}

.hljs,
.hljs-subst {
  color: #000;
}

.hljs-string,
.hljs-meta,
.hljs-symbol,
.hljs-template-tag,
.hljs-template-variable,
.hljs-addition {
  color: #756bb1;
}

.hljs-comment,
.hljs-quote {
  color: #636363;
}

.hljs-number,
.hljs-regexp,
.hljs-literal,
.hljs-bullet,
.hljs-link {
  color: #31a354;
}

.hljs-deletion,
.hljs-variable {
  color: #88f;
}



.hljs-keyword,
.hljs-selector-tag,
.hljs-title,
.hljs-section,
.hljs-built_in,
.hljs-doctag,
.hljs-type,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-strong {
  color: #3182bd;
}

.hljs-emphasis {
  font-style: italic;
}

.hljs-attribute {
  color: #e6550d;
}


================================================
FILE: resources/css/common.css
================================================
/*
	Eric Meyer's Reset CSS v2.0
	
	NOTICE: This copy of the CSS reset has been modified
	to make main tag "display: block" because the default in
	even IE 11 is "display: inline", which is not correct.
*/
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{border:0;font-size:100%;font:inherit;vertical-align:baseline;margin:0;padding:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section{display:block}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:none}table{border-collapse:collapse;border-spacing:0}

* {
	box-sizing: border-box;
}

body {
	font: 14px/1.5em sans-serif;
}

header,
main,
footer {
	width: 85%;
	max-width: 900px;
	margin: 0 auto;
}

header {
	margin-bottom: 50px;
}

h1 {
	font-size: 48px;
	font-weight: bold;
	line-height: 1.5em;
	text-align: center;
}

h2 {
	font-size: 18px;
	line-height: 1.3em;
	text-align: center;
	margin-bottom: 25px;
}

p {
	max-width: 625px;
	margin: 10px auto;
}

code {
	font-family: 'Consolas', 'Menlo', 'Monaco', 'Courier New', monospace;
	padding: 1px 3px;
	background-color: #EEE;
	font-size: 12px;
}

.examples {
	max-width: none;
	text-align: center;
}

.examples a {
	margin: 0 3px;
}

.clr-red {
	color: #CC0000;
}

#input,
#output {
	border: 1px solid #CCC;
	padding: 10px;
	outline: none;
	font: 16px/1.5em Consolas, Menlo, Monaco, 'Courier New', monospace;
	white-space: pre;
	tab-size: 4;
}

#input {
	width: 100%;
	margin-bottom: 50px;
	overflow-y: auto;
	resize: vertical;
}

#output {
	background-color: #F0F8FF; /* "aliceblue" - happened on that by chance choosing a color in chrome inspector tools */
	word-wrap: break-word;
	font-size: 14px;
}

footer {
	margin: 50px auto;
	text-align: center;
}


================================================
FILE: resources/js/curl-to-ruby.js
================================================
!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=8)}([function(e,t,r){"use strict";const n=r(3),o=r(4),s=r(5);function i(e,t){return t.encode?t.strict?n(e):encodeURIComponent(e):e}function a(e,t){return t.decode?o(e):e}function u(e){const t=e.indexOf("#");return-1!==t&&(e=e.slice(0,t)),e}function c(e){const t=(e=u(e)).indexOf("?");return-1===t?"":e.slice(t+1)}function l(e,t){const r=function(e){let t;switch(e.arrayFormat){case"index":return(e,r,n)=>{t=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),t?(void 0===n[e]&&(n[e]={}),n[e][t[1]]=r):n[e]=r};case"bracket":return(e,r,n)=>{t=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),t?void 0!==n[e]?n[e]=[].concat(n[e],r):n[e]=[r]:n[e]=r};case"comma":return(e,t,r)=>{const n="string"==typeof t&&t.split("").indexOf(",")>-1?t.split(","):t;r[e]=n};default:return(e,t,r)=>{void 0!==r[e]?r[e]=[].concat(r[e],t):r[e]=t}}}(t=Object.assign({decode:!0,sort:!0,arrayFormat:"none",parseNumbers:!1,parseBooleans:!1},t)),n=Object.create(null);if("string"!=typeof e)return n;if(!(e=e.trim().replace(/^[?#&]/,"")))return n;for(const o of e.split("&")){let[e,i]=s(o.replace(/\+/g," "),"=");i=void 0===i?null:a(i,t),t.parseNumbers&&!Number.isNaN(Number(i))&&"string"==typeof i&&""!==i.trim()?i=Number(i):!t.parseBooleans||null===i||"true"!==i.toLowerCase()&&"false"!==i.toLowerCase()||(i="true"===i.toLowerCase()),r(a(e,t),i,n)}return!1===t.sort?n:(!0===t.sort?Object.keys(n).sort():Object.keys(n).sort(t.sort)).reduce((e,t)=>{const r=n[t];return Boolean(r)&&"object"==typeof r&&!Array.isArray(r)?e[t]=function e(t){return Array.isArray(t)?t.sort():"object"==typeof t?e(Object.keys(t)).sort((e,t)=>Number(e)-Number(t)).map(e=>t[e]):t}(r):e[t]=r,e},Object.create(null))}t.extract=c,t.parse=l,t.stringify=(e,t)=>{if(!e)return"";const r=function(e){switch(e.arrayFormat){case"index":return t=>(r,n)=>{const o=r.length;return void 0===n?r:null===n?[...r,[i(t,e),"[",o,"]"].join("")]:[...r,[i(t,e),"[",i(o,e),"]=",i(n,e)].join("")]};case"bracket":return t=>(r,n)=>void 0===n?r:null===n?[...r,[i(t,e),"[]"].join("")]:[...r,[i(t,e),"[]=",i(n,e)].join("")];case"comma":return t=>(r,n,o)=>null==n||0===n.length?r:0===o?[[i(t,e),"=",i(n,e)].join("")]:[[r,i(n,e)].join(",")];default:return t=>(r,n)=>void 0===n?r:null===n?[...r,i(t,e)]:[...r,[i(t,e),"=",i(n,e)].join("")]}}(t=Object.assign({encode:!0,strict:!0,arrayFormat:"none"},t)),n=Object.keys(e);return!1!==t.sort&&n.sort(t.sort),n.map(n=>{const o=e[n];return void 0===o?"":null===o?i(n,t):Array.isArray(o)?o.reduce(r(n),[]).join("&"):i(n,t)+"="+i(o,t)}).filter(e=>e.length>0).join("&")},t.parseUrl=(e,t)=>({url:u(e).split("?")[0]||"",query:l(c(e),t)})},function(e,t){t.quote=function(e){return e.map(function(e){return e&&"object"==typeof e?e.op.replace(/(.)/g,"\\$1"):/["\s]/.test(e)&&!/'/.test(e)?"'"+e.replace(/(['\\])/g,"\\$1")+"'":/["'\s]/.test(e)?'"'+e.replace(/(["\\$`!])/g,"\\$1")+'"':e=(e=String(e).replace(/([A-z]:)?([#!"$&'()*,:;<=>?@\[\\\]^`{|}])/g,"$1\\$2")).replace(/\\\\/g,"\\")}).join(" ")};for(var r="(?:"+["\\|\\|","\\&\\&",";;","\\|\\&","\\<\\(",">>",">\\&","[&;()|<>]"].join("|")+")",n="(\\\\['\"|&;()<> \\t]|[^\\s'\"|&;()<> \\t])+",o='"((\\\\"|[^"])*?)"',s="'((\\\\'|[^'])*?)'",i="",a=0;a<4;a++)i+=(Math.pow(16,8)*Math.random()).toString(16);t.parse=function(e,t,a){var u=function(e,t,a){var u=new RegExp(["("+r+")","("+n+"|"+o+"|"+s+")*"].join("|"),"g"),c=e.match(u).filter(Boolean),l=!1;if(!c)return[];t||(t={});a||(a={});return c.map(function(e,n){if(!l){if(RegExp("^"+r+"$").test(e))return{op:e};for(var o=a.escape||"\\",s=!1,u=!1,f="",p=!1,d=0,h=e.length;d<h;d++){var g=e.charAt(d);if(p=p||!s&&("*"===g||"?"===g),u)f+=g,u=!1;else if(s)g===s?s=!1:"'"==s?f+=g:g===o?(d+=1,f+='"'===(g=e.charAt(d))||g===o||"$"===g?g:o+g):f+="$"===g?b():g;else if('"'===g||"'"===g)s=g;else{if(RegExp("^"+r+"$").test(g))return{op:e};if(RegExp("^#$").test(g))return l=!0,f.length?[f,{comment:e.slice(d+1)+c.slice(n+1).join(" ")}]:[{comment:e.slice(d+1)+c.slice(n+1).join(" ")}];g===o?u=!0:f+="$"===g?b():g}}return p?{op:"glob",pattern:f}:f}function b(){var r,n;if(d+=1,"{"===e.charAt(d)){if(d+=1,"}"===e.charAt(d))throw new Error("Bad substitution: "+e.substr(d-2,3));if((r=e.indexOf("}",d))<0)throw new Error("Bad substitution: "+e.substr(d));n=e.substr(d,r-d),d=r}else/[*@#?$!_\-]/.test(e.charAt(d))?(n=e.charAt(d),d+=1):(r=e.substr(d).match(/[^\w\d_]/))?(n=e.substr(d,r.index),d+=r.index-1):(n=e.substr(d),d=e.length);return function(e,r,n){var o="function"==typeof t?t(n):t[n];void 0===o&&""!=n?o="":void 0===o&&(o="$");return"object"==typeof o?r+i+JSON.stringify(o)+i:r+o}(0,"",n)}}).reduce(function(e,t){return void 0===t?e:e.concat(t)},[])}(e,t,a);return"function"!=typeof t?u:u.reduce(function(e,t){if("object"==typeof t)return e.concat(t);var r=t.split(RegExp("("+i+".*?"+i+")","g"));return 1===r.length?e.concat(r[0]):e.concat(r.filter(Boolean).map(function(e){return RegExp("^"+i).test(e)?JSON.parse(e.split(i)[1]):e}))},[])}},function(e,t,r){"use strict";r.r(t);var n=r(0),o=r.n(n);function s(e){return(s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var i=r(1);function a(e){var t="require 'net/http'\nrequire 'uri'\n",r="\n# response.code\n# response.body\n",n={COPY:"Copy",DELETE:"Delete",GET:"Get",HEAD:"Head",LOCK:"Lock",MKCOL:"Mkcol",MoVE:"Move",OPTIONS:"Options",PATCH:"Patch",POST:"Post",PROPFIND:"Propfind",PROPPATCH:"Proppatch",PUT:"Put",TRACE:"Trace",UNLOCK:"Unlock"},a=/^([^\s]+=[^\s]+)(&[^\s]+=[^\s]+)*$/;if(e.trim()){var u=function(e,t){void 0===t&&(t={}),e=(e=e.replace(/\\\n/g,"")).trim();var r=Object(i.parse)(e),n={_:[]};function o(e,t){n[e]||(n[e]=[]),n[e].push(t)}for(;r.length;){var s=r.shift();if("glob"==s.op&&(s=s.pattern),"-"==s[0]){if("-"==(s=s.substring(1,s.length))[0])if(a(s=s.substring(1,s.length)))n[s]=!0;else if(s.indexOf("=")>0)o(s.substring(0,s.indexOf("=")),s.substring(s.indexOf("=")+1,s.length));else o(s,r.shift());else a(s)?n[s]=!0:s.length>1?o(s[0],s.substring(1,s.length)):o(s[0],r.shift());a(s)&&(n[s]=!0)}else o("_",s)}return n;function a(e){if(Array.isArray(t.boolFlags))for(var r=0;r<t.boolFlags.length;r++)if(t.boolFlags[r]==e)return!0;return!1}}(e,{boolFlags:["#","progress-bar","-","next","0","http1.0","http1.1","http2","no-npn","no-alpn","1","tlsv1","2","sslv2","3","sslv3","4","ipv4","6","ipv6","a","append","anyauth","B","use-ascii","basic","compressed","create-dirs","crlf","digest","disable-eprt","disable-epsv","environment","cert-status","false-start","f","fail","ftp-create-dirs","ftp-pasv","ftp-skip-pasv-ip","ftp-pret","ftp-ssl-ccc","ftp-ssl-control","g","globoff","G","get","ignore-content-length","i","include","I","head","j","junk-session-cookies","J","remote-header-name","k","insecure","l","list-only","L","location","location-trusted","metalink","n","netrc","N","no-buffer","netrc-file","netrc-optional","negotiate","no-keepalive","no-sessionid","ntlm","O","remote-name","oauth2-bearer","p","proxy-tunnel","path-as-is","post301","post302","post303","proxy-anyauth","proxy-basic","proxy-digest","proxy-negotiate","proxy-ntlm","q","raw","remote-name-all","s","silent","sasl-ir","S","show-error","ssl","ssl-reqd","ssl-allow-beast","ssl-no-revoke","socks5-gssapi-nec","tcp-nodelay","tlsv1.0","tlsv1.1","tlsv1.2","tr-encoding","trace-time","v","verbose","xattr","h","help","M","manual","V","version"]});if("curl"!=u._[0])throw"Not a curl command";var c=function(e){var t={url:"",method:"",headers:[],data:{}};e.url&&e.url.length>0?t.url=e.url[0]:e._.length>1&&(t.url=e._[1]);t.url=function(e){return e&&!new RegExp("^https?://","i").test(e)?"http://"+e:e}(t.url),e.H&&(t.headers=t.headers.concat(e.H));e.header&&(t.headers=t.headers.concat(e.header));(e.I||e.head)&&(t.method="HEAD");e.request&&e.request.length>0?t.method=e.request[e.request.length-1].toUpperCase():e.X&&e.X.length>0&&(t.method=e.X[e.X.length-1].toUpperCase());var r=[],n=[],o=function(e){t.method||(t.method="POST");for(var o=0;o<e.length;o++)e[o].length>0&&"@"==e[o][0]?n.push(e[o].substr(1)):r.push(e[o])};e.d&&o(e.d);e.data&&o(e.data);e["data-binary"]&&o(e["data-binary"]);r.length>0&&(t.data.ascii=r.join("&"));n.length>0&&(t.data.files=n);var s="";e.user&&e.user.length>0?s=e.user[e.user.length-1]:e.u&&e.u.length>0&&(s=e.u[e.u.length-1]);var i=s.indexOf(":");i>-1?t.basicauth={user:s.substr(0,i),pass:s.substr(i+1)}:t.basicAuth={user:s,pass:"<PASSWORD>"};(e.k||e.insecure)&&(t.insecure=!0);t.method||(t.method="GET");return t}(u);return 0!=c.headers.length||"GET"!=c.method||c.data.ascii||c.data.files||c.basicauth||c.insecure?function(e){for(var i={},u=0;u<e.headers.length;u++){var c=e.headers[u].indexOf(":");if(-1!=c){var f=e.headers[u].substr(0,c).trim(),p=e.headers[u].substr(c+1).trim();i[(d=f,d.replace(/\w*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}))]=p}}var d;delete i["Accept-Encoding"];var h="";h+='uri = URI.parse("'+l(e.url)+'")\n',n[e.method]?h+="request = Net::HTTP::"+n[e.method]+".new(uri)\n":h+='request = Net::HTTPGenericRequest.new("'+l(e.method)+'", false, false, uri)\n';e.basicauth&&(h+='request.basic_auth("'+l(e.basicauth.user)+'", "'+l(e.basicauth.pass)+'")\n');i["Content-Type"]&&(h+='request.content_type = "'+l(i["Content-Type"])+'"\n',delete i["Content-Type"]);for(var f in i)h+='request["'+l(f)+'"] = "'+l(i[f])+'"\n';if(e.data.ascii)if(function(e){try{return JSON.parse(e),!0}catch(e){return!1}}(e.data.ascii)){var g=JSON.parse(e.data.ascii);t+="require 'json'\n",h+="request.body = JSON.dump("+function e(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=s(t);if(null==t)return"nil";if("boolean"==n)return t.toString();if("number"==n)return t.toString();if("string"==n)return'"'+t.toString()+'"';if(Array.isArray(t)){var o="[\n";return t.forEach(function(t){o+=r+"  ",o+=e(t,r+"  "),o+=",\n"}),o=o.slice(0,-2),o+="\n"+r+"]"}if("object"==n){var i="{\n";for(var a in t)i+=r+"  ",i+=e(a),i+=" => ",i+=e(t[a],r+"  "),i+=",\n";return i=i.slice(0,-2),i+="\n"+r+"}"}throw"Invalid JSON object"}(g)+")\n"}else if(a.test(e.data.ascii)){var b=o.a.parse(e.data.ascii);for(var f in h+="request.set_form_data(\n",b){var y=b[f];h+='  "'.concat(l(f),'" => "').concat(l(y),'",\n')}h+=")\n"}else h+='request.body = "'+l(e.data.ascii)+'"\n';if(e.data.files&&e.data.files.length>0){e.data.ascii||(h+='request.body = ""\n');for(u=0;u<e.data.files.length;u++)h+='request.body << File.read("'+l(e.data.files[u])+'").delete("\\r\\n")\n'}h+="\n",h+="req_options = {\n",h+='  use_ssl: uri.scheme == "https",\n',e.insecure&&(t+="require 'openssl'\n",h+="  verify_mode: OpenSSL::SSL::VERIFY_NONE,\n");return h+="}\n",h+="\n",h+="response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|\n",h+="  http.request(request)\n",t+"\n"+(h+="end\n")+r}(c):function(e){var n="";return n+='uri = URI.parse("'+l(e.url)+'")\n',t+"\n"+(n+="response = Net::HTTP.get_response(uri)\n")+r}(c)}function l(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}}r.d(t,"default",function(){return a})},function(e,t,r){"use strict";e.exports=e=>encodeURIComponent(e).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)},function(e,t,r){"use strict";var n=new RegExp("%[a-f0-9]{2}","gi"),o=new RegExp("(%[a-f0-9]{2})+","gi");function s(e,t){try{return decodeURIComponent(e.join(""))}catch(e){}if(1===e.length)return e;t=t||1;var r=e.slice(0,t),n=e.slice(t);return Array.prototype.concat.call([],s(r),s(n))}function i(e){try{return decodeURIComponent(e)}catch(o){for(var t=e.match(n),r=1;r<t.length;r++)t=(e=s(t,r).join("")).match(n);return e}}e.exports=function(e){if("string"!=typeof e)throw new TypeError("Expected `encodedURI` to be of type `string`, got `"+typeof e+"`");try{return e=e.replace(/\+/g," "),decodeURIComponent(e)}catch(t){return function(e){for(var t={"%FE%FF":"��","%FF%FE":"��"},r=o.exec(e);r;){try{t[r[0]]=decodeURIComponent(r[0])}catch(e){var n=i(r[0]);n!==r[0]&&(t[r[0]]=n)}r=o.exec(e)}t["%C2"]="�";for(var s=Object.keys(t),a=0;a<s.length;a++){var u=s[a];e=e.replace(new RegExp(u,"g"),t[u])}return e}(e)}}},function(e,t,r){"use strict";e.exports=(e,t)=>{if("string"!=typeof e||"string"!=typeof t)throw new TypeError("Expected the arguments to be of type `string`");if(""===t)return[e];const r=e.indexOf(t);return-1===r?[e]:[e.slice(0,r),e.slice(r+t.length)]}},,,function(e,t,r){r(9)},function(e,t,r){(function(t){e.exports=t.curlToRuby=r(2)}).call(this,r(10))},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r}]);

================================================
FILE: resources/js/default.js
================================================
!function(e){var n={};function t(r){if(n[r])return n[r].exports;var a=n[r]={i:r,l:!1,exports:{}};return e[r].call(a.exports,a,a.exports,t),a.l=!0,a.exports}t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:r})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,n){if(1&n&&(e=t(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(t.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var a in e)t.d(r,a,function(n){return e[n]}.bind(null,a));return r},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="",t(t.s=11)}([function(e,n,t){"use strict";const r=t(3),a=t(4),s=t(5);function i(e,n){return n.encode?n.strict?r(e):encodeURIComponent(e):e}function o(e,n){return n.decode?a(e):e}function c(e){const n=e.indexOf("#");return-1!==n&&(e=e.slice(0,n)),e}function u(e){const n=(e=c(e)).indexOf("?");return-1===n?"":e.slice(n+1)}function l(e,n){const t=function(e){let n;switch(e.arrayFormat){case"index":return(e,t,r)=>{n=/\[(\d*)\]$/.exec(e),e=e.replace(/\[\d*\]$/,""),n?(void 0===r[e]&&(r[e]={}),r[e][n[1]]=t):r[e]=t};case"bracket":return(e,t,r)=>{n=/(\[\])$/.exec(e),e=e.replace(/\[\]$/,""),n?void 0!==r[e]?r[e]=[].concat(r[e],t):r[e]=[t]:r[e]=t};case"comma":return(e,n,t)=>{const r="string"==typeof n&&n.split("").indexOf(",")>-1?n.split(","):n;t[e]=r};default:return(e,n,t)=>{void 0!==t[e]?t[e]=[].concat(t[e],n):t[e]=n}}}(n=Object.assign({decode:!0,sort:!0,arrayFormat:"none",parseNumbers:!1,parseBooleans:!1},n)),r=Object.create(null);if("string"!=typeof e)return r;if(!(e=e.trim().replace(/^[?#&]/,"")))return r;for(const a of e.split("&")){let[e,i]=s(a.replace(/\+/g," "),"=");i=void 0===i?null:o(i,n),n.parseNumbers&&!Number.isNaN(Number(i))&&"string"==typeof i&&""!==i.trim()?i=Number(i):!n.parseBooleans||null===i||"true"!==i.toLowerCase()&&"false"!==i.toLowerCase()||(i="true"===i.toLowerCase()),t(o(e,n),i,r)}return!1===n.sort?r:(!0===n.sort?Object.keys(r).sort():Object.keys(r).sort(n.sort)).reduce((e,n)=>{const t=r[n];return Boolean(t)&&"object"==typeof t&&!Array.isArray(t)?e[n]=function e(n){return Array.isArray(n)?n.sort():"object"==typeof n?e(Object.keys(n)).sort((e,n)=>Number(e)-Number(n)).map(e=>n[e]):n}(t):e[n]=t,e},Object.create(null))}n.extract=u,n.parse=l,n.stringify=(e,n)=>{if(!e)return"";const t=function(e){switch(e.arrayFormat){case"index":return n=>(t,r)=>{const a=t.length;return void 0===r?t:null===r?[...t,[i(n,e),"[",a,"]"].join("")]:[...t,[i(n,e),"[",i(a,e),"]=",i(r,e)].join("")]};case"bracket":return n=>(t,r)=>void 0===r?t:null===r?[...t,[i(n,e),"[]"].join("")]:[...t,[i(n,e),"[]=",i(r,e)].join("")];case"comma":return n=>(t,r,a)=>null==r||0===r.length?t:0===a?[[i(n,e),"=",i(r,e)].join("")]:[[t,i(r,e)].join(",")];default:return n=>(t,r)=>void 0===r?t:null===r?[...t,i(n,e)]:[...t,[i(n,e),"=",i(r,e)].join("")]}}(n=Object.assign({encode:!0,strict:!0,arrayFormat:"none"},n)),r=Object.keys(e);return!1!==n.sort&&r.sort(n.sort),r.map(r=>{const a=e[r];return void 0===a?"":null===a?i(r,n):Array.isArray(a)?a.reduce(t(r),[]).join("&"):i(r,n)+"="+i(a,n)}).filter(e=>e.length>0).join("&")},n.parseUrl=(e,n)=>({url:c(e).split("?")[0]||"",query:l(u(e),n)})},function(e,n){n.quote=function(e){return e.map(function(e){return e&&"object"==typeof e?e.op.replace(/(.)/g,"\\$1"):/["\s]/.test(e)&&!/'/.test(e)?"'"+e.replace(/(['\\])/g,"\\$1")+"'":/["'\s]/.test(e)?'"'+e.replace(/(["\\$`!])/g,"\\$1")+'"':e=(e=String(e).replace(/([A-z]:)?([#!"$&'()*,:;<=>?@\[\\\]^`{|}])/g,"$1\\$2")).replace(/\\\\/g,"\\")}).join(" ")};for(var t="(?:"+["\\|\\|","\\&\\&",";;","\\|\\&","\\<\\(",">>",">\\&","[&;()|<>]"].join("|")+")",r="(\\\\['\"|&;()<> \\t]|[^\\s'\"|&;()<> \\t])+",a='"((\\\\"|[^"])*?)"',s="'((\\\\'|[^'])*?)'",i="",o=0;o<4;o++)i+=(Math.pow(16,8)*Math.random()).toString(16);n.parse=function(e,n,o){var c=function(e,n,o){var c=new RegExp(["("+t+")","("+r+"|"+a+"|"+s+")*"].join("|"),"g"),u=e.match(c).filter(Boolean),l=!1;if(!u)return[];n||(n={});o||(o={});return u.map(function(e,r){if(!l){if(RegExp("^"+t+"$").test(e))return{op:e};for(var a=o.escape||"\\",s=!1,c=!1,d="",f=!1,g=0,p=e.length;g<p;g++){var b=e.charAt(g);if(f=f||!s&&("*"===b||"?"===b),c)d+=b,c=!1;else if(s)b===s?s=!1:"'"==s?d+=b:b===a?(g+=1,d+='"'===(b=e.charAt(g))||b===a||"$"===b?b:a+b):d+="$"===b?h():b;else if('"'===b||"'"===b)s=b;else{if(RegExp("^"+t+"$").test(b))return{op:e};if(RegExp("^#$").test(b))return l=!0,d.length?[d,{comment:e.slice(g+1)+u.slice(r+1).join(" ")}]:[{comment:e.slice(g+1)+u.slice(r+1).join(" ")}];b===a?c=!0:d+="$"===b?h():b}}return f?{op:"glob",pattern:d}:d}function h(){var t,r;if(g+=1,"{"===e.charAt(g)){if(g+=1,"}"===e.charAt(g))throw new Error("Bad substitution: "+e.substr(g-2,3));if((t=e.indexOf("}",g))<0)throw new Error("Bad substitution: "+e.substr(g));r=e.substr(g,t-g),g=t}else/[*@#?$!_\-]/.test(e.charAt(g))?(r=e.charAt(g),g+=1):(t=e.substr(g).match(/[^\w\d_]/))?(r=e.substr(g,t.index),g+=t.index-1):(r=e.substr(g),g=e.length);return function(e,t,r){var a="function"==typeof n?n(r):n[r];void 0===a&&""!=r?a="":void 0===a&&(a="$");return"object"==typeof a?t+i+JSON.stringify(a)+i:t+a}(0,"",r)}}).reduce(function(e,n){return void 0===n?e:e.concat(n)},[])}(e,n,o);return"function"!=typeof n?c:c.reduce(function(e,n){if("object"==typeof n)return e.concat(n);var t=n.split(RegExp("("+i+".*?"+i+")","g"));return 1===t.length?e.concat(t[0]):e.concat(t.filter(Boolean).map(function(e){return RegExp("^"+i).test(e)?JSON.parse(e.split(i)[1]):e}))},[])}},function(e,n,t){"use strict";t.r(n);var r=t(0),a=t.n(r);function s(e){return(s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var i=t(1);function o(e){var n="require 'net/http'\nrequire 'uri'\n",t="\n# response.code\n# response.body\n",r={COPY:"Copy",DELETE:"Delete",GET:"Get",HEAD:"Head",LOCK:"Lock",MKCOL:"Mkcol",MoVE:"Move",OPTIONS:"Options",PATCH:"Patch",POST:"Post",PROPFIND:"Propfind",PROPPATCH:"Proppatch",PUT:"Put",TRACE:"Trace",UNLOCK:"Unlock"},o=/^([^\s]+=[^\s]+)(&[^\s]+=[^\s]+)*$/;if(e.trim()){var c=function(e,n){void 0===n&&(n={}),e=(e=e.replace(/\\\n/g,"")).trim();var t=Object(i.parse)(e),r={_:[]};function a(e,n){r[e]||(r[e]=[]),r[e].push(n)}for(;t.length;){var s=t.shift();if("glob"==s.op&&(s=s.pattern),"-"==s[0]){if("-"==(s=s.substring(1,s.length))[0])if(o(s=s.substring(1,s.length)))r[s]=!0;else if(s.indexOf("=")>0)a(s.substring(0,s.indexOf("=")),s.substring(s.indexOf("=")+1,s.length));else a(s,t.shift());else o(s)?r[s]=!0:s.length>1?a(s[0],s.substring(1,s.length)):a(s[0],t.shift());o(s)&&(r[s]=!0)}else a("_",s)}return r;function o(e){if(Array.isArray(n.boolFlags))for(var t=0;t<n.boolFlags.length;t++)if(n.boolFlags[t]==e)return!0;return!1}}(e,{boolFlags:["#","progress-bar","-","next","0","http1.0","http1.1","http2","no-npn","no-alpn","1","tlsv1","2","sslv2","3","sslv3","4","ipv4","6","ipv6","a","append","anyauth","B","use-ascii","basic","compressed","create-dirs","crlf","digest","disable-eprt","disable-epsv","environment","cert-status","false-start","f","fail","ftp-create-dirs","ftp-pasv","ftp-skip-pasv-ip","ftp-pret","ftp-ssl-ccc","ftp-ssl-control","g","globoff","G","get","ignore-content-length","i","include","I","head","j","junk-session-cookies","J","remote-header-name","k","insecure","l","list-only","L","location","location-trusted","metalink","n","netrc","N","no-buffer","netrc-file","netrc-optional","negotiate","no-keepalive","no-sessionid","ntlm","O","remote-name","oauth2-bearer","p","proxy-tunnel","path-as-is","post301","post302","post303","proxy-anyauth","proxy-basic","proxy-digest","proxy-negotiate","proxy-ntlm","q","raw","remote-name-all","s","silent","sasl-ir","S","show-error","ssl","ssl-reqd","ssl-allow-beast","ssl-no-revoke","socks5-gssapi-nec","tcp-nodelay","tlsv1.0","tlsv1.1","tlsv1.2","tr-encoding","trace-time","v","verbose","xattr","h","help","M","manual","V","version"]});if("curl"!=c._[0])throw"Not a curl command";var u=function(e){var n={url:"",method:"",headers:[],data:{}};e.url&&e.url.length>0?n.url=e.url[0]:e._.length>1&&(n.url=e._[1]);n.url=function(e){return e&&!new RegExp("^https?://","i").test(e)?"http://"+e:e}(n.url),e.H&&(n.headers=n.headers.concat(e.H));e.header&&(n.headers=n.headers.concat(e.header));(e.I||e.head)&&(n.method="HEAD");e.request&&e.request.length>0?n.method=e.request[e.request.length-1].toUpperCase():e.X&&e.X.length>0&&(n.method=e.X[e.X.length-1].toUpperCase());var t=[],r=[],a=function(e){n.method||(n.method="POST");for(var a=0;a<e.length;a++)e[a].length>0&&"@"==e[a][0]?r.push(e[a].substr(1)):t.push(e[a])};e.d&&a(e.d);e.data&&a(e.data);e["data-binary"]&&a(e["data-binary"]);t.length>0&&(n.data.ascii=t.join("&"));r.length>0&&(n.data.files=r);var s="";e.user&&e.user.length>0?s=e.user[e.user.length-1]:e.u&&e.u.length>0&&(s=e.u[e.u.length-1]);var i=s.indexOf(":");i>-1?n.basicauth={user:s.substr(0,i),pass:s.substr(i+1)}:n.basicAuth={user:s,pass:"<PASSWORD>"};(e.k||e.insecure)&&(n.insecure=!0);n.method||(n.method="GET");return n}(c);return 0!=u.headers.length||"GET"!=u.method||u.data.ascii||u.data.files||u.basicauth||u.insecure?function(e){for(var i={},c=0;c<e.headers.length;c++){var u=e.headers[c].indexOf(":");if(-1!=u){var d=e.headers[c].substr(0,u).trim(),f=e.headers[c].substr(u+1).trim();i[(g=d,g.replace(/\w*/g,function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}))]=f}}var g;delete i["Accept-Encoding"];var p="";p+='uri = URI.parse("'+l(e.url)+'")\n',r[e.method]?p+="request = Net::HTTP::"+r[e.method]+".new(uri)\n":p+='request = Net::HTTPGenericRequest.new("'+l(e.method)+'", false, false, uri)\n';e.basicauth&&(p+='request.basic_auth("'+l(e.basicauth.user)+'", "'+l(e.basicauth.pass)+'")\n');i["Content-Type"]&&(p+='request.content_type = "'+l(i["Content-Type"])+'"\n',delete i["Content-Type"]);for(var d in i)p+='request["'+l(d)+'"] = "'+l(i[d])+'"\n';if(e.data.ascii)if(function(e){try{return JSON.parse(e),!0}catch(e){return!1}}(e.data.ascii)){var b=JSON.parse(e.data.ascii);n+="require 'json'\n",p+="request.body = JSON.dump("+function e(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=s(n);if(null==n)return"nil";if("boolean"==r)return n.toString();if("number"==r)return n.toString();if("string"==r)return'"'+n.toString()+'"';if(Array.isArray(n)){var a="[\n";return n.forEach(function(n){a+=t+"  ",a+=e(n,t+"  "),a+=",\n"}),a=a.slice(0,-2),a+="\n"+t+"]"}if("object"==r){var i="{\n";for(var o in n)i+=t+"  ",i+=e(o),i+=" => ",i+=e(n[o],t+"  "),i+=",\n";return i=i.slice(0,-2),i+="\n"+t+"}"}throw"Invalid JSON object"}(b)+")\n"}else if(o.test(e.data.ascii)){var h=a.a.parse(e.data.ascii);for(var d in p+="request.set_form_data(\n",h){var m=h[d];p+='  "'.concat(l(d),'" => "').concat(l(m),'",\n')}p+=")\n"}else p+='request.body = "'+l(e.data.ascii)+'"\n';if(e.data.files&&e.data.files.length>0){e.data.ascii||(p+='request.body = ""\n');for(c=0;c<e.data.files.length;c++)p+='request.body << File.read("'+l(e.data.files[c])+'").delete("\\r\\n")\n'}p+="\n",p+="req_options = {\n",p+='  use_ssl: uri.scheme == "https",\n',e.insecure&&(n+="require 'openssl'\n",p+="  verify_mode: OpenSSL::SSL::VERIFY_NONE,\n");return p+="}\n",p+="\n",p+="response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|\n",p+="  http.request(request)\n",n+"\n"+(p+="end\n")+t}(u):function(e){var r="";return r+='uri = URI.parse("'+l(e.url)+'")\n',n+"\n"+(r+="response = Net::HTTP.get_response(uri)\n")+t}(u)}function l(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}}t.d(n,"default",function(){return o})},function(e,n,t){"use strict";e.exports=e=>encodeURIComponent(e).replace(/[!'()*]/g,e=>`%${e.charCodeAt(0).toString(16).toUpperCase()}`)},function(e,n,t){"use strict";var r=new RegExp("%[a-f0-9]{2}","gi"),a=new RegExp("(%[a-f0-9]{2})+","gi");function s(e,n){try{return decodeURIComponent(e.join(""))}catch(e){}if(1===e.length)return e;n=n||1;var t=e.slice(0,n),r=e.slice(n);return Array.prototype.concat.call([],s(t),s(r))}function i(e){try{return decodeURIComponent(e)}catch(a){for(var n=e.match(r),t=1;t<n.length;t++)n=(e=s(n,t).join("")).match(r);return e}}e.exports=function(e){if("string"!=typeof e)throw new TypeError("Expected `encodedURI` to be of type `string`, got `"+typeof e+"`");try{return e=e.replace(/\+/g," "),decodeURIComponent(e)}catch(n){return function(e){for(var n={"%FE%FF":"��","%FF%FE":"��"},t=a.exec(e);t;){try{n[t[0]]=decodeURIComponent(t[0])}catch(e){var r=i(t[0]);r!==t[0]&&(n[t[0]]=r)}t=a.exec(e)}n["%C2"]="�";for(var s=Object.keys(n),o=0;o<s.length;o++){var c=s[o];e=e.replace(new RegExp(c,"g"),n[c])}return e}(e)}}},function(e,n,t){"use strict";e.exports=(e,n)=>{if("string"!=typeof e||"string"!=typeof n)throw new TypeError("Expected the arguments to be of type `string`");if(""===n)return[e];const t=e.indexOf(n);return-1===t?[e]:[e.slice(0,t),e.slice(t+n.length)]}},function(e,n,t){var r,a,s;a=function(e){var n,t=[],r=Object.keys,a={},s={},i=/^(no-?highlight|plain|text)$/i,o=/\blang(?:uage)?-([\w-]+)\b/i,c=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,u="</span>",l={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};function d(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function f(e){return e.nodeName.toLowerCase()}function g(e,n){var t=e&&e.exec(n);return t&&0===t.index}function p(e){return i.test(e)}function b(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function h(e){var n=[];return function e(t,r){for(var a=t.firstChild;a;a=a.nextSibling)3===a.nodeType?r+=a.nodeValue.length:1===a.nodeType&&(n.push({event:"start",offset:r,node:a}),r=e(a,r),f(a).match(/br|hr|img|input/)||n.push({event:"stop",offset:r,node:a}));return r}(e,0),n}function m(e){if(n&&!e.langApiRestored){for(var t in e.langApiRestored=!0,n)e[t]&&(e[n[t]]=e[t]);(e.contains||[]).concat(e.variants||[]).forEach(m)}}function v(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.case_insensitive?"i":"")+(r?"g":""))}!function a(s,i){if(!s.compiled){if(s.compiled=!0,s.keywords=s.keywords||s.beginKeywords,s.keywords){var o={},c=function(n,t){e.case_insensitive&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof s.keywords?c("keyword",s.keywords):r(s.keywords).forEach(function(e){c(e,s.keywords[e])}),s.keywords=o}s.lexemesRe=t(s.lexemes||/\w+/,!0),i&&(s.beginKeywords&&(s.begin="\\b("+s.beginKeywords.split(" ").join("|")+")\\b"),s.begin||(s.begin=/\B|\b/),s.beginRe=t(s.begin),s.endSameAsBegin&&(s.end=s.begin),s.end||s.endsWithParent||(s.end=/\B|\b/),s.end&&(s.endRe=t(s.end)),s.terminator_end=n(s.end)||"",s.endsWithParent&&i.terminator_end&&(s.terminator_end+=(s.end?"|":"")+i.terminator_end)),s.illegal&&(s.illegalRe=t(s.illegal)),null==s.relevance&&(s.relevance=1),s.contains||(s.contains=[]),s.contains=Array.prototype.concat.apply([],s.contains.map(function(e){return function(e){return e.variants&&!e.cached_variants&&(e.cached_variants=e.variants.map(function(n){return b(e,{variants:null},n)})),e.cached_variants||e.endsWithParent&&[b(e)]||[e]}("self"===e?s:e)})),s.contains.forEach(function(e){a(e,s)}),s.starts&&a(s.starts,i);var u=s.contains.map(function(e){return e.beginKeywords?"\\.?(?:"+e.begin+")\\.?":e.begin}).concat([s.terminator_end,s.illegal]).map(n).filter(Boolean);s.terminators=u.length?t(function(e,t){for(var r=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,a=0,s="",i=0;i<e.length;i++){var o=a,c=n(e[i]);for(i>0&&(s+=t);c.length>0;){var u=r.exec(c);if(null==u){s+=c;break}s+=c.substring(0,u.index),c=c.substring(u.index+u[0].length),"\\"==u[0][0]&&u[1]?s+="\\"+String(Number(u[1])+o):(s+=u[0],"("==u[0]&&a++)}}return s}(u,"|"),!0):{exec:function(){return null}}}}(e)}function E(e,n,t,r){function s(e){return new RegExp(e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&"),"m")}function i(e,n){var t=b.case_insensitive?n[0].toLowerCase():n[0];return e.keywords.hasOwnProperty(t)&&e.keywords[t]}function o(e,n,t,r){var a='<span class="'+(r?"":l.classPrefix);return e?(a+=e+'">')+n+(t?"":u):n}function c(){w+=null!=m.subLanguage?function(){var e="string"==typeof m.subLanguage;if(e&&!a[m.subLanguage])return d(N);var n=e?E(m.subLanguage,N,!0,_[m.subLanguage]):y(N,m.subLanguage.length?m.subLanguage:void 0);return m.relevance>0&&(x+=n.relevance),e&&(_[m.subLanguage]=n.top),o(n.language,n.value,!1,!0)}():function(){var e,n,t,r;if(!m.keywords)return d(N);for(r="",n=0,m.lexemesRe.lastIndex=0,t=m.lexemesRe.exec(N);t;)r+=d(N.substring(n,t.index)),(e=i(m,t))?(x+=e[1],r+=o(e[0],d(t[0]))):r+=d(t[0]),n=m.lexemesRe.lastIndex,t=m.lexemesRe.exec(N);return r+d(N.substr(n))}(),N=""}function f(e){w+=e.className?o(e.className,"",!0):"",m=Object.create(e,{parent:{value:m}})}function p(e,n){if(N+=e,null==n)return c(),0;var r=function(e,n){var t,r;for(t=0,r=n.contains.length;t<r;t++)if(g(n.contains[t].beginRe,e))return n.contains[t].endSameAsBegin&&(n.contains[t].endRe=s(n.contains[t].beginRe.exec(e)[0])),n.contains[t]}(n,m);if(r)return r.skip?N+=n:(r.excludeBegin&&(N+=n),c(),r.returnBegin||r.excludeBegin||(N=n)),f(r),r.returnBegin?0:n.length;var a=function e(n,t){if(g(n.endRe,t)){for(;n.endsParent&&n.parent;)n=n.parent;return n}if(n.endsWithParent)return e(n.parent,t)}(m,n);if(a){var i=m;i.skip?N+=n:(i.returnEnd||i.excludeEnd||(N+=n),c(),i.excludeEnd&&(N=n));do{m.className&&(w+=u),m.skip||m.subLanguage||(x+=m.relevance),m=m.parent}while(m!==a.parent);return a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),f(a.starts)),i.returnEnd?0:n.length}if(function(e,n){return!t&&g(n.illegalRe,e)}(n,m))throw new Error('Illegal lexeme "'+n+'" for mode "'+(m.className||"<unnamed>")+'"');return N+=n,n.length||1}var b=R(e);if(!b)throw new Error('Unknown language: "'+e+'"');v(b);var h,m=r||b,_={},w="";for(h=m;h!==b;h=h.parent)h.className&&(w=o(h.className,"",!0)+w);var N="",x=0;try{for(var O,S,A=0;m.terminators.lastIndex=A,O=m.terminators.exec(n);)S=p(n.substring(A,O.index),O[0]),A=O.index+S;for(p(n.substr(A)),h=m;h.parent;h=h.parent)h.className&&(w+=u);return{relevance:x,value:w,language:e,top:m}}catch(e){if(e.message&&-1!==e.message.indexOf("Illegal"))return{relevance:0,value:d(n)};throw e}}function y(e,n){n=n||l.languages||r(a);var t={relevance:0,value:d(e)},s=t;return n.filter(R).filter(x).forEach(function(n){var r=E(n,e,!1);r.language=n,r.relevance>s.relevance&&(s=r),r.relevance>t.relevance&&(s=t,t=r)}),s.language&&(t.second_best=s),t}function _(e){return l.tabReplace||l.useBR?e.replace(c,function(e,n){return l.useBR&&"\n"===e?"<br>":l.tabReplace?n.replace(/\t/g,l.tabReplace):""}):e}function w(e){var n,r,a,i,c,u=function(e){var n,t,r,a,s=e.className+" ";if(s+=e.parentNode?e.parentNode.className:"",t=o.exec(s))return R(t[1])?t[1]:"no-highlight";for(n=0,r=(s=s.split(/\s+/)).length;n<r;n++)if(p(a=s[n])||R(a))return a}(e);p(u)||(l.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=e.innerHTML.replace(/\n/g,"").replace(/<br[ \/]*>/g,"\n"):n=e,c=n.textContent,a=u?E(u,c,!0):y(c),(r=h(n)).length&&((i=document.createElementNS("http://www.w3.org/1999/xhtml","div")).innerHTML=a.value,a.value=function(e,n,r){var a=0,s="",i=[];function o(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:"start"===n[0].event?e:n:e.length?e:n}function c(e){s+="<"+f(e)+t.map.call(e.attributes,function(e){return" "+e.nodeName+'="'+d(e.value).replace('"',"&quot;")+'"'}).join("")+">"}function u(e){s+="</"+f(e)+">"}function l(e){("start"===e.event?c:u)(e.node)}for(;e.length||n.length;){var g=o();if(s+=d(r.substring(a,g[0].offset)),a=g[0].offset,g===e){i.reverse().forEach(u);do{l(g.splice(0,1)[0]),g=o()}while(g===e&&g.length&&g[0].offset===a);i.reverse().forEach(c)}else"start"===g[0].event?i.push(g[0].node):i.pop(),l(g.splice(0,1)[0])}return s+d(r.substr(a))}(r,h(i),c)),a.value=_(a.value),e.innerHTML=a.value,e.className=function(e,n,t){var r=n?s[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}(e.className,u,a.language),e.result={language:a.language,re:a.relevance},a.second_best&&(e.second_best={language:a.second_best.language,re:a.second_best.relevance}))}function N(){if(!N.called){N.called=!0;var e=document.querySelectorAll("pre code");t.forEach.call(e,w)}}function R(e){return e=(e||"").toLowerCase(),a[e]||a[s[e]]}function x(e){var n=R(e);return n&&!n.disableAutodetect}return e.highlight=E,e.highlightAuto=y,e.fixMarkup=_,e.highlightBlock=w,e.configure=function(e){l=b(l,e)},e.initHighlighting=N,e.initHighlightingOnLoad=function(){addEventListener("DOMContentLoaded",N,!1),addEventListener("load",N,!1)},e.registerLanguage=function(n,t){var r=a[n]=t(e);m(r),r.aliases&&r.aliases.forEach(function(e){s[e]=n})},e.listLanguages=function(){return r(a)},e.getLanguage=R,e.autoDetection=x,e.inherit=b,e.IDENT_RE="[a-zA-Z]\\w*",e.UNDERSCORE_IDENT_RE="[a-zA-Z_]\\w*",e.NUMBER_RE="\\b\\d+(\\.\\d+)?",e.C_NUMBER_RE="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BINARY_NUMBER_RE="\\b(0b[01]+)",e.RE_STARTERS_RE="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BACKSLASH_ESCAPE={begin:"\\\\[\\s\\S]",relevance:0},e.APOS_STRING_MODE={className:"string",begin:"'",end:"'",illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},e.QUOTE_STRING_MODE={className:"string",begin:'"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},e.PHRASAL_WORDS_MODE={begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.COMMENT=function(n,t,r){var a=e.inherit({className:"comment",begin:n,end:t,contains:[]},r||{});return a.contains.push(e.PHRASAL_WORDS_MODE),a.contains.push({className:"doctag",begin:"(?:TODO|FIXME|NOTE|BUG|XXX):",relevance:0}),a},e.C_LINE_COMMENT_MODE=e.COMMENT("//","$"),e.C_BLOCK_COMMENT_MODE=e.COMMENT("/\\*","\\*/"),e.HASH_COMMENT_MODE=e.COMMENT("#","$"),e.NUMBER_MODE={className:"number",begin:e.NUMBER_RE,relevance:0},e.C_NUMBER_MODE={className:"number",begin:e.C_NUMBER_RE,relevance:0},e.BINARY_NUMBER_MODE={className:"number",begin:e.BINARY_NUMBER_RE,relevance:0},e.CSS_NUMBER_MODE={className:"number",begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",relevance:0},e.REGEXP_MODE={className:"regexp",begin:/\//,end:/\/[gimuy]*/,illegal:/\n/,contains:[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0,contains:[e.BACKSLASH_ESCAPE]}]},e.TITLE_MODE={className:"title",begin:e.IDENT_RE,relevance:0},e.UNDERSCORE_TITLE_MODE={className:"title",begin:e.UNDERSCORE_IDENT_RE,relevance:0},e.METHOD_GUARD={begin:"\\.\\s*"+e.UNDERSCORE_IDENT_RE,relevance:0},e},s="object"==typeof window&&window||"object"==typeof self&&self,n.nodeType?s&&(s.hljs=a({}),void 0===(r=function(){return s.hljs}.apply(n,[]))||(e.exports=r)):a(n)},function(e,n){e.exports=function(e){var n="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",t={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},r={className:"doctag",begin:"@[A-Za-z]+"},a={begin:"#<",end:">"},s=[e.COMMENT("#","$",{contains:[r]}),e.COMMENT("^\\=begin","^\\=end",{contains:[r],relevance:10}),e.COMMENT("^__END__","\\n$")],i={className:"subst",begin:"#\\{",end:"}",keywords:t},o={className:"string",contains:[e.BACKSLASH_ESCAPE,i],variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{begin:"%[qQwWx]?\\(",end:"\\)"},{begin:"%[qQwWx]?\\[",end:"\\]"},{begin:"%[qQwWx]?{",end:"}"},{begin:"%[qQwWx]?<",end:">"},{begin:"%[qQwWx]?/",end:"/"},{begin:"%[qQwWx]?%",end:"%"},{begin:"%[qQwWx]?-",end:"-"},{begin:"%[qQwWx]?\\|",end:"\\|"},{begin:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{begin:/<<(-?)\w+$/,end:/^\s*\w+$/}]},c={className:"params",begin:"\\(",end:"\\)",endsParent:!0,keywords:t},u=[o,a,{className:"class",beginKeywords:"class module",end:"$|;",illegal:/=/,contains:[e.inherit(e.TITLE_MODE,{begin:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{begin:"<\\s*",contains:[{begin:"("+e.IDENT_RE+"::)?"+e.IDENT_RE}]}].concat(s)},{className:"function",beginKeywords:"def",end:"$|;",contains:[e.inherit(e.TITLE_MODE,{begin:n}),c].concat(s)},{begin:e.IDENT_RE+"::"},{className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"(\\!|\\?)?:",relevance:0},{className:"symbol",begin:":(?!\\s)",contains:[o,{begin:n}],relevance:0},{className:"number",begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",relevance:0},{begin:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{className:"params",begin:/\|/,end:/\|/,keywords:t},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*",keywords:"unless",contains:[a,{className:"regexp",contains:[e.BACKSLASH_ESCAPE,i],illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:"%r{",end:"}[a-z]*"},{begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[",end:"\\][a-z]*"}]}].concat(s),relevance:0}].concat(s);i.contains=u,c.contains=u;var l=[{begin:/^\s*=>/,starts:{end:"$",contains:u}},{className:"meta",begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+>|(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>)",starts:{end:"$",contains:u}}];return{aliases:["rb","gemspec","podspec","thor","irb"],keywords:t,illegal:/\/\*/,contains:s.concat(l).concat(u)}}},,,,function(e,n,t){"use strict";t.r(n);var r=t(2),a=t(6),s=t.n(a),i=t(7),o=t.n(i);s.a.registerLanguage("ruby",o.a);var c=s.a;function u(){var e='<span style="color: #777;">Ruby code will appear here</span>';function n(){var n=document.getElementById("input").value;document.getElementById("output").innerHTML=function(n){if(!n)return e;try{var t=Object(r.default)(n);if(t)return c.highlight("ruby",t).value}catch(e){return console.log(e),'<span class="clr-red">'+e+"</span>"}}(n)}["focus","blur","keyup"].forEach(function(e){document.getElementById("input").addEventListener(e,n)}),n(),document.getElementById("output").addEventListener("click",function(){if(document.selection){var e=document.body.createTextRange();e.moveToElementText(this),e.select()}else if(window.getSelection){var n=document.createRange();n.selectNode(this),window.getSelection().addRange(n)}}),window.useExample=function(e){var t=document.getElementById(e).innerHTML.trim();document.getElementById("input").value=t,n()}}"loading"!=document.readyState?u():document.addEventListener("DOMContentLoaded",u)}]);

================================================
FILE: src/curl-to-ruby.js
================================================
require("expose-loader?curlToRuby!./curlToRuby");


================================================
FILE: src/curlToRuby.js
================================================
/*
	curl-to-ruby

	A simple utility to convert curl commands into ruby code.

	Based on curl-to-go by Matt Holt
	https://github.com/mholt/curl-to-go
*/

import queryString from 'query-string';
import jsonToRuby from './jsonToRuby';
import parseCommand from "./parseCommand";

export default function curlToRuby(curl) {
	var prelude = "require 'net/http'\nrequire 'uri'\n";
	var coda = "\n" +
		"# response.code\n" +
		"# response.body\n";

	// List of curl flags that are boolean typed; this helps with parsing
	// a command like `curl -abc value` to know whether 'value' belongs to '-c'
	// or is just a positional argument instead.
	var boolOptions = ['#', 'progress-bar', '-', 'next', '0', 'http1.0', 'http1.1', 'http2',
		'no-npn', 'no-alpn', '1', 'tlsv1', '2', 'sslv2', '3', 'sslv3', '4', 'ipv4', '6', 'ipv6',
		'a', 'append', 'anyauth', 'B', 'use-ascii', 'basic', 'compressed', 'create-dirs',
		'crlf', 'digest', 'disable-eprt', 'disable-epsv', 'environment', 'cert-status',
		'false-start', 'f', 'fail', 'ftp-create-dirs', 'ftp-pasv', 'ftp-skip-pasv-ip',
		'ftp-pret', 'ftp-ssl-ccc', 'ftp-ssl-control', 'g', 'globoff', 'G', 'get',
		'ignore-content-length', 'i', 'include', 'I', 'head', 'j', 'junk-session-cookies',
		'J', 'remote-header-name', 'k', 'insecure', 'l', 'list-only', 'L', 'location',
		'location-trusted', 'metalink', 'n', 'netrc', 'N', 'no-buffer', 'netrc-file',
		'netrc-optional', 'negotiate', 'no-keepalive', 'no-sessionid', 'ntlm', 'O',
		'remote-name', 'oauth2-bearer', 'p', 'proxy-tunnel', 'path-as-is', 'post301', 'post302',
		'post303', 'proxy-anyauth', 'proxy-basic', 'proxy-digest', 'proxy-negotiate',
		'proxy-ntlm', 'q', 'raw', 'remote-name-all', 's', 'silent', 'sasl-ir', 'S', 'show-error',
		'ssl', 'ssl-reqd', 'ssl-allow-beast', 'ssl-no-revoke', 'socks5-gssapi-nec', 'tcp-nodelay',
		'tlsv1.0', 'tlsv1.1', 'tlsv1.2', 'tr-encoding', 'trace-time', 'v', 'verbose', 'xattr',
		'h', 'help', 'M', 'manual', 'V', 'version'];

	var httpMethods = {
	 'COPY':      'Copy',
	 'DELETE':    'Delete',
	 'GET':       'Get',
	 'HEAD':      'Head',
	 'LOCK':      'Lock',
	 'MKCOL':     'Mkcol',
	 'MoVE':      'Move',
	 'OPTIONS':   'Options',
	 'PATCH':     'Patch',
	 'POST':      'Post',
	 'PROPFIND':  'Propfind',
	 'PROPPATCH': 'Proppatch',
	 'PUT':       'Put',
	 'TRACE':     'Trace',
	 'UNLOCK':    'Unlock'
	};

	let formUrlEncodedRegex = /^([^\s]+=[^\s]+)(&[^\s]+=[^\s]+)*$/;

	if (!curl.trim())
		return;
	var cmd = parseCommand(curl, { boolFlags: boolOptions });

	if (cmd._[0] != "curl")
		throw "Not a curl command";

	var req = extractRelevantPieces(cmd);

	if (isSimple(req)) {
		return renderSimple(req);
	} else {
	 	return renderComplex(req);
	}


	// renderSimple renders a simple HTTP request using net/http convenience methods
	function renderSimple(req) {
		var ruby = "";

		ruby += 'uri = URI.parse("' + rubyEsc(req.url) + '")\n';
		ruby += 'response = Net::HTTP.get_response(uri)\n';

		return prelude + "\n" + ruby + coda;
	}

	// renderComplex renders Go code that requires making a http.Request.
	function renderComplex(req) {
		// First, figure out the headers
		var headers = {};
		for (var i = 0; i < req.headers.length; i++) {
			var split = req.headers[i].indexOf(":");
			if (split == -1) continue;
			var name = req.headers[i].substr(0, split).trim();
			var value = req.headers[i].substr(split+1).trim();
			headers[toTitleCase(name)] = value;
		}

		delete headers["Accept-Encoding"];

		var ruby = "";

		ruby += 'uri = URI.parse("' + rubyEsc(req.url) + '")\n';

		if (httpMethods[req.method]) {
			ruby += 'request = Net::HTTP::'+httpMethods[req.method]+'.new(uri)\n';
		} else {
			ruby += 'request = Net::HTTPGenericRequest.new("' + rubyEsc(req.method) + '", false, false, uri)\n';
		}

		// set basic auth
		if (req.basicauth) {
			ruby += 'request.basic_auth("'+rubyEsc(req.basicauth.user)+'", "'+rubyEsc(req.basicauth.pass)+'")\n';
		}

		if (headers["Content-Type"]) {
			ruby += 'request.content_type = "' + rubyEsc(headers["Content-Type"]) + '"\n';
			delete(headers["Content-Type"]);
		}

		// set headers
		for (var name in headers) {
			ruby += 'request["'+rubyEsc(name)+'"] = "'+rubyEsc(headers[name])+'"\n';
		}

		function isJson(json) {
			try {
				JSON.parse(json);
				return true;
			} catch (e) {
				return false;
			}
		}

		if (req.data.ascii) {
			if (isJson(req.data.ascii)) {
				let json = JSON.parse(req.data.ascii);
				prelude += "require 'json'\n";
				ruby += "request.body = JSON.dump(" + jsonToRuby(json) + ")\n";
			} else if (formUrlEncodedRegex.test(req.data.ascii)) {
				let formData = queryString.parse(req.data.ascii);
				ruby += "request.set_form_data(\n";
				for(var name in formData) {
					let value = formData[name];
					ruby += `  "${rubyEsc(name)}" => "${rubyEsc(value)}",\n`
				}
				ruby += ")\n";
			} else {
				ruby += 'request.body = "' + rubyEsc(req.data.ascii) + '"\n';
			}
		}

		if (req.data.files && req.data.files.length > 0) {
			if (!req.data.ascii) {
				ruby += 'request.body = ""\n';
			}

			for (var i = 0; i < req.data.files.length; i++) {
				ruby += 'request.body << File.read("'+rubyEsc(req.data.files[i])+'").delete("\\r\\n")\n';
			}
		}

		ruby += '\n'
		ruby += 'req_options = {\n'
		ruby += '  use_ssl: uri.scheme == "https",\n'
		if (req.insecure) {
		prelude += "require 'openssl'\n"
		ruby += '  verify_mode: OpenSSL::SSL::VERIFY_NONE,\n'
		}
		ruby += '}\n'

		ruby += '\n'
		ruby += 'response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|\n'
		ruby += '  http.request(request)\n'
		ruby += 'end\n'

		return prelude + "\n" + ruby + coda;
	}

	// extractRelevantPieces returns an object with relevant pieces
	// extracted from cmd, the parsed command. This accounts for
	// multiple flags that do the same thing and return structured
	// data that makes it easy to spit out Go code.
	function extractRelevantPieces(cmd) {
		var relevant = {
			url: "",
			method: "",
			headers: [],
			data: {}
		};

		// prefer --url over unnamed parameter, if it exists; keep first one only
		if (cmd.url && cmd.url.length > 0)
			relevant.url = cmd.url[0];
		else if (cmd._.length > 1)
			relevant.url = cmd._[1]; // position 1 because index 0 is the curl command itself

		relevant.url = fixUrl(relevant.url);

		// gather the headers together
		if (cmd.H)
			relevant.headers = relevant.headers.concat(cmd.H);
		if (cmd.header)
			relevant.headers = relevant.headers.concat(cmd.header);

		// set method to HEAD?
		if (cmd.I || cmd.head)
			relevant.method = "HEAD";

		// between -X and --request, prefer the long form I guess
		if (cmd.request && cmd.request.length > 0)
			relevant.method = cmd.request[cmd.request.length-1].toUpperCase();
		else if (cmd.X && cmd.X.length > 0)
			relevant.method = cmd.X[cmd.X.length-1].toUpperCase(); // if multiple, use last (according to curl docs)

		// join multiple request body data, if any
		var dataAscii = [];
		var dataFiles = [];
		var loadData = function(d) {
			if (!relevant.method)
				relevant.method = "POST";
			for (var i = 0; i < d.length; i++)
			{
				if (d[i].length > 0 && d[i][0] == "@")
					dataFiles.push(d[i].substr(1));
				else
					dataAscii.push(d[i]);
			}
		};
		if (cmd.d)
			loadData(cmd.d);
		if (cmd.data)
			loadData(cmd.data);
		if (cmd['data-binary'])
			loadData(cmd['data-binary']);
		if (dataAscii.length > 0)
			relevant.data.ascii = dataAscii.join("&");
		if (dataFiles.length > 0)
			relevant.data.files = dataFiles;

		// between -u and --user, choose the long form...
		var basicAuthString = "";
		if (cmd.user && cmd.user.length > 0)
			basicAuthString = cmd.user[cmd.user.length-1];
		else if (cmd.u && cmd.u.length > 0)
			basicAuthString = cmd.u[cmd.u.length-1];
		var basicAuthSplit = basicAuthString.indexOf(":");
		if (basicAuthSplit > -1) {
			relevant.basicauth = {
				user: basicAuthString.substr(0, basicAuthSplit),
				pass: basicAuthString.substr(basicAuthSplit+1)
			};
		} else {
			relevant.basicAuth = { user: basicAuthString, pass: "<PASSWORD>" };
		}

		if (cmd.k || cmd.insecure) {
			relevant.insecure = true;
		}

		// default to GET if nothing else specified
		if (!relevant.method)
			relevant.method = "GET";

		return relevant;
	}

	function fixUrl(url) {
		if(url && !(new RegExp("^https?://", "i")).test(url)) {
			return "http://" +  url;
		} else {
			return url;
		}
	}

	function toTitleCase(str) {
		return str.replace(/\w*/g, function(txt) {
			return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
		});
	}

	function rubyEsc(s) {
		return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
	}

	function isSimple() {
		return req.headers.length == 0 && 
			req.method == "GET" && 
			!req.data.ascii && 
			!req.data.files && 
			!req.basicauth &&
			!req.insecure;
	}
}


================================================
FILE: src/default.js
================================================
import curlToRuby from "./curlToRuby";
import hljs from "./highlight.pack.js";

function init() {
  const emptyOutputMsg = "Ruby code will appear here";
  const formattedEmptyOutputMsg = '<span style="color: #777;">'+emptyOutputMsg+'</span>';

  function getOutputHTML(input) {
    if (!input) {
      return formattedEmptyOutputMsg;
    }

    try {
      const output = curlToRuby(input);
      if (output) {
	const coloredOutput = hljs.highlight("ruby", output);
	return coloredOutput.value;
      }
    } catch (e) {
      console.log(e);
      return '<span class="clr-red">'+e+'</span>';
    }
  }

  function updateOutput() {
    const input = document.getElementById('input').value;
    const output = document.getElementById('output');

    output.innerHTML = getOutputHTML(input);
  }

  // Update placeholder text
  ['focus', 'blur', 'keyup'].forEach((ev) => {
    document.getElementById('input').addEventListener(ev, updateOutput);
  });
  updateOutput();

  // Highlights the output for the user
  document.getElementById('output').addEventListener('click', function() {
    if (document.selection) {
      const range = document.body.createTextRange();
      range.moveToElementText(this);
      range.select();
    } else if (window.getSelection) {
      const range = document.createRange();
      range.selectNode(this);
      window.getSelection().addRange(range);
    }
  });

  window.useExample = function(name) {
    const example = document.getElementById(name).innerHTML.trim();
    const input = document.getElementById('input');
    input.value = example;
    updateOutput();
  }
}

if (document.readyState != 'loading'){
  init();
} else {
  document.addEventListener('DOMContentLoaded', init);
}


================================================
FILE: src/highlight.pack.js
================================================
import hljs from "highlight.js/lib/highlight";
import ruby from "highlight.js/lib/languages/ruby";

hljs.registerLanguage('ruby', ruby);

export default hljs;


================================================
FILE: src/jsonToRuby.js
================================================
export default function jsonToRuby(json, indent = "") {
	let type = typeof(json);
	if (json == null) {
		return "nil";
	} else if (type == "boolean") {
		return json.toString();
	} else if (type == "number") {
		return json.toString();
	} else if (type == "string") {
		return '"' + json.toString() + '"';
	} else if (Array.isArray(json)) {
		let ret = "[\n";
		json.forEach((element) => {
			ret += indent + "  ";
			ret += jsonToRuby(element, indent + "  ");
			ret += ",\n";
		});
		ret = ret.slice(0, -2);
		ret += "\n" + indent + "]";
		return ret;
	} else if (type == "object") {
		let ret = "{\n";
		for (var key in json) {
			ret += indent + "  ";
			ret += jsonToRuby(key);
			ret += " => ";
			ret += jsonToRuby(json[key], indent + "  ");
			ret += ",\n";
		}
		ret = ret.slice(0, -2);
		ret += "\n" + indent + "}";
		return ret;
	} else {
		throw "Invalid JSON object";
	}
}


================================================
FILE: src/parseCommand.js
================================================
import {parse} from "shell-quote";

export default function parseCommand(input, options) {
  if (typeof options === 'undefined') {
    options = {};
  }

  // trim \ at and of line
  input = input.replace(/\\\n/g, '');
  input = input.trim();

  let argv = parse(input);

  let argObj = {_: []};

  function setFlag(name, value) {
    argObj[name] || (argObj[name] = []);
    argObj[name].push(value);
  }

  while(argv.length) {
    let flag = argv.shift();

    /* Assume globs are typos/missing qutotes/shell-quote sillyness w */
    if (flag.op == 'glob') {
      flag = flag.pattern;
    }

    if (flag[0] == '-'){
      flag = flag.substring(1, flag.length);
      if (flag[0] == '-') { /* long argument */
	flag = flag.substring(1, flag.length);
	if (boolFlag(flag)) {
	  argObj[flag] = true;
	} else {
	  if (flag.indexOf('=') > 0) {
	    let flagName = flag.substring(0, flag.indexOf('='));
	    setFlag(flagName, flag.substring(flag.indexOf('=')+1, flag.length));
	  } else {
	    setFlag(flag, argv.shift());
	  }
	}
      } else {
	if (boolFlag(flag)) {
	  argObj[flag] = true;
	} else if(flag.length > 1) {
	  setFlag(flag[0], flag.substring(1, flag.length));
	} else {
	  setFlag(flag[0], argv.shift());
	}
      }
      if (boolFlag(flag)) {
	argObj[flag] = true;
      }
    } else {
      setFlag('_', flag);
    }
  }

  return argObj;

  // boolFlag returns whether a flag is known to be boolean type
  function boolFlag(flag) {
    if (Array.isArray(options.boolFlags)) {
      for (var i = 0; i < options.boolFlags.length; i++) {
	if (options.boolFlags[i] == flag)
	  return true;
      }
    }
    return false;
  }
}


================================================
FILE: test.rb
================================================
require 'minitest'
require 'minitest/autorun'
require 'execjs'
require 'webrick'

class TestCurlToGo < Minitest::Test
  JS_CONTEXT = ExecJS.compile(File.read("resources/js/curl-to-ruby.js"))

  def test_simple_get
    assert_curl_eq "/"
    assert_curl_eq "/foo.txt"
  end

  def test_post
    assert_curl_eq "/", '-X POST -d "foo"'
    assert_curl_eq "/", '-X POST -d "foobar"'
  end

  def test_headers
    assert_curl_eq "/", '-XPOST -H MyCrazyHeader:foo -d "foo"'
  end

  def test_basic_auth
    assert_curl_eq "/", "-u banana:coconuts"
  end

  def test_complex_post
    assert_curl_eq "/", <<-CURL
     -X POST \
     -u API_KEY: \
     -d 'shipment[to_address][id]=adr_HrBKVA85' \
     -d 'shipment[from_address][id]=adr_VtuTOj7o' \
     -d 'shipment[parcel][id]=prcl_WDv2VzHp' \
     -d 'shipment[is_return]=true' \
     -d 'shipment[customs_info][id]=cstinfo_bl5sE20Y'
     CURL
  end

  def test_simple_data
    assert_curl_eq "/", "-d foo=bar"
  end

  def test_data_file_reference
    assert_curl_eq "/", "-d @README.md"
  end

  def test_query_string
    assert_curl_eq "/curl-to-ruby/?foo=bar", "-d @README.md"
  end

  private

  def assert_curl_eq(path, curl_args="")
    curl_req = normalize_request capture_http { |url|
      system "curl -s -o /dev/null #{url}#{path} #{curl_args}"
    }

    ruby_req = normalize_request capture_http { |url|
      ruby = curl_to_ruby("curl #{url}#{path} #{curl_args}")
      eval(ruby)
    }

    assert_equal curl_req.verb, ruby_req.verb
    assert_equal curl_req.path, ruby_req.path
    if curl_req.body.nil?
      assert_nil ruby_req.body
    else
      assert_equal curl_req.body, ruby_req.body
    end
    assert_equal curl_req.headers, ruby_req.headers
  end

  Request = Struct.new(:verb, :path, :headers, :body)

  def curl_to_ruby(cmd)
    JS_CONTEXT.call("curlToRuby.default", cmd)
  end

  def normalize_request(original)
    headers = original.headers.dup
    headers.delete("accept-encoding")
    headers.delete("user-agent")
    headers.delete("host")
    headers.delete("expect")

    if original.body
      body = original.body
      if headers['content-type'] == ['application/x-www-form-urlencoded']
        # May encode slightly differently
        begin
          body = URI.decode_www_form(body).sort
          headers.delete("content-length")
        rescue ArgumentError
        end
      end
    end

    Request.new(
      original.verb,
      original.path,
      headers,
      body
    )
  end

  def capture_http
    server = WEBrick::HTTPServer.new(
      Port: 0,
      Logger: WEBrick::Log.new("/dev/null"),
      AccessLog: []
    )
    port = server[:Port]
    request = nil

    thread = Thread.new do
      server.mount_proc('/') do |req, res|
        request = Request.new(
          req.request_method,
          req.path,
          req.header,
          req.body
        )
        res.body = "hello, world"
        server.shutdown
      end

      server.start

      request
    end

    url = "http://127.0.0.1:#{port}"
    yield url, port

    thread.join
    thread.value
  end
end


================================================
FILE: webpack.config.js
================================================
"use strict";

var path = require('path');
var webpack = require('webpack');

module.exports = {
  entry: {
    default: './src/default.js',
    "curl-to-ruby": './src/curl-to-ruby.js'
  },

  output: {
    path: path.join(__dirname, "resources/js/"),
    filename: "[name].js"
  },

  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env']
          }
        }
      }
    ]
  }
}
Download .txt
gitextract_7qxwwb6z/

├── .github/
│   └── workflows/
│       └── test.yml
├── .gitignore
├── Gemfile
├── LICENSE.txt
├── README.md
├── index.html
├── package.json
├── resources/
│   ├── css/
│   │   ├── color-brewer.css
│   │   └── common.css
│   └── js/
│       ├── curl-to-ruby.js
│       └── default.js
├── src/
│   ├── curl-to-ruby.js
│   ├── curlToRuby.js
│   ├── default.js
│   ├── highlight.pack.js
│   ├── jsonToRuby.js
│   └── parseCommand.js
├── test.rb
└── webpack.config.js
Download .txt
SYMBOL INDEX (55 symbols across 7 files)

FILE: resources/js/curl-to-ruby.js
  function r (line 1) | function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{...
  function i (line 1) | function i(e,t){return t.encode?t.strict?n(e):encodeURIComponent(e):e}
  function a (line 1) | function a(e,t){return t.decode?o(e):e}
  function u (line 1) | function u(e){const t=e.indexOf("#");return-1!==t&&(e=e.slice(0,t)),e}
  function c (line 1) | function c(e){const t=(e=u(e)).indexOf("?");return-1===t?"":e.slice(t+1)}
  function l (line 1) | function l(e,t){const r=function(e){let t;switch(e.arrayFormat){case"ind...
  function b (line 1) | function b(){var r,n;if(d+=1,"{"===e.charAt(d)){if(d+=1,"}"===e.charAt(d...
  function s (line 1) | function s(e){return(s="function"==typeof Symbol&&"symbol"==typeof Symbo...
  function a (line 1) | function a(e){var t="require 'net/http'\nrequire 'uri'\n",r="\n# respons...
  function s (line 1) | function s(e,t){try{return decodeURIComponent(e.join(""))}catch(e){}if(1...
  function i (line 1) | function i(e){try{return decodeURIComponent(e)}catch(o){for(var t=e.matc...

FILE: resources/js/default.js
  function t (line 1) | function t(r){if(n[r])return n[r].exports;var a=n[r]={i:r,l:!1,exports:{...
  function i (line 1) | function i(e,n){return n.encode?n.strict?r(e):encodeURIComponent(e):e}
  function o (line 1) | function o(e,n){return n.decode?a(e):e}
  function c (line 1) | function c(e){const n=e.indexOf("#");return-1!==n&&(e=e.slice(0,n)),e}
  function u (line 1) | function u(e){const n=(e=c(e)).indexOf("?");return-1===n?"":e.slice(n+1)}
  function l (line 1) | function l(e,n){const t=function(e){let n;switch(e.arrayFormat){case"ind...
  function h (line 1) | function h(){var t,r;if(g+=1,"{"===e.charAt(g)){if(g+=1,"}"===e.charAt(g...
  function s (line 1) | function s(e){return(s="function"==typeof Symbol&&"symbol"==typeof Symbo...
  function o (line 1) | function o(e){var n="require 'net/http'\nrequire 'uri'\n",t="\n# respons...
  function s (line 1) | function s(e,n){try{return decodeURIComponent(e.join(""))}catch(e){}if(1...
  function i (line 1) | function i(e){try{return decodeURIComponent(e)}catch(a){for(var n=e.matc...
  function d (line 1) | function d(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replac...
  function f (line 1) | function f(e){return e.nodeName.toLowerCase()}
  function g (line 1) | function g(e,n){var t=e&&e.exec(n);return t&&0===t.index}
  function p (line 1) | function p(e){return i.test(e)}
  function b (line 1) | function b(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n...
  function h (line 1) | function h(e){var n=[];return function e(t,r){for(var a=t.firstChild;a;a...
  function m (line 1) | function m(e){if(n&&!e.langApiRestored){for(var t in e.langApiRestored=!...
  function v (line 1) | function v(e){function n(e){return e&&e.source||e}function t(t,r){return...
  function E (line 1) | function E(e,n,t,r){function s(e){return new RegExp(e.replace(/[-\/\\^$*...
  function y (line 1) | function y(e,n){n=n||l.languages||r(a);var t={relevance:0,value:d(e)},s=...
  function _ (line 1) | function _(e){return l.tabReplace||l.useBR?e.replace(c,function(e,n){ret...
  function w (line 1) | function w(e){var n,r,a,i,c,u=function(e){var n,t,r,a,s=e.className+" ";...
  function N (line 1) | function N(){if(!N.called){N.called=!0;var e=document.querySelectorAll("...
  function R (line 1) | function R(e){return e=(e||"").toLowerCase(),a[e]||a[s[e]]}
  function x (line 1) | function x(e){var n=R(e);return n&&!n.disableAutodetect}
  function u (line 1) | function u(){var e='<span style="color: #777;">Ruby code will appear her...

FILE: src/curlToRuby.js
  function curlToRuby (line 14) | function curlToRuby(curl) {

FILE: src/default.js
  function init (line 4) | function init() {

FILE: src/jsonToRuby.js
  function jsonToRuby (line 1) | function jsonToRuby(json, indent = "") {

FILE: src/parseCommand.js
  function parseCommand (line 3) | function parseCommand(input, options) {

FILE: test.rb
  class TestCurlToGo (line 6) | class TestCurlToGo < Minitest::Test
    method test_simple_get (line 9) | def test_simple_get
    method test_post (line 14) | def test_post
    method test_headers (line 19) | def test_headers
    method test_basic_auth (line 23) | def test_basic_auth
    method test_complex_post (line 27) | def test_complex_post
    method test_simple_data (line 39) | def test_simple_data
    method test_data_file_reference (line 43) | def test_data_file_reference
    method test_query_string (line 47) | def test_query_string
    method assert_curl_eq (line 53) | def assert_curl_eq(path, curl_args="")
    method curl_to_ruby (line 75) | def curl_to_ruby(cmd)
    method normalize_request (line 79) | def normalize_request(original)
    method capture_http (line 106) | def capture_http
Condensed preview — 19 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (73K chars).
[
  {
    "path": ".github/workflows/test.yml",
    "chars": 620,
    "preview": "name: Test\n\non:\n  push:\n    branches:\n    - gh-pages\n  pull_request:\n    branches:\n    - gh-pages\n\njobs:\n  test:\n    run"
  },
  {
    "path": ".gitignore",
    "chars": 44,
    "preview": ".DS_Store\nThumbs.db\n_gitignore\nnode_modules\n"
  },
  {
    "path": "Gemfile",
    "chars": 90,
    "preview": "source 'https://rubygems.org'\ngem 'execjs'\ngem 'execjs-fastnode'\ngem 'minitest'\ngem 'pry'\n"
  },
  {
    "path": "LICENSE.txt",
    "chars": 1078,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2016 Matthew Holt\n\nPermission is hereby granted, free of charge, to any person obta"
  },
  {
    "path": "README.md",
    "chars": 1226,
    "preview": "curl-to-ruby\n============\n\ncurl-to-ruby is a tool to instantly convert [curl](http://curl.haxx.se) commands to ruby code"
  },
  {
    "path": "index.html",
    "chars": 3536,
    "preview": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>curl-to-ruby: Convert curl commands to ruby's net/http</title>\n    <meta char"
  },
  {
    "path": "package.json",
    "chars": 954,
    "preview": "{\n  \"name\": \"curl-to-ruby\",\n  \"version\": \"1.0.0\",\n  \"private\": true,\n  \"description\": \"curl-to-ruby ============\",\n  \"sc"
  },
  {
    "path": "resources/css/color-brewer.css",
    "chars": 883,
    "preview": "/*\n\nColorbrewer theme\nOriginal: https://github.com/mbostock/colorbrewer-theme (c) Mike Bostock <mike@ocks.org>\nPorted by"
  },
  {
    "path": "resources/css/common.css",
    "chars": 2131,
    "preview": "/*\n\tEric Meyer's Reset CSS v2.0\n\t\n\tNOTICE: This copy of the CSS reset has been modified\n\tto make main tag \"display: bloc"
  },
  {
    "path": "resources/js/curl-to-ruby.js",
    "chars": 13444,
    "preview": "!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.expo"
  },
  {
    "path": "resources/js/default.js",
    "chars": 26944,
    "preview": "!function(e){var n={};function t(r){if(n[r])return n[r].exports;var a=n[r]={i:r,l:!1,exports:{}};return e[r].call(a.expo"
  },
  {
    "path": "src/curl-to-ruby.js",
    "chars": 50,
    "preview": "require(\"expose-loader?curlToRuby!./curlToRuby\");\n"
  },
  {
    "path": "src/curlToRuby.js",
    "chars": 8759,
    "preview": "/*\n\tcurl-to-ruby\n\n\tA simple utility to convert curl commands into ruby code.\n\n\tBased on curl-to-go by Matt Holt\n\thttps:/"
  },
  {
    "path": "src/default.js",
    "chars": 1725,
    "preview": "import curlToRuby from \"./curlToRuby\";\nimport hljs from \"./highlight.pack.js\";\n\nfunction init() {\n  const emptyOutputMsg"
  },
  {
    "path": "src/highlight.pack.js",
    "chars": 159,
    "preview": "import hljs from \"highlight.js/lib/highlight\";\nimport ruby from \"highlight.js/lib/languages/ruby\";\n\nhljs.registerLanguag"
  },
  {
    "path": "src/jsonToRuby.js",
    "chars": 886,
    "preview": "export default function jsonToRuby(json, indent = \"\") {\n\tlet type = typeof(json);\n\tif (json == null) {\n\t\treturn \"nil\";\n\t"
  },
  {
    "path": "src/parseCommand.js",
    "chars": 1641,
    "preview": "import {parse} from \"shell-quote\";\n\nexport default function parseCommand(input, options) {\n  if (typeof options === 'und"
  },
  {
    "path": "test.rb",
    "chars": 3080,
    "preview": "require 'minitest'\nrequire 'minitest/autorun'\nrequire 'execjs'\nrequire 'webrick'\n\nclass TestCurlToGo < Minitest::Test\n  "
  },
  {
    "path": "webpack.config.js",
    "chars": 528,
    "preview": "\"use strict\";\n\nvar path = require('path');\nvar webpack = require('webpack');\n\nmodule.exports = {\n  entry: {\n    default:"
  }
]

About this extraction

This page contains the full source code of the jhawthorn/curl-to-ruby GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 19 files (66.2 KB), approximately 23.3k tokens, and a symbol index with 55 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!