├── .gitignore ├── LICENSE ├── R └── index.R ├── README.md ├── client ├── .babelrc ├── .gitignore ├── README.md ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── public │ ├── app.f27b8b0d83e42c8873f5.js │ ├── app.f523307627ce6072e50b.css │ └── index.html ├── src │ ├── App.js │ ├── index.css │ ├── index.html │ └── index.js └── webpack.config.js ├── package.json ├── pnpm-lock.yaml ├── r-react-demo-screenshot.png ├── r-react-demo.code-workspace └── server.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .DS_STORE 3 | .Rproj.user/ 4 | .Rproj 5 | .cache 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 dcruvolo 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /R/index.R: -------------------------------------------------------------------------------- 1 | #'////////////////////////////////////////////////////////////////////////////// 2 | #' FILE: index.R 3 | #' AUTHOR: David Ruvolo 4 | #' CREATED: 2019-11-01 5 | #' MODIFIED: 2019-12-05 6 | #' PURPOSE: summarize data 7 | #' PACKAGES: r-script; https://github.com/fridgerator/r-script 8 | #' STATUS: working 9 | #' COMMENTS: NA 10 | #'////////////////////////////////////////////////////////////////////////////// 11 | 12 | input[[1]] ^ input[[2]] -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # R ❤️ React Demo application 2 | 3 | ![r react demo application preview](r-react-demo-screenshot.png) 4 | 5 | The `r-react-demo` app demonstrates how to create a React application that uses R to process data server side. This is a fairly simple example, but it should provide a good starting point for your project. The app was built using the following tools. 6 | 7 | - Frontend 8 | - [React](https://reactjs.org) 9 | - [Webpack](https://webpack.js.org) 10 | - Backend 11 | - [Express](https://expressjs.com) 12 | - [r-script](https://github.com/fridgerator/r-script) 13 | 14 | ## Getting Started 15 | 16 | ### 1. Install Node and NPM 17 | 18 | Make sure [Node and NPM](https://nodejs.org/en/) are installed on your machine. You may also use [Yarn](https://yarnpkg.com/en/). To test the installation or to see if these tools are already installed on your machine, run the following commands in the terminal. 19 | 20 | ```shell 21 | node -v 22 | npm -v 23 | ``` 24 | 25 | ### 2. Clone the `r-react-demo` repository 26 | 27 | ```shell 28 | git clone https://github.com/davidruvolo51/r-react-demo 29 | ``` 30 | 31 | ### 3. Install dependencies 32 | 33 | Next, install the npm packages that are required to run the app locally. I have decided to use [pnpm](https://github.com/pnpm/pnpm) to manage packages on my machine and across projects. To install `pnpm`, run the following command. 34 | 35 | ```shell 36 | npm install -g pnpm 37 | ``` 38 | 39 | You will need to install the dependencies in the root directory and in the `client/` directory. 40 | 41 | ```shell 42 | pnpm install 43 | 44 | cd client 45 | pnpm install 46 | ``` 47 | 48 | If you prefer to use `npm`, use the following. 49 | 50 | ```shell 51 | npm install 52 | 53 | cd client 54 | npm install 55 | ``` 56 | 57 | ### 4. Start the development servers 58 | 59 | When everything is install, navigate back to the main directory and start the development server. This will start the client at port `localhost:8000` and the API at `localhost:5000`. 60 | 61 | ```shell 62 | npm run dev 63 | ``` 64 | 65 | ## Futher Reading 66 | 67 | This application was built by piecing together a few blog posts. If you would like to start from scratch, checkout out the [How to create a React frontend and a Node/Express backend and connect them](https://www.freecodecamp.org/news/create-a-react-frontend-a-node-express-backend-and-connect-them-together-c5798926047c/) post. 68 | -------------------------------------------------------------------------------- /client/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | [ 4 | "@babel/preset-env", 5 | { 6 | "modules": false, 7 | } 8 | ], 9 | "@babel/preset-react" 10 | ], 11 | "plugins": [ 12 | [ 13 | "@babel/plugin-transform-runtime", 14 | { 15 | "regenerator": true 16 | } 17 | ] 18 | ] 19 | } -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # production 12 | /build 13 | 14 | # misc 15 | .DS_Store 16 | .env.local 17 | .env.development.local 18 | .env.test.local 19 | .env.production.local 20 | 21 | npm-debug.log* 22 | yarn-debug.log* 23 | yarn-error.log* 24 | -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). 2 | 3 | ## Available Scripts 4 | 5 | In the project directory, you can run: 6 | 7 | ### `yarn start` 8 | 9 | Runs the app in the development mode.
10 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. 11 | 12 | The page will reload if you make edits.
13 | You will also see any lint errors in the console. 14 | 15 | ### `yarn test` 16 | 17 | Launches the test runner in the interactive watch mode.
18 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. 19 | 20 | ### `yarn build` 21 | 22 | Builds the app for production to the `build` folder.
23 | It correctly bundles React in production mode and optimizes the build for the best performance. 24 | 25 | The build is minified and the filenames include the hashes.
26 | Your app is ready to be deployed! 27 | 28 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. 29 | 30 | ### `yarn eject` 31 | 32 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!** 33 | 34 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 35 | 36 | Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. 37 | 38 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. 39 | 40 | ## Learn More 41 | 42 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). 43 | 44 | To learn React, check out the [React documentation](https://reactjs.org/). 45 | 46 | ### Code Splitting 47 | 48 | This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting 49 | 50 | ### Analyzing the Bundle Size 51 | 52 | This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size 53 | 54 | ### Making a Progressive Web App 55 | 56 | This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app 57 | 58 | ### Advanced Configuration 59 | 60 | This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration 61 | 62 | ### Deployment 63 | 64 | This section has moved here: https://facebook.github.io/create-react-app/docs/deployment 65 | 66 | ### `yarn build` fails to minify 67 | 68 | This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify 69 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "client", 3 | "version": "0.1.0", 4 | "private": true, 5 | "proxy": "http://localhost:5000/", 6 | "license": "MIT", 7 | "scripts": { 8 | "start": "webpack serve" 9 | }, 10 | "dependencies": { 11 | "@babel/runtime": "^7.13.10", 12 | "async_hooks": "^1.0.0", 13 | "babel-runtime": "^6.26.0", 14 | "react": "^17.0.1", 15 | "react-dom": "^17.0.1" 16 | }, 17 | "devDependencies": { 18 | "@babel/core": "^7.13.10", 19 | "@babel/plugin-transform-runtime": "^7.13.10", 20 | "@babel/preset-env": "^7.13.10", 21 | "@babel/preset-react": "^7.12.13", 22 | "autoprefixer": "^10.2.5", 23 | "babel-loader": "^8.2.2", 24 | "clean-webpack-plugin": "^3.0.0", 25 | "copy-webpack-plugin": "^7.0.0", 26 | "css-loader": "^5.1.3", 27 | "file-loader": "^6.2.0", 28 | "html-webpack-plugin": "^4.5.2", 29 | "mini-css-extract-plugin": "^1.3.9", 30 | "optimize-css-assets-webpack-plugin": "^5.0.4", 31 | "postcss-loader": "^5.2.0", 32 | "postcss-modules": "^4.0.0", 33 | "sass": "^1.32.8", 34 | "sass-loader": "^10.1.1", 35 | "style-loader": "^2.0.0", 36 | "terser-webpack-plugin": "^5.1.1", 37 | "webpack": "^5.26.3", 38 | "webpack-cli": "^4.5.0", 39 | "webpack-dev-server": "^3.11.2" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /client/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | require("autoprefixer") 4 | ] 5 | } -------------------------------------------------------------------------------- /client/public/app.f523307627ce6072e50b.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | margin: 0; 3 | padding: 0; 4 | font-family: Helvetica, Arial, sans-serif; 5 | font-size: 16pt; 6 | color: #3f454b; 7 | } 8 | 9 | header, main, section, form, fieldset { 10 | padding: 0; 11 | margin: 0; 12 | } 13 | 14 | fieldset { 15 | display: inline; 16 | border: none; 17 | box-sizing: border-box; 18 | width: 50%; 19 | } 20 | 21 | h1, h2 { 22 | color: #252525; 23 | line-height: 1.4; 24 | padding: 0; 25 | margin: 0; 26 | } 27 | 28 | p { 29 | margin: 0; 30 | padding: 0; 31 | line-height: 1.65; 32 | margin-bottom: 12px; 33 | } 34 | 35 | .header { 36 | position: fixed; 37 | display: block; 38 | width: 100%; 39 | z-index: 10; 40 | background-color: #252525; 41 | top: 0; 42 | } 43 | 44 | .header p { 45 | text-align: center; 46 | color: #f0f0f0; 47 | font-size: 14pt; 48 | text-transform: uppercase; 49 | letter-spacing: 2px; 50 | font-weight: 600; 51 | padding: 10px 0; 52 | margin: 0; 53 | } 54 | 55 | .main { 56 | margin-top: 80px; 57 | padding-top: 12px; 58 | padding-bottom: 50px; 59 | } 60 | 61 | .section { 62 | width: 90%; 63 | margin: 0 auto; 64 | } 65 | 66 | .form { 67 | background-color: #f3f3f3; 68 | padding: 12px; 69 | margin-bottom: 24px; 70 | } 71 | 72 | label { 73 | display: block; 74 | margin-top: 12px; 75 | font-size: 14pt; 76 | text-transform: uppercase; 77 | letter-spacing: 2px; 78 | font-weight: 600; 79 | color: #252525; 80 | } 81 | 82 | .form span { 83 | display: block; 84 | font-size: 12pt; 85 | } 86 | 87 | input[type=number] { 88 | display: inline-block; 89 | margin: 6px 0; 90 | width: 200px; 91 | padding: 4px 0; 92 | font-size: 12pt; 93 | font-weight: 600; 94 | text-align: center; 95 | } 96 | 97 | button[type=submit] { 98 | display: block; 99 | float: right; 100 | -webkit-appearance: none; 101 | -moz-appearance: none; 102 | appearance: none; 103 | border: none; 104 | background-color: #252525; 105 | color: #f0f0f0; 106 | font-size: 14pt; 107 | letter-spacing: 2px; 108 | text-transform: uppercase; 109 | font-weight: 600; 110 | width: 200px; 111 | margin: 24px 0; 112 | margin-right: -12px; 113 | padding: 6px 0; 114 | border-radius: 3px; 115 | cursor: pointer; 116 | } 117 | 118 | output { 119 | display: block; 120 | background-color: #f3f3f3; 121 | margin-top: 12px; 122 | padding: 12px 6px; 123 | padding-left: 12px; 124 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; 125 | } 126 | 127 | @media screen and (min-width: 912px) { 128 | .section { 129 | max-width: 912px; 130 | } 131 | } 132 | -------------------------------------------------------------------------------- /client/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | R + React 8 | 9 | 10 |
11 | 12 | -------------------------------------------------------------------------------- /client/src/App.js: -------------------------------------------------------------------------------- 1 | //////////////////////////////////////////////////////////////////////////////// 2 | // FILE: App.js 3 | // AUTHOR: David Ruvolo 4 | // CREATED: 2019-11-01 5 | // MODIFIED: 2021-01-18 6 | // PURPOSE: build ui 7 | // DEPENDENCIES: react 8 | // STATUS: working 9 | // COMMENTS: NA 10 | //////////////////////////////////////////////////////////////////////////////// 11 | import React, { useState } from 'react'; 12 | function App() { 13 | 14 | // set state 15 | const [inputValue, setInputValue] = useState(1); 16 | const [inputPower, setInputPower] = useState(2); 17 | const [squaredJS, setSquaredJS] = useState(0); 18 | const [squaredR, setSquaredR] = useState(0); 19 | 20 | // on form submit function 21 | // send input values to /data/ and wait for response 22 | const handleSubmit = async e => { 23 | e.preventDefault(); 24 | 25 | // create response through POST 26 | const response = await fetch("http://localhost:5000/data", { 27 | method: "POST", 28 | mode: "cors", 29 | headers: { 30 | "Content-Type": "application/json", 31 | }, 32 | body: JSON.stringify({ value: inputValue, power: inputPower }), 33 | }); 34 | 35 | const body = await response.json(); 36 | 37 | // update state 38 | setSquaredJS(body.squaredJS); 39 | setSquaredR(body.squaredR); 40 | }; 41 | 42 | //////////////////////////////////////// 43 | // RENDER APP 44 | return ( 45 | <> 46 |
47 |

