From 378fe947c82528844df2fd358e3a3789a9e2a821 Mon Sep 17 00:00:00 2001 From: Adam Putinski Date: Tue, 6 Mar 2018 13:38:04 -0500 Subject: [PATCH 1/4] chore(build): thread-loader --- package.json | 1 + scripts/compile/bundle.js | 5 +++-- scripts/compile/webpack.config.js | 8 ++++++++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5894ddaddd..e7d94eff8d 100644 --- a/package.json +++ b/package.json @@ -146,6 +146,7 @@ "stylestats": "7.0.1", "temp": "0.8.3", "theo": "6.0.0-beta.2", + "thread-loader": "1.1.5", "through2": "2.0.3", "tinycolor2": "1.4.1", "touch": "3.1.0", diff --git a/scripts/compile/bundle.js b/scripts/compile/bundle.js index 63eebe5275..cc91ef1100 100644 --- a/scripts/compile/bundle.js +++ b/scripts/compile/bundle.js @@ -109,12 +109,13 @@ const compile = configs => const compileLibrary = () => configs.chain(compile); -const writeManifest = () => +const writeManifest = stats => manifest .map(m => JSON.stringify(m, null, 2)) .chain(contents => writeFile(path.join(paths.dist, 'manifest.json'), contents) - ); + ) + .map(() => stats); // createLibrary :: () -> Task Error (List Stats) const createLibrary = () => compileLibrary().chain(writeManifest); diff --git a/scripts/compile/webpack.config.js b/scripts/compile/webpack.config.js index 82124069c9..192f056d2b 100644 --- a/scripts/compile/webpack.config.js +++ b/scripts/compile/webpack.config.js @@ -15,6 +15,10 @@ module.exports = I.fromJS({ test: /\.jsx?$/, exclude: /node_modules/, use: [ + { + loader: 'thread-loader', + options: {} + }, { loader: 'babel-loader', options: { @@ -39,6 +43,10 @@ module.exports = I.fromJS({ test: /\.mdx$/, exclude: /node_modules/, use: [ + { + loader: 'thread-loader', + options: {} + }, { loader: 'babel-loader', options: { From 93c5dd06ed63330be5db78f30f8bd3a34a916acf Mon Sep 17 00:00:00 2001 From: Adam Putinski Date: Tue, 6 Mar 2018 14:39:20 -0500 Subject: [PATCH 2/4] chore(build): gulp dist --- gulpfile.js | 39 +++- scripts/dist.js | 383 ------------------------------------- scripts/gulp/dist.js | 210 ++++++++++++++++++++ scripts/helpers/publish.js | 1 - 4 files changed, 248 insertions(+), 385 deletions(-) delete mode 100644 scripts/dist.js create mode 100644 scripts/gulp/dist.js diff --git a/gulpfile.js b/gulpfile.js index 037028758a..fd93bcb4bf 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -7,10 +7,10 @@ import glob from 'glob'; import gulp from 'gulp'; import path from 'path'; import touch from 'touch'; -import webpack from 'webpack'; import { argv } from 'yargs'; import * as accessibility from './scripts/gulp/accessibility'; +import * as dist from './scripts/gulp/dist'; import * as examples from './scripts/gulp/generate/examples'; import * as tokens from './scripts/gulp/generate/tokens'; import * as lint from './scripts/gulp/lint'; @@ -183,6 +183,42 @@ export const watch = () => }); }); +// ///////////////////////////////////////////////////////// +// Dist +// ///////////////////////////////////////////////////////// + +gulp.task( + 'dist', + gulp.series( + dist.cleanBefore, + gulp.parallel( + dist.copyRoot, + dist.copySass, + dist.copySassLicense, + dist.copyIcons, + dist.copyIconsMeta, + dist.copyFonts, + dist.copyFontsLicense, + dist.copyImages, + dist.copyImagesLicense, + dist.copySwatches, + dist.copyDesignTokens, + dist.copyComponentDesignTokens + ), + dist.sass, + dist.minifyCss, + gulp.parallel( + dist.versionBlock, + dist.versionInline, + dist.buildInfo, + dist.writeUI, + dist.writeLibrary, + dist.packageJson + ), + dist.cleanAfter + ) +); + // ///////////////////////////////////////////////////////// // Travis // ///////////////////////////////////////////////////////// @@ -196,6 +232,7 @@ gulp.task('travis', done => { 'generate:examples:wrapped', withName('travis:snapshots')(travis.createSnapshots), withName('travis:lint:examples')(travis.lintExamples), + 'dist', withName('travis:publish')(travis.publishBuild) )(done); }); diff --git a/scripts/dist.js b/scripts/dist.js deleted file mode 100644 index 0017e75431..0000000000 --- a/scripts/dist.js +++ /dev/null @@ -1,383 +0,0 @@ -// Copyright (c) 2015-present, salesforce.com, inc. All rights reserved -// Licensed under BSD 3-Clause - see LICENSE.txt or git.io/sfdc-license - -const _ = require('lodash'); -const fs = require('fs'); -const path = require('path'); -const async = require('async'); -const autoprefixer = require('autoprefixer'); -const gulp = require('gulp'); -const gulpinsert = require('gulp-insert'); -const gulprename = require('gulp-rename'); -const Immutable = require('immutable'); -const postcss = require('gulp-postcss'); -const rimraf = require('rimraf'); -const sass = require('gulp-sass'); -const minifycss = require('gulp-minify-css'); -const ui = require('./ui'); -const webpack = require('webpack'); -const { createLibrary } = require('./compile/bundle'); - -const packageJSON = require('../package.json'); -const paths = require('./helpers/paths'); -const releaseNotes = require('./npm/release-notes'); - -const SLDS_VERSION = packageJSON.version; -const DISPLAY_NAME = 'Lightning Design System'; -const MODULE_NAME = 'salesforce-lightning-design-system'; - -// ///////////////////////////////////////////////////////////// -// Helpers -// ///////////////////////////////////////////////////////////// - -const distPath = path.resolve.bind(path, paths.dist); - -// ///////////////////////////////////////////////////////////// -// Tasks -// ///////////////////////////////////////////////////////////// - -async.series( - [ - /** - * Clean the dist folder - */ - done => rimraf(distPath(), done), - - /** - * Copy necessary root files to be included in the final module - */ - done => { - gulp - .src(['./package.json', './README-dist.md', './RELEASENOTES*'], { - base: paths.root - }) - .pipe(gulp.dest(distPath())) - .on('error', done) - .on('finish', done); - }, - - /** - * Make release notes - */ - // done => - // releaseNotes({ isInternal: packageJSON.config.slds.internal }) - // .pipe(fs.createWriteStream(distPath("RELEASENOTES.md"))) - // .on("finish", () => done()), - - /** - * Cleanup the package.json - */ - done => { - const packageJSON = JSON.parse( - fs.readFileSync(distPath('package.json')).toString() - ); - packageJSON.name = '@salesforce-ux/design-system'; - _.set( - packageJSON, - ['slds', 'dependencies'], - Immutable.fromJS(packageJSON.devDependencies) - .filter((v, k) => /^@salesforce-ux/.test(k)) - .toJS() - ); - delete packageJSON.scripts; - delete packageJSON.dependencies; - delete packageJSON.devDependencies; - delete packageJSON.optionalDependencies; - delete packageJSON.engines; - delete packageJSON.important; - fs.writeFile( - distPath('package.json'), - JSON.stringify(packageJSON, null, 2), - done - ); - }, - - // ////////////////////////////////// - // Sass - // ////////////////////////////////// - - /** - * Move all the scss files to dist/scss - */ - done => { - gulp - .src('**/*.scss', { - base: paths.ui, - cwd: paths.ui - }) - .pipe(gulp.dest(distPath('scss'))) - .on('error', done) - .on('finish', done); - }, - - /** - * Copy the Sass license - */ - done => { - gulp - .src('licenses/License-for-Sass.txt', { - cwd: paths.assets - }) - .pipe(gulp.dest(distPath('scss'))) - .on('error', done) - .on('finish', done); - }, - - // ////////////////////////////////// - // Icons - // ////////////////////////////////// - - /** - * Copy all the icons to assets/icons - */ - done => { - gulp - .src( - '@salesforce-ux/icons/dist/salesforce-lightning-design-system-icons/**', - { - cwd: paths.node_modules - } - ) - .pipe(gulp.dest(distPath('assets/icons'))) - .on('error', done) - .on('finish', done); - }, - - /** - * Copy the list to assets/icons - */ - done => { - gulp - .src('@salesforce-ux/icons/dist/ui.icons.json', { - cwd: paths.node_modules - }) - .pipe(gulp.dest(distPath())) - .on('error', done) - .on('finish', done); - }, - - // ////////////////////////////////// - // Fonts - // ////////////////////////////////// - - /** - * Copy all the fonts to assets/fonts - */ - done => { - gulp - .src('fonts/**/*', { - cwd: paths.assets - }) - .pipe(gulp.dest(distPath('assets/fonts'))) - .on('error', done) - .on('finish', done); - }, - - /** - * Copy font license - */ - done => { - gulp - .src('licenses/License-for-font.txt', { - cwd: paths.assets - }) - .pipe(gulp.dest(distPath('assets/fonts'))) - .on('error', done) - .on('finish', done); - }, - - // ////////////////////////////////// - // Images - // ////////////////////////////////// - - /** - * Copy select images directories - */ - done => { - gulp - .src('images/**/*', { - base: 'assets/images', - cwd: paths.assets - }) - .pipe(gulp.dest(distPath('assets/images'))) - .on('error', done) - .on('finish', done); - }, - - /** - * Copy images license - */ - done => { - gulp - .src('licenses/License-for-images.txt', { - cwd: paths.assets - }) - .pipe(gulp.dest(distPath('assets/images'))) - .on('error', done) - .on('finish', done); - }, - - // ////////////////////////////////// - // Swatches - // ////////////////////////////////// - - /** - * Copy the swatches - */ - done => { - gulp - .src('downloads/swatches/**', { - cwd: paths.assets - }) - .pipe(gulp.dest(distPath('swatches'))) - .on('error', done) - .on('finish', done); - }, - - // ////////////////////////////////// - // Design Tokens - // ////////////////////////////////// - - /** - * Move design tokens - */ - done => { - gulp - .src('**/*.*', { - base: `${paths.designTokens}`, - cwd: `${paths.designTokens}` - }) - .pipe(gulp.dest(distPath('design-tokens'))) - .on('error', done) - .on('finish', done); - }, - - /** - * Move component design tokens - */ - done => { - gulp - .src('components/**/tokens/**/*.yml', { - base: path.resolve(paths.ui), - cwd: path.resolve(paths.ui) - }) - .pipe(gulp.dest(distPath('ui'))) - .on('error', done) - .on('finish', done); - }, - - /** - * Build design system and vf css from the scss files. The big one! - */ - done => { - gulp - .src(distPath('scss/index.scss')) - .pipe( - sass({ - precision: 10, - includePaths: [paths.node_modules] - }) - ) - .pipe(sass().on('error', sass.logError)) - .pipe(postcss([autoprefixer({ remove: false })])) - .pipe( - gulprename(function(path) { - path.basename = - MODULE_NAME + path.basename.substring('index'.length); - path.extname = '.css'; - return path; - }) - ) - .pipe(gulp.dest(distPath('assets/styles/'))) - .on('error', done) - .on('finish', done); - }, - /** - * Minify CSS - */ - done => { - gulp - .src(distPath('assets/styles/*.css'), { base: distPath() }) - .pipe(gulp.dest(distPath())) - .on('error', done) - .pipe( - minifycss({ - advanced: false, - roundingPrecision: '-1' - }) - ) - .pipe( - gulprename(function(path) { - path.basename += '.min'; - return path; - }) - ) - .on('error', done) - .pipe(gulp.dest(distPath())) - .on('error', done) - .on('finish', done); - }, - - /** - * Add version to relevant CSS and Sass files - */ - done => { - gulp - .src(['**/*.css', 'scss/index*'], { - base: distPath(), - cwd: distPath() - }) - .pipe(gulpinsert.prepend(`/*! ${DISPLAY_NAME} ${SLDS_VERSION} */\n`)) - .pipe(gulp.dest(distPath())) - .on('error', done) - .on('finish', done); - }, - done => { - gulp - .src(['scss/**/*.scss', '!scss/index*.scss', '!scss/vendor/**/*.*'], { - base: distPath(), - cwd: distPath() - }) - .pipe(gulpinsert.prepend(`// ${DISPLAY_NAME} ${SLDS_VERSION}\n`)) - .pipe(gulp.dest(distPath())) - .on('error', done) - .on('finish', done); - }, - - /** - * Add build date to README.txt - */ - done => { - gulp - .src(distPath('README-dist.md')) - .pipe(gulprename('README.md')) - .on('error', done) - .pipe( - gulpinsert.prepend( - `# ${DISPLAY_NAME} \n# Version: ${SLDS_VERSION} \n` - ) - ) - .on('error', done) - .pipe(gulp.dest(distPath())) - .on('error', done) - .on('finish', done); - }, - - /** - * Remove old README-dist - */ - done => { - rimraf(distPath('README-dist.md'), done); - }, - - /** - * Add ui.json - */ - done => ui.writeToDist().fork(done, () => done(null, null)), - - done => createLibrary().fork(e => done(e), x => done(null, x)) - ], - err => { - if (err) throw err; - } -); diff --git a/scripts/gulp/dist.js b/scripts/gulp/dist.js new file mode 100644 index 0000000000..c7405dce2b --- /dev/null +++ b/scripts/gulp/dist.js @@ -0,0 +1,210 @@ +// Copyright (c) 2015-present, salesforce.com, inc. All rights reserved +// Licensed under BSD 3-Clause - see LICENSE.txt or git.io/sfdc-license + +import autoprefixer from 'autoprefixer'; +import del from 'del'; +import gulp from 'gulp'; +import gulpInsert from 'gulp-insert'; +import gulpMinifyCss from 'gulp-minify-css'; +import gulpPostcss from 'gulp-postcss'; +import gulpRename from 'gulp-rename'; +import gulpSass from 'gulp-sass'; +import gulpFile from 'gulp-file'; +import Immutable from 'immutable'; +import path from 'path'; + +import packageJSON from '../../package.json'; + +import { createLibrary } from '../compile/bundle'; +import paths from '../helpers/paths'; +import releaseNotes from '../npm/release-notes'; +import ui from '../ui'; + +const distPath = path.resolve.bind(path, paths.dist); + +const SLDS_VERSION = packageJSON.version; +const DISPLAY_NAME = 'Lightning Design System'; +const MODULE_NAME = 'salesforce-lightning-design-system'; + +export const cleanBefore = () => del([paths.dist]); +export const cleanAfter = () => del([distPath('README-dist.md')]); + +export const copyRoot = () => + gulp + .src(['./package.json', './README-dist.md', './RELEASENOTES*'], { + base: paths.root + }) + .pipe(gulp.dest(distPath())); + +export const copySass = () => + gulp + .src('**/*.scss', { + base: paths.ui, + cwd: paths.ui + }) + .pipe(gulp.dest(distPath('scss'))); + +export const copySassLicense = () => + gulp + .src('licenses/License-for-Sass.txt', { + cwd: paths.assets + }) + .pipe(gulp.dest(distPath('scss'))); + +export const copyIcons = () => + gulp + .src( + '@salesforce-ux/icons/dist/salesforce-lightning-design-system-icons/**', + { + cwd: paths.node_modules + } + ) + .pipe(gulp.dest(distPath('assets/icons'))); + +export const copyIconsMeta = () => + gulp + .src('@salesforce-ux/icons/dist/ui.icons.json', { + cwd: paths.node_modules + }) + .pipe(gulp.dest(distPath())); + +export const copyFonts = () => + gulp + .src('fonts/**/*', { + cwd: paths.assets + }) + .pipe(gulp.dest(distPath('assets/fonts'))); + +export const copyFontsLicense = () => + gulp + .src('licenses/License-for-font.txt', { + cwd: paths.assets + }) + .pipe(gulp.dest(distPath('assets/fonts'))); + +export const copyImages = () => + gulp + .src('images/**/*', { + base: 'assets/images', + cwd: paths.assets + }) + .pipe(gulp.dest(distPath('assets/images'))); + +export const copyImagesLicense = () => + gulp + .src('licenses/License-for-images.txt', { + cwd: paths.assets + }) + .pipe(gulp.dest(distPath('assets/images'))); + +export const copySwatches = () => + gulp + .src('downloads/swatches/**', { + cwd: paths.assets + }) + .pipe(gulp.dest(distPath('swatches'))); + +export const copyDesignTokens = () => + gulp + .src('**/*.*', { + base: `${paths.designTokens}`, + cwd: `${paths.designTokens}` + }) + .pipe(gulp.dest(distPath('design-tokens'))); + +export const copyComponentDesignTokens = () => + gulp + .src('components/**/tokens/**/*.yml', { + base: path.resolve(paths.ui), + cwd: path.resolve(paths.ui) + }) + .pipe(gulp.dest(distPath('ui'))); + +export const sass = () => + gulp + .src(distPath('scss/index.scss')) + .pipe( + gulpSass({ + precision: 10, + includePaths: [paths.node_modules] + }) + ) + .pipe(gulpSass().on('error', gulpSass.logError)) + .pipe(gulpPostcss([autoprefixer({ remove: false })])) + .pipe( + gulpRename(path => { + path.basename = MODULE_NAME + path.basename.substring('index'.length); + path.extname = '.css'; + return path; + }) + ) + .pipe(gulp.dest(distPath('assets/styles/'))); + +export const minifyCss = () => + gulp + .src(distPath('assets/styles/*.css'), { base: distPath() }) + .pipe(gulp.dest(distPath())) + .pipe( + gulpMinifyCss({ + advanced: false, + roundingPrecision: '-1' + }) + ) + .pipe( + gulpRename(path => { + path.basename += '.min'; + return path; + }) + ) + .pipe(gulp.dest(distPath())); + +export const versionBlock = () => + gulp + .src(['**/*.css', 'scss/index*'], { + base: distPath(), + cwd: distPath() + }) + .pipe(gulpInsert.prepend(`/*! ${DISPLAY_NAME} ${SLDS_VERSION} */\n`)) + .pipe(gulp.dest(distPath())); + +export const versionInline = () => + gulp + .src(['scss/**/*.scss', '!scss/index*.scss', '!scss/vendor/**/*.*'], { + base: distPath(), + cwd: distPath() + }) + .pipe(gulpInsert.prepend(`// ${DISPLAY_NAME} ${SLDS_VERSION}\n`)) + .pipe(gulp.dest(distPath())); + +export const buildInfo = () => + gulp + .src(distPath('README-dist.md')) + .pipe(gulpRename('README.md')) + .pipe( + gulpInsert.prepend(`# ${DISPLAY_NAME} \n# Version: ${SLDS_VERSION} \n`) + ) + .pipe(gulp.dest(distPath())); + +export const writeUI = done => ui.writeToDist().fork(done, () => done()); + +export const writeLibrary = done => + createLibrary().fork(e => done(e), stats => done(null, stats)); + +export const packageJson = () => { + const a = Immutable.fromJS(packageJSON); + const b = a + .set('name', '@salesforce-ux/design-system') + .setIn( + ['slds', 'dependencies'], + a.get('devDependencies').filter((v, k) => /^@salesforce-ux/.test(k)) + ) + .delete('scripts') + .delete('dependencies') + .delete('devDependencies') + .delete('optionalDependencies') + .delete('engines') + .delete('important'); + return gulpFile('package.json', JSON.stringify(b, null, 2), { + src: true + }).pipe(gulp.dest(distPath())); +}; diff --git a/scripts/helpers/publish.js b/scripts/helpers/publish.js index c5542bfb3f..22dd83b00d 100644 --- a/scripts/helpers/publish.js +++ b/scripts/helpers/publish.js @@ -79,7 +79,6 @@ const prepare = done => { done => async.series( [ - async.apply(execute, 'npm run dist'), async.apply(execute, `cp -a ${paths.dist}/. ${paths.build}/dist`), async.apply(execute, `rm -rf ${paths.build}/dist/*.zip`) ], From 3f86e1c6d4be332bbd74284a27afae50a20b2114 Mon Sep 17 00:00:00 2001 From: Adam Putinski Date: Tue, 6 Mar 2018 15:04:05 -0500 Subject: [PATCH 3/4] chore(build): gulp dist names --- gulpfile.js | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index fd93bcb4bf..cccacfac4c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -190,32 +190,32 @@ export const watch = () => gulp.task( 'dist', gulp.series( - dist.cleanBefore, + withName('dist:clean:before')(dist.cleanBefore), gulp.parallel( - dist.copyRoot, - dist.copySass, - dist.copySassLicense, - dist.copyIcons, - dist.copyIconsMeta, - dist.copyFonts, - dist.copyFontsLicense, - dist.copyImages, - dist.copyImagesLicense, - dist.copySwatches, - dist.copyDesignTokens, - dist.copyComponentDesignTokens + withName('dist:copyRoot')(dist.copyRoot), + withName('dist:copySass')(dist.copySass), + withName('dist:copySassLicense')(dist.copySassLicense), + withName('dist:copyIcons')(dist.copyIcons), + withName('dist:copyIconsMeta')(dist.copyIconsMeta), + withName('dist:copyFonts')(dist.copyFonts), + withName('dist:copyFontsLicense')(dist.copyFontsLicense), + withName('dist:copyImages')(dist.copyImages), + withName('dist:copyImagesLicense')(dist.copyImagesLicense), + withName('dist:copySwatches')(dist.copySwatches), + withName('dist:copyDesignTokens')(dist.copyDesignTokens), + withName('dist:copyComponentDesignTokens')(dist.copyComponentDesignTokens) ), - dist.sass, - dist.minifyCss, + withName('dist:sass')(dist.sass), + withName('dist:minifyCss')(dist.minifyCss), gulp.parallel( - dist.versionBlock, - dist.versionInline, - dist.buildInfo, - dist.writeUI, - dist.writeLibrary, - dist.packageJson + withName('dist:versionBlock')(dist.versionBlock), + withName('dist:versionInline')(dist.versionInline), + withName('dist:buildInfo')(dist.buildInfo), + withName('dist:writeUI')(dist.writeUI), + withName('dist:writeLibrary')(dist.writeLibrary), + withName('dist:packageJson')(dist.packageJson) ), - dist.cleanAfter + withName('dist:clean:after')(dist.cleanAfter) ) ); From 8f0a6ef3c24bdbf0d52db8ceb297e664a8d66023 Mon Sep 17 00:00:00 2001 From: Adam Putinski Date: Tue, 6 Mar 2018 15:10:43 -0500 Subject: [PATCH 4/4] fix(build): update snapshots --- .../__snapshots__/bundle.spec.js.snap | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/scripts/compile/__tests__/__snapshots__/bundle.spec.js.snap b/scripts/compile/__tests__/__snapshots__/bundle.spec.js.snap index ff578f9ff7..862751e0bd 100644 --- a/scripts/compile/__tests__/__snapshots__/bundle.spec.js.snap +++ b/scripts/compile/__tests__/__snapshots__/bundle.spec.js.snap @@ -12,6 +12,11 @@ exports[`doesn't change configs 1`] = ` \\"test\\": { }, \\"use\\": [ + { + \\"loader\\": \\"thread-loader\\", + \\"options\\": { + } + }, { \\"loader\\": \\"babel-loader\\", \\"options\\": { @@ -48,6 +53,11 @@ exports[`doesn't change configs 1`] = ` \\"test\\": { }, \\"use\\": [ + { + \\"loader\\": \\"thread-loader\\", + \\"options\\": { + } + }, { \\"loader\\": \\"babel-loader\\", \\"options\\": { @@ -103,6 +113,11 @@ exports[`doesn't change configs 1`] = ` \\"test\\": { }, \\"use\\": [ + { + \\"loader\\": \\"thread-loader\\", + \\"options\\": { + } + }, { \\"loader\\": \\"babel-loader\\", \\"options\\": { @@ -139,6 +154,11 @@ exports[`doesn't change configs 1`] = ` \\"test\\": { }, \\"use\\": [ + { + \\"loader\\": \\"thread-loader\\", + \\"options\\": { + } + }, { \\"loader\\": \\"babel-loader\\", \\"options\\": { @@ -202,6 +222,11 @@ exports[`doesn't change configs 1`] = ` \\"test\\": { }, \\"use\\": [ + { + \\"loader\\": \\"thread-loader\\", + \\"options\\": { + } + }, { \\"loader\\": \\"babel-loader\\", \\"options\\": { @@ -238,6 +263,11 @@ exports[`doesn't change configs 1`] = ` \\"test\\": { }, \\"use\\": [ + { + \\"loader\\": \\"thread-loader\\", + \\"options\\": { + } + }, { \\"loader\\": \\"babel-loader\\", \\"options\\": {