From cb03a98b65c66e1a66954cb28d1c1c364c5ecc95 Mon Sep 17 00:00:00 2001 From: Amjad Masad Date: Wed, 9 Dec 2015 17:34:23 -0800 Subject: [PATCH] Add minified format option As a follow up from #3145 we agreed to add a new format that is a superset of the compact format option. Do things that are considered dangerous. e.g. not printing semicolons, or print literal values as opposed to raw values. --- .../babel-core/src/transformation/file/options/config.js | 6 ++++++ packages/babel-generator/src/buffer.js | 2 +- packages/babel-generator/src/generators/expressions.js | 4 ++-- packages/babel-generator/src/index.js | 6 ++++++ packages/babel-generator/src/printer.js | 6 +++--- .../return-with-retainlines-and-compact-option/expected.js | 2 +- .../test/fixtures/{compact => minified}/literals/actual.js | 0 .../fixtures/{compact => minified}/literals/expected.js | 0 .../fixtures/{compact => minified}/new-expression/actual.js | 0 .../{compact => minified}/new-expression/expected.js | 0 .../fixtures/{compact => minified}/no-semicolon/actual.js | 0 .../fixtures/{compact => minified}/no-semicolon/expected.js | 0 .../babel-generator/test/fixtures/minified/options.json | 3 +++ 13 files changed, 22 insertions(+), 7 deletions(-) rename packages/babel-generator/test/fixtures/{compact => minified}/literals/actual.js (100%) rename packages/babel-generator/test/fixtures/{compact => minified}/literals/expected.js (100%) rename packages/babel-generator/test/fixtures/{compact => minified}/new-expression/actual.js (100%) rename packages/babel-generator/test/fixtures/{compact => minified}/new-expression/expected.js (100%) rename packages/babel-generator/test/fixtures/{compact => minified}/no-semicolon/actual.js (100%) rename packages/babel-generator/test/fixtures/{compact => minified}/no-semicolon/expected.js (100%) create mode 100644 packages/babel-generator/test/fixtures/minified/options.json diff --git a/packages/babel-core/src/transformation/file/options/config.js b/packages/babel-core/src/transformation/file/options/config.js index e349614b0e..3a5be4a9dd 100644 --- a/packages/babel-core/src/transformation/file/options/config.js +++ b/packages/babel-core/src/transformation/file/options/config.js @@ -106,6 +106,12 @@ module.exports = { description: "do not include superfluous whitespace characters and line terminators [true|false|auto]" }, + minified: { + type: "boolean", + default: false, + description: "save as much bytes when printing [true|false]" + }, + sourceMap: { alias: "sourceMaps", hidden: true diff --git a/packages/babel-generator/src/buffer.js b/packages/babel-generator/src/buffer.js index 155b105c90..6390e74427 100644 --- a/packages/babel-generator/src/buffer.js +++ b/packages/babel-generator/src/buffer.js @@ -101,7 +101,7 @@ export default class Buffer { rightBrace() { this.newline(true); - if (this.format.compact && !this._lastPrintedIsEmptyStatement) { + if (this.format.minified && !this._lastPrintedIsEmptyStatement) { this._removeLast(";"); } this.push("}"); diff --git a/packages/babel-generator/src/generators/expressions.js b/packages/babel-generator/src/generators/expressions.js index f98e6a7b78..097ad189c1 100644 --- a/packages/babel-generator/src/generators/expressions.js +++ b/packages/babel-generator/src/generators/expressions.js @@ -62,7 +62,7 @@ export function ConditionalExpression(node: Object) { export function NewExpression(node: Object, parent: Object) { this.push("new "); this.print(node.callee, node); - if (node.arguments.length === 0 && this.format.compact && + if (node.arguments.length === 0 && this.format.minified && !t.isCallExpression(parent, { callee: node }) && !t.isMemberExpression(parent) && !t.isNewExpression(parent)) return; @@ -222,7 +222,7 @@ export function MemberExpression(node: Object) { } else { if (t.isLiteral(node.object) && !t.isTemplateLiteral(node.object)) { let val; - if (this.format.compact) { + if (this.format.minified) { val = this._stringLiteral(node.object); } else { val = this.getPossibleRaw(node.object) || this._stringLiteral(node.object); diff --git a/packages/babel-generator/src/index.js b/packages/babel-generator/src/index.js index 350b73c81b..32a1cbec02 100644 --- a/packages/babel-generator/src/index.js +++ b/packages/babel-generator/src/index.js @@ -40,6 +40,7 @@ export class CodeGenerator extends Printer { auxiliaryCommentBefore: string; auxiliaryCommentAfter: string; compact: boolean | "auto"; + minified: boolean; quotes: "single" | "double"; concise: boolean; indent: { @@ -81,6 +82,7 @@ export class CodeGenerator extends Printer { retainLines: opts.retainLines, comments: opts.comments == null || opts.comments, compact: opts.compact, + minified: opts.minified, concise: opts.concise, quotes: CodeGenerator.findCommonStringDelimiter(code, tokens), indent: { @@ -90,6 +92,10 @@ export class CodeGenerator extends Printer { } }; + if (format.minified) { + format.compact = true; + } + if (format.compact === "auto") { format.compact = code.length > 100000; // 100KB diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index 39ee9db2c2..79102ade5c 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -97,11 +97,11 @@ export default class Printer extends Buffer { } _print(node, parent) { - // In compact mode we need to produce as little bytes as needed + // In minified mode we need to produce as little bytes as needed // and need to make sure that string quoting is consistent. // That means we have to always reprint as opposed to getting // the raw value. - if (!this.format.compact) { + if (!this.format.minified) { let extra = this.getPossibleRaw(node); if (extra) { this.push(""); @@ -238,7 +238,7 @@ export default class Printer extends Buffer { if (this.format.shouldPrintComment) { return this.format.shouldPrintComment(comment.value); } else { - if (!this.format.compact && + if (!this.format.minified && (comment.value.indexOf("@license") >= 0 || comment.value.indexOf("@preserve") >= 0)) { return true; } else { diff --git a/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-and-compact-option/expected.js b/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-and-compact-option/expected.js index e853654162..042f71356d 100644 --- a/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-and-compact-option/expected.js +++ b/packages/babel-generator/test/fixtures/edgecase/return-with-retainlines-and-compact-option/expected.js @@ -1,4 +1,4 @@ function foo(l){ return ( -l)} +l);} diff --git a/packages/babel-generator/test/fixtures/compact/literals/actual.js b/packages/babel-generator/test/fixtures/minified/literals/actual.js similarity index 100% rename from packages/babel-generator/test/fixtures/compact/literals/actual.js rename to packages/babel-generator/test/fixtures/minified/literals/actual.js diff --git a/packages/babel-generator/test/fixtures/compact/literals/expected.js b/packages/babel-generator/test/fixtures/minified/literals/expected.js similarity index 100% rename from packages/babel-generator/test/fixtures/compact/literals/expected.js rename to packages/babel-generator/test/fixtures/minified/literals/expected.js diff --git a/packages/babel-generator/test/fixtures/compact/new-expression/actual.js b/packages/babel-generator/test/fixtures/minified/new-expression/actual.js similarity index 100% rename from packages/babel-generator/test/fixtures/compact/new-expression/actual.js rename to packages/babel-generator/test/fixtures/minified/new-expression/actual.js diff --git a/packages/babel-generator/test/fixtures/compact/new-expression/expected.js b/packages/babel-generator/test/fixtures/minified/new-expression/expected.js similarity index 100% rename from packages/babel-generator/test/fixtures/compact/new-expression/expected.js rename to packages/babel-generator/test/fixtures/minified/new-expression/expected.js diff --git a/packages/babel-generator/test/fixtures/compact/no-semicolon/actual.js b/packages/babel-generator/test/fixtures/minified/no-semicolon/actual.js similarity index 100% rename from packages/babel-generator/test/fixtures/compact/no-semicolon/actual.js rename to packages/babel-generator/test/fixtures/minified/no-semicolon/actual.js diff --git a/packages/babel-generator/test/fixtures/compact/no-semicolon/expected.js b/packages/babel-generator/test/fixtures/minified/no-semicolon/expected.js similarity index 100% rename from packages/babel-generator/test/fixtures/compact/no-semicolon/expected.js rename to packages/babel-generator/test/fixtures/minified/no-semicolon/expected.js diff --git a/packages/babel-generator/test/fixtures/minified/options.json b/packages/babel-generator/test/fixtures/minified/options.json new file mode 100644 index 0000000000..558d34d377 --- /dev/null +++ b/packages/babel-generator/test/fixtures/minified/options.json @@ -0,0 +1,3 @@ +{ + "minified": true +}