R ❤ React

48 |
49 |
50 |
51 |

Example app using R, React, and Node.js

52 |

In this example, we are sending a number the server, squaring by a number of our choice using R and JavaScript, and then sending it back to our react component.

53 |
e.preventDefault()}> 54 | Define Values 55 |
56 | 57 | Between 1 and 1000 58 | setInputValue(e.target.value)} /> 59 |
60 |
61 | 62 | Between 2 and 10 63 | setInputPower(e.target.value)} /> 64 |
65 | 66 |
67 |

Results

68 | { 69 | // render only after first entry 70 | squaredJS > 0 71 | ? ( 72 | <> 73 | 74 | {squaredJS} 75 | 76 | {squaredR} 77 | 78 | ) 79 | : Results will appear here 80 | } 81 |
82 |
83 | 84 | ); 85 | } 86 | 87 | export default App; -------------------------------------------------------------------------------- /client/src/index.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | margin: 0; 3 | padding: 0; 4 | font-family: Helvetica, Arial, sans-serif; 5 | font-size: 16pt; 6 | color: #3f454b; 7 | } 8 | 9 | header, main, section, form, fieldset { 10 | padding: 0; 11 | margin: 0; 12 | } 13 | 14 | fieldset { 15 | display: inline; 16 | border: none; 17 | box-sizing: border-box; 18 | width: 50%; 19 | } 20 | 21 | h1, h2 { 22 | color: #252525; 23 | line-height: 1.4; 24 | padding: 0; 25 | margin: 0; 26 | } 27 | 28 | p { 29 | margin: 0; 30 | padding: 0; 31 | line-height: 1.65; 32 | margin-bottom: 12px; 33 | } 34 | 35 | .header { 36 | position: fixed; 37 | display: block; 38 | width: 100%; 39 | z-index: 10; 40 | background-color: #252525; 41 | top: 0; 42 | } 43 | 44 | 45 | .header p { 46 | text-align: center; 47 | color: #f0f0f0; 48 | font-size: 14pt; 49 | text-transform: uppercase; 50 | letter-spacing: 2px; 51 | font-weight: 600; 52 | padding: 10px 0; 53 | margin: 0; 54 | } 55 | 56 | .main { 57 | margin-top: 80px; 58 | padding-top: 12px; 59 | padding-bottom: 50px; 60 | } 61 | 62 | .section { 63 | width: 90%; 64 | margin: 0 auto; 65 | } 66 | 67 | .form { 68 | background-color: #f3f3f3; 69 | padding: 12px; 70 | margin-bottom: 24px; 71 | } 72 | 73 | label { 74 | display: block; 75 | margin-top: 12px; 76 | font-size: 14pt; 77 | text-transform: uppercase; 78 | letter-spacing: 2px; 79 | font-weight: 600; 80 | color: #252525; 81 | } 82 | 83 | .form span { 84 | display: block; 85 | font-size: 12pt; 86 | } 87 | 88 | input[type=number] { 89 | display: inline-block; 90 | margin: 6px 0; 91 | width: 200px; 92 | padding: 4px 0; 93 | font-size: 12pt; 94 | font-weight: 600; 95 | text-align: center; 96 | } 97 | 98 | button[type=submit]{ 99 | display: block; 100 | float: right; 101 | appearance: none; 102 | border: none; 103 | background-color: #252525; 104 | color: #f0f0f0; 105 | font-size: 14pt; 106 | letter-spacing: 2px; 107 | text-transform: uppercase; 108 | font-weight: 600; 109 | width: 200px; 110 | margin: 24px 0; 111 | margin-right: -12px; 112 | padding: 6px 0; 113 | border-radius: 3px; 114 | cursor: pointer; 115 | } 116 | 117 | output { 118 | display: block; 119 | background-color: #f3f3f3; 120 | margin-top: 12px; 121 | padding: 12px 6px; 122 | padding-left: 12px; 123 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New", monospace; 124 | } 125 | 126 | @media screen and (min-width: 912px){ 127 | 128 | .section { 129 | max-width: 912px; 130 | } 131 | } -------------------------------------------------------------------------------- /client/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | R + React 8 | 9 | 10 |
11 | 12 | -------------------------------------------------------------------------------- /client/src/index.js: -------------------------------------------------------------------------------- 1 | //////////////////////////////////////////////////////////////////////////////// 2 | // FILE: index.js 3 | // AUTHOR: David Ruvolo 4 | // CREATED: 2019-11-01 5 | // MODIFIED: 2020-11-18 6 | // PURPOSE: main index file 7 | // DEPENDENCIES: react, reactDOM, service worker 8 | // STATUS: working 9 | // COMMENTS: NA 10 | //////////////////////////////////////////////////////////////////////////////// 11 | import React from 'react'; 12 | import ReactDOM from 'react-dom'; 13 | import './index.css'; 14 | import App from './App'; 15 | 16 | ReactDOM.render(, document.getElementById('root')); 17 | -------------------------------------------------------------------------------- /client/webpack.config.js: -------------------------------------------------------------------------------- 1 | //////////////////////////////////////////////////////////////////////////////// 2 | // FILE: webpack.config.js 3 | // AUTHOR: David Ruvolo 4 | // CREATED: 2020-09-26 5 | // MODIFIED: 2020-11-18 6 | // PURPOSE: loads dev or prod configuration based on script param `env` 7 | // DEPENDENCIES: see common 8 | // STATUS: working 9 | // COMMENTS: NA 10 | //////////////////////////////////////////////////////////////////////////////// 11 | 12 | // load 13 | const { CleanWebpackPlugin } = require("clean-webpack-plugin"); 14 | const MiniCssExtractPlugin = require('mini-css-extract-plugin'); 15 | const path = require("path"); 16 | const HtmlWebpackPlugin = require("html-webpack-plugin"); 17 | 18 | console.log(path.__dirname) 19 | 20 | // configuration 21 | module.exports = { 22 | mode: "development", 23 | entry: "./src/index.js", 24 | output: { 25 | publicPath: "", 26 | path: path.resolve(__dirname, "public/"), 27 | filename: "app.[contenthash].js", 28 | }, 29 | devServer: { 30 | port: 8000, 31 | hot: true, 32 | writeToDisk: true, 33 | }, 34 | plugins: [ 35 | // new webpack.ProgressPlugin(), 36 | new HtmlWebpackPlugin({ 37 | template: "src/index.html", 38 | filename: "index.html", 39 | }), 40 | new MiniCssExtractPlugin({ 41 | filename: "app.[contenthash].css", 42 | }), 43 | new CleanWebpackPlugin(), 44 | ], 45 | module: { 46 | rules: [ 47 | { 48 | test: /\.(js|jsx)$/, 49 | use: "babel-loader", 50 | exclude: /node_modules/, 51 | }, 52 | { 53 | test: /\.(s[ac]ss|css)$/i, 54 | use: [ 55 | MiniCssExtractPlugin.loader, 56 | "css-loader", 57 | "postcss-loader", 58 | "sass-loader", 59 | ] 60 | }, 61 | { 62 | test: /\.(woff|woff2|eot|ttf|otf)$/, 63 | use: [ 64 | "file-loader" 65 | ] 66 | }, 67 | { 68 | test: /\.(png|svg|jpg|gif)$/, 69 | use: [ 70 | "file-loader" 71 | ] 72 | }, 73 | ] 74 | }, 75 | resolve: { 76 | extensions: [ 77 | ".js", 78 | ".jsx" 79 | ] 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "api", 3 | "version": "1.0.0", 4 | "scripts": { 5 | "setup": "pnpm install && cd client && pnpm install", 6 | "upgrade": "pnpm upgrade --latest && cd client && pnpm upgrade --latest", 7 | "client": "cd client && yarn start", 8 | "server": "nodemon server.js", 9 | "dev": "concurrently --kill-others-on-fail \"yarn server\" \"yarn client\"" 10 | }, 11 | "dependencies": { 12 | "@fridgerator/r-script": "^0.1.7", 13 | "body-parser": "^1.19.0", 14 | "cors": "^2.8.5", 15 | "express": "^4.17.1" 16 | }, 17 | "devDependencies": { 18 | "concurrently": "^5.3.0", 19 | "nodemon": "^2.0.7" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | specifiers: 4 | '@fridgerator/r-script': ^0.1.7 5 | body-parser: ^1.19.0 6 | concurrently: ^5.3.0 7 | cors: ^2.8.5 8 | express: ^4.17.1 9 | nodemon: ^2.0.7 10 | 11 | dependencies: 12 | '@fridgerator/r-script': 0.1.7 13 | body-parser: 1.19.0 14 | cors: 2.8.5 15 | express: 4.17.1 16 | 17 | devDependencies: 18 | concurrently: 5.3.0 19 | nodemon: 2.0.7 20 | 21 | packages: 22 | 23 | /@fridgerator/r-script/0.1.7: 24 | resolution: {integrity: sha512-TBmfPI0+yPkiNPjlzwiS5ltwg8489WBpgzqtKNFvX/0y7zAuyrTNfzNClC3uzi8N/kznZqV4BdIFiLfEz0qdEg==} 25 | dev: false 26 | 27 | /@sindresorhus/is/0.14.0: 28 | resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} 29 | engines: {node: '>=6'} 30 | dev: true 31 | 32 | /@szmarczak/http-timer/1.1.2: 33 | resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==} 34 | engines: {node: '>=6'} 35 | dependencies: 36 | defer-to-connect: 1.1.3 37 | dev: true 38 | 39 | /abbrev/1.1.1: 40 | resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} 41 | dev: true 42 | 43 | /accepts/1.3.7: 44 | resolution: {integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==} 45 | engines: {node: '>= 0.6'} 46 | dependencies: 47 | mime-types: 2.1.30 48 | negotiator: 0.6.2 49 | dev: false 50 | 51 | /ansi-align/3.0.0: 52 | resolution: {integrity: sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==} 53 | dependencies: 54 | string-width: 3.1.0 55 | dev: true 56 | 57 | /ansi-regex/4.1.0: 58 | resolution: {integrity: sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==} 59 | engines: {node: '>=6'} 60 | dev: true 61 | 62 | /ansi-regex/5.0.0: 63 | resolution: {integrity: sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==} 64 | engines: {node: '>=8'} 65 | dev: true 66 | 67 | /ansi-styles/3.2.1: 68 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 69 | engines: {node: '>=4'} 70 | dependencies: 71 | color-convert: 1.9.3 72 | dev: true 73 | 74 | /ansi-styles/4.3.0: 75 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 76 | engines: {node: '>=8'} 77 | dependencies: 78 | color-convert: 2.0.1 79 | dev: true 80 | 81 | /anymatch/3.1.2: 82 | resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} 83 | engines: {node: '>= 8'} 84 | dependencies: 85 | normalize-path: 3.0.0 86 | picomatch: 2.2.3 87 | dev: true 88 | 89 | /array-flatten/1.1.1: 90 | resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=} 91 | dev: false 92 | 93 | /balanced-match/1.0.2: 94 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 95 | dev: true 96 | 97 | /binary-extensions/2.2.0: 98 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 99 | engines: {node: '>=8'} 100 | dev: true 101 | 102 | /body-parser/1.19.0: 103 | resolution: {integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==} 104 | engines: {node: '>= 0.8'} 105 | dependencies: 106 | bytes: 3.1.0 107 | content-type: 1.0.4 108 | debug: 2.6.9 109 | depd: 1.1.2 110 | http-errors: 1.7.2 111 | iconv-lite: 0.4.24 112 | on-finished: 2.3.0 113 | qs: 6.7.0 114 | raw-body: 2.4.0 115 | type-is: 1.6.18 116 | dev: false 117 | 118 | /boxen/4.2.0: 119 | resolution: {integrity: sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==} 120 | engines: {node: '>=8'} 121 | dependencies: 122 | ansi-align: 3.0.0 123 | camelcase: 5.3.1 124 | chalk: 3.0.0 125 | cli-boxes: 2.2.1 126 | string-width: 4.2.2 127 | term-size: 2.2.1 128 | type-fest: 0.8.1 129 | widest-line: 3.1.0 130 | dev: true 131 | 132 | /brace-expansion/1.1.11: 133 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 134 | dependencies: 135 | balanced-match: 1.0.2 136 | concat-map: 0.0.1 137 | dev: true 138 | 139 | /braces/3.0.2: 140 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 141 | engines: {node: '>=8'} 142 | dependencies: 143 | fill-range: 7.0.1 144 | dev: true 145 | 146 | /bytes/3.1.0: 147 | resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} 148 | engines: {node: '>= 0.8'} 149 | dev: false 150 | 151 | /cacheable-request/6.1.0: 152 | resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==} 153 | engines: {node: '>=8'} 154 | dependencies: 155 | clone-response: 1.0.2 156 | get-stream: 5.2.0 157 | http-cache-semantics: 4.1.0 158 | keyv: 3.1.0 159 | lowercase-keys: 2.0.0 160 | normalize-url: 4.5.0 161 | responselike: 1.0.2 162 | dev: true 163 | 164 | /camelcase/5.3.1: 165 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 166 | engines: {node: '>=6'} 167 | dev: true 168 | 169 | /chalk/2.4.2: 170 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 171 | engines: {node: '>=4'} 172 | dependencies: 173 | ansi-styles: 3.2.1 174 | escape-string-regexp: 1.0.5 175 | supports-color: 5.5.0 176 | dev: true 177 | 178 | /chalk/3.0.0: 179 | resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} 180 | engines: {node: '>=8'} 181 | dependencies: 182 | ansi-styles: 4.3.0 183 | supports-color: 7.2.0 184 | dev: true 185 | 186 | /chokidar/3.5.1: 187 | resolution: {integrity: sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==} 188 | engines: {node: '>= 8.10.0'} 189 | dependencies: 190 | anymatch: 3.1.2 191 | braces: 3.0.2 192 | glob-parent: 5.1.2 193 | is-binary-path: 2.1.0 194 | is-glob: 4.0.1 195 | normalize-path: 3.0.0 196 | readdirp: 3.5.0 197 | optionalDependencies: 198 | fsevents: 2.3.2 199 | dev: true 200 | 201 | /ci-info/2.0.0: 202 | resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} 203 | dev: true 204 | 205 | /cli-boxes/2.2.1: 206 | resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==} 207 | engines: {node: '>=6'} 208 | dev: true 209 | 210 | /cliui/5.0.0: 211 | resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} 212 | dependencies: 213 | string-width: 3.1.0 214 | strip-ansi: 5.2.0 215 | wrap-ansi: 5.1.0 216 | dev: true 217 | 218 | /clone-response/1.0.2: 219 | resolution: {integrity: sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=} 220 | dependencies: 221 | mimic-response: 1.0.1 222 | dev: true 223 | 224 | /color-convert/1.9.3: 225 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 226 | dependencies: 227 | color-name: 1.1.3 228 | dev: true 229 | 230 | /color-convert/2.0.1: 231 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 232 | engines: {node: '>=7.0.0'} 233 | dependencies: 234 | color-name: 1.1.4 235 | dev: true 236 | 237 | /color-name/1.1.3: 238 | resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} 239 | dev: true 240 | 241 | /color-name/1.1.4: 242 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 243 | dev: true 244 | 245 | /concat-map/0.0.1: 246 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 247 | dev: true 248 | 249 | /concurrently/5.3.0: 250 | resolution: {integrity: sha512-8MhqOB6PWlBfA2vJ8a0bSFKATOdWlHiQlk11IfmQBPaHVP8oP2gsh2MObE6UR3hqDHqvaIvLTyceNW6obVuFHQ==} 251 | engines: {node: '>=6.0.0'} 252 | hasBin: true 253 | dependencies: 254 | chalk: 2.4.2 255 | date-fns: 2.21.1 256 | lodash: 4.17.21 257 | read-pkg: 4.0.1 258 | rxjs: 6.6.7 259 | spawn-command: 0.0.2-1 260 | supports-color: 6.1.0 261 | tree-kill: 1.2.2 262 | yargs: 13.3.2 263 | dev: true 264 | 265 | /configstore/5.0.1: 266 | resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} 267 | engines: {node: '>=8'} 268 | dependencies: 269 | dot-prop: 5.3.0 270 | graceful-fs: 4.2.6 271 | make-dir: 3.1.0 272 | unique-string: 2.0.0 273 | write-file-atomic: 3.0.3 274 | xdg-basedir: 4.0.0 275 | dev: true 276 | 277 | /content-disposition/0.5.3: 278 | resolution: {integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==} 279 | engines: {node: '>= 0.6'} 280 | dependencies: 281 | safe-buffer: 5.1.2 282 | dev: false 283 | 284 | /content-type/1.0.4: 285 | resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} 286 | engines: {node: '>= 0.6'} 287 | dev: false 288 | 289 | /cookie-signature/1.0.6: 290 | resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} 291 | dev: false 292 | 293 | /cookie/0.4.0: 294 | resolution: {integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==} 295 | engines: {node: '>= 0.6'} 296 | dev: false 297 | 298 | /cors/2.8.5: 299 | resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} 300 | engines: {node: '>= 0.10'} 301 | dependencies: 302 | object-assign: 4.1.1 303 | vary: 1.1.2 304 | dev: false 305 | 306 | /crypto-random-string/2.0.0: 307 | resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} 308 | engines: {node: '>=8'} 309 | dev: true 310 | 311 | /date-fns/2.21.1: 312 | resolution: {integrity: sha512-m1WR0xGiC6j6jNFAyW4Nvh4WxAi4JF4w9jRJwSI8nBmNcyZXPcP9VUQG+6gHQXAmqaGEKDKhOqAtENDC941UkA==} 313 | engines: {node: '>=0.11'} 314 | dev: true 315 | 316 | /debug/2.6.9: 317 | resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} 318 | dependencies: 319 | ms: 2.0.0 320 | 321 | /debug/3.2.7: 322 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 323 | dependencies: 324 | ms: 2.1.3 325 | dev: true 326 | 327 | /decamelize/1.2.0: 328 | resolution: {integrity: sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=} 329 | engines: {node: '>=0.10.0'} 330 | dev: true 331 | 332 | /decompress-response/3.3.0: 333 | resolution: {integrity: sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=} 334 | engines: {node: '>=4'} 335 | dependencies: 336 | mimic-response: 1.0.1 337 | dev: true 338 | 339 | /deep-extend/0.6.0: 340 | resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} 341 | engines: {node: '>=4.0.0'} 342 | dev: true 343 | 344 | /defer-to-connect/1.1.3: 345 | resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} 346 | dev: true 347 | 348 | /depd/1.1.2: 349 | resolution: {integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=} 350 | engines: {node: '>= 0.6'} 351 | dev: false 352 | 353 | /destroy/1.0.4: 354 | resolution: {integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=} 355 | dev: false 356 | 357 | /dot-prop/5.3.0: 358 | resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} 359 | engines: {node: '>=8'} 360 | dependencies: 361 | is-obj: 2.0.0 362 | dev: true 363 | 364 | /duplexer3/0.1.4: 365 | resolution: {integrity: sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=} 366 | dev: true 367 | 368 | /ee-first/1.1.1: 369 | resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} 370 | dev: false 371 | 372 | /emoji-regex/7.0.3: 373 | resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} 374 | dev: true 375 | 376 | /emoji-regex/8.0.0: 377 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 378 | dev: true 379 | 380 | /encodeurl/1.0.2: 381 | resolution: {integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=} 382 | engines: {node: '>= 0.8'} 383 | dev: false 384 | 385 | /end-of-stream/1.4.4: 386 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 387 | dependencies: 388 | once: 1.4.0 389 | dev: true 390 | 391 | /error-ex/1.3.2: 392 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 393 | dependencies: 394 | is-arrayish: 0.2.1 395 | dev: true 396 | 397 | /escape-goat/2.1.1: 398 | resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==} 399 | engines: {node: '>=8'} 400 | dev: true 401 | 402 | /escape-html/1.0.3: 403 | resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=} 404 | dev: false 405 | 406 | /escape-string-regexp/1.0.5: 407 | resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} 408 | engines: {node: '>=0.8.0'} 409 | dev: true 410 | 411 | /etag/1.8.1: 412 | resolution: {integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=} 413 | engines: {node: '>= 0.6'} 414 | dev: false 415 | 416 | /express/4.17.1: 417 | resolution: {integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==} 418 | engines: {node: '>= 0.10.0'} 419 | dependencies: 420 | accepts: 1.3.7 421 | array-flatten: 1.1.1 422 | body-parser: 1.19.0 423 | content-disposition: 0.5.3 424 | content-type: 1.0.4 425 | cookie: 0.4.0 426 | cookie-signature: 1.0.6 427 | debug: 2.6.9 428 | depd: 1.1.2 429 | encodeurl: 1.0.2 430 | escape-html: 1.0.3 431 | etag: 1.8.1 432 | finalhandler: 1.1.2 433 | fresh: 0.5.2 434 | merge-descriptors: 1.0.1 435 | methods: 1.1.2 436 | on-finished: 2.3.0 437 | parseurl: 1.3.3 438 | path-to-regexp: 0.1.7 439 | proxy-addr: 2.0.6 440 | qs: 6.7.0 441 | range-parser: 1.2.1 442 | safe-buffer: 5.1.2 443 | send: 0.17.1 444 | serve-static: 1.14.1 445 | setprototypeof: 1.1.1 446 | statuses: 1.5.0 447 | type-is: 1.6.18 448 | utils-merge: 1.0.1 449 | vary: 1.1.2 450 | dev: false 451 | 452 | /fill-range/7.0.1: 453 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 454 | engines: {node: '>=8'} 455 | dependencies: 456 | to-regex-range: 5.0.1 457 | dev: true 458 | 459 | /finalhandler/1.1.2: 460 | resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} 461 | engines: {node: '>= 0.8'} 462 | dependencies: 463 | debug: 2.6.9 464 | encodeurl: 1.0.2 465 | escape-html: 1.0.3 466 | on-finished: 2.3.0 467 | parseurl: 1.3.3 468 | statuses: 1.5.0 469 | unpipe: 1.0.0 470 | dev: false 471 | 472 | /find-up/3.0.0: 473 | resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} 474 | engines: {node: '>=6'} 475 | dependencies: 476 | locate-path: 3.0.0 477 | dev: true 478 | 479 | /forwarded/0.1.2: 480 | resolution: {integrity: sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=} 481 | engines: {node: '>= 0.6'} 482 | dev: false 483 | 484 | /fresh/0.5.2: 485 | resolution: {integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=} 486 | engines: {node: '>= 0.6'} 487 | dev: false 488 | 489 | /fsevents/2.3.2: 490 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 491 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 492 | os: [darwin] 493 | dev: true 494 | optional: true 495 | 496 | /function-bind/1.1.1: 497 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 498 | dev: true 499 | 500 | /get-caller-file/2.0.5: 501 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 502 | engines: {node: 6.* || 8.* || >= 10.*} 503 | dev: true 504 | 505 | /get-stream/4.1.0: 506 | resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} 507 | engines: {node: '>=6'} 508 | dependencies: 509 | pump: 3.0.0 510 | dev: true 511 | 512 | /get-stream/5.2.0: 513 | resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} 514 | engines: {node: '>=8'} 515 | dependencies: 516 | pump: 3.0.0 517 | dev: true 518 | 519 | /glob-parent/5.1.2: 520 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 521 | engines: {node: '>= 6'} 522 | dependencies: 523 | is-glob: 4.0.1 524 | dev: true 525 | 526 | /global-dirs/2.1.0: 527 | resolution: {integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==} 528 | engines: {node: '>=8'} 529 | dependencies: 530 | ini: 1.3.7 531 | dev: true 532 | 533 | /got/9.6.0: 534 | resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==} 535 | engines: {node: '>=8.6'} 536 | dependencies: 537 | '@sindresorhus/is': 0.14.0 538 | '@szmarczak/http-timer': 1.1.2 539 | cacheable-request: 6.1.0 540 | decompress-response: 3.3.0 541 | duplexer3: 0.1.4 542 | get-stream: 4.1.0 543 | lowercase-keys: 1.0.1 544 | mimic-response: 1.0.1 545 | p-cancelable: 1.1.0 546 | to-readable-stream: 1.0.0 547 | url-parse-lax: 3.0.0 548 | dev: true 549 | 550 | /graceful-fs/4.2.6: 551 | resolution: {integrity: sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==} 552 | dev: true 553 | 554 | /has-flag/3.0.0: 555 | resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} 556 | engines: {node: '>=4'} 557 | dev: true 558 | 559 | /has-flag/4.0.0: 560 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 561 | engines: {node: '>=8'} 562 | dev: true 563 | 564 | /has-yarn/2.1.0: 565 | resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==} 566 | engines: {node: '>=8'} 567 | dev: true 568 | 569 | /has/1.0.3: 570 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 571 | engines: {node: '>= 0.4.0'} 572 | dependencies: 573 | function-bind: 1.1.1 574 | dev: true 575 | 576 | /hosted-git-info/2.8.9: 577 | resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} 578 | dev: true 579 | 580 | /http-cache-semantics/4.1.0: 581 | resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} 582 | dev: true 583 | 584 | /http-errors/1.7.2: 585 | resolution: {integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==} 586 | engines: {node: '>= 0.6'} 587 | dependencies: 588 | depd: 1.1.2 589 | inherits: 2.0.3 590 | setprototypeof: 1.1.1 591 | statuses: 1.5.0 592 | toidentifier: 1.0.0 593 | dev: false 594 | 595 | /http-errors/1.7.3: 596 | resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} 597 | engines: {node: '>= 0.6'} 598 | dependencies: 599 | depd: 1.1.2 600 | inherits: 2.0.4 601 | setprototypeof: 1.1.1 602 | statuses: 1.5.0 603 | toidentifier: 1.0.0 604 | dev: false 605 | 606 | /iconv-lite/0.4.24: 607 | resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} 608 | engines: {node: '>=0.10.0'} 609 | dependencies: 610 | safer-buffer: 2.1.2 611 | dev: false 612 | 613 | /ignore-by-default/1.0.1: 614 | resolution: {integrity: sha1-SMptcvbGo68Aqa1K5odr44ieKwk=} 615 | dev: true 616 | 617 | /import-lazy/2.1.0: 618 | resolution: {integrity: sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=} 619 | engines: {node: '>=4'} 620 | dev: true 621 | 622 | /imurmurhash/0.1.4: 623 | resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} 624 | engines: {node: '>=0.8.19'} 625 | dev: true 626 | 627 | /inherits/2.0.3: 628 | resolution: {integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=} 629 | dev: false 630 | 631 | /inherits/2.0.4: 632 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 633 | dev: false 634 | 635 | /ini/1.3.7: 636 | resolution: {integrity: sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==} 637 | dev: true 638 | 639 | /ini/1.3.8: 640 | resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} 641 | dev: true 642 | 643 | /ipaddr.js/1.9.1: 644 | resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} 645 | engines: {node: '>= 0.10'} 646 | dev: false 647 | 648 | /is-arrayish/0.2.1: 649 | resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} 650 | dev: true 651 | 652 | /is-binary-path/2.1.0: 653 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 654 | engines: {node: '>=8'} 655 | dependencies: 656 | binary-extensions: 2.2.0 657 | dev: true 658 | 659 | /is-ci/2.0.0: 660 | resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} 661 | hasBin: true 662 | dependencies: 663 | ci-info: 2.0.0 664 | dev: true 665 | 666 | /is-core-module/2.2.0: 667 | resolution: {integrity: sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==} 668 | dependencies: 669 | has: 1.0.3 670 | dev: true 671 | 672 | /is-extglob/2.1.1: 673 | resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} 674 | engines: {node: '>=0.10.0'} 675 | dev: true 676 | 677 | /is-fullwidth-code-point/2.0.0: 678 | resolution: {integrity: sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=} 679 | engines: {node: '>=4'} 680 | dev: true 681 | 682 | /is-fullwidth-code-point/3.0.0: 683 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 684 | engines: {node: '>=8'} 685 | dev: true 686 | 687 | /is-glob/4.0.1: 688 | resolution: {integrity: sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==} 689 | engines: {node: '>=0.10.0'} 690 | dependencies: 691 | is-extglob: 2.1.1 692 | dev: true 693 | 694 | /is-installed-globally/0.3.2: 695 | resolution: {integrity: sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==} 696 | engines: {node: '>=8'} 697 | dependencies: 698 | global-dirs: 2.1.0 699 | is-path-inside: 3.0.3 700 | dev: true 701 | 702 | /is-npm/4.0.0: 703 | resolution: {integrity: sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==} 704 | engines: {node: '>=8'} 705 | dev: true 706 | 707 | /is-number/7.0.0: 708 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 709 | engines: {node: '>=0.12.0'} 710 | dev: true 711 | 712 | /is-obj/2.0.0: 713 | resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} 714 | engines: {node: '>=8'} 715 | dev: true 716 | 717 | /is-path-inside/3.0.3: 718 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 719 | engines: {node: '>=8'} 720 | dev: true 721 | 722 | /is-typedarray/1.0.0: 723 | resolution: {integrity: sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=} 724 | dev: true 725 | 726 | /is-yarn-global/0.3.0: 727 | resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==} 728 | dev: true 729 | 730 | /json-buffer/3.0.0: 731 | resolution: {integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=} 732 | dev: true 733 | 734 | /json-parse-better-errors/1.0.2: 735 | resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} 736 | dev: true 737 | 738 | /keyv/3.1.0: 739 | resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} 740 | dependencies: 741 | json-buffer: 3.0.0 742 | dev: true 743 | 744 | /latest-version/5.1.0: 745 | resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==} 746 | engines: {node: '>=8'} 747 | dependencies: 748 | package-json: 6.5.0 749 | dev: true 750 | 751 | /locate-path/3.0.0: 752 | resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} 753 | engines: {node: '>=6'} 754 | dependencies: 755 | p-locate: 3.0.0 756 | path-exists: 3.0.0 757 | dev: true 758 | 759 | /lodash/4.17.21: 760 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 761 | dev: true 762 | 763 | /lowercase-keys/1.0.1: 764 | resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} 765 | engines: {node: '>=0.10.0'} 766 | dev: true 767 | 768 | /lowercase-keys/2.0.0: 769 | resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} 770 | engines: {node: '>=8'} 771 | dev: true 772 | 773 | /make-dir/3.1.0: 774 | resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} 775 | engines: {node: '>=8'} 776 | dependencies: 777 | semver: 6.3.0 778 | dev: true 779 | 780 | /media-typer/0.3.0: 781 | resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} 782 | engines: {node: '>= 0.6'} 783 | dev: false 784 | 785 | /merge-descriptors/1.0.1: 786 | resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} 787 | dev: false 788 | 789 | /methods/1.1.2: 790 | resolution: {integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=} 791 | engines: {node: '>= 0.6'} 792 | dev: false 793 | 794 | /mime-db/1.47.0: 795 | resolution: {integrity: sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==} 796 | engines: {node: '>= 0.6'} 797 | dev: false 798 | 799 | /mime-types/2.1.30: 800 | resolution: {integrity: sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==} 801 | engines: {node: '>= 0.6'} 802 | dependencies: 803 | mime-db: 1.47.0 804 | dev: false 805 | 806 | /mime/1.6.0: 807 | resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} 808 | engines: {node: '>=4'} 809 | hasBin: true 810 | dev: false 811 | 812 | /mimic-response/1.0.1: 813 | resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} 814 | engines: {node: '>=4'} 815 | dev: true 816 | 817 | /minimatch/3.0.4: 818 | resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} 819 | dependencies: 820 | brace-expansion: 1.1.11 821 | dev: true 822 | 823 | /minimist/1.2.5: 824 | resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} 825 | dev: true 826 | 827 | /ms/2.0.0: 828 | resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} 829 | 830 | /ms/2.1.1: 831 | resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} 832 | dev: false 833 | 834 | /ms/2.1.3: 835 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 836 | dev: true 837 | 838 | /negotiator/0.6.2: 839 | resolution: {integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==} 840 | engines: {node: '>= 0.6'} 841 | dev: false 842 | 843 | /nodemon/2.0.7: 844 | resolution: {integrity: sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==} 845 | engines: {node: '>=8.10.0'} 846 | hasBin: true 847 | requiresBuild: true 848 | dependencies: 849 | chokidar: 3.5.1 850 | debug: 3.2.7 851 | ignore-by-default: 1.0.1 852 | minimatch: 3.0.4 853 | pstree.remy: 1.1.8 854 | semver: 5.7.1 855 | supports-color: 5.5.0 856 | touch: 3.1.0 857 | undefsafe: 2.0.3 858 | update-notifier: 4.1.3 859 | dev: true 860 | 861 | /nopt/1.0.10: 862 | resolution: {integrity: sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=} 863 | hasBin: true 864 | dependencies: 865 | abbrev: 1.1.1 866 | dev: true 867 | 868 | /normalize-package-data/2.5.0: 869 | resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} 870 | dependencies: 871 | hosted-git-info: 2.8.9 872 | resolve: 1.20.0 873 | semver: 5.7.1 874 | validate-npm-package-license: 3.0.4 875 | dev: true 876 | 877 | /normalize-path/3.0.0: 878 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 879 | engines: {node: '>=0.10.0'} 880 | dev: true 881 | 882 | /normalize-url/4.5.0: 883 | resolution: {integrity: sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==} 884 | engines: {node: '>=8'} 885 | dev: true 886 | 887 | /object-assign/4.1.1: 888 | resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} 889 | engines: {node: '>=0.10.0'} 890 | dev: false 891 | 892 | /on-finished/2.3.0: 893 | resolution: {integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=} 894 | engines: {node: '>= 0.8'} 895 | dependencies: 896 | ee-first: 1.1.1 897 | dev: false 898 | 899 | /once/1.4.0: 900 | resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} 901 | dependencies: 902 | wrappy: 1.0.2 903 | dev: true 904 | 905 | /p-cancelable/1.1.0: 906 | resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} 907 | engines: {node: '>=6'} 908 | dev: true 909 | 910 | /p-limit/2.3.0: 911 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 912 | engines: {node: '>=6'} 913 | dependencies: 914 | p-try: 2.2.0 915 | dev: true 916 | 917 | /p-locate/3.0.0: 918 | resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} 919 | engines: {node: '>=6'} 920 | dependencies: 921 | p-limit: 2.3.0 922 | dev: true 923 | 924 | /p-try/2.2.0: 925 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 926 | engines: {node: '>=6'} 927 | dev: true 928 | 929 | /package-json/6.5.0: 930 | resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==} 931 | engines: {node: '>=8'} 932 | dependencies: 933 | got: 9.6.0 934 | registry-auth-token: 4.2.1 935 | registry-url: 5.1.0 936 | semver: 6.3.0 937 | dev: true 938 | 939 | /parse-json/4.0.0: 940 | resolution: {integrity: sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=} 941 | engines: {node: '>=4'} 942 | dependencies: 943 | error-ex: 1.3.2 944 | json-parse-better-errors: 1.0.2 945 | dev: true 946 | 947 | /parseurl/1.3.3: 948 | resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} 949 | engines: {node: '>= 0.8'} 950 | dev: false 951 | 952 | /path-exists/3.0.0: 953 | resolution: {integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=} 954 | engines: {node: '>=4'} 955 | dev: true 956 | 957 | /path-parse/1.0.6: 958 | resolution: {integrity: sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==} 959 | dev: true 960 | 961 | /path-to-regexp/0.1.7: 962 | resolution: {integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=} 963 | dev: false 964 | 965 | /picomatch/2.2.3: 966 | resolution: {integrity: sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==} 967 | engines: {node: '>=8.6'} 968 | dev: true 969 | 970 | /pify/3.0.0: 971 | resolution: {integrity: sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=} 972 | engines: {node: '>=4'} 973 | dev: true 974 | 975 | /prepend-http/2.0.0: 976 | resolution: {integrity: sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=} 977 | engines: {node: '>=4'} 978 | dev: true 979 | 980 | /proxy-addr/2.0.6: 981 | resolution: {integrity: sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==} 982 | engines: {node: '>= 0.10'} 983 | dependencies: 984 | forwarded: 0.1.2 985 | ipaddr.js: 1.9.1 986 | dev: false 987 | 988 | /pstree.remy/1.1.8: 989 | resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} 990 | dev: true 991 | 992 | /pump/3.0.0: 993 | resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} 994 | dependencies: 995 | end-of-stream: 1.4.4 996 | once: 1.4.0 997 | dev: true 998 | 999 | /pupa/2.1.1: 1000 | resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==} 1001 | engines: {node: '>=8'} 1002 | dependencies: 1003 | escape-goat: 2.1.1 1004 | dev: true 1005 | 1006 | /qs/6.7.0: 1007 | resolution: {integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==} 1008 | engines: {node: '>=0.6'} 1009 | dev: false 1010 | 1011 | /range-parser/1.2.1: 1012 | resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} 1013 | engines: {node: '>= 0.6'} 1014 | dev: false 1015 | 1016 | /raw-body/2.4.0: 1017 | resolution: {integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==} 1018 | engines: {node: '>= 0.8'} 1019 | dependencies: 1020 | bytes: 3.1.0 1021 | http-errors: 1.7.2 1022 | iconv-lite: 0.4.24 1023 | unpipe: 1.0.0 1024 | dev: false 1025 | 1026 | /rc/1.2.8: 1027 | resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} 1028 | hasBin: true 1029 | dependencies: 1030 | deep-extend: 0.6.0 1031 | ini: 1.3.8 1032 | minimist: 1.2.5 1033 | strip-json-comments: 2.0.1 1034 | dev: true 1035 | 1036 | /read-pkg/4.0.1: 1037 | resolution: {integrity: sha1-ljYlN48+HE1IyFhytabsfV0JMjc=} 1038 | engines: {node: '>=6'} 1039 | dependencies: 1040 | normalize-package-data: 2.5.0 1041 | parse-json: 4.0.0 1042 | pify: 3.0.0 1043 | dev: true 1044 | 1045 | /readdirp/3.5.0: 1046 | resolution: {integrity: sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==} 1047 | engines: {node: '>=8.10.0'} 1048 | dependencies: 1049 | picomatch: 2.2.3 1050 | dev: true 1051 | 1052 | /registry-auth-token/4.2.1: 1053 | resolution: {integrity: sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==} 1054 | engines: {node: '>=6.0.0'} 1055 | dependencies: 1056 | rc: 1.2.8 1057 | dev: true 1058 | 1059 | /registry-url/5.1.0: 1060 | resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} 1061 | engines: {node: '>=8'} 1062 | dependencies: 1063 | rc: 1.2.8 1064 | dev: true 1065 | 1066 | /require-directory/2.1.1: 1067 | resolution: {integrity: sha1-jGStX9MNqxyXbiNE/+f3kqam30I=} 1068 | engines: {node: '>=0.10.0'} 1069 | dev: true 1070 | 1071 | /require-main-filename/2.0.0: 1072 | resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} 1073 | dev: true 1074 | 1075 | /resolve/1.20.0: 1076 | resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} 1077 | dependencies: 1078 | is-core-module: 2.2.0 1079 | path-parse: 1.0.6 1080 | dev: true 1081 | 1082 | /responselike/1.0.2: 1083 | resolution: {integrity: sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=} 1084 | dependencies: 1085 | lowercase-keys: 1.0.1 1086 | dev: true 1087 | 1088 | /rxjs/6.6.7: 1089 | resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} 1090 | engines: {npm: '>=2.0.0'} 1091 | dependencies: 1092 | tslib: 1.14.1 1093 | dev: true 1094 | 1095 | /safe-buffer/5.1.2: 1096 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1097 | dev: false 1098 | 1099 | /safer-buffer/2.1.2: 1100 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 1101 | dev: false 1102 | 1103 | /semver-diff/3.1.1: 1104 | resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==} 1105 | engines: {node: '>=8'} 1106 | dependencies: 1107 | semver: 6.3.0 1108 | dev: true 1109 | 1110 | /semver/5.7.1: 1111 | resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} 1112 | hasBin: true 1113 | dev: true 1114 | 1115 | /semver/6.3.0: 1116 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 1117 | hasBin: true 1118 | dev: true 1119 | 1120 | /send/0.17.1: 1121 | resolution: {integrity: sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==} 1122 | engines: {node: '>= 0.8.0'} 1123 | dependencies: 1124 | debug: 2.6.9 1125 | depd: 1.1.2 1126 | destroy: 1.0.4 1127 | encodeurl: 1.0.2 1128 | escape-html: 1.0.3 1129 | etag: 1.8.1 1130 | fresh: 0.5.2 1131 | http-errors: 1.7.3 1132 | mime: 1.6.0 1133 | ms: 2.1.1 1134 | on-finished: 2.3.0 1135 | range-parser: 1.2.1 1136 | statuses: 1.5.0 1137 | dev: false 1138 | 1139 | /serve-static/1.14.1: 1140 | resolution: {integrity: sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==} 1141 | engines: {node: '>= 0.8.0'} 1142 | dependencies: 1143 | encodeurl: 1.0.2 1144 | escape-html: 1.0.3 1145 | parseurl: 1.3.3 1146 | send: 0.17.1 1147 | dev: false 1148 | 1149 | /set-blocking/2.0.0: 1150 | resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} 1151 | dev: true 1152 | 1153 | /setprototypeof/1.1.1: 1154 | resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} 1155 | dev: false 1156 | 1157 | /signal-exit/3.0.3: 1158 | resolution: {integrity: sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==} 1159 | dev: true 1160 | 1161 | /spawn-command/0.0.2-1: 1162 | resolution: {integrity: sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=} 1163 | dev: true 1164 | 1165 | /spdx-correct/3.1.1: 1166 | resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} 1167 | dependencies: 1168 | spdx-expression-parse: 3.0.1 1169 | spdx-license-ids: 3.0.7 1170 | dev: true 1171 | 1172 | /spdx-exceptions/2.3.0: 1173 | resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} 1174 | dev: true 1175 | 1176 | /spdx-expression-parse/3.0.1: 1177 | resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} 1178 | dependencies: 1179 | spdx-exceptions: 2.3.0 1180 | spdx-license-ids: 3.0.7 1181 | dev: true 1182 | 1183 | /spdx-license-ids/3.0.7: 1184 | resolution: {integrity: sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==} 1185 | dev: true 1186 | 1187 | /statuses/1.5.0: 1188 | resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=} 1189 | engines: {node: '>= 0.6'} 1190 | dev: false 1191 | 1192 | /string-width/3.1.0: 1193 | resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} 1194 | engines: {node: '>=6'} 1195 | dependencies: 1196 | emoji-regex: 7.0.3 1197 | is-fullwidth-code-point: 2.0.0 1198 | strip-ansi: 5.2.0 1199 | dev: true 1200 | 1201 | /string-width/4.2.2: 1202 | resolution: {integrity: sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==} 1203 | engines: {node: '>=8'} 1204 | dependencies: 1205 | emoji-regex: 8.0.0 1206 | is-fullwidth-code-point: 3.0.0 1207 | strip-ansi: 6.0.0 1208 | dev: true 1209 | 1210 | /strip-ansi/5.2.0: 1211 | resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} 1212 | engines: {node: '>=6'} 1213 | dependencies: 1214 | ansi-regex: 4.1.0 1215 | dev: true 1216 | 1217 | /strip-ansi/6.0.0: 1218 | resolution: {integrity: sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==} 1219 | engines: {node: '>=8'} 1220 | dependencies: 1221 | ansi-regex: 5.0.0 1222 | dev: true 1223 | 1224 | /strip-json-comments/2.0.1: 1225 | resolution: {integrity: sha1-PFMZQukIwml8DsNEhYwobHygpgo=} 1226 | engines: {node: '>=0.10.0'} 1227 | dev: true 1228 | 1229 | /supports-color/5.5.0: 1230 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1231 | engines: {node: '>=4'} 1232 | dependencies: 1233 | has-flag: 3.0.0 1234 | dev: true 1235 | 1236 | /supports-color/6.1.0: 1237 | resolution: {integrity: sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==} 1238 | engines: {node: '>=6'} 1239 | dependencies: 1240 | has-flag: 3.0.0 1241 | dev: true 1242 | 1243 | /supports-color/7.2.0: 1244 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1245 | engines: {node: '>=8'} 1246 | dependencies: 1247 | has-flag: 4.0.0 1248 | dev: true 1249 | 1250 | /term-size/2.2.1: 1251 | resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} 1252 | engines: {node: '>=8'} 1253 | dev: true 1254 | 1255 | /to-readable-stream/1.0.0: 1256 | resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} 1257 | engines: {node: '>=6'} 1258 | dev: true 1259 | 1260 | /to-regex-range/5.0.1: 1261 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1262 | engines: {node: '>=8.0'} 1263 | dependencies: 1264 | is-number: 7.0.0 1265 | dev: true 1266 | 1267 | /toidentifier/1.0.0: 1268 | resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==} 1269 | engines: {node: '>=0.6'} 1270 | dev: false 1271 | 1272 | /touch/3.1.0: 1273 | resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} 1274 | hasBin: true 1275 | dependencies: 1276 | nopt: 1.0.10 1277 | dev: true 1278 | 1279 | /tree-kill/1.2.2: 1280 | resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} 1281 | hasBin: true 1282 | dev: true 1283 | 1284 | /tslib/1.14.1: 1285 | resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} 1286 | dev: true 1287 | 1288 | /type-fest/0.8.1: 1289 | resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} 1290 | engines: {node: '>=8'} 1291 | dev: true 1292 | 1293 | /type-is/1.6.18: 1294 | resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} 1295 | engines: {node: '>= 0.6'} 1296 | dependencies: 1297 | media-typer: 0.3.0 1298 | mime-types: 2.1.30 1299 | dev: false 1300 | 1301 | /typedarray-to-buffer/3.1.5: 1302 | resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} 1303 | dependencies: 1304 | is-typedarray: 1.0.0 1305 | dev: true 1306 | 1307 | /undefsafe/2.0.3: 1308 | resolution: {integrity: sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==} 1309 | dependencies: 1310 | debug: 2.6.9 1311 | dev: true 1312 | 1313 | /unique-string/2.0.0: 1314 | resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} 1315 | engines: {node: '>=8'} 1316 | dependencies: 1317 | crypto-random-string: 2.0.0 1318 | dev: true 1319 | 1320 | /unpipe/1.0.0: 1321 | resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=} 1322 | engines: {node: '>= 0.8'} 1323 | dev: false 1324 | 1325 | /update-notifier/4.1.3: 1326 | resolution: {integrity: sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==} 1327 | engines: {node: '>=8'} 1328 | dependencies: 1329 | boxen: 4.2.0 1330 | chalk: 3.0.0 1331 | configstore: 5.0.1 1332 | has-yarn: 2.1.0 1333 | import-lazy: 2.1.0 1334 | is-ci: 2.0.0 1335 | is-installed-globally: 0.3.2 1336 | is-npm: 4.0.0 1337 | is-yarn-global: 0.3.0 1338 | latest-version: 5.1.0 1339 | pupa: 2.1.1 1340 | semver-diff: 3.1.1 1341 | xdg-basedir: 4.0.0 1342 | dev: true 1343 | 1344 | /url-parse-lax/3.0.0: 1345 | resolution: {integrity: sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=} 1346 | engines: {node: '>=4'} 1347 | dependencies: 1348 | prepend-http: 2.0.0 1349 | dev: true 1350 | 1351 | /utils-merge/1.0.1: 1352 | resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} 1353 | engines: {node: '>= 0.4.0'} 1354 | dev: false 1355 | 1356 | /validate-npm-package-license/3.0.4: 1357 | resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} 1358 | dependencies: 1359 | spdx-correct: 3.1.1 1360 | spdx-expression-parse: 3.0.1 1361 | dev: true 1362 | 1363 | /vary/1.1.2: 1364 | resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=} 1365 | engines: {node: '>= 0.8'} 1366 | dev: false 1367 | 1368 | /which-module/2.0.0: 1369 | resolution: {integrity: sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=} 1370 | dev: true 1371 | 1372 | /widest-line/3.1.0: 1373 | resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==} 1374 | engines: {node: '>=8'} 1375 | dependencies: 1376 | string-width: 4.2.2 1377 | dev: true 1378 | 1379 | /wrap-ansi/5.1.0: 1380 | resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} 1381 | engines: {node: '>=6'} 1382 | dependencies: 1383 | ansi-styles: 3.2.1 1384 | string-width: 3.1.0 1385 | strip-ansi: 5.2.0 1386 | dev: true 1387 | 1388 | /wrappy/1.0.2: 1389 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} 1390 | dev: true 1391 | 1392 | /write-file-atomic/3.0.3: 1393 | resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} 1394 | dependencies: 1395 | imurmurhash: 0.1.4 1396 | is-typedarray: 1.0.0 1397 | signal-exit: 3.0.3 1398 | typedarray-to-buffer: 3.1.5 1399 | dev: true 1400 | 1401 | /xdg-basedir/4.0.0: 1402 | resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} 1403 | engines: {node: '>=8'} 1404 | dev: true 1405 | 1406 | /y18n/4.0.3: 1407 | resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} 1408 | dev: true 1409 | 1410 | /yargs-parser/13.1.2: 1411 | resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} 1412 | dependencies: 1413 | camelcase: 5.3.1 1414 | decamelize: 1.2.0 1415 | dev: true 1416 | 1417 | /yargs/13.3.2: 1418 | resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} 1419 | dependencies: 1420 | cliui: 5.0.0 1421 | find-up: 3.0.0 1422 | get-caller-file: 2.0.5 1423 | require-directory: 2.1.1 1424 | require-main-filename: 2.0.0 1425 | set-blocking: 2.0.0 1426 | string-width: 3.1.0 1427 | which-module: 2.0.0 1428 | y18n: 4.0.3 1429 | yargs-parser: 13.1.2 1430 | dev: true 1431 | -------------------------------------------------------------------------------- /r-react-demo-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/davidruvolo51/r-react-demo/f820d21475c387ec5b365729e35854fc40791908/r-react-demo-screenshot.png -------------------------------------------------------------------------------- /r-react-demo.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders":[ 3 | { 4 | "path": "." 5 | } 6 | ], 7 | "settings": {} 8 | } 9 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | //////////////////////////////////////////////////////////////////////////////// 2 | // FILE: server.js 3 | // AUTHOR: David Ruvolo 4 | // CREATED: 2019-11-01 5 | // MODIFIED: 2020-11-18 6 | // PURPOSE: server for node.js and express.js application 7 | // DEPENDENCIES: express, bodyParser, node 8 | // STATUS: working 9 | // COMMENTS: NA 10 | //////////////////////////////////////////////////////////////////////////////// 11 | 12 | // requires 13 | const express = require('express'); 14 | const bodyParser = require('body-parser'); 15 | const { R } = require("@fridgerator/r-script"); 16 | const cors = require("cors"); 17 | 18 | // define app and set port 19 | const app = express(); 20 | const port = process.env.PORT || 5000; 21 | app.use(bodyParser.json()); 22 | app.use(bodyParser.urlencoded({ extended: true })); 23 | app.use(cors()); 24 | 25 | //////////////////////////////////////// 26 | 27 | // Process User Input 28 | app.post('/data', (req, res) => { 29 | 30 | // get input 31 | let power = parseInt(req.body.power); 32 | let input = parseInt(req.body.value); 33 | 34 | // process data using js Math.pow() 35 | let squaredJS = Math.pow(input, power); 36 | 37 | // run through R script 38 | let r = new R("./R/index.R"); 39 | r.data(input, power); 40 | let squaredR = r.callSync(); 41 | 42 | // send results 43 | res.send({ 44 | squaredJS: squaredJS, 45 | squaredR: squaredR, 46 | }) 47 | }) 48 | 49 | // set port 50 | app.listen(port, () => console.log(`Listening on port ${port}`)); --------------------------------------------------------------------------------