Update with working working version (#12)

* Fix workflow

* Trigger

* [auto] Update compiled version

* [auto] Commit modules

* Push Windows changes

* Fix

* [auto] Update compiled version

* Try removing cwd

* [auto] Update compiled version

* Try with path module

* [auto] Update compiled version

* Fix path

* [auto] Update compiled version

* Use raw path

* [auto] Update compiled version

* Other path

* [auto] Update compiled version

* Avoid @action/exec

* [auto] Update compiled version

* test

* [auto] Update compiled version

* test

* [auto] Update compiled version

* test

* [auto] Update compiled version

* test

* [auto] Update compiled version

* Try with shelljs

* [auto] Update compiled version

* Fix my stupidity

* Copy scripts to local dir

* [auto] Update compiled version

* Still use path

* [auto] Update compiled version

* Delete entrypoint.sh

* [auto] Update compiled version

* Make file executable

* [auto] Update compiled version

* Try using bash

* [auto] Update compiled version
This commit is contained in:
Federico Grandi
2019-12-14 21:47:13 +01:00
committed by GitHub
parent d81e04e96c
commit f118062594
4276 changed files with 1075004 additions and 40 deletions

View File

@@ -0,0 +1,22 @@
Copyright (c) 2015-2016 Amjad Masad <amjad.masad@gmail.com>
MIT License
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -0,0 +1,90 @@
# babel-plugin-minify-constant-folding
Tries to evaluate expressions and inline the result.
## Example
**In**
```javascript
"a" + "b"
2 * 3;
4 | 3;
"b" + a + "c" + "d" + g + z + "f" + "h" + "i"
[a, b, c].concat([d, e], f, g, [h]);
["a", "b", "c"].join();
["a", "b", "c"].join('@');
[1, 2, 3].length;
[1, 2, 3][1];
[1, 2, 3].shift();
[1, 2, 3].slice(0, 2);
[a, b, c].pop();
[a, b, c].reverse();
"a,b,c".split(",");
"abc"[0];
"abc".charAt();
"abc".charAt(1);
"abc".length;
```
**Out**
```javascript
"ab";
6;
7;
"b" + a + "cd" + g + z + "fhi";
[a, b, c, d, e, f, g, h];
"a,b,c";
"a@b@c";
3;
2;
2;
[1, 2];
c;
[c, b, a];
["a", "b", "c"];
"a";
"a";
"a";
"b";
3;
```
## Installation
```sh
npm install babel-plugin-minify-constant-folding --save-dev
```
## Usage
### Via `.babelrc` (Recommended)
**.babelrc**
```json
{
"plugins": ["minify-constant-folding"]
}
```
### Via CLI
```sh
babel --plugins minify-constant-folding script.js
```
### Via Node API
```javascript
require("@babel/core").transform("code", {
plugins: ["minify-constant-folding"]
});
```
## Options
+ `tdz` - Account for TDZ (Temporal Dead Zone)

View File

@@ -0,0 +1,230 @@
"use strict";
const evaluate = require("babel-helper-evaluate-path");
const _require = require("./replacements"),
FALLBACK_HANDLER = _require.FALLBACK_HANDLER;
function getName(member) {
if (member.computed) {
switch (member.property.type) {
case "StringLiteral":
case "NumericLiteral":
return member.property.value;
case "TemplateLiteral":
return;
}
} else {
return member.property.name;
}
}
function swap(path, member, handlers, ...args) {
const key = getName(member.node);
if (key === void 0) return false;
let handler;
if (hop(handlers, key) && typeof handlers[key] === "function") {
handler = handlers[key];
} else if (typeof handlers[FALLBACK_HANDLER] === "function") {
handler = handlers[FALLBACK_HANDLER].bind(member.get("object"), key);
} else {
return false;
}
const replacement = handler.apply(member.get("object"), args);
if (replacement) {
path.replaceWith(replacement);
return true;
}
return false;
}
module.exports = babel => {
const replacements = require("./replacements.js")(babel);
const seen = Symbol("seen");
const t = babel.types;
return {
name: "minify-constant-folding",
visitor: {
// Evaluate string expressions that are next to each other
// but are not actually a binary expression.
// "a" + b + "c" + "d" -> "a" + b + "cd"
BinaryExpression(path) {
if (!path.isBinaryExpression({
operator: "+"
})) {
return;
}
let literal, bin;
const left = path.get("left");
const right = path.get("right");
if (right.isStringLiteral()) {
literal = right;
if (left.isBinaryExpression({
operator: "+"
})) {
bin = left;
} else {
return;
}
} else if (left.isStringLiteral()) {
literal = left;
if (right.isBinaryExpression({
operator: "+"
})) {
bin = right;
} else {
return;
}
} else {
return;
}
const relevant = getLeaf(bin, literal.key);
if (!relevant) {
return;
}
const value = literal.key === "right" ? relevant.node.value + literal.node.value : literal.node.value + relevant.node.value;
relevant.replaceWith(t.stringLiteral(value));
path.replaceWith(bin.node);
function getLeaf(path, direction) {
if (path.isStringLiteral()) {
return path;
} else if (path.isBinaryExpression({
operator: "+"
})) {
return getLeaf(path.get(direction), direction);
}
}
},
// TODO: look into evaluating binding too (could result in more code, but gzip?)
Expression(path, {
opts: {
tdz = false
} = {}
}) {
const node = path.node,
parent = path.parent;
if (node[seen]) {
return;
}
if (path.isLiteral()) {
return;
}
if (!path.isPure()) {
return;
} // Avoid replacing the values for identifiers in exports
if (t.isExportSpecifier(parent)) {
return;
} // -0 maybe compared via dividing and then checking against -Infinity
// Also -X will always be -X.
if (t.isUnaryExpression(node, {
operator: "-"
}) && t.isNumericLiteral(node.argument)) {
return;
} // We have a transform that converts true/false to !0/!1
if (t.isUnaryExpression(node, {
operator: "!"
}) && t.isNumericLiteral(node.argument)) {
if (node.argument.value === 0 || node.argument.value === 1) {
return;
}
} // void 0 is used for undefined.
if (t.isUnaryExpression(node, {
operator: "void"
}) && t.isNumericLiteral(node.argument, {
value: 0
})) {
return;
}
const res = evaluate(path, {
tdz
});
if (res.confident) {
// Avoid fractions because they can be longer than the original expression.
// There is also issues with number precision?
if (typeof res.value === "number" && !Number.isInteger(res.value)) {
return;
} // Preserve -0
if (typeof res.value === "number" && res.value === 0) {
if (1 / res.value === -Infinity) {
const node = t.unaryExpression("-", t.numericLiteral(0), true);
node[seen] = true;
path.replaceWith(node);
return;
}
} // this will convert object to object but
// t.valueToNode has other effects where property name
// is not treated for the respective environment.
// So we bail here for objects and let other plugins
// take care of converting String literal to Identifier
if (typeof res.value === "object") {
return;
}
const node = t.valueToNode(res.value);
node[seen] = true;
path.replaceWith(node);
}
},
CallExpression(path) {
const node = path.node;
const member = path.get("callee");
if (t.isMemberExpression(member)) {
const helpers = replacements[member.node.object.type];
if (!helpers || !helpers.calls) return; // find if the input can be constant folded
if (typeof helpers.canReplace === "function" && !helpers.canReplace.call(member.get("object"))) {
return;
}
swap(path, member, helpers.calls, ...node.arguments);
}
},
MemberExpression(path) {
const node = path.node;
const helpers = replacements[node.object.type];
if (!helpers || !helpers.members) return;
swap(path, path, helpers.members);
}
}
};
};
function hop(o, key) {
return Object.prototype.hasOwnProperty.call(o, key);
}

View File

@@ -0,0 +1,160 @@
"use strict";
const FALLBACK_HANDLER = Symbol("fallback handler");
module.exports = ({
types: t
}) => {
const undef = t.unaryExpression("void", t.numericLiteral(0));
function isUndef(ob) {
return ob === undefined || t.isIdentifier(ob, {
name: "undefined"
}) || t.isUnaryExpression(ob, {
operator: "void"
});
}
function defaultZero(cb) {
return function (i = t.numericLiteral(0), ...args) {
if (t.isNumericLiteral(i)) {
return cb.call(this.node, this.node, i.value, ...args);
}
};
}
function hasSpread(node) {
return node.elements.some(el => t.isSpreadElement(el));
}
return {
ArrayExpression: {
canReplace() {
return !hasSpread(this.node);
},
members: {
length() {
if (hasSpread(this.node)) {
return;
}
return t.numericLiteral(this.node.elements.length);
},
[FALLBACK_HANDLER](i) {
if (hasSpread(this.node)) {
return;
}
if (typeof i === "number" || i.match(/^\d+$/)) {
return this.node.elements[i] || undef;
}
}
},
calls: {
join(sep = t.stringLiteral(",")) {
if (!t.isStringLiteral(sep)) return;
let bad = false;
const str = this.get("elements").map(el => {
const evaled = el.evaluate();
if (!evaled.confident) {
bad = true;
return;
}
return evaled.value;
}).join(sep.value);
return bad ? void 0 : t.stringLiteral(str);
},
push(...args) {
return t.numericLiteral(this.node.elements.length + args.length);
},
shift() {
if (this.node.elements.length === 0) {
return undef;
}
return t.numericLiteral(this.node.elements.length - 1);
},
slice(start = t.numericLiteral(0), end) {
if (!t.isNumericLiteral(start) || end && !t.isNumericLiteral(end)) {
return;
}
return t.arrayExpression(this.node.elements.slice(start.value, end && end.value));
},
pop() {
return this.node.elements[this.node.elements.length - 1] || undef;
},
reverse() {
return t.arrayExpression(this.node.elements.reverse());
},
splice(start, end, ...args) {
if (!t.isNumericLiteral(start) || end && !t.isNumericLiteral(end)) {
return;
}
if (end) {
args.unshift(end.value);
}
return t.arrayExpression(this.node.elements.slice().splice(start.value, ...args));
}
}
},
StringLiteral: {
members: {
length() {
return t.numericLiteral(this.node.value.length);
},
[FALLBACK_HANDLER](i) {
if (typeof i === "number" || i.match(/^\d+$/)) {
const ch = this.node.value[i];
return ch ? t.stringLiteral(ch) : undef;
}
}
},
calls: {
split(sep = undef) {
let realSep = null;
if (t.isStringLiteral(sep)) {
realSep = sep.value;
}
if (isUndef(sep)) {
realSep = sep;
}
if (realSep !== null) {
return t.arrayExpression(this.node.value.split(realSep).map(str => t.stringLiteral(str)));
}
},
charAt: defaultZero(({
value
}, i) => t.stringLiteral(value.charAt(i))),
charCodeAt: defaultZero(({
value
}, i) => t.numericLiteral(value.charCodeAt(i))),
codePointAt: defaultZero(({
value
}, i) => t.numericLiteral(value.codePointAt(i)))
}
}
};
};
module.exports.FALLBACK_HANDLER = FALLBACK_HANDLER;

View File

@@ -0,0 +1,54 @@
{
"_args": [
[
"babel-plugin-minify-constant-folding@0.5.0",
"/home/runner/work/add-and-commit/add-and-commit"
]
],
"_development": true,
"_from": "babel-plugin-minify-constant-folding@0.5.0",
"_id": "babel-plugin-minify-constant-folding@0.5.0",
"_inBundle": false,
"_integrity": "sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==",
"_location": "/babel-plugin-minify-constant-folding",
"_phantomChildren": {},
"_requested": {
"type": "version",
"registry": true,
"raw": "babel-plugin-minify-constant-folding@0.5.0",
"name": "babel-plugin-minify-constant-folding",
"escapedName": "babel-plugin-minify-constant-folding",
"rawSpec": "0.5.0",
"saveSpec": null,
"fetchSpec": "0.5.0"
},
"_requiredBy": [
"/babel-preset-minify"
],
"_resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.5.0.tgz",
"_spec": "0.5.0",
"_where": "/home/runner/work/add-and-commit/add-and-commit",
"author": {
"name": "amasad"
},
"bugs": {
"url": "https://github.com/babel/minify/issues"
},
"dependencies": {
"babel-helper-evaluate-path": "^0.5.0"
},
"description": "Tries to evaluate expressions and inline the result.",
"gitHead": "4de390008da4a486b37819109d2021a0957ad405",
"homepage": "https://github.com/babel/minify#readme",
"keywords": [
"babel-plugin"
],
"license": "MIT",
"main": "lib/index.js",
"name": "babel-plugin-minify-constant-folding",
"repository": {
"type": "git",
"url": "https://github.com/babel/minify/tree/master/packages/babel-plugin-minify-constant-folding"
},
"version": "0.5.0"
}