Skip to content

Commit 2dd4afe

Browse files
Fix babel cache bleed (#570)
* Instantiate babel.custom() separately for each output * Update index.js * prettier * prettier * lint fixes * revert unrelated terser change * add test for modern + generators Co-authored-by: Leah <me@hrmny.sh>
1 parent 6310450 commit 2dd4afe

6 files changed

Lines changed: 198 additions & 116 deletions

File tree

src/index.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ function createConfig(options, entry, format, writeMeta) {
467467

468468
const externalPredicate = new RegExp(`^(${external.join('|')})($|/)`);
469469
const externalTest =
470-
external.length === 0 ? () => false : id => externalPredicate.test(id);
470+
external.length === 0 ? id => false : id => externalPredicate.test(id);
471471

472472
function loadNameCache() {
473473
try {
@@ -577,7 +577,7 @@ function createConfig(options, entry, format, writeMeta) {
577577
],
578578
],
579579
}),
580-
customBabel({
580+
customBabel()({
581581
extensions: EXTENSIONS,
582582
exclude: 'node_modules/**',
583583
passPerPreset: true, // @see https://babeljs.io/docs/en/options#passperpreset
@@ -624,6 +624,7 @@ function createConfig(options, entry, format, writeMeta) {
624624
fs.writeFile(
625625
getNameCachePath(),
626626
JSON.stringify(nameCache, null, 2),
627+
() => {},
627628
);
628629
}
629630
},
@@ -632,9 +633,11 @@ function createConfig(options, entry, format, writeMeta) {
632633
{
633634
writeBundle(bundle) {
634635
config._sizeInfo = Promise.all(
635-
Object.values(bundle).map(({ code, fileName }) =>
636-
code ? getSizeInfo(code, fileName, options.raw) : false,
637-
),
636+
Object.values(bundle).map(({ code, fileName }) => {
637+
if (code) {
638+
return getSizeInfo(code, fileName, options.raw);
639+
}
640+
}),
638641
).then(results => results.filter(Boolean).join('\n'));
639642
},
640643
},

src/lib/babel-custom.js

Lines changed: 116 additions & 111 deletions
Original file line numberDiff line numberDiff line change
@@ -44,121 +44,126 @@ const createConfigItems = (type, items) => {
4444

4545
const presetEnvRegex = RegExp(/@babel\/(preset-)?env/);
4646

47-
export default babelPlugin.custom(babelCore => {
48-
return {
49-
// Passed the plugin options.
50-
options({ custom: customOptions, ...pluginOptions }) {
51-
return {
52-
// Pull out any custom options that the plugin might have.
53-
customOptions,
54-
55-
// Pass the options back with the two custom options removed.
56-
pluginOptions,
57-
};
58-
},
59-
60-
config(config, { customOptions }) {
61-
const defaultPlugins = createConfigItems(
62-
'plugin',
63-
[
64-
{
65-
name: '@babel/plugin-transform-react-jsx',
66-
pragma: customOptions.pragma || 'h',
67-
pragmaFrag: customOptions.pragmaFrag || 'Fragment',
68-
},
69-
!customOptions.typescript && {
70-
name: '@babel/plugin-transform-flow-strip-types',
71-
},
72-
isTruthy(customOptions.defines) && {
73-
name: 'babel-plugin-transform-replace-expressions',
74-
replace: customOptions.defines,
75-
},
76-
!customOptions.modern && {
77-
name: 'babel-plugin-transform-async-to-promises',
78-
inlineHelpers: true,
79-
externalHelpers: true,
80-
},
81-
{
82-
name: '@babel/plugin-proposal-class-properties',
83-
loose: true,
84-
},
85-
!customOptions.modern && {
86-
name: '@babel/plugin-transform-regenerator',
87-
async: false,
88-
},
89-
{
90-
name: 'babel-plugin-macros',
91-
},
92-
].filter(Boolean),
93-
);
94-
95-
const babelOptions = config.options || {};
47+
export default () => {
48+
return babelPlugin.custom(babelCore => {
49+
return {
50+
// Passed the plugin options.
51+
options({ custom: customOptions, ...pluginOptions }) {
52+
return {
53+
// Pull out any custom options that the plugin might have.
54+
customOptions,
55+
56+
// Pass the options back with the two custom options removed.
57+
pluginOptions,
58+
};
59+
},
60+
61+
config(config, { customOptions }) {
62+
const defaultPlugins = createConfigItems(
63+
'plugin',
64+
[
65+
{
66+
name: '@babel/plugin-transform-react-jsx',
67+
pragma: customOptions.pragma || 'h',
68+
pragmaFrag: customOptions.pragmaFrag || 'Fragment',
69+
},
70+
!customOptions.typescript && {
71+
name: '@babel/plugin-transform-flow-strip-types',
72+
},
73+
isTruthy(customOptions.defines) && {
74+
name: 'babel-plugin-transform-replace-expressions',
75+
replace: customOptions.defines,
76+
},
77+
!customOptions.modern && {
78+
name: 'babel-plugin-transform-async-to-promises',
79+
inlineHelpers: true,
80+
externalHelpers: true,
81+
},
82+
{
83+
name: '@babel/plugin-proposal-class-properties',
84+
loose: true,
85+
},
86+
!customOptions.modern && {
87+
name: '@babel/plugin-transform-regenerator',
88+
async: false,
89+
},
90+
{
91+
name: 'babel-plugin-macros',
92+
},
93+
].filter(Boolean),
94+
);
9695

97-
const envIdx = (babelOptions.presets || []).findIndex(preset =>
98-
presetEnvRegex.test(preset.file.request),
99-
);
96+
const babelOptions = config.options || {};
10097

101-
const environmentPreset = customOptions.modern
102-
? '@babel/preset-modules'
103-
: '@babel/preset-env';
98+
const envIdx = (babelOptions.presets || []).findIndex(preset =>
99+
presetEnvRegex.test(preset.file.request),
100+
);
104101

105-
if (envIdx !== -1) {
106-
const preset = babelOptions.presets[envIdx];
107-
babelOptions.presets[envIdx] = createConfigItem(
108-
[
109-
environmentPreset,
110-
Object.assign(
111-
merge(
112-
{
113-
loose: true,
114-
useBuiltIns: false,
115-
targets: customOptions.targets,
116-
},
117-
preset.options,
118-
{
119-
modules: false,
120-
exclude: merge(
121-
['transform-async-to-generator', 'transform-regenerator'],
122-
(preset.options && preset.options.exclude) || [],
123-
),
124-
},
102+
const environmentPreset = customOptions.modern
103+
? '@babel/preset-modules'
104+
: '@babel/preset-env';
105+
106+
if (envIdx !== -1) {
107+
const preset = babelOptions.presets[envIdx];
108+
babelOptions.presets[envIdx] = createConfigItem(
109+
[
110+
environmentPreset,
111+
Object.assign(
112+
merge(
113+
{
114+
loose: true,
115+
useBuiltIns: false,
116+
targets: customOptions.targets,
117+
},
118+
preset.options,
119+
{
120+
modules: false,
121+
exclude: merge(
122+
['transform-async-to-generator', 'transform-regenerator'],
123+
(preset.options && preset.options.exclude) || [],
124+
),
125+
},
126+
),
127+
customOptions.modern ? { targets: ESMODULES_TARGET } : {},
125128
),
126-
customOptions.modern ? { targets: ESMODULES_TARGET } : {},
127-
),
128-
],
129-
{
130-
type: `preset`,
131-
},
129+
],
130+
{
131+
type: `preset`,
132+
},
133+
);
134+
} else {
135+
babelOptions.presets = createConfigItems('preset', [
136+
{
137+
name: environmentPreset,
138+
targets: customOptions.modern
139+
? ESMODULES_TARGET
140+
: customOptions.targets,
141+
modules: false,
142+
loose: true,
143+
useBuiltIns: false,
144+
exclude: [
145+
'transform-async-to-generator',
146+
'transform-regenerator',
147+
],
148+
},
149+
]);
150+
}
151+
152+
// Merge babelrc & our plugins together
153+
babelOptions.plugins = mergeConfigItems(
154+
'plugin',
155+
defaultPlugins,
156+
babelOptions.plugins || [],
132157
);
133-
} else {
134-
babelOptions.presets = createConfigItems('preset', [
135-
{
136-
name: environmentPreset,
137-
targets: customOptions.modern
138-
? ESMODULES_TARGET
139-
: customOptions.targets,
140-
modules: false,
141-
loose: true,
142-
useBuiltIns: false,
143-
exclude: ['transform-async-to-generator', 'transform-regenerator'],
144-
},
145-
]);
146-
}
147-
148-
// Merge babelrc & our plugins together
149-
babelOptions.plugins = mergeConfigItems(
150-
'plugin',
151-
defaultPlugins,
152-
babelOptions.plugins || [],
153-
);
154158

155-
babelOptions.generatorOpts = {
156-
minified: customOptions.compress,
157-
compact: customOptions.compress,
158-
shouldPrintComment: comment => /[@#]__PURE__/.test(comment),
159-
};
159+
babelOptions.generatorOpts = {
160+
minified: customOptions.compress,
161+
compact: customOptions.compress,
162+
shouldPrintComment: comment => /[@#]__PURE__/.test(comment),
163+
};
160164

161-
return babelOptions;
162-
},
163-
};
164-
});
165+
return babelOptions;
166+
},
167+
};
168+
});
169+
};

test/__snapshots__/index.test.js.snap

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1839,6 +1839,64 @@ exports[`fixtures build modern with microbundle 3`] = `
18391839
"
18401840
`;
18411841
1842+
exports[`fixtures build modern-generators with microbundle 1`] = `
1843+
"Used script: microbundle -f modern,es,umd,cjs
1844+
1845+
Directory tree:
1846+
1847+
modern-generators
1848+
dist
1849+
modern-generators.esm.js
1850+
modern-generators.esm.js.map
1851+
modern-generators.js
1852+
modern-generators.js.map
1853+
modern-generators.modern.js
1854+
modern-generators.modern.js.map
1855+
modern-generators.umd.js
1856+
modern-generators.umd.js.map
1857+
package.json
1858+
src
1859+
index.js
1860+
two.js
1861+
1862+
1863+
Build \\"modernGenerators\\" to dist:
1864+
234 B: modern-generators.js.gz
1865+
207 B: modern-generators.js.br
1866+
233 B: modern-generators.modern.js.gz
1867+
191 B: modern-generators.modern.js.br
1868+
233 B: modern-generators.esm.js.gz
1869+
191 B: modern-generators.esm.js.br
1870+
311 B: modern-generators.umd.js.gz
1871+
256 B: modern-generators.umd.js.br"
1872+
`;
1873+
1874+
exports[`fixtures build modern-generators with microbundle 2`] = `8`;
1875+
1876+
exports[`fixtures build modern-generators with microbundle 3`] = `
1877+
"var e=regeneratorRuntime.mark(r);function r(){var r;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:r=0;case 1:return e.next=4,r++;case 4:e.next=1;break;case 6:case\\"end\\":return e.stop()}},e)}export default function(){try{var e=r();return Promise.resolve([e.next().value,e.next().value])}catch(e){return Promise.reject(e)}}
1878+
//# sourceMappingURL=modern-generators.esm.js.map
1879+
"
1880+
`;
1881+
1882+
exports[`fixtures build modern-generators with microbundle 4`] = `
1883+
"var e=regeneratorRuntime.mark(r);function r(){var r;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:r=0;case 1:return e.next=4,r++;case 4:e.next=1;break;case 6:case\\"end\\":return e.stop()}},e)}module.exports=function(){try{var e=r();return Promise.resolve([e.next().value,e.next().value])}catch(e){return Promise.reject(e)}};
1884+
//# sourceMappingURL=modern-generators.js.map
1885+
"
1886+
`;
1887+
1888+
exports[`fixtures build modern-generators with microbundle 5`] = `
1889+
"var e=regeneratorRuntime.mark(r);function r(){var r;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:r=0;case 1:return e.next=4,r++;case 4:e.next=1;break;case 6:case\\"end\\":return e.stop()}},e)}export default function(){try{var e=r();return Promise.resolve([e.next().value,e.next().value])}catch(e){return Promise.reject(e)}}
1890+
//# sourceMappingURL=modern-generators.modern.js.map
1891+
"
1892+
`;
1893+
1894+
exports[`fixtures build modern-generators with microbundle 6`] = `
1895+
"!function(e,r){\\"object\\"==typeof exports&&\\"undefined\\"!=typeof module?module.exports=r():\\"function\\"==typeof define&&define.amd?define(r):(e=e||self).modernGenerators=r()}(this,function(){var e=regeneratorRuntime.mark(r);function r(){var r;return regeneratorRuntime.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:r=0;case 1:return e.next=4,r++;case 4:e.next=1;break;case 6:case\\"end\\":return e.stop()}},e)}return function(){try{var e=r();return Promise.resolve([e.next().value,e.next().value])}catch(e){return Promise.reject(e)}}});
1896+
//# sourceMappingURL=modern-generators.umd.js.map
1897+
"
1898+
`;
1899+
18421900
exports[`fixtures build name-custom-amd with microbundle 1`] = `
18431901
"Used script: microbundle
18441902
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"name": "modern-generators",
3+
"scripts": {
4+
"build": "microbundle -f modern,es,umd,cjs"
5+
}
6+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { idMaker } from './two';
2+
3+
export default async function() {
4+
const gen = idMaker();
5+
return [gen.next().value, gen.next().value];
6+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export function* idMaker() {
2+
let index = 0;
3+
while (true) yield index++;
4+
}

0 commit comments

Comments
 (0)