diff --git a/.gitignore b/.gitignore index 58b93d3ba21..fc1b4628edd 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,9 @@ lib *.min.js test/integration/**/target test/integration/**/Cargo.lock +test/**/node_modules +test/**/yarn.lock +test/**/package-lock.json # Logs logs *.log diff --git a/packages/core/parcel/package.json b/packages/core/parcel/package.json index 13b7336b0b9..9c1c5db0773 100644 --- a/packages/core/parcel/package.json +++ b/packages/core/parcel/package.json @@ -15,21 +15,21 @@ "index.js" ], "dependencies": { + "@babel/code-frame": "^7.0.0", + "@babel/core": "^7.0.0", + "@babel/generator": "^7.0.0", + "@babel/parser": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/preset-env": "^7.0.0", + "@babel/runtime": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", "ansi-to-html": "^0.6.4", - "babel-code-frame": "^6.26.0", - "babel-core": "^6.25.0", - "babel-generator": "^6.25.0", - "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", - "babel-plugin-transform-flow-strip-types": "^6.22.0", - "babel-plugin-transform-object-rest-spread": "^6.26.0", - "babel-plugin-transform-react-jsx": "^6.24.1", - "babel-preset-env": "^1.7.0", - "babel-template": "^6.26.0", - "babel-traverse": "^6.26.0", - "babel-types": "^6.26.0", - "babylon": "^6.17.4", "babylon-walk": "^1.0.2", - "browserslist": "^3.2.6", + "browserslist": "^4.1.0", "chalk": "^2.1.0", "clone": "^2.1.1", "command-exists": "^1.2.6", @@ -74,11 +74,14 @@ "ws": "^5.1.1" }, "devDependencies": { + "@babel/cli": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/preset-flow": "^7.0.0", + "@babel/register": "^7.0.0", "@vue/component-compiler-utils": "^2.0.0", - "babel-cli": "^6.26.0", - "babel-plugin-transform-async-super": "^1.0.0", - "babel-polyfill": "^6.26.0", - "babel-register": "^6.26.0", + "babel-core": "^6.26.3", + "babel-preset-env": "^1.7.0", + "babylon": "^6.18.0", "bsb-js": "^1.0.1", "codecov": "^3.0.0", "coffeescript": "^2.0.3", @@ -119,7 +122,7 @@ "build": "yarn minify && babel src -d lib && ncp src/builtins lib/builtins", "prepublish": "yarn build", "minify": "terser -c -m -o src/builtins/prelude.min.js src/builtins/prelude.js && terser -c -m -o src/builtins/prelude2.min.js src/builtins/prelude2.js", - "precommit": "npm run lint && lint-staged", + "precommit": "lint-staged", "lint": "eslint . && prettier \"./{src,bin,test}/**/*.{js,json,md}\" --list-different", "postinstall": "node -e \"console.log('\\u001b[35m\\u001b[1mLove Parcel? You can now donate to our open collective:\\u001b[22m\\u001b[39m\\n > \\u001b[34mhttps://opencollective.com/parcel/donate\\u001b[0m')\"" }, diff --git a/packages/core/parcel/src/.babelrc b/packages/core/parcel/src/.babelrc index 9a4ed746bb7..b42df74e6ff 100644 --- a/packages/core/parcel/src/.babelrc +++ b/packages/core/parcel/src/.babelrc @@ -1,9 +1,9 @@ { - "presets": [["env", { + "presets": [["@babel/preset-env", { "targets": { "node": "6" } }]], - "plugins": ["transform-async-super"], + "plugins": ["@babel/plugin-transform-runtime"], "ignore": ["builtins"] } diff --git a/packages/core/parcel/src/Bundler.js b/packages/core/parcel/src/Bundler.js index 87057e0d577..e24f089ea86 100644 --- a/packages/core/parcel/src/Bundler.js +++ b/packages/core/parcel/src/Bundler.js @@ -499,7 +499,7 @@ class Bundler extends EventEmitter { // If the module resolved (i.e. wasn't a local file), but the module directory wasn't found, install it. if (resolved.moduleName && !resolved.moduleDir) { try { - await installPackage([resolved.moduleName], asset.name, { + await installPackage(resolved.moduleName, asset.name, { saveDev: false }); } catch (err) { diff --git a/packages/core/parcel/src/assets/JSAsset.js b/packages/core/parcel/src/assets/JSAsset.js index 9014c359622..1cbd8a33ad8 100644 --- a/packages/core/parcel/src/assets/JSAsset.js +++ b/packages/core/parcel/src/assets/JSAsset.js @@ -1,15 +1,15 @@ -const {File: BabelFile} = require('babel-core'); -const traverse = require('babel-traverse').default; -const codeFrame = require('babel-code-frame'); +const traverse = require('@babel/traverse').default; +const codeFrame = require('@babel/code-frame').codeFrameColumns; const collectDependencies = require('../visitors/dependencies'); const walk = require('babylon-walk'); const Asset = require('../Asset'); -const babylon = require('babylon'); +const babelParser = require('@babel/parser'); const insertGlobals = require('../visitors/globals'); const fsVisitor = require('../visitors/fs'); const envVisitor = require('../visitors/env'); -const babel = require('../transforms/babel'); -const generate = require('babel-generator').default; +const babel = require('../transforms/babel/transform'); +const babel7 = require('../transforms/babel/babel7'); +const generate = require('@babel/generator').default; const terser = require('../transforms/terser'); const SourceMap = require('../SourceMap'); const hoist = require('../scope-hoisting/hoist'); @@ -60,44 +60,17 @@ class JSAsset extends Asset { ); } - async getParserOptions() { - // Babylon options. We enable a few plugins by default. - const options = { + async parse(code) { + return babelParser.parse(code, { filename: this.name, allowReturnOutsideFunction: true, - allowHashBang: true, - ecmaVersion: Infinity, strictMode: false, sourceType: 'module', - locations: true, - plugins: ['exportExtensions', 'dynamicImport'] - }; - - // Check if there is a babel config file. If so, determine which parser plugins to enable - this.babelConfig = await babel.getConfig(this); - if (this.babelConfig) { - const file = new BabelFile(this.babelConfig); - options.plugins.push(...file.parserOpts.plugins); - } - - return options; - } - - async parse(code) { - const options = await this.getParserOptions(); - return babylon.parse(code, options); + plugins: ['exportDefaultFrom', 'exportNamespaceFrom', 'dynamicImport'] + }); } traverse(visitor) { - // Create a babel File object if one hasn't been created yet. - // This is needed so that cached NodePath objects get a `hub` object on them. - // Plugins like babel-minify depend on this to get the original source code string. - if (!this.babelFile) { - this.babelFile = new BabelFile(this.babelConfig || {}); - this.babelFile.addCode(this.contents); - this.babelFile.addAst(this.ast); - } - return traverse(this.ast, visitor, null, this); } @@ -214,7 +187,12 @@ class JSAsset extends Asset { this.isAstDirty = true; } else { if (this.isES6Module) { - await babel(this); + await babel7(this, { + internal: true, + config: { + plugins: [require('@babel/plugin-transform-modules-commonjs')] + } + }); } } @@ -285,11 +263,18 @@ class JSAsset extends Asset { generateErrorMessage(err) { const loc = err.loc; if (loc) { - err.codeFrame = codeFrame(this.contents, loc.line, loc.column + 1); + // Babel 7 adds its own code frame on the error message itself + // We need to remove it and pass it separately. + if (err.message.startsWith(this.name)) { + err.message = err.message + .slice(this.name.length + 1, err.message.indexOf('\n')) + .trim(); + } + + err.codeFrame = codeFrame(this.contents, {start: loc}); err.highlightedCodeFrame = codeFrame( this.contents, - loc.line, - loc.column + 1, + {start: loc}, {highlightCode: true} ); } diff --git a/packages/core/parcel/src/packagers/JSConcatPackager.js b/packages/core/parcel/src/packagers/JSConcatPackager.js index 7deccceb186..139ae89bf9b 100644 --- a/packages/core/parcel/src/packagers/JSConcatPackager.js +++ b/packages/core/parcel/src/packagers/JSConcatPackager.js @@ -4,8 +4,8 @@ const concat = require('../scope-hoisting/concat'); const urlJoin = require('../utils/urlJoin'); const getExisting = require('../utils/getExisting'); const walk = require('babylon-walk'); -const babylon = require('babylon'); -const t = require('babel-types'); +const babylon = require('@babel/parser'); +const t = require('@babel/types'); const {getName, getIdentifier} = require('../scope-hoisting/utils'); const prelude = getExisting( @@ -530,10 +530,11 @@ class JSConcatPackager extends Packager { // Add source map url if a map bundle exists let mapBundle = this.bundle.siblingBundlesMap.get('map'); if (mapBundle) { - output += `\n//# sourceMappingURL=${urlJoin( + let mapUrl = urlJoin( this.options.publicURL, path.basename(mapBundle.name) - )}`; + ); + output += `\n//# sourceMappingURL=${mapUrl}`; } } diff --git a/packages/core/parcel/src/packagers/JSPackager.js b/packages/core/parcel/src/packagers/JSPackager.js index ed2f8c17a74..3cb5585e302 100644 --- a/packages/core/parcel/src/packagers/JSPackager.js +++ b/packages/core/parcel/src/packagers/JSPackager.js @@ -225,12 +225,11 @@ class JSPackager extends Packager { // Add source map url if a map bundle exists let mapBundle = this.bundle.siblingBundlesMap.get('map'); if (mapBundle) { - await this.write( - `\n//# sourceMappingURL=${urlJoin( - this.options.publicURL, - path.basename(mapBundle.name) - )}` + let mapUrl = urlJoin( + this.options.publicURL, + path.basename(mapBundle.name) ); + await this.write(`\n//# sourceMappingURL=${mapUrl}`); } } await this.dest.end(); diff --git a/packages/core/parcel/src/scope-hoisting/concat.js b/packages/core/parcel/src/scope-hoisting/concat.js index a5bc5eec21c..2f15993047e 100644 --- a/packages/core/parcel/src/scope-hoisting/concat.js +++ b/packages/core/parcel/src/scope-hoisting/concat.js @@ -1,8 +1,8 @@ const {relative} = require('path'); -const template = require('babel-template'); -const t = require('babel-types'); -const traverse = require('babel-traverse').default; -const generate = require('babel-generator').default; +const template = require('@babel/template').default; +const t = require('@babel/types'); +const traverse = require('@babel/traverse').default; +const generate = require('@babel/generator').default; const treeShake = require('./shake'); const mangleScope = require('./mangler'); const {getName, getIdentifier} = require('./utils'); diff --git a/packages/core/parcel/src/scope-hoisting/hoist.js b/packages/core/parcel/src/scope-hoisting/hoist.js index 0a610c0d0e9..afc01e49be5 100644 --- a/packages/core/parcel/src/scope-hoisting/hoist.js +++ b/packages/core/parcel/src/scope-hoisting/hoist.js @@ -1,8 +1,7 @@ const path = require('path'); -const matchesPattern = require('../visitors/matches-pattern'); const mm = require('micromatch'); -const t = require('babel-types'); -const template = require('babel-template'); +const t = require('@babel/types'); +const template = require('@babel/template').default; const rename = require('./renamer'); const {getName, getIdentifier, getExportIdentifier} = require('./utils'); @@ -76,7 +75,7 @@ module.exports = { ReturnStatement(path) { // Wrap in a function if we see a top-level return statement. - if (path.getFunctionParent().isProgram()) { + if (!path.getFunctionParent()) { shouldWrap = true; asset.cacheData.isCommonJS = true; path.replaceWith( @@ -175,20 +174,20 @@ module.exports = { return; } - if (matchesPattern(path.node, 'module.exports')) { + if (t.matchesPattern(path.node, 'module.exports')) { path.replaceWith(getExportsIdentifier(asset)); asset.cacheData.isCommonJS = true; } - if (matchesPattern(path.node, 'module.id')) { + if (t.matchesPattern(path.node, 'module.id')) { path.replaceWith(t.stringLiteral(asset.id)); } - if (matchesPattern(path.node, 'module.hot')) { + if (t.matchesPattern(path.node, 'module.hot')) { path.replaceWith(t.identifier('null')); } - if (matchesPattern(path.node, 'module.bundle')) { + if (t.matchesPattern(path.node, 'module.bundle')) { path.replaceWith(t.identifier('require')); } }, @@ -332,7 +331,7 @@ module.exports = { ); } - if (matchesPattern(callee, 'require.resolve')) { + if (t.matchesPattern(callee, 'require.resolve')) { path.replaceWith( REQUIRE_RESOLVE_CALL_TEMPLATE({ ID: t.stringLiteral(asset.id), @@ -523,9 +522,10 @@ function addExport(asset, path, local, exported) { LOCAL: identifier }); - let constantViolations = scope - .getBinding(local.name) - .constantViolations.concat(path); + let binding = scope.getBinding(local.name); + let constantViolations = binding + ? binding.constantViolations.concat(path) + : [path]; if (!asset.cacheData.exports[exported.name]) { asset.cacheData.exports[exported.name] = identifier.name; diff --git a/packages/core/parcel/src/scope-hoisting/mangler.js b/packages/core/parcel/src/scope-hoisting/mangler.js index dfb7347bdbc..5d674e6c066 100644 --- a/packages/core/parcel/src/scope-hoisting/mangler.js +++ b/packages/core/parcel/src/scope-hoisting/mangler.js @@ -1,5 +1,5 @@ const rename = require('./renamer'); -const t = require('babel-types'); +const t = require('@babel/types'); const CHARSET = ( 'abcdefghijklmnopqrstuvwxyz' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ$_' diff --git a/packages/core/parcel/src/scope-hoisting/shake.js b/packages/core/parcel/src/scope-hoisting/shake.js index 563c8313222..231fd169baf 100644 --- a/packages/core/parcel/src/scope-hoisting/shake.js +++ b/packages/core/parcel/src/scope-hoisting/shake.js @@ -1,4 +1,4 @@ -const t = require('babel-types'); +const t = require('@babel/types'); const EXPORTS_RE = /^\$([^$]+)\$exports$/; diff --git a/packages/core/parcel/src/scope-hoisting/utils.js b/packages/core/parcel/src/scope-hoisting/utils.js index fb80d0480a8..e5483bf2525 100644 --- a/packages/core/parcel/src/scope-hoisting/utils.js +++ b/packages/core/parcel/src/scope-hoisting/utils.js @@ -1,4 +1,4 @@ -const t = require('babel-types'); +const t = require('@babel/types'); function getName(asset, type, ...rest) { return ( diff --git a/packages/core/parcel/src/transforms/babel.js b/packages/core/parcel/src/transforms/babel.js deleted file mode 100644 index 42d8ac6880c..00000000000 --- a/packages/core/parcel/src/transforms/babel.js +++ /dev/null @@ -1,340 +0,0 @@ -const presetEnv = require('babel-preset-env'); -const getTargetEngines = require('../utils/getTargetEngines'); -const localRequire = require('../utils/localRequire'); -const path = require('path'); -const {util: babelUtils} = require('babel-core'); -const fs = require('../utils/fs'); - -const NODE_MODULES = `${path.sep}node_modules${path.sep}`; -const ENV_PLUGINS = require('babel-preset-env/data/plugins'); -const ENV_PRESETS = { - es2015: true, - es2016: true, - es2017: true, - latest: true, - env: true -}; - -const JSX_EXTENSIONS = { - '.jsx': true, - '.tsx': true -}; - -const JSX_PRAGMA = { - react: 'React.createElement', - preact: 'h', - nervjs: 'Nerv.createElement', - hyperapp: 'h' -}; - -async function babelTransform(asset) { - let config = await getConfig(asset); - if (!config) { - return; - } - - await asset.parseIfNeeded(); - - // If this is an internally generated config, use our internal babel-core, - // otherwise require a local version from the package we're compiling. - let babel = config.internal - ? require('babel-core') - : await localRequire('babel-core', asset.name); - - // TODO: support other versions of babel - if (parseInt(babel.version, 10) !== 6) { - throw new Error(`Unsupported babel version: ${babel.version}`); - } - - let res = babel.transformFromAst(asset.ast, asset.contents, config); - if (!res.ignored) { - asset.ast = res.ast; - asset.isAstDirty = true; - } -} - -module.exports = babelTransform; - -async function getConfig(asset) { - let config = await getBabelConfig(asset); - if (config) { - config.code = false; - config.filename = asset.name; - config.babelrc = false; - - // Hide the internal property from babel - let internal = config.internal; - delete config.internal; - Object.defineProperty(config, 'internal', { - value: internal, - configurable: true - }); - } - - return config; -} - -babelTransform.getConfig = getConfig; - -async function getBabelConfig(asset) { - // If asset is marked as an ES6 modules, this is a second pass after dependencies are extracted. - // Just compile modules to CommonJS. - if (asset.isES6Module) { - return { - internal: true, - plugins: [require('babel-plugin-transform-es2015-modules-commonjs')] - }; - } - - if (asset.babelConfig) { - return asset.babelConfig; - } - - // Consider the module source code rather than precompiled if the resolver - // used the `source` field, or it is not in node_modules. - let pkg = await asset.getPackage(); - let isSource = - !!(pkg && pkg.source && (await fs.realpath(asset.name)) !== asset.name) || - !asset.name.includes(NODE_MODULES); - - // Try to resolve a .babelrc file. If one is found, consider the module source code. - let babelrc = await getBabelRc(asset, isSource); - isSource = isSource || !!babelrc; - - let envConfig = await getEnvConfig(asset, isSource); - let jsxConfig = await getJSXConfig(asset, isSource); - let flowConfig = getFlowConfig(asset, isSource); - - // Merge the babel-preset-env config and the babelrc if needed - if (babelrc && !shouldIgnoreBabelrc(asset.name, babelrc)) { - if (envConfig) { - // Filter out presets that are already applied by babel-preset-env - if (Array.isArray(babelrc.presets)) { - babelrc.presets = babelrc.presets.filter(preset => { - return !ENV_PRESETS[getPluginName(preset)]; - }); - } - - // Filter out plugins that are already applied by babel-preset-env - if (Array.isArray(babelrc.plugins)) { - babelrc.plugins = babelrc.plugins.filter(plugin => { - return !ENV_PLUGINS[getPluginName(plugin)]; - }); - } - - // Add plugins generated by babel-preset-env to get to the app's target engines. - mergeConfigs(babelrc, envConfig); - } - - // Add JSX config if it isn't already specified in the babelrc - let hasReact = - hasPlugin(babelrc.presets, 'react') || - hasPlugin(babelrc.plugins, 'transform-react-jsx'); - - if (!hasReact) { - mergeConfigs(babelrc, jsxConfig); - } - - // Add Flow stripping config if it isn't already specified in the babelrc - let hasFlow = hasPlugin(babelrc.plugins, 'transform-flow-strip-types'); - - if (!hasFlow && flowConfig) { - mergeConfigs(babelrc, flowConfig); - } - - return babelrc; - } - - // If there is a babel-preset-env config, and it isn't empty use that - if (envConfig && (envConfig.plugins.length > 0 || jsxConfig || flowConfig)) { - mergeConfigs(envConfig, jsxConfig); - mergeConfigs(envConfig, flowConfig); - - return envConfig; - } - - // If there is a JSX config, return that - if (jsxConfig) { - return jsxConfig; - } - - // If there is a Flow config, return that - if (flowConfig) { - return flowConfig; - } - - // Otherwise, don't run babel at all - return null; -} - -function mergeConfigs(a, b) { - if (b) { - a.presets = (a.presets || []).concat(b.presets || []); - a.plugins = (a.plugins || []).concat(b.plugins || []); - } - - return a; -} - -function hasPlugin(arr, plugin) { - return Array.isArray(arr) && arr.some(p => getPluginName(p) === plugin); -} - -function getPluginName(p) { - return Array.isArray(p) ? p[0] : p; -} - -/** - * Finds a .babelrc for an asset. By default, .babelrc files inside node_modules are not used. - * However, there are some exceptions: - * - if `browserify.transforms` includes "babelify" in package.json (for legacy module compat) - * - the `source` field in package.json is used by the resolver - */ -async function getBabelRc(asset, isSource) { - // Support legacy browserify packages - let pkg = await asset.getPackage(); - let browserify = pkg && pkg.browserify; - if (browserify && Array.isArray(browserify.transform)) { - // Look for babelify in the browserify transform list - let babelify = browserify.transform.find( - t => (Array.isArray(t) ? t[0] : t) === 'babelify' - ); - - // If specified as an array, override the config with the one specified - if (Array.isArray(babelify) && babelify[1]) { - return babelify[1]; - } - - // Otherwise, return the .babelrc if babelify was found - return babelify ? await findBabelRc(asset) : null; - } - - // If this asset is not in node_modules, always use the .babelrc - if (isSource) { - return await findBabelRc(asset); - } - - // Otherwise, don't load .babelrc for node_modules. - // See https://github.com/parcel-bundler/parcel/issues/13. - return null; -} - -async function findBabelRc(asset) { - return await asset.getConfig(['.babelrc', '.babelrc.js'], { - packageKey: 'babel' - }); -} - -function shouldIgnoreBabelrc(filename, babelrc) { - // Determine if we should ignore this babelrc file. We do this here instead of - // letting babel-core handle it because this config might be merged with our - // autogenerated one later which shouldn't be ignored. - let ignore = babelUtils.arrayify(babelrc.ignore, babelUtils.regexify); - let only = - babelrc.only && babelUtils.arrayify(babelrc.only, babelUtils.regexify); - return babelUtils.shouldIgnore(filename, ignore, only); -} - -/** - * Generates a babel-preset-env config for an asset. - * This is done by finding the source module's target engines, and the app's - * target engines, and doing a diff to include only the necessary plugins. - */ -async function getEnvConfig(asset, isSourceModule) { - // Load the target engines for the app and generate a babel-preset-env config - let targetEngines = await getTargetEngines(asset, true); - let targetEnv = await getEnvPlugins(targetEngines, true); - if (!targetEnv) { - return null; - } - - // If this is the app module, the source and target will be the same, so just compile everything. - // Otherwise, load the source engines and generate a babel-present-env config. - if (!isSourceModule) { - let sourceEngines = await getTargetEngines(asset, false); - let sourceEnv = (await getEnvPlugins(sourceEngines, false)) || targetEnv; - - // Do a diff of the returned plugins. We only need to process the remaining plugins to get to the app target. - let sourcePlugins = new Set(sourceEnv.map(p => p[0])); - targetEnv = targetEnv.filter(plugin => { - return !sourcePlugins.has(plugin[0]); - }); - } - - return {plugins: targetEnv, internal: true}; -} - -const envCache = new Map(); - -async function getEnvPlugins(targets, useBuiltIns = false) { - if (!targets) { - return null; - } - - let key = JSON.stringify(targets); - if (envCache.has(key)) { - return envCache.get(key); - } - - let plugins = presetEnv.default( - {}, - {targets, modules: false, useBuiltIns: useBuiltIns ? 'entry' : false} - ).plugins; - - // babel-preset-env version 6.x does not cover object-rest-spread so always - // add it. - plugins.push([ - require('babel-plugin-transform-object-rest-spread'), - {useBuiltIns} - ]); - - envCache.set(key, plugins); - return plugins; -} - -/** - * Generates a babel config for JSX. Attempts to detect react or react-like libraries - * and changes the pragma accordingly. - */ -async function getJSXConfig(asset, isSourceModule) { - // Don't enable JSX in node_modules - if (!isSourceModule) { - return null; - } - - let pkg = await asset.getPackage(); - - // Find a dependency that we can map to a JSX pragma - let pragma = null; - for (let dep in JSX_PRAGMA) { - if ( - pkg && - ((pkg.dependencies && pkg.dependencies[dep]) || - (pkg.devDependencies && pkg.devDependencies[dep])) - ) { - pragma = JSX_PRAGMA[dep]; - break; - } - } - - if (pragma || JSX_EXTENSIONS[path.extname(asset.name)]) { - return { - plugins: [[require('babel-plugin-transform-react-jsx'), {pragma}]], - internal: true - }; - } -} - -/** - * Generates a babel config for stripping away Flow types. - */ -function getFlowConfig(asset) { - if (/^(\/{2}|\/\*+) *@flow/.test(asset.contents.substring(0, 20))) { - return { - plugins: [[require('babel-plugin-transform-flow-strip-types')]], - internal: true - }; - } - - return null; -} diff --git a/packages/core/parcel/src/transforms/babel/astConverter.js b/packages/core/parcel/src/transforms/babel/astConverter.js new file mode 100644 index 00000000000..4d9a51bb2b2 --- /dev/null +++ b/packages/core/parcel/src/transforms/babel/astConverter.js @@ -0,0 +1,105 @@ +const traverse = require('@babel/traverse').default; + +// Convert between babel 7 and babel 6 AST +// More info on the AST Changes: https://babeljs.io/docs/en/v7-migration-api#ast-changes +function babel7toBabel6(ast) { + const visitor = { + ArrowFunctionExpression: node => { + node.expression = node.body.type !== 'BlockStatement'; + }, + ExistsTypeAnnotation: node => { + node.type = 'ExistentialTypeParam'; + }, + NumberLiteralTypeAnnotation: node => { + node.type = 'NumericLiteralTypeAnnotation'; + }, + ObjectTypeIndexer: node => { + node.end++; + node.loc.end.column++; + }, + ForOfStatement: node => { + node.type = 'ForAwaitStatement'; + delete node.await; + }, + SpreadElement: (node, path) => { + if ( + path.parentPath.isObjectExpression() || + path.parentPath.isArrayExpression() + ) { + node.type = 'SpreadProperty'; + } + }, + RestElement: (node, path) => { + if ( + path.parentPath.isObjectPattern() || + path.parentPath.isArrayPattern() + ) { + node.type = 'RestProperty'; + } + } + }; + + traverse(ast, { + enter(path) { + if (path.node.variance && path.node.variance.type === 'Variance') { + path.node.variance = path.node.variance.kind; + } + + let visitorFunc = visitor[path.node.type]; + if (visitorFunc) { + visitorFunc(path.node, path); + } + } + }); + + return ast; +} + +function babel6toBabel7(ast) { + const visitor = { + ArrowFunctionExpression: node => { + delete node.expression; + }, + ExistentialTypeParam: node => { + node.type = 'ExistsTypeAnnotation'; + }, + NumericLiteralTypeAnnotation: node => { + node.type = 'NumberLiteralTypeAnnotation'; + }, + ObjectTypeIndexer: node => { + node.end--; + node.loc.end.column--; + }, + ForAwaitStatement: node => { + node.type = 'ForOfStatement'; + node.await = true; + }, + SpreadProperty: node => { + node.type = 'SpreadElement'; + }, + RestProperty: node => { + node.type = 'RestElement'; + } + }; + + traverse(ast, { + enter(path) { + if (path.node.variance && typeof path.node.variance === 'string') { + path.node.variance = { + type: 'VarianceNode', + kind: path.node.variance + }; + } + + let visitorFunc = visitor[path.node.type]; + if (visitorFunc) { + visitorFunc(path.node); + } + } + }); + + return ast; +} + +exports.babel7toBabel6 = babel7toBabel6; +exports.babel6toBabel7 = babel6toBabel7; diff --git a/packages/core/parcel/src/transforms/babel/babel6.js b/packages/core/parcel/src/transforms/babel/babel6.js new file mode 100644 index 00000000000..45248176075 --- /dev/null +++ b/packages/core/parcel/src/transforms/babel/babel6.js @@ -0,0 +1,29 @@ +const localRequire = require('../../utils/localRequire'); +const {babel6toBabel7} = require('./astConverter'); + +async function babel6(asset, options) { + let babel = await localRequire('babel-core', asset.name); + + let config = options.config; + config.code = false; + config.ast = true; + config.filename = asset.name; + config.babelrc = false; + config.parserOpts = Object.assign({}, config.parserOpts, { + allowReturnOutsideFunction: true, + allowHashBang: true, + ecmaVersion: Infinity, + strictMode: false, + sourceType: 'module', + locations: true, + plugins: ['exportExtensions', 'dynamicImport'] + }); + + let res = babel.transform(asset.contents, config); + if (res.ast) { + asset.ast = babel6toBabel7(res.ast); + asset.isAstDirty = true; + } +} + +module.exports = babel6; diff --git a/packages/core/parcel/src/transforms/babel/babel7.js b/packages/core/parcel/src/transforms/babel/babel7.js new file mode 100644 index 00000000000..6a3f8e39409 --- /dev/null +++ b/packages/core/parcel/src/transforms/babel/babel7.js @@ -0,0 +1,40 @@ +const localRequire = require('../../utils/localRequire'); + +async function babel7(asset, options) { + let config = options.config; + + // If this is an internally generated config, use our internal @babel/core, + // otherwise require a local version from the package we're compiling. + let babel = options.internal + ? require('@babel/core') + : await localRequire('@babel/core', asset.name); + + let pkg = await asset.getPackage(); + + config.code = false; + config.ast = true; + config.filename = asset.name; + config.cwd = pkg ? pkg.pkgdir : asset.options.rootDir; + config.babelrc = false; + config.configFile = false; + config.parserOpts = Object.assign({}, config.parserOpts, { + allowReturnOutsideFunction: true, + strictMode: false, + sourceType: 'module', + plugins: ['exportDefaultFrom', 'exportNamespaceFrom', 'dynamicImport'] + }); + + let res; + if (asset.ast) { + res = babel.transformFromAst(asset.ast, asset.contents, config); + } else { + res = babel.transformSync(asset.contents, config); + } + + if (res.ast) { + asset.ast = res.ast; + asset.isAstDirty = true; + } +} + +module.exports = babel7; diff --git a/packages/core/parcel/src/transforms/babel/babelrc.js b/packages/core/parcel/src/transforms/babel/babelrc.js new file mode 100644 index 00000000000..0e7c8414ad4 --- /dev/null +++ b/packages/core/parcel/src/transforms/babel/babelrc.js @@ -0,0 +1,321 @@ +const semver = require('semver'); +const logger = require('../../logger'); +const path = require('path'); +const localRequire = require('../../utils/localRequire'); +const installPackage = require('../../utils/installPackage'); +const fs = require('../../utils/fs'); +const micromatch = require('micromatch'); + +async function getBabelConfig(asset, isSource) { + let config = await getBabelRc(asset, isSource); + if (!config) { + return null; + } + + // Ignore if the config is empty. + if ( + (!config.plugins || config.plugins.length === 0) && + (!config.presets || config.presets.length === 0) + ) { + return null; + } + + let plugins = await installPlugins(asset, config); + let babelVersion = await getBabelVersion(asset, plugins); + + return { + babelVersion, + config + }; +} + +module.exports = getBabelConfig; + +/** + * Finds a .babelrc for an asset. By default, .babelrc files inside node_modules are not used. + * However, there are some exceptions: + * - if `browserify.transforms` includes "babelify" in package.json (for legacy module compat) + * - the `source` field in package.json is used by the resolver + */ +async function getBabelRc(asset, isSource) { + // Support legacy browserify packages + let pkg = await asset.getPackage(); + let browserify = pkg && pkg.browserify; + if (browserify && Array.isArray(browserify.transform)) { + // Look for babelify in the browserify transform list + let babelify = browserify.transform.find( + t => (Array.isArray(t) ? t[0] : t) === 'babelify' + ); + + // If specified as an array, override the config with the one specified + if (Array.isArray(babelify) && babelify[1]) { + return babelify[1]; + } + + // Otherwise, return the .babelrc if babelify was found + return babelify ? await findBabelRc(asset) : null; + } + + // If this asset is not in node_modules, always use the .babelrc + if (isSource) { + return await findBabelRc(asset); + } + + // Otherwise, don't load .babelrc for node_modules. + // See https://github.com/parcel-bundler/parcel/issues/13. + return null; +} + +async function findBabelRc(asset) { + // TODO: use the babel API to do this config resolution and support all of its features. + // This is not currently possible because babel tries to actually load plugins and presets + // while resolving the config, but those plugins might not be installed yet. + let config = await asset.getConfig(['.babelrc', '.babelrc.js'], { + packageKey: 'babel' + }); + + if (!config) { + return null; + } + + if (typeof config === 'function') { + // We cannot support function configs since there is no exposed method in babel + // to create the API that is passed to them... + throw new Error( + 'Parcel does not support function configs in .babelrc.js yet.' + ); + } + + for (let key of ['extends', 'overrides', 'test', 'include', 'exclude']) { + if (config[key]) { + throw new Error( + `Parcel does not support babel 7 advanced configuration option "${key}" yet.` + ); + } + } + + // Support ignore/only config options. + if (shouldIgnore(asset, config)) { + return null; + } + + // Support .babelignore + let ignoreConfig = await getIgnoreConfig(asset); + if (ignoreConfig && shouldIgnore(asset, ignoreConfig)) { + return null; + } + + return config; +} + +async function getIgnoreConfig(asset) { + let ignoreFile = await asset.getConfig(['.babelignore'], { + load: false + }); + + if (!ignoreFile) { + return null; + } + + let data = await fs.readFile(ignoreFile, 'utf8'); + let patterns = data + .split('\n') + .map(line => line.replace(/#.*$/, '').trim()) + .filter(Boolean); + + return {ignore: patterns}; +} + +function shouldIgnore(asset, config) { + if (config.ignore && matchesPatterns(config.ignore, asset.name)) { + return true; + } + + if (config.only && !matchesPatterns(config.only, asset.name)) { + return true; + } + + return false; +} + +function matchesPatterns(patterns, path) { + return patterns.some(pattern => { + if (typeof pattern === 'function') { + return !!pattern(path); + } + + if (typeof pattern === 'string') { + return micromatch.isMatch(path, '**/' + pattern + '/**'); + } + + return pattern.test(path); + }); +} + +async function getBabelVersion(asset, plugins) { + // Check the package.json to determine the babel version that is installed + let pkg = await asset.getPackage(); + let babelLegacy = getDependency(pkg, 'babel-core'); + let babelModern = getDependency(pkg, '@babel/core'); + + if (babelModern) { + return getMaxMajor(babelModern); + } + + if (babelLegacy) { + return 6; + } + + // No version was installed. This is either an old app where we didn't require a version to be installed, + // or a new app that just added a .babelrc without manually installing a version of babel core. + // We will attempt to infer a verison of babel and install it based on the dependencies of the plugins + // in the config. This should only happen once since we save babel core into package.json for subsequent runs. + let inferred = await inferBabelVersion(asset, plugins); + let name = inferred === 6 ? 'babel-core' : `@babel/core`; + await installPackage(name, asset.name); + return inferred; +} + +function getDependency(pkg, dep) { + return ( + (pkg.dependencies && pkg.dependencies[dep]) || + (pkg.peerDependencies && pkg.peerDependencies[dep]) || + (pkg.devDependencies && pkg.devDependencies[dep]) + ); +} + +// Core babel packages we use to infer the major version of babel to use. +const CORE_DEPS = new Set([ + '@babel/core', + '@babel/runtime', + '@babel/template', + '@babel/traverse', + '@babel/types', + '@babel/parser', + '@babel/cli', + '@babel/register', + '@babel/generator', + 'babel-core', + 'babel-runtime', + 'babel-template', + 'babel-traverse', + 'babel-types', + 'babylon', + 'babel-cli', + 'babel-register', + 'babel-generator' +]); + +async function inferBabelVersion(asset, plugins) { + // Attempt to determine version based on dependencies of plugins + let version; + + for (let pkg of plugins) { + if (!pkg) { + continue; + } + + for (let name of CORE_DEPS) { + let dep = getDependency(pkg, name); + if (dep) { + // Parse version range (ignore prerelease), and ensure it overlaps with the existing version (if any) + let range = new semver.Range(dep.replace(/-.*(\s|\|\||$)?/, '')); + if (version && !version.intersects(range)) { + throw new Error( + 'Conflicting babel versions found in .babelrc. Make sure all of your plugins and presets depend on the same major version of babel.' + ); + } + + version = range; + break; + } + } + } + + // Find the maximum major version allowed in the range and use that. + // e.g. if ^6 || ^7 were specified, use 7. + version = getMaxMajor(version); + if (!version) { + logger.warn( + `Could not infer babel version. Defaulting to babel 7. Please add either babel-core or @babel/core as a dependency.` + ); + version = 7; + } + + return version; +} + +function getPluginName(p) { + return Array.isArray(p) ? p[0] : p; +} + +function getMaxMajor(version) { + try { + let range = new semver.Range(version); + let sorted = range.set.sort((a, b) => a[0].semver.compare(b[0].semver)); + return semver.major(sorted.pop()[0].semver.version); + } catch (err) { + return null; + } +} + +async function installPlugins(asset, babelrc) { + let presets = (babelrc.presets || []).map(p => + resolveModule('preset', getPluginName(p), asset.name) + ); + let plugins = (babelrc.plugins || []).map(p => + resolveModule('plugin', getPluginName(p), asset.name) + ); + return await Promise.all([...presets, ...plugins]); +} + +async function resolveModule(type, name, path) { + try { + name = standardizeName(type, name); + let [, pkg] = await localRequire.resolve(name, path); + return pkg; + } catch (err) { + return null; + } +} + +// Copied from https://github.com/babel/babel/blob/3a399d1eb907df520f2b85bf9ddbc6533e256f6d/packages/babel-core/src/config/files/plugins.js#L61 + +const EXACT_RE = /^module:/; +const BABEL_PLUGIN_PREFIX_RE = /^(?!@|module:|[^/]+\/|babel-plugin-)/; +const BABEL_PRESET_PREFIX_RE = /^(?!@|module:|[^/]+\/|babel-preset-)/; +const BABEL_PLUGIN_ORG_RE = /^(@babel\/)(?!plugin-|[^/]+\/)/; +const BABEL_PRESET_ORG_RE = /^(@babel\/)(?!preset-|[^/]+\/)/; +const OTHER_PLUGIN_ORG_RE = /^(@(?!babel\/)[^/]+\/)(?![^/]*babel-plugin(?:-|\/|$)|[^/]+\/)/; +const OTHER_PRESET_ORG_RE = /^(@(?!babel\/)[^/]+\/)(?![^/]*babel-preset(?:-|\/|$)|[^/]+\/)/; +const OTHER_ORG_DEFAULT_RE = /^(@(?!babel$)[^/]+)$/; + +function standardizeName(type, name) { + // Let absolute and relative paths through. + if (path.isAbsolute(name)) return name; + + const isPreset = type === 'preset'; + + return ( + name + // foo -> babel-preset-foo + .replace( + isPreset ? BABEL_PRESET_PREFIX_RE : BABEL_PLUGIN_PREFIX_RE, + `babel-${type}-` + ) + // @babel/es2015 -> @babel/preset-es2015 + .replace( + isPreset ? BABEL_PRESET_ORG_RE : BABEL_PLUGIN_ORG_RE, + `$1${type}-` + ) + // @foo/mypreset -> @foo/babel-preset-mypreset + .replace( + isPreset ? OTHER_PRESET_ORG_RE : OTHER_PLUGIN_ORG_RE, + `$1babel-${type}-` + ) + // @foo -> @foo/babel-preset + .replace(OTHER_ORG_DEFAULT_RE, `$1/babel-${type}`) + // module:mypreset -> mypreset + .replace(EXACT_RE, '') + ); +} diff --git a/packages/core/parcel/src/transforms/babel/config.js b/packages/core/parcel/src/transforms/babel/config.js new file mode 100644 index 00000000000..abffc73bc80 --- /dev/null +++ b/packages/core/parcel/src/transforms/babel/config.js @@ -0,0 +1,122 @@ +const getBabelRc = require('./babelrc'); +const getEnvConfig = require('./env'); +const getJSXConfig = require('./jsx'); +const getFlowConfig = require('./flow'); +const path = require('path'); +const fs = require('../../utils/fs'); + +const NODE_MODULES = `${path.sep}node_modules${path.sep}`; +const ENV_PLUGINS = require('@babel/preset-env/data/plugins'); +const ENV_PRESETS = { + es2015: true, + es2016: true, + es2017: true, + latest: true, + env: true, + '@babel/preset-env': true, + '@babel/env': true +}; + +async function getBabelConfig(asset) { + // Consider the module source code rather than precompiled if the resolver + // used the `source` field, or it is not in node_modules. + let pkg = await asset.getPackage(); + let isSource = + !!(pkg && pkg.source && (await fs.realpath(asset.name)) !== asset.name) || + !asset.name.includes(NODE_MODULES); + + // Try to resolve a .babelrc file. If one is found, consider the module source code. + let babelrc = await getBabelRc(asset, isSource); + isSource = isSource || !!babelrc; + + let envConfig = await getEnvConfig(asset, isSource); + let jsxConfig = await getJSXConfig(asset, isSource); + let flowConfig = getFlowConfig(asset, isSource); + + if (babelrc && envConfig) { + // Filter out presets that are already applied by @babel/preset-env + if (Array.isArray(babelrc.config.presets)) { + babelrc.config.presets = babelrc.config.presets.filter(preset => { + return !ENV_PRESETS[getPluginName(preset)]; + }); + } + + // Filter out plugins that are already applied by @babel/preset-env + if (Array.isArray(babelrc.config.plugins)) { + babelrc.config.plugins = babelrc.config.plugins.filter(plugin => { + return !ENV_PLUGINS[getPluginName(plugin)]; + }); + } + } + + let result = {}; + mergeConfigs(result, babelrc); + mergeConfigs(result, envConfig); + + // Add JSX config if it isn't already specified in the babelrc + let hasReact = + babelrc && + (hasPlugin(babelrc.config.presets, [ + 'react', + '@babel/react', + '@babel/preset-react' + ]) || + hasPlugin(babelrc.config.plugins, [ + 'transform-react-jsx', + '@babel/transform-react-jsx', + '@babel/plugin-transform-react-jsx' + ])); + + if (!hasReact) { + mergeConfigs(result, jsxConfig); + } + + // Add Flow stripping config if it isn't already specified in the babelrc + let hasFlow = + babelrc && + hasPlugin(babelrc.config.plugins, [ + 'transform-flow-strip-types', + '@babel/transform-flow-strip-types', + '@babel/plugin-transform-flow-strip-types' + ]); + + if (!hasFlow) { + mergeConfigs(result, flowConfig); + } + + return result; +} + +module.exports = getBabelConfig; + +function mergeConfigs(result, config) { + if ( + !config || + ((!config.config.presets || config.config.presets.length === 0) && + (!config.config.plugins || config.config.plugins.length === 0)) + ) { + return; + } + + let merged = result[config.babelVersion]; + if (merged) { + merged.config.presets = (merged.config.presets || []).concat( + config.config.presets || [] + ); + merged.config.plugins = (merged.config.plugins || []).concat( + config.config.plugins || [] + ); + } else { + result[config.babelVersion] = config; + } +} + +function hasPlugin(arr, plugins) { + return ( + Array.isArray(arr) && arr.some(p => plugins.includes(getPluginName(p))) + ); +} + +function getPluginName(p) { + return Array.isArray(p) ? p[0] : p; +} diff --git a/packages/core/parcel/src/transforms/babel/env.js b/packages/core/parcel/src/transforms/babel/env.js new file mode 100644 index 00000000000..a108b6bee30 --- /dev/null +++ b/packages/core/parcel/src/transforms/babel/env.js @@ -0,0 +1,65 @@ +const presetEnv = require('@babel/preset-env'); +const getTargetEngines = require('../../utils/getTargetEngines'); + +/** + * Generates a @babel/preset-env config for an asset. + * This is done by finding the source module's target engines, and the app's + * target engines, and doing a diff to include only the necessary plugins. + */ +async function getEnvConfig(asset, isSourceModule) { + // Load the target engines for the app and generate a @babel/preset-env config + let targetEngines = await getTargetEngines(asset, true); + let targetEnv = await getEnvPlugins(targetEngines, true); + if (!targetEnv) { + return null; + } + + // If this is the app module, the source and target will be the same, so just compile everything. + // Otherwise, load the source engines and generate a babel-present-env config. + if (!isSourceModule) { + let sourceEngines = await getTargetEngines(asset, false); + let sourceEnv = (await getEnvPlugins(sourceEngines, false)) || targetEnv; + + // Do a diff of the returned plugins. We only need to process the remaining plugins to get to the app target. + let sourcePlugins = new Set(sourceEnv.map(p => p[0])); + targetEnv = targetEnv.filter(plugin => { + return !sourcePlugins.has(plugin[0]); + }); + } + + return { + internal: true, + babelVersion: 7, + config: { + plugins: targetEnv + } + }; +} + +const envCache = new Map(); + +async function getEnvPlugins(targets, useBuiltIns = false) { + if (!targets) { + return null; + } + + let key = JSON.stringify(targets); + if (envCache.has(key)) { + return envCache.get(key); + } + + let plugins = presetEnv.default( + {assertVersion: () => true}, + { + targets, + modules: false, + useBuiltIns: useBuiltIns ? 'entry' : false, + shippedProposals: true + } + ).plugins; + + envCache.set(key, plugins); + return plugins; +} + +module.exports = getEnvConfig; diff --git a/packages/core/parcel/src/transforms/babel/flow.js b/packages/core/parcel/src/transforms/babel/flow.js new file mode 100644 index 00000000000..dea1768061e --- /dev/null +++ b/packages/core/parcel/src/transforms/babel/flow.js @@ -0,0 +1,18 @@ +/** + * Generates a babel config for stripping away Flow types. + */ +function getFlowConfig(asset) { + if (/^(\/{2}|\/\*+) *@flow/.test(asset.contents.substring(0, 20))) { + return { + internal: true, + babelVersion: 7, + config: { + plugins: [[require('@babel/plugin-transform-flow-strip-types')]] + } + }; + } + + return null; +} + +module.exports = getFlowConfig; diff --git a/packages/core/parcel/src/transforms/babel/jsx.js b/packages/core/parcel/src/transforms/babel/jsx.js new file mode 100644 index 00000000000..de4ceb70210 --- /dev/null +++ b/packages/core/parcel/src/transforms/babel/jsx.js @@ -0,0 +1,51 @@ +const path = require('path'); + +const JSX_EXTENSIONS = { + '.jsx': true, + '.tsx': true +}; + +const JSX_PRAGMA = { + react: 'React.createElement', + preact: 'h', + nervjs: 'Nerv.createElement', + hyperapp: 'h' +}; + +/** + * Generates a babel config for JSX. Attempts to detect react or react-like libraries + * and changes the pragma accordingly. + */ +async function getJSXConfig(asset, isSourceModule) { + // Don't enable JSX in node_modules + if (!isSourceModule) { + return null; + } + + let pkg = await asset.getPackage(); + + // Find a dependency that we can map to a JSX pragma + let pragma = null; + for (let dep in JSX_PRAGMA) { + if ( + pkg && + ((pkg.dependencies && pkg.dependencies[dep]) || + (pkg.devDependencies && pkg.devDependencies[dep])) + ) { + pragma = JSX_PRAGMA[dep]; + break; + } + } + + if (pragma || JSX_EXTENSIONS[path.extname(asset.name)]) { + return { + internal: true, + babelVersion: 7, + config: { + plugins: [[require('@babel/plugin-transform-react-jsx'), {pragma}]] + } + }; + } +} + +module.exports = getJSXConfig; diff --git a/packages/core/parcel/src/transforms/babel/transform.js b/packages/core/parcel/src/transforms/babel/transform.js new file mode 100644 index 00000000000..12bd5173aa3 --- /dev/null +++ b/packages/core/parcel/src/transforms/babel/transform.js @@ -0,0 +1,19 @@ +const babel6 = require('./babel6'); +const babel7 = require('./babel7'); +const getBabelConfig = require('./config'); + +async function babelTransform(asset) { + let config = await getBabelConfig(asset); + + if (config[6]) { + await babel6(asset, config[6]); + } + + if (config[7]) { + await babel7(asset, config[7]); + } + + return asset.ast; +} + +module.exports = babelTransform; diff --git a/packages/core/parcel/src/utils/getTargetEngines.js b/packages/core/parcel/src/utils/getTargetEngines.js index 24f6f9e9fd0..0571b289ad9 100644 --- a/packages/core/parcel/src/utils/getTargetEngines.js +++ b/packages/core/parcel/src/utils/getTargetEngines.js @@ -12,7 +12,7 @@ const DEFAULT_ENGINES = { * - package.json engines field * - package.json browserslist field * - browserslist or .browserslistrc files - * - .babelrc or .babelrc.js files with babel-preset-env + * - .babelrc or .babelrc.js files with @babel/preset-env */ async function getTargetEngines(asset, isTargetApp) { let targets = {}; diff --git a/packages/core/parcel/src/utils/installPackage.js b/packages/core/parcel/src/utils/installPackage.js index e6595d20df1..6c9fb3462e4 100644 --- a/packages/core/parcel/src/utils/installPackage.js +++ b/packages/core/parcel/src/utils/installPackage.js @@ -7,9 +7,13 @@ const pipeSpawn = require('./pipeSpawn'); const PromiseQueue = require('./PromiseQueue'); const path = require('path'); const fs = require('./fs'); +const WorkerFarm = require('../workerfarm/WorkerFarm'); async function install(modules, filepath, options = {}) { let {installPeers = true, saveDev = true, packageManager} = options; + if (typeof modules === 'string') { + modules = [modules]; + } logger.progress(`Installing ${modules.join(', ')}...`); @@ -99,7 +103,17 @@ async function checkForYarnCommand() { } let queue = new PromiseQueue(install, {maxConcurrent: 1, retry: false}); -module.exports = function(...args) { +module.exports = async function(...args) { + // Ensure that this function is always called on the master process so we + // don't call multiple installs in parallel. + if (WorkerFarm.isWorker()) { + await WorkerFarm.callMaster({ + location: __filename, + args + }); + return; + } + queue.add(...args); return queue.run(); }; diff --git a/packages/core/parcel/src/utils/localRequire.js b/packages/core/parcel/src/utils/localRequire.js index a7e2f1a3fb0..a34e6e84c57 100644 --- a/packages/core/parcel/src/utils/localRequire.js +++ b/packages/core/parcel/src/utils/localRequire.js @@ -1,31 +1,34 @@ const {dirname} = require('path'); const promisify = require('../utils/promisify'); const resolve = promisify(require('resolve')); -const WorkerFarm = require('../workerfarm/WorkerFarm'); +const installPackage = require('./installPackage'); const cache = new Map(); async function localRequire(name, path, triedInstall = false) { + let [resolved] = await localResolve(name, path, triedInstall); + return require(resolved); +} + +async function localResolve(name, path, triedInstall = false) { let basedir = dirname(path); let key = basedir + ':' + name; let resolved = cache.get(key); if (!resolved) { try { - resolved = await resolve(name, {basedir}).then(([name]) => name); + resolved = await resolve(name, {basedir}); } catch (e) { if (e.code === 'MODULE_NOT_FOUND' && !triedInstall) { - await WorkerFarm.callMaster({ - location: require.resolve('./installPackage.js'), - args: [[name], path] - }); - return localRequire(name, path, true); + await installPackage(name, path); + return await localResolve(name, path, true); } throw e; } cache.set(key, resolved); } - return require(resolved); + return resolved; } +localRequire.resolve = localResolve; module.exports = localRequire; diff --git a/packages/core/parcel/src/utils/pipeSpawn.js b/packages/core/parcel/src/utils/pipeSpawn.js index 823cbf9ac6e..b5fda80799e 100644 --- a/packages/core/parcel/src/utils/pipeSpawn.js +++ b/packages/core/parcel/src/utils/pipeSpawn.js @@ -13,7 +13,8 @@ function pipeSpawn(cmd, params, opts) { npm_config_color: logger.color ? 'always' : '', npm_config_progress: true }, - process.env + process.env, + {NODE_ENV: null} // Passing NODE_ENV through causes strange issues with yarn ) }, opts diff --git a/packages/core/parcel/src/visitors/dependencies.js b/packages/core/parcel/src/visitors/dependencies.js index 635d9ae962b..a3eabbf26e6 100644 --- a/packages/core/parcel/src/visitors/dependencies.js +++ b/packages/core/parcel/src/visitors/dependencies.js @@ -1,9 +1,8 @@ -const types = require('babel-types'); -const template = require('babel-template'); -const traverse = require('babel-traverse').default; +const types = require('@babel/types'); +const template = require('@babel/template').default; +const traverse = require('@babel/traverse').default; const urlJoin = require('../utils/urlJoin'); const isURL = require('../utils/is-url'); -const matchesPattern = require('./matches-pattern'); const nodeBuiltins = require('node-libs-browser'); const requireTemplate = template('require("_bundle_loader")'); @@ -66,7 +65,7 @@ module.exports = { const isRegisterServiceWorker = types.isStringLiteral(args[0]) && - matchesPattern(callee, serviceWorkerPattern); + types.matchesPattern(callee, serviceWorkerPattern); if (isRegisterServiceWorker) { // Treat service workers as an entry point so filenames remain consistent across builds. diff --git a/packages/core/parcel/src/visitors/env.js b/packages/core/parcel/src/visitors/env.js index b34ae7cfd38..295c654cfc9 100644 --- a/packages/core/parcel/src/visitors/env.js +++ b/packages/core/parcel/src/visitors/env.js @@ -1,10 +1,9 @@ -const types = require('babel-types'); -const matchesPattern = require('./matches-pattern'); +const types = require('@babel/types'); module.exports = { MemberExpression(node, asset) { // Inline environment variables accessed on process.env - if (matchesPattern(node.object, 'process.env')) { + if (types.matchesPattern(node.object, 'process.env')) { let key = types.toComputedKey(node); if (types.isStringLiteral(key)) { let prop = process.env[key.value]; diff --git a/packages/core/parcel/src/visitors/fs.js b/packages/core/parcel/src/visitors/fs.js index e49452e4c3c..46f121d501c 100644 --- a/packages/core/parcel/src/visitors/fs.js +++ b/packages/core/parcel/src/visitors/fs.js @@ -1,7 +1,7 @@ -const t = require('babel-types'); +const t = require('@babel/types'); const Path = require('path'); const fs = require('fs'); -const template = require('babel-template'); +const template = require('@babel/template').default; const logger = require('../Logger'); const bufferTemplate = template('Buffer(CONTENT, ENC)'); diff --git a/packages/core/parcel/src/visitors/globals.js b/packages/core/parcel/src/visitors/globals.js index b947081950a..598f4f3dfa2 100644 --- a/packages/core/parcel/src/visitors/globals.js +++ b/packages/core/parcel/src/visitors/globals.js @@ -1,5 +1,5 @@ const Path = require('path'); -const types = require('babel-types'); +const types = require('@babel/types'); const VARS = { process: asset => { diff --git a/packages/core/parcel/src/visitors/matches-pattern.js b/packages/core/parcel/src/visitors/matches-pattern.js deleted file mode 100644 index e1dbbb113e5..00000000000 --- a/packages/core/parcel/src/visitors/matches-pattern.js +++ /dev/null @@ -1,36 +0,0 @@ -const types = require('babel-types'); - -// from babel-types. remove when we upgrade to babel 7. -// https://github.com/babel/babel/blob/0189b387026c35472dccf45d14d58312d249f799/packages/babel-types/src/index.js#L347 -module.exports = function matchesPattern(member, match, allowPartial) { - // not a member expression - if (!types.isMemberExpression(member)) return false; - - const parts = Array.isArray(match) ? match : match.split('.'); - const nodes = []; - - let node; - for (node = member; types.isMemberExpression(node); node = node.object) { - nodes.push(node.property); - } - nodes.push(node); - - if (nodes.length < parts.length) return false; - if (!allowPartial && nodes.length > parts.length) return false; - - for (let i = 0, j = nodes.length - 1; i < parts.length; i++, j--) { - const node = nodes[j]; - let value; - if (types.isIdentifier(node)) { - value = node.name; - } else if (types.isStringLiteral(node)) { - value = node.value; - } else { - return false; - } - - if (parts[i] !== value) return false; - } - - return true; -}; diff --git a/packages/core/parcel/test/.babelrc b/packages/core/parcel/test/.babelrc index 89eaace66ad..4465e6da664 100644 --- a/packages/core/parcel/test/.babelrc +++ b/packages/core/parcel/test/.babelrc @@ -1,8 +1,9 @@ { - "presets": [["env", { + "presets": [["@babel/preset-env", { "targets": { "node": "current" } }]], - "ignore": ["integration", "input"] + "plugins": ["@babel/plugin-transform-runtime"], + "ignore": ["integration", "input", "dist"] } diff --git a/packages/core/parcel/test/babel-register.js b/packages/core/parcel/test/babel-register.js index acd9f619def..881ee3dd2f6 100644 --- a/packages/core/parcel/test/babel-register.js +++ b/packages/core/parcel/test/babel-register.js @@ -1,3 +1,3 @@ if (parseInt(process.versions.node, 10) < 8) { - require('babel-register'); + require('@babel/register'); } diff --git a/packages/core/parcel/test/babel.js b/packages/core/parcel/test/babel.js new file mode 100644 index 00000000000..8ebedb1d75a --- /dev/null +++ b/packages/core/parcel/test/babel.js @@ -0,0 +1,131 @@ +const babelCore = require('@babel/core'); +const fs = require('../src/utils/fs'); +const { + babel6toBabel7, + babel7toBabel6 +} = require('../src/transforms/babel/astConverter'); +const path = require('path'); +const BabelFlowPreset = require('@babel/preset-flow'); +const babelPresetEnv = require('@babel/preset-env'); +const traverse = require('@babel/traverse').default; +const assert = require('assert'); + +describe('babel', function() { + let ast; + before(async function() { + const options = { + parserOpts: { + allowReturnOutsideFunction: true, + allowHashBang: true, + ecmaVersion: Infinity, + strictMode: false, + sourceType: 'module', + locations: true, + tokens: true + }, + presets: [BabelFlowPreset, babelPresetEnv] + }; + + let code = await fs.readFile( + path.join(__dirname, './integration/babel-ast-conversion/index.js'), + 'utf8' + ); + + ast = babelCore.parse(code, options); + }); + + it('Should be able to convert Babel 7 => Babel 6 AST', async function() { + ast = babel7toBabel6(ast); + + let elementCount = {}; + traverse(ast, { + enter(path) { + if (!elementCount[path.node.type]) { + elementCount[path.node.type] = 0; + } + elementCount[path.node.type]++; + + if (path.node.variance) { + assert(!path.node.variance.kind); + } + + if (path.node.type === 'ForAwaitStatement') { + assert(!path.node.await); + } + + if (path.node.type === 'ArrowFunctionExpression') { + assert(path.node.expression !== undefined); + } + } + }); + + // Check Renaming/Removal of Nodes + assert.equal(elementCount['ExistsTypeAnnotation'], undefined); + assert.equal(elementCount['ExistentialTypeParam'], 1); + + assert.equal(elementCount['NumberLiteralTypeAnnotation'], undefined); + assert.equal(elementCount['NumericLiteralTypeAnnotation'], 1); + + assert.equal(elementCount['ForOfStatement'], undefined); + assert.equal(elementCount['ForAwaitStatement'], 1); + + assert.equal(elementCount['SpreadElement'], undefined); + assert.equal(elementCount['SpreadProperty'], 2); + + assert.equal(elementCount['RestElement'], undefined); + assert.equal(elementCount['RestProperty'], 2); + + // Check node count + assert.equal(elementCount['TypeParameter'], 6); + + assert.equal(elementCount['ArrowFunctionExpression'], 2); + }); + + it('Should be able to convert Babel 6 => Babel 7 AST', async function() { + ast = babel6toBabel7(ast); + + let elementCount = {}; + traverse(ast, { + enter(path) { + if (!elementCount[path.node.type]) { + elementCount[path.node.type] = 0; + } + elementCount[path.node.type]++; + + if (path.node.variance) { + assert(!!path.node.variance.kind); + assert.equal(path.node.variance.type, 'VarianceNode'); + } + + if (path.node.type === 'ForOfStatement') { + assert(path.node.await); + } + + if (path.node.type === 'ArrowFunctionExpression') { + assert(path.node.expression === undefined); + } + } + }); + + // Check Renaming/Removal of Nodes + assert.equal(elementCount['ExistsTypeAnnotation'], 1); + assert.equal(elementCount['ExistentialTypeParam'], undefined); + + assert.equal(elementCount['NumberLiteralTypeAnnotation'], 1); + assert.equal(elementCount['NumericLiteralTypeAnnotation'], undefined); + + assert.equal(elementCount['ForOfStatement'], 1); + assert.equal(elementCount['ForAwaitStatement'], undefined); + + assert.equal(elementCount['SpreadElement'], 2); + assert.equal(elementCount['SpreadProperty'], undefined); + + assert.equal(elementCount['RestElement'], 2); + assert.equal(elementCount['RestProperty'], undefined); + + // Check node count + assert.equal(elementCount['TypeParameter'], 6); + + assert.equal(elementCount['ArrowFunctionExpression'], 2); + }); +}); diff --git a/packages/core/parcel/test/hmr.js b/packages/core/parcel/test/hmr.js index 776aae39cf0..11acfba2ca1 100644 --- a/packages/core/parcel/test/hmr.js +++ b/packages/core/parcel/test/hmr.js @@ -168,11 +168,11 @@ describe('hmr', function() { `${path.join( __dirname, '/input/local.js' - )}:1:12: Unexpected token, expected , (1:12)` + )}:1:12: Unexpected token, expected "," (1:12)` ); assert.equal( msg.error.stack, - '> 1 | require("fs"; exports.a = 5; exports.b = 5;\n | ^' + '> 1 | require("fs"; exports.a = 5; exports.b = 5;\n | ^' ); await buildEnd; diff --git a/packages/core/parcel/test/integration/babel-6-autoinstall/.babelrc b/packages/core/parcel/test/integration/babel-6-autoinstall/.babelrc new file mode 100644 index 00000000000..002b4aa0d58 --- /dev/null +++ b/packages/core/parcel/test/integration/babel-6-autoinstall/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["env"] +} diff --git a/packages/core/parcel/test/integration/babel-6-autoinstall/index.js b/packages/core/parcel/test/integration/babel-6-autoinstall/index.js new file mode 100644 index 00000000000..9e0528522b0 --- /dev/null +++ b/packages/core/parcel/test/integration/babel-6-autoinstall/index.js @@ -0,0 +1,3 @@ +export default function () { + return 3; +} diff --git a/packages/core/parcel/test/integration/babel-6-autoinstall/package.json b/packages/core/parcel/test/integration/babel-6-autoinstall/package.json new file mode 100644 index 00000000000..c60911d3b62 --- /dev/null +++ b/packages/core/parcel/test/integration/babel-6-autoinstall/package.json @@ -0,0 +1,3 @@ +{ + "name": "babel-6-autoinstall" +} diff --git a/packages/core/parcel/test/integration/babel-6-compatibility/.babelrc b/packages/core/parcel/test/integration/babel-6-compatibility/.babelrc new file mode 100644 index 00000000000..002b4aa0d58 --- /dev/null +++ b/packages/core/parcel/test/integration/babel-6-compatibility/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["env"] +} diff --git a/packages/core/parcel/test/integration/babel-6-compatibility/index.js b/packages/core/parcel/test/integration/babel-6-compatibility/index.js new file mode 100644 index 00000000000..9e0528522b0 --- /dev/null +++ b/packages/core/parcel/test/integration/babel-6-compatibility/index.js @@ -0,0 +1,3 @@ +export default function () { + return 3; +} diff --git a/packages/core/parcel/test/integration/babel-6-compatibility/package.json b/packages/core/parcel/test/integration/babel-6-compatibility/package.json new file mode 100644 index 00000000000..4c4dd6414ed --- /dev/null +++ b/packages/core/parcel/test/integration/babel-6-compatibility/package.json @@ -0,0 +1,6 @@ +{ + "name": "babel-6-compatibility", + "devDependencies": { + "babel-core": "^6.26.3" + } +} diff --git a/packages/core/parcel/test/integration/babel-7-autoinstall/.babelrc b/packages/core/parcel/test/integration/babel-7-autoinstall/.babelrc new file mode 100644 index 00000000000..0ef5ffc2144 --- /dev/null +++ b/packages/core/parcel/test/integration/babel-7-autoinstall/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["@babel/env"] +} diff --git a/packages/core/parcel/test/integration/babel-7-autoinstall/index.js b/packages/core/parcel/test/integration/babel-7-autoinstall/index.js new file mode 100644 index 00000000000..9e0528522b0 --- /dev/null +++ b/packages/core/parcel/test/integration/babel-7-autoinstall/index.js @@ -0,0 +1,3 @@ +export default function () { + return 3; +} diff --git a/packages/core/parcel/test/integration/babel-7-autoinstall/package.json b/packages/core/parcel/test/integration/babel-7-autoinstall/package.json new file mode 100644 index 00000000000..ee223ad4137 --- /dev/null +++ b/packages/core/parcel/test/integration/babel-7-autoinstall/package.json @@ -0,0 +1,3 @@ +{ + "name": "babel-7-autoinstall" +} diff --git a/packages/core/parcel/test/integration/babel-ast-conversion/index.js b/packages/core/parcel/test/integration/babel-ast-conversion/index.js new file mode 100644 index 00000000000..fb8f4fb3c9a --- /dev/null +++ b/packages/core/parcel/test/integration/babel-ast-conversion/index.js @@ -0,0 +1,29 @@ +// @flow + +type T = 0; +type A = B<*>; + +const hello = () => { + return 'this is an arrow function'; +}; + +async () => { + for await (i of []) { + // Do something I guess... + } +} + +let { x, y, ...c } = obj; +let [...l] = something; + +let helloSpread = {...{ + one: 1 +}} + +let helloArray = [...[]]; + +var a: { [a: number]: string; }; + +class C<+T,-U> {} +function f<+T,-U>() {} +type T<+T,-U> = {} \ No newline at end of file diff --git a/packages/core/parcel/test/integration/babel-node-modules-browserify/node_modules/foo/package.json b/packages/core/parcel/test/integration/babel-node-modules-browserify/node_modules/foo/package.json index 5ebd6f0e494..6e9c1a02dff 100644 --- a/packages/core/parcel/test/integration/babel-node-modules-browserify/node_modules/foo/package.json +++ b/packages/core/parcel/test/integration/babel-node-modules-browserify/node_modules/foo/package.json @@ -4,5 +4,8 @@ "transform": [ "babelify" ] + }, + "devDependencies": { + "babel-core": "^6.26.3" } } diff --git a/packages/core/parcel/test/integration/babel-plugin-autoinstall/.babelrc b/packages/core/parcel/test/integration/babel-plugin-autoinstall/.babelrc new file mode 100644 index 00000000000..6fd4bf184d6 --- /dev/null +++ b/packages/core/parcel/test/integration/babel-plugin-autoinstall/.babelrc @@ -0,0 +1,3 @@ +{ + "plugins": ["@babel/proposal-class-properties"] +} diff --git a/packages/core/parcel/test/integration/babel-plugin-autoinstall/index.js b/packages/core/parcel/test/integration/babel-plugin-autoinstall/index.js new file mode 100644 index 00000000000..9e0528522b0 --- /dev/null +++ b/packages/core/parcel/test/integration/babel-plugin-autoinstall/index.js @@ -0,0 +1,3 @@ +export default function () { + return 3; +} diff --git a/packages/core/parcel/test/integration/babel-plugin-autoinstall/package.json b/packages/core/parcel/test/integration/babel-plugin-autoinstall/package.json new file mode 100644 index 00000000000..f6e1215bef5 --- /dev/null +++ b/packages/core/parcel/test/integration/babel-plugin-autoinstall/package.json @@ -0,0 +1,3 @@ +{ + "name": "babel-plugin-autoinstall" +} diff --git a/packages/core/parcel/test/integration/babel-polyfill/.eslintrc.json b/packages/core/parcel/test/integration/babel-polyfill/.eslintrc similarity index 100% rename from packages/core/parcel/test/integration/babel-polyfill/.eslintrc.json rename to packages/core/parcel/test/integration/babel-polyfill/.eslintrc diff --git a/packages/core/parcel/test/integration/babel-polyfill/index.js b/packages/core/parcel/test/integration/babel-polyfill/index.js index b126e3d152f..6dc46a04259 100644 --- a/packages/core/parcel/test/integration/babel-polyfill/index.js +++ b/packages/core/parcel/test/integration/babel-polyfill/index.js @@ -1,3 +1,3 @@ -import 'babel-polyfill'; +import '@babel/polyfill'; export async function Bar() {} diff --git a/packages/core/parcel/test/integration/babel-polyfill/package.json b/packages/core/parcel/test/integration/babel-polyfill/package.json index 9f80ea9f95c..c2f78bd89e6 100644 --- a/packages/core/parcel/test/integration/babel-polyfill/package.json +++ b/packages/core/parcel/test/integration/babel-polyfill/package.json @@ -1,5 +1,7 @@ { "name": "parcel-test-babel-polyfill-browserslist", "private": true, - "browserslist": ["last 2 Chrome versions"] + "browserslist": [ + "last 2 Chrome versions" + ] } diff --git a/packages/core/parcel/test/integration/babel/.babelrc b/packages/core/parcel/test/integration/babel/.babelrc index 15edf6beb98..60953341055 100644 --- a/packages/core/parcel/test/integration/babel/.babelrc +++ b/packages/core/parcel/test/integration/babel/.babelrc @@ -1,5 +1,5 @@ { - "presets": [["env", { + "presets": [["@babel/env", { "targets": { "browsers": ["last 2 Chrome versions"] } diff --git a/packages/core/parcel/test/javascript.js b/packages/core/parcel/test/javascript.js index aef22a52c9b..a8bf576be66 100644 --- a/packages/core/parcel/test/javascript.js +++ b/packages/core/parcel/test/javascript.js @@ -28,6 +28,89 @@ describe('javascript', function() { assert.equal(output.default(), 3); }); + it('should produce a basic JS bundle using Babel 6', async function() { + let b = await bundle( + __dirname + '/integration/babel-6-compatibility/index.js' + ); + + let output = await run(b); + assert.equal(typeof output, 'object'); + assert.equal(typeof output.default, 'function'); + assert.equal(output.default(), 3); + }); + + it('should auto install babel-core v6', async function() { + let originalPkg = await fs.readFile( + __dirname + '/integration/babel-6-autoinstall/package.json' + ); + let b = await bundle( + __dirname + '/integration/babel-6-autoinstall/index.js' + ); + + let output = await run(b); + assert.equal(typeof output, 'object'); + assert.equal(typeof output.default, 'function'); + assert.equal(output.default(), 3); + + let pkg = await fs.readFile( + __dirname + '/integration/babel-6-autoinstall/package.json' + ); + assert(JSON.parse(pkg).devDependencies['babel-core']); + await fs.writeFile( + __dirname + '/integration/babel-6-autoinstall/package.json', + originalPkg + ); + }); + + it('should auto install @babel/core v7', async function() { + let originalPkg = await fs.readFile( + __dirname + '/integration/babel-7-autoinstall/package.json' + ); + let b = await bundle( + __dirname + '/integration/babel-7-autoinstall/index.js' + ); + + let output = await run(b); + assert.equal(typeof output, 'object'); + assert.equal(typeof output.default, 'function'); + assert.equal(output.default(), 3); + + let pkg = await fs.readFile( + __dirname + '/integration/babel-7-autoinstall/package.json' + ); + assert(JSON.parse(pkg).devDependencies['@babel/core']); + await fs.writeFile( + __dirname + '/integration/babel-7-autoinstall/package.json', + originalPkg + ); + }); + + it('should auto install babel plugins', async function() { + let originalPkg = await fs.readFile( + __dirname + '/integration/babel-plugin-autoinstall/package.json' + ); + let b = await bundle( + __dirname + '/integration/babel-plugin-autoinstall/index.js' + ); + + let output = await run(b); + assert.equal(typeof output, 'object'); + assert.equal(typeof output.default, 'function'); + assert.equal(output.default(), 3); + + let pkg = await fs.readFile( + __dirname + '/integration/babel-plugin-autoinstall/package.json' + ); + assert(JSON.parse(pkg).devDependencies['@babel/core']); + assert( + JSON.parse(pkg).devDependencies['@babel/plugin-proposal-class-properties'] + ); + await fs.writeFile( + __dirname + '/integration/babel-plugin-autoinstall/package.json', + originalPkg + ); + }); + it('should produce a basic JS bundle with object rest spread support', async function() { let b = await bundle( __dirname + '/integration/object-rest-spread/object-rest-spread.js' @@ -1282,8 +1365,7 @@ describe('javascript', function() { }, { type: 'css', - assets: ['index.css'], - childBundles: [] + assets: ['index.css'] } ] } @@ -1325,8 +1407,7 @@ describe('javascript', function() { }, { type: 'css', - assets: ['index.css'], - childBundles: [] + assets: ['index.css'] } ] } @@ -1364,8 +1445,7 @@ describe('javascript', function() { }, { type: 'css', - assets: ['index.css'], - childBundles: [] + assets: ['index.css'] } ] } diff --git a/yarn.lock b/yarn.lock index e54a931ccca..009d3b60df9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,12 +2,214 @@ # yarn lockfile v1 +"@babel/cli@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.0.0.tgz#108b395fd43fff6681d36fb41274df4d8ffeb12e" + dependencies: + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.1.0" + glob "^7.0.0" + lodash "^4.17.10" + mkdirp "^0.5.1" + output-file-sync "^2.0.0" + slash "^2.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^2.0.3" + +"@babel/code-frame@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" + dependencies: + "@babel/highlight" "^7.0.0" + "@babel/code-frame@^7.0.0-beta.35": version "7.0.0-beta.46" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.46.tgz#e0d002100805daab1461c0fcb32a07e304f3a4f4" dependencies: "@babel/highlight" "7.0.0-beta.46" +"@babel/core@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.0.0.tgz#0cb0c0fd2e78a0a2bec97698f549ae9ce0b99515" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/helpers" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + convert-source-map "^1.1.0" + debug "^3.1.0" + json5 "^0.5.0" + lodash "^4.17.10" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + +"@babel/generator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0.tgz#1efd58bffa951dc846449e58ce3a1d7f02d393aa" + dependencies: + "@babel/types" "^7.0.0" + jsesc "^2.5.1" + lodash "^4.17.10" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.0.0.tgz#ba26336beb2abb547d58b6eba5b84d77975a39eb" + dependencies: + "@babel/helper-explode-assignable-expression" "^7.0.0" + "@babel/types" "^7.0.0" + +"@babel/helper-builder-react-jsx@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.0.0.tgz#fa154cb53eb918cf2a9a7ce928e29eb649c5acdb" + dependencies: + "@babel/types" "^7.0.0" + esutils "^2.0.0" + +"@babel/helper-call-delegate@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.0.0.tgz#e036956bb33d76e59c07a04a1fff144e9f62ab78" + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + +"@babel/helper-define-map@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.0.0.tgz#a5684dd2adf30f0137cf9b0bde436f8c2db17225" + dependencies: + "@babel/helper-function-name" "^7.0.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-explode-assignable-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.0.0.tgz#fdfa4c88603ae3e954d0fc3244d5ca82fb468497" + dependencies: + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + +"@babel/helper-function-name@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0.tgz#a68cc8d04420ccc663dd258f9cc41b8261efa2d4" + dependencies: + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/types" "^7.0.0" + +"@babel/helper-get-function-arity@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-hoist-variables@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0.tgz#b01ee7d543e81e8c3fc404b19c9f26acb6e4cf4c" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.0.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + +"@babel/helper-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" + dependencies: + lodash "^4.17.10" + +"@babel/helper-remap-async-to-generator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.0.0.tgz#6512273c2feb91587822335cf913fdf680c26901" + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0.tgz#b6f21237280e0be54f591f63a464b66627ced707" + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + +"@babel/helper-simple-access@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.0.0.tgz#ff36a27983ae4c27122da2f7f294dced80ecbd08" + dependencies: + "@babel/template" "^7.0.0" + "@babel/types" "^7.0.0" + +"@babel/helper-split-export-declaration@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-wrap-function@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.0.0.tgz#1c8e42a2cfb0808e3140189dfe9490782a6fa740" + dependencies: + "@babel/helper-function-name" "^7.0.0" + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + +"@babel/helpers@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.0.0.tgz#7213388341eeb07417f44710fd7e1d00acfa6ac0" + dependencies: + "@babel/template" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + "@babel/highlight@7.0.0-beta.46": version "7.0.0-beta.46" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.46.tgz#c553c51e65f572bdedd6eff66fc0bb563016645e" @@ -16,6 +218,403 @@ esutils "^2.0.2" js-tokens "^3.0.0" +"@babel/highlight@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.0.0.tgz#697655183394facffb063437ddf52c0277698775" + +"@babel/plugin-proposal-async-generator-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.0.0.tgz#5d1eb6b44fd388b97f964350007ab9da090b1d70" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.0.0" + "@babel/plugin-syntax-async-generators" "^7.0.0" + +"@babel/plugin-proposal-json-strings@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.0.0.tgz#3b4d7b5cf51e1f2e70f52351d28d44fc2970d01e" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.0.0" + +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0.tgz#9a17b547f64d0676b6c9cecd4edf74a82ab85e7e" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0.tgz#b610d928fe551ff7117d42c8bb410eec312a6425" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0.tgz#498b39cd72536cd7c4b26177d030226eba08cd33" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.2.0" + +"@babel/plugin-syntax-async-generators@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0.tgz#bf0891dcdbf59558359d0c626fdc9490e20bc13c" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-flow@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.0.0.tgz#70638aeaad9ee426bc532e51523cff8ff02f6f17" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.0.0.tgz#0d259a68090e15b383ce3710e01d5b23f3770cbd" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-jsx@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.0.0.tgz#034d5e2b4e14ccaea2e4c137af7e4afb39375ffd" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0.tgz#37d8fbcaf216bd658ea1aebbeb8b75e88ebc549b" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0.tgz#886f72008b3a8b185977f7cb70713b45e51ee475" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0.tgz#a6c14875848c68a3b4b3163a486535ef25c7e749" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.0.0.tgz#feaf18f4bfeaf2236eea4b2d4879da83006cc8f5" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.0.0" + +"@babel/plugin-transform-block-scoped-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0.tgz#482b3f75103927e37288b3b67b65f848e2aa0d07" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0.tgz#1745075edffd7cdaf69fab2fb6f9694424b7e9bc" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.10" + +"@babel/plugin-transform-classes@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.0.0.tgz#9e65ca401747dde99e344baea90ab50dccb4c468" + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.0.0" + "@babel/helper-function-name" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.0.0" + "@babel/helper-split-export-declaration" "^7.0.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0.tgz#2fbb8900cd3e8258f2a2ede909b90e7556185e31" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0.tgz#68e911e1935dda2f06b6ccbbf184ffb024e9d43a" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0.tgz#73a24da69bc3c370251f43a3d048198546115e58" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/plugin-transform-duplicate-keys@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0.tgz#a0601e580991e7cace080e4cf919cfd58da74e86" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.0.0.tgz#c51b45e090a01876f64d32b5b46c0799c85ea56c" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.0.0.tgz#c40ced34c2783985d90d9f9ac77a13e6fb396a01" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0.tgz#f2ba4eadb83bd17dc3c7e9b30f4707365e1c3e39" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.0.0.tgz#eeda18dc22584e13c3581a68f6be4822bb1d1d81" + dependencies: + "@babel/helper-function-name" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0.tgz#2aec1d29cdd24c407359c930cdd89e914ee8ff86" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.0.0.tgz#2430ab73db9960c4ca89966f425b803f5d0d0468" + dependencies: + "@babel/helper-module-transforms" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.0.0.tgz#20b906e5ab130dd8e456b694a94d9575da0fd41f" + dependencies: + "@babel/helper-module-transforms" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.0.0" + +"@babel/plugin-transform-modules-systemjs@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0.tgz#8873d876d4fee23209decc4d1feab8f198cf2df4" + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.0.0.tgz#e7bb4f2a6cd199668964241951a25013450349be" + dependencies: + "@babel/helper-module-transforms" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-new-target@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.0.0.tgz#b8587d511309b3a0e96e9e38169908b3e392041e" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.0.0" + +"@babel/plugin-transform-parameters@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.0.0.tgz#da864efa111816a6df161d492f33de10e74b1949" + dependencies: + "@babel/helper-call-delegate" "^7.0.0" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.0.0.tgz#524379e4eca5363cd10c4446ba163f093da75f3e" + dependencies: + "@babel/helper-builder-react-jsx" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" + dependencies: + regenerator-transform "^0.13.3" + +"@babel/plugin-transform-runtime@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.0.0.tgz#0f1443c07bac16dba8efa939e0c61d6922740062" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + resolve "^1.8.1" + +"@babel/plugin-transform-shorthand-properties@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0.tgz#85f8af592dcc07647541a0350e8c95c7bf419d15" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0.tgz#93583ce48dd8c85e53f3a46056c856e4af30b49b" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0.tgz#30a9d64ac2ab46eec087b8530535becd90e73366" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0.tgz#084f1952efe5b153ddae69eb8945f882c7a97c65" + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0.tgz#4dcf1e52e943e5267b7313bff347fdbe0f81cec9" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-unicode-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0.tgz#c6780e5b1863a76fe792d90eded9fcd5b51d68fc" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/preset-env@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.0.0.tgz#f450f200c14e713f98cb14d113bf0c2cfbb89ca9" + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.0.0" + "@babel/plugin-proposal-json-strings" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.0.0" + "@babel/plugin-syntax-async-generators" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-async-to-generator" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-dotall-regex" "^7.0.0" + "@babel/plugin-transform-duplicate-keys" "^7.0.0" + "@babel/plugin-transform-exponentiation-operator" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-modules-amd" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-modules-systemjs" "^7.0.0" + "@babel/plugin-transform-modules-umd" "^7.0.0" + "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-sticky-regex" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + "@babel/plugin-transform-typeof-symbol" "^7.0.0" + "@babel/plugin-transform-unicode-regex" "^7.0.0" + browserslist "^4.1.0" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.3.0" + +"@babel/preset-flow@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.0.0.tgz#afd764835d9535ec63d8c7d4caf1c06457263da2" + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + +"@babel/register@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.0.0.tgz#fa634bae1bfa429f60615b754fc1f1d745edd827" + dependencies: + core-js "^2.5.7" + find-cache-dir "^1.0.0" + home-or-tmp "^3.0.0" + lodash "^4.17.10" + mkdirp "^0.5.1" + pirates "^4.0.0" + source-map-support "^0.5.9" + +"@babel/runtime@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.0.0.tgz#adeb78fedfc855aa05bc041640f3f6f98e85424c" + dependencies: + regenerator-runtime "^0.12.0" + +"@babel/template@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0.tgz#c2bc9870405959c89a9c814376a2ecb247838c80" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/types" "^7.0.0" + +"@babel/traverse@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0.tgz#b1fe9b6567fdf3ab542cfad6f3b31f854d799a61" + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.0.0" + "@babel/helper-function-name" "^7.0.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.0.0" + "@babel/types" "^7.0.0" + debug "^3.1.0" + globals "^11.1.0" + lodash "^4.17.10" + +"@babel/types@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0.tgz#6e191793d3c854d19c6749989e3bc55f0e962118" + dependencies: + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" + "@mrmlnc/readdir-enhanced@^2.2.1": version "2.2.1" resolved "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz#524af240d1a360527b730475ecfa1344aa540dde" @@ -166,13 +765,6 @@ any-observable@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -328,27 +920,6 @@ aws4@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" -babel-cli@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" - dependencies: - babel-core "^6.26.0" - babel-polyfill "^6.26.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - commander "^2.11.0" - convert-source-map "^1.5.0" - fs-readdir-recursive "^1.0.0" - glob "^7.1.2" - lodash "^4.17.4" - output-file-sync "^1.1.2" - path-is-absolute "^1.0.1" - slash "^1.0.0" - source-map "^0.5.6" - v8flags "^2.1.1" - optionalDependencies: - chokidar "^1.6.1" - babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -357,7 +928,7 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.25.0, babel-core@^6.26.0: +babel-core@^6.26.0, babel-core@^6.26.3: version "6.26.3" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" dependencies: @@ -381,7 +952,7 @@ babel-core@^6.25.0, babel-core@^6.26.0: slash "^1.0.0" source-map "^0.5.7" -babel-generator@^6.18.0, babel-generator@^6.25.0, babel-generator@^6.26.0: +babel-generator@^6.18.0, babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" dependencies: @@ -402,14 +973,6 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-helper-builder-react-jsx@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - esutils "^2.0.2" - babel-helper-call-delegate@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" @@ -517,34 +1080,16 @@ babel-plugin-check-es2015-constants@^6.22.0: babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + resolved "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" babel-plugin-syntax-exponentiation-operator@^6.8.0: version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - -babel-plugin-syntax-flow@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" - -babel-plugin-syntax-jsx@^6.8.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" - -babel-plugin-syntax-object-rest-spread@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" + resolved "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" babel-plugin-syntax-trailing-function-commas@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" -babel-plugin-transform-async-super@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-super/-/babel-plugin-transform-async-super-1.0.0.tgz#4d0884df0cad1017271105522b79f78db7892678" - dependencies: - babel-template "^6.26.0" - babel-plugin-transform-async-to-generator@^6.22.0: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" @@ -637,7 +1182,7 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1, babel-plugin-transform-es2015-modules-commonjs@^6.26.0: +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: version "6.26.2" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" dependencies: @@ -729,28 +1274,6 @@ babel-plugin-transform-exponentiation-operator@^6.22.0: babel-plugin-syntax-exponentiation-operator "^6.8.0" babel-runtime "^6.22.0" -babel-plugin-transform-flow-strip-types@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" - dependencies: - babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-object-rest-spread@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06" - dependencies: - babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.26.0" - -babel-plugin-transform-react-jsx@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3" - dependencies: - babel-helper-builder-react-jsx "^6.24.1" - babel-plugin-syntax-jsx "^6.8.0" - babel-runtime "^6.22.0" - babel-plugin-transform-regenerator@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" @@ -764,14 +1287,6 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-polyfill@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" - dependencies: - babel-runtime "^6.26.0" - core-js "^2.5.0" - regenerator-runtime "^0.10.5" - babel-preset-env@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" @@ -867,7 +1382,7 @@ babylon-walk@^1.0.2: babel-types "^6.15.0" lodash.clone "^4.5.0" -babylon@^6.17.4, babylon@^6.18.0: +babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -1075,6 +1590,14 @@ browserslist@^4.0.0: electron-to-chromium "^1.3.50" node-releases "^1.0.0-alpha.10" +browserslist@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.1.0.tgz#81cbb8e52dfa09918f93c6e051d779cb7360785d" + dependencies: + caniuse-lite "^1.0.30000878" + electron-to-chromium "^1.3.61" + node-releases "^1.0.0-alpha.11" + bsb-js@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/bsb-js/-/bsb-js-1.0.2.tgz#b9e7af1dfdb8de6191bb36fdff43f59359a7dfe7" @@ -1185,6 +1708,10 @@ caniuse-lite@^1.0.30000830: version "1.0.30000832" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000832.tgz#22a277f1d623774cc9aea2f7c1a65cb1603c63b8" +caniuse-lite@^1.0.30000878: + version "1.0.30000878" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000878.tgz#c644c39588dd42d3498e952234c372e5a40a4123" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -1224,21 +1751,6 @@ chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" -chokidar@^1.6.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - chokidar@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" @@ -1496,6 +2008,10 @@ commander@^2.11.0, commander@^2.14.1, commander@^2.9.0: version "2.15.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" +commander@^2.8.1: + version "2.17.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" + commander@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.1.0.tgz#d121bbae860d9992a3d517ba96f56588e47c6781" @@ -1565,7 +2081,7 @@ constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" -convert-source-map@^1.5.0, convert-source-map@^1.5.1: +convert-source-map@^1.1.0, convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" @@ -1573,10 +2089,14 @@ copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" -core-js@^2.4.0, core-js@^2.5.0: +core-js@^2.4.0: version "2.5.5" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.5.tgz#b14dde936c640c0579a6b50cabcc132dd6127e3b" +core-js@^2.5.0, core-js@^2.5.7: + version "2.5.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -2141,6 +2661,10 @@ electron-to-chromium@^1.3.30, electron-to-chromium@^1.3.50: version "1.3.51" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.51.tgz#6a42b49daaf7f22a5b37b991daf949f34dbdb9b5" +electron-to-chromium@^1.3.61: + version "1.3.61" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.61.tgz#a8ac295b28d0f03d85e37326fd16b6b6b17a1795" + elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" @@ -2307,7 +2831,7 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" -esutils@^2.0.2: +esutils@^2.0.0, esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -2532,6 +3056,14 @@ find-cache-dir@^0.1.1: mkdirp "^0.5.1" pkg-dir "^1.0.0" +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + find-parent-dir@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" @@ -2618,7 +3150,7 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" -fs-readdir-recursive@^1.0.0: +fs-readdir-recursive@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" @@ -2626,7 +3158,7 @@ fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" -fsevents@^1.0.0, fsevents@^1.1.2: +fsevents@^1.1.2: version "1.2.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.3.tgz#08292982e7059f6674c93d8b829c1e8604979ac0" dependencies: @@ -2745,10 +3277,25 @@ glob@7.1.2, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.0.0: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + globals@^11.0.1: version "11.5.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.5.0.tgz#6bc840de6771173b191f13d3a9c94d441ee92642" +globals@^11.1.0: + version "11.7.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" + globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -2856,7 +3403,7 @@ glslify-deps@^1.3.0: map-limit "0.0.1" resolve "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4: +graceful-fs@^4.1.11, graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -3017,6 +3564,10 @@ home-or-tmp@^2.0.0: os-homedir "^1.0.0" os-tmpdir "^1.0.1" +home-or-tmp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-3.0.0.tgz#57a8fe24cf33cdd524860a15821ddc25c86671fb" + hosted-git-info@^2.1.4: version "2.6.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" @@ -3410,7 +3961,7 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" -is-plain-obj@^1.0.0: +is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -3702,6 +4253,10 @@ js-beautify@^1.7.5: mkdirp "~0.5.0" nopt "~3.0.1" +js-levenshtein@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.3.tgz#3ef627df48ec8cf24bacf05c0f184ff30ef413c5" + js-stringify@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db" @@ -3710,6 +4265,10 @@ js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + js-yaml@^3.10.0, js-yaml@^3.9.0, js-yaml@^3.9.1: version "3.11.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" @@ -3770,6 +4329,10 @@ jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" +jsesc@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + jsesc@~0.3.x: version "0.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.3.0.tgz#1bf5ee63b4539fe2e26d0c1e99c240b97a457972" @@ -4198,7 +4761,7 @@ lodash.values@~2.3.0: dependencies: lodash.keys "~2.3.0" -lodash@^4.13.1, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0: +lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.3.0: version "4.17.10" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" @@ -4258,6 +4821,12 @@ magic-string@^0.22.4: dependencies: vlq "^0.2.2" +make-dir@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + dependencies: + pify "^3.0.0" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -4321,7 +4890,7 @@ merge2@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34" -micromatch@^2.1.5, micromatch@^2.3.11: +micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" dependencies: @@ -4555,6 +5124,10 @@ node-libs-browser@^2.0.0: util "^0.10.3" vm-browserify "0.0.4" +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + node-pre-gyp@^0.10.0: version "0.10.3" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" @@ -4591,6 +5164,12 @@ node-releases@^1.0.0-alpha.10: dependencies: semver "^5.3.0" +node-releases@^1.0.0-alpha.11: + version "1.0.0-alpha.11" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.0-alpha.11.tgz#73c810acc2e5b741a17ddfbb39dfca9ab9359d8a" + dependencies: + semver "^5.3.0" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -4617,7 +5196,7 @@ normalize-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" -normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: @@ -4888,13 +5467,13 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" -output-file-sync@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" +output-file-sync@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" dependencies: - graceful-fs "^4.1.4" + graceful-fs "^4.1.11" + is-plain-obj "^1.1.0" mkdirp "^0.5.1" - object-assign "^4.1.0" p-finally@^1.0.0: version "1.0.0" @@ -5056,12 +5635,24 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +pirates@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.0.tgz#850b18781b4ac6ec58a43c9ed9ec5fe6796addbd" + dependencies: + node-modules-regexp "^1.0.0" + pkg-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" dependencies: find-up "^1.0.0" +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + please-upgrade-node@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.0.2.tgz#7b9eaeca35aa4a43d6ebdfd10616c042f9a83acc" @@ -5942,18 +6533,24 @@ reduce-function-call@^1.0.1: dependencies: balanced-match "^0.4.2" -regenerate@^1.2.1: +regenerate-unicode-properties@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" + dependencies: + regenerate "^1.4.0" + +regenerate@^1.2.1, regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" -regenerator-runtime@^0.10.5: - version "0.10.5" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" - regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + regenerator-transform@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" @@ -5962,6 +6559,12 @@ regenerator-transform@^0.10.0: babel-types "^6.19.0" private "^0.1.6" +regenerator-transform@^0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" + dependencies: + private "^0.1.6" + regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" @@ -5995,16 +6598,37 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" +regexpu-core@^4.1.3, regexpu-core@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.2.0.tgz#a3744fa03806cffe146dea4421a3e73bdcc47b1d" + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^7.0.0" + regjsgen "^0.4.0" + regjsparser "^0.3.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.0.2" + regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" +regjsgen@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.4.0.tgz#c1eb4c89a209263f8717c782591523913ede2561" + regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" dependencies: jsesc "~0.5.0" +regjsparser@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.3.0.tgz#3c326da7fcfd69fa0d332575a41c8c0cdf588c96" + dependencies: + jsesc "~0.5.0" + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -6105,6 +6729,12 @@ resolve@^1.0.0, resolve@^1.1.5, resolve@^1.1.6, resolve@^1.4.0: dependencies: path-parse "^1.0.5" +resolve@^1.3.2, resolve@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + dependencies: + path-parse "^1.0.5" + restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" @@ -6337,6 +6967,10 @@ slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + slice-ansi@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" @@ -6413,6 +7047,13 @@ source-map-support@^0.5.0: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@^0.5.9: + version "0.5.9" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" @@ -6423,7 +7064,7 @@ source-map@0.1.x, source-map@~0.1.x: dependencies: amdefine ">=0.0.4" -source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: +source-map@0.5.x, source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -6835,6 +7476,10 @@ to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -6941,6 +7586,25 @@ uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + unicode-trie@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/unicode-trie/-/unicode-trie-0.3.1.tgz#d671dddd89101a08bac37b6a5161010602052085" @@ -7011,10 +7675,6 @@ use@^3.1.0: dependencies: kind-of "^6.0.2" -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -7040,12 +7700,6 @@ v8-compile-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz#526492e35fc616864284700b7043e01baee09f0a" -v8flags@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - dependencies: - user-home "^1.1.1" - validate-npm-package-license@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" @@ -7269,4 +7923,4 @@ yargs@~3.10.0: camelcase "^1.0.2" cliui "^2.1.0" decamelize "^1.0.0" - window-size "0.1.0" \ No newline at end of file + window-size "0.1.0"