├── ide-host-service ├── .gitignore ├── package.json ├── extensions │ └── extension.js ├── rpcProtocol.js ├── extensionsApi.js ├── main.js └── yarn.lock ├── ide-online ├── .gitignore ├── tsconfig.json ├── tslint.json ├── index.html ├── src │ ├── extensionsActions.ts │ ├── workbench.css │ ├── extensionHostAgent.ts │ └── app.ts ├── .babelrc ├── package.json └── webpack.config.js ├── .gitignore └── README.md /ide-host-service/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /ide-online/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | build/ 3 | dist/ 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | **/node_modules 2 | **/build 3 | **/dist 4 | **/.vscode 5 | -------------------------------------------------------------------------------- /ide-online/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "sourceMap": true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## webide-extensions-example 2 | 3 | ```shell 4 | cd ide-host-service 5 | yarn install 6 | node main.js 7 | 8 | 9 | cd ide-online 10 | yarn install 11 | yarn dev 12 | ``` 13 | -------------------------------------------------------------------------------- /ide-online/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": [ 4 | "tslint:recommended" 5 | ], 6 | "jsRules": {}, 7 | "rules": {}, 8 | "rulesDirectory": [] 9 | } -------------------------------------------------------------------------------- /ide-host-service/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ide-host-service", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "author": "sakuraash <841105127@qq.com>", 6 | "license": "MIT", 7 | "dependencies": { 8 | "socket.io": "^2.2.0" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /ide-host-service/extensions/extension.js: -------------------------------------------------------------------------------- 1 | const ide = require('ide'); 2 | 3 | function activate() { 4 | console.log('activate extension!'); 5 | setTimeout(() => { 6 | ide.setStatusBarMessage('Hello World!'); 7 | ide.showAlert('抓不到我吧!'); 8 | }, 5000); 9 | } 10 | 11 | module.exports = activate; 12 | -------------------------------------------------------------------------------- /ide-online/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | IDE-Online 8 | 9 | 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /ide-online/src/extensionsActions.ts: -------------------------------------------------------------------------------- 1 | const extensionsActions = { 2 | setStatusBarMessage: (message: string) => { 3 | const statusBar = document.querySelector(".status-bar"); 4 | statusBar.innerHTML = message; 5 | }, 6 | showAlert: (message: string) => { 7 | window.alert(message.toString()); 8 | }, 9 | }; 10 | 11 | export default extensionsActions; 12 | -------------------------------------------------------------------------------- /ide-host-service/rpcProtocol.js: -------------------------------------------------------------------------------- 1 | let _rpcProtocol = null; 2 | class RPCProtocol { 3 | static getInstance() { 4 | if (!_rpcProtocol) { 5 | _rpcProtocol = new RPCProtocol(); 6 | } 7 | return _rpcProtocol; 8 | } 9 | 10 | setSocket(socket) { 11 | this.socket = socket; 12 | } 13 | 14 | emit(method, args) { 15 | this.socket.emit(method, args); 16 | } 17 | } 18 | 19 | module.exports = RPCProtocol.getInstance(); 20 | -------------------------------------------------------------------------------- /ide-host-service/extensionsApi.js: -------------------------------------------------------------------------------- 1 | const rpcProtocol = require('./rpcProtocol'); 2 | 3 | function rpcCall(name, args) { 4 | if (rpcProtocol) { 5 | rpcProtocol.emit('[RPC-MESSAGE]', { method: name, args }); 6 | } 7 | } 8 | 9 | function apiFactory() { 10 | const handler = { 11 | get: (target, name) => { 12 | target[name] = (...args) => { 13 | rpcCall(name, args); 14 | } 15 | return target[name]; 16 | } 17 | } 18 | const proxy = new Proxy(Object.create(null), handler) 19 | return proxy; 20 | } 21 | 22 | module.exports = apiFactory(); 23 | -------------------------------------------------------------------------------- /ide-host-service/main.js: -------------------------------------------------------------------------------- 1 | const Module = require('module'); 2 | const original = Module.prototype.require; 3 | 4 | Module.prototype.require = function(request) { 5 | if (request !== 'ide') { 6 | return original.apply(this, arguments); 7 | } 8 | return require('./extensionsApi'); 9 | } 10 | 11 | const server = require('http').createServer(); 12 | const io = require('socket.io')(server); 13 | const rpcProtocol = require('./rpcProtocol'); 14 | 15 | io.on('connection', client => { 16 | const extension = require('./extensions/extension'); 17 | rpcProtocol.setSocket(client); 18 | extension(); 19 | }); 20 | 21 | server.listen(7788, () => { 22 | console.log('Extension host service is running on port: 7788!'); 23 | }); 24 | -------------------------------------------------------------------------------- /ide-online/src/workbench.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | margin: 0px; 3 | padding: 0px; 4 | } 5 | 6 | * { 7 | margin: 0px; 8 | padding: 0px; 9 | } 10 | 11 | #app { 12 | position: absolute; 13 | width: 100%; 14 | height: 100%; 15 | display: flex; 16 | flex-direction: column; 17 | } 18 | 19 | .ide-online-workbench { 20 | width: 100%; 21 | height: 100%; 22 | background-color: #24272e; 23 | overflow: hidden; 24 | display: flex; 25 | flex: 1; 26 | } 27 | 28 | .file-tree { 29 | min-width: 350px; 30 | height: 100%; 31 | background-color: #1e2126; 32 | } 33 | 34 | .editor-area { 35 | flex: 1; 36 | } 37 | 38 | .status-bar { 39 | height: 20px; 40 | font-size: 12px; 41 | display: flex; 42 | align-items: center; 43 | background-color: blueviolet; 44 | } 45 | -------------------------------------------------------------------------------- /ide-online/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["@babel/preset-env", {"modules": false, "useBuiltIns": "entry"}], 4 | ["@babel/preset-stage-0", { "decoratorsLegacy": true }] 5 | ], 6 | "plugins": [ 7 | "@babel/plugin-syntax-export-default-from", 8 | "@babel/plugin-syntax-dynamic-import", 9 | ["@babel/plugin-proposal-decorators", { "legacy": true }], 10 | ["@babel/plugin-proposal-class-properties", { "loose": true }] 11 | ], 12 | "env": { 13 | "production": { 14 | "plugins": [ 15 | ] 16 | }, 17 | "development": { 18 | "plugins": [ 19 | ] 20 | }, 21 | "test": { 22 | "presets": ["@babel/preset-es2015", "@babel/preset-stage-0"], 23 | "plugins": [ 24 | ["@babel/plugin-proposal-decorators", { "legacy": true }] 25 | ] 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /ide-online/src/extensionHostAgent.ts: -------------------------------------------------------------------------------- 1 | import * as io from "socket.io-client"; 2 | 3 | import extensionActions from "./extensionsActions"; 4 | 5 | interface IRPCMessage { 6 | method: string; 7 | args: any; 8 | } 9 | 10 | function connectExtensionHostService() { 11 | console.log("this is extension host agent!"); 12 | // will connect to extension host 13 | const socketOptions = { 14 | reconnection: true, 15 | reconnectionAttempts: 1, 16 | reconnectionDelay: 2000, 17 | transports: ["websocket"], 18 | query: { 19 | port: 9988, 20 | }, 21 | }; 22 | 23 | const client = io.connect( 24 | "localhost:7788", 25 | socketOptions, 26 | ); 27 | 28 | client.on("[RPC-MESSAGE]", rpcMessasgeHandler); 29 | } 30 | 31 | function rpcMessasgeHandler(message: IRPCMessage) { 32 | const { method, args } = message; 33 | extensionActions[method].call({}, args); 34 | } 35 | 36 | export { connectExtensionHostService }; 37 | -------------------------------------------------------------------------------- /ide-online/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ide-online", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "devDependencies": { 7 | "@babel/core": "^7.2.2", 8 | "@babel/plugin-proposal-class-properties": "^7.2.3", 9 | "@babel/plugin-proposal-decorators": "^7.2.3", 10 | "@babel/plugin-syntax-dynamic-import": "^7.2.0", 11 | "@babel/plugin-syntax-export-default-from": "^7.2.0", 12 | "@babel/plugin-transform-runtime": "^7.2.0", 13 | "@babel/preset-env": "^7.2.3", 14 | "@babel/preset-es2015": "^7.0.0-beta.53", 15 | "@babel/preset-stage-0": "^7.0.0", 16 | "css-loader": "^2.1.0", 17 | "html-webpack-plugin": "^3.2.0", 18 | "monaco-editor-webpack-plugin": "^1.7.0", 19 | "style-loader": "^0.23.1", 20 | "ts-loader": "^5.3.3", 21 | "webpack": "^4.28.3", 22 | "webpack-cli": "^3.2.0", 23 | "webpack-dev-server": "^3.1.14", 24 | "webpackbar": "^3.1.4" 25 | }, 26 | "scripts": { 27 | "dev": "node_modules/.bin/webpack-dev-server --mode development --progress --colors --public" 28 | }, 29 | "dependencies": { 30 | "@types/socket.io-client": "^1.4.32", 31 | "monaco-editor": "^0.15.6", 32 | "monaco-editor-core": "^0.15.5", 33 | "socket.io-client": "^2.2.0" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /ide-online/src/app.ts: -------------------------------------------------------------------------------- 1 | import * as monaco from "monaco-editor"; 2 | 3 | import { connectExtensionHostService } from "./extensionHostAgent"; 4 | import "./workbench.css"; 5 | 6 | const app = document.querySelector("#app"); 7 | 8 | const workbench = document.createElement("div"); 9 | workbench.className = "ide-online-workbench"; 10 | app.appendChild(workbench); 11 | 12 | const statusBar = document.createElement("div"); 13 | statusBar.className = "status-bar"; 14 | app.appendChild(statusBar); 15 | 16 | const fileTree = document.createElement("div"); 17 | fileTree.className = "file-tree"; 18 | workbench.appendChild(fileTree); 19 | 20 | const editorArea = document.createElement("div"); 21 | editorArea.className = "editor-area"; 22 | workbench.appendChild(editorArea); 23 | 24 | const value = ` 25 | import * as monaco from 'monaco-editor'; 26 | 27 | import "./workbench.css"; 28 | import { connectExtensionHostService } from "./extensionHostAgent"; 29 | 30 | const app = document.querySelector('#app'); 31 | const workbench = document.createElement('div'); 32 | 33 | workbench.className = 'ide-online-workbench'; 34 | 35 | app.appendChild(workbench); 36 | 37 | const fileTree = document.createElement("div"); 38 | fileTree.className = "file-tree"; 39 | workbench.appendChild(fileTree); 40 | 41 | const editorArea = document.createElement('div'); 42 | editorArea.className = "editor-area"; 43 | 44 | workbench.appendChild(editorArea); 45 | 46 | 47 | const editor = monaco.editor.create(editorArea, { 48 | language: 'typescript', 49 | value: '', 50 | theme: "vs-dark", 51 | }); 52 | 53 | connectExtensionHostService(); 54 | `; 55 | 56 | const editor = monaco.editor.create(editorArea, { 57 | language: "typescript", 58 | theme: "vs-dark", 59 | value, 60 | }); 61 | 62 | connectExtensionHostService(); 63 | -------------------------------------------------------------------------------- /ide-online/webpack.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const path = require('path'); 3 | const HtmlWebpackPlugin = require('html-webpack-plugin') 4 | const WebpackBar = require('webpackbar'); 5 | const MonacoWebPackPlugin = require('monaco-editor-webpack-plugin'); 6 | 7 | const ROOT_PATH = path.resolve(__dirname); 8 | 9 | module.exports = { 10 | entry: path.join(ROOT_PATH, 'src/app.ts'), 11 | output: { 12 | path: path.join(ROOT_PATH, 'build'), 13 | filename: '[name].[hash].js', 14 | chunkFilename: '[name].[hash].chunk.js', 15 | }, 16 | devtool: 'source-map', 17 | resolve: { 18 | extensions: ['*', '.ts', '.tsx', '.js'], 19 | }, 20 | node: { 21 | fs: 'empty', 22 | child_process: 'empty', 23 | net: 'empty', 24 | crypto: 'empty' 25 | }, 26 | optimization: { 27 | runtimeChunk: true, 28 | splitChunks: { 29 | minChunks: 1, 30 | chunks: 'all', 31 | cacheGroups: { 32 | commons: { 33 | name: "commons", 34 | chunks: "initial", 35 | minChunks: 2 36 | }, 37 | vendors: { 38 | test: /[\\/]node_modules[\\/]/, 39 | priority: -10 40 | }, 41 | default: { 42 | minChunks: 2, 43 | priority: -20, 44 | reuseExistingChunk: true 45 | } 46 | } 47 | }, 48 | }, 49 | plugins: [ 50 | new HtmlWebpackPlugin({ 51 | title: 'IDE-Online', 52 | filename: 'index.html', 53 | template: path.join(ROOT_PATH, 'index.html'), 54 | }), 55 | new WebpackBar({ 56 | profile: true 57 | }), 58 | new MonacoWebPackPlugin({ 59 | languages: ['TypeScript'], 60 | features: [], 61 | }), 62 | new webpack.HotModuleReplacementPlugin() 63 | ], 64 | module: { 65 | rules: [ 66 | { test: /\.tsx?$/, loader: "ts-loader" }, 67 | { test: /\.css?$/, use: ["style-loader", "css-loader"] }, 68 | ] 69 | }, 70 | devServer: { 71 | hot: true, 72 | inline: true, 73 | disableHostCheck: true, 74 | port: 8899, 75 | }, 76 | } 77 | -------------------------------------------------------------------------------- /ide-host-service/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | accepts@~1.3.4: 6 | version "1.3.5" 7 | resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" 8 | integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= 9 | dependencies: 10 | mime-types "~2.1.18" 11 | negotiator "0.6.1" 12 | 13 | after@0.8.2: 14 | version "0.8.2" 15 | resolved "https://registry.npmjs.org/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" 16 | integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= 17 | 18 | arraybuffer.slice@~0.0.7: 19 | version "0.0.7" 20 | resolved "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" 21 | integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== 22 | 23 | async-limiter@~1.0.0: 24 | version "1.0.0" 25 | resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" 26 | integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== 27 | 28 | backo2@1.0.2: 29 | version "1.0.2" 30 | resolved "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" 31 | integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= 32 | 33 | base64-arraybuffer@0.1.5: 34 | version "0.1.5" 35 | resolved "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8" 36 | integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg= 37 | 38 | base64id@1.0.0: 39 | version "1.0.0" 40 | resolved "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" 41 | integrity sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY= 42 | 43 | better-assert@~1.0.0: 44 | version "1.0.2" 45 | resolved "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" 46 | integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI= 47 | dependencies: 48 | callsite "1.0.0" 49 | 50 | blob@0.0.5: 51 | version "0.0.5" 52 | resolved "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" 53 | integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== 54 | 55 | callsite@1.0.0: 56 | version "1.0.0" 57 | resolved "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" 58 | integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= 59 | 60 | component-bind@1.0.0: 61 | version "1.0.0" 62 | resolved "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz#00c608ab7dcd93897c0009651b1d3a8e1e73bbd1" 63 | integrity sha1-AMYIq33Nk4l8AAllGx06jh5zu9E= 64 | 65 | component-emitter@1.2.1: 66 | version "1.2.1" 67 | resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" 68 | integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= 69 | 70 | component-inherit@0.0.3: 71 | version "0.0.3" 72 | resolved "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" 73 | integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= 74 | 75 | cookie@0.3.1: 76 | version "0.3.1" 77 | resolved "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 78 | integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= 79 | 80 | debug@~3.1.0: 81 | version "3.1.0" 82 | resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 83 | integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== 84 | dependencies: 85 | ms "2.0.0" 86 | 87 | debug@~4.1.0: 88 | version "4.1.1" 89 | resolved "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 90 | integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== 91 | dependencies: 92 | ms "^2.1.1" 93 | 94 | engine.io-client@~3.3.1: 95 | version "3.3.1" 96 | resolved "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.3.1.tgz#afedb4a07b2ea48b7190c3136bfea98fdd4f0f03" 97 | integrity sha512-q66JBFuQcy7CSlfAz9L3jH+v7DTT3i6ZEadYcVj2pOs8/0uJHLxKX3WBkGTvULJMdz0tUCyJag0aKT/dpXL9BQ== 98 | dependencies: 99 | component-emitter "1.2.1" 100 | component-inherit "0.0.3" 101 | debug "~3.1.0" 102 | engine.io-parser "~2.1.1" 103 | has-cors "1.1.0" 104 | indexof "0.0.1" 105 | parseqs "0.0.5" 106 | parseuri "0.0.5" 107 | ws "~6.1.0" 108 | xmlhttprequest-ssl "~1.5.4" 109 | yeast "0.1.2" 110 | 111 | engine.io-parser@~2.1.0, engine.io-parser@~2.1.1: 112 | version "2.1.3" 113 | resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz#757ab970fbf2dfb32c7b74b033216d5739ef79a6" 114 | integrity sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA== 115 | dependencies: 116 | after "0.8.2" 117 | arraybuffer.slice "~0.0.7" 118 | base64-arraybuffer "0.1.5" 119 | blob "0.0.5" 120 | has-binary2 "~1.0.2" 121 | 122 | engine.io@~3.3.1: 123 | version "3.3.2" 124 | resolved "https://registry.npmjs.org/engine.io/-/engine.io-3.3.2.tgz#18cbc8b6f36e9461c5c0f81df2b830de16058a59" 125 | integrity sha512-AsaA9KG7cWPXWHp5FvHdDWY3AMWeZ8x+2pUVLcn71qE5AtAzgGbxuclOytygskw8XGmiQafTmnI9Bix3uihu2w== 126 | dependencies: 127 | accepts "~1.3.4" 128 | base64id "1.0.0" 129 | cookie "0.3.1" 130 | debug "~3.1.0" 131 | engine.io-parser "~2.1.0" 132 | ws "~6.1.0" 133 | 134 | has-binary2@~1.0.2: 135 | version "1.0.3" 136 | resolved "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz#7776ac627f3ea77250cfc332dab7ddf5e4f5d11d" 137 | integrity sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw== 138 | dependencies: 139 | isarray "2.0.1" 140 | 141 | has-cors@1.1.0: 142 | version "1.1.0" 143 | resolved "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" 144 | integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= 145 | 146 | indexof@0.0.1: 147 | version "0.0.1" 148 | resolved "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" 149 | integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= 150 | 151 | isarray@2.0.1: 152 | version "2.0.1" 153 | resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" 154 | integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= 155 | 156 | mime-db@~1.37.0: 157 | version "1.37.0" 158 | resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" 159 | integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== 160 | 161 | mime-types@~2.1.18: 162 | version "2.1.21" 163 | resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" 164 | integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== 165 | dependencies: 166 | mime-db "~1.37.0" 167 | 168 | ms@2.0.0: 169 | version "2.0.0" 170 | resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 171 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 172 | 173 | ms@^2.1.1: 174 | version "2.1.1" 175 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 176 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 177 | 178 | negotiator@0.6.1: 179 | version "0.6.1" 180 | resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 181 | integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= 182 | 183 | object-component@0.0.3: 184 | version "0.0.3" 185 | resolved "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" 186 | integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE= 187 | 188 | parseqs@0.0.5: 189 | version "0.0.5" 190 | resolved "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d" 191 | integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0= 192 | dependencies: 193 | better-assert "~1.0.0" 194 | 195 | parseuri@0.0.5: 196 | version "0.0.5" 197 | resolved "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a" 198 | integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo= 199 | dependencies: 200 | better-assert "~1.0.0" 201 | 202 | socket.io-adapter@~1.1.0: 203 | version "1.1.1" 204 | resolved "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz#2a805e8a14d6372124dd9159ad4502f8cb07f06b" 205 | integrity sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs= 206 | 207 | socket.io-client@2.2.0: 208 | version "2.2.0" 209 | resolved "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.2.0.tgz#84e73ee3c43d5020ccc1a258faeeb9aec2723af7" 210 | integrity sha512-56ZrkTDbdTLmBIyfFYesgOxsjcLnwAKoN4CiPyTVkMQj3zTUh0QAx3GbvIvLpFEOvQWu92yyWICxB0u7wkVbYA== 211 | dependencies: 212 | backo2 "1.0.2" 213 | base64-arraybuffer "0.1.5" 214 | component-bind "1.0.0" 215 | component-emitter "1.2.1" 216 | debug "~3.1.0" 217 | engine.io-client "~3.3.1" 218 | has-binary2 "~1.0.2" 219 | has-cors "1.1.0" 220 | indexof "0.0.1" 221 | object-component "0.0.3" 222 | parseqs "0.0.5" 223 | parseuri "0.0.5" 224 | socket.io-parser "~3.3.0" 225 | to-array "0.1.4" 226 | 227 | socket.io-parser@~3.3.0: 228 | version "3.3.0" 229 | resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f" 230 | integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng== 231 | dependencies: 232 | component-emitter "1.2.1" 233 | debug "~3.1.0" 234 | isarray "2.0.1" 235 | 236 | socket.io@^2.2.0: 237 | version "2.2.0" 238 | resolved "https://registry.npmjs.org/socket.io/-/socket.io-2.2.0.tgz#f0f633161ef6712c972b307598ecd08c9b1b4d5b" 239 | integrity sha512-wxXrIuZ8AILcn+f1B4ez4hJTPG24iNgxBBDaJfT6MsyOhVYiTXWexGoPkd87ktJG8kQEcL/NBvRi64+9k4Kc0w== 240 | dependencies: 241 | debug "~4.1.0" 242 | engine.io "~3.3.1" 243 | has-binary2 "~1.0.2" 244 | socket.io-adapter "~1.1.0" 245 | socket.io-client "2.2.0" 246 | socket.io-parser "~3.3.0" 247 | 248 | to-array@0.1.4: 249 | version "0.1.4" 250 | resolved "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" 251 | integrity sha1-F+bBH3PdTz10zaek/zI46a2b+JA= 252 | 253 | ws@~6.1.0: 254 | version "6.1.2" 255 | resolved "https://registry.npmjs.org/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8" 256 | integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw== 257 | dependencies: 258 | async-limiter "~1.0.0" 259 | 260 | xmlhttprequest-ssl@~1.5.4: 261 | version "1.5.5" 262 | resolved "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" 263 | integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= 264 | 265 | yeast@0.1.2: 266 | version "0.1.2" 267 | resolved "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" 268 | integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= 269 | --------------------------------------------------------------------------------