From 1cf68641165fb2a7011f1e087e743e4ba1512bd1 Mon Sep 17 00:00:00 2001 From: Ward Peeters Date: Sun, 24 Mar 2019 11:36:25 +0100 Subject: [PATCH 01/10] =?UTF-8?q?remove=20bubl=C3=A9=20and=20run=20transpi?= =?UTF-8?q?lation=20on=20babel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 7 ++-- src/index.js | 111 +++++++++++++++++++++++++++------------------------ 2 files changed, 62 insertions(+), 56 deletions(-) diff --git a/package.json b/package.json index 09f4a36..2257bea 100644 --- a/package.json +++ b/package.json @@ -61,10 +61,9 @@ "pretty-bytes": "^5.2.0", "rollup": "^1.11.3", "rollup-plugin-alias": "^1.5.1", - "rollup-plugin-babel": "^4.1.0-0", - "rollup-plugin-buble": "^0.19.4", - "rollup-plugin-bundle-size": "^1.0.3", - "rollup-plugin-commonjs": "^9.3.4", + "rollup-plugin-babel": "^4.3.2", + "rollup-plugin-bundle-size": "^1.0.1", + "rollup-plugin-commonjs": "^9.0.0", "rollup-plugin-es3": "^1.1.0", "rollup-plugin-flow": "^1.1.1", "rollup-plugin-json": "^4.0.0", diff --git a/src/index.js b/src/index.js index 1822a22..9dab8e1 100644 --- a/src/index.js +++ b/src/index.js @@ -9,7 +9,6 @@ import { rollup, watch } from 'rollup'; import commonjs from 'rollup-plugin-commonjs'; import babel from 'rollup-plugin-babel'; import nodeResolve from 'rollup-plugin-node-resolve'; -import buble from 'rollup-plugin-buble'; import { terser } from 'rollup-plugin-terser'; import alias from 'rollup-plugin-alias'; import postcss from 'rollup-plugin-postcss'; @@ -238,7 +237,7 @@ export default async function microbundle(inputOptions) { return ( blue( `Build "${options.name}" to ${relative(cwd, dirname(options.output)) || - '.'}:`, + '.'}:`, ) + '\n ' + out.join('\n ') @@ -301,8 +300,8 @@ async function jsOrTs(cwd, filename) { const extension = (await isFile(resolve(cwd, filename + '.ts'))) ? '.ts' : (await isFile(resolve(cwd, filename + '.tsx'))) - ? '.tsx' - : '.js'; + ? '.tsx' + : '.js'; return resolve(cwd, `${filename}${extension}`); } @@ -315,13 +314,13 @@ async function getInput({ entries, cwd, source, module }) { entries && entries.length ? entries : (source && - (Array.isArray(source) ? source : [source]).map(file => - resolve(cwd, file), - )) || - ((await isDir(resolve(cwd, 'src'))) && - (await jsOrTs(cwd, 'src/index'))) || - (await jsOrTs(cwd, 'index')) || - module, + (Array.isArray(source) ? source : [source]).map(file => + resolve(cwd, file), + )) || + ((await isDir(resolve(cwd, 'src'))) && + (await jsOrTs(cwd, 'src/index'))) || + (await jsOrTs(cwd, 'index')) || + module, ) .map(file => glob(file)) .forEach(file => input.push(...file)); @@ -449,7 +448,7 @@ function createConfig(options, entry, format, writeMeta) { nameCache.minify, ); } - } catch (e) {} + } catch (e) { } } loadNameCache(); @@ -478,20 +477,20 @@ function createConfig(options, entry, format, writeMeta) { plugins: [ autoprefixer(), options.compress !== false && - cssnano({ - preset: 'default', - }), + cssnano({ + preset: 'default', + }), ].filter(Boolean), // only write out CSS for the first bundle (avoids pointless extra files): inject: false, extract: !!writeMeta, }), Object.keys(moduleAliases).length > 0 && - alias( - Object.assign({}, moduleAliases, { - resolve: EXTENSIONS, - }), - ), + alias( + Object.assign({}, moduleAliases, { + resolve: EXTENSIONS, + }), + ), nodeResolve({ mainFields: ['module', 'jsnext', 'main'], browser: options.target !== 'node', @@ -522,22 +521,22 @@ function createConfig(options, entry, format, writeMeta) { }, }, useTypescript && - typescript({ - typescript: require('typescript'), - cacheRoot: `./node_modules/.cache/.rts2_cache_${format}`, - tsconfigDefaults: { - compilerOptions: { - sourceMap: options.sourcemap, - declaration: true, - jsx: options.jsx, - }, + typescript({ + typescript: require('typescript'), + cacheRoot: `./node_modules/.cache/.rts2_cache_${format}`, + tsconfigDefaults: { + compilerOptions: { + sourceMap: options.sourcemap, + declaration: true, + jsx: options.jsx, }, - tsconfigOverride: { - compilerOptions: { - target: 'esnext', - }, + }, + tsconfigOverride: { + compilerOptions: { + target: 'esnext', }, - }), + }, + }), !useTypescript && flow({ all: true, pretty: true }), babel({ babelrc: false, @@ -551,16 +550,24 @@ function createConfig(options, entry, format, writeMeta) { ], ], }), - // Only used for async await babel({ - // We mainly use bublé to transpile JS and only use babel to - // transpile down `async/await`. To prevent conflicts with user - // supplied configurations we set this option to false. Note - // that we never supported using custom babel configs anyway. - babelrc: false, - configFile: false, extensions: EXTENSIONS, exclude: 'node_modules/**', + presets: [ + [ + '@babel/preset-env', + { + loose: true, + modules: false, + debug: true, + useBuiltIns: 'usage', + corejs: 2, + targets: + options.target === 'node' ? { node: '6' } : undefined, + exclude: ['transform-async-to-generator'], + }, + ], + ], plugins: [ require.resolve('@babel/plugin-syntax-jsx'), [ @@ -577,15 +584,15 @@ function createConfig(options, entry, format, writeMeta) { ], ], }), - buble({ - exclude: 'node_modules/**', - jsx: options.jsx || 'h', - objectAssign: options.assign || 'Object.assign', - transforms: { - dangerousForOf: true, - dangerousTaggedTemplateString: true, - }, - }), + // buble({ + // exclude: 'node_modules/**', + // jsx: options.jsx || 'h', + // objectAssign: options.assign || 'Object.assign', + // transforms: { + // dangerousForOf: true, + // dangerousTaggedTemplateString: true, + // }, + // }), // We should upstream this to rollup // format==='cjs' && replace({ // [`module.exports = ${rollupName};`]: '', @@ -661,8 +668,8 @@ function createConfig(options, entry, format, writeMeta) { file: resolve( options.cwd, (format === 'es' && moduleMain) || - (format === 'umd' && umdMain) || - cjsMain, + (format === 'umd' && umdMain) || + cjsMain, ), }, }; From a77ca66c1ccf29a6670b45258268b0ef146246c7 Mon Sep 17 00:00:00 2001 From: Ward Peeters Date: Sun, 24 Mar 2019 11:38:22 +0100 Subject: [PATCH 02/10] remove debug --- src/index.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/index.js b/src/index.js index 9dab8e1..80baa2f 100644 --- a/src/index.js +++ b/src/index.js @@ -559,7 +559,6 @@ function createConfig(options, entry, format, writeMeta) { { loose: true, modules: false, - debug: true, useBuiltIns: 'usage', corejs: 2, targets: From 27d1a8a689e6512089cca8f56e6d6099b5a813c3 Mon Sep 17 00:00:00 2001 From: Ward Peeters Date: Mon, 6 May 2019 15:27:47 +0200 Subject: [PATCH 03/10] update plugins with babel --- src/index.js | 82 ++++---- test/__snapshots__/index.test.js.snap | 270 +++++++++++++------------- 2 files changed, 178 insertions(+), 174 deletions(-) diff --git a/src/index.js b/src/index.js index 80baa2f..a853bea 100644 --- a/src/index.js +++ b/src/index.js @@ -237,7 +237,7 @@ export default async function microbundle(inputOptions) { return ( blue( `Build "${options.name}" to ${relative(cwd, dirname(options.output)) || - '.'}:`, + '.'}:`, ) + '\n ' + out.join('\n ') @@ -300,8 +300,8 @@ async function jsOrTs(cwd, filename) { const extension = (await isFile(resolve(cwd, filename + '.ts'))) ? '.ts' : (await isFile(resolve(cwd, filename + '.tsx'))) - ? '.tsx' - : '.js'; + ? '.tsx' + : '.js'; return resolve(cwd, `${filename}${extension}`); } @@ -314,13 +314,13 @@ async function getInput({ entries, cwd, source, module }) { entries && entries.length ? entries : (source && - (Array.isArray(source) ? source : [source]).map(file => - resolve(cwd, file), - )) || - ((await isDir(resolve(cwd, 'src'))) && - (await jsOrTs(cwd, 'src/index'))) || - (await jsOrTs(cwd, 'index')) || - module, + (Array.isArray(source) ? source : [source]).map(file => + resolve(cwd, file), + )) || + ((await isDir(resolve(cwd, 'src'))) && + (await jsOrTs(cwd, 'src/index'))) || + (await jsOrTs(cwd, 'index')) || + module, ) .map(file => glob(file)) .forEach(file => input.push(...file)); @@ -448,7 +448,7 @@ function createConfig(options, entry, format, writeMeta) { nameCache.minify, ); } - } catch (e) { } + } catch (e) {} } loadNameCache(); @@ -477,20 +477,20 @@ function createConfig(options, entry, format, writeMeta) { plugins: [ autoprefixer(), options.compress !== false && - cssnano({ - preset: 'default', - }), + cssnano({ + preset: 'default', + }), ].filter(Boolean), // only write out CSS for the first bundle (avoids pointless extra files): inject: false, extract: !!writeMeta, }), Object.keys(moduleAliases).length > 0 && - alias( - Object.assign({}, moduleAliases, { - resolve: EXTENSIONS, - }), - ), + alias( + Object.assign({}, moduleAliases, { + resolve: EXTENSIONS, + }), + ), nodeResolve({ mainFields: ['module', 'jsnext', 'main'], browser: options.target !== 'node', @@ -521,22 +521,22 @@ function createConfig(options, entry, format, writeMeta) { }, }, useTypescript && - typescript({ - typescript: require('typescript'), - cacheRoot: `./node_modules/.cache/.rts2_cache_${format}`, - tsconfigDefaults: { - compilerOptions: { - sourceMap: options.sourcemap, - declaration: true, - jsx: options.jsx, + typescript({ + typescript: require('typescript'), + cacheRoot: `./node_modules/.cache/.rts2_cache_${format}`, + tsconfigDefaults: { + compilerOptions: { + sourceMap: options.sourcemap, + declaration: true, + jsx: options.jsx, + }, }, - }, - tsconfigOverride: { - compilerOptions: { - target: 'esnext', + tsconfigOverride: { + compilerOptions: { + target: 'esnext', + }, }, - }, - }), + }), !useTypescript && flow({ all: true, pretty: true }), babel({ babelrc: false, @@ -553,22 +553,26 @@ function createConfig(options, entry, format, writeMeta) { babel({ extensions: EXTENSIONS, exclude: 'node_modules/**', + passPerPreset: true, // @see https://babeljs.io/docs/en/options#passperpreset presets: [ [ '@babel/preset-env', { loose: true, modules: false, - useBuiltIns: 'usage', - corejs: 2, targets: - options.target === 'node' ? { node: '6' } : undefined, + options.target === 'node' ? { node: '8' } : undefined, exclude: ['transform-async-to-generator'], }, ], ], plugins: [ - require.resolve('@babel/plugin-syntax-jsx'), + [ + require.resolve('@babel/plugin-transform-react-jsx'), + { + pragma: options.jsx, + }, + ], [ require.resolve('babel-plugin-transform-replace-expressions'), { replace: defines }, @@ -667,8 +671,8 @@ function createConfig(options, entry, format, writeMeta) { file: resolve( options.cwd, (format === 'es' && moduleMain) || - (format === 'umd' && umdMain) || - cjsMain, + (format === 'umd' && umdMain) || + cjsMain, ), }, }; diff --git a/test/__snapshots__/index.test.js.snap b/test/__snapshots__/index.test.js.snap index a51990c..b396964 100644 --- a/test/__snapshots__/index.test.js.snap +++ b/test/__snapshots__/index.test.js.snap @@ -117,30 +117,30 @@ async-ts Build \\"asyncTs\\" to dist: -75 B: async-ts.js.gz -57 B: async-ts.js.br -77 B: async-ts.mjs.gz -63 B: async-ts.mjs.br -180 B: async-ts.umd.js.gz -139 B: async-ts.umd.js.br" +84 B: async-ts.js.gz +61 B: async-ts.js.br +94 B: async-ts.mjs.gz +76 B: async-ts.mjs.br +187 B: async-ts.umd.js.gz +150 B: async-ts.umd.js.br" `; exports[`fixtures build async-ts with microbundle 2`] = `7`; exports[`fixtures build async-ts with microbundle 3`] = ` -"var o=function(){};o.prototype.foo=function(){},exports.MyClass=o; +"exports.MyClass=function(){function o(){}return o.prototype.foo=function(){},o}(); //# sourceMappingURL=async-ts.js.map " `; exports[`fixtures build async-ts with microbundle 4`] = ` -"var o=function(){};o.prototype.foo=function(){};export{o as MyClass}; +"var o=function(){function o(){}return o.prototype.foo=function(){},o}();export{o as MyClass}; //# sourceMappingURL=async-ts.mjs.map " `; exports[`fixtures build async-ts with microbundle 5`] = ` -"!function(e,o){\\"object\\"==typeof exports&&\\"undefined\\"!=typeof module?o(exports):\\"function\\"==typeof define&&define.amd?define([\\"exports\\"],o):o((e=e||self).asyncTs={})}(this,function(e){var o=function(){};o.prototype.foo=function(){},e.MyClass=o}); +"!function(e,n){\\"object\\"==typeof exports&&\\"undefined\\"!=typeof module?n(exports):\\"function\\"==typeof define&&define.amd?define([\\"exports\\"],n):n((e=e||self).asyncTs={})}(this,function(e){e.MyClass=function(){function e(){}return e.prototype.foo=function(){},e}()}); //# sourceMappingURL=async-ts.umd.js.map " `; @@ -172,30 +172,30 @@ basic Build \\"basicLib\\" to dist: -202 B: basic-lib.js.gz -145 B: basic-lib.js.br -203 B: basic-lib.mjs.gz -145 B: basic-lib.mjs.br -287 B: basic-lib.umd.js.gz -222 B: basic-lib.umd.js.br" +229 B: basic-lib.js.gz +174 B: basic-lib.js.br +230 B: basic-lib.mjs.gz +177 B: basic-lib.mjs.br +313 B: basic-lib.umd.js.gz +251 B: basic-lib.umd.js.br" `; exports[`fixtures build basic with microbundle 2`] = `6`; exports[`fixtures build basic with microbundle 3`] = ` -"var r=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];try{return Promise.resolve(r.reduce(function(r,e){return r+e},0))}catch(r){return Promise.reject(r)}};module.exports=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];try{return Promise.resolve(r.apply(void 0,e)).then(function(t){return Promise.resolve(r.apply(void 0,e)).then(function(r){return[t,r]})})}catch(r){return Promise.reject(r)}}; +"var r=function(){try{for(var r=arguments.length,e=new Array(r),n=0;n0;)o[e]=arguments[e+2];return{tag:r,props:n,children:o}},n=function(){};n.prototype.render=function(){return r(\\"div\\",{id:\\"app\\"},r(\\"h1\\",null,\\"Hello, World!\\"),r(\\"p\\",null,\\"A JSX demo.\\"))},module.exports=n; +"var r=function(r,n){for(var e=arguments.length,o=new Array(e>2?e-2:0),t=2;t0;)e[o]=arguments[o+2];return{tag:r,props:n,children:e}},n=function(){};n.prototype.render=function(){return r(\\"div\\",{id:\\"app\\"},r(\\"h1\\",null,\\"Hello, World!\\"),r(\\"p\\",null,\\"A JSX demo.\\"))};export default n; +"var r=function(r,n){for(var e=arguments.length,t=new Array(e>2?e-2:0),o=2;o0;)o[t]=arguments[t+2];return{tag:e,props:n,children:o}},n=function(){};return n.prototype.render=function(){return e(\\"div\\",{id:\\"app\\"},e(\\"h1\\",null,\\"Hello, World!\\"),e(\\"p\\",null,\\"A JSX demo.\\"))},n}); +"!function(e,n){\\"object\\"==typeof exports&&\\"undefined\\"!=typeof module?module.exports=n():\\"function\\"==typeof define&&define.amd?define(n):(e=e||self).basicLibTsx=n()}(this,function(){var e=function(e,n){for(var o=arguments.length,t=new Array(o>2?o-2:0),r=2;r0;)o[e]=arguments[e+2];return{tag:r,props:n,children:o}},n=function(){};n.prototype.render=function(){return r(\\"div\\",{id:\\"app\\"},r(\\"h1\\",null,\\"Hello, World!\\"),r(\\"p\\",null,\\"A JSX demo.\\"))},module.exports=n; +"module.exports=function(){function e(){}return e.prototype.render=function(){return React.createElement(\\"div\\",{id:\\"app\\"},React.createElement(\\"h1\\",null,\\"Hello, World!\\"),React.createElement(\\"p\\",null,\\"A JSX demo.\\"))},e}(); //# sourceMappingURL=jsx.js.map " `; exports[`fixtures build jsx with microbundle 4`] = ` -"var r=function(r,n){for(var e=[],o=arguments.length-2;o-- >0;)e[o]=arguments[o+2];return{tag:r,props:n,children:e}},n=function(){};n.prototype.render=function(){return r(\\"div\\",{id:\\"app\\"},r(\\"h1\\",null,\\"Hello, World!\\"),r(\\"p\\",null,\\"A JSX demo.\\"))};export default n; +"export default(function(){function e(){}return e.prototype.render=function(){return React.createElement(\\"div\\",{id:\\"app\\"},React.createElement(\\"h1\\",null,\\"Hello, World!\\"),React.createElement(\\"p\\",null,\\"A JSX demo.\\"))},e}()); //# sourceMappingURL=jsx.mjs.map " `; exports[`fixtures build jsx with microbundle 5`] = ` -"!function(e,n){\\"object\\"==typeof exports&&\\"undefined\\"!=typeof module?module.exports=n():\\"function\\"==typeof define&&define.amd?define(n):(e=e||self).jsx=n()}(this,function(){var e=function(e,n){for(var o=[],t=arguments.length-2;t-- >0;)o[t]=arguments[t+2];return{tag:e,props:n,children:o}},n=function(){};return n.prototype.render=function(){return e(\\"div\\",{id:\\"app\\"},e(\\"h1\\",null,\\"Hello, World!\\"),e(\\"p\\",null,\\"A JSX demo.\\"))},n}); +"!function(e,t){\\"object\\"==typeof exports&&\\"undefined\\"!=typeof module?module.exports=t():\\"function\\"==typeof define&&define.amd?define(t):(e=e||self).jsx=t()}(this,function(){return function(){function e(){}return e.prototype.render=function(){return React.createElement(\\"div\\",{id:\\"app\\"},React.createElement(\\"h1\\",null,\\"Hello, World!\\"),React.createElement(\\"p\\",null,\\"A JSX demo.\\"))},e}()}); //# sourceMappingURL=jsx.umd.js.map " `; @@ -962,30 +962,30 @@ name-custom-amd Build \\"customNameAmd\\" to dist: -202 B: name-custom-amd.js.gz -145 B: name-custom-amd.js.br -203 B: name-custom-amd.mjs.gz -145 B: name-custom-amd.mjs.br -291 B: name-custom-amd.umd.js.gz -225 B: name-custom-amd.umd.js.br" +229 B: name-custom-amd.js.gz +174 B: name-custom-amd.js.br +230 B: name-custom-amd.mjs.gz +177 B: name-custom-amd.mjs.br +317 B: name-custom-amd.umd.js.gz +253 B: name-custom-amd.umd.js.br" `; exports[`fixtures build name-custom-amd with microbundle 2`] = `6`; exports[`fixtures build name-custom-amd with microbundle 3`] = ` -"var r=function(){for(var r=[],e=arguments.length;e--;)r[e]=arguments[e];try{return Promise.resolve(r.reduce(function(r,e){return r+e},0))}catch(r){return Promise.reject(r)}};module.exports=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];try{return Promise.resolve(r.apply(void 0,e)).then(function(t){return Promise.resolve(r.apply(void 0,e)).then(function(r){return[t,r]})})}catch(r){return Promise.reject(r)}}; +"var r=function(){try{for(var r=arguments.length,e=new Array(r),n=0;n Date: Mon, 6 May 2019 15:28:33 +0200 Subject: [PATCH 04/10] add script to generate csv output --- package.json | 1 + test/index.test.js | 56 +++----------------------------- tools/build-fixture.js | 66 ++++++++++++++++++++++++++++++++++++++ tools/generate-filesize.js | 50 +++++++++++++++++++++++++++++ 4 files changed, 121 insertions(+), 52 deletions(-) create mode 100644 tools/build-fixture.js create mode 100644 tools/generate-filesize.js diff --git a/package.json b/package.json index 2257bea..0814449 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "@babel/core": "^7.4.4", "@babel/plugin-proposal-class-properties": "7.4.4", "@babel/plugin-syntax-jsx": "^7.2.0", + "@babel/plugin-transform-react-jsx": "^7.3.0", "@babel/polyfill": "^7.4.4", "asyncro": "^3.0.0", "autoprefixer": "^9.5.1", diff --git a/test/index.test.js b/test/index.test.js index 7596f03..e7ee269 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -1,15 +1,8 @@ import { resolve } from 'path'; import fs from 'fs-extra'; -import { promisify } from 'es6-promisify'; import dirTree from 'directory-tree'; -import shellQuote from 'shell-quote'; -import _rimraf from 'rimraf'; import { strip } from './lib/util'; -import { readFile } from '../src/utils'; -import createProg from '../src/prog'; -import microbundle from '../src/index'; - -const rimraf = promisify(_rimraf); +import { buildDirectory, getBuildScript } from '../tools/build-fixture'; const FIXTURES_DIR = `${__dirname}/fixtures`; const DEFAULT_SCRIPT = 'microbundle'; @@ -31,29 +24,6 @@ const printTree = (nodes, indentLevel = 0) => { ); }; -const getBuildScript = async (fixturePath, defaultScript) => { - let pkg = {}; - try { - pkg = JSON.parse( - await readFile(resolve(fixturePath, 'package.json'), 'utf8'), - ); - } catch (err) { - if (err.code !== 'ENOENT') throw err; - } - return (pkg && pkg.scripts && pkg.scripts.build) || defaultScript; -}; - -const parseScript = (() => { - let parsed; - const prog = createProg(_parsed => (parsed = _parsed)); - return script => { - const argv = shellQuote.parse(`node ${script}`); - // assuming {op: 'glob', pattern} for non-string args - prog(argv.map(arg => (typeof arg === 'string' ? arg : arg.pattern))); - return parsed; - }; -})(); - describe('fixtures', () => { const dirs = fs .readdirSync(FIXTURES_DIR) @@ -69,38 +39,20 @@ describe('fixtures', () => { fixturePath = resolve(fixturePath, fixtureDir.replace('-with-cwd', '')); } - const dist = resolve(`${fixturePath}/dist`); - // clean up - await rimraf(dist); - await rimraf(resolve(`${fixturePath}/.rts2_cache_cjs`)); - await rimraf(resolve(`${fixturePath}/.rts2_cache_es`)); - await rimraf(resolve(`${fixturePath}/.rts2_cache_umd`)); - - const script = await getBuildScript(fixturePath, DEFAULT_SCRIPT); - - const prevDir = process.cwd(); - process.chdir(resolve(fixturePath)); - - const parsedOpts = parseScript(script); - - const output = await microbundle({ - ...parsedOpts, - cwd: parsedOpts.cwd !== '.' ? parsedOpts.cwd : resolve(fixturePath), - }); - - process.chdir(prevDir); + const output = await buildDirectory(fixtureDir); const printedDir = printTree([dirTree(fixturePath)]); expect( [ - `Used script: ${script}`, + `Used script: ${await getBuildScript(fixturePath, DEFAULT_SCRIPT)}`, 'Directory tree:', printedDir, strip(output), ].join('\n\n'), ).toMatchSnapshot(); + const dist = resolve(`${fixturePath}/dist`); const files = fs.readdirSync(resolve(dist)); expect(files.length).toMatchSnapshot(); // we don't realy care about the content of a sourcemap diff --git a/tools/build-fixture.js b/tools/build-fixture.js new file mode 100644 index 0000000..60c522e --- /dev/null +++ b/tools/build-fixture.js @@ -0,0 +1,66 @@ +import { resolve } from 'path'; +import { promisify } from 'es6-promisify'; +import shellQuote from 'shell-quote'; +import _rimraf from 'rimraf'; +import { readFile } from '../src/utils'; +import createProg from '../src/prog'; +import microbundle from '../src/index'; + +const rimraf = promisify(_rimraf); + +const FIXTURES_DIR = resolve(`${__dirname}/../test/fixtures`); +const DEFAULT_SCRIPT = 'microbundle'; + +const parseScript = (() => { + let parsed; + const prog = createProg(_parsed => (parsed = _parsed)); + + return script => { + const argv = shellQuote.parse(`node ${script}`); + // assuming {op: 'glob', pattern} for non-string args + prog(argv.map(arg => (typeof arg === 'string' ? arg : arg.pattern))); + return parsed; + }; +})(); + +export const getBuildScript = async (fixturePath, defaultScript) => { + let pkg = {}; + try { + pkg = JSON.parse( + await readFile(resolve(fixturePath, 'package.json'), 'utf8'), + ); + } catch (err) { + if (err.code !== 'ENOENT') throw err; + } + return (pkg && pkg.scripts && pkg.scripts.build) || defaultScript; +}; + +export const buildDirectory = async fixtureDir => { + let fixturePath = resolve(FIXTURES_DIR, fixtureDir); + if (fixtureDir.endsWith('-with-cwd')) { + fixturePath = resolve(fixturePath, fixtureDir.replace('-with-cwd', '')); + } + + const dist = resolve(`${fixturePath}/dist`); + // clean up + await rimraf(dist); + await rimraf(resolve(`${fixturePath}/.rts2_cache_cjs`)); + await rimraf(resolve(`${fixturePath}/.rts2_cache_es`)); + await rimraf(resolve(`${fixturePath}/.rts2_cache_umd`)); + + const script = await getBuildScript(fixturePath, DEFAULT_SCRIPT); + + const prevDir = process.cwd(); + process.chdir(resolve(fixturePath)); + + const parsedOpts = parseScript(script); + let output = ''; + output = await microbundle({ + ...parsedOpts, + cwd: parsedOpts.cwd !== '.' ? parsedOpts.cwd : resolve(fixturePath), + }); + + process.chdir(prevDir); + + return output; +}; diff --git a/tools/generate-filesize.js b/tools/generate-filesize.js new file mode 100644 index 0000000..376db44 --- /dev/null +++ b/tools/generate-filesize.js @@ -0,0 +1,50 @@ +// eslint-ignore +require = require('esm')(module); + +const { resolve } = require('path'); +const fs = require('fs-extra'); +const { buildDirectory } = require('./build-fixture'); + +const FIXTURES_DIR = `${__dirname}/../test/fixtures`; + +const each = fn => arr => { + arr = Array.isArray(arr) ? arr : [arr]; + + return arr + .reduce( + (prev, curr, i) => prev.then(() => fn(curr, i, arr.length)), + Promise.resolve(), + ) + .then(() => arr); +}; + +const dirs = fs + .readdirSync(FIXTURES_DIR) + .filter(fixturePath => + fs.statSync(resolve(FIXTURES_DIR, fixturePath)).isDirectory(), + ); + +(async () => { + const csv = []; + + await each(async fixtureDir => { + let fixturePath = resolve(FIXTURES_DIR, fixtureDir); + if (fixtureDir.endsWith('-with-cwd')) { + fixturePath = resolve(fixturePath, fixtureDir.replace('-with-cwd', '')); + } + + await buildDirectory(fixtureDir); + + const dist = resolve(`${fixturePath}/dist`); + fs.readdirSync(dist) + .filter(file => !/\.map$/.test(file)) + .forEach(file => { + const size = fs.statSync(resolve(`${dist}/${file}`)).size; + csv.push(`${fixtureDir}/${file},${size}`); + }); + })(dirs); + + csv.unshift('file,size'); + + console.log(csv.join('\n')); +})(); From 0633b7f6e89484336f1bcc80ec6ddf1d1e416ed8 Mon Sep 17 00:00:00 2001 From: Ward Peeters Date: Mon, 6 May 2019 15:50:10 +0200 Subject: [PATCH 05/10] default jsx to h --- src/index.js | 4 ++-- test/__snapshots__/index.test.js.snap | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/index.js b/src/index.js index a853bea..08b12af 100644 --- a/src/index.js +++ b/src/index.js @@ -528,7 +528,7 @@ function createConfig(options, entry, format, writeMeta) { compilerOptions: { sourceMap: options.sourcemap, declaration: true, - jsx: options.jsx, + jsx: options.jsx || 'h', }, }, tsconfigOverride: { @@ -570,7 +570,7 @@ function createConfig(options, entry, format, writeMeta) { [ require.resolve('@babel/plugin-transform-react-jsx'), { - pragma: options.jsx, + pragma: options.jsx || 'h', }, ], [ diff --git a/test/__snapshots__/index.test.js.snap b/test/__snapshots__/index.test.js.snap index b396964..c15a4a6 100644 --- a/test/__snapshots__/index.test.js.snap +++ b/test/__snapshots__/index.test.js.snap @@ -914,30 +914,30 @@ jsx Build \\"jsx\\" to dist: -160 B: jsx.js.gz -125 B: jsx.js.br -162 B: jsx.mjs.gz -124 B: jsx.mjs.br -241 B: jsx.umd.js.gz -197 B: jsx.umd.js.br" +235 B: jsx.js.gz +188 B: jsx.js.br +239 B: jsx.mjs.gz +191 B: jsx.mjs.br +309 B: jsx.umd.js.gz +260 B: jsx.umd.js.br" `; exports[`fixtures build jsx with microbundle 2`] = `6`; exports[`fixtures build jsx with microbundle 3`] = ` -"module.exports=function(){function e(){}return e.prototype.render=function(){return React.createElement(\\"div\\",{id:\\"app\\"},React.createElement(\\"h1\\",null,\\"Hello, World!\\"),React.createElement(\\"p\\",null,\\"A JSX demo.\\"))},e}(); +"var r=function(r,n){for(var e=arguments.length,o=new Array(e>2?e-2:0),t=2;t2?e-2:0),o=2;o2?o-2:0),r=2;r Date: Tue, 14 May 2019 15:28:37 +0200 Subject: [PATCH 06/10] fix snapshots --- .gitignore | 1 + src/index.js | 4 +++- test/__snapshots__/index.test.js.snap | 18 +++++++++--------- test/fixtures/jsx/index.js | 4 ++++ tools/generate-filesize.js | 2 +- 5 files changed, 18 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index fe2f58b..cb18a8d 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ yarn.lock .vscode .idea .rts2* +sizes.csv diff --git a/src/index.js b/src/index.js index 08b12af..ee05195 100644 --- a/src/index.js +++ b/src/index.js @@ -528,7 +528,8 @@ function createConfig(options, entry, format, writeMeta) { compilerOptions: { sourceMap: options.sourcemap, declaration: true, - jsx: options.jsx || 'h', + jsx: 'react', + jsxFactory: options.jsx || 'h', }, }, tsconfigOverride: { @@ -571,6 +572,7 @@ function createConfig(options, entry, format, writeMeta) { require.resolve('@babel/plugin-transform-react-jsx'), { pragma: options.jsx || 'h', + pragmaFrag: options.jsxFragment || 'Fragment', }, ], [ diff --git a/test/__snapshots__/index.test.js.snap b/test/__snapshots__/index.test.js.snap index c15a4a6..73a4188 100644 --- a/test/__snapshots__/index.test.js.snap +++ b/test/__snapshots__/index.test.js.snap @@ -914,30 +914,30 @@ jsx Build \\"jsx\\" to dist: -235 B: jsx.js.gz -188 B: jsx.js.br -239 B: jsx.mjs.gz -191 B: jsx.mjs.br -309 B: jsx.umd.js.gz -260 B: jsx.umd.js.br" +262 B: jsx.js.gz +209 B: jsx.js.br +261 B: jsx.mjs.gz +208 B: jsx.mjs.br +335 B: jsx.umd.js.gz +278 B: jsx.umd.js.br" `; exports[`fixtures build jsx with microbundle 2`] = `6`; exports[`fixtures build jsx with microbundle 3`] = ` -"var r=function(r,n){for(var e=arguments.length,o=new Array(e>2?e-2:0),t=2;t2?e-2:0),l=2;l2?e-2:0),o=2;o2?e-2:0),l=2;l2?o-2:0),r=2;r2?t-2:0),o=2;o ({ tag, props, children }); +const Fragment = ({ children }) => children; export default class Foo { render() { @@ -6,6 +7,9 @@ export default class Foo {

Hello, World!

A JSX demo.

+ +

Test fragment

+
); } diff --git a/tools/generate-filesize.js b/tools/generate-filesize.js index 376db44..3fc4bc1 100644 --- a/tools/generate-filesize.js +++ b/tools/generate-filesize.js @@ -46,5 +46,5 @@ const dirs = fs csv.unshift('file,size'); - console.log(csv.join('\n')); + fs.writeFile(resolve(__dirname, '../sizes.csv'), csv.join('\n')); })(); From 21a6c51a08292e2c771028251ba2009dcba50182 Mon Sep 17 00:00:00 2001 From: Ward Peeters Date: Wed, 15 May 2019 10:51:01 +0200 Subject: [PATCH 07/10] add esm to package;json --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 0814449..1d73677 100644 --- a/package.json +++ b/package.json @@ -89,6 +89,7 @@ "eslint-config-developit": "^1.1.1", "eslint-config-prettier": "^4.2.0", "eslint-plugin-prettier": "^3.0.1", + "esm": "^3.2.22", "fs-extra": "^7.0.1", "husky": "^2.2.0", "jest": "^24.8.0", From 25e5be728cd75c4a7eccac818f0f05941752174f Mon Sep 17 00:00:00 2001 From: Ward Peeters Date: Wed, 15 May 2019 11:21:51 +0200 Subject: [PATCH 08/10] cleanup comments --- src/index.js | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/index.js b/src/index.js index ee05195..69be9e3 100644 --- a/src/index.js +++ b/src/index.js @@ -589,29 +589,6 @@ function createConfig(options, entry, format, writeMeta) { ], ], }), - // buble({ - // exclude: 'node_modules/**', - // jsx: options.jsx || 'h', - // objectAssign: options.assign || 'Object.assign', - // transforms: { - // dangerousForOf: true, - // dangerousTaggedTemplateString: true, - // }, - // }), - // We should upstream this to rollup - // format==='cjs' && replace({ - // [`module.exports = ${rollupName};`]: '', - // [`var ${rollupName} =`]: 'module.exports =' - // }), - // This works for the general case, but could cause nasty scope bugs. - // format==='umd' && replace({ - // [`return ${rollupName};`]: '', - // [`var ${rollupName} =`]: 'return' - // }), - // format==='es' && replace({ - // [`export default ${rollupName};`]: '', - // [`var ${rollupName} =`]: 'export default' - // }), options.compress !== false && [ terser({ sourcemap: true, From 34717de4d725ed3be44e6111ce88a9b7f3bdcc93 Mon Sep 17 00:00:00 2001 From: Ward Peeters Date: Wed, 15 May 2019 15:58:39 +0200 Subject: [PATCH 09/10] fix jsx pragmaFrag --- package.json | 1 + src/index.js | 5 ++--- src/lib/flow-plugin.js | 12 ------------ test/fixtures/jsx/index.js | 5 +++-- 4 files changed, 6 insertions(+), 17 deletions(-) delete mode 100644 src/lib/flow-plugin.js diff --git a/package.json b/package.json index 1d73677..9b6e1af 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "@babel/plugin-syntax-jsx": "^7.2.0", "@babel/plugin-transform-react-jsx": "^7.3.0", "@babel/polyfill": "^7.4.4", + "@babel/preset-flow": "^7.0.0", "asyncro": "^3.0.0", "autoprefixer": "^9.5.1", "babel-plugin-transform-async-to-promises": "^0.8.10", diff --git a/src/index.js b/src/index.js index 69be9e3..657cb0b 100644 --- a/src/index.js +++ b/src/index.js @@ -17,7 +17,6 @@ import brotliSize from 'brotli-size'; import prettyBytes from 'pretty-bytes'; import typescript from 'rollup-plugin-typescript2'; import json from 'rollup-plugin-json'; -import flow from './lib/flow-plugin'; import logError from './log-error'; import { readFile, isDir, isFile, stdout, stderr } from './utils'; import camelCase from 'camelcase'; @@ -538,7 +537,6 @@ function createConfig(options, entry, format, writeMeta) { }, }, }), - !useTypescript && flow({ all: true, pretty: true }), babel({ babelrc: false, configFile: false, @@ -566,7 +564,8 @@ function createConfig(options, entry, format, writeMeta) { exclude: ['transform-async-to-generator'], }, ], - ], + !useTypescript && ['@babel/preset-flow', { all: true }], + ].filter(Boolean), plugins: [ [ require.resolve('@babel/plugin-transform-react-jsx'), diff --git a/src/lib/flow-plugin.js b/src/lib/flow-plugin.js deleted file mode 100644 index b90705d..0000000 --- a/src/lib/flow-plugin.js +++ /dev/null @@ -1,12 +0,0 @@ -import flow from 'rollup-plugin-flow'; - -export default function fixedFlow(options) { - let plugin = flow(options); - return Object.assign({}, plugin, { - transform(code, id) { - let ret = plugin.transform(code, id); - if (ret && ret.code === code) return null; - return ret; - }, - }); -} diff --git a/test/fixtures/jsx/index.js b/test/fixtures/jsx/index.js index c927d9a..6a225ec 100644 --- a/test/fixtures/jsx/index.js +++ b/test/fixtures/jsx/index.js @@ -1,4 +1,5 @@ const h = (tag, props, ...children) => ({ tag, props, children }); +// eslint-disable-next-line no-unused-vars const Fragment = ({ children }) => children; export default class Foo { @@ -7,9 +8,9 @@ export default class Foo {

Hello, World!

A JSX demo.

- + <>

Test fragment

-
+
); } From 3483790b0191c39cfe660526c4cd371ccdba87fd Mon Sep 17 00:00:00 2001 From: Ward Peeters Date: Sat, 25 May 2019 12:09:55 +0200 Subject: [PATCH 10/10] add unit test for babelrc --- package.json | 1 + test/__snapshots__/index.test.js.snap | 47 ++++++++++++++++++++++++ test/fixtures/basic-babelrc/.babelrc | 3 ++ test/fixtures/basic-babelrc/package.json | 3 ++ test/fixtures/basic-babelrc/src/index.js | 5 +++ 5 files changed, 59 insertions(+) create mode 100644 test/fixtures/basic-babelrc/.babelrc create mode 100644 test/fixtures/basic-babelrc/package.json create mode 100644 test/fixtures/basic-babelrc/src/index.js diff --git a/package.json b/package.json index 9b6e1af..283ccc7 100644 --- a/package.json +++ b/package.json @@ -81,6 +81,7 @@ "devDependencies": { "@babel/cli": "^7.4.4", "@babel/node": "^7.2.2", + "@babel/plugin-proposal-throw-expressions": "^7.2.0", "@babel/preset-env": "^7.4.4", "babel-core": "^7.0.0-bridge.0", "babel-jest": "^24.8.0", diff --git a/test/__snapshots__/index.test.js.snap b/test/__snapshots__/index.test.js.snap index 73a4188..538a788 100644 --- a/test/__snapshots__/index.test.js.snap +++ b/test/__snapshots__/index.test.js.snap @@ -200,6 +200,53 @@ exports[`fixtures build basic with microbundle 5`] = ` " `; +exports[`fixtures build basic-babelrc with microbundle 1`] = ` +"Used script: microbundle + +Directory tree: + +basic-babelrc + dist + basic-babelrc.js + basic-babelrc.js.map + basic-babelrc.mjs + basic-babelrc.mjs.map + basic-babelrc.umd.js + basic-babelrc.umd.js.map + package.json + src + index.js + + +Build \\"basicBabelrc\\" to dist: +108 B: basic-babelrc.js.gz +83 B: basic-babelrc.js.br +108 B: basic-babelrc.mjs.gz +83 B: basic-babelrc.mjs.br +150 B: basic-babelrc.umd.js.gz +108 B: basic-babelrc.umd.js.br" +`; + +exports[`fixtures build basic-babelrc with microbundle 2`] = `6`; + +exports[`fixtures build basic-babelrc with microbundle 3`] = ` +"var r;void 0===(r=!0)&&(r=function(r){throw new Error(\\"required!\\")}()),!0===r||function(r){throw new Error(\\"Falsey!\\")}(); +//# sourceMappingURL=basic-babelrc.js.map +" +`; + +exports[`fixtures build basic-babelrc with microbundle 4`] = ` +"var r;void 0===(r=!0)&&(r=function(r){throw new Error(\\"required!\\")}()),!0===r||function(r){throw new Error(\\"Falsey!\\")}(); +//# sourceMappingURL=basic-babelrc.mjs.map +" +`; + +exports[`fixtures build basic-babelrc with microbundle 5`] = ` +"!function(n){\\"function\\"==typeof define&&define.amd?define(n):n()}(function(){var n;void 0===(n=!0)&&(n=function(n){throw new Error(\\"required!\\")}()),!0===n||function(n){throw new Error(\\"Falsey!\\")}()}); +//# sourceMappingURL=basic-babelrc.umd.js.map +" +`; + exports[`fixtures build basic-css with microbundle 1`] = ` "Used script: microbundle diff --git a/test/fixtures/basic-babelrc/.babelrc b/test/fixtures/basic-babelrc/.babelrc new file mode 100644 index 0000000..850c6e2 --- /dev/null +++ b/test/fixtures/basic-babelrc/.babelrc @@ -0,0 +1,3 @@ +{ + "plugins": ["@babel/plugin-proposal-throw-expressions"] +} diff --git a/test/fixtures/basic-babelrc/package.json b/test/fixtures/basic-babelrc/package.json new file mode 100644 index 0000000..c3b8b72 --- /dev/null +++ b/test/fixtures/basic-babelrc/package.json @@ -0,0 +1,3 @@ +{ + "name": "basic-babelrc" +} diff --git a/test/fixtures/basic-babelrc/src/index.js b/test/fixtures/basic-babelrc/src/index.js new file mode 100644 index 0000000..6035ba9 --- /dev/null +++ b/test/fixtures/basic-babelrc/src/index.js @@ -0,0 +1,5 @@ +function test(param = throw new Error('required!')) { + return param === true || throw new Error('Falsey!'); +} + +test(true);