diff --git a/.env b/.env index d3bca64c0be..8db17993d75 100644 --- a/.env +++ b/.env @@ -1,3 +1,4 @@ gist_token= account_passphrase= -account_password= \ No newline at end of file +account_password= +NODE_OPTIONS=--max-old-space-size=2048 \ No newline at end of file diff --git a/apps/remix-ide-e2e/seleniumConfig.js b/apps/remix-ide-e2e/seleniumConfig.js index 210c9b6fa64..eaece8bc7be 100644 --- a/apps/remix-ide-e2e/seleniumConfig.js +++ b/apps/remix-ide-e2e/seleniumConfig.js @@ -1,3 +1,4 @@ +/* eslint-disable */ module.exports = { version: '3.8.1', baseURL: 'https://selenium-release.storage.googleapis.com', diff --git a/apps/remix-ide/ci/browser_tests_chrome.sh b/apps/remix-ide/ci/browser_tests_chrome.sh index 6a15f1207cc..297aca6e849 100755 --- a/apps/remix-ide/ci/browser_tests_chrome.sh +++ b/apps/remix-ide/ci/browser_tests_chrome.sh @@ -2,22 +2,14 @@ set -e -setupRemixd () { - mkdir remixdSharedfolder - cd apps/remix-ide/contracts - echo 'sharing folder: ' - echo $PWD - ../../../node_modules/.bin/remixd -s $PWD --remix-ide http://127.0.0.1:8080 & - cd ../../.. -} - BUILD_ID=${CIRCLE_BUILD_NUM:-${TRAVIS_JOB_NUMBER}} echo "$BUILD_ID" TEST_EXITCODE=0 npm run ganache-cli & npm run serve & -setupRemixd +echo 'sharing folder: ' $PWD '/apps/remix-ide/contracts' & +npm run remixd & sleep 5 diff --git a/apps/remix-ide/ci/browser_tests_firefox.sh b/apps/remix-ide/ci/browser_tests_firefox.sh index d2058c1afb4..8663a0763fa 100755 --- a/apps/remix-ide/ci/browser_tests_firefox.sh +++ b/apps/remix-ide/ci/browser_tests_firefox.sh @@ -2,22 +2,14 @@ set -e -setupRemixd () { - mkdir remixdSharedfolder - cd apps/remix-ide/contracts - echo 'sharing folder: ' - echo $PWD - ../../../node_modules/.bin/remixd -s $PWD --remix-ide http://127.0.0.1:8080 & - cd ../../.. -} - BUILD_ID=${CIRCLE_BUILD_NUM:-${TRAVIS_JOB_NUMBER}} echo "$BUILD_ID" TEST_EXITCODE=0 npm run ganache-cli & npm run serve & -setupRemixd +echo 'sharing folder: ' $PWD '/apps/remix-ide/contracts' & +npm run remixd & sleep 5 diff --git a/apps/remix-ide/ci/browser_tests_run_deploy.sh b/apps/remix-ide/ci/browser_tests_run_deploy.sh index 38ec4398735..aa3ff4885f5 100755 --- a/apps/remix-ide/ci/browser_tests_run_deploy.sh +++ b/apps/remix-ide/ci/browser_tests_run_deploy.sh @@ -2,22 +2,12 @@ set -e -setupRemixd () { - mkdir remixdSharedfolder - cd apps/remix-ide/contracts - echo 'sharing folder: ' - echo $PWD - ../../../node_modules/.bin/remixd -s $PWD --remix-ide http://127.0.0.1:8080 & - cd ../../.. -} - BUILD_ID=${CIRCLE_BUILD_NUM:-${TRAVIS_JOB_NUMBER}} echo "$BUILD_ID" TEST_EXITCODE=0 npm run ganache-cli & npm run serve & -setupRemixd sleep 5 diff --git a/libs/README.md b/libs/README.md index 0f707eeb297..e609bb48de2 100644 --- a/libs/README.md +++ b/libs/README.md @@ -22,7 +22,7 @@ Remix is built out of several different modules. Here is the brief description. + [`remix-lib`](remix-lib/README.md): Common place for libraries being used across multiple modules + [`remix-tests`](remix-tests/README.md): Unit test Solidity smart contracts. It works as a plugin & as CLI both + [`remix-url-resolver`](remix-url-resolver/README.md): Provide helpers for resolving the content from external URL ( including github, swarm, ipfs etc.). -+ [`remixd`](https://github.com/ethereum/remixd/tree/master): Allow accessing local filesystem from Remix IDE by running a daemon ++ [`remixd`](remixd/README.md): Allow accessing local filesystem from Remix IDE by running a daemon Each module generally has their own npm package and test suite, as well as basic documentation in their respective `README`s. Usage of modules as plugin is well documented **[here](https://remix-ide.readthedocs.io/en/latest/index.html)**. diff --git a/libs/remix-astwalker/.eslintrc b/libs/remix-astwalker/.eslintrc index eca07ff2f49..35e3aeb5111 100644 --- a/libs/remix-astwalker/.eslintrc +++ b/libs/remix-astwalker/.eslintrc @@ -1,7 +1,8 @@ { "extends": "../../.eslintrc", "rules": { - "@typescript-eslint/no-explicit-any": "off" + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/prefer-namespace-keyword": "off" }, "ignorePatterns": ["!**/*"] } diff --git a/libs/remix-astwalker/src/@types/remix-lib/index.d.ts b/libs/remix-astwalker/src/@types/remix-lib/index.d.ts index 3cba5328ea6..02bc2df1bc5 100644 --- a/libs/remix-astwalker/src/@types/remix-lib/index.d.ts +++ b/libs/remix-astwalker/src/@types/remix-lib/index.d.ts @@ -1,4 +1,4 @@ -// Type definitiosn for the things we need from remix-lib +// Type definitions for the things we need from remix-lib declare module "remix-lib" { export module util { diff --git a/libs/remixd b/libs/remixd deleted file mode 160000 index 1a9ec3230e7..00000000000 --- a/libs/remixd +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1a9ec3230e7a3c278ddc6344e5c89d488a316910 diff --git a/libs/remixd/.eslintrc b/libs/remixd/.eslintrc new file mode 100644 index 00000000000..ab8f38339cd --- /dev/null +++ b/libs/remixd/.eslintrc @@ -0,0 +1 @@ +{ "extends": "../../.eslintrc", "rules": {}, "ignorePatterns": ["!**/*"] } diff --git a/libs/remixd/README.md b/libs/remixd/README.md new file mode 100644 index 00000000000..7d80ff6ed5f --- /dev/null +++ b/libs/remixd/README.md @@ -0,0 +1,49 @@ +# Remixd + +`remixd` is a tool that intend to be used with [Remix IDE](https://github.com/ethereum/remix-project) (aka. Browser-Solidity). It allows a websocket connection between +`Remix IDE` (web application) and the local computer. + +Practically Remix IDE makes available a folder shared by `remixd`. + +More details are explained in this [tutorial](https://remix-ide.readthedocs.io/en/latest/remixd.html). + +Alternatively `remixd` can be used to setup a development environment that can be used with other popular frameworks like Embark, Truffle, Ganache, etc.. + +`remixd` needs `npm` and `node` + +## INSTALLATION + +`npm install -g @remix-project/remixd` + +## HELP SECTION + +``` + Usage: remixd -s --remix-ide https://remix.ethereum.org + + Provide a two-way connection between the local computer and Remix IDE. + + + Options: + + --remix-ide URL of remix instance allowed to connect to this + web sockect connection + -s, --shared-folder Folder to share with Remix IDE + --read-only Treat shared folder as read-only (experimental) + -h, --help output usage information + +``` + +## SHARE A FOLDER + +`remixd -s --remix-ide https://remix.ethereum.org` + +The current user should have `read/write` access to the folder (at least `read` access). + +It is important to notice that changes made to the current file in `Remix IDE` are automatically saved to the local computer every 5000 ms. There is no `Save` action. But the `Ctrl-Z` (undo) can be used. + +Furthermore : + - No copy of the shared folder are kept in the browser storage. + - It is not possible to create a file from `Remix IDE` (that might change). + - If a folder does not contain any file, the folder will not be displayed in the explorer (that might change). + - Symbolic links are not forwarded to Remix IDE. + \ No newline at end of file diff --git a/libs/remixd/jest.config.js b/libs/remixd/jest.config.js new file mode 100644 index 00000000000..1d33799387f --- /dev/null +++ b/libs/remixd/jest.config.js @@ -0,0 +1,15 @@ +/* eslint-disable */ +module.exports = { + name: 'remixd', + preset: '../../jest.config.js', + globals: { + 'ts-jest': { + tsConfig: '/tsconfig.spec.json' + } + }, + transform: { + '^.+\\.[tj]sx?$': 'ts-jest' + }, + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'html'], + coverageDirectory: '../../coverage/libs/remixd' +}; diff --git a/libs/remixd/nodemon.json b/libs/remixd/nodemon.json new file mode 100644 index 00000000000..0f98d8b9138 --- /dev/null +++ b/libs/remixd/nodemon.json @@ -0,0 +1,5 @@ +{ + "watch": ["./src", "./bin"], + "ext": "ts", + "exec": "npm run build && npm run start" +} \ No newline at end of file diff --git a/libs/remixd/package.json b/libs/remixd/package.json new file mode 100644 index 00000000000..b2b17ad5f67 --- /dev/null +++ b/libs/remixd/package.json @@ -0,0 +1,69 @@ +{ + "name": "@remix-project/remixd", + "version": "0.2.4-alpha.0", + "description": "remix server: allow accessing file system from remix.ethereum.org and start a dev environment (see help section)", + "main": "./index.js", + "types": "./index.d.ts", + "bin": { + "remixd": "./bin/remixd.js" + }, + "scripts": { + "test": "echo \"Error: no test specified\"", + "start": "./bin/remixd.js", + "npip": "npip", + "lint": "eslint ./src ./bin --ext .ts", + "build": "tsc -p ./ && chmod +x ./bin/remixd.js", + "dev": "nodemon" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/ethereum/remix-project.git" + }, + "keywords": [ + "remix", + "ide", + "ethereum", + "solidity" + ], + "author": "Remix Team", + "license": "MIT", + "bugs": { + "url": "https://github.com/ethereum/remix-project/issues" + }, + "homepage": "https://github.com/ethereum/remix-project#readme", + "dependencies": { + "@remixproject/plugin": "0.3.0-beta.5", + "@remixproject/plugin-api": "0.3.0-beta.5", + "@remixproject/plugin-utils": "0.3.0-beta.5", + "@remixproject/plugin-ws": "^0.3.0-beta.8", + "axios": "^0.20.0", + "chokidar": "^2.1.8", + "commander": "^2.20.3", + "fs-extra": "^3.0.1", + "isbinaryfile": "^3.0.2", + "ws": "^7.3.0" + }, + "python": { + "execPath": "python3", + "dependencies": { + "vyper": ">=0.1.0b3" + } + }, + "devDependencies": { + "@types/axios": "^0.14.0", + "@types/fs-extra": "^9.0.1", + "@types/node": "^14.0.5", + "@types/ws": "^7.2.4", + "@typescript-eslint/eslint-plugin": "^3.2.0", + "@typescript-eslint/parser": "^3.2.0", + "eslint": "6.8.0", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.20.2", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "4.2.1", + "eslint-plugin-standard": "4.0.1", + "nodemon": "^2.0.4", + "ts-node": "^8.10.1", + "typescript": "^3.9.3" + } +} diff --git a/libs/remixd/src/bin/remixd.ts b/libs/remixd/src/bin/remixd.ts new file mode 100644 index 00000000000..0b7ef1538f9 --- /dev/null +++ b/libs/remixd/src/bin/remixd.ts @@ -0,0 +1,99 @@ +#!/usr/bin/env node +import WebSocket from '../websocket' +import * as servicesList from '../serviceList' +import * as WS from 'ws' +import { getDomain } from '../utils' +import Axios from 'axios' +import * as fs from 'fs-extra' +import * as path from 'path' +import * as program from 'commander' + +(async () => { + program + .usage('-s ') + .description('Provide a two-way connection between the local computer and Remix IDE') + .option('--remix-ide ', 'URL of remix instance allowed to connect to this web sockect connection') + .option('-s, --shared-folder ', 'Folder to share with Remix IDE') + .option('--read-only', 'Treat shared folder as read-only (experimental)') + .on('--help', function(){ + console.log('\nExample:\n\n remixd -s ./ --remix-ide http://localhost:8080') + }).parse(process.argv) + // eslint-disable-next-line + const killCallBack: Array = [] + + if (!program.remixIde) { + console.log('\x1b[33m%s\x1b[0m', '[WARN] You can only connect to remixd from one of the supported origins.') + } else { + const isValid = await isValidOrigin(program.remixIde) + /* Allow unsupported origins and display warning. */ + if (!isValid) { + console.log('\x1b[33m%s\x1b[0m', '[WARN] You are using IDE from an unsupported origin.') + console.log('\x1b[33m%s\x1b[0m', 'Check https://gist.github.com/EthereumRemix/091ccc57986452bbb33f57abfb13d173 for list of all supported origins.\n') + // return + } + console.log('\x1b[33m%s\x1b[0m', '[WARN] You may now only use IDE at ' + program.remixIde + ' to connect to that instance') + } + + if (program.sharedFolder) { + console.log('\x1b[33m%s\x1b[0m', '[WARN] Any application that runs on your computer can potentially read from and write to all files in the directory.') + console.log('\x1b[33m%s\x1b[0m', '[WARN] Symbolic links are not forwarded to Remix IDE\n') + try { + const sharedFolderClient = new servicesList['sharedfolder']() + const websocketHandler = new WebSocket(65520, { remixIdeUrl: program.remixIde }, sharedFolderClient) + + websocketHandler.start((ws: WS) => { + sharedFolderClient.setWebSocket(ws) + sharedFolderClient.setupNotifications(program.sharedFolder) + sharedFolderClient.sharedFolder(program.sharedFolder, program.readOnly || false) + }) + killCallBack.push(websocketHandler.close.bind(websocketHandler)) + } catch(error) { + throw new Error(error) + } + } else { + console.log('\x1b[31m%s\x1b[0m', '[ERR] No valid shared folder provided.') + } + + // kill + function kill () { + for (const k in killCallBack) { + try { + killCallBack[k]() + } catch (e) { + console.log(e) + } + } + } + + process.on('SIGINT', kill) // catch ctrl-c + process.on('SIGTERM', kill) // catch kill + process.on('exit', kill) + + async function isValidOrigin (origin: string): Promise { + if (!origin) return false + const domain = getDomain(origin) + const gistUrl = 'https://gist.githubusercontent.com/EthereumRemix/091ccc57986452bbb33f57abfb13d173/raw/3367e019335746b73288e3710af2922d4c8ef5a3/origins.json' + + try { + const { data } = await Axios.get(gistUrl) + + try { + await fs.writeJSON(path.resolve(__dirname + '/../origins.json'), { data }) + } catch (e) { + console.error(e) + } + + return data.includes(origin) ? data.includes(origin) : data.includes(domain) + } catch (e) { + try { + // eslint-disable-next-line + const origins = require('../origins.json') + const { data } = origins + + return data.includes(origin) ? data.includes(origin) : data.includes(domain) + } catch (e) { + return false + } + } + } +})() diff --git a/libs/remixd/src/index.ts b/libs/remixd/src/index.ts new file mode 100644 index 00000000000..8211aa8028d --- /dev/null +++ b/libs/remixd/src/index.ts @@ -0,0 +1,12 @@ +'use strict' +import { RemixdClient as sharedFolder } from './services/remixdClient' +import Websocket from './websocket' +import * as utils from './utils' + +module.exports = { + Websocket, + utils, + services: { + sharedFolder + } +} diff --git a/libs/remixd/src/origins.json b/libs/remixd/src/origins.json new file mode 100644 index 00000000000..d91e2f8a619 --- /dev/null +++ b/libs/remixd/src/origins.json @@ -0,0 +1,11 @@ +{ + "data":[ + "http://remix-alpha.ethereum.org", + "http://remix.ethereum.org", + "https://remix-alpha.ethereum.org", + "https://remix.ethereum.org", + "package://a7df6d3c223593f3550b35e90d7b0b1f.mod", + "package://6fd22d6fe5549ad4c4d8fd3ca0b7816b.mod", + "https://ipfsgw.komputing.org" + ] +} \ No newline at end of file diff --git a/libs/remixd/src/serviceList.ts b/libs/remixd/src/serviceList.ts new file mode 100644 index 00000000000..32c446a176a --- /dev/null +++ b/libs/remixd/src/serviceList.ts @@ -0,0 +1,3 @@ +import { RemixdClient as sharedfolder } from './services/remixdClient' + +export { sharedfolder } diff --git a/libs/remixd/src/services/remixdClient.ts b/libs/remixd/src/services/remixdClient.ts new file mode 100644 index 00000000000..d098a3a83af --- /dev/null +++ b/libs/remixd/src/services/remixdClient.ts @@ -0,0 +1,242 @@ +import { PluginClient } from '@remixproject/plugin' +import { SharedFolderArgs, TrackDownStreamUpdate, Filelist, ResolveDirectory, FileContent } from '../types' +import * as WS from 'ws' +import * as utils from '../utils' +import * as chokidar from 'chokidar' +import * as fs from 'fs-extra' +import * as isbinaryfile from 'isbinaryfile' + +export class RemixdClient extends PluginClient { + methods: ['folderIsReadOnly', 'resolveDirectory', 'get', 'exists', 'isFile', 'set', 'list', 'isDirectory'] + trackDownStreamUpdate: TrackDownStreamUpdate = {} + websocket: WS + currentSharedFolder: string + readOnly: boolean + + setWebSocket (websocket: WS): void { + this.websocket = websocket + } + + sharedFolder (currentSharedFolder: string, readOnly: boolean): void { + this.currentSharedFolder = currentSharedFolder + this.readOnly = readOnly + } + + list (): Filelist { + try { + return utils.walkSync(this.currentSharedFolder, {}, this.currentSharedFolder) + } catch (e) { + throw new Error(e) + } + } + + resolveDirectory (args: SharedFolderArgs): ResolveDirectory { + try { + const path = utils.absolutePath(args.path, this.currentSharedFolder) + const result = utils.resolveDirectory(path, this.currentSharedFolder) + + return result + } catch (e) { + throw new Error(e) + } + } + + folderIsReadOnly (): boolean { + return this.readOnly + } + + get (args: SharedFolderArgs): Promise { + try { + return new Promise((resolve, reject) => { + const path = utils.absolutePath(args.path, this.currentSharedFolder) + + if (!fs.existsSync(path)) { + return reject('File not found ' + path) + } + if (!isRealPath(path)) return + isbinaryfile(path, (error: Error, isBinary: boolean) => { + if (error) console.log(error) + if (isBinary) { + resolve({ content: '', readonly: true }) + } else { + fs.readFile(path, 'utf8', (error: Error, data: string) => { + if (error) console.log(error) + resolve({ content: data, readonly: false }) + }) + } + }) + }) + } catch (error) { + throw new Error(error) + } + } + + exists (args: SharedFolderArgs): boolean { + try { + const path = utils.absolutePath(args.path, this.currentSharedFolder) + + return fs.existsSync(path) + } catch(error) { + throw new Error(error) + } + } + + set (args: SharedFolderArgs): Promise { + try { + return new Promise((resolve, reject) => { + if (this.readOnly) reject('Cannot write file: read-only mode selected') + const isFolder = args.path.endsWith('/') + const path = utils.absolutePath(args.path, this.currentSharedFolder) + const exists = fs.existsSync(path) + + if (exists && !isRealPath(path)) reject() + if (args.content === 'undefined') { // no !!!!! + console.log('trying to write "undefined" ! stopping.') + reject('trying to write "undefined" ! stopping.') + } + this.trackDownStreamUpdate[path] = path + if (isFolder) { + fs.mkdirp(path).then(() => { + let splitPath = args.path.split('/') + + splitPath = splitPath.filter(dir => dir) + const dir = '/' + splitPath.join('/') + + this.emit('folderAdded', dir) + resolve() + }).catch((e: Error) => reject(e)) + } else { + fs.ensureFile(path).then(() => { + fs.writeFile(path, args.content, 'utf8', (error: Error) => { + if (error) { + console.log(error) + reject(error) + } + resolve() + }) + }).catch((e: Error) => reject(e)) + if (!exists) { + this.emit('fileAdded', args.path) + } else { + this.emit('fileChanged', args.path) + } + } + }) + } catch (error) { + throw new Error(error) + } + } + + rename (args: SharedFolderArgs): Promise { + try { + return new Promise((resolve, reject) => { + if (this.readOnly) reject('Cannot rename file: read-only mode selected') + const oldpath = utils.absolutePath(args.oldPath, this.currentSharedFolder) + + if (!fs.existsSync(oldpath)) { + reject('File not found ' + oldpath) + } + const newpath = utils.absolutePath(args.newPath, this.currentSharedFolder) + + if (!isRealPath(oldpath)) return + fs.move(oldpath, newpath, (error: Error) => { + if (error) { + console.log(error) + reject(error.message) + } + this.emit('fileRenamed', args.oldPath, args.newPath) + resolve(true) + }) + }) + } catch (error) { + throw new Error(error) + } + } + + remove (args: SharedFolderArgs): Promise { + try { + return new Promise((resolve, reject) => { + if (this.readOnly) reject('Cannot remove file: read-only mode selected') + const path = utils.absolutePath(args.path, this.currentSharedFolder) + + if (!fs.existsSync(path)) reject('File not found ' + path) + if (!isRealPath(path)) return + return fs.remove(path, (error: Error) => { + if (error) { + console.log(error) + reject('Failed to remove file/directory: ' + error) + } + this.emit('fileRemoved', args.path) + resolve(true) + }) + }) + } catch (error) { + throw new Error(error) + } + } + + isDirectory (args: SharedFolderArgs): boolean { + try { + const path = utils.absolutePath(args.path, this.currentSharedFolder) + + return fs.statSync(path).isDirectory() + } catch (error) { + throw new Error(error) + } + } + + isFile (args: SharedFolderArgs): boolean { + try { + const path = utils.absolutePath(args.path, this.currentSharedFolder) + + return fs.statSync(path).isFile() + } catch (error) { + throw new Error(error) + } + } + + setupNotifications (path: string): void { + const absPath = utils.absolutePath('./', path) + + if (!isRealPath(absPath)) return + const watcher = chokidar.watch(path, { depth: 0, ignorePermissionErrors: true }) + console.log('setup notifications for ' + path) + /* we can't listen on created file / folder + watcher.on('add', (f, stat) => { + isbinaryfile(f, (error, isBinary) => { + if (error) console.log(error) + console.log('add', f) + this.emit('created', { path: utils.relativePath(f, this.currentSharedFolder), isReadOnly: isBinary, isFolder: false }) + }) + }) + watcher.on('addDir', (f, stat) => { + this.emit('created', { path: utils.relativePath(f, this.currentSharedFolder), isReadOnly: false, isFolder: true }) + }) + */ + watcher.on('change', (f: string) => { + if (this.trackDownStreamUpdate[f]) { + delete this.trackDownStreamUpdate[f] + return + } + this.emit('changed', utils.relativePath(f, this.currentSharedFolder)) + }) + watcher.on('unlink', (f: string) => { + this.emit('removed', utils.relativePath(f, this.currentSharedFolder), false) + }) + watcher.on('unlinkDir', (f: string) => { + this.emit('removed', utils.relativePath(f, this.currentSharedFolder), true) + }) + } +} + +function isRealPath (path: string): boolean { + const realPath = fs.realpathSync(path) + const isRealPath = path === realPath + const mes = '[WARN] Symbolic link modification not allowed : ' + path + ' | ' + realPath + + if (!isRealPath) { + console.log('\x1b[33m%s\x1b[0m', mes) + // throw new Error(mes) + } + return isRealPath +} \ No newline at end of file diff --git a/libs/remixd/src/types/index.ts b/libs/remixd/src/types/index.ts new file mode 100644 index 00000000000..3e6ef863d7f --- /dev/null +++ b/libs/remixd/src/types/index.ts @@ -0,0 +1,39 @@ +import * as ServiceList from '../serviceList' +import * as Websocket from 'ws' + +type ServiceListKeys = keyof typeof ServiceList; + +export type SharedFolder = typeof ServiceList[ServiceListKeys] + +export type SharedFolderClient = InstanceType + +export type WebsocketOpt = { + remixIdeUrl: string +} + +export type FolderArgs = { + path: string +} + +export type KeyPairString = { + [key: string]: string +} + +export type ResolveDirectory = { + [key: string]: { + isDirectory: boolean + } +} + +export type FileContent = { + content: string + readonly: boolean +} + +export type TrackDownStreamUpdate = KeyPairString + +export type SharedFolderArgs = FolderArgs & KeyPairString + +export type WS = typeof Websocket + +export type Filelist = KeyPairString \ No newline at end of file diff --git a/libs/remixd/src/utils.ts b/libs/remixd/src/utils.ts new file mode 100644 index 00000000000..758f0ddf144 --- /dev/null +++ b/libs/remixd/src/utils.ts @@ -0,0 +1,89 @@ +import { ResolveDirectory, Filelist } from './types' +import * as fs from 'fs-extra' +import * as isbinaryfile from 'isbinaryfile' +import * as pathModule from 'path' +/** + * returns the absolute path of the given @arg path + * + * @param {String} path - relative path (Unix style which is the one used by Remix IDE) + * @param {String} sharedFolder - absolute shared path. platform dependent representation. + * @return {String} platform dependent absolute path (/home/user1/.../... for unix, c:\user\...\... for windows) + */ +function absolutePath (path: string, sharedFolder:string): string { + path = normalizePath(path) + if (path.indexOf(sharedFolder) !== 0) { + path = pathModule.resolve(sharedFolder, path) + } + return path +} + +/** + * return the relative path of the given @arg path + * + * @param {String} path - absolute platform dependent path + * @param {String} sharedFolder - absolute shared path. platform dependent representation + * @return {String} relative path (Unix style which is the one used by Remix IDE) + */ +function relativePath (path: string, sharedFolder: string): string { + const relative: string = pathModule.relative(sharedFolder, path) + + return normalizePath(relative) +} + +function normalizePath (path: string): string { + if (process.platform === 'win32') { + return path.replace(/\\/g, '/') + } + return path +} + +function walkSync (dir: string, filelist: Filelist, sharedFolder: string): Filelist { + const files: string[] = fs.readdirSync(dir) + + filelist = filelist || {} + files.forEach(function (file) { + const subElement = pathModule.join(dir, file) + + if (!fs.lstatSync(subElement).isSymbolicLink()) { + if (fs.statSync(subElement).isDirectory()) { + filelist = walkSync(subElement, filelist, sharedFolder) + } else { + const relative = relativePath(subElement, sharedFolder) + + filelist[relative] = isbinaryfile.sync(subElement) + } + } + }) + return filelist +} + +function resolveDirectory (dir: string, sharedFolder: string): ResolveDirectory { + const ret: ResolveDirectory = {} + const files: string[] = fs.readdirSync(dir) + + files.forEach(function (file) { + const subElement = pathModule.join(dir, file) + + if (!fs.lstatSync(subElement).isSymbolicLink()) { + const relative: string = relativePath(subElement, sharedFolder) + + ret[relative] = { isDirectory: fs.statSync(subElement).isDirectory() } + } + }) + return ret +} + +/** + * returns the absolute path of the given @arg url + * + * @param {String} url - Remix-IDE URL instance + * @return {String} extracted domain name from url + */ +function getDomain(url: string) { + // eslint-disable-next-line + const domainMatch = url.match(/^(?:https?:\/\/)?(?:[^@\n]+@)?(?:www\.)?([^:\/\n?]+)/img) + + return domainMatch ? domainMatch[0] : null +} + +export { absolutePath, relativePath, walkSync, resolveDirectory, getDomain } diff --git a/libs/remixd/src/websocket.ts b/libs/remixd/src/websocket.ts new file mode 100644 index 00000000000..a00107c2c74 --- /dev/null +++ b/libs/remixd/src/websocket.ts @@ -0,0 +1,73 @@ +import * as WS from 'ws' +import * as http from 'http' +import { WebsocketOpt, SharedFolderClient } from './types' +import { getDomain } from './utils' +import { createClient } from '@remixproject/plugin-ws' +export default class WebSocket { + server: http.Server + wsServer: WS.Server + + constructor (public port: number, public opt: WebsocketOpt, public sharedFolder: SharedFolderClient) {} + + start (callback?: (ws: WS) => void): void { + this.server = http.createServer((request, response) => { + console.log((new Date()) + ' Received request for ' + request.url) + response.writeHead(404) + response.end() + }) + const loopback = '127.0.0.1' + + this.server.listen(this.port, loopback, function () { + console.log((new Date()) + ' remixd is listening on ' + loopback + ':65520') + }) + this.wsServer = new WS.Server({ + server: this.server, + verifyClient: (info, done) => { + if (!originIsAllowed(info.origin, this)) { + done(false) + console.log((new Date()) + ' Connection from origin ' + info.origin + ' rejected.') + return + } + done(true) + } + }) + this.wsServer.on('connection', (ws) => { + const { sharedFolder } = this + + createClient(ws, sharedFolder as any) + if(callback) callback(ws) + }) + } + + close (): void { + if (this.wsServer) { + this.wsServer.close(() => { + this.server.close() + }) + } + } +} + +function originIsAllowed (origin: string, self: WebSocket): boolean { + if (self.opt.remixIdeUrl) { + if (self.opt.remixIdeUrl.endsWith('/')) self.opt.remixIdeUrl = self.opt.remixIdeUrl.slice(0, -1) + return origin === self.opt.remixIdeUrl || origin === getDomain(self.opt.remixIdeUrl) + } else { + try { + // eslint-disable-next-line + const origins = require('./origins.json') + const domain = getDomain(origin) + const { data } = origins + + if (data.includes(origin) || data.includes(domain)) { + self.opt.remixIdeUrl = origin + console.log('\x1b[33m%s\x1b[0m', '[WARN] You may now only use IDE at ' + self.opt.remixIdeUrl + ' to connect to that instance') + return true + } else { + return false + } + } catch (e) { + return false + } + } +} diff --git a/libs/remixd/tsconfig.json b/libs/remixd/tsconfig.json new file mode 100644 index 00000000000..546e940e209 --- /dev/null +++ b/libs/remixd/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/libs/remixd/tsconfig.lib.json b/libs/remixd/tsconfig.lib.json new file mode 100644 index 00000000000..f367bc80510 --- /dev/null +++ b/libs/remixd/tsconfig.lib.json @@ -0,0 +1,13 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "target": "es6", + "module": "commonjs", + "outDir": "../../dist/out-tsc", + "declaration": true, + "rootDir": "./src", + "types": ["node"] + }, + "exclude": ["**/*.spec.ts"], + "include": ["bin", "src", "bin/origins.json"] +} diff --git a/libs/remixd/tsconfig.spec.json b/libs/remixd/tsconfig.spec.json new file mode 100644 index 00000000000..559410b96af --- /dev/null +++ b/libs/remixd/tsconfig.spec.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "**/*.spec.ts", + "**/*.spec.tsx", + "**/*.spec.js", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/nx.json b/nx.json index 95b079d8fe9..05e2be65487 100644 --- a/nx.json +++ b/nx.json @@ -63,6 +63,9 @@ "remix-ide-e2e": { "tags": [], "implicitDependencies": ["remix-ide"] + }, + "remixd": { + "tags": [] } } } diff --git a/package-lock.json b/package-lock.json index 450552417d3..9a29f282421 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4203,6 +4203,17 @@ "semver": "^6.2.0" }, "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "npm-package-arg": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", @@ -4277,6 +4288,17 @@ "micromatch": "^3.1.10" } }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -4363,6 +4385,19 @@ "@zkochan/cmd-shim": "^3.1.0", "fs-extra": "^8.1.0", "npmlog": "^4.1.2" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/describe-ref": { @@ -4444,6 +4479,19 @@ "fs-extra": "^8.1.0", "ssri": "^6.0.1", "tar": "^4.4.8" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/github-client": { @@ -4500,6 +4548,19 @@ "dedent": "^0.7.0", "fs-extra": "^8.1.0", "p-map-series": "^1.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/info": { @@ -4524,6 +4585,19 @@ "fs-extra": "^8.1.0", "p-map": "^2.1.0", "write-json-file": "^3.2.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/link": { @@ -4648,6 +4722,17 @@ "write-pkg": "^3.1.0" }, "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "npm-package-arg": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", @@ -4685,6 +4770,17 @@ "read-package-json": "^2.0.13" }, "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "npm-package-arg": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", @@ -4880,6 +4976,19 @@ "fs-extra": "^8.1.0", "npmlog": "^4.1.2", "upath": "^1.2.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/project": { @@ -5099,6 +5208,17 @@ "semver": "^6.2.0" }, "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "npm-package-arg": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", @@ -5149,6 +5269,19 @@ "fs-extra": "^8.1.0", "npmlog": "^4.1.2", "read-cmd-shim": "^1.0.1" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/rimraf-dir": { @@ -5230,6 +5363,19 @@ "@lerna/package": "3.16.0", "fs-extra": "^8.1.0", "p-map": "^2.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/symlink-dependencies": { @@ -5245,6 +5391,19 @@ "p-finally": "^1.0.0", "p-map": "^2.1.0", "p-map-series": "^1.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "@lerna/timer": { @@ -6411,6 +6570,15 @@ "yargs-parser": "10.0.0" }, "dependencies": { + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "dev": true, + "requires": { + "follow-redirects": "1.5.10" + } + }, "camelcase": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", @@ -6429,6 +6597,24 @@ "require-from-string": "^2.0.1" } }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "dev": true, + "requires": { + "debug": "=3.1.0" + } + }, "fs-extra": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.0.tgz", @@ -6446,6 +6632,12 @@ "integrity": "sha512-WLsTMEhsQuXpCiG173+f3aymI43SXa+fB1rSfbzyP4GkPP+ZFVuO0/3sFUGNBtifisPeDcl/uD/Y2NxZ7xFq4g==", "dev": true }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, "semver": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", @@ -6689,47 +6881,65 @@ "integrity": "sha512-rCekA2QZq5wbT7h9wqU+TDkRexUqhnMqcggmP+eG6ilowyZ4RhMsrrSl3fsZzd0rnp4w1LSmX0vCbuXfja3RqQ==" }, "@remixproject/plugin": { - "version": "0.3.0-alpha.8", - "resolved": "https://registry.npmjs.org/@remixproject/plugin/-/plugin-0.3.0-alpha.8.tgz", - "integrity": "sha512-uV5/YQPhX4E3amCS2yBV9tfwDo6ZThady9n70H20nFPGiZYnZxruFL6kf4iKQAj5FrnzjDyEVEZwfV9QyrAwZg==", - "dev": true, - "requires": { - "@types/node": "^13.13.4", - "events": "^3.0.0" - }, - "dependencies": { - "@types/node": { - "version": "13.13.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.14.tgz", - "integrity": "sha512-Az3QsOt1U/K1pbCQ0TXGELTuTkPLOiFIQf3ILzbOyo0FqgV9SxRnxbxM5QlAveERZMHpZY+7u3Jz2tKyl+yg6g==", - "dev": true - } - } + "version": "0.3.0-beta.5", + "resolved": "https://registry.npmjs.org/@remixproject/plugin/-/plugin-0.3.0-beta.5.tgz", + "integrity": "sha512-mQgXUhGNc+tQGIIFw7OaBaH7sZTBvDk8Gf4fS1NXhO5ilvykw9TXv5LXWoWkJCWQlKGuUTWd+U1XNpm5dPD3ag==" + }, + "@remixproject/plugin-api": { + "version": "0.3.0-beta.5", + "resolved": "https://registry.npmjs.org/@remixproject/plugin-api/-/plugin-api-0.3.0-beta.5.tgz", + "integrity": "sha512-C1fuISsne3sfA61k1rx6qU9ZgubyP8SdNKinzeYvXg4XAm1DwoHQlzjq/WYmjOFx1NZhyMGK8ySBp0VcjAMc/Q==" + }, + "@remixproject/plugin-utils": { + "version": "0.3.0-beta.5", + "resolved": "https://registry.npmjs.org/@remixproject/plugin-utils/-/plugin-utils-0.3.0-beta.5.tgz", + "integrity": "sha512-+gnfuSUimCxUTRxfTGu+mwI5U6EPUx2A2ANObaZzX8f17nhSW5NWw2vWKauZPSv2PWQoIukYzrmG/kogEe3Cyw==" }, "@remixproject/plugin-ws": { - "version": "0.3.0-alpha.4", - "resolved": "https://registry.npmjs.org/@remixproject/plugin-ws/-/plugin-ws-0.3.0-alpha.4.tgz", - "integrity": "sha512-fLXGWqnP+KoGakysWYrGjG7uWGwhQmxpDDs1akm/LABUbQl+nBltbC9qGamB5L2+uWTC8auKVfAo6q/5Urayqg==", - "dev": true, + "version": "0.3.0-beta.11", + "resolved": "https://registry.npmjs.org/@remixproject/plugin-ws/-/plugin-ws-0.3.0-beta.11.tgz", + "integrity": "sha512-wQueX0k99S96G4/jDbCmAn7V4RxDQpaCjaHBkpdr6Oc1ErfUnkplzJLfGs1EgnxCrONnHxDz6YEdKEs/zaHkqw==", "requires": { - "@remixproject/plugin": "0.3.0-alpha.7" + "@remixproject/plugin": "0.3.0-beta.11", + "@remixproject/plugin-api": "0.3.0-beta.11", + "@remixproject/plugin-utils": "0.3.0-beta.11" }, "dependencies": { "@remixproject/plugin": { - "version": "0.3.0-alpha.7", - "resolved": "https://registry.npmjs.org/@remixproject/plugin/-/plugin-0.3.0-alpha.7.tgz", - "integrity": "sha512-bRVnD/mw0mU64zZKZS7Yc51fsvkAsnIBL3k34esFasOxoMqaYtc+UkxK8ycIOx0Z20lBNWGPHunYgvWy6LFWKQ==", - "dev": true, + "version": "0.3.0-beta.11", + "resolved": "https://registry.npmjs.org/@remixproject/plugin/-/plugin-0.3.0-beta.11.tgz", + "integrity": "sha512-/K7EJUXjSf5AqoPJAQ7VKQi7UTmPysHyV9hDLGPoe8tjl4s5ghjopiYLu6uM1WrR4Bz1DvU4hsRObe/PUAmprA==", "requires": { - "@types/node": "^13.13.4", - "events": "^3.0.0" + "@remixproject/plugin-api": "0.3.0-beta.11", + "@remixproject/plugin-utils": "0.3.0-beta.11", + "events": "3.2.0" } }, - "@types/node": { - "version": "13.13.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.14.tgz", - "integrity": "sha512-Az3QsOt1U/K1pbCQ0TXGELTuTkPLOiFIQf3ILzbOyo0FqgV9SxRnxbxM5QlAveERZMHpZY+7u3Jz2tKyl+yg6g==", - "dev": true + "@remixproject/plugin-api": { + "version": "0.3.0-beta.11", + "resolved": "https://registry.npmjs.org/@remixproject/plugin-api/-/plugin-api-0.3.0-beta.11.tgz", + "integrity": "sha512-qmIxfoFivQ6Dtz4RUEGSpSVW6TgcT5pwGuSOFBNm0LcYapqsoY4uWIfNpnP4odH4nVCBaFmARlveOf5magFxAw==", + "requires": { + "@remixproject/plugin-utils": "0.3.0-beta.11" + } + }, + "@remixproject/plugin-utils": { + "version": "0.3.0-beta.11", + "resolved": "https://registry.npmjs.org/@remixproject/plugin-utils/-/plugin-utils-0.3.0-beta.11.tgz", + "integrity": "sha512-M/ghKF75lLQX6sp993E+3DGtezgY5oCL8659pH2cRpK8MMFX5cJggBfK5Fil29FIdwNOSzXM+W0/JnxnRyQAZA==", + "requires": { + "tslib": "2.0.1" + } + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==" + }, + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==" } } }, @@ -7005,6 +7215,15 @@ "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, + "@types/axios": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@types/axios/-/axios-0.14.0.tgz", + "integrity": "sha1-7CMA++fX3d1+udOr+HmZlkyvzkY=", + "dev": true, + "requires": { + "axios": "*" + } + }, "@types/babel__core": { "version": "7.1.9", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz", @@ -7090,9 +7309,9 @@ "dev": true }, "@types/fs-extra": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.1.tgz", - "integrity": "sha512-TcUlBem321DFQzBNuz8p0CLLKp0VvF/XH9E4KHNmgwyp4E3AfgI5cjiIVZWlbfThBop2qxFIh4+LeY6hVWWZ2w==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.1.tgz", + "integrity": "sha512-B42Sxuaz09MhC3DDeW5kubRcQ5by4iuVQ0cRRWM2lggLzAa/KVom0Aft/208NgMvNQQZ86s5rVcqDdn/SH0/mg==", "dev": true, "requires": { "@types/node": "*" @@ -7361,6 +7580,15 @@ } } }, + "@types/ws": { + "version": "7.2.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.7.tgz", + "integrity": "sha512-UUFC/xxqFLP17hTva8/lVT0SybLUrfSD9c+iapKb0fEiC8uoDbA+xuZ3pAN603eW+bY8ebSMLm9jXdIPnD0ZgA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/yargs": { "version": "15.0.5", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", @@ -8570,8 +8798,7 @@ "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" }, "async-eventemitter": { "version": "0.2.4", @@ -8653,38 +8880,11 @@ "dev": true }, "axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", - "dev": true, + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.20.0.tgz", + "integrity": "sha512-ANA4rr2BDcmmAQLOKft2fufrtuvlqR+cXNNinUmvfeSNCOF98PZL+7M/v1zIdGo7OLjEA9J2gXJL+j4zGsl0bA==", "requires": { - "follow-redirects": "1.5.10" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "dev": true, - "requires": { - "debug": "=3.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } + "follow-redirects": "^1.10.0" } }, "axobject-query": { @@ -11272,7 +11472,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, "requires": { "buffer-alloc-unsafe": "^1.1.0", "buffer-fill": "^1.0.0" @@ -11281,8 +11480,7 @@ "buffer-alloc-unsafe": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" }, "buffer-crc32": { "version": "0.2.13", @@ -11299,8 +11497,7 @@ "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" }, "buffer-from": { "version": "1.1.1", @@ -11641,19 +11838,146 @@ } }, "chokidar": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.1.tgz", - "integrity": "sha512-TQTJyr2stihpC4Sya9hs2Xh+O2wf+igjL36Y75xx2WdHuiICcn/XJza46Jwt0eT5hVpQOzo3FpY3cj3RVYLX0g==", - "dev": true, + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } } }, "chownr": { @@ -12143,8 +12467,7 @@ "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "common-tags": { "version": "1.8.0", @@ -12325,6 +12648,31 @@ "proto-list": "~1.2.1" } }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } + } + } + }, "confusing-browser-globals": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.9.tgz", @@ -12958,6 +13306,12 @@ "randomfill": "^1.0.3" } }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "dev": true + }, "csjs": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/csjs/-/csjs-1.1.0.tgz", @@ -13450,6 +13804,17 @@ "ms": "^2.1.1" } }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -14873,6 +15238,12 @@ "integrity": "sha512-gPYAU37hYCUhW5euPeR+Y74F7BL+IBsV93j5cvGriSaD1aG6MGsqsV1yamRdrWrb2j3aiZvb0X+UBOWpx3JWtQ==", "dev": true }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "dev": true + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -15213,9 +15584,9 @@ } }, "eslint-config-standard": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", - "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.1.tgz", + "integrity": "sha512-Z9B+VR+JIXRxz21udPTL9HpFMyoMUEeX1G251EQ6e05WD9aPVtVBn09XUmZ259wCMlCDmYDSZG62Hhm+ZTJcUg==", "dev": true }, "eslint-config-standard-jsx": { @@ -15288,51 +15659,33 @@ } }, "eslint-plugin-es": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", - "integrity": "sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", "dev": true, "requires": { - "eslint-utils": "^1.4.2", - "regexpp": "^2.0.1" - }, - "dependencies": { - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true - } + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" } }, "eslint-plugin-import": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.0.tgz", - "integrity": "sha512-66Fpf1Ln6aIS5Gr/55ts19eUuoDhAbZgnr6UxK5hbDx6l/QgQgx61AePq+BV4PP2uXQFClgMVzep5zZ94qqsxg==", + "version": "2.20.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.2.tgz", + "integrity": "sha512-FObidqpXrR8OnCh4iNsxy+WACztJLXAHBO5hK79T1Hc77PgQZkyDGA5Ag9xAvRpglvLNxhH/zSmZ70/pZ31dHg==", "dev": true, "requires": { - "array-includes": "^3.1.1", - "array.prototype.flat": "^1.2.3", + "array-includes": "^3.0.3", + "array.prototype.flat": "^1.2.1", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.3", - "eslint-module-utils": "^2.6.0", + "eslint-import-resolver-node": "^0.3.2", + "eslint-module-utils": "^2.4.1", "has": "^1.0.3", "minimatch": "^3.0.4", - "object.values": "^1.1.1", + "object.values": "^1.1.0", "read-pkg-up": "^2.0.0", - "resolve": "^1.17.0", - "tsconfig-paths": "^3.9.0" + "resolve": "^1.12.0" }, "dependencies": { "debug": { @@ -15380,46 +15733,31 @@ } }, "eslint-plugin-node": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", - "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", "dev": true, "requires": { - "eslint-plugin-es": "^1.3.1", - "eslint-utils": "^1.3.1", - "ignore": "^4.0.2", + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", "minimatch": "^3.0.4", - "resolve": "^1.8.1", - "semver": "^5.5.0" + "resolve": "^1.10.1", + "semver": "^6.1.0" }, "dependencies": { - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", "dev": true } } }, "eslint-plugin-promise": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", - "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", + "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", "dev": true }, "eslint-plugin-react": { @@ -16973,6 +17311,31 @@ "worker-rpc": "^0.1.0" }, "dependencies": { + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", @@ -17067,14 +17430,23 @@ "dev": true }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=", "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", "universalify": "^0.1.0" + }, + "dependencies": { + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", + "requires": { + "graceful-fs": "^4.1.6" + } + } } }, "fs-minipass": { @@ -19097,6 +19469,42 @@ "sparkles": "^1.0.0" } }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dev": true, + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "dev": true + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dev": true, + "requires": { + "prepend-http": "^2.0.0" + } + } + } + }, "graceful-fs": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", @@ -19551,6 +19959,12 @@ } } }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "dev": true + }, "hash-base": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", @@ -19943,6 +20357,12 @@ "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, + "ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=", + "dev": true + }, "ignore-walk": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", @@ -20000,6 +20420,12 @@ "resolve-from": "^3.0.0" } }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "dev": true + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -20654,8 +21080,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { "version": "1.1.0", @@ -20685,7 +21110,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -20766,6 +21190,12 @@ "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", "dev": true }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -20981,6 +21411,12 @@ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "dev": true }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", + "dev": true + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -20990,7 +21426,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, "requires": { "buffer-alloc": "^1.2.0" } @@ -21160,6 +21595,19 @@ "requires": { "fs-extra": "^8.1.0", "minimatch": "^3.0.4" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "it-last": { @@ -23457,6 +23905,15 @@ "es6-weak-map": "^2.0.1" } }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dev": true, + "requires": { + "package-json": "^6.3.0" + } + }, "lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -27086,6 +27543,57 @@ "integrity": "sha512-H3JrdUczbdiwxN5FuJPyCHnGHIFqQ0wWxo+9j1kAXAzqNMAHlo+4I/sYYxpyK0irQ73HgdiyzD32oqQDcU2Osw==", "dev": true }, + "nodemon": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.4.tgz", + "integrity": "sha512-Ltced+hIfTmaS28Zjv1BM552oQ3dbwPqI4+zI0SLgq+wpJhSyqgYude/aZa/3i31VCQWMfXJVxvu86abcam3uQ==", + "dev": true, + "requires": { + "chokidar": "^3.2.2", + "debug": "^3.2.6", + "ignore-by-default": "^1.0.1", + "minimatch": "^3.0.4", + "pstree.remy": "^1.1.7", + "semver": "^5.7.1", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.2", + "update-notifier": "^4.0.0" + }, + "dependencies": { + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "nodent": { "version": "3.2.11", "resolved": "https://registry.npmjs.org/nodent/-/nodent-3.2.11.tgz", @@ -32912,6 +33420,18 @@ "thunkify": "^2.1.2" } }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dev": true, + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + } + }, "pacote": { "version": "11.1.11", "resolved": "https://registry.npmjs.org/pacote/-/pacote-11.1.11.tgz", @@ -33330,8 +33850,7 @@ "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" }, "path-exists": { "version": "3.0.0", @@ -34577,6 +35096,12 @@ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, + "pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true + }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -34629,6 +35154,15 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "pupa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "dev": true, + "requires": { + "escape-goat": "^2.0.0" + } + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -34974,12 +35508,47 @@ } }, "readdirp": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", - "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", - "dev": true, + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "requires": { - "picomatch": "^2.2.1" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "realpath-native": { @@ -35092,6 +35661,24 @@ "unicode-match-property-value-ecmascript": "^1.2.0" } }, + "registry-auth-token": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz", + "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dev": true, + "requires": { + "rc": "^1.2.8" + } + }, "regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", @@ -35771,6 +36358,15 @@ "is-plain-object": "^3.0.0" }, "dependencies": { + "@types/fs-extra": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.1.tgz", + "integrity": "sha512-TcUlBem321DFQzBNuz8p0CLLKp0VvF/XH9E4KHNmgwyp4E3AfgI5cjiIVZWlbfThBop2qxFIh4+LeY6hVWWZ2w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -35786,6 +36382,17 @@ "path-type": "^4.0.0" } }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "globby": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", @@ -36002,6 +36609,17 @@ "path-exists": "^4.0.0" } }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -36425,6 +37043,15 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dev": true, + "requires": { + "semver": "^6.3.0" + } + }, "semver-greatest-satisfied-range": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", @@ -37389,6 +38016,22 @@ "text-table": "^0.2.0" } }, + "eslint-config-standard": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-12.0.0.tgz", + "integrity": "sha512-COUz8FnXhqFitYj4DTqHzidjIL/t4mumGZto5c7DrBpvWoie+Sn3P4sLEzUGeYhRElWuFEf8K1S1EfvD1vixCQ==", + "dev": true + }, + "eslint-plugin-es": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", + "integrity": "sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==", + "dev": true, + "requires": { + "eslint-utils": "^1.4.2", + "regexpp": "^2.0.1" + } + }, "eslint-plugin-import": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.14.0.tgz", @@ -37428,6 +38071,26 @@ } } }, + "eslint-plugin-node": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-7.0.1.tgz", + "integrity": "sha512-lfVw3TEqThwq0j2Ba/Ckn2ABdwmL5dkOgAux1rvOk6CO7A6yGyPI2+zIxN6FyNkp1X1X/BSvKOceD6mBWSj4Yw==", + "dev": true, + "requires": { + "eslint-plugin-es": "^1.3.1", + "eslint-utils": "^1.3.1", + "ignore": "^4.0.2", + "minimatch": "^3.0.4", + "resolve": "^1.8.1", + "semver": "^5.5.0" + } + }, + "eslint-plugin-promise": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.0.1.tgz", + "integrity": "sha512-Si16O0+Hqz1gDHsys6RtFRrW7cCTB6P7p3OJmKp3Y3dxpQE2qwOA7d3xnV+0mBmrPoi0RBnxlCKvqu70te6wjg==", + "dev": true + }, "eslint-plugin-react": { "version": "7.11.1", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.11.1.tgz", @@ -39086,6 +39749,26 @@ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", "dev": true }, + "touch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", + "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", + "dev": true, + "requires": { + "nopt": "~1.0.10" + }, + "dependencies": { + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", + "dev": true, + "requires": { + "abbrev": "1" + } + } + } + }, "tough-cookie": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", @@ -39557,6 +40240,32 @@ } } }, + "undefsafe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", + "integrity": "sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==", + "dev": true, + "requires": { + "debug": "^2.2.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, "underscore": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", @@ -39673,6 +40382,15 @@ "through2-filter": "^3.0.0" } }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dev": true, + "requires": { + "crypto-random-string": "^2.0.0" + } + }, "universal-user-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", @@ -39685,8 +40403,7 @@ "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "unpipe": { "version": "1.0.0", @@ -39750,8 +40467,80 @@ "upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "update-notifier": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "dev": true, + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } }, "upper-case": { "version": "2.0.1", @@ -40429,6 +41218,35 @@ "graceful-fs": "^4.1.2", "neo-async": "^2.5.0", "watchpack-chokidar2": "^2.0.0" + }, + "dependencies": { + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + } + } } }, "watchpack-chokidar2": { @@ -41633,6 +42451,15 @@ "is-number": "^3.0.0", "repeat-string": "^1.6.1" } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } } } }, @@ -42117,13 +42944,15 @@ } }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true }, "xhr": { "version": "2.5.0", diff --git a/package.json b/package.json index 8345788e377..7b2b5a1eba5 100644 --- a/package.json +++ b/package.json @@ -43,9 +43,9 @@ "workspace-schematic": "nx workspace-schematic", "dep-graph": "nx dep-graph", "help": "nx help", - "lint:libs": "nx run-many --target=lint --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver", - "build:libs": "nx run-many --target=build --parallel=false --with-deps=true --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver", - "test:libs": "nx run-many --target=test --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver", + "lint:libs": "nx run-many --target=lint --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remixd", + "build:libs": "nx run-many --target=build --parallel=false --with-deps=true --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remixd", + "test:libs": "nx run-many --target=test --projects=remix-analyzer,remix-astwalker,remix-debug,remix-lib,remix-simulator,remix-solidity,remix-tests,remix-url-resolver,remixd", "publish:libs": "npm run build:libs; lerna publish --skip-git; npm run bumpVersion:libs", "bumpVersion:libs": "gulp; gulp syncLibVersions;", "browsertest": "sleep 5 && npm run nightwatch_local", @@ -83,7 +83,7 @@ "nightwatch_local_fileManager": "nx build remix-ide-e2e; nx e2e remix-ide-e2e --filePath=dist/apps/remix-ide-e2e/src/tests/fileManager_api.test.js --env=chrome", "nightwatch_local_runAndDeploy": "nx build remix-ide-e2e; nx e2e remix-ide-e2e --filePath=dist/apps/remix-ide-e2e/src/tests/runAndDeploy.js --env=chrome-runAndDeploy", "onchange": "onchange apps/remix-ide/build/app.js -- npm-run-all lint", - "remixd": "remixd -s ./apps/remix-ide/contracts --remix-ide http://127.0.0.1:8080", + "remixd": "nx build remixd; nx serve remixd --folder=./apps/remix-ide/contracts --remixide=http://127.0.0.1:8080", "selenium": "selenium-standalone start", "selenium-install": "selenium-standalone install", "sourcemap": "exorcist --root ../ apps/remix-ide/build/app.js.map > apps/remix-ide/build/app.js", @@ -141,7 +141,17 @@ "npm-install-version": "^6.0.2", "signale": "^1.4.0", "time-stamp": "^2.2.0", - "winston": "^3.3.3" + "winston": "^3.3.3", + "@remixproject/plugin": "0.3.0-beta.5", + "@remixproject/plugin-api": "0.3.0-beta.5", + "@remixproject/plugin-utils": "0.3.0-beta.5", + "@remixproject/plugin-ws": "^0.3.0-beta.8", + "axios": "^0.20.0", + "chokidar": "^2.1.8", + "commander": "^2.20.3", + "fs-extra": "^3.0.1", + "isbinaryfile": "^3.0.2", + "ws": "^7.3.0" }, "devDependencies": { "@babel/core": "^7.4.5", @@ -232,7 +242,6 @@ "onchange": "^3.2.1", "prettier": "1.19.1", "remix-tabs": "1.0.48", - "remixd": "0.2.3-alpha.4", "request": "^2.83.0", "rimraf": "^2.6.1", "selenium-standalone": "^6.17.0", @@ -252,6 +261,16 @@ "webworkify-webpack": "^2.1.5", "worker-loader": "^2.0.0", "yo-yo": "github:ioedeveloper/yo-yo", - "yo-yoify": "^3.7.3" + "yo-yoify": "^3.7.3", + "@types/axios": "^0.14.0", + "@types/fs-extra": "^9.0.1", + "@types/ws": "^7.2.4", + "eslint-config-standard": "14.1.1", + "eslint-plugin-import": "2.20.2", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-promise": "4.2.1", + "eslint-plugin-standard": "4.0.1", + "nodemon": "^2.0.4", + "@types/jest": "25.1.4" } } diff --git a/tsconfig.json b/tsconfig.json index 826dd82351b..105a070a539 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,7 +23,8 @@ "@remix-project/remix-simulator": ["dist/libs/remix-simulator/index.js"], "@remix-project/remix-solidity": ["dist/libs/remix-solidity/index.js"], "@remix-project/remix-tests": ["dist/libs/remix-tests/src/index.js"], - "@remix-project/remix-url-resolver": ["dist/libs/remix-url-resolver/index.js"] + "@remix-project/remix-url-resolver": ["dist/libs/remix-url-resolver/index.js"], + "@remix-project/remixd": ["dist/libs/remixd/index.js"] } }, "exclude": ["node_modules", "tmp"] diff --git a/workspace.json b/workspace.json index 96178b0a566..505cf5e9878 100644 --- a/workspace.json +++ b/workspace.json @@ -55,7 +55,8 @@ "options": { "buildTarget": "remix-ide:build", "port": 8080, - "exclude": ["**/node_modules/**", + "exclude": [ + "**/node_modules/**", "apps/remix-ide/build/**/*.js", "apps/remix-ide/src/app/editor/mode-solidity.js", "apps/remix-ide/soljson.js", @@ -74,9 +75,7 @@ "options": { "linter": "eslint", "config": "apps/remix-ide/.eslintrc", - "files": [ - "apps/remix-ide/src/**/*.js" - ], + "files": ["apps/remix-ide/src/**/*.js"], "exclude": [ "**/node_modules/**", "apps/remix-ide/src/app/editor/mode-solidity.js", @@ -104,18 +103,18 @@ "build": { "builder": "@nrwl/workspace:run-commands", "options": { - "commands": [ - "node_modules/.bin/tsc -p apps/remix-ide-e2e/tsconfig.e2e.json" - ] + "commands": [ + "node_modules/.bin/tsc -p apps/remix-ide-e2e/tsconfig.e2e.json" + ] } }, "e2e": { "builder": "@nrwl/workspace:run-commands", "options": { - "commands": [ - "TEST_SCRIPT='node_modules/.bin/nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js'; if [ {args.env} != undefined ]; then TEST_SCRIPT=${TEST_SCRIPT}' --env {args.env}'; else TEST_SCRIPT=${TEST_SCRIPT}' --env chrome'; fi; if [ {args.filePath} != undefined ]; then TEST_SCRIPT=${TEST_SCRIPT}' {args.filePath}'; fi; eval $TEST_SCRIPT;" - ], - "parallel": false + "commands": [ + "TEST_SCRIPT='node_modules/.bin/nightwatch --config dist/apps/remix-ide-e2e/nightwatch.js'; if [ {args.env} != undefined ]; then TEST_SCRIPT=${TEST_SCRIPT}' --env {args.env}'; else TEST_SCRIPT=${TEST_SCRIPT}' --env chrome'; fi; if [ {args.filePath} != undefined ]; then TEST_SCRIPT=${TEST_SCRIPT}' {args.filePath}'; fi; eval $TEST_SCRIPT;" + ], + "parallel": false } }, "lint": { @@ -215,9 +214,7 @@ "options": { "linter": "eslint", "config": "libs/remix-debug/.eslintrc", - "files": [ - "libs/remix-debug/**/*.js" - ], + "files": ["libs/remix-debug/**/*.js"], "exclude": ["**/node_modules/**", "libs/remix-debug/test/**/*"] } }, @@ -240,8 +237,16 @@ "packageJson": "libs/remix-debug/package.json", "main": "libs/remix-debug/index.js", "assets": [ - { "glob": "rdb", "input": "libs/remix-debug/bin/", "output": "bin/" }, - { "glob": "*.md", "input": "libs/remix-debug/", "output": "/" } + { + "glob": "rdb", + "input": "libs/remix-debug/bin/", + "output": "bin/" + }, + { + "glob": "*.md", + "input": "libs/remix-debug/", + "output": "/" + } ] } } @@ -296,9 +301,7 @@ "options": { "linter": "eslint", "config": "libs/remix-simulator/.eslintrc", - "files": [ - "libs/remix-simulator/**/*.js" - ], + "files": ["libs/remix-simulator/**/*.js"], "exclude": ["**/node_modules/**", "libs/remix-simulator/test/**/*"] } }, @@ -321,8 +324,16 @@ "packageJson": "libs/remix-simulator/package.json", "main": "libs/remix-simulator/index.js", "assets": [ - { "glob": "ethsim", "input": "libs/remix-simulator/bin/", "output": "bin/" }, - { "glob": "*.md", "input": "libs/remix-simulator/", "output": "/" } + { + "glob": "ethsim", + "input": "libs/remix-simulator/bin/", + "output": "bin/" + }, + { + "glob": "*.md", + "input": "libs/remix-simulator/", + "output": "/" + } ] } } @@ -339,9 +350,7 @@ "options": { "linter": "eslint", "config": "libs/remix-solidity/.eslintrc", - "tsConfig": [ - "libs/remix-solidity/tsconfig.lib.json" - ], + "tsConfig": ["libs/remix-solidity/tsconfig.lib.json"], "exclude": ["**/node_modules/**"] } }, @@ -379,9 +388,7 @@ "options": { "linter": "eslint", "config": "libs/remix-tests/.eslintrc", - "tsConfig": [ - "libs/remix-tests/tsconfig.lib.json" - ], + "tsConfig": ["libs/remix-tests/tsconfig.lib.json"], "exclude": ["**/node_modules/**", "libs/remix-tests/tests/**/*"] } }, @@ -400,8 +407,16 @@ "packageJson": "libs/remix-tests/package.json", "main": "libs/remix-tests/src/index.ts", "assets": [ - { "glob": "remix-tests", "input": "libs/remix-tests/bin/", "output": "bin/" }, - { "glob": "*.md", "input": "libs/remix-tests/", "output": "/" } + { + "glob": "remix-tests", + "input": "libs/remix-tests/bin/", + "output": "bin/" + }, + { + "glob": "*.md", + "input": "libs/remix-tests/", + "output": "/" + } ] } } @@ -418,10 +433,11 @@ "options": { "linter": "eslint", "config": "libs/remix-url-resolver/.eslintrc", - "tsConfig": [ - "libs/remix-url-resolver/tsconfig.lib.json" - ], - "exclude": ["**/node_modules/**", "libs/remix-url-resolver/tests/**/*"] + "tsConfig": ["libs/remix-url-resolver/tsconfig.lib.json"], + "exclude": [ + "**/node_modules/**", + "libs/remix-url-resolver/tests/**/*" + ] } }, "test": { @@ -446,6 +462,53 @@ } } } + }, + "remixd": { + "root": "libs/remixd", + "sourceRoot": "libs/remixd/src", + "projectType": "library", + "schematics": {}, + "architect": { + "lint": { + "builder": "@nrwl/linter:lint", + "options": { + "linter": "eslint", + "tsConfig": [ + "libs/remixd/tsconfig.lib.json", + "libs/remixd/tsconfig.spec.json" + ], + "exclude": ["**/node_modules/**", "!libs/remixd/**/*"] + } + }, + "test": { + "builder": "@nrwl/jest:jest", + "options": { + "jestConfig": "libs/remixd/jest.config.js", + "tsConfig": "libs/remixd/tsconfig.spec.json", + "passWithNoTests": true + } + }, + "build": { + "builder": "@nrwl/node:package", + "options": { + "outputPath": "dist/libs/remixd", + "tsConfig": "libs/remixd/tsconfig.lib.json", + "packageJson": "libs/remixd/package.json", + "main": "libs/remixd/src/index.ts", + "assets": ["libs/remixd/*.md", "libs/remixd/src/origins.json"] + } + }, + "serve": { + "builder": "@nrwl/workspace:run-commands", + "options": { + "commands": [ + { + "command": "SERVE_SCRIPT='chmod +x dist/libs/remixd/bin/remixd.js; dist/libs/remixd/bin/remixd.js '; if [ {args.folder} != undefined ]; then SERVE_SCRIPT=${SERVE_SCRIPT}' -s {args.folder}'; fi; if [ {args.remixide} != undefined ]; then SERVE_SCRIPT=${SERVE_SCRIPT}' --remix-ide {args.remixide}'; fi; eval $SERVE_SCRIPT;" + } + ] + } + } + } } }, "cli": {