├── .eslintrc.yml ├── .gitattributes ├── .github └── workflows │ └── ci.yml ├── .gitignore ├── .npmignore ├── .vscode └── settings.json ├── CHANGELOG.md ├── LICENSE ├── README.md ├── examples ├── ex1.js ├── ex2.js └── ex3.js ├── index.js ├── jsconfig.json ├── lib ├── opencpu.js ├── packages.js ├── rcall.js └── util.js ├── package-lock.json ├── package.json └── test ├── opencpu-config.js ├── packages-test.js └── raw-test.js /.eslintrc.yml: -------------------------------------------------------------------------------- 1 | root: true 2 | 3 | parserOptions: 4 | ecmaVersion: 8 5 | 6 | env: 7 | es6: true 8 | node: true 9 | 10 | extends: 11 | "eslint:recommended" 12 | 13 | rules: 14 | array-bracket-spacing: "error" 15 | array-callback-return: "error" 16 | arrow-body-style: ["error", "as-needed"] 17 | arrow-parens: ["error", "as-needed"] 18 | arrow-spacing: "error" 19 | indent: ["error", 4, {SwitchCase: 1}] 20 | block-spacing: "error" 21 | brace-style: ["error", "1tbs"] 22 | camelcase: "error" 23 | callback-return: ["error", ["cb", "callback", "next"]] 24 | class-methods-use-this: "error" 25 | comma-dangle: "error" 26 | comma-spacing: "error" 27 | comma-style: ["error", "last"] 28 | computed-property-spacing: "error" 29 | consistent-return: "error" 30 | curly: ["error", "all"] 31 | default-case: "error" 32 | dot-location: ["error", "property"] 33 | dot-notation: ["error", { allowKeywords: true }] 34 | eol-last: "error" 35 | eqeqeq: "error" 36 | func-call-spacing: "error" 37 | func-style: ["error", "declaration"] 38 | function-paren-newline: ["error", "consistent"] 39 | generator-star-spacing: "error" 40 | guard-for-in: "error" 41 | handle-callback-err: ["error", "err"] 42 | key-spacing: ["error", { beforeColon: false, afterColon: true }] 43 | keyword-spacing: "error" 44 | lines-around-comment: ["error", { 45 | beforeBlockComment: true, 46 | afterBlockComment: false, 47 | beforeLineComment: true, 48 | afterLineComment: false 49 | }] 50 | max-len: ["error", 160, { 51 | "ignoreComments": true, 52 | "ignoreUrls": true, 53 | "ignoreStrings": true, 54 | "ignoreTemplateLiterals": true, 55 | "ignoreRegExpLiterals": true 56 | }] 57 | max-statements-per-line: "error" 58 | new-cap: "error" 59 | new-parens: "error" 60 | no-alert: "error" 61 | no-array-constructor: "error" 62 | no-async-promise-executor: "error" 63 | no-buffer-constructor: "error" 64 | no-caller: "error" 65 | no-confusing-arrow: "error" 66 | no-console: "error" 67 | no-delete-var: "error" 68 | no-else-return: ["error", { allowElseIf: false }] 69 | no-eval: "error" 70 | no-extend-native: "error" 71 | no-extra-bind: "error" 72 | no-fallthrough: "error" 73 | no-floating-decimal: "error" 74 | no-global-assign: "error" 75 | no-implied-eval: "error" 76 | no-invalid-this: "error" 77 | no-iterator: "error" 78 | no-label-var: "error" 79 | no-labels: "error" 80 | no-lone-blocks: "error" 81 | no-loop-func: "error" 82 | no-mixed-requires: "error" 83 | no-mixed-spaces-and-tabs: ["error", false] 84 | no-multi-spaces: "error" 85 | no-multi-str: "error" 86 | no-multiple-empty-lines: ["error", {max: 2, maxBOF: 0, maxEOF: 0}] 87 | no-nested-ternary: "error" 88 | no-new: "error" 89 | no-new-func: "error" 90 | no-new-object: "error" 91 | no-new-require: "error" 92 | no-new-wrappers: "error" 93 | no-octal: "error" 94 | no-octal-escape: "error" 95 | no-param-reassign: "error" 96 | no-path-concat: "error" 97 | no-process-exit: "error" 98 | no-proto: "error" 99 | no-prototype-builtins: "error" 100 | no-redeclare: "error" 101 | no-restricted-properties: [ 102 | "error", 103 | { property: "substring", message: "Use .slice instead of .substring." }, 104 | { property: "substr", message: "Use .slice instead of .substr." }, 105 | { object: "assert", property: "equal", message: "Use assert.strictEqual instead of assert.equal." }, 106 | { object: "assert", property: "notEqual", message: "Use assert.notStrictEqual instead of assert.notEqual." }, 107 | { object: "assert", property: "deepEqual", message: "Use assert.deepStrictEqual instead of assert.deepEqual." }, 108 | { object: "assert", property: "notDeepEqual", message: "Use assert.notDeepStrictEqual instead of assert.notDeepEqual." } 109 | ] 110 | no-return-assign: "error" 111 | no-script-url: "error" 112 | no-self-assign: "error" 113 | no-self-compare: "error" 114 | no-sequences: "error" 115 | no-shadow: "error" 116 | no-shadow-restricted-names: "error" 117 | no-tabs: "error" 118 | no-throw-literal: "error" 119 | no-trailing-spaces: "error" 120 | no-undef: ["error", {typeof: true}] 121 | no-undef-init: "error" 122 | no-undefined: "error" 123 | no-underscore-dangle: ["error", {allowAfterThis: true}] 124 | no-unmodified-loop-condition: "error" 125 | no-unneeded-ternary: "error" 126 | no-unused-expressions: "error" 127 | no-unused-vars: ["error", {vars: "all", args: "after-used"}] 128 | no-use-before-define: "error" 129 | no-useless-call: "error" 130 | no-useless-computed-key: "error" 131 | no-useless-concat: "error" 132 | no-useless-constructor: "error" 133 | no-useless-escape: "error" 134 | no-useless-rename: "error" 135 | no-useless-return: "error" 136 | no-whitespace-before-property: "error" 137 | no-with: "error" 138 | no-var: "error" 139 | object-curly-newline: ["error", { "consistent": true, "multiline": true }] 140 | object-curly-spacing: ["error", "always"] 141 | object-property-newline: ["error", { "allowAllPropertiesOnSameLine": true }] 142 | object-shorthand: "error" 143 | one-var-declaration-per-line: "error" 144 | operator-assignment: "error" 145 | operator-linebreak: "error" 146 | padding-line-between-statements: [ 147 | "error", 148 | { 149 | blankLine: "always", 150 | prev: ["const", "let", "var"], 151 | next: "*" 152 | }, 153 | { 154 | blankLine: "any", 155 | prev: ["const", "let", "var"], 156 | next: ["const", "let", "var"] 157 | } 158 | ] 159 | prefer-arrow-callback: "error" 160 | prefer-const: "error" 161 | prefer-numeric-literals: "error" 162 | prefer-promise-reject-errors: "error" 163 | prefer-rest-params: "error" 164 | prefer-spread: "error" 165 | prefer-template: "error" 166 | quotes: ["error", "double", {avoidEscape: true}] 167 | quote-props: ["error", "as-needed"] 168 | radix: "error" 169 | require-jsdoc: "off" 170 | rest-spread-spacing: "error" 171 | semi: "error" 172 | semi-spacing: ["error", {before: false, after: true}] 173 | semi-style: "error" 174 | space-before-blocks: "error" 175 | space-before-function-paren: ["error", "never"] 176 | space-in-parens: "error" 177 | space-infix-ops: "error" 178 | space-unary-ops: ["error", {words: true, nonwords: false}] 179 | spaced-comment: ["error", "always", { exceptions: ["-"]}] 180 | strict: ["error", "global"] 181 | switch-colon-spacing: "error" 182 | symbol-description: "error" 183 | template-curly-spacing: ["error", "never"] 184 | template-tag-spacing: "error" 185 | unicode-bom: "error" 186 | valid-jsdoc: ["error", { 187 | prefer: { "return": "returns"}, 188 | preferType: { 189 | "String": "string", 190 | "Number": "number", 191 | "Boolean": "boolean", 192 | "array": "Array", 193 | "object": "Object", 194 | "function": "Function" 195 | } 196 | }] 197 | wrap-iife: "error" 198 | yield-star-spacing: "error" 199 | yoda: ["error", "never"] 200 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | 8 | runs-on: windows-latest 9 | 10 | strategy: 11 | matrix: 12 | node-version: [10.x, 12.x] 13 | 14 | steps: 15 | - uses: actions/checkout@v1 16 | - name: Use Node.js ${{ matrix.node-version }} 17 | uses: actions/setup-node@v1 18 | with: 19 | node-version: ${{ matrix.node-version }} 20 | 21 | - name: npm install 22 | run: npm install 23 | 24 | - name: npm test 25 | run: npm test 26 | env: 27 | CI: true 28 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .git* 2 | examples/ 3 | test/ 4 | .travis.yml 5 | .vscode 6 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.exclude": { 3 | "node_modules": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 1.1.1 / 2018-12=20 2 | ================== 3 | 4 | * Allowing additional parameters for json call parse (thanks to @pilare). 5 | 6 | 1.1.0 / 2018-08-04 7 | ================== 8 | 9 | * Update the basecode to ES2015 standard. 10 | * Remove request package from deps anduse a custom util. 11 | * Update deps. 12 | 13 | 1.0.2 / 2017-11-09 14 | ================== 15 | 16 | * Update deps. 17 | 18 | 1.0.1 / 2017-07-16 19 | ================== 20 | 21 | * Update deps. 22 | 23 | 1.0.0 / 2016-01-30 24 | ================== 25 | 26 | * Refactor build and test workflow. 27 | * Update deps. 28 | 29 | 0.6.0 / 2015-09-12 30 | ================== 31 | 32 | * Added session support. 33 | 34 | 0.5.0 / 2015-06-26 35 | ================== 36 | 37 | * Updated OpenCPU 1.4.6. 38 | * Updated deps. 39 | 40 | 0.4.0 / 2014-04-20 41 | ================== 42 | 43 | * Updated OpenCPU 1.4.0. 44 | 45 | 0.3.0 / 2013-12-14 46 | ================== 47 | 48 | * Updated OpenCPU 1.2.0. 49 | 50 | 0.2.0 / 2013-08-29 51 | ================== 52 | 53 | * Added packages api. 54 | 55 | 0.1.1 / 2013-08-28 56 | ================== 57 | 58 | * Initial release contains always a few bugs. ;) Eventually the two examples 59 | work nice. 60 | 61 | 0.1.0 / 2013-08-28 62 | ================== 63 | 64 | * Initial release. 65 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 Alberto Santini https://github.com/albertosantini 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | 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, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | NODE-OPENCPU 2 | ============ 3 | 4 | [![NPM version](https://badge.fury.io/js/opencpu.svg)](http://badge.fury.io/js/opencpu) 5 | ![](https://github.com/albertosantini/node-opencpu/workflows/CI/badge.svg) 6 | 7 | node-opencpu is a [OpenCPU](https://public.opencpu.org/) client. 8 | 9 | Example 10 | ======== 11 | 12 | var opencpu = require("opencpu"); 13 | 14 | opencpu.rCall("/library/datasets/R/mtcars/json", {}, function (err, data) { 15 | if (!err) { 16 | console.log(data[0].mpg + data[1].mpg); // => 42 17 | } else { 18 | console.log("opencpu call failed."); 19 | } 20 | }); 21 | 22 | opencpu.rCall("/library/stats/R/rnorm/json", { 23 | n: 42, 24 | mean: 10, 25 | sd: 10 26 | }, function (err, data) { 27 | if (!err) { 28 | console.log(data.length); // => 42 29 | } else { 30 | console.log("opencpu call failed."); 31 | } 32 | }); 33 | 34 | Installation 35 | ============ 36 | 37 | To install with [npm](http://github.com/isaacs/npm): 38 | 39 | npm install opencpu 40 | 41 | Tested with Node.js 10.x and OpenCPU 2.0.5 (with R 3.4.1). 42 | 43 | Don't forget to start the opencpu server. For instance, from R console, after 44 | installing the package opencpu. The OpenCPU server will automatically be started 45 | when the opencpu package is attached. By default, the server starts at a random 46 | port. The default port used by `node-opencpu` is 5307. 47 | 48 | ``` 49 | > library(opencpu) 50 | ... 51 | Welcome to OpenCPU! 52 | > ocpu_start_server(5307) 53 | [2017-07-16 08:35:32] OpenCPU single-user server, version 2.0.3 54 | [2017-07-16 08:35:32] Starting 2 new worker(s). Preloading: opencpu, lattice, ggplot2 55 | [2017-07-16 08:35:33] READY to serve at: http://localhost:5307/ocpu 56 | [2017-07-16 08:35:33] Press ESC or CTRL+C to quit! 57 | ... 58 | ``` 59 | -------------------------------------------------------------------------------- /examples/ex1.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const opencpu = require("../lib/opencpu"); 4 | const { log } = require("../lib/util"); 5 | 6 | opencpu.rCall("/library/datasets/R/mtcars/json", {}, (err, data) => { 7 | if (!err) { 8 | log(data[0].mpg + data[1].mpg); // => 42 9 | } else { 10 | log("opencpu call failed:", err); 11 | } 12 | }); 13 | -------------------------------------------------------------------------------- /examples/ex2.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const opencpu = require("../lib/opencpu"); 4 | const { log } = require("../lib/util"); 5 | 6 | opencpu.rCall("/library/stats/R/rnorm/json", { 7 | n: 42, 8 | mean: 10, 9 | sd: 10 10 | }, (err, data) => { 11 | if (!err) { 12 | log(data.length); // => 42 13 | } else { 14 | log("opencpu call failed."); 15 | } 16 | }); 17 | -------------------------------------------------------------------------------- /examples/ex3.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const opencpu = require("../lib/opencpu"); 4 | const { log } = require("../lib/util"); 5 | 6 | opencpu.packages.getInfo("MASS", (err, data) => { 7 | if (!err) { 8 | log(data); 9 | } else { 10 | log("opencpu call failed."); 11 | } 12 | }); 13 | 14 | opencpu.packages.getExportedObjects("MASS", (err, data) => { 15 | if (!err) { 16 | log(data); 17 | } else { 18 | log("opencpu call failed."); 19 | } 20 | }); 21 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | module.exports = require("./lib/opencpu"); 4 | -------------------------------------------------------------------------------- /jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "checkJs": true, 4 | "target": "es2015", 5 | "moduleResolution": "node" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /lib/opencpu.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { rCall } = require("./rcall.js"); 4 | const { 5 | getInfo, 6 | getExportedObjects, 7 | getHelpPages, 8 | getHelpTopic, 9 | getHelpHtml, 10 | getPath 11 | } = require("./packages.js"); 12 | 13 | module.exports = { 14 | rCall, 15 | packages: { 16 | getInfo, 17 | getExportedObjects, 18 | getHelpPages, 19 | getHelpTopic, 20 | getHelpHtml, 21 | getPath 22 | } 23 | }; 24 | -------------------------------------------------------------------------------- /lib/packages.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const oc = require("./rcall"); 4 | 5 | // Avalaible libraries: 6 | // /cran/, /bioc/, /github/:gituser/, /gist/:gituser/ 7 | 8 | function getInfo(pack, callback, library, options) { 9 | const lib = library || "/library/"; 10 | 11 | oc.rCall(`${lib}${pack}/info/`, null, callback, options); 12 | } 13 | exports.getInfo = getInfo; 14 | 15 | function getExportedObjects(pack, callback, library, options) { 16 | const lib = library || "/library/"; 17 | 18 | oc.rCall(`${lib}${pack}/R/`, null, callback, options); 19 | } 20 | exports.getExportedObjects = getExportedObjects; 21 | 22 | function getHelpPages(pack, callback, library, options) { 23 | const lib = library || "/library/"; 24 | 25 | oc.rCall(`${lib}${pack}/man/`, null, callback, options); 26 | } 27 | exports.getHelpPages = getHelpPages; 28 | 29 | function getHelpTopic(pack, topic, callback, format, library, options) { 30 | const lib = library || "/library/"; 31 | const fmt = format || "/text/"; 32 | 33 | oc.rCall(`${lib}${pack}/man/${topic}${fmt}`, null, callback, options); 34 | } 35 | exports.getHelpTopic = getHelpTopic; 36 | 37 | function getHelpHtml(pack, callback, library, options) { 38 | const lib = library || "/library/"; 39 | 40 | oc.rCall(`${lib}${pack}/html/`, null, callback, options); 41 | } 42 | exports.getHelpHtml = getHelpHtml; 43 | 44 | function getPath(pack, path, callback, library, options) { 45 | const lib = library || "/library/"; 46 | 47 | oc.rCall(lib + pack + path, null, callback, options); 48 | } 49 | exports.getPath = getPath; 50 | -------------------------------------------------------------------------------- /lib/rcall.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { request } = require("./util"); 4 | 5 | function rCall(command, args, callback, { 6 | server = "http://localhost:5307", 7 | root = "/ocpu" 8 | } = {}) { 9 | const method = args ? "POST" : "GET"; 10 | const url = server + root + command; 11 | 12 | request({ 13 | url, 14 | method, 15 | body: args 16 | }, (err, response, data) => { 17 | const myErr = err || (response && (response.statusCode === 400 || 18 | response.statusCode === 502 || response.statusCode === 503) && 19 | response.statusCode); 20 | 21 | let myData = data; 22 | 23 | if (!myErr) { 24 | if (/json$/.test(url) || /json\?/.test(url)) { 25 | myData = JSON.parse(data); 26 | } 27 | if (/\/ocpu\/tmp/.test(data)) { 28 | myData = data.match("/ocpu/tmp/([a-z0-9]*)/")[1]; 29 | } 30 | } 31 | callback(myErr, myData); 32 | }); 33 | } 34 | exports.rCall = rCall; 35 | -------------------------------------------------------------------------------- /lib/util.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | function log(...args) { 4 | const now = new Date().toLocaleString("en-US", { 5 | month: "short", 6 | day: "2-digit", 7 | hour12: false, 8 | hour: "2-digit", 9 | minute: "2-digit", 10 | second: "2-digit" 11 | }); 12 | 13 | console.log(now, ...args); // eslint-disable-line no-console 14 | } 15 | 16 | function toBase64(str) { 17 | return Buffer.from(str || "", "utf8").toString("base64"); 18 | } 19 | 20 | const urlParse = require("url").parse; 21 | const https = require("https"); 22 | const http = require("http"); 23 | const querystring = require("querystring"); 24 | const EventEmitter = require("events"); 25 | const HttpsProxyAgent = require("https-proxy-agent"); 26 | 27 | function request({ 28 | url = "", 29 | method = "GET", 30 | headers = {}, 31 | body = null, 32 | qs = {} 33 | } = {}, callback) { 34 | const ee = new EventEmitter(); 35 | const reqUrl = urlParse(url); 36 | const isHttps = reqUrl.protocol === "https:"; 37 | const host = reqUrl.hostname; 38 | const port = reqUrl.port || (isHttps ? 443 : 80); 39 | const auth = reqUrl.auth; 40 | 41 | let path = reqUrl.path; 42 | 43 | if (method === "GET" && Object.keys(qs).length) { 44 | path += `?${querystring.stringify(qs)}`; 45 | } 46 | 47 | if (auth) { 48 | headers.Authorization = `Basic ${toBase64(auth)}`; 49 | } 50 | 51 | if (body) { 52 | headers["Content-Type"] = "application/json"; 53 | headers["Content-Length"] = JSON.stringify(body).length; 54 | } 55 | 56 | const requestOptions = { 57 | host, 58 | port, 59 | path, 60 | method, 61 | headers 62 | }; 63 | 64 | function requestResponse(res) { 65 | ee.emit("response"); 66 | 67 | res.setEncoding("utf8"); 68 | 69 | let rawData = ""; 70 | 71 | res.on("data", chunk => { 72 | ee.emit("data", chunk); 73 | 74 | rawData += chunk; 75 | }); 76 | 77 | res.on("end", () => callback(null, res, rawData)); 78 | } 79 | 80 | const proxy = process.env.https_proxy || process.env.http_proxy; 81 | 82 | if (proxy) { 83 | requestOptions.agent = new HttpsProxyAgent(proxy); 84 | } 85 | 86 | let req; 87 | 88 | if (isHttps) { 89 | req = https.request(requestOptions, requestResponse); 90 | } else { 91 | req = http.request(requestOptions, requestResponse); 92 | } 93 | 94 | req.on("error", err => callback(err)); 95 | 96 | if (body) { 97 | req.write(JSON.stringify(body)); 98 | } 99 | 100 | req.end(); 101 | 102 | return ee; 103 | } 104 | 105 | exports.log = log; 106 | exports.request = request; 107 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "opencpu", 3 | "version": "1.1.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.5.5", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", 10 | "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.0.0" 14 | } 15 | }, 16 | "@babel/highlight": { 17 | "version": "7.5.0", 18 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", 19 | "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", 20 | "dev": true, 21 | "requires": { 22 | "chalk": "^2.0.0", 23 | "esutils": "^2.0.2", 24 | "js-tokens": "^4.0.0" 25 | } 26 | }, 27 | "acorn": { 28 | "version": "7.1.1", 29 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", 30 | "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", 31 | "dev": true 32 | }, 33 | "acorn-jsx": { 34 | "version": "5.0.2", 35 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", 36 | "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", 37 | "dev": true 38 | }, 39 | "agent-base": { 40 | "version": "4.3.0", 41 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 42 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 43 | "requires": { 44 | "es6-promisify": "^5.0.0" 45 | } 46 | }, 47 | "ajv": { 48 | "version": "6.10.2", 49 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", 50 | "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", 51 | "dev": true, 52 | "requires": { 53 | "fast-deep-equal": "^2.0.1", 54 | "fast-json-stable-stringify": "^2.0.0", 55 | "json-schema-traverse": "^0.4.1", 56 | "uri-js": "^4.2.2" 57 | } 58 | }, 59 | "ansi-escapes": { 60 | "version": "3.2.0", 61 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 62 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", 63 | "dev": true 64 | }, 65 | "ansi-regex": { 66 | "version": "3.0.0", 67 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 68 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 69 | "dev": true 70 | }, 71 | "ansi-styles": { 72 | "version": "3.2.1", 73 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 74 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 75 | "dev": true, 76 | "requires": { 77 | "color-convert": "^1.9.0" 78 | } 79 | }, 80 | "argparse": { 81 | "version": "1.0.10", 82 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 83 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 84 | "dev": true, 85 | "requires": { 86 | "sprintf-js": "~1.0.2" 87 | } 88 | }, 89 | "astral-regex": { 90 | "version": "1.0.0", 91 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 92 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 93 | "dev": true 94 | }, 95 | "balanced-match": { 96 | "version": "1.0.0", 97 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 98 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 99 | "dev": true 100 | }, 101 | "brace-expansion": { 102 | "version": "1.1.11", 103 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 104 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 105 | "dev": true, 106 | "requires": { 107 | "balanced-match": "^1.0.0", 108 | "concat-map": "0.0.1" 109 | } 110 | }, 111 | "callsites": { 112 | "version": "3.1.0", 113 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 114 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 115 | "dev": true 116 | }, 117 | "chalk": { 118 | "version": "2.4.2", 119 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 120 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 121 | "dev": true, 122 | "requires": { 123 | "ansi-styles": "^3.2.1", 124 | "escape-string-regexp": "^1.0.5", 125 | "supports-color": "^5.3.0" 126 | } 127 | }, 128 | "chardet": { 129 | "version": "0.7.0", 130 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 131 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 132 | "dev": true 133 | }, 134 | "cli-cursor": { 135 | "version": "2.1.0", 136 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 137 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 138 | "dev": true, 139 | "requires": { 140 | "restore-cursor": "^2.0.0" 141 | } 142 | }, 143 | "cli-width": { 144 | "version": "2.2.0", 145 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 146 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 147 | "dev": true 148 | }, 149 | "color-convert": { 150 | "version": "1.9.3", 151 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 152 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 153 | "dev": true, 154 | "requires": { 155 | "color-name": "1.1.3" 156 | } 157 | }, 158 | "color-name": { 159 | "version": "1.1.3", 160 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 161 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 162 | "dev": true 163 | }, 164 | "concat-map": { 165 | "version": "0.0.1", 166 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 167 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 168 | "dev": true 169 | }, 170 | "cross-spawn": { 171 | "version": "6.0.5", 172 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 173 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 174 | "dev": true, 175 | "requires": { 176 | "nice-try": "^1.0.4", 177 | "path-key": "^2.0.1", 178 | "semver": "^5.5.0", 179 | "shebang-command": "^1.2.0", 180 | "which": "^1.2.9" 181 | }, 182 | "dependencies": { 183 | "semver": { 184 | "version": "5.7.1", 185 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 186 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 187 | "dev": true 188 | } 189 | } 190 | }, 191 | "debug": { 192 | "version": "4.1.1", 193 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 194 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 195 | "dev": true, 196 | "requires": { 197 | "ms": "^2.1.1" 198 | } 199 | }, 200 | "deep-equal": { 201 | "version": "1.0.1", 202 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 203 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", 204 | "dev": true 205 | }, 206 | "deep-is": { 207 | "version": "0.1.3", 208 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 209 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 210 | "dev": true 211 | }, 212 | "define-properties": { 213 | "version": "1.1.3", 214 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 215 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 216 | "dev": true, 217 | "requires": { 218 | "object-keys": "^1.0.12" 219 | } 220 | }, 221 | "defined": { 222 | "version": "1.0.0", 223 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 224 | "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", 225 | "dev": true 226 | }, 227 | "doctrine": { 228 | "version": "3.0.0", 229 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 230 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 231 | "dev": true, 232 | "requires": { 233 | "esutils": "^2.0.2" 234 | } 235 | }, 236 | "emoji-regex": { 237 | "version": "7.0.3", 238 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 239 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 240 | "dev": true 241 | }, 242 | "es-abstract": { 243 | "version": "1.13.0", 244 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", 245 | "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", 246 | "dev": true, 247 | "requires": { 248 | "es-to-primitive": "^1.2.0", 249 | "function-bind": "^1.1.1", 250 | "has": "^1.0.3", 251 | "is-callable": "^1.1.4", 252 | "is-regex": "^1.0.4", 253 | "object-keys": "^1.0.12" 254 | } 255 | }, 256 | "es-to-primitive": { 257 | "version": "1.2.0", 258 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 259 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 260 | "dev": true, 261 | "requires": { 262 | "is-callable": "^1.1.4", 263 | "is-date-object": "^1.0.1", 264 | "is-symbol": "^1.0.2" 265 | } 266 | }, 267 | "es6-promise": { 268 | "version": "4.2.8", 269 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 270 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" 271 | }, 272 | "es6-promisify": { 273 | "version": "5.0.0", 274 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 275 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 276 | "requires": { 277 | "es6-promise": "^4.0.3" 278 | } 279 | }, 280 | "escape-string-regexp": { 281 | "version": "1.0.5", 282 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 283 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 284 | "dev": true 285 | }, 286 | "eslint": { 287 | "version": "6.4.0", 288 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.4.0.tgz", 289 | "integrity": "sha512-WTVEzK3lSFoXUovDHEbkJqCVPEPwbhCq4trDktNI6ygs7aO41d4cDT0JFAT5MivzZeVLWlg7vHL+bgrQv/t3vA==", 290 | "dev": true, 291 | "requires": { 292 | "@babel/code-frame": "^7.0.0", 293 | "ajv": "^6.10.0", 294 | "chalk": "^2.1.0", 295 | "cross-spawn": "^6.0.5", 296 | "debug": "^4.0.1", 297 | "doctrine": "^3.0.0", 298 | "eslint-scope": "^5.0.0", 299 | "eslint-utils": "^1.4.2", 300 | "eslint-visitor-keys": "^1.1.0", 301 | "espree": "^6.1.1", 302 | "esquery": "^1.0.1", 303 | "esutils": "^2.0.2", 304 | "file-entry-cache": "^5.0.1", 305 | "functional-red-black-tree": "^1.0.1", 306 | "glob-parent": "^5.0.0", 307 | "globals": "^11.7.0", 308 | "ignore": "^4.0.6", 309 | "import-fresh": "^3.0.0", 310 | "imurmurhash": "^0.1.4", 311 | "inquirer": "^6.4.1", 312 | "is-glob": "^4.0.0", 313 | "js-yaml": "^3.13.1", 314 | "json-stable-stringify-without-jsonify": "^1.0.1", 315 | "levn": "^0.3.0", 316 | "lodash": "^4.17.14", 317 | "minimatch": "^3.0.4", 318 | "mkdirp": "^0.5.1", 319 | "natural-compare": "^1.4.0", 320 | "optionator": "^0.8.2", 321 | "progress": "^2.0.0", 322 | "regexpp": "^2.0.1", 323 | "semver": "^6.1.2", 324 | "strip-ansi": "^5.2.0", 325 | "strip-json-comments": "^3.0.1", 326 | "table": "^5.2.3", 327 | "text-table": "^0.2.0", 328 | "v8-compile-cache": "^2.0.3" 329 | } 330 | }, 331 | "eslint-scope": { 332 | "version": "5.0.0", 333 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", 334 | "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", 335 | "dev": true, 336 | "requires": { 337 | "esrecurse": "^4.1.0", 338 | "estraverse": "^4.1.1" 339 | } 340 | }, 341 | "eslint-utils": { 342 | "version": "1.4.2", 343 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", 344 | "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", 345 | "dev": true, 346 | "requires": { 347 | "eslint-visitor-keys": "^1.0.0" 348 | } 349 | }, 350 | "eslint-visitor-keys": { 351 | "version": "1.1.0", 352 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 353 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 354 | "dev": true 355 | }, 356 | "espree": { 357 | "version": "6.1.1", 358 | "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.1.tgz", 359 | "integrity": "sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==", 360 | "dev": true, 361 | "requires": { 362 | "acorn": "^7.0.0", 363 | "acorn-jsx": "^5.0.2", 364 | "eslint-visitor-keys": "^1.1.0" 365 | } 366 | }, 367 | "esprima": { 368 | "version": "4.0.1", 369 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 370 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 371 | "dev": true 372 | }, 373 | "esquery": { 374 | "version": "1.0.1", 375 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 376 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 377 | "dev": true, 378 | "requires": { 379 | "estraverse": "^4.0.0" 380 | } 381 | }, 382 | "esrecurse": { 383 | "version": "4.2.1", 384 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 385 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 386 | "dev": true, 387 | "requires": { 388 | "estraverse": "^4.1.0" 389 | } 390 | }, 391 | "estraverse": { 392 | "version": "4.3.0", 393 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 394 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 395 | "dev": true 396 | }, 397 | "esutils": { 398 | "version": "2.0.3", 399 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 400 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 401 | "dev": true 402 | }, 403 | "external-editor": { 404 | "version": "3.1.0", 405 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 406 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 407 | "dev": true, 408 | "requires": { 409 | "chardet": "^0.7.0", 410 | "iconv-lite": "^0.4.24", 411 | "tmp": "^0.0.33" 412 | } 413 | }, 414 | "fast-deep-equal": { 415 | "version": "2.0.1", 416 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 417 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 418 | "dev": true 419 | }, 420 | "fast-json-stable-stringify": { 421 | "version": "2.0.0", 422 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 423 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 424 | "dev": true 425 | }, 426 | "fast-levenshtein": { 427 | "version": "2.0.6", 428 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 429 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 430 | "dev": true 431 | }, 432 | "figures": { 433 | "version": "2.0.0", 434 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 435 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 436 | "dev": true, 437 | "requires": { 438 | "escape-string-regexp": "^1.0.5" 439 | } 440 | }, 441 | "file-entry-cache": { 442 | "version": "5.0.1", 443 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 444 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 445 | "dev": true, 446 | "requires": { 447 | "flat-cache": "^2.0.1" 448 | } 449 | }, 450 | "flat-cache": { 451 | "version": "2.0.1", 452 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 453 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 454 | "dev": true, 455 | "requires": { 456 | "flatted": "^2.0.0", 457 | "rimraf": "2.6.3", 458 | "write": "1.0.3" 459 | } 460 | }, 461 | "flatted": { 462 | "version": "2.0.1", 463 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", 464 | "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", 465 | "dev": true 466 | }, 467 | "for-each": { 468 | "version": "0.3.3", 469 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 470 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 471 | "dev": true, 472 | "requires": { 473 | "is-callable": "^1.1.3" 474 | } 475 | }, 476 | "fs.realpath": { 477 | "version": "1.0.0", 478 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 479 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 480 | "dev": true 481 | }, 482 | "function-bind": { 483 | "version": "1.1.1", 484 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 485 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 486 | "dev": true 487 | }, 488 | "functional-red-black-tree": { 489 | "version": "1.0.1", 490 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 491 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 492 | "dev": true 493 | }, 494 | "glob": { 495 | "version": "7.1.4", 496 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 497 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 498 | "dev": true, 499 | "requires": { 500 | "fs.realpath": "^1.0.0", 501 | "inflight": "^1.0.4", 502 | "inherits": "2", 503 | "minimatch": "^3.0.4", 504 | "once": "^1.3.0", 505 | "path-is-absolute": "^1.0.0" 506 | } 507 | }, 508 | "glob-parent": { 509 | "version": "5.1.0", 510 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz", 511 | "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==", 512 | "dev": true, 513 | "requires": { 514 | "is-glob": "^4.0.1" 515 | } 516 | }, 517 | "globals": { 518 | "version": "11.12.0", 519 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 520 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 521 | "dev": true 522 | }, 523 | "has": { 524 | "version": "1.0.3", 525 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 526 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 527 | "dev": true, 528 | "requires": { 529 | "function-bind": "^1.1.1" 530 | } 531 | }, 532 | "has-flag": { 533 | "version": "3.0.0", 534 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 535 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 536 | "dev": true 537 | }, 538 | "has-symbols": { 539 | "version": "1.0.0", 540 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 541 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 542 | "dev": true 543 | }, 544 | "https-proxy-agent": { 545 | "version": "2.2.2", 546 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", 547 | "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", 548 | "requires": { 549 | "agent-base": "^4.3.0", 550 | "debug": "^3.1.0" 551 | }, 552 | "dependencies": { 553 | "debug": { 554 | "version": "3.2.6", 555 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 556 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 557 | "requires": { 558 | "ms": "^2.1.1" 559 | } 560 | } 561 | } 562 | }, 563 | "iconv-lite": { 564 | "version": "0.4.24", 565 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 566 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 567 | "dev": true, 568 | "requires": { 569 | "safer-buffer": ">= 2.1.2 < 3" 570 | } 571 | }, 572 | "ignore": { 573 | "version": "4.0.6", 574 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 575 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 576 | "dev": true 577 | }, 578 | "import-fresh": { 579 | "version": "3.1.0", 580 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", 581 | "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", 582 | "dev": true, 583 | "requires": { 584 | "parent-module": "^1.0.0", 585 | "resolve-from": "^4.0.0" 586 | } 587 | }, 588 | "imurmurhash": { 589 | "version": "0.1.4", 590 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 591 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 592 | "dev": true 593 | }, 594 | "inflight": { 595 | "version": "1.0.6", 596 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 597 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 598 | "dev": true, 599 | "requires": { 600 | "once": "^1.3.0", 601 | "wrappy": "1" 602 | } 603 | }, 604 | "inherits": { 605 | "version": "2.0.4", 606 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 607 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 608 | "dev": true 609 | }, 610 | "inquirer": { 611 | "version": "6.5.2", 612 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", 613 | "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", 614 | "dev": true, 615 | "requires": { 616 | "ansi-escapes": "^3.2.0", 617 | "chalk": "^2.4.2", 618 | "cli-cursor": "^2.1.0", 619 | "cli-width": "^2.0.0", 620 | "external-editor": "^3.0.3", 621 | "figures": "^2.0.0", 622 | "lodash": "^4.17.12", 623 | "mute-stream": "0.0.7", 624 | "run-async": "^2.2.0", 625 | "rxjs": "^6.4.0", 626 | "string-width": "^2.1.0", 627 | "strip-ansi": "^5.1.0", 628 | "through": "^2.3.6" 629 | } 630 | }, 631 | "is-callable": { 632 | "version": "1.1.4", 633 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 634 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 635 | "dev": true 636 | }, 637 | "is-date-object": { 638 | "version": "1.0.1", 639 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 640 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 641 | "dev": true 642 | }, 643 | "is-extglob": { 644 | "version": "2.1.1", 645 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 646 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 647 | "dev": true 648 | }, 649 | "is-fullwidth-code-point": { 650 | "version": "2.0.0", 651 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 652 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 653 | "dev": true 654 | }, 655 | "is-glob": { 656 | "version": "4.0.1", 657 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 658 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 659 | "dev": true, 660 | "requires": { 661 | "is-extglob": "^2.1.1" 662 | } 663 | }, 664 | "is-promise": { 665 | "version": "2.1.0", 666 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 667 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 668 | "dev": true 669 | }, 670 | "is-regex": { 671 | "version": "1.0.4", 672 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 673 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 674 | "dev": true, 675 | "requires": { 676 | "has": "^1.0.1" 677 | } 678 | }, 679 | "is-symbol": { 680 | "version": "1.0.2", 681 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 682 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 683 | "dev": true, 684 | "requires": { 685 | "has-symbols": "^1.0.0" 686 | } 687 | }, 688 | "isexe": { 689 | "version": "2.0.0", 690 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 691 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 692 | "dev": true 693 | }, 694 | "js-tokens": { 695 | "version": "4.0.0", 696 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 697 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 698 | "dev": true 699 | }, 700 | "js-yaml": { 701 | "version": "3.13.1", 702 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 703 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 704 | "dev": true, 705 | "requires": { 706 | "argparse": "^1.0.7", 707 | "esprima": "^4.0.0" 708 | } 709 | }, 710 | "json-schema-traverse": { 711 | "version": "0.4.1", 712 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 713 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 714 | "dev": true 715 | }, 716 | "json-stable-stringify-without-jsonify": { 717 | "version": "1.0.1", 718 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 719 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 720 | "dev": true 721 | }, 722 | "levn": { 723 | "version": "0.3.0", 724 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 725 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 726 | "dev": true, 727 | "requires": { 728 | "prelude-ls": "~1.1.2", 729 | "type-check": "~0.3.2" 730 | } 731 | }, 732 | "lodash": { 733 | "version": "4.17.15", 734 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 735 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 736 | "dev": true 737 | }, 738 | "mimic-fn": { 739 | "version": "1.2.0", 740 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 741 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 742 | "dev": true 743 | }, 744 | "minimatch": { 745 | "version": "3.0.4", 746 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 747 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 748 | "dev": true, 749 | "requires": { 750 | "brace-expansion": "^1.1.7" 751 | } 752 | }, 753 | "minimist": { 754 | "version": "0.0.8", 755 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 756 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 757 | "dev": true 758 | }, 759 | "mkdirp": { 760 | "version": "0.5.1", 761 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 762 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 763 | "dev": true, 764 | "requires": { 765 | "minimist": "0.0.8" 766 | } 767 | }, 768 | "ms": { 769 | "version": "2.1.2", 770 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 771 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 772 | }, 773 | "mute-stream": { 774 | "version": "0.0.7", 775 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 776 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 777 | "dev": true 778 | }, 779 | "natural-compare": { 780 | "version": "1.4.0", 781 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 782 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 783 | "dev": true 784 | }, 785 | "nice-try": { 786 | "version": "1.0.5", 787 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 788 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 789 | "dev": true 790 | }, 791 | "object-inspect": { 792 | "version": "1.6.0", 793 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", 794 | "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", 795 | "dev": true 796 | }, 797 | "object-keys": { 798 | "version": "1.1.1", 799 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 800 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 801 | "dev": true 802 | }, 803 | "once": { 804 | "version": "1.4.0", 805 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 806 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 807 | "dev": true, 808 | "requires": { 809 | "wrappy": "1" 810 | } 811 | }, 812 | "onetime": { 813 | "version": "2.0.1", 814 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 815 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 816 | "dev": true, 817 | "requires": { 818 | "mimic-fn": "^1.0.0" 819 | } 820 | }, 821 | "optionator": { 822 | "version": "0.8.2", 823 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 824 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 825 | "dev": true, 826 | "requires": { 827 | "deep-is": "~0.1.3", 828 | "fast-levenshtein": "~2.0.4", 829 | "levn": "~0.3.0", 830 | "prelude-ls": "~1.1.2", 831 | "type-check": "~0.3.2", 832 | "wordwrap": "~1.0.0" 833 | } 834 | }, 835 | "os-tmpdir": { 836 | "version": "1.0.2", 837 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 838 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 839 | "dev": true 840 | }, 841 | "parent-module": { 842 | "version": "1.0.1", 843 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 844 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 845 | "dev": true, 846 | "requires": { 847 | "callsites": "^3.0.0" 848 | } 849 | }, 850 | "path-is-absolute": { 851 | "version": "1.0.1", 852 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 853 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 854 | "dev": true 855 | }, 856 | "path-key": { 857 | "version": "2.0.1", 858 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 859 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 860 | "dev": true 861 | }, 862 | "path-parse": { 863 | "version": "1.0.6", 864 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 865 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 866 | "dev": true 867 | }, 868 | "prelude-ls": { 869 | "version": "1.1.2", 870 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 871 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 872 | "dev": true 873 | }, 874 | "progress": { 875 | "version": "2.0.3", 876 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 877 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 878 | "dev": true 879 | }, 880 | "punycode": { 881 | "version": "2.1.1", 882 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 883 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 884 | "dev": true 885 | }, 886 | "regexpp": { 887 | "version": "2.0.1", 888 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 889 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 890 | "dev": true 891 | }, 892 | "resolve": { 893 | "version": "1.11.1", 894 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", 895 | "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", 896 | "dev": true, 897 | "requires": { 898 | "path-parse": "^1.0.6" 899 | } 900 | }, 901 | "resolve-from": { 902 | "version": "4.0.0", 903 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 904 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 905 | "dev": true 906 | }, 907 | "restore-cursor": { 908 | "version": "2.0.0", 909 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 910 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 911 | "dev": true, 912 | "requires": { 913 | "onetime": "^2.0.0", 914 | "signal-exit": "^3.0.2" 915 | } 916 | }, 917 | "resumer": { 918 | "version": "0.0.0", 919 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 920 | "integrity": "sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k=", 921 | "dev": true, 922 | "requires": { 923 | "through": "~2.3.4" 924 | } 925 | }, 926 | "rimraf": { 927 | "version": "2.6.3", 928 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 929 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 930 | "dev": true, 931 | "requires": { 932 | "glob": "^7.1.3" 933 | } 934 | }, 935 | "run-async": { 936 | "version": "2.3.0", 937 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 938 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 939 | "dev": true, 940 | "requires": { 941 | "is-promise": "^2.1.0" 942 | } 943 | }, 944 | "rxjs": { 945 | "version": "6.5.3", 946 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", 947 | "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", 948 | "dev": true, 949 | "requires": { 950 | "tslib": "^1.9.0" 951 | } 952 | }, 953 | "safer-buffer": { 954 | "version": "2.1.2", 955 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 956 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 957 | "dev": true 958 | }, 959 | "semver": { 960 | "version": "6.3.0", 961 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 962 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", 963 | "dev": true 964 | }, 965 | "shebang-command": { 966 | "version": "1.2.0", 967 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 968 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 969 | "dev": true, 970 | "requires": { 971 | "shebang-regex": "^1.0.0" 972 | } 973 | }, 974 | "shebang-regex": { 975 | "version": "1.0.0", 976 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 977 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 978 | "dev": true 979 | }, 980 | "signal-exit": { 981 | "version": "3.0.2", 982 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 983 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 984 | "dev": true 985 | }, 986 | "slice-ansi": { 987 | "version": "2.1.0", 988 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 989 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 990 | "dev": true, 991 | "requires": { 992 | "ansi-styles": "^3.2.0", 993 | "astral-regex": "^1.0.0", 994 | "is-fullwidth-code-point": "^2.0.0" 995 | } 996 | }, 997 | "sprintf-js": { 998 | "version": "1.0.3", 999 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1000 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1001 | "dev": true 1002 | }, 1003 | "string-width": { 1004 | "version": "2.1.1", 1005 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1006 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1007 | "dev": true, 1008 | "requires": { 1009 | "is-fullwidth-code-point": "^2.0.0", 1010 | "strip-ansi": "^4.0.0" 1011 | }, 1012 | "dependencies": { 1013 | "strip-ansi": { 1014 | "version": "4.0.0", 1015 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1016 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1017 | "dev": true, 1018 | "requires": { 1019 | "ansi-regex": "^3.0.0" 1020 | } 1021 | } 1022 | } 1023 | }, 1024 | "string.prototype.trim": { 1025 | "version": "1.1.2", 1026 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz", 1027 | "integrity": "sha1-0E3iyJ4Tf019IG8Ia17S+ua+jOo=", 1028 | "dev": true, 1029 | "requires": { 1030 | "define-properties": "^1.1.2", 1031 | "es-abstract": "^1.5.0", 1032 | "function-bind": "^1.0.2" 1033 | } 1034 | }, 1035 | "strip-ansi": { 1036 | "version": "5.2.0", 1037 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1038 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1039 | "dev": true, 1040 | "requires": { 1041 | "ansi-regex": "^4.1.0" 1042 | }, 1043 | "dependencies": { 1044 | "ansi-regex": { 1045 | "version": "4.1.0", 1046 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1047 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1048 | "dev": true 1049 | } 1050 | } 1051 | }, 1052 | "strip-json-comments": { 1053 | "version": "3.0.1", 1054 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", 1055 | "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", 1056 | "dev": true 1057 | }, 1058 | "supports-color": { 1059 | "version": "5.5.0", 1060 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1061 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1062 | "dev": true, 1063 | "requires": { 1064 | "has-flag": "^3.0.0" 1065 | } 1066 | }, 1067 | "table": { 1068 | "version": "5.4.6", 1069 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 1070 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 1071 | "dev": true, 1072 | "requires": { 1073 | "ajv": "^6.10.2", 1074 | "lodash": "^4.17.14", 1075 | "slice-ansi": "^2.1.0", 1076 | "string-width": "^3.0.0" 1077 | }, 1078 | "dependencies": { 1079 | "string-width": { 1080 | "version": "3.1.0", 1081 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1082 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1083 | "dev": true, 1084 | "requires": { 1085 | "emoji-regex": "^7.0.1", 1086 | "is-fullwidth-code-point": "^2.0.0", 1087 | "strip-ansi": "^5.1.0" 1088 | } 1089 | } 1090 | } 1091 | }, 1092 | "tape": { 1093 | "version": "4.11.0", 1094 | "resolved": "https://registry.npmjs.org/tape/-/tape-4.11.0.tgz", 1095 | "integrity": "sha512-yixvDMX7q7JIs/omJSzSZrqulOV51EC9dK8dM0TzImTIkHWfe2/kFyL5v+d9C+SrCMaICk59ujsqFAVidDqDaA==", 1096 | "dev": true, 1097 | "requires": { 1098 | "deep-equal": "~1.0.1", 1099 | "defined": "~1.0.0", 1100 | "for-each": "~0.3.3", 1101 | "function-bind": "~1.1.1", 1102 | "glob": "~7.1.4", 1103 | "has": "~1.0.3", 1104 | "inherits": "~2.0.4", 1105 | "minimist": "~1.2.0", 1106 | "object-inspect": "~1.6.0", 1107 | "resolve": "~1.11.1", 1108 | "resumer": "~0.0.0", 1109 | "string.prototype.trim": "~1.1.2", 1110 | "through": "~2.3.8" 1111 | }, 1112 | "dependencies": { 1113 | "minimist": { 1114 | "version": "1.2.0", 1115 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1116 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 1117 | "dev": true 1118 | } 1119 | } 1120 | }, 1121 | "text-table": { 1122 | "version": "0.2.0", 1123 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1124 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1125 | "dev": true 1126 | }, 1127 | "through": { 1128 | "version": "2.3.8", 1129 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1130 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1131 | "dev": true 1132 | }, 1133 | "tmp": { 1134 | "version": "0.0.33", 1135 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1136 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1137 | "dev": true, 1138 | "requires": { 1139 | "os-tmpdir": "~1.0.2" 1140 | } 1141 | }, 1142 | "tslib": { 1143 | "version": "1.10.0", 1144 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", 1145 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", 1146 | "dev": true 1147 | }, 1148 | "type-check": { 1149 | "version": "0.3.2", 1150 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1151 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1152 | "dev": true, 1153 | "requires": { 1154 | "prelude-ls": "~1.1.2" 1155 | } 1156 | }, 1157 | "uri-js": { 1158 | "version": "4.2.2", 1159 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1160 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1161 | "dev": true, 1162 | "requires": { 1163 | "punycode": "^2.1.0" 1164 | } 1165 | }, 1166 | "v8-compile-cache": { 1167 | "version": "2.1.0", 1168 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", 1169 | "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", 1170 | "dev": true 1171 | }, 1172 | "which": { 1173 | "version": "1.3.1", 1174 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1175 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1176 | "dev": true, 1177 | "requires": { 1178 | "isexe": "^2.0.0" 1179 | } 1180 | }, 1181 | "wordwrap": { 1182 | "version": "1.0.0", 1183 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1184 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1185 | "dev": true 1186 | }, 1187 | "wrappy": { 1188 | "version": "1.0.2", 1189 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1190 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1191 | "dev": true 1192 | }, 1193 | "write": { 1194 | "version": "1.0.3", 1195 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 1196 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 1197 | "dev": true, 1198 | "requires": { 1199 | "mkdirp": "^0.5.1" 1200 | } 1201 | } 1202 | } 1203 | } 1204 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "opencpu", 3 | "description": "OpenCPU client", 4 | "version": "1.1.1", 5 | "main": "index", 6 | "repository": "http://github.com/albertosantini/node-opencpu", 7 | "keywords": [ 8 | "OpenCPU", 9 | "R framework" 10 | ], 11 | "author": "Alberto Santini", 12 | "license": "MIT", 13 | "engines": { 14 | "node": ">=8.x" 15 | }, 16 | "dependencies": { 17 | "https-proxy-agent": "^2.2.2" 18 | }, 19 | "scripts": { 20 | "test": "npm run lint && npm run tape", 21 | "lint": "eslint lib/**/*.js test/**/*.js examples/**/*.js", 22 | "tape": "tape test/*-test.js" 23 | }, 24 | "devDependencies": { 25 | "eslint": "^6.4.0", 26 | "tape": "^4.11.0" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /test/opencpu-config.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | function getOptions() { 4 | const isCI = process.env.CI === "true"; 5 | const remoteServer = "https://public.opencpu.org"; 6 | const localServer = "http://localhost:5307"; 7 | const options = {}; 8 | 9 | options.server = isCI ? remoteServer : localServer; 10 | 11 | return options; 12 | } 13 | exports.getOptions = getOptions; 14 | -------------------------------------------------------------------------------- /test/packages-test.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const test = require("tape"); 4 | const opencpu = require("../lib/opencpu"); 5 | const config = require("./opencpu-config"); 6 | 7 | test("MASS getInfo", t => { 8 | opencpu.packages.getInfo("MASS", (err, data) => { 9 | if (!err) { 10 | t.ok(/Information/.test(data)); 11 | } else { 12 | t.fail(err); 13 | } 14 | t.end(); 15 | }, "/library/", config.getOptions()); 16 | }); 17 | 18 | test("MASS getExportedObjects", t => { 19 | opencpu.packages.getExportedObjects("MASS", (err, data) => { 20 | if (!err) { 21 | t.ok(/addterm/.test(data)); 22 | } else { 23 | t.fail(err); 24 | } 25 | t.end(); 26 | }, "/library/", config.getOptions()); 27 | }); 28 | -------------------------------------------------------------------------------- /test/raw-test.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const test = require("tape"); 4 | const opencpu = require("../lib/opencpu"); 5 | const config = require("./opencpu-config"); 6 | 7 | test("mtcars json object", t => { 8 | opencpu.rCall("/library/datasets/R/mtcars/json", null, 9 | (err, data) => { 10 | if (!err) { 11 | t.equal(data[0].mpg + data[1].mpg, 42); 12 | } else { 13 | t.fail(err); 14 | } 15 | t.end(); 16 | }, config.getOptions()); 17 | }); 18 | 19 | test("rnorm json object", t => { 20 | opencpu.rCall("/library/stats/R/rnorm/json", { 21 | n: 42, 22 | mean: 10, 23 | sd: 10 24 | }, (err, data) => { 25 | if (!err) { 26 | t.equal(data.length, 42); 27 | } else { 28 | t.fail(err); 29 | } 30 | t.end(); 31 | }, config.getOptions()); 32 | }); 33 | 34 | test("session", t => { 35 | opencpu.rCall("/library/MASS/scripts/ch01.R", {}, (error, sessionId) => { 36 | if (!error) { 37 | opencpu.rCall(`/tmp/${sessionId}/files/DESCRIPTION`, null, (err, data) => { 38 | let isPackageSession; 39 | 40 | if (!err) { 41 | isPackageSession = data.search(`Package: ${sessionId}`) >= 0; 42 | t.equal(true, isPackageSession); 43 | } 44 | t.end(); 45 | }, config.getOptions()); 46 | } else { 47 | t.fail(error); 48 | t.end(); 49 | } 50 | }, config.getOptions()); 51 | }); 52 | --------------------------------------------------------------------------------