Skip to content

Commit 3d21c04

Browse files
committed
Make --define preserve boolean and integer literals by default instead of making everything a string.
1 parent 39dad8e commit 3d21c04

File tree

4 files changed

+69
-4
lines changed

4 files changed

+69
-4
lines changed

src/index.js

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,40 @@ import camelCase from 'camelcase';
2626

2727
const removeScope = name => name.replace(/^@.*\//, '');
2828

29+
// Convert booleans and int define= values to literals.
30+
// This is more intuitive than `microbundle --define A=1` producing A="1".
31+
// See: https://github.com/terser-js/terser#conditional-compilation-api
32+
const toTerserLiteral = (value, name) => {
33+
// --define A="1",B='true' produces string:
34+
const matches = value.match(/^(['"])(.+)\1$/);
35+
if (matches) {
36+
return [matches[2], name];
37+
}
38+
39+
// --define A=1,B=true produces int/boolean literal:
40+
if (/^(true|false|\d+)$/i.test(value)) {
41+
return [value, '@' + name];
42+
}
43+
44+
// default: behaviour from Terser (@prefix=1 produces expression/literal, unprefixed=1 produces string literal):
45+
};
46+
2947
// Parses values of the form "$=jQuery,React=react" into key-value object pairs.
30-
const parseMappingArgument = globalStrings => {
48+
const parseMappingArgument = (globalStrings, processValue) => {
3149
const globals = {};
3250
globalStrings.split(',').forEach(globalString => {
33-
const [localName, globalName] = globalString.split('=');
34-
globals[localName] = globalName;
51+
let [key, value] = globalString.split('=');
52+
if (processValue) {
53+
const r = processValue(value, key);
54+
if (r !== undefined) {
55+
if (Array.isArray(r)) {
56+
[value, key] = r;
57+
} else {
58+
value = r;
59+
}
60+
}
61+
}
62+
globals[key] = value;
3563
});
3664
return globals;
3765
};
@@ -325,7 +353,10 @@ function createConfig(options, entry, format, writeMeta) {
325353

326354
let defines = {};
327355
if (options.define) {
328-
defines = Object.assign(defines, parseMappingArgument(options.define));
356+
defines = Object.assign(
357+
defines,
358+
parseMappingArgument(options.define, toTerserLiteral),
359+
);
329360
}
330361

331362
function replaceName(filename, name) {

test/__snapshots__/index.test.js.snap

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,28 @@ exports[`fixtures default-named 6`] = `
753753
754754
exports[`fixtures default-named 7`] = `"{\\"version\\":3,\\"file\\":\\"default-named.umd.js\\",\\"sources\\":[\\"../src/index.js\\"],\\"sourcesContent\\":[\\"export const foo = 42;\\\\nexport default function bar() {}\\\\n\\"],\\"names\\":[],\\"mappings\\":\\"wLAAmB,aACJ\\"}"`;
755755
756+
exports[`fixtures define 1`] = `
757+
"Used script: microbundle --no-sourcemap -f cjs --define DEBUG=false
758+
759+
Directory tree:
760+
761+
define
762+
dist
763+
alias.js
764+
index.js
765+
package.json
766+
767+
768+
Build \\"alias\\" to dist:
769+
50 B: alias.js.gz
770+
34 B: alias.js.br"
771+
`;
772+
773+
exports[`fixtures define 2`] = `
774+
"console.log(\\"debug mode\\",!1);
775+
"
776+
`;
777+
756778
exports[`fixtures esnext-ts 1`] = `
757779
"Used script: microbundle --raw
758780

test/fixtures/define/index.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
const DEBUG = true;
2+
if (DEBUG) {
3+
console.log('debug mode', DEBUG);
4+
} else {
5+
console.log('production mode', DEBUG);
6+
}

test/fixtures/define/package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"name": "alias",
3+
"scripts": {
4+
"build": "microbundle --no-sourcemap -f cjs --define DEBUG=false"
5+
}
6+
}

0 commit comments

Comments
 (0)