├── run
├── frontend
├── src
│ ├── components
│ │ ├── header
│ │ │ ├── Header.js
│ │ │ └── css
│ │ │ │ └── Header.css
│ │ ├── Error404 .js
│ │ ├── footer
│ │ │ ├── css
│ │ │ │ └── footer.css
│ │ │ └── Footer.js
│ │ └── code
│ │ │ ├── defaults.js
│ │ │ ├── css
│ │ │ └── Execute.css
│ │ │ └── Execute.js
│ ├── media
│ │ ├── icon-gears.png
│ │ ├── icon-play-black.png
│ │ ├── icon-octocat-black.png
│ │ ├── icon-octocat-gray.png
│ │ └── icon-play-light-gray.png
│ ├── actions
│ │ ├── types.js
│ │ └── Execute.js
│ ├── reducers
│ │ ├── index.js
│ │ └── Execute.js
│ ├── setupTests.js
│ ├── App.test.js
│ ├── index.js
│ ├── App.css
│ ├── index.css
│ ├── store.js
│ ├── App.js
│ ├── logo.svg
│ └── serviceWorker.js
├── .firebaserc
├── public
│ ├── robots.txt
│ ├── favicon.ico
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── index.html
├── firebase.json
└── package.json
├── .dockerignore
├── core
├── services
│ ├── config.js
│ ├── javascript.js
│ ├── python.js
│ ├── cSharp.js
│ ├── java.js
│ ├── rust.js
│ └── golang.js
├── package.json
├── Server.js
└── yarn.lock
├── Dockerfile
├── .github
├── ISSUE_TEMPLATE
│ ├── feature_request.md
│ └── bug_report.md
└── workflows
│ ├── deploy_frontend.yml
│ └── deploy_backend.yml
├── LICENSE
├── README.md
├── CONTRIBUTING.md
├── CODE_OF_CONDUCT.md
└── .gitignore
/run:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | cd core && yarn run dev
--------------------------------------------------------------------------------
/frontend/src/components/header/Header.js:
--------------------------------------------------------------------------------
1 | // add header code here...
2 |
--------------------------------------------------------------------------------
/frontend/.firebaserc:
--------------------------------------------------------------------------------
1 | {
2 | "projects": {
3 | "default": "white-rose-ont"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/.dockerignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | npm-debug.log
3 | Dockerfile
4 | .dockerignore
5 |
6 | frontend/
7 | .github
--------------------------------------------------------------------------------
/frontend/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/core/services/config.js:
--------------------------------------------------------------------------------
1 | exports.codePath = process.env.CODE_PATH || "../../";
2 | exports.timeOut = process.env.TIME_OUT || 5000;
3 |
--------------------------------------------------------------------------------
/frontend/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/paulonteri/remote-code-execution-environment/HEAD/frontend/public/favicon.ico
--------------------------------------------------------------------------------
/frontend/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/paulonteri/remote-code-execution-environment/HEAD/frontend/public/logo192.png
--------------------------------------------------------------------------------
/frontend/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/paulonteri/remote-code-execution-environment/HEAD/frontend/public/logo512.png
--------------------------------------------------------------------------------
/frontend/src/media/icon-gears.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/paulonteri/remote-code-execution-environment/HEAD/frontend/src/media/icon-gears.png
--------------------------------------------------------------------------------
/frontend/src/media/icon-play-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/paulonteri/remote-code-execution-environment/HEAD/frontend/src/media/icon-play-black.png
--------------------------------------------------------------------------------
/frontend/src/media/icon-octocat-black.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/paulonteri/remote-code-execution-environment/HEAD/frontend/src/media/icon-octocat-black.png
--------------------------------------------------------------------------------
/frontend/src/media/icon-octocat-gray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/paulonteri/remote-code-execution-environment/HEAD/frontend/src/media/icon-octocat-gray.png
--------------------------------------------------------------------------------
/frontend/src/media/icon-play-light-gray.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/paulonteri/remote-code-execution-environment/HEAD/frontend/src/media/icon-play-light-gray.png
--------------------------------------------------------------------------------
/frontend/src/actions/types.js:
--------------------------------------------------------------------------------
1 | export const RUN_CODE_SUCCESS = "RUN_CODE_SUCCESS";
2 | export const RUN_CODE_RUNNING = "RUN_CODE_RUNNING";
3 | export const RUN_CODE_FAILED = "RUN_CODE_FAILED";
4 |
--------------------------------------------------------------------------------
/frontend/src/reducers/index.js:
--------------------------------------------------------------------------------
1 | import { combineReducers } from "redux";
2 |
3 | import execution from "./Execute";
4 |
5 | export default combineReducers({
6 | executionReducer: execution,
7 | });
8 |
--------------------------------------------------------------------------------
/frontend/src/components/Error404 .js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | export const Error404 = () => {
4 | return (
5 |
6 |
404 Error
7 |
8 | );
9 | };
10 |
11 | export default Error404;
12 |
--------------------------------------------------------------------------------
/frontend/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom/extend-expect';
6 |
--------------------------------------------------------------------------------
/frontend/firebase.json:
--------------------------------------------------------------------------------
1 | {
2 | "hosting": {
3 | "public": "build",
4 | "site": "code-executer",
5 | "ignore": ["firebase.json", "**/.*", "**/node_modules/**"],
6 | "rewrites": [
7 | {
8 | "source": "**",
9 | "destination": "/index.html"
10 | }
11 | ]
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/frontend/src/App.test.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { render } from "@testing-library/react";
3 | import App from "./App";
4 |
5 | test("renders learn react link", () => {
6 | const { getByText } = render();
7 | // const linkElement = getByText(/learn react/i);
8 | // expect(linkElement).toBeInTheDocument();
9 | });
10 |
--------------------------------------------------------------------------------
/frontend/src/index.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import ReactDOM from "react-dom";
3 | import "./index.css";
4 | import App from "./App";
5 | import * as serviceWorker from "./serviceWorker";
6 |
7 | ReactDOM.render(
8 |
9 |
10 | ,
11 | document.getElementById("root")
12 | );
13 |
14 | serviceWorker.register();
15 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM golang:alpine
2 |
3 | RUN apk add --no-cache nodejs yarn
4 | RUN apk add --no-cache openjdk8
5 | ENV JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk
6 | ENV PATH="$JAVA_HOME/bin:${PATH}"
7 | RUN apk add --no-cache python3
8 | RUN apk add --no-cache rust
9 | RUN apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing mono
10 |
11 | WORKDIR /usr/src/app
12 |
13 | COPY ./core/package.json ./
14 | COPY ./core/yarn.lock ./
15 |
16 | RUN yarn --production
17 |
18 | COPY ./core .
19 |
20 |
21 | EXPOSE 8080
22 |
23 | CMD [ "node", "Server.js" ]
24 |
--------------------------------------------------------------------------------
/frontend/src/App.css:
--------------------------------------------------------------------------------
1 | ul {
2 | margin: 0;
3 | padding: 0;
4 | list-style-type: none;
5 | }
6 |
7 | a {
8 | text-decoration: none;
9 | }
10 |
11 | .larger-screen-warn {
12 | font-size: small !important;
13 | margin-bottom: 15px !important;
14 | display: none;
15 | }
16 |
17 | @media only screen and (max-width: 769px) {
18 | .hide-tablet {
19 | display: none !important;
20 | }
21 |
22 | .larger-screen-warn {
23 | display: block;
24 | }
25 | }
26 |
27 | @media only screen and (max-width: 600px) {
28 | .hide-mobile {
29 | display: none !important;
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/frontend/src/components/footer/css/footer.css:
--------------------------------------------------------------------------------
1 | footer ul {
2 | display: flex;
3 | flex-direction: row;
4 | justify-content: center;
5 | align-content: center;
6 | width: 100%;
7 | margin-top: 20px;
8 | margin-bottom: 10px;
9 | }
10 |
11 | footer li {
12 | margin: 0 20px;
13 | }
14 |
15 | footer li a,
16 | p {
17 | color: var(--editer-white);
18 | }
19 |
20 | footer p a {
21 | color: var(--editer-white);
22 | font-weight: bold;
23 | text-decoration: underline;
24 | }
25 |
26 | footer p {
27 | margin-top: 20px;
28 | margin-bottom: 30px;
29 | text-align: center;
30 | }
31 |
--------------------------------------------------------------------------------
/frontend/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "Code Executer",
3 | "name": "Remote Code Executor",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/frontend/src/index.css:
--------------------------------------------------------------------------------
1 | :root {
2 | --editer-gray: #808080;
3 | --editer-light-gray: lightgray;
4 | --editer-black: #282a36;
5 | --editer-white: azure;
6 | --editer-min-height: 490px;
7 | --editer-height: 74vh;
8 | }
9 |
10 | body {
11 | margin: 0;
12 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
13 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
14 | sans-serif;
15 | -webkit-font-smoothing: antialiased;
16 | -moz-osx-font-smoothing: grayscale;
17 | }
18 |
19 | code {
20 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
21 | monospace;
22 | }
23 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/feature_request.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Feature request
3 | about: Suggest an idea for this project
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Is your feature request related to a problem? Please describe.**
11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
12 |
13 | **Describe the solution you'd like**
14 | A clear and concise description of what you want to happen.
15 |
16 | **Describe alternatives you've considered**
17 | A clear and concise description of any alternative solutions or features you've considered.
18 |
19 | **Additional context**
20 | Add any other context or screenshots about the feature request here.
21 |
--------------------------------------------------------------------------------
/frontend/src/store.js:
--------------------------------------------------------------------------------
1 | import { createStore, applyMiddleware } from "redux";
2 | import thunk from "redux-thunk";
3 | import rootReducer from "./reducers";
4 |
5 | const initialState = {};
6 | const middleware = [thunk];
7 |
8 | var md = null;
9 |
10 | if (process.env.NODE_ENV === `development`) {
11 | const { createLogger } = require(`redux-logger`);
12 | const { composeWithDevTools } = require("redux-devtools-extension");
13 |
14 | const logger = createLogger({
15 | // ...options
16 | });
17 |
18 | middleware.push(logger);
19 | md = composeWithDevTools(applyMiddleware(...middleware));
20 | } else {
21 | md = applyMiddleware(...middleware);
22 | }
23 |
24 | const store = createStore(rootReducer, initialState, md);
25 |
26 | export default store;
27 |
--------------------------------------------------------------------------------
/frontend/src/App.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { Provider } from "react-redux";
3 | import store from "./store";
4 | import "./App.css";
5 | import Execute from "./components/code/Execute";
6 | import Footer from "./components/footer/Footer";
7 | // TODO: Add more paths
8 | // import { Switch, HashRouter, Route } from "react-router-dom";
9 | // import Error404 from "./components/Error404 ";
10 |
11 | function App() {
12 | return (
13 |
14 |
15 | {/*
16 |
17 |
18 |
19 |
20 | */}
21 |
22 |
23 | );
24 | }
25 |
26 | export default App;
27 |
--------------------------------------------------------------------------------
/frontend/src/actions/Execute.js:
--------------------------------------------------------------------------------
1 | import axios from "axios";
2 | import { RUN_CODE_SUCCESS, RUN_CODE_FAILED, RUN_CODE_RUNNING } from "./types";
3 | var server = "https://api.runcode.proj.paulonteri.com";
4 |
5 | const addr = () => {
6 | if (!process.env.NODE_ENV || process.env.NODE_ENV === "development") {
7 | return "http://localhost:6500/code";
8 | } else {
9 | return server + "/code";
10 | }
11 | };
12 |
13 | const headers = {
14 | "Content-Type": "multipart/form-data",
15 | };
16 |
17 | export const runCode = (code) => (dispatch, getState) => {
18 | dispatch({ type: RUN_CODE_RUNNING });
19 | axios
20 | .post(addr(), code, {
21 | headers: headers,
22 | })
23 | .then((res) => {
24 | dispatch({
25 | type: RUN_CODE_SUCCESS,
26 | payload: res.data,
27 | });
28 | })
29 | .catch((err) => {
30 | console.log(err);
31 | dispatch({
32 | type: RUN_CODE_FAILED,
33 | });
34 | });
35 | };
36 |
--------------------------------------------------------------------------------
/.github/workflows/deploy_frontend.yml:
--------------------------------------------------------------------------------
1 | name: Deploy Frontend
2 | on:
3 | push:
4 | paths:
5 | - 'frontend/**'
6 | branches:
7 | - deploy
8 | - master
9 | pull_request:
10 | paths:
11 | - 'frontend/**'
12 | branches:
13 | - deploy
14 |
15 | jobs:
16 | build:
17 | name: Build & Deploy
18 | runs-on: ubuntu-latest
19 | steps:
20 | - name: Checkout Repo
21 | uses: actions/checkout@master
22 | - name: Navigate
23 | run: cd frontend
24 | - name: Install Dependencies
25 | working-directory: ./frontend
26 | run: yarn
27 | - name: Build
28 | working-directory: ./frontend
29 | env:
30 | CI: false
31 | run: yarn build
32 | - name: Deploy to Firebase
33 | uses: w9jds/firebase-action@master
34 | with:
35 | args: deploy --only hosting
36 | env:
37 | FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}
38 | PROJECT_PATH: './frontend'
39 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/bug_report.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: Bug report
3 | about: Create a report to help us improve
4 | title: ''
5 | labels: ''
6 | assignees: ''
7 |
8 | ---
9 |
10 | **Describe the bug**
11 | A clear and concise description of what the bug is.
12 |
13 | **To Reproduce**
14 | Steps to reproduce the behavior:
15 | 1. Go to '...'
16 | 2. Click on '....'
17 | 3. Scroll down to '....'
18 | 4. See error
19 |
20 | **Expected behavior**
21 | A clear and concise description of what you expected to happen.
22 |
23 | **Screenshots**
24 | If applicable, add screenshots to help explain your problem.
25 |
26 | **Desktop (please complete the following information):**
27 | - OS: [e.g. iOS]
28 | - Browser [e.g. chrome, safari]
29 | - Version [e.g. 22]
30 |
31 | **Smartphone (please complete the following information):**
32 | - Device: [e.g. iPhone6]
33 | - OS: [e.g. iOS8.1]
34 | - Browser [e.g. stock browser, safari]
35 | - Version [e.g. 22]
36 |
37 | **Additional context**
38 | Add any other context about the problem here.
39 |
--------------------------------------------------------------------------------
/core/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "code-executer",
3 | "version": "1.0.0",
4 | "description": "Remote Code Execution App",
5 | "private": true,
6 | "main": "Server.js",
7 | "scripts": {
8 | "start": "nodemon Server.js",
9 | "client": "cd ../frontend && yarn start",
10 | "dev": "concurrently --kill-others-on-fail \"yarn start\" \"yarn run client\"",
11 | "test": "echo \"Error: no test specified\" && exit 1"
12 | },
13 | "repository": {
14 | "type": "git",
15 | "url": "git+https://github.com/paulonteri/code-executer.git"
16 | },
17 | "author": "Paul Onteri - https://paulonteri.com/",
18 | "license": "MIT",
19 | "bugs": {
20 | "url": "https://github.com/paulonteri/code-executer/issues"
21 | },
22 | "homepage": "https://github.com/paulonteri/code-executer#readme",
23 | "dependencies": {
24 | "cors": "^2.8.5",
25 | "express": "^4.17.1",
26 | "express-formidable": "^1.2.0",
27 | "uuid": "^8.2.0"
28 | },
29 | "devDependencies": {
30 | "concurrently": "^5.2.0",
31 | "nodemon": "^2.0.4"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/frontend/src/reducers/Execute.js:
--------------------------------------------------------------------------------
1 | import {
2 | RUN_CODE_SUCCESS,
3 | RUN_CODE_FAILED,
4 | RUN_CODE_RUNNING,
5 | } from "../actions/types";
6 |
7 | const initialState = {
8 | output: null,
9 | runCodeLoading: false,
10 | runCodeFail: false,
11 | runCodeOk: false,
12 | };
13 |
14 | export default function (state = initialState, action) {
15 | switch (action.type) {
16 | case RUN_CODE_SUCCESS:
17 | return {
18 | ...state,
19 | output: action.payload,
20 | runCodeLoading: false,
21 | runCodeFail: false,
22 | runCodeOk: true,
23 | };
24 | case RUN_CODE_RUNNING:
25 | return {
26 | ...state,
27 | output: null,
28 | runCodeLoading: true,
29 | runCodeFail: false,
30 | runCodeOk: false,
31 | };
32 | case RUN_CODE_FAILED:
33 | return {
34 | ...state,
35 | output: null,
36 | runCodeLoading: false,
37 | runCodeFail: true,
38 | runCodeOk: false,
39 | };
40 | default:
41 | return state;
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/frontend/src/components/code/defaults.js:
--------------------------------------------------------------------------------
1 | export const javaDefault = `public class Main {
2 | public static void main(String[] args) {
3 | System.out.println("FAST. GOOD. CHEAP. Choose any two.");
4 | }
5 | }`;
6 |
7 | export const pyDefault = `print("Truth can only be found in one place: the code.")`;
8 |
9 | export const jsDefault = `console.log("The best way to get a project done faster is to start sooner.")`;
10 |
11 | export const csDefault = `using System;
12 |
13 | public class HelloWorld
14 | {
15 | public static void Main(string[] args)
16 | {
17 | Console.WriteLine ("Code is like humor. When you have to explain it, it’s bad.");
18 | }
19 | }`;
20 |
21 | export const golangDefault = `// You can edit this code!
22 | package main
23 |
24 | import "fmt"
25 |
26 | func main() {
27 | fmt.Println("Go will make you love programming again.")
28 | }
29 | `;
30 |
31 | export const rustDefault = `fn main() {
32 | println!("Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.");
33 | }`;
34 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Paul Onteri
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 |
--------------------------------------------------------------------------------
/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "code-executer",
3 | "version": "1.0.0",
4 | "description": "Remote Code Execution App",
5 | "private": true,
6 | "dependencies": {
7 | "@testing-library/jest-dom": "^4.2.4",
8 | "@testing-library/react": "^9.3.2",
9 | "@testing-library/user-event": "^7.1.2",
10 | "ace-builds": "^1.4.12",
11 | "axios": "^0.19.2",
12 | "react": "^16.13.1",
13 | "react-ace": "^9.1.1",
14 | "react-dom": "^16.13.1",
15 | "react-epic-spinners": "^0.4.1",
16 | "react-redux": "^7.2.0",
17 | "react-router-dom": "^5.2.0",
18 | "react-scripts": "3.4.1",
19 | "redux": "^4.0.5",
20 | "redux-thunk": "^2.3.0"
21 | },
22 | "devDependencies": {
23 | "redux-devtools-extension": "^2.13.8",
24 | "redux-logger": "^3.0.6"
25 | },
26 | "scripts": {
27 | "start": "react-scripts start",
28 | "build": "react-scripts build",
29 | "test": "react-scripts test",
30 | "eject": "react-scripts eject"
31 | },
32 | "eslintConfig": {
33 | "extends": "react-app"
34 | },
35 | "browserslist": {
36 | "production": [
37 | ">0.2%",
38 | "not dead",
39 | "not op_mini all"
40 | ],
41 | "development": [
42 | "last 1 chrome version",
43 | "last 1 firefox version",
44 | "last 1 safari version"
45 | ]
46 | },
47 | "repository": {
48 | "type": "git",
49 | "url": "git+https://github.com/paulonteri/code-executer.git"
50 | },
51 | "author": "Paul Onteri - https://paulonteri.com/",
52 | "bugs": {
53 | "url": "https://github.com/paulonteri/code-executer/issues"
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/.github/workflows/deploy_backend.yml:
--------------------------------------------------------------------------------
1 | name: Deploy Backend
2 | on:
3 | schedule:
4 | - cron: '30 */12 * * *'
5 | push:
6 | paths:
7 | - 'core/**'
8 | - 'Dockerfile'
9 | branches:
10 | - master
11 | - deploy
12 | pull_request:
13 | paths:
14 | - 'core/**'
15 | branches:
16 | - 'deploy'
17 | workflow_dispatch:
18 |
19 |
20 | jobs:
21 | deploy:
22 | name: Deploy job
23 | runs-on: ubuntu-latest
24 | steps:
25 | - name: Checkout the repository
26 | uses: actions/checkout@v1
27 |
28 | - name: Build Docker image
29 | run: |
30 | docker build . --tag us.gcr.io/${{ secrets.GCLOUD_PROJECT }}/${{ secrets.GCLOUD_APP_NAME }}
31 | - name: Authenticate into Google Cloud Platform
32 | uses: google-github-actions/setup-gcloud@master
33 | with:
34 | service_account_email: ${{ secrets.GCLOUD_EMAIL }}
35 | service_account_key: ${{ secrets.GCLOUD_AUTH }}
36 |
37 | - name: Configure Docker to use Google Cloud Platform
38 | run: "gcloud auth configure-docker --quiet"
39 |
40 | - name: Push image to Google Cloud Container Registry
41 | run: docker push us.gcr.io/${{ secrets.GCLOUD_PROJECT }}/${{ secrets.GCLOUD_APP_NAME }}
42 |
43 | - name: Install beta commands and deploy on cloud run
44 | run: |
45 | gcloud components install beta --quiet
46 | gcloud beta run deploy ${{ secrets.GCLOUD_APP_NAME }} --quiet --image us.gcr.io/${{ secrets.GCLOUD_PROJECT }}/${{ secrets.GCLOUD_APP_NAME }} --project ${{ secrets.GCLOUD_PROJECT }} --region ${{ secrets.GCLOUD_REGION }} --platform managed
47 |
--------------------------------------------------------------------------------
/frontend/src/components/footer/Footer.js:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import "./css/footer.css";
3 |
4 | const Footer = () => {
5 | return (
6 |
55 | );
56 | };
57 |
58 | export default Footer;
59 |
--------------------------------------------------------------------------------
/frontend/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
33 |
34 | Code Executer
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # [Remote Code Execution App](https://runcode.paulonteri.com)
2 |
3 | Remote code execution app built with JavaScript (React, NodeJS & Express).
4 |
5 | Try out the live system [here](https://runcode.paulonteri.com/#/).
6 |
7 | 
8 |
9 |
10 |
11 | ---
12 |
13 | Have you ever wondered how Remote Code Execution works?
14 |
15 | This happens on sites like HackerRank & competitive programming websites. You write some code then it's executed on another computer(server). The results are then shown to you.
16 |
17 | I tried implementing that.
18 |
19 | Feel free to go through the code, fix bugs, add new features, e.t.c
20 |
21 | ---
22 |
23 | ## Local Setup
24 |
25 | ### Requirements
26 |
27 | For development, you will only need Node.js and a node global package, Yarn, installed in your environement.
28 |
29 | ### Node
30 |
31 | Just go on [official Node.js website](https://nodejs.org/) and follow the installation instructions.
32 | Also, be sure to have `git` available in your PATH, `npm` might need it (You can find git [here](https://git-scm.com/)).
33 |
34 | If the installation was successful, you should be able to run the following command.
35 |
36 | $ node --version
37 | v8.11.3
38 |
39 | $ npm --version
40 | 6.1.0
41 |
42 | If you need to update `npm`, you can make it using `npm`! Cool right? After running the following command, just open again the command line and be happy.
43 |
44 | $ npm install npm -g
45 |
46 | ###
47 |
48 | ### Yarn installation
49 |
50 | After installing node, this project will need yarn too, so just run the following command.
51 |
52 | $ npm install -g yarn
53 |
54 | ---
55 |
56 | ## Install
57 |
58 | $ git clone https://github.com/paulonteri/remote-code-execution-environment.git
59 | $ cd remote-code-execution-environment
60 | $ cd core && yarn install && cd ../frontend && yarn install && cd ..
61 |
62 | ## Running the project
63 |
64 | To run both the frontend and backend run the `run` script.
65 |
66 | ```sh
67 | ./run
68 | ```
69 |
70 | ---
71 |
72 | ##
73 | Made with love by [Paul Onteri](https://paulonteri.com/).
74 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # Contributing to the Remote Code Execution System
2 |
3 | Thank you for showing interest in contributing to paulonteri/remote-code-execution-environment. Following these guidelines help to communicate that you respect the time of the developers managing and working on this open source project. In return, they should reciprocate that respect in addressing your issue, assessing changes and also helping you finalise your pull requests.
4 |
5 | ---
6 |
7 | ### What do I do? How do I get started?
8 |
9 | Follow the [README.md](/README.md) guide. If you've noticed a bug, want to add a feature or have a question, [search the issue tracker](https://github.com/paulonteri/remote-code-execution-environment/issues) to see if someone else already created a ticket. If that has not yet been done, go ahead and [make one](https://github.com/paulonteri/remote-code-execution-environment/issues/new).
10 |
11 | ### Clone & create a branch
12 |
13 | If this is something you think you can fix, [clone paulonteri/remote-code-execution-environment](https://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository) and create a branch with a descriptive name. Always checkout from the **staging branch**, that is the default and up-to-date branch.
14 |
15 | A good branch name would be:
16 |
17 | ```sh
18 | git checkout -b 13-fix-cta-button
19 | ```
20 |
21 | ### Implement your fix or feature
22 |
23 | At this point, you're ready to make your changes. Feel free to ask for help; everyone was once a beginner; everyone is learning.
24 |
25 | The [requirements](/requirements.txt) file contain the packages and dependencies to be installed and set up.
26 |
27 | Please ensure that the issue you've fixed is related to the branch you're currently working from. If you want to fix something else unrelated to whatever you've worked on, do another checkout from the staging branch and give the new branch an appropriate name.This makes it easy for the maintainers to track your fixes.
28 |
29 | #### Commits
30 | The goal is that each commit has a **single focus**. Each commit should record a single-unit change. Now this can be a bit subjective (which is totally fine), but each commit should make a change to just one aspect of the project.
31 |
32 | ---
33 |
34 | ### New to this?
35 | Here is a **[simple guide](https://blog.usejournal.com/how-to-contribute-to-open-source-software-with-git-github-2b3be6e36c82)** to get you started.
36 |
37 | Thank you.
38 |
--------------------------------------------------------------------------------
/frontend/src/components/header/css/Header.css:
--------------------------------------------------------------------------------
1 | header {
2 | display: flex;
3 | flex-direction: row;
4 | height: 55px;
5 | justify-content: space-between;
6 | align-items: center;
7 | align-content: center;
8 | }
9 |
10 | .header-buttons {
11 | display: flex;
12 | flex-direction: row;
13 | padding-right: 20px;
14 | }
15 |
16 | .header-buttons div {
17 | margin: auto 5px;
18 | }
19 |
20 | .run-code img {
21 | height: 37px;
22 | width: 45px;
23 | padding: 0 2px;
24 | margin: 0;
25 | cursor: pointer;
26 | }
27 |
28 | .dropdown {
29 | position: relative;
30 | display: inline-block;
31 | cursor: pointer;
32 | }
33 |
34 | .dropdown button {
35 | border: none;
36 | background-color: var(--editer-gray);
37 | margin: 0;
38 | padding: 7px 0;
39 | width: 115px;
40 | border-radius: 4px;
41 | cursor: pointer;
42 | }
43 |
44 | .dropdown button,
45 | li {
46 | text-transform: capitalize;
47 | }
48 |
49 | .dropdown:hover .dropdown-content {
50 | display: block;
51 | }
52 |
53 | .dropdown button,
54 | .dropdown-content {
55 | font-size: medium;
56 | }
57 |
58 | .dropdown-content {
59 | display: none;
60 | position: absolute;
61 | background-color: var(--editer-light-gray);
62 | /* box-shadow: 0px 8px 16px 0px rgba(0, 0, 0, 0.2); */
63 | padding: 0;
64 | width: 115px;
65 | margin: 0;
66 | z-index: 5;
67 | border-radius: 0 0 3% 3%;
68 | list-style-type: none;
69 | text-align: center;
70 | margin-top: -1px;
71 | }
72 |
73 | .dropdown-content li {
74 | margin: 0;
75 | padding: 5px 1px;
76 | }
77 |
78 | .dropdown-content li:hover {
79 | font-size: large;
80 | font-weight: bold;
81 | }
82 |
83 | /* .dropdown-content p:last-of-type {
84 | font-size: 0.75em;
85 | } */
86 |
87 | .tooltiptext {
88 | visibility: hidden;
89 | width: 90px;
90 | color: var(--editer-white);
91 | text-align: center;
92 | padding: 5px 0;
93 | position: absolute;
94 | z-index: 1;
95 | right: 3px;
96 | top: 45px;
97 | font-size: medium;
98 | }
99 |
100 | .run-code:hover .tooltiptext {
101 | visibility: visible;
102 | }
103 |
104 | .header-intro img {
105 | height: 45px;
106 | width: 45px;
107 | padding: 5px 15px;
108 | }
109 |
110 | @media only screen and (max-width: 600px) {
111 | .dropdown button {
112 | padding: 7px 0;
113 | width: 95px;
114 | }
115 |
116 | .dropdown-content {
117 | width: 95px;
118 | }
119 | }
120 |
--------------------------------------------------------------------------------
/core/Server.js:
--------------------------------------------------------------------------------
1 | var express = require("express");
2 | var formidable = require("express-formidable");
3 | var cors = require("cors");
4 | var app = express();
5 | var port = process.env.PORT || 6500;
6 | var frontend = process.env.FRONTEND || "https://runcode.paulonteri.com";
7 | const python = require("./services/python");
8 | const java = require("./services/java");
9 | const javascript = require("./services/javascript");
10 | const cSharp = require("./services/cSharp");
11 | const golang = require("./services/golang");
12 | const rust = require("./services/rust");
13 |
14 |
15 | app.use(formidable());
16 |
17 | const corsOptions = () => {
18 | if (process.env.NODE_ENV === "production") {
19 | return {
20 | origin: frontend,
21 | optionsSuccessStatus: 200,
22 | methods: "GET,POST",
23 | };
24 | } else {
25 | return {
26 | optionsSuccessStatus: 200,
27 | };
28 | }
29 | };
30 |
31 | app.use(cors(corsOptions()));
32 |
33 | // ROUTES
34 | app.get("/", (req, res) =>
35 | res.send(
36 | "Hi There! You shouldn't be seeing this. 🙂 Try:{https://runcode.paulonteri.com/#/} or {https://github.com/paulonteri/remote-code-execution-environment}"
37 | )
38 | );
39 |
40 | app.post("/code", (req, res) => {
41 | var text = req.fields.text;
42 | var language = req.fields.language;
43 |
44 | if (!text || !(text.length > 1)) {
45 | res.status(422).send("Write some code!");
46 | }
47 | console.log(language, text)
48 |
49 | switch (language) {
50 | case "python":
51 | python.run(text, function (data) {
52 | res.status(200).json(data);
53 | });
54 | break;
55 | case "javascript":
56 | javascript.run(text, function (data) {
57 | res.status(200).json(data);
58 | });
59 | break;
60 | case "csharp":
61 | cSharp.run(text, function (data) {
62 | res.status(200).json(data);
63 | });
64 | break;
65 | case "java":
66 | java.run(text, function (data) {
67 | res.status(200).json(data);
68 | });
69 | break;
70 | case "golang":
71 | golang.run(text, function (data) {
72 | res.status(200).json(data);
73 | });
74 | break;
75 | case "rust":
76 | rust.run(text, function (data) {
77 | res.status(200).json(data);
78 | });
79 | break;
80 | default:
81 | res.status(422).send("Invalid programming language!");
82 | }
83 | });
84 |
85 | app.listen(port, () =>
86 | console.log(`Backend listening at http://localhost:${port}`)
87 | );
88 |
89 | // end
90 |
--------------------------------------------------------------------------------
/frontend/src/components/code/css/Execute.css:
--------------------------------------------------------------------------------
1 | .code-layout {
2 | height: var(--editer-height);
3 | min-height: var(--editer-min-height);
4 | display: flex;
5 | flex-direction: row;
6 | justify-content: flex-start;
7 | align-content: flex-start;
8 | border-bottom: 8px solid var(--editer-gray);
9 | border-top: 5px solid var(--editer-gray);
10 | }
11 |
12 | .code-results {
13 | flex-basis: 35%;
14 | border-left: 5px solid var(--editer-gray);
15 | color: var(--editer-white);
16 | }
17 |
18 | #text-edit {
19 | height: var(--editer-height) !important;
20 | flex-basis: 65%;
21 | }
22 |
23 | #code-results {
24 | height: var(--editer-height) !important;
25 | width: 100% !important;
26 | border-bottom: 8px solid var(--editer-gray);
27 | }
28 |
29 | #overlay {
30 | position: fixed;
31 | display: none;
32 | width: 100%;
33 | height: 100%;
34 | top: 0;
35 | left: 0;
36 | right: 0;
37 | bottom: 0;
38 | background-color: rgba(0, 0, 0, 0.5);
39 | z-index: 99;
40 | cursor: wait;
41 | }
42 |
43 | #overlay .spinner {
44 | margin: 50vh auto;
45 | }
46 |
47 | /* #code-results,
48 | #text-edit {
49 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
50 | monospace;
51 | } */
52 |
53 | @media only screen and (max-width: 769px) {
54 | #text-edit {
55 | font-size: medium !important;
56 | }
57 |
58 | #code-results {
59 | font-size: medium !important;
60 | }
61 | }
62 |
63 | @media only screen and (max-width: 769px) {
64 | .code-layout {
65 | height: 750px;
66 | display: flex;
67 | flex-direction: column;
68 | justify-content: flex-start;
69 | align-content: flex-start;
70 | border-bottom: 0 solid var(--editer-gray);
71 | border-top: 10px solid var(--editer-gray);
72 | }
73 |
74 | .code-results {
75 | flex-basis: 100%;
76 | border-left: 0 solid var(--editer-gray);
77 | color: var(--editer-white);
78 | height: 250px !important;
79 | }
80 |
81 | .ace-content {
82 | height: 500px !important;
83 | }
84 |
85 | #text-edit {
86 | height: 500px !important;
87 | flex-basis: 100%;
88 | width: 100% !important;
89 | border-bottom: 8px solid var(--editer-gray);
90 | }
91 |
92 | #code-results {
93 | height: 250px !important;
94 | width: 100% !important;
95 | flex-basis: 100%;
96 | width: 100% !important;
97 | border-bottom: 0 solid var(--editer-gray);
98 | }
99 |
100 | footer {
101 | border-top: 10px solid var(--editer-gray);
102 | }
103 | }
104 |
--------------------------------------------------------------------------------
/frontend/src/logo.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/core/services/javascript.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const exec = require("child_process").exec;
3 | const { v1: uuidv1 } = require("uuid");
4 | const config = require("./config");
5 | const env = process.env.NODE_ENV;
6 | const configPath = config.codePath;
7 | const timeOut = config.timeOut;
8 |
9 | // This should never happen
10 | const validate = (str) => {
11 | words = ["require(", "exports.", "module.exports"];
12 | // prevent imports
13 | var valid = !words.some((el) => {
14 | return str.includes(el);
15 | });
16 |
17 | return valid;
18 | };
19 |
20 | const runCode = (code, func) => {
21 | if (validate(code)) {
22 | var fileName = uuidv1();
23 | var actualFile = configPath + fileName + ".js";
24 |
25 | fs.writeFile(actualFile, code, function (err) {
26 | if (err) {
27 | // handle error
28 | console.log("Error creating file: " + err);
29 | } else {
30 | var command = "node " + configPath + fileName;
31 | exec(command, { timeout: timeOut }, function (error, stdout, stderr) {
32 | if (error) {
33 | if (env != "production") {
34 | console.log("Error: " + error);
35 | console.log("Stderr: " + stderr);
36 | }
37 |
38 | if (
39 | error.toString().includes("ERR_CHILD_PROCESS_STDIO_MAXBUFFER")
40 | ) {
41 | errorMessage =
42 | "Process terminated. 'maxBuffer' exceeded. This normally happens during an infinite loop.";
43 | } else if (error.signal === "SIGTERM") {
44 | errorMessage =
45 | "Process terminated. Please check your code and try again.";
46 | } else if (stderr) {
47 | errorMessage = stderr;
48 | } else {
49 | errorMessage = "Something went wrong. Please try again";
50 | }
51 | func({ ERROR: errorMessage }, actualFile);
52 | } else {
53 | if (env != "production") {
54 | console.log("Successfully executed !");
55 | console.log("Stdout: " + stdout);
56 | }
57 | func({ stdout: stdout }, actualFile);
58 | }
59 | });
60 | }
61 | });
62 | } else {
63 | console.log(code);
64 | func({ ERROR: "Not allowed!" });
65 | }
66 | };
67 |
68 | const run = (code, func) => {
69 | runCode(code, function (data, file = null) {
70 | if (file) {
71 | fs.unlink(file, (err) => {
72 | if (err) {
73 | console.error(err);
74 | }
75 | //file removed
76 | });
77 | }
78 | // add more logic
79 | func(data);
80 | });
81 | };
82 |
83 | module.exports = { run: run };
84 |
85 | /*
86 | we definitely need to find a more secure way of doing this
87 | 😭😭😭😭
88 | */
89 |
--------------------------------------------------------------------------------
/core/services/python.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const exec = require("child_process").exec;
3 | const { v1: uuidv1 } = require("uuid");
4 | const config = require("./config");
5 | const env = process.env.NODE_ENV;
6 | const configPath = config.codePath;
7 | const timeOut = config.timeOut;
8 |
9 | // Hacky validation
10 | const validate = (str) => {
11 | reg1 = RegExp(/\bimport\W+(?:\w+\W+){0,}(?:os|subprocess|importlib)\b/g);
12 | words = ["open(","os"];
13 |
14 | if (str.match(reg1)) {
15 | return false;
16 | } else if (
17 | words.every((el) => str.toLowerCase().includes(el.toLowerCase()))
18 | ) {
19 | return false;
20 | }
21 | return true;
22 | };
23 |
24 | const runCode = (code, func) => {
25 | if (validate(code)) {
26 | var fileName = uuidv1();
27 | var actualFile = configPath + fileName + ".py";
28 | fs.writeFile(actualFile, code, function (err) {
29 | if (err) {
30 | // handle error
31 | console.log("Error creating file: " + err);
32 | } else {
33 | var command = "python3 " + configPath + fileName + ".py";
34 | exec(command, { timeout: timeOut }, function (error, stdout, stderr) {
35 | if (error) {
36 | if (env != "production") {
37 | console.log("Error: " + error);
38 | console.log("Stderr: " + stderr);
39 | }
40 |
41 | if (
42 | error.toString().includes("ERR_CHILD_PROCESS_STDIO_MAXBUFFER")
43 | ) {
44 | errorMessage =
45 | "Process terminated. 'maxBuffer' exceeded. This normally happens during an infinite loop.";
46 | } else if (error.signal === "SIGTERM") {
47 | errorMessage =
48 | "Process terminated. Please check your code and try again.";
49 | } else if (stderr) {
50 | errorMessage = stderr;
51 | } else {
52 | errorMessage = "Something went wrong. Please try again";
53 | }
54 | func({ ERROR: errorMessage }, actualFile);
55 | } else {
56 | if (env != "production") {
57 | console.log("Successfully executed !");
58 | console.log("Stdout: " + stdout);
59 | }
60 | func({ stdout: stdout }, actualFile);
61 | }
62 | });
63 | }
64 | });
65 | } else {
66 | console.log(code);
67 | func({ ERROR: "Not allowed!" });
68 | }
69 | };
70 |
71 | const run = (code, func) => {
72 | runCode(code, function (data, file = null) {
73 | if (file) {
74 | fs.unlink(file, (err) => {
75 | if (err) {
76 | console.error(err);
77 | }
78 | //file removed
79 | });
80 | }
81 | // add more logic
82 | func(data);
83 | });
84 | };
85 |
86 | module.exports = { run: run };
87 |
--------------------------------------------------------------------------------
/core/services/cSharp.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const exec = require("child_process").exec;
3 | const { v1: uuidv1 } = require("uuid");
4 | const config = require("./config");
5 | const env = process.env.NODE_ENV;
6 | const configPath = config.codePath;
7 | const timeOut = config.timeOut;
8 |
9 | // This should never happen
10 | const validate = (str) => {
11 | words = ["File.", "Directory.", "Environment", "DirectoryInfo", "FileInfo"];
12 | // prevent imports
13 | var valid = !words.some((el) => {
14 | return str.includes(el);
15 | });
16 |
17 | return valid;
18 | };
19 |
20 | const runCode = (code, func) => {
21 | if (validate(code)) {
22 | if (!code.match(RegExp(/\bclass\W+(?:\w+\W+){3,}?Main\b./g))) {
23 | return func({
24 | ERROR:
25 | "Please declare a correct class and 'Main' method as the entry point of your application!",
26 | });
27 | }
28 |
29 | var fileName = uuidv1();
30 | var fileNamePath = configPath + fileName;
31 | var actualFile = fileNamePath + ".cs";
32 |
33 | console.log(fileNamePath);
34 |
35 | fs.writeFile(actualFile, code, function (err) {
36 | if (err) {
37 | // handle error
38 | console.log("Error creating file: " + err);
39 | } else {
40 | var command =
41 | "mcs -out:" +
42 | fileNamePath +
43 | ".exe " +
44 | fileNamePath +
45 | ".cs " +
46 | "&& mono " +
47 | fileNamePath +
48 | ".exe";
49 | console.log(fileNamePath);
50 | exec(command, { timeout: timeOut }, function (error, stdout, stderr) {
51 | if (error) {
52 | if (env != "production") {
53 | console.log("Error: " + error);
54 | console.log("Stderr: " + stderr);
55 | }
56 |
57 | if (
58 | error.toString().includes("ERR_CHILD_PROCESS_STDIO_MAXBUFFER")
59 | ) {
60 | errorMessage =
61 | "Process terminated. 'maxBuffer' exceeded. This normally happens during an infinite loop.";
62 | } else if (error.signal === "SIGTERM") {
63 | errorMessage =
64 | "Process terminated. Please check your code and try again.";
65 | } else if (stderr) {
66 | errorMessage = stderr;
67 | } else {
68 | errorMessage = "Something went wrong. Please try again";
69 | }
70 | func({ ERROR: errorMessage }, fileNamePath);
71 | } else {
72 | if (env != "production") {
73 | console.log("Successfully executed !");
74 | console.log("Stdout: " + stdout);
75 | }
76 | console.log(stdout);
77 | func({ stdout: stdout }, fileNamePath);
78 | }
79 | });
80 | }
81 | });
82 | } else {
83 | console.log(code);
84 | func({ ERROR: "Not allowed!" });
85 | }
86 | };
87 |
88 | const run = (code, func) => {
89 | runCode(code, function (data, fileName = null) {
90 | if (fileName) {
91 | fs.unlink(fileName + ".exe", (err) => {
92 | if (err) {
93 | console.error(err);
94 | }
95 | });
96 | fs.unlink(fileName + ".cs", (err) => {
97 | if (err) {
98 | console.error(err);
99 | }
100 | });
101 | }
102 | // add more logic
103 | func(data);
104 | });
105 | };
106 |
107 | module.exports = { run: run };
108 |
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | In the interest of fostering an open and welcoming environment, we as
6 | contributors and maintainers pledge to making participation in our project and
7 | our community a harassment-free experience for everyone, regardless of age, body
8 | size, disability, ethnicity, sex characteristics, gender identity and expression,
9 | level of experience, education, socio-economic status, nationality, personal
10 | appearance, race, religion, or sexual identity and orientation.
11 |
12 | ## Our Standards
13 |
14 | Examples of behavior that contributes to creating a positive environment
15 | include:
16 |
17 | * Using welcoming and inclusive language
18 | * Being respectful of differing viewpoints and experiences
19 | * Gracefully accepting constructive criticism
20 | * Focusing on what is best for the community
21 | * Showing empathy towards other community members
22 |
23 | Examples of unacceptable behavior by participants include:
24 |
25 | * The use of sexualized language or imagery and unwelcome sexual attention or
26 | advances
27 | * Trolling, insulting/derogatory comments, and personal or political attacks
28 | * Public or private harassment
29 | * Publishing others' private information, such as a physical or electronic
30 | address, without explicit permission
31 | * Other conduct which could reasonably be considered inappropriate in a
32 | professional setting
33 |
34 | ## Our Responsibilities
35 |
36 | Project maintainers are responsible for clarifying the standards of acceptable
37 | behavior and are expected to take appropriate and fair corrective action in
38 | response to any instances of unacceptable behavior.
39 |
40 | Project maintainers have the right and responsibility to remove, edit, or
41 | reject comments, commits, code, wiki edits, issues, and other contributions
42 | that are not aligned to this Code of Conduct, or to ban temporarily or
43 | permanently any contributor for other behaviors that they deem inappropriate,
44 | threatening, offensive, or harmful.
45 |
46 | ## Scope
47 |
48 | This Code of Conduct applies both within project spaces and in public spaces
49 | when an individual is representing the project or its community. Examples of
50 | representing a project or community include using an official project e-mail
51 | address, posting via an official social media account, or acting as an appointed
52 | representative at an online or offline event. Representation of a project may be
53 | further defined and clarified by project maintainers.
54 |
55 | ## Enforcement
56 |
57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be
58 | reported by contacting the project team at onteripaul@gmail.com. All
59 | complaints will be reviewed and investigated and will result in a response that
60 | is deemed necessary and appropriate to the circumstances. The project team is
61 | obligated to maintain confidentiality with regard to the reporter of an incident.
62 | Further details of specific enforcement policies may be posted separately.
63 |
64 | Project maintainers who do not follow or enforce the Code of Conduct in good
65 | faith may face temporary or permanent repercussions as determined by other
66 | members of the project's leadership.
67 |
68 | ## Attribution
69 |
70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
72 |
73 | [homepage]: https://www.contributor-covenant.org
74 |
75 | For answers to common questions about this code of conduct, see
76 | https://www.contributor-covenant.org/faq
77 |
--------------------------------------------------------------------------------
/core/services/java.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const Path = require("path");
3 | const exec = require("child_process").exec;
4 | const { v1: uuidv1 } = require("uuid");
5 | const config = require("./config");
6 | const env = process.env.NODE_ENV;
7 | const configPath = config.codePath;
8 | const timeOut = config.timeOut;
9 |
10 | const validate = (str) => {
11 | // prevent handling files
12 | words = ["java.io.File"];
13 | if (words.every((el) => str.toLowerCase().includes(el.toLowerCase()))) {
14 | return false;
15 | }
16 | return true;
17 | };
18 |
19 | const runCode = (code, func) => {
20 | if (validate(code)) {
21 | if (!code.match(RegExp(/\bclass\W+(?:\w+\W+){0}?Main\b/g))) {
22 | return func({ ERROR: 'Include a correct "Main" class!' });
23 | } else if (!code.match(RegExp(/\bpublic\W+(?:\w+\W+){2}?main\b/g))) {
24 | return func({ ERROR: 'Include a correct "main()" method!' });
25 | }
26 |
27 | var folderName = uuidv1();
28 | var filename = "Main.java";
29 | var folder = configPath + folderName;
30 | var path = folder + "/";
31 |
32 | fs.mkdir(folder, 0777, function (err) {
33 | if (err) {
34 | func({ ERROR: "Server error" });
35 | } else {
36 | fs.writeFile(path + filename, code, function (err) {
37 | if (err) {
38 | // handle error
39 | console.log("Error creating file: " + err);
40 | } else {
41 | var command =
42 | "cd " + folder + " && " + " javac Main.java" + "&& java Main";
43 | exec(command, { timeout: timeOut }, function (
44 | error,
45 | stdout,
46 | stderr
47 | ) {
48 | if (error) {
49 | if (env != "production") {
50 | console.log("Error: " + error);
51 | console.log("Stderr: " + stderr);
52 | }
53 |
54 | if (
55 | error.toString().includes("ERR_CHILD_PROCESS_STDIO_MAXBUFFER")
56 | ) {
57 | errorMessage =
58 | "Process terminated. 'maxBuffer' exceeded. This normally happens during an infinite loop.";
59 | } else if (error.signal === "SIGTERM") {
60 | errorMessage =
61 | "Process terminated. Please check your code and try again.";
62 | } else if (stderr) {
63 | errorMessage = stderr;
64 | } else {
65 | errorMessage = "Something went wrong. Please try again";
66 | }
67 | func({ ERROR: errorMessage }, folder);
68 | } else {
69 | if (env != "production") {
70 | console.log("Successfully executed !");
71 | console.log("Stdout: " + stdout);
72 | }
73 | func({ stdout: stdout }, folder);
74 | }
75 | });
76 | }
77 | });
78 | }
79 | });
80 | } else {
81 | console.log(code);
82 | func({ ERROR: "Not allowed!" });
83 | }
84 | };
85 |
86 | const run = (code, func) => {
87 | runCode(code, function (data, dir = null) {
88 | if (dir) {
89 | if (fs.existsSync(dir)) {
90 | fs.readdirSync(dir).forEach((file, index) => {
91 | const curPath = Path.join(dir, file);
92 | fs.unlinkSync(curPath);
93 | });
94 | fs.rmdirSync(dir);
95 | }
96 | }
97 | // add more logic
98 | func(data);
99 | });
100 | };
101 |
102 | module.exports = { run: run };
103 |
--------------------------------------------------------------------------------
/core/services/rust.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const Path = require("path");
3 | const { exec } = require("child_process");
4 | const { v1: uuidv1 } = require("uuid");
5 | const { codePath, timeOut } = require("./config");
6 | const env = process.env.NODE_ENV;
7 |
8 | const validate = (str) => {
9 | // Prevent bringing of std::io, std::net and std::process into scope
10 | if (
11 | str.match(
12 | RegExp(/(?:(?:std::net;)|(?:(?:std\:\:io\;))|(?:(?:std\:\:process\;)))/)
13 | )
14 | ) {
15 | return false;
16 | }
17 | // Prevent inline usage of td::io, std::net and std::process
18 | if (
19 | str.match(
20 | RegExp(/(?:(?:std::process)|(?:(?:std\:\:net))|(?:(?:std\:\:io)))/m)
21 | )
22 | ) {
23 | return false;
24 | }
25 | return true;
26 | };
27 |
28 | const runCode = (code, func) => {
29 | if (validate(code)) {
30 | // Validate rust code
31 | // include main function
32 | if (!code.match(RegExp(/fn main/m))) {
33 | return func({
34 | ERROR: "Your Program must contain a `main` function!",
35 | });
36 | }
37 |
38 | var folderName = uuidv1();
39 | var file = "main";
40 | var extension = ".rs";
41 | var fullName = `${file}${extension}`;
42 | var folder = codePath + folderName;
43 | var path = folder + "/";
44 |
45 | fs.mkdir(folder, 0777, function (err) {
46 | if (err) {
47 | func({ ERROR: "Server error" });
48 | } else {
49 | fs.writeFile(path + fullName, code, function (err) {
50 | if (err) {
51 | // handle error
52 | console.log("Error creating file: " + err);
53 | } else {
54 | var command = `cd ${folder} && rustc ${fullName} && chmod +x ${file} && ./${file}`;
55 | exec(command, { timeout: timeOut }, function (
56 | error,
57 | stdout,
58 | stderr
59 | ) {
60 | if (error) {
61 | if (env != "production") {
62 | console.log("Error: " + error);
63 | console.log("Stderr: " + stderr);
64 | }
65 |
66 | if (
67 | error.toString().includes("ERR_CHILD_PROCESS_STDIO_MAXBUFFER")
68 | ) {
69 | errorMessage =
70 | "Process terminated. 'maxBuffer' exceeded. This normally happens during an infinite loop.";
71 | } else if (error.signal === "SIGTERM") {
72 | errorMessage =
73 | "Process terminated. Please check your code and try again.";
74 | } else if (stderr) {
75 | errorMessage = stderr;
76 | } else {
77 | errorMessage = "Something went wrong. Please try again";
78 | }
79 | func({ ERROR: errorMessage }, folder);
80 | } else {
81 | if (env != "production") {
82 | console.log("Successfully executed !");
83 | console.log("Stdout: " + stdout);
84 | }
85 | func({ stdout }, folder);
86 | }
87 | });
88 | }
89 | });
90 | }
91 | });
92 | } else {
93 | console.log(code);
94 | func({ ERROR: "Use of std::io, std::process and std::net is not allowed" });
95 | }
96 | };
97 |
98 | const run = (code, func) => {
99 | runCode(code, function (data, dir = null) {
100 | if (dir) {
101 | if (fs.existsSync(dir)) {
102 | fs.readdirSync(dir).forEach((file, index) => {
103 | const curPath = Path.join(dir, file);
104 | fs.unlinkSync(curPath);
105 | });
106 | fs.rmdirSync(dir);
107 | }
108 | }
109 | // add more logic
110 | func(data);
111 | });
112 | };
113 |
114 | module.exports = { run: run };
115 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | .vscode
3 |
4 | temp/
5 |
6 | # Logs
7 | logs
8 | *.log
9 | npm-debug.log*
10 | yarn-debug.log*
11 | yarn-error.log*
12 | lerna-debug.log*
13 |
14 | # Diagnostic reports (https://nodejs.org/api/report.html)
15 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
16 |
17 | # Runtime data
18 | pids
19 | *.pid
20 | *.seed
21 | *.pid.lock
22 |
23 | # Directory for instrumented libs generated by jscoverage/JSCover
24 | lib-cov
25 |
26 | # Coverage directory used by tools like istanbul
27 | coverage
28 | *.lcov
29 |
30 | # nyc test coverage
31 | .nyc_output
32 |
33 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
34 | .grunt
35 |
36 | # Bower dependency directory (https://bower.io/)
37 | bower_components
38 |
39 | # node-waf configuration
40 | .lock-wscript
41 |
42 | # Compiled binary addons (https://nodejs.org/api/addons.html)
43 | build/Release
44 |
45 | # Dependency directories
46 | node_modules/
47 | jspm_packages/
48 |
49 | # Snowpack dependency directory (https://snowpack.dev/)
50 | web_modules/
51 |
52 | # TypeScript cache
53 | *.tsbuildinfo
54 |
55 | # Optional npm cache directory
56 | .npm
57 |
58 | # Optional eslint cache
59 | .eslintcache
60 |
61 | # Microbundle cache
62 | .rpt2_cache/
63 | .rts2_cache_cjs/
64 | .rts2_cache_es/
65 | .rts2_cache_umd/
66 |
67 | # Optional REPL history
68 | .node_repl_history
69 |
70 | # Output of 'npm pack'
71 | *.tgz
72 |
73 | # Yarn Integrity file
74 | .yarn-integrity
75 |
76 | # dotenv environment variables file
77 | .env
78 | .env.test
79 |
80 | # parcel-bundler cache (https://parceljs.org/)
81 | .cache
82 | .parcel-cache
83 |
84 | # Next.js build output
85 | .next
86 | out
87 |
88 | # Nuxt.js build / generate output
89 | .nuxt
90 | dist
91 |
92 | # Gatsby files
93 | .cache/
94 | # Comment in the public line in if your project uses Gatsby and not Next.js
95 | # https://nextjs.org/blog/next-9-1#public-directory-support
96 | # public
97 |
98 | # vuepress build output
99 | .vuepress/dist
100 |
101 | # Serverless directories
102 | .serverless/
103 |
104 | # FuseBox cache
105 | .fusebox/
106 |
107 | # DynamoDB Local files
108 | .dynamodb/
109 |
110 | # TernJS port file
111 | .tern-port
112 |
113 | # Stores VSCode versions used for testing VSCode extensions
114 | .vscode-test
115 |
116 | # yarn v2
117 | .yarn/cache
118 | .yarn/unplugged
119 | .yarn/build-state.yml
120 | .yarn/install-state.gz
121 | .pnp.*
122 |
123 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
124 |
125 | # dependencies
126 | frontend/.pnp
127 | .pnp.js
128 |
129 | # testing
130 | frontend/coverage
131 |
132 | # production
133 | frontend/build
134 |
135 | # misc
136 | .DS_Store
137 | .env.local
138 | .env.development.local
139 | .env.test.local
140 | .env.production.local
141 |
142 | npm-debug.log*
143 | yarn-debug.log*
144 | yarn-error.log*
145 |
146 |
147 | # Logs
148 | logs
149 | *.log
150 | npm-debug.log*
151 | yarn-debug.log*
152 | yarn-error.log*
153 | firebase-debug.log*
154 |
155 | # Firebase cache
156 | .firebase/
157 |
158 | # Firebase config
159 |
160 | # Uncomment this if you'd like others to create their own Firebase project.
161 | # For a team working on the same Firebase project(s), it is recommended to leave
162 | # it commented so all members can deploy to the same project(s) in .firebaserc.
163 | # .firebaserc
164 |
165 | # Runtime data
166 | pids
167 | *.pid
168 | *.seed
169 | *.pid.lock
170 |
171 | # Directory for instrumented libs generated by jscoverage/JSCover
172 | lib-cov
173 |
174 | # Coverage directory used by tools like istanbul
175 | coverage
176 |
177 | # nyc test coverage
178 | .nyc_output
179 |
180 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
181 | .grunt
182 |
183 | # Bower dependency directory (https://bower.io/)
184 | bower_components
185 |
186 | # node-waf configuration
187 | .lock-wscript
188 |
189 | # Compiled binary addons (http://nodejs.org/api/addons.html)
190 | build/Release
191 |
192 |
193 | # Optional npm cache directory
194 | .npm
195 |
196 | # Optional eslint cache
197 | .eslintcache
198 |
199 | # Optional REPL history
200 | .node_repl_history
201 |
202 | # Output of 'npm pack'
203 | *.tgz
204 |
205 | # Yarn Integrity file
206 | .yarn-integrity
207 |
208 | # dotenv environment variables file
209 | .env
210 |
--------------------------------------------------------------------------------
/core/services/golang.js:
--------------------------------------------------------------------------------
1 | const fs = require('fs');
2 | const Path = require('path');
3 | const exec = require('child_process').exec;
4 | const { v1: uuidv1 } = require('uuid');
5 | const config = require('./config');
6 | const env = process.env.NODE_ENV;
7 | const configPath = config.codePath;
8 | const timeOut = config.timeOut;
9 |
10 | const validate = (str) => {
11 | // Prevent OS Operations in Go
12 | reg1 = RegExp(/\bimport\W+(?:\w+\W+){0,}(?:os)\b/g);
13 | if (str.match(reg1)) {
14 | return false;
15 | }
16 | return true;
17 | };
18 |
19 | const runCode = (code, func) => {
20 | if (validate(code)) {
21 | // Go Basic Code Validation
22 | // include package main and main method
23 | if (!code.match(RegExp(/\bpackage\W+(?:\w+\W+){0}?main\b/g))) {
24 | return func({
25 | ERROR: 'Your Program must include a "main" package!',
26 | });
27 | } else if (!code.match(RegExp(/(?:func\ main)/))) {
28 | return func({ ERROR: 'You must include a "main()" function!' });
29 | }
30 |
31 | var folderName = uuidv1();
32 | var filename = 'main.go';
33 | var folder = configPath + folderName;
34 | var path = folder + '/';
35 |
36 | fs.mkdir(folder, 0777, function (err) {
37 | if (err) {
38 | func({ ERROR: 'Server error' });
39 | } else {
40 | fs.writeFile(path + filename, code, function (err) {
41 | if (err) {
42 | // handle error
43 | console.log('Error creating file: ' + err);
44 | } else {
45 | var command =
46 | 'cd ' + folder + ' && ' + ' go run main.go';
47 | exec(command, { timeout: timeOut }, function (
48 | error,
49 | stdout,
50 | stderr
51 | ) {
52 | if (error) {
53 | if (env != 'production') {
54 | console.log('Error: ' + error);
55 | console.log('Stderr: ' + stderr);
56 | }
57 |
58 | if (
59 | error
60 | .toString()
61 | .includes(
62 | 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER'
63 | )
64 | ) {
65 | errorMessage =
66 | "Process terminated. 'maxBuffer' exceeded. This normally happens during an infinite loop.";
67 | } else if (error.signal === 'SIGTERM') {
68 | errorMessage =
69 | 'Process terminated. Please check your code and try again.';
70 | } else if (stderr) {
71 | errorMessage = stderr;
72 | } else {
73 | errorMessage =
74 | 'Something went wrong. Please try again';
75 | }
76 | func({ ERROR: errorMessage }, folder);
77 | } else {
78 | if (env != 'production') {
79 | console.log('Successfully executed !');
80 | console.log('Stdout: ' + stdout);
81 | }
82 | func({ stdout: stdout }, folder);
83 | }
84 | });
85 | }
86 | });
87 | }
88 | });
89 | } else {
90 | console.log(code);
91 | func({ ERROR: 'Not allowed!' });
92 | }
93 | };
94 |
95 | const run = (code, func) => {
96 | runCode(code, function (data, dir = null) {
97 | if (dir) {
98 | if (fs.existsSync(dir)) {
99 | fs.readdirSync(dir).forEach((file, index) => {
100 | const curPath = Path.join(dir, file);
101 | fs.unlinkSync(curPath);
102 | });
103 | fs.rmdirSync(dir);
104 | }
105 | }
106 | // add more logic
107 | func(data);
108 | });
109 | };
110 |
111 | module.exports = { run: run };
112 |
--------------------------------------------------------------------------------
/frontend/src/serviceWorker.js:
--------------------------------------------------------------------------------
1 | // This optional code is used to register a service worker.
2 | // register() is not called by default.
3 |
4 | // This lets the app load faster on subsequent visits in production, and gives
5 | // it offline capabilities. However, it also means that developers (and users)
6 | // will only see deployed updates on subsequent visits to a page, after all the
7 | // existing tabs open on the page have been closed, since previously cached
8 | // resources are updated in the background.
9 |
10 | // To learn more about the benefits of this model and instructions on how to
11 | // opt-in, read https://bit.ly/CRA-PWA
12 |
13 | const isLocalhost = Boolean(
14 | window.location.hostname === 'localhost' ||
15 | // [::1] is the IPv6 localhost address.
16 | window.location.hostname === '[::1]' ||
17 | // 127.0.0.0/8 are considered localhost for IPv4.
18 | window.location.hostname.match(
19 | /^127(?:\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/
20 | )
21 | );
22 |
23 | export function register(config) {
24 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
25 | // The URL constructor is available in all browsers that support SW.
26 | const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);
27 | if (publicUrl.origin !== window.location.origin) {
28 | // Our service worker won't work if PUBLIC_URL is on a different origin
29 | // from what our page is served on. This might happen if a CDN is used to
30 | // serve assets; see https://github.com/facebook/create-react-app/issues/2374
31 | return;
32 | }
33 |
34 | window.addEventListener('load', () => {
35 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
36 |
37 | if (isLocalhost) {
38 | // This is running on localhost. Let's check if a service worker still exists or not.
39 | checkValidServiceWorker(swUrl, config);
40 |
41 | // Add some additional logging to localhost, pointing developers to the
42 | // service worker/PWA documentation.
43 | navigator.serviceWorker.ready.then(() => {
44 | console.log(
45 | 'This web app is being served cache-first by a service ' +
46 | 'worker. To learn more, visit https://bit.ly/CRA-PWA'
47 | );
48 | });
49 | } else {
50 | // Is not localhost. Just register service worker
51 | registerValidSW(swUrl, config);
52 | }
53 | });
54 | }
55 | }
56 |
57 | function registerValidSW(swUrl, config) {
58 | navigator.serviceWorker
59 | .register(swUrl)
60 | .then(registration => {
61 | registration.onupdatefound = () => {
62 | const installingWorker = registration.installing;
63 | if (installingWorker == null) {
64 | return;
65 | }
66 | installingWorker.onstatechange = () => {
67 | if (installingWorker.state === 'installed') {
68 | if (navigator.serviceWorker.controller) {
69 | // At this point, the updated precached content has been fetched,
70 | // but the previous service worker will still serve the older
71 | // content until all client tabs are closed.
72 | console.log(
73 | 'New content is available and will be used when all ' +
74 | 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'
75 | );
76 |
77 | // Execute callback
78 | if (config && config.onUpdate) {
79 | config.onUpdate(registration);
80 | }
81 | } else {
82 | // At this point, everything has been precached.
83 | // It's the perfect time to display a
84 | // "Content is cached for offline use." message.
85 | console.log('Content is cached for offline use.');
86 |
87 | // Execute callback
88 | if (config && config.onSuccess) {
89 | config.onSuccess(registration);
90 | }
91 | }
92 | }
93 | };
94 | };
95 | })
96 | .catch(error => {
97 | console.error('Error during service worker registration:', error);
98 | });
99 | }
100 |
101 | function checkValidServiceWorker(swUrl, config) {
102 | // Check if the service worker can be found. If it can't reload the page.
103 | fetch(swUrl, {
104 | headers: { 'Service-Worker': 'script' },
105 | })
106 | .then(response => {
107 | // Ensure service worker exists, and that we really are getting a JS file.
108 | const contentType = response.headers.get('content-type');
109 | if (
110 | response.status === 404 ||
111 | (contentType != null && contentType.indexOf('javascript') === -1)
112 | ) {
113 | // No service worker found. Probably a different app. Reload the page.
114 | navigator.serviceWorker.ready.then(registration => {
115 | registration.unregister().then(() => {
116 | window.location.reload();
117 | });
118 | });
119 | } else {
120 | // Service worker found. Proceed as normal.
121 | registerValidSW(swUrl, config);
122 | }
123 | })
124 | .catch(() => {
125 | console.log(
126 | 'No internet connection found. App is running in offline mode.'
127 | );
128 | });
129 | }
130 |
131 | export function unregister() {
132 | if ('serviceWorker' in navigator) {
133 | navigator.serviceWorker.ready
134 | .then(registration => {
135 | registration.unregister();
136 | })
137 | .catch(error => {
138 | console.error(error.message);
139 | });
140 | }
141 | }
142 |
--------------------------------------------------------------------------------
/frontend/src/components/code/Execute.js:
--------------------------------------------------------------------------------
1 | import React, { Fragment, useState, useEffect } from "react";
2 | import { connect } from "react-redux";
3 | import AceEditor from "react-ace";
4 | import { AtomSpinner, SwappingSquaresSpinner } from "react-epic-spinners";
5 | import "ace-builds/src-min-noconflict/ext-language_tools";
6 | import { runCode } from "../../actions/Execute";
7 | import { csDefault, pyDefault, javaDefault, jsDefault, golangDefault, rustDefault } from "./defaults";
8 | import "./css/Execute.css";
9 | import "../header/css/Header.css";
10 | import playGrayIcon from "../../media/icon-play-light-gray.png";
11 | // import playBlackIcon from "../../media/icon-play-black.png";
12 | // import gearsIcon from "../../media/icon-gears.png";
13 | import octoGray from "../../media/icon-octocat-gray.png";
14 | // import octoBlack from "../../media/icon-octocat-black.png";
15 |
16 | const languages = ["javascript", "java", "python", "csharp", "golang", "rust"];
17 | const themes = ["dracula", "monokai"];
18 | const tabSizes = [2, 4, 8];
19 | const fontSizes = [12, 14, 16, 18, 20, 22, 24, 28, 30, 32];
20 | themes.forEach((theme) =>
21 | require(`ace-builds/src-min-noconflict/theme-${theme}`)
22 | );
23 | languages.forEach((lang) => {
24 | require(`ace-builds/src-min-noconflict/mode-${lang}`);
25 | require(`ace-builds/src-min-noconflict/snippets/${lang}`);
26 | });
27 |
28 | function Execute(props) {
29 | const [theme, setTheme] = useState("dracula");
30 | const [language, setLangauge] = useState("python");
31 | const [codeText, setCodeText] = useState(pyDefault);
32 | const [tabs, setTabs] = useState(4);
33 | const [fontSize, setFontSize] = useState(17);
34 | const [results, setResults] = useState(null);
35 | const [handledSucOutput, setHandledSucOutput] = useState(false);
36 | const [handledFailOutput, setHandledFailOutput] = useState(false);
37 |
38 | const onChange = (values) => {
39 | setCodeText(values);
40 | };
41 |
42 | const printSucResults = (res) => {
43 | setResults(res);
44 | if (document) {
45 | var el = document.getElementById("code-results");
46 | el.style.color = "var(--editer-white)";
47 | }
48 | };
49 |
50 | const printErrResults = (res) => {
51 | setResults(res);
52 | if (document) {
53 | var el = document.getElementById("code-results");
54 | el.style.color = "red";
55 | }
56 | };
57 |
58 | const handleSubmit = (e) => {
59 | var data = codeText;
60 | setResults("");
61 | setHandledSucOutput(false);
62 | setHandledFailOutput(false);
63 | e.preventDefault();
64 | if (data) {
65 | var content = new FormData();
66 | content.append("text", data);
67 | content.append("language", language);
68 | props.runCode(content);
69 | } else {
70 | printSucResults("Please write some code first :)");
71 | }
72 | };
73 |
74 | const handleSuc = (res) => {
75 | if (res) {
76 | if (res.ERROR) {
77 | printErrResults(res.ERROR);
78 | } else if (res.stdout) {
79 | printSucResults(res.stdout);
80 | } else {
81 | printSucResults("Code executed successfully with no outputs :)");
82 | }
83 | } else {
84 | printSucResults("Code executed successfully with no outputs :)");
85 | }
86 | };
87 |
88 | const handleFail = (res) => {
89 | if (res) {
90 | printErrResults(res);
91 | } else {
92 | printErrResults(
93 | "Something went wrong. Please check your code and try again later."
94 | );
95 | }
96 | };
97 |
98 | const onLanguageChange = (lang) => {
99 | if ([pyDefault, jsDefault, javaDefault, csDefault, golangDefault, rustDefault].includes(codeText) || !codeText) {
100 | if (lang === "python") {
101 | setCodeText(pyDefault);
102 | } else if (lang === "java") {
103 | setCodeText(javaDefault);
104 | } else if (lang === "javascript") {
105 | setCodeText(jsDefault);
106 | } else if (lang === "csharp") {
107 | setCodeText(csDefault);
108 | } else if (lang === 'golang') {
109 | setCodeText(golangDefault);
110 | } else if (lang === 'rust') {
111 | setCodeText(rustDefault);
112 | }
113 | }
114 | setLangauge(lang);
115 | };
116 |
117 | const onThemeChange = (th) => {
118 | setTheme(th);
119 | // more logic
120 | };
121 |
122 | const onTabChange = (tb) => {
123 | setTabs(tb);
124 | };
125 |
126 | const onFontSzChange = (fn) => {
127 | setFontSize(fn);
128 | };
129 |
130 | useEffect(() => {
131 | if (props.runCodeOk && !handledSucOutput) {
132 | handleSuc(props.output);
133 | setHandledSucOutput(true);
134 | } else if (props.runCodeFail && !handledFailOutput) {
135 | handleFail(props.output);
136 | setHandledFailOutput(true);
137 | }
138 | // eslint-disable-next-line
139 | }, [props.runCodeOk, props.runCodeFail]);
140 |
141 | useEffect(() => {
142 | if (props.runCodeLoading) {
143 | document.getElementById("overlay").style.display = "block";
144 | } else {
145 | document.getElementById("overlay").style.display = "none";
146 | }
147 | // eslint-disable-next-line
148 | }, [props.runCodeLoading]);
149 |
150 | return (
151 |
152 |
153 |
162 |
163 |
164 |
167 |
168 | {languages
169 | .filter((lang) => lang !== language)
170 | .map((obj) => (
171 | - {
174 | onLanguageChange(obj);
175 | }}
176 | >
177 | {obj === "csharp" ? "C#" : obj}
178 |
179 | ))}
180 |
181 |
182 |
183 |
184 |
185 | {themes
186 | .filter((th) => th !== theme)
187 | .map((obj) => (
188 | - {
191 | onThemeChange(obj);
192 | }}
193 | >
194 | {obj}
195 |
196 | ))}
197 |
198 |
199 |
200 |
201 |
202 | {tabSizes
203 | .filter((tb) => tb !== tabs)
204 | .map((obj) => (
205 | - {
208 | onTabChange(obj);
209 | }}
210 | >
211 | {obj}
212 |
213 | ))}
214 |
215 |
216 |
217 |
218 |
219 |
220 | {fontSizes
221 | .filter((fn) => fn !== fontSizes)
222 | .map((obj) => (
223 | - {
226 | onFontSzChange(obj);
227 | }}
228 | >
229 | {obj}
230 |
231 | ))}
232 |
233 |
234 |
235 |
236 | {props.runCodeLoading ? (
237 |
241 | ) : (
242 |
243 |
248 | Run Code
249 |
250 | )}
251 |
252 |
253 |
254 |
292 |
299 |
300 | );
301 | }
302 |
303 | const mapStateToProps = (state) => ({
304 | output: state.executionReducer.output,
305 | runCodeLoading: state.executionReducer.runCodeLoading,
306 | runCodeFail: state.executionReducer.runCodeFail,
307 | runCodeOk: state.executionReducer.runCodeOk,
308 | });
309 |
310 | export default connect(mapStateToProps, { runCode })(Execute);
311 |
--------------------------------------------------------------------------------
/core/yarn.lock:
--------------------------------------------------------------------------------
1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
2 | # yarn lockfile v1
3 |
4 |
5 | "@sindresorhus/is@^0.14.0":
6 | version "0.14.0"
7 | resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
8 | integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
9 |
10 | "@szmarczak/http-timer@^1.1.2":
11 | version "1.1.2"
12 | resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
13 | integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
14 | dependencies:
15 | defer-to-connect "^1.0.1"
16 |
17 | "@types/color-name@^1.1.1":
18 | version "1.1.1"
19 | resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
20 | integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
21 |
22 | abbrev@1:
23 | version "1.1.1"
24 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
25 | integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
26 |
27 | accepts@~1.3.7:
28 | version "1.3.7"
29 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd"
30 | integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
31 | dependencies:
32 | mime-types "~2.1.24"
33 | negotiator "0.6.2"
34 |
35 | ansi-align@^3.0.0:
36 | version "3.0.0"
37 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb"
38 | integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==
39 | dependencies:
40 | string-width "^3.0.0"
41 |
42 | ansi-regex@^4.1.0:
43 | version "4.1.0"
44 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
45 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
46 |
47 | ansi-regex@^5.0.0:
48 | version "5.0.0"
49 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
50 | integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
51 |
52 | ansi-styles@^3.2.0, ansi-styles@^3.2.1:
53 | version "3.2.1"
54 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
55 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
56 | dependencies:
57 | color-convert "^1.9.0"
58 |
59 | ansi-styles@^4.1.0:
60 | version "4.2.1"
61 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359"
62 | integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==
63 | dependencies:
64 | "@types/color-name" "^1.1.1"
65 | color-convert "^2.0.1"
66 |
67 | anymatch@~3.1.1:
68 | version "3.1.1"
69 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
70 | integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
71 | dependencies:
72 | normalize-path "^3.0.0"
73 | picomatch "^2.0.4"
74 |
75 | array-flatten@1.1.1:
76 | version "1.1.1"
77 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
78 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
79 |
80 | balanced-match@^1.0.0:
81 | version "1.0.0"
82 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
83 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
84 |
85 | binary-extensions@^2.0.0:
86 | version "2.1.0"
87 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9"
88 | integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==
89 |
90 | body-parser@1.19.0:
91 | version "1.19.0"
92 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a"
93 | integrity sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
94 | dependencies:
95 | bytes "3.1.0"
96 | content-type "~1.0.4"
97 | debug "2.6.9"
98 | depd "~1.1.2"
99 | http-errors "1.7.2"
100 | iconv-lite "0.4.24"
101 | on-finished "~2.3.0"
102 | qs "6.7.0"
103 | raw-body "2.4.0"
104 | type-is "~1.6.17"
105 |
106 | boxen@^4.2.0:
107 | version "4.2.0"
108 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64"
109 | integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==
110 | dependencies:
111 | ansi-align "^3.0.0"
112 | camelcase "^5.3.1"
113 | chalk "^3.0.0"
114 | cli-boxes "^2.2.0"
115 | string-width "^4.1.0"
116 | term-size "^2.1.0"
117 | type-fest "^0.8.1"
118 | widest-line "^3.1.0"
119 |
120 | brace-expansion@^1.1.7:
121 | version "1.1.11"
122 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
123 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
124 | dependencies:
125 | balanced-match "^1.0.0"
126 | concat-map "0.0.1"
127 |
128 | braces@~3.0.2:
129 | version "3.0.2"
130 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
131 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
132 | dependencies:
133 | fill-range "^7.0.1"
134 |
135 | bytes@3.1.0:
136 | version "3.1.0"
137 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
138 | integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
139 |
140 | cacheable-request@^6.0.0:
141 | version "6.1.0"
142 | resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
143 | integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
144 | dependencies:
145 | clone-response "^1.0.2"
146 | get-stream "^5.1.0"
147 | http-cache-semantics "^4.0.0"
148 | keyv "^3.0.0"
149 | lowercase-keys "^2.0.0"
150 | normalize-url "^4.1.0"
151 | responselike "^1.0.2"
152 |
153 | camelcase@^5.0.0, camelcase@^5.3.1:
154 | version "5.3.1"
155 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
156 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
157 |
158 | chalk@^2.4.2:
159 | version "2.4.2"
160 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
161 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
162 | dependencies:
163 | ansi-styles "^3.2.1"
164 | escape-string-regexp "^1.0.5"
165 | supports-color "^5.3.0"
166 |
167 | chalk@^3.0.0:
168 | version "3.0.0"
169 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
170 | integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
171 | dependencies:
172 | ansi-styles "^4.1.0"
173 | supports-color "^7.1.0"
174 |
175 | chokidar@^3.2.2:
176 | version "3.4.1"
177 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.1.tgz#e905bdecf10eaa0a0b1db0c664481cc4cbc22ba1"
178 | integrity sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==
179 | dependencies:
180 | anymatch "~3.1.1"
181 | braces "~3.0.2"
182 | glob-parent "~5.1.0"
183 | is-binary-path "~2.1.0"
184 | is-glob "~4.0.1"
185 | normalize-path "~3.0.0"
186 | readdirp "~3.4.0"
187 | optionalDependencies:
188 | fsevents "~2.1.2"
189 |
190 | ci-info@^2.0.0:
191 | version "2.0.0"
192 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
193 | integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
194 |
195 | cli-boxes@^2.2.0:
196 | version "2.2.0"
197 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d"
198 | integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==
199 |
200 | cliui@^5.0.0:
201 | version "5.0.0"
202 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
203 | integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
204 | dependencies:
205 | string-width "^3.1.0"
206 | strip-ansi "^5.2.0"
207 | wrap-ansi "^5.1.0"
208 |
209 | clone-response@^1.0.2:
210 | version "1.0.2"
211 | resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b"
212 | integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=
213 | dependencies:
214 | mimic-response "^1.0.0"
215 |
216 | color-convert@^1.9.0:
217 | version "1.9.3"
218 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
219 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
220 | dependencies:
221 | color-name "1.1.3"
222 |
223 | color-convert@^2.0.1:
224 | version "2.0.1"
225 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
226 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
227 | dependencies:
228 | color-name "~1.1.4"
229 |
230 | color-name@1.1.3:
231 | version "1.1.3"
232 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25"
233 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
234 |
235 | color-name@~1.1.4:
236 | version "1.1.4"
237 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
238 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
239 |
240 | concat-map@0.0.1:
241 | version "0.0.1"
242 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
243 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
244 |
245 | concurrently@^5.2.0:
246 | version "5.2.0"
247 | resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-5.2.0.tgz#ead55121d08a0fc817085584c123cedec2e08975"
248 | integrity sha512-XxcDbQ4/43d6CxR7+iV8IZXhur4KbmEJk1CetVMUqCy34z9l0DkszbY+/9wvmSnToTej0SYomc2WSRH+L0zVJw==
249 | dependencies:
250 | chalk "^2.4.2"
251 | date-fns "^2.0.1"
252 | lodash "^4.17.15"
253 | read-pkg "^4.0.1"
254 | rxjs "^6.5.2"
255 | spawn-command "^0.0.2-1"
256 | supports-color "^6.1.0"
257 | tree-kill "^1.2.2"
258 | yargs "^13.3.0"
259 |
260 | configstore@^5.0.1:
261 | version "5.0.1"
262 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
263 | integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==
264 | dependencies:
265 | dot-prop "^5.2.0"
266 | graceful-fs "^4.1.2"
267 | make-dir "^3.0.0"
268 | unique-string "^2.0.0"
269 | write-file-atomic "^3.0.0"
270 | xdg-basedir "^4.0.0"
271 |
272 | content-disposition@0.5.3:
273 | version "0.5.3"
274 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
275 | integrity sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
276 | dependencies:
277 | safe-buffer "5.1.2"
278 |
279 | content-type@~1.0.4:
280 | version "1.0.4"
281 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
282 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
283 |
284 | cookie-signature@1.0.6:
285 | version "1.0.6"
286 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c"
287 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
288 |
289 | cookie@0.4.0:
290 | version "0.4.0"
291 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba"
292 | integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
293 |
294 | cors@^2.8.5:
295 | version "2.8.5"
296 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.5.tgz#eac11da51592dd86b9f06f6e7ac293b3df875d29"
297 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==
298 | dependencies:
299 | object-assign "^4"
300 | vary "^1"
301 |
302 | crypto-random-string@^2.0.0:
303 | version "2.0.0"
304 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
305 | integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
306 |
307 | date-fns@^2.0.1:
308 | version "2.14.0"
309 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.14.0.tgz#359a87a265bb34ef2e38f93ecf63ac453f9bc7ba"
310 | integrity sha512-1zD+68jhFgDIM0rF05rcwYO8cExdNqxjq4xP1QKM60Q45mnO6zaMWB4tOzrIr4M4GSLntsKeE4c9Bdl2jhL/yw==
311 |
312 | debug@2.6.9, debug@^2.2.0:
313 | version "2.6.9"
314 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
315 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
316 | dependencies:
317 | ms "2.0.0"
318 |
319 | debug@^3.2.6:
320 | version "3.2.6"
321 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
322 | integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
323 | dependencies:
324 | ms "^2.1.1"
325 |
326 | decamelize@^1.2.0:
327 | version "1.2.0"
328 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
329 | integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
330 |
331 | decompress-response@^3.3.0:
332 | version "3.3.0"
333 | resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
334 | integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
335 | dependencies:
336 | mimic-response "^1.0.0"
337 |
338 | deep-extend@^0.6.0:
339 | version "0.6.0"
340 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
341 | integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
342 |
343 | defer-to-connect@^1.0.1:
344 | version "1.1.3"
345 | resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
346 | integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
347 |
348 | depd@~1.1.2:
349 | version "1.1.2"
350 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
351 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
352 |
353 | destroy@~1.0.4:
354 | version "1.0.4"
355 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
356 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
357 |
358 | dot-prop@^5.2.0:
359 | version "5.2.0"
360 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz#c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb"
361 | integrity sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==
362 | dependencies:
363 | is-obj "^2.0.0"
364 |
365 | duplexer3@^0.1.4:
366 | version "0.1.4"
367 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
368 | integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
369 |
370 | ee-first@1.1.1:
371 | version "1.1.1"
372 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
373 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
374 |
375 | emoji-regex@^7.0.1:
376 | version "7.0.3"
377 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
378 | integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
379 |
380 | emoji-regex@^8.0.0:
381 | version "8.0.0"
382 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
383 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
384 |
385 | encodeurl@~1.0.2:
386 | version "1.0.2"
387 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
388 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
389 |
390 | end-of-stream@^1.1.0:
391 | version "1.4.4"
392 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
393 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
394 | dependencies:
395 | once "^1.4.0"
396 |
397 | error-ex@^1.3.1:
398 | version "1.3.2"
399 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
400 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
401 | dependencies:
402 | is-arrayish "^0.2.1"
403 |
404 | escape-goat@^2.0.0:
405 | version "2.1.1"
406 | resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675"
407 | integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==
408 |
409 | escape-html@~1.0.3:
410 | version "1.0.3"
411 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
412 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
413 |
414 | escape-string-regexp@^1.0.5:
415 | version "1.0.5"
416 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
417 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
418 |
419 | etag@~1.8.1:
420 | version "1.8.1"
421 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
422 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
423 |
424 | express-formidable@^1.2.0:
425 | version "1.2.0"
426 | resolved "https://registry.yarnpkg.com/express-formidable/-/express-formidable-1.2.0.tgz#6b05bc05da9e4cd712cac166fcb41ef7172b760c"
427 | integrity sha512-w1vXjF3gb50UKTNkFaW8/4rqY4dUrKfZ1sAZzwAF9YxCAgj/29QZsycf71di0GkskrZOAkubk9pvGYfxyAMYiw==
428 | dependencies:
429 | formidable "^1.0.17"
430 |
431 | express@^4.17.1:
432 | version "4.17.1"
433 | resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
434 | integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
435 | dependencies:
436 | accepts "~1.3.7"
437 | array-flatten "1.1.1"
438 | body-parser "1.19.0"
439 | content-disposition "0.5.3"
440 | content-type "~1.0.4"
441 | cookie "0.4.0"
442 | cookie-signature "1.0.6"
443 | debug "2.6.9"
444 | depd "~1.1.2"
445 | encodeurl "~1.0.2"
446 | escape-html "~1.0.3"
447 | etag "~1.8.1"
448 | finalhandler "~1.1.2"
449 | fresh "0.5.2"
450 | merge-descriptors "1.0.1"
451 | methods "~1.1.2"
452 | on-finished "~2.3.0"
453 | parseurl "~1.3.3"
454 | path-to-regexp "0.1.7"
455 | proxy-addr "~2.0.5"
456 | qs "6.7.0"
457 | range-parser "~1.2.1"
458 | safe-buffer "5.1.2"
459 | send "0.17.1"
460 | serve-static "1.14.1"
461 | setprototypeof "1.1.1"
462 | statuses "~1.5.0"
463 | type-is "~1.6.18"
464 | utils-merge "1.0.1"
465 | vary "~1.1.2"
466 |
467 | fill-range@^7.0.1:
468 | version "7.0.1"
469 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
470 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
471 | dependencies:
472 | to-regex-range "^5.0.1"
473 |
474 | finalhandler@~1.1.2:
475 | version "1.1.2"
476 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d"
477 | integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
478 | dependencies:
479 | debug "2.6.9"
480 | encodeurl "~1.0.2"
481 | escape-html "~1.0.3"
482 | on-finished "~2.3.0"
483 | parseurl "~1.3.3"
484 | statuses "~1.5.0"
485 | unpipe "~1.0.0"
486 |
487 | find-up@^3.0.0:
488 | version "3.0.0"
489 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73"
490 | integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
491 | dependencies:
492 | locate-path "^3.0.0"
493 |
494 | formidable@^1.0.17:
495 | version "1.2.2"
496 | resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9"
497 | integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==
498 |
499 | forwarded@~0.1.2:
500 | version "0.1.2"
501 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84"
502 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
503 |
504 | fresh@0.5.2:
505 | version "0.5.2"
506 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
507 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
508 |
509 | fsevents@~2.1.2:
510 | version "2.1.3"
511 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e"
512 | integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==
513 |
514 | get-caller-file@^2.0.1:
515 | version "2.0.5"
516 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
517 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
518 |
519 | get-stream@^4.1.0:
520 | version "4.1.0"
521 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
522 | integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
523 | dependencies:
524 | pump "^3.0.0"
525 |
526 | get-stream@^5.1.0:
527 | version "5.1.0"
528 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz#01203cdc92597f9b909067c3e656cc1f4d3c4dc9"
529 | integrity sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==
530 | dependencies:
531 | pump "^3.0.0"
532 |
533 | glob-parent@~5.1.0:
534 | version "5.1.1"
535 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
536 | integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
537 | dependencies:
538 | is-glob "^4.0.1"
539 |
540 | global-dirs@^2.0.1:
541 | version "2.0.1"
542 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201"
543 | integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==
544 | dependencies:
545 | ini "^1.3.5"
546 |
547 | got@^9.6.0:
548 | version "9.6.0"
549 | resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
550 | integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
551 | dependencies:
552 | "@sindresorhus/is" "^0.14.0"
553 | "@szmarczak/http-timer" "^1.1.2"
554 | cacheable-request "^6.0.0"
555 | decompress-response "^3.3.0"
556 | duplexer3 "^0.1.4"
557 | get-stream "^4.1.0"
558 | lowercase-keys "^1.0.1"
559 | mimic-response "^1.0.1"
560 | p-cancelable "^1.0.0"
561 | to-readable-stream "^1.0.0"
562 | url-parse-lax "^3.0.0"
563 |
564 | graceful-fs@^4.1.2:
565 | version "4.2.4"
566 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
567 | integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
568 |
569 | has-flag@^3.0.0:
570 | version "3.0.0"
571 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
572 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
573 |
574 | has-flag@^4.0.0:
575 | version "4.0.0"
576 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
577 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
578 |
579 | has-yarn@^2.1.0:
580 | version "2.1.0"
581 | resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
582 | integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==
583 |
584 | hosted-git-info@^2.1.4:
585 | version "2.8.8"
586 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
587 | integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==
588 |
589 | http-cache-semantics@^4.0.0:
590 | version "4.1.0"
591 | resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
592 | integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==
593 |
594 | http-errors@1.7.2:
595 | version "1.7.2"
596 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
597 | integrity sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
598 | dependencies:
599 | depd "~1.1.2"
600 | inherits "2.0.3"
601 | setprototypeof "1.1.1"
602 | statuses ">= 1.5.0 < 2"
603 | toidentifier "1.0.0"
604 |
605 | http-errors@~1.7.2:
606 | version "1.7.3"
607 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06"
608 | integrity sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
609 | dependencies:
610 | depd "~1.1.2"
611 | inherits "2.0.4"
612 | setprototypeof "1.1.1"
613 | statuses ">= 1.5.0 < 2"
614 | toidentifier "1.0.0"
615 |
616 | iconv-lite@0.4.24:
617 | version "0.4.24"
618 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
619 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
620 | dependencies:
621 | safer-buffer ">= 2.1.2 < 3"
622 |
623 | ignore-by-default@^1.0.1:
624 | version "1.0.1"
625 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
626 | integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
627 |
628 | import-lazy@^2.1.0:
629 | version "2.1.0"
630 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
631 | integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
632 |
633 | imurmurhash@^0.1.4:
634 | version "0.1.4"
635 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
636 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
637 |
638 | inherits@2.0.3:
639 | version "2.0.3"
640 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
641 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
642 |
643 | inherits@2.0.4:
644 | version "2.0.4"
645 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
646 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
647 |
648 | ini@^1.3.5, ini@~1.3.0:
649 | version "1.3.5"
650 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
651 | integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
652 |
653 | ipaddr.js@1.9.1:
654 | version "1.9.1"
655 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
656 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
657 |
658 | is-arrayish@^0.2.1:
659 | version "0.2.1"
660 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
661 | integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
662 |
663 | is-binary-path@~2.1.0:
664 | version "2.1.0"
665 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09"
666 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
667 | dependencies:
668 | binary-extensions "^2.0.0"
669 |
670 | is-ci@^2.0.0:
671 | version "2.0.0"
672 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
673 | integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
674 | dependencies:
675 | ci-info "^2.0.0"
676 |
677 | is-extglob@^2.1.1:
678 | version "2.1.1"
679 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
680 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
681 |
682 | is-fullwidth-code-point@^2.0.0:
683 | version "2.0.0"
684 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
685 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
686 |
687 | is-fullwidth-code-point@^3.0.0:
688 | version "3.0.0"
689 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
690 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
691 |
692 | is-glob@^4.0.1, is-glob@~4.0.1:
693 | version "4.0.1"
694 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
695 | integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
696 | dependencies:
697 | is-extglob "^2.1.1"
698 |
699 | is-installed-globally@^0.3.1:
700 | version "0.3.2"
701 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141"
702 | integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==
703 | dependencies:
704 | global-dirs "^2.0.1"
705 | is-path-inside "^3.0.1"
706 |
707 | is-npm@^4.0.0:
708 | version "4.0.0"
709 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d"
710 | integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==
711 |
712 | is-number@^7.0.0:
713 | version "7.0.0"
714 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
715 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
716 |
717 | is-obj@^2.0.0:
718 | version "2.0.0"
719 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
720 | integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
721 |
722 | is-path-inside@^3.0.1:
723 | version "3.0.2"
724 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017"
725 | integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==
726 |
727 | is-typedarray@^1.0.0:
728 | version "1.0.0"
729 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
730 | integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
731 |
732 | is-yarn-global@^0.3.0:
733 | version "0.3.0"
734 | resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
735 | integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==
736 |
737 | json-buffer@3.0.0:
738 | version "3.0.0"
739 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
740 | integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
741 |
742 | json-parse-better-errors@^1.0.1:
743 | version "1.0.2"
744 | resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
745 | integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
746 |
747 | keyv@^3.0.0:
748 | version "3.1.0"
749 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
750 | integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
751 | dependencies:
752 | json-buffer "3.0.0"
753 |
754 | latest-version@^5.0.0:
755 | version "5.1.0"
756 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face"
757 | integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==
758 | dependencies:
759 | package-json "^6.3.0"
760 |
761 | locate-path@^3.0.0:
762 | version "3.0.0"
763 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
764 | integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
765 | dependencies:
766 | p-locate "^3.0.0"
767 | path-exists "^3.0.0"
768 |
769 | lodash@^4.17.15:
770 | version "4.17.19"
771 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b"
772 | integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==
773 |
774 | lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
775 | version "1.0.1"
776 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
777 | integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
778 |
779 | lowercase-keys@^2.0.0:
780 | version "2.0.0"
781 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
782 | integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
783 |
784 | make-dir@^3.0.0:
785 | version "3.1.0"
786 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
787 | integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
788 | dependencies:
789 | semver "^6.0.0"
790 |
791 | media-typer@0.3.0:
792 | version "0.3.0"
793 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
794 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
795 |
796 | merge-descriptors@1.0.1:
797 | version "1.0.1"
798 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
799 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
800 |
801 | methods@~1.1.2:
802 | version "1.1.2"
803 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
804 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
805 |
806 | mime-db@1.44.0:
807 | version "1.44.0"
808 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
809 | integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
810 |
811 | mime-types@~2.1.24:
812 | version "2.1.27"
813 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
814 | integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
815 | dependencies:
816 | mime-db "1.44.0"
817 |
818 | mime@1.6.0:
819 | version "1.6.0"
820 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
821 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
822 |
823 | mimic-response@^1.0.0, mimic-response@^1.0.1:
824 | version "1.0.1"
825 | resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
826 | integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
827 |
828 | minimatch@^3.0.4:
829 | version "3.0.4"
830 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
831 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
832 | dependencies:
833 | brace-expansion "^1.1.7"
834 |
835 | minimist@^1.2.0:
836 | version "1.2.5"
837 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
838 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
839 |
840 | ms@2.0.0:
841 | version "2.0.0"
842 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
843 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
844 |
845 | ms@2.1.1:
846 | version "2.1.1"
847 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a"
848 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
849 |
850 | ms@^2.1.1:
851 | version "2.1.2"
852 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
853 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
854 |
855 | negotiator@0.6.2:
856 | version "0.6.2"
857 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
858 | integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
859 |
860 | nodemon@^2.0.4:
861 | version "2.0.4"
862 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.4.tgz#55b09319eb488d6394aa9818148c0c2d1c04c416"
863 | integrity sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==
864 | dependencies:
865 | chokidar "^3.2.2"
866 | debug "^3.2.6"
867 | ignore-by-default "^1.0.1"
868 | minimatch "^3.0.4"
869 | pstree.remy "^1.1.7"
870 | semver "^5.7.1"
871 | supports-color "^5.5.0"
872 | touch "^3.1.0"
873 | undefsafe "^2.0.2"
874 | update-notifier "^4.0.0"
875 |
876 | nopt@~1.0.10:
877 | version "1.0.10"
878 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
879 | integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=
880 | dependencies:
881 | abbrev "1"
882 |
883 | normalize-package-data@^2.3.2:
884 | version "2.5.0"
885 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
886 | integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
887 | dependencies:
888 | hosted-git-info "^2.1.4"
889 | resolve "^1.10.0"
890 | semver "2 || 3 || 4 || 5"
891 | validate-npm-package-license "^3.0.1"
892 |
893 | normalize-path@^3.0.0, normalize-path@~3.0.0:
894 | version "3.0.0"
895 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
896 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
897 |
898 | normalize-url@^4.1.0:
899 | version "4.5.0"
900 | resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
901 | integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==
902 |
903 | object-assign@^4:
904 | version "4.1.1"
905 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
906 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
907 |
908 | on-finished@~2.3.0:
909 | version "2.3.0"
910 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
911 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
912 | dependencies:
913 | ee-first "1.1.1"
914 |
915 | once@^1.3.1, once@^1.4.0:
916 | version "1.4.0"
917 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
918 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
919 | dependencies:
920 | wrappy "1"
921 |
922 | p-cancelable@^1.0.0:
923 | version "1.1.0"
924 | resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
925 | integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
926 |
927 | p-limit@^2.0.0:
928 | version "2.3.0"
929 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
930 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
931 | dependencies:
932 | p-try "^2.0.0"
933 |
934 | p-locate@^3.0.0:
935 | version "3.0.0"
936 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4"
937 | integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
938 | dependencies:
939 | p-limit "^2.0.0"
940 |
941 | p-try@^2.0.0:
942 | version "2.2.0"
943 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
944 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
945 |
946 | package-json@^6.3.0:
947 | version "6.5.0"
948 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0"
949 | integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==
950 | dependencies:
951 | got "^9.6.0"
952 | registry-auth-token "^4.0.0"
953 | registry-url "^5.0.0"
954 | semver "^6.2.0"
955 |
956 | parse-json@^4.0.0:
957 | version "4.0.0"
958 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
959 | integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=
960 | dependencies:
961 | error-ex "^1.3.1"
962 | json-parse-better-errors "^1.0.1"
963 |
964 | parseurl@~1.3.3:
965 | version "1.3.3"
966 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
967 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
968 |
969 | path-exists@^3.0.0:
970 | version "3.0.0"
971 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
972 | integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=
973 |
974 | path-parse@^1.0.6:
975 | version "1.0.6"
976 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
977 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
978 |
979 | path-to-regexp@0.1.7:
980 | version "0.1.7"
981 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c"
982 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
983 |
984 | picomatch@^2.0.4, picomatch@^2.2.1:
985 | version "2.2.2"
986 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
987 | integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
988 |
989 | pify@^3.0.0:
990 | version "3.0.0"
991 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
992 | integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
993 |
994 | prepend-http@^2.0.0:
995 | version "2.0.0"
996 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
997 | integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
998 |
999 | proxy-addr@~2.0.5:
1000 | version "2.0.6"
1001 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf"
1002 | integrity sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==
1003 | dependencies:
1004 | forwarded "~0.1.2"
1005 | ipaddr.js "1.9.1"
1006 |
1007 | pstree.remy@^1.1.7:
1008 | version "1.1.8"
1009 | resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
1010 | integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==
1011 |
1012 | pump@^3.0.0:
1013 | version "3.0.0"
1014 | resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
1015 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
1016 | dependencies:
1017 | end-of-stream "^1.1.0"
1018 | once "^1.3.1"
1019 |
1020 | pupa@^2.0.1:
1021 | version "2.0.1"
1022 | resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726"
1023 | integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==
1024 | dependencies:
1025 | escape-goat "^2.0.0"
1026 |
1027 | qs@6.7.0:
1028 | version "6.7.0"
1029 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc"
1030 | integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
1031 |
1032 | range-parser@~1.2.1:
1033 | version "1.2.1"
1034 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
1035 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
1036 |
1037 | raw-body@2.4.0:
1038 | version "2.4.0"
1039 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332"
1040 | integrity sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
1041 | dependencies:
1042 | bytes "3.1.0"
1043 | http-errors "1.7.2"
1044 | iconv-lite "0.4.24"
1045 | unpipe "1.0.0"
1046 |
1047 | rc@^1.2.8:
1048 | version "1.2.8"
1049 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
1050 | integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
1051 | dependencies:
1052 | deep-extend "^0.6.0"
1053 | ini "~1.3.0"
1054 | minimist "^1.2.0"
1055 | strip-json-comments "~2.0.1"
1056 |
1057 | read-pkg@^4.0.1:
1058 | version "4.0.1"
1059 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-4.0.1.tgz#963625378f3e1c4d48c85872b5a6ec7d5d093237"
1060 | integrity sha1-ljYlN48+HE1IyFhytabsfV0JMjc=
1061 | dependencies:
1062 | normalize-package-data "^2.3.2"
1063 | parse-json "^4.0.0"
1064 | pify "^3.0.0"
1065 |
1066 | readdirp@~3.4.0:
1067 | version "3.4.0"
1068 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada"
1069 | integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==
1070 | dependencies:
1071 | picomatch "^2.2.1"
1072 |
1073 | registry-auth-token@^4.0.0:
1074 | version "4.2.0"
1075 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da"
1076 | integrity sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==
1077 | dependencies:
1078 | rc "^1.2.8"
1079 |
1080 | registry-url@^5.0.0:
1081 | version "5.1.0"
1082 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009"
1083 | integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==
1084 | dependencies:
1085 | rc "^1.2.8"
1086 |
1087 | require-directory@^2.1.1:
1088 | version "2.1.1"
1089 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
1090 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
1091 |
1092 | require-main-filename@^2.0.0:
1093 | version "2.0.0"
1094 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
1095 | integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
1096 |
1097 | resolve@^1.10.0:
1098 | version "1.17.0"
1099 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
1100 | integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
1101 | dependencies:
1102 | path-parse "^1.0.6"
1103 |
1104 | responselike@^1.0.2:
1105 | version "1.0.2"
1106 | resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
1107 | integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
1108 | dependencies:
1109 | lowercase-keys "^1.0.0"
1110 |
1111 | rxjs@^6.5.2:
1112 | version "6.6.0"
1113 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.0.tgz#af2901eedf02e3a83ffa7f886240ff9018bbec84"
1114 | integrity sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==
1115 | dependencies:
1116 | tslib "^1.9.0"
1117 |
1118 | safe-buffer@5.1.2:
1119 | version "5.1.2"
1120 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
1121 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
1122 |
1123 | "safer-buffer@>= 2.1.2 < 3":
1124 | version "2.1.2"
1125 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
1126 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
1127 |
1128 | semver-diff@^3.1.1:
1129 | version "3.1.1"
1130 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b"
1131 | integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==
1132 | dependencies:
1133 | semver "^6.3.0"
1134 |
1135 | "semver@2 || 3 || 4 || 5", semver@^5.7.1:
1136 | version "5.7.1"
1137 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
1138 | integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
1139 |
1140 | semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
1141 | version "6.3.0"
1142 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
1143 | integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
1144 |
1145 | send@0.17.1:
1146 | version "0.17.1"
1147 | resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"
1148 | integrity sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
1149 | dependencies:
1150 | debug "2.6.9"
1151 | depd "~1.1.2"
1152 | destroy "~1.0.4"
1153 | encodeurl "~1.0.2"
1154 | escape-html "~1.0.3"
1155 | etag "~1.8.1"
1156 | fresh "0.5.2"
1157 | http-errors "~1.7.2"
1158 | mime "1.6.0"
1159 | ms "2.1.1"
1160 | on-finished "~2.3.0"
1161 | range-parser "~1.2.1"
1162 | statuses "~1.5.0"
1163 |
1164 | serve-static@1.14.1:
1165 | version "1.14.1"
1166 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9"
1167 | integrity sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
1168 | dependencies:
1169 | encodeurl "~1.0.2"
1170 | escape-html "~1.0.3"
1171 | parseurl "~1.3.3"
1172 | send "0.17.1"
1173 |
1174 | set-blocking@^2.0.0:
1175 | version "2.0.0"
1176 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
1177 | integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
1178 |
1179 | setprototypeof@1.1.1:
1180 | version "1.1.1"
1181 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
1182 | integrity sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
1183 |
1184 | signal-exit@^3.0.2:
1185 | version "3.0.3"
1186 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
1187 | integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
1188 |
1189 | spawn-command@^0.0.2-1:
1190 | version "0.0.2-1"
1191 | resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0"
1192 | integrity sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=
1193 |
1194 | spdx-correct@^3.0.0:
1195 | version "3.1.1"
1196 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
1197 | integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
1198 | dependencies:
1199 | spdx-expression-parse "^3.0.0"
1200 | spdx-license-ids "^3.0.0"
1201 |
1202 | spdx-exceptions@^2.1.0:
1203 | version "2.3.0"
1204 | resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
1205 | integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
1206 |
1207 | spdx-expression-parse@^3.0.0:
1208 | version "3.0.1"
1209 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
1210 | integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
1211 | dependencies:
1212 | spdx-exceptions "^2.1.0"
1213 | spdx-license-ids "^3.0.0"
1214 |
1215 | spdx-license-ids@^3.0.0:
1216 | version "3.0.5"
1217 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654"
1218 | integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==
1219 |
1220 | "statuses@>= 1.5.0 < 2", statuses@~1.5.0:
1221 | version "1.5.0"
1222 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
1223 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
1224 |
1225 | string-width@^3.0.0, string-width@^3.1.0:
1226 | version "3.1.0"
1227 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
1228 | integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
1229 | dependencies:
1230 | emoji-regex "^7.0.1"
1231 | is-fullwidth-code-point "^2.0.0"
1232 | strip-ansi "^5.1.0"
1233 |
1234 | string-width@^4.0.0, string-width@^4.1.0:
1235 | version "4.2.0"
1236 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5"
1237 | integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==
1238 | dependencies:
1239 | emoji-regex "^8.0.0"
1240 | is-fullwidth-code-point "^3.0.0"
1241 | strip-ansi "^6.0.0"
1242 |
1243 | strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
1244 | version "5.2.0"
1245 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
1246 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
1247 | dependencies:
1248 | ansi-regex "^4.1.0"
1249 |
1250 | strip-ansi@^6.0.0:
1251 | version "6.0.0"
1252 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
1253 | integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
1254 | dependencies:
1255 | ansi-regex "^5.0.0"
1256 |
1257 | strip-json-comments@~2.0.1:
1258 | version "2.0.1"
1259 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
1260 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
1261 |
1262 | supports-color@^5.3.0, supports-color@^5.5.0:
1263 | version "5.5.0"
1264 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
1265 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
1266 | dependencies:
1267 | has-flag "^3.0.0"
1268 |
1269 | supports-color@^6.1.0:
1270 | version "6.1.0"
1271 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
1272 | integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
1273 | dependencies:
1274 | has-flag "^3.0.0"
1275 |
1276 | supports-color@^7.1.0:
1277 | version "7.1.0"
1278 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz#68e32591df73e25ad1c4b49108a2ec507962bfd1"
1279 | integrity sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==
1280 | dependencies:
1281 | has-flag "^4.0.0"
1282 |
1283 | term-size@^2.1.0:
1284 | version "2.2.0"
1285 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753"
1286 | integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==
1287 |
1288 | to-readable-stream@^1.0.0:
1289 | version "1.0.0"
1290 | resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
1291 | integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
1292 |
1293 | to-regex-range@^5.0.1:
1294 | version "5.0.1"
1295 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
1296 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
1297 | dependencies:
1298 | is-number "^7.0.0"
1299 |
1300 | toidentifier@1.0.0:
1301 | version "1.0.0"
1302 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
1303 | integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
1304 |
1305 | touch@^3.1.0:
1306 | version "3.1.0"
1307 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
1308 | integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==
1309 | dependencies:
1310 | nopt "~1.0.10"
1311 |
1312 | tree-kill@^1.2.2:
1313 | version "1.2.2"
1314 | resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
1315 | integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==
1316 |
1317 | tslib@^1.9.0:
1318 | version "1.13.0"
1319 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043"
1320 | integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==
1321 |
1322 | type-fest@^0.8.1:
1323 | version "0.8.1"
1324 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
1325 | integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
1326 |
1327 | type-is@~1.6.17, type-is@~1.6.18:
1328 | version "1.6.18"
1329 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
1330 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
1331 | dependencies:
1332 | media-typer "0.3.0"
1333 | mime-types "~2.1.24"
1334 |
1335 | typedarray-to-buffer@^3.1.5:
1336 | version "3.1.5"
1337 | resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
1338 | integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
1339 | dependencies:
1340 | is-typedarray "^1.0.0"
1341 |
1342 | undefsafe@^2.0.2:
1343 | version "2.0.3"
1344 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae"
1345 | integrity sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==
1346 | dependencies:
1347 | debug "^2.2.0"
1348 |
1349 | unique-string@^2.0.0:
1350 | version "2.0.0"
1351 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
1352 | integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==
1353 | dependencies:
1354 | crypto-random-string "^2.0.0"
1355 |
1356 | unpipe@1.0.0, unpipe@~1.0.0:
1357 | version "1.0.0"
1358 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
1359 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=
1360 |
1361 | update-notifier@^4.0.0:
1362 | version "4.1.0"
1363 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3"
1364 | integrity sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==
1365 | dependencies:
1366 | boxen "^4.2.0"
1367 | chalk "^3.0.0"
1368 | configstore "^5.0.1"
1369 | has-yarn "^2.1.0"
1370 | import-lazy "^2.1.0"
1371 | is-ci "^2.0.0"
1372 | is-installed-globally "^0.3.1"
1373 | is-npm "^4.0.0"
1374 | is-yarn-global "^0.3.0"
1375 | latest-version "^5.0.0"
1376 | pupa "^2.0.1"
1377 | semver-diff "^3.1.1"
1378 | xdg-basedir "^4.0.0"
1379 |
1380 | url-parse-lax@^3.0.0:
1381 | version "3.0.0"
1382 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
1383 | integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
1384 | dependencies:
1385 | prepend-http "^2.0.0"
1386 |
1387 | utils-merge@1.0.1:
1388 | version "1.0.1"
1389 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
1390 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
1391 |
1392 | uuid@^8.2.0:
1393 | version "8.2.0"
1394 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.2.0.tgz#cb10dd6b118e2dada7d0cd9730ba7417c93d920e"
1395 | integrity sha512-CYpGiFTUrmI6OBMkAdjSDM0k5h8SkkiTP4WAjQgDgNB1S3Ou9VBEvr6q0Kv2H1mMk7IWfxYGpMH5sd5AvcIV2Q==
1396 |
1397 | validate-npm-package-license@^3.0.1:
1398 | version "3.0.4"
1399 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
1400 | integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
1401 | dependencies:
1402 | spdx-correct "^3.0.0"
1403 | spdx-expression-parse "^3.0.0"
1404 |
1405 | vary@^1, vary@~1.1.2:
1406 | version "1.1.2"
1407 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
1408 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
1409 |
1410 | which-module@^2.0.0:
1411 | version "2.0.0"
1412 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
1413 | integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
1414 |
1415 | widest-line@^3.1.0:
1416 | version "3.1.0"
1417 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
1418 | integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==
1419 | dependencies:
1420 | string-width "^4.0.0"
1421 |
1422 | wrap-ansi@^5.1.0:
1423 | version "5.1.0"
1424 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
1425 | integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
1426 | dependencies:
1427 | ansi-styles "^3.2.0"
1428 | string-width "^3.0.0"
1429 | strip-ansi "^5.0.0"
1430 |
1431 | wrappy@1:
1432 | version "1.0.2"
1433 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
1434 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
1435 |
1436 | write-file-atomic@^3.0.0:
1437 | version "3.0.3"
1438 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
1439 | integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
1440 | dependencies:
1441 | imurmurhash "^0.1.4"
1442 | is-typedarray "^1.0.0"
1443 | signal-exit "^3.0.2"
1444 | typedarray-to-buffer "^3.1.5"
1445 |
1446 | xdg-basedir@^4.0.0:
1447 | version "4.0.0"
1448 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
1449 | integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
1450 |
1451 | y18n@^4.0.0:
1452 | version "4.0.0"
1453 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b"
1454 | integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==
1455 |
1456 | yargs-parser@^13.1.2:
1457 | version "13.1.2"
1458 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38"
1459 | integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
1460 | dependencies:
1461 | camelcase "^5.0.0"
1462 | decamelize "^1.2.0"
1463 |
1464 | yargs@^13.3.0:
1465 | version "13.3.2"
1466 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd"
1467 | integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
1468 | dependencies:
1469 | cliui "^5.0.0"
1470 | find-up "^3.0.0"
1471 | get-caller-file "^2.0.1"
1472 | require-directory "^2.1.1"
1473 | require-main-filename "^2.0.0"
1474 | set-blocking "^2.0.0"
1475 | string-width "^3.0.0"
1476 | which-module "^2.0.0"
1477 | y18n "^4.0.0"
1478 | yargs-parser "^13.1.2"
1479 |
--------------------------------------------------------------------------------