Merge pull request #1 from Bouncey/feat/monacoEditor
Feat/monaco editor
This commit is contained in:
		
				
					committed by
					
						 Mrugesh Mohapatra
						Mrugesh Mohapatra
					
				
			
			
				
	
			
			
			
						parent
						
							939028df20
						
					
				
				
					commit
					1f5abb3dde
				
			| @@ -1,4 +1,6 @@ | ||||
| const path = require('path'); | ||||
| const CopyWebpackPlugin = require('copy-webpack-plugin'); | ||||
|  | ||||
| const { dasherize } = require('./utils'); | ||||
| const { viewTypes } = require('./utils/challengeTypes'); | ||||
| const { blockNameify } = require('./utils/blockNameify'); | ||||
| @@ -84,3 +86,27 @@ exports.createPages = ({ graphql, boundActionCreators }) => { | ||||
|     ); | ||||
|   }); | ||||
| }; | ||||
|  | ||||
| exports.modifyWebpackConfig = ({ config, stage, babelConfig }) => { | ||||
|   if (stage === 'build-javascript' || stage === 'develop') { | ||||
|     config.plugin('CopyWebpackPlugin', CopyWebpackPlugin, [ | ||||
|       [ | ||||
|         { | ||||
|           from: path.resolve(__dirname, './node_modules/monaco-editor/min/vs'), | ||||
|           to: 'vs' | ||||
|         } | ||||
|       ] | ||||
|     ]); | ||||
|     // remove the default 'js' loader so we can create our own | ||||
|     config.removeLoader('js'); | ||||
|     // these modules are shipped with es6 code, we need to transform them due | ||||
|     // to the version of the uglifyjs plugin gatsby is using | ||||
|     config.loader('js', { | ||||
|       test: /\.jsx?$/, | ||||
|       exclude: /(node_modules|bower_components)\/(?!ansi-styles|chalk)/, | ||||
|       loader: 'babel', | ||||
|       query: babelConfig | ||||
|     }); | ||||
|   } | ||||
|   return config; | ||||
| }; | ||||
|   | ||||
| @@ -1,13 +1,14 @@ | ||||
| module.exports = { | ||||
|   moduleNameMapper: { | ||||
|     "\\.(jpg|jpeg|png|svg|woff|woff2)$": "<rootDir>/src/__mocks__/fileMock.js", | ||||
|     // Plain CSS - match css files that don't end with '.module.css' https://regex101.com/r/VzwrKH/4 | ||||
|     "^(?!.*\\.module\\.css$).*\\.css$": "<rootDir>/src/__mocks__/styleMock.js", | ||||
|     '\\.(jpg|jpeg|png|svg|woff|woff2)$': '<rootDir>/src/__mocks__/fileMock.js', | ||||
|     // Plain CSS - match css files that don't end with | ||||
|     // '.module.css' https://regex101.com/r/VzwrKH/4 | ||||
|     '^(?!.*\\.module\\.css$).*\\.css$': '<rootDir>/src/__mocks__/styleMock.js', | ||||
|     // CSS Modules - match files that end with 'module.css' | ||||
|     "\\.module\\.css$": "identity-obj-proxy" // CSS modules | ||||
|     '\\.module\\.css$': 'identity-obj-proxy' | ||||
|   }, | ||||
|   testPathIgnorePatterns: ["/node_modules/", "<rootDir>/.cache/"], | ||||
|   testPathIgnorePatterns: ['/node_modules/', '<rootDir>/.cache/'], | ||||
|   globals: { | ||||
|     __PATH_PREFIX__: "" | ||||
|     __PATH_PREFIX__: '' | ||||
|   } | ||||
| }; | ||||
| @@ -10,7 +10,7 @@ | ||||
|     "babel-standalone": "^6.26.0", | ||||
|     "brace": "^0.11.1", | ||||
|     "chai": "^4.1.2", | ||||
|     "codemirror": "^5.36.0", | ||||
|     "copy-webpack-plugin": "^4.5.1", | ||||
|     "debug": "^3.1.0", | ||||
|     "dotenv": "^5.0.1", | ||||
|     "enzyme": "^3.3.0", | ||||
| @@ -29,9 +29,9 @@ | ||||
|     "mongodb": "^3.0.5", | ||||
|     "react": "16", | ||||
|     "react-bootstrap": "^0.32.1", | ||||
|     "react-codemirror2": "^4.2.1", | ||||
|     "react-dom": "16", | ||||
|     "react-helmet": "^5.2.0", | ||||
|     "react-monaco-editor": "^0.14.1", | ||||
|     "react-redux": "^5.0.7", | ||||
|     "react-reflex": "^2.2.1", | ||||
|     "react-router-redux": "^5.0.0-alpha.9", | ||||
| @@ -52,14 +52,14 @@ | ||||
|     "build:frame-runner": "webpack --config ./webpack-frame-runner.js", | ||||
|     "build:loop-protect": "webpack --config ./webpack-loop-protect.js", | ||||
|     "develop": "yarn build:frame-runner && gatsby develop", | ||||
|     "format": "yarn format:gatsby && yarn format:src", | ||||
|     "format": "yarn format:gatsby && yarn format:src && yarn lint", | ||||
|     "format:gatsby": "prettier --write './gatsby*.js'", | ||||
|     "format:src": "prettier --write './src/**/*.js'", | ||||
|     "lint": "yarn lint:gatsby && yarn lint:src", | ||||
|     "lint:gatsby": "eslint ./gatsby*.js --fix", | ||||
|     "lint:src": "eslint ./src . --fix", | ||||
|     "pretty": "yarn format && yarn lint", | ||||
|     "test": "jest src", | ||||
|     "test": "yarn format && jest src", | ||||
|     "test:watch": "jest --watch src" | ||||
|   }, | ||||
|   "jest": { | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| /* eslint-disable */ | ||||
| import React from 'react'; | ||||
|  | ||||
| const mockComponent = name => props => | ||||
|   React.createElement(name, props, props.children); | ||||
|  | ||||
| export default mockComponent('MockedLink'); | ||||
|   | ||||
| @@ -13,7 +13,6 @@ const propTypes = { | ||||
| }; | ||||
|  | ||||
| class ShowMap extends PureComponent { | ||||
|  | ||||
|   renderSuperBlocks(superBlocks) { | ||||
|     const { nodes } = this.props; | ||||
|     return superBlocks.map(superBlock => ( | ||||
|   | ||||
| @@ -12,8 +12,6 @@ Enzyme.configure({ adapter: new Adapter() }); | ||||
| const renderer = new ShallowRenderer(); | ||||
|  | ||||
| test('<Map /> snapshot', () => { | ||||
|   const component = renderer.render( | ||||
|     <Map nodes={mockNodes} />, | ||||
|   ); | ||||
|   const component = renderer.render(<Map nodes={mockNodes} />); | ||||
|   expect(component).toMatchSnapshot('Map'); | ||||
| }); | ||||
|   | ||||
| @@ -17,11 +17,7 @@ test('<Block /> not expanded snapshot', () => { | ||||
|   const componentToRender = ( | ||||
|     <Block | ||||
|       blockDashedName='block-a' | ||||
|     challenges={ | ||||
|       mockNodes.filter( | ||||
|         node => node.block === 'block-a' | ||||
|       ) | ||||
|     } | ||||
|       challenges={mockNodes.filter(node => node.block === 'block-a')} | ||||
|       isExpanded={false} | ||||
|       toggleBlock={toggleSpy} | ||||
|     /> | ||||
| @@ -29,20 +25,14 @@ test('<Block /> not expanded snapshot', () => { | ||||
|   const component = renderer.render(componentToRender); | ||||
|  | ||||
|   expect(component).toMatchSnapshot('block-not-expanded'); | ||||
|  | ||||
| }); | ||||
|  | ||||
|  | ||||
| test('<Block expanded snapshot', () => { | ||||
|   const toggleSpy = sinon.spy(); | ||||
|   const componentToRender = ( | ||||
|     <Block | ||||
|       blockDashedName='block-a' | ||||
|     challenges={ | ||||
|       mockNodes.filter( | ||||
|         node => node.block === 'block-a' | ||||
|       ) | ||||
|     } | ||||
|       challenges={mockNodes.filter(node => node.block === 'block-a')} | ||||
|       isExpanded={true} | ||||
|       toggleBlock={toggleSpy} | ||||
|     /> | ||||
| @@ -53,27 +43,25 @@ test('<Block expanded snapshot', () => { | ||||
|   expect(component).toMatchSnapshot('block-expanded'); | ||||
| }); | ||||
|  | ||||
|  | ||||
| test('<Block />  should handle toggle clicks correctly', () => { | ||||
|   const toggleSpy = sinon.spy(); | ||||
|   const props = { | ||||
|     blockDashedName: 'block-a', | ||||
|     challenges: mockNodes.filter( | ||||
|       node => node.block === 'block-a' | ||||
|     ), | ||||
|     challenges: mockNodes.filter(node => node.block === 'block-a'), | ||||
|     isExpanded: false, | ||||
|     toggleBlock: toggleSpy | ||||
|   }; | ||||
|  | ||||
|   const componentToRender = ( | ||||
|     <Block { ...props } /> | ||||
|   ); | ||||
|   const componentToRender = <Block {...props} />; | ||||
|  | ||||
|   const enzymeWrapper = Enzyme.shallow(componentToRender); | ||||
|  | ||||
|   expect(toggleSpy.called).toBe(false); | ||||
|   expect( | ||||
|     enzymeWrapper.find('.map-title').find('h5').text() | ||||
|     enzymeWrapper | ||||
|       .find('.map-title') | ||||
|       .find('h5') | ||||
|       .text() | ||||
|   ).toBe('Block A'); | ||||
|  | ||||
|   enzymeWrapper.find('.map-title').simulate('click'); | ||||
| @@ -84,9 +72,10 @@ test('<Block />  should handle toggle clicks correctly', () => { | ||||
|   enzymeWrapper.setProps({ ...props, isExpanded: true }); | ||||
|  | ||||
|   expect( | ||||
|     enzymeWrapper.find('.map-title').find('h5').text() | ||||
|     enzymeWrapper | ||||
|       .find('.map-title') | ||||
|       .find('h5') | ||||
|       .text() | ||||
|   ).toBe('Block A'); | ||||
|   expect( | ||||
|     enzymeWrapper.find('ul').length | ||||
|   ).toBe(1); | ||||
|   expect(enzymeWrapper.find('ul').length).toBe(1); | ||||
| }); | ||||
|   | ||||
| @@ -20,13 +20,10 @@ test('<SuperBlock /> not expanded snapshot', () => { | ||||
|     superBlock: 'Super Block One', | ||||
|     toggleSuperBlock: toggleSpy | ||||
|   }; | ||||
|   const componentToRender = ( | ||||
|   <SuperBlock { ...props } /> | ||||
| ); | ||||
|   const componentToRender = <SuperBlock {...props} />; | ||||
|   const component = renderer.render(componentToRender); | ||||
|  | ||||
|   expect(component).toMatchSnapshot('superBlock-not-expanded'); | ||||
|  | ||||
| }); | ||||
|  | ||||
| test('<SuperBlock /> expanded snapshot', () => { | ||||
| @@ -37,9 +34,7 @@ test('<SuperBlock /> expanded snapshot', () => { | ||||
|     superBlock: 'Super Block One', | ||||
|     toggleSuperBlock: toggleSpy | ||||
|   }; | ||||
|   const componentToRender = ( | ||||
|     <SuperBlock { ...props } /> | ||||
|   ); | ||||
|   const componentToRender = <SuperBlock {...props} />; | ||||
|   const component = renderer.render(componentToRender); | ||||
|  | ||||
|   expect(component).toMatchSnapshot('superBlock-expanded'); | ||||
| @@ -53,18 +48,17 @@ test('<SuperBlock should handle toggle clicks correctly', () => { | ||||
|     superBlock: 'Super Block One', | ||||
|     toggleSuperBlock: toggleSpy | ||||
|   }; | ||||
|   const componentToRender = ( | ||||
|     <SuperBlock { ...props } /> | ||||
|   ); | ||||
|   const componentToRender = <SuperBlock {...props} />; | ||||
|   const enzymeWrapper = Enzyme.shallow(componentToRender); | ||||
|  | ||||
|   expect(toggleSpy.called).toBe(false); | ||||
|   expect( | ||||
|     enzymeWrapper.find('.map-title').find('h4').text() | ||||
|     enzymeWrapper | ||||
|       .find('.map-title') | ||||
|       .find('h4') | ||||
|       .text() | ||||
|   ).toBe('Super Block One'); | ||||
|   expect( | ||||
|     enzymeWrapper.find('ul').length | ||||
|   ).toBe(0); | ||||
|   expect(enzymeWrapper.find('ul').length).toBe(0); | ||||
|  | ||||
|   enzymeWrapper.find('.map-title').simulate('click'); | ||||
|  | ||||
| @@ -74,9 +68,10 @@ test('<SuperBlock should handle toggle clicks correctly', () => { | ||||
|   enzymeWrapper.setProps({ ...props, isExpanded: true }); | ||||
|  | ||||
|   expect( | ||||
|     enzymeWrapper.find('.map-title').find('h4').text() | ||||
|     enzymeWrapper | ||||
|       .find('.map-title') | ||||
|       .find('h4') | ||||
|       .text() | ||||
|   ).toBe('Super Block One'); | ||||
|   expect( | ||||
|     enzymeWrapper.find('ul').length | ||||
|   ).toBe(1); | ||||
|   expect(enzymeWrapper.find('ul').length).toBe(1); | ||||
| }); | ||||
|   | ||||
| @@ -10,10 +10,7 @@ import Spacer from './Spacer'; | ||||
| Enzyme.configure({ adapter: new Adapter() }); | ||||
|  | ||||
| test('<Spacer /> snapshot', () => { | ||||
|   const component = renderer.create( | ||||
|     <Spacer />, | ||||
|   ); | ||||
|   const component = renderer.create(<Spacer />); | ||||
|   let tree = component.toJSON(); | ||||
|   expect(tree).toMatchSnapshot(); | ||||
|  | ||||
| }); | ||||
|   | ||||
| @@ -2,18 +2,10 @@ import React, { PureComponent } from 'react'; | ||||
| import PropTypes from 'prop-types'; | ||||
| import { bindActionCreators } from 'redux'; | ||||
| import { connect } from 'react-redux'; | ||||
| import { Controlled as CodeMirror } from 'react-codemirror2'; | ||||
| import MonacoEditor from 'react-monaco-editor'; | ||||
|  | ||||
| import { executeChallenge, updateFile } from '../../redux'; | ||||
|  | ||||
| import 'codemirror/lib/codemirror.css'; | ||||
| import 'codemirror/theme/material.css'; | ||||
|  | ||||
| if (typeof window !== 'undefined') { | ||||
|   require('codemirror/mode/htmlmixed/htmlmixed'); | ||||
|   require('codemirror/mode/javascript/javascript'); | ||||
| } | ||||
|  | ||||
| const propTypes = { | ||||
|   contents: PropTypes.string, | ||||
|   executeChallenge: PropTypes.func.isRequired, | ||||
| @@ -34,7 +26,8 @@ const mapDispatchToProps = dispatch => | ||||
|   ); | ||||
|  | ||||
| const modeMap = { | ||||
|   html: 'htmlmixed', | ||||
|   css: 'css', | ||||
|   html: 'html', | ||||
|   js: 'javascript', | ||||
|   jsx: 'javascript' | ||||
| }; | ||||
| @@ -42,60 +35,57 @@ const modeMap = { | ||||
| class Editor extends PureComponent { | ||||
|   constructor(...props) { | ||||
|     super(...props); | ||||
|  | ||||
|     this.options = { | ||||
|       selectOnLineNumbers: true | ||||
|     }; | ||||
|     this._editor = null; | ||||
|  | ||||
|     this.focusEditor = this.focusEditor.bind(this); | ||||
|   } | ||||
|  | ||||
|   handleChange = editorValue => { | ||||
|   componentWillUnmount() { | ||||
|     document.removeEventListener('keyup', this.focusEditor); | ||||
|   } | ||||
|  | ||||
|   editorDidMount(editor, monaco) { | ||||
|     this._editor = editor; | ||||
|     document.addEventListener('keyup', this.focusEditor); | ||||
|     this._editor.addAction({ | ||||
|       id: 'execute-challenge', | ||||
|       label: 'Run tests', | ||||
|       keybindings: [ | ||||
|         /* eslint-disable no-bitwise */ | ||||
|         monaco.KeyMod.chord(monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter) | ||||
|       ], | ||||
|       run: this.props.executeChallenge | ||||
|     }); | ||||
|   } | ||||
|  | ||||
|   focusEditor(e) { | ||||
|     // e key to focus editor | ||||
|     if (e.keyCode === 69) { | ||||
|       console.log('focusing'); | ||||
|       this._editor.focus(); | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   onChange(editorValue) { | ||||
|     const { updateFile, fileKey } = this.props; | ||||
|     updateFile({ key: fileKey, editorValue }); | ||||
|   }; | ||||
|   } | ||||
|  | ||||
|   render() { | ||||
|     const { contents, executeChallenge, ext } = this.props; | ||||
|     const { contents, ext } = this.props; | ||||
|  | ||||
|     return ( | ||||
|       <div className='classic-editor editor'> | ||||
|         <CodeMirror | ||||
|           onBeforeChange={(editor, something, newValue) => | ||||
|             this.handleChange(newValue) | ||||
|           } | ||||
|           options={{ | ||||
|             mode: modeMap[ext], | ||||
|             theme: 'material', | ||||
|             lineNumbers: true, | ||||
|             lineWrapping: true, | ||||
|             extraKeys: { | ||||
|               Esc() { | ||||
|                 document.activeElement.blur(); | ||||
|               }, | ||||
|               Tab(cm) { | ||||
|                 if (cm.somethingSelected()) { | ||||
|                   return cm.indentSelection('add'); | ||||
|                 } | ||||
|                 const spaces = Array(cm.getOption('indentUnit') + 1).join(' '); | ||||
|                 return cm.replaceSelection(spaces); | ||||
|               }, | ||||
|               'Shift-Tab': function(cm) { | ||||
|                 return cm.indentSelection('subtract'); | ||||
|               }, | ||||
|               'Ctrl-Enter': function() { | ||||
|                 executeChallenge(); | ||||
|                 return false; | ||||
|               }, | ||||
|               'Cmd-Enter': function() { | ||||
|                 executeChallenge(); | ||||
|                 return false; | ||||
|               } | ||||
|               // TODO: Not working in cm2 | ||||
|               // 'Ctrl-/': function(cm) { | ||||
|               //   cm.toggleComment(); | ||||
|               // }, | ||||
|               // 'Cmd-/': function(cm) { | ||||
|               //   cm.toggleComment(); | ||||
|               // } | ||||
|             } | ||||
|           }} | ||||
|         <base href='/' /> | ||||
|         <MonacoEditor | ||||
|           editorDidMount={::this.editorDidMount} | ||||
|           language={modeMap[ext]} | ||||
|           onChange={::this.onChange} | ||||
|           options={this.options} | ||||
|           theme='vs-dark' | ||||
|           value={contents} | ||||
|         /> | ||||
|       </div> | ||||
|   | ||||
| @@ -1,28 +1,35 @@ | ||||
| import React from 'react'; | ||||
| import React, { Fragment } from 'react'; | ||||
| import PropTypes from 'prop-types'; | ||||
| import { Controlled as CodeMirror } from 'react-codemirror2'; | ||||
|  | ||||
| import './output.css'; | ||||
|  | ||||
| const defaultOptions = { | ||||
|   lineNumbers: false, | ||||
|   lineWrapping: true, | ||||
|   mode: 'javascript', | ||||
|   readOnly: 'nocursor' | ||||
| }; | ||||
| import MonacoEditor from 'react-monaco-editor'; | ||||
|  | ||||
| const propTypes = { | ||||
|   defaultOutput: PropTypes.string, | ||||
|   output: PropTypes.string | ||||
| }; | ||||
|  | ||||
| const options = { | ||||
|   lineNumbers: false, | ||||
|   minimap: { | ||||
|     enabled: false | ||||
|   }, | ||||
|   readOnly: true, | ||||
|   scrollbar: { | ||||
|     vertical: 'hidden', | ||||
|     horizontal: 'hidden' | ||||
|   } | ||||
| }; | ||||
|  | ||||
| function Output({ output, defaultOutput }) { | ||||
|   return ( | ||||
|     <CodeMirror | ||||
|       className='challenge-log' | ||||
|       options={{ ...defaultOptions, theme: 'material' }} | ||||
|       value={output || defaultOutput} | ||||
|     <Fragment> | ||||
|       <base href='/' /> | ||||
|       <MonacoEditor | ||||
|         className='challenge-output' | ||||
|         height={150} | ||||
|         options={options} | ||||
|         value={output ? output : defaultOutput} | ||||
|       /> | ||||
|     </Fragment> | ||||
|   ); | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -1,3 +0,0 @@ | ||||
| .react-codemirror2.challenge-log > .CodeMirror { | ||||
|   height: 150px; | ||||
| } | ||||
| @@ -2101,10 +2101,6 @@ code-point-at@^1.0.0: | ||||
|   version "1.1.0" | ||||
|   resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" | ||||
|  | ||||
| codemirror@^5.36.0: | ||||
|   version "5.36.0" | ||||
|   resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.36.0.tgz#1172ad9dc298056c06e0b34e5ccd23825ca15b40" | ||||
|  | ||||
| collection-visit@^1.0.0: | ||||
|   version "1.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" | ||||
| @@ -2326,6 +2322,19 @@ copy-descriptor@^0.1.0: | ||||
|   version "0.1.1" | ||||
|   resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" | ||||
|  | ||||
| copy-webpack-plugin@^4.5.1: | ||||
|   version "4.5.1" | ||||
|   resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.1.tgz#fc4f68f4add837cc5e13d111b20715793225d29c" | ||||
|   dependencies: | ||||
|     cacache "^10.0.4" | ||||
|     find-cache-dir "^1.0.0" | ||||
|     globby "^7.1.1" | ||||
|     is-glob "^4.0.0" | ||||
|     loader-utils "^1.1.0" | ||||
|     minimatch "^3.0.4" | ||||
|     p-limit "^1.0.0" | ||||
|     serialize-javascript "^1.4.0" | ||||
|  | ||||
| copyfiles@^1.2.0: | ||||
|   version "1.2.0" | ||||
|   resolved "https://registry.yarnpkg.com/copyfiles/-/copyfiles-1.2.0.tgz#a8da3ac41aa2220ae29bd3c58b6984294f2c593c" | ||||
| @@ -2814,6 +2823,13 @@ diffie-hellman@^5.0.0: | ||||
|     miller-rabin "^4.0.0" | ||||
|     randombytes "^2.0.0" | ||||
|  | ||||
| dir-glob@^2.0.0: | ||||
|   version "2.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.0.0.tgz#0b205d2b6aef98238ca286598a8204d29d0a0034" | ||||
|   dependencies: | ||||
|     arrify "^1.0.1" | ||||
|     path-type "^3.0.0" | ||||
|  | ||||
| discontinuous-range@1.0.0: | ||||
|   version "1.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/discontinuous-range/-/discontinuous-range-1.0.0.tgz#e38331f0844bba49b9a9cb71c771585aab1bc65a" | ||||
| @@ -4360,6 +4376,17 @@ globby@^6.1.0: | ||||
|     pify "^2.0.0" | ||||
|     pinkie-promise "^2.0.0" | ||||
|  | ||||
| globby@^7.1.1: | ||||
|   version "7.1.1" | ||||
|   resolved "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz#fb2ccff9401f8600945dfada97440cca972b8680" | ||||
|   dependencies: | ||||
|     array-union "^1.0.1" | ||||
|     dir-glob "^2.0.0" | ||||
|     glob "^7.1.2" | ||||
|     ignore "^3.3.5" | ||||
|     pify "^3.0.0" | ||||
|     slash "^1.0.0" | ||||
|  | ||||
| got@^6.7.1: | ||||
|   version "6.7.1" | ||||
|   resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" | ||||
| @@ -4729,7 +4756,7 @@ iferr@^0.1.5: | ||||
|   version "0.1.5" | ||||
|   resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" | ||||
|  | ||||
| ignore@^3.3.3: | ||||
| ignore@^3.3.3, ignore@^3.3.5: | ||||
|   version "3.3.7" | ||||
|   resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" | ||||
|  | ||||
| @@ -5874,7 +5901,7 @@ loader-utils@^0.2.11, loader-utils@^0.2.15, loader-utils@^0.2.16, loader-utils@^ | ||||
|     json5 "^0.5.0" | ||||
|     object-assign "^4.0.1" | ||||
|  | ||||
| loader-utils@^1.0.2: | ||||
| loader-utils@^1.0.2, loader-utils@^1.1.0: | ||||
|   version "1.1.0" | ||||
|   resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" | ||||
|   dependencies: | ||||
| @@ -6342,6 +6369,10 @@ moment@2.x.x, moment@^2.16.0: | ||||
|   version "2.21.0" | ||||
|   resolved "https://registry.yarnpkg.com/moment/-/moment-2.21.0.tgz#2a114b51d2a6ec9e6d83cf803f838a878d8a023a" | ||||
|  | ||||
| monaco-editor@^0.10.0: | ||||
|   version "0.10.1" | ||||
|   resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.10.1.tgz#8c96c4f15b6b5258bf92cbde93cad8a7e3007e14" | ||||
|  | ||||
| mongodb-core@2.1.19: | ||||
|   version "2.1.19" | ||||
|   resolved "https://registry.yarnpkg.com/mongodb-core/-/mongodb-core-2.1.19.tgz#00fbd5e5a3573763b9171cfd844e60a8f2a3a18b" | ||||
| @@ -6891,7 +6922,7 @@ p-finally@^1.0.0: | ||||
|   version "1.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" | ||||
|  | ||||
| p-limit@^1.1.0: | ||||
| p-limit@^1.0.0, p-limit@^1.1.0: | ||||
|   version "1.2.0" | ||||
|   resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" | ||||
|   dependencies: | ||||
| @@ -7063,7 +7094,7 @@ path-to-regexp@^1.7.0: | ||||
|   dependencies: | ||||
|     isarray "0.0.1" | ||||
|  | ||||
| path-type@3.0.0: | ||||
| path-type@3.0.0, path-type@^3.0.0: | ||||
|   version "3.0.0" | ||||
|   resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" | ||||
|   dependencies: | ||||
| @@ -7959,10 +7990,6 @@ react-bootstrap@^0.32.1: | ||||
|     uncontrollable "^4.1.0" | ||||
|     warning "^3.0.0" | ||||
|  | ||||
| react-codemirror2@^4.2.1: | ||||
|   version "4.2.1" | ||||
|   resolved "https://registry.yarnpkg.com/react-codemirror2/-/react-codemirror2-4.2.1.tgz#4ad3c5c60ebbcb34880f961721b51527324ec021" | ||||
|  | ||||
| react-deep-force-update@^2.1.1: | ||||
|   version "2.1.1" | ||||
|   resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-2.1.1.tgz#8ea4263cd6455a050b37445b3f08fd839d86e909" | ||||
| @@ -8052,6 +8079,13 @@ react-measure@^2.0.2: | ||||
|     prop-types "^15.5.10" | ||||
|     resize-observer-polyfill "^1.4.2" | ||||
|  | ||||
| react-monaco-editor@^0.14.1: | ||||
|   version "0.14.1" | ||||
|   resolved "https://registry.yarnpkg.com/react-monaco-editor/-/react-monaco-editor-0.14.1.tgz#f5163e119e8a7dc79b992cb3fd7af887547d7efd" | ||||
|   dependencies: | ||||
|     monaco-editor "^0.10.0" | ||||
|     prop-types "^15.5.10" | ||||
|  | ||||
| react-overlays@^0.8.0: | ||||
|   version "0.8.3" | ||||
|   resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.8.3.tgz#fad65eea5b24301cca192a169f5dddb0b20d3ac5" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user