Skip to content

Commit

Permalink
Merge pull request #1038 from stealjs/steal
Browse files Browse the repository at this point in the history
Allow tree shaking to be turned off in the package.json
  • Loading branch information
matthewp committed Jul 19, 2018
2 parents 89a95e0 + 0f75e27 commit 579a7d1
Show file tree
Hide file tree
Showing 32 changed files with 338 additions and 37 deletions.
61 changes: 39 additions & 22 deletions lib/graph/treeshake.js
Expand Up @@ -132,32 +132,47 @@ function loadFromGraph(getNode) {

function transpile(getNode, data) {
let loader = data.loader;
let opts = loader.babelOptions || {};
let required = ["es2015", {loose: false, modules: false}];

opts.presets = processBabelPresets({
baseURL: loader.baseURL,
babelOptions: opts,
loaderEnv: loader.getEnv()
});
function getBabelOptions(node) {
let opts = loader.babelOptions || {};
var npmPkg = node.load.metadata.npmPackage;
if(npmPkg) {
var pkgSteal = npmPkg.steal || npmPkg.system;
if(pkgSteal && pkgSteal.babelOptions) {
opts = pkgSteal.babelOptions;
}
}
return opts;
}

opts.plugins = processBabelPlugins({
baseURL: loader.baseURL,
babelOptions: opts,
loaderEnv: loader.getEnv()
});
function setBabelOptions(opts) {
let required = ["es2015", {loose: false, modules: false}];

if(opts.presets && opts.presets.length) {
opts.presets = [required].concat(opts.presets);
} else {
opts.presets = [
"react",
"stage-0",
required
];
}
opts.presets = processBabelPresets({
baseURL: loader.baseURL,
babelOptions: opts,
loaderEnv: loader.getEnv()
});

opts.sourceMaps = true;
opts.plugins = processBabelPlugins({
baseURL: loader.baseURL,
babelOptions: opts,
loaderEnv: loader.getEnv()
});

if(opts.presets && opts.presets.length) {
opts.presets = [required].concat(opts.presets);
} else {
opts.presets = [
"react",
"stage-0",
required
];
}

opts.sourceMaps = true;
return opts;
}

return {
transform: function(code, id) {
Expand All @@ -166,6 +181,8 @@ function transpile(getNode, data) {
return code;
}

let opts = setBabelOptions(getBabelOptions(node));

let result = babel.transform(code, opts);

for(let depName of node.load.metadata.dependencies) {
Expand Down
8 changes: 7 additions & 1 deletion lib/stream/treeshake.js
Expand Up @@ -6,7 +6,13 @@ module.exports = function() {
return through.obj(function(data, enc, next) {
var options = data.options;

if(options.treeShaking === false) {
var disabled =
// Can be disabled from the BuildOptions
options.treeShaking === false ||
// Or from package.json config
data.loader.treeShaking === false;

if(disabled) {
next(null, data);
return;
}
Expand Down
2 changes: 1 addition & 1 deletion package.json
Expand Up @@ -31,7 +31,7 @@
"prettier": "1.12.0",
"pump": "^3.0.0",
"rollup-plugin-commonjs": "^9.1.3",
"steal": "^2.0.0-pre.7",
"steal": "^2.0.0-pre.16",
"steal-bundler": "^0.3.6",
"steal-parse-amd": "^1.0.0",
"steal-rollup": "^0.58.3",
Expand Down
3 changes: 2 additions & 1 deletion test/dev_bundle_forward/dev.html
Expand Up @@ -8,10 +8,11 @@
</head>
<body>
<script
src="../../node_modules/steal/steal-sans-promises.js"
src="../../node_modules/steal/steal.js"
base-url="."
config-main="package.json!npm"
dev-bundle
main
></script>
</body>
</html>
5 changes: 3 additions & 2 deletions test/dev_bundles_minify/dev.html
Expand Up @@ -7,10 +7,11 @@
<title>Minified development bundles</title>
</head>
<body>
<script src="../../node_modules/steal/steal-sans-promises.js"
<script src="../../node_modules/steal/steal.js"
base-url="."
config-main="package.json!npm"
deps-bundle="dev-bundle"
main
></script>
</body>
</html>
</html>
2 changes: 1 addition & 1 deletion test/export_standalone_test.js
Expand Up @@ -97,7 +97,7 @@ describe("+standalone", function(){

});

it.only("Can be used for node.js projects with process and can be set to production", function(done){
it("Can be used for node.js projects with process and can be set to production", function(done){
this.timeout(10000);

var outPath = __dirname + "/exports_basics/out.js";
Expand Down
59 changes: 50 additions & 9 deletions test/tree_shaking_test.js
Expand Up @@ -124,14 +124,55 @@ describe("Tree-shaking", function(){
});

describe("treeShaking: false", function(){
before(buildAndOpen({
treeShaking: false
}));

it("Doesn\'t tree shake modules", function(){
let dep = app.dep;
assert.equal(typeof dep.one, "function", "Included");
assert.equal(typeof dep.two, "function", "Included");
describe("as a BuildOption", function(){
before(buildAndOpen({
treeShaking: false
}));

it("Doesn\'t tree shake modules", function(){
let dep = app.dep;
assert.equal(typeof dep.one, "function", "Included");
assert.equal(typeof dep.two, "function", "Included");
});
});

describe("in the package.json", function(){
var app;
before(function(done){
this.timeout(20000);
var base = path.join(__dirname, "treeshake", "disabled");
var config = { config: path.join(base, "package.json!npm") };
var page = `prod.html`;

rmdir(path.join(base, "dist"))
.then(function() {
return build(config, {
quiet: true,
minify: false
});
})
.then(function() {
var close;
return open(path.join("test", "treeshake", "disabled", page))
.then(function(args) {
close = args.close;
browser = args.browser;
return find(browser, "app");
})
.then(function(mod) {
app = mod;
close();
done();
});
})
.catch(done);
});

it("Doesn\'t tree shake modules", function(){
let dep = app.dep;
assert.equal(typeof dep.one, "function", "Included");
assert.equal(typeof dep.two, "function", "Included");
});
});
});

Expand Down Expand Up @@ -164,7 +205,7 @@ describe("Tree-shaking", function(){
});
})
.catch(done);
})
});

it("Items from both are included in the build", function(){
assert.equal(app.a, "a", "main bundle loaded");
Expand Down
8 changes: 8 additions & 0 deletions test/treeshake/disabled/bundle-a.js
@@ -0,0 +1,8 @@

export function one() {
return 1;
}

export function two() {
return 2;
}
7 changes: 7 additions & 0 deletions test/treeshake/disabled/from-exports.js
@@ -0,0 +1,7 @@

export let rexpOne = 'one';
export let rexpTwo = 'two';

function doThings() {

}
78 changes: 78 additions & 0 deletions test/treeshake/disabled/main.js
@@ -0,0 +1,78 @@
// two is not used. Using two should throw.
import { one } from "dep";

// A default export
import anon from "dep/another";

// A package not using sideEffects: false
import { one as twoOne } from "dep2";

// A built-in module that should be ignored.
import steal from "@steal";

// Importing a module for its side effects
import "dep3";

// Importing a module that itself should be tree-shaken
import {default as dep4} from "dep4";

// Importing a module that re-exports another
import { rexpOne } from "./reexports";

// Import a CommonJS module
import dep5 from "dep5";

// Import a package but only use some subpackages
import { DefineMap } from "can";

export default function(){
window.globals = {
one,
anon,
twoOne,
steal,
rexpOne,
dep4,
dep5,
DefineMap
};

let shouldFail = steal.import("can-connect@1.0.0#main").then(null, function(err){
err.didFail = true;
return err;
});

// return all of the exports so the tests can assert things.
let p = Promise.all([
steal.import("~/bundle-a"),
steal.import("dep"),
steal.import("dep2"),
steal.import("dep4/other"),
steal.import("dep4/and-another"),
steal.import("~/from-exports"),
shouldFail
]);

return p
.then(([
bundleA,
dep,
depTwo,
dep4Other,
dep4AndAnother,
fromExports,
canConnect
]) => {
return {
anon,
bundleA,
dep,
depTwo,
dep4Other,
dep4AndAnother,
fromExports,
dep5,
canConnect
};
});
};
3 changes: 3 additions & 0 deletions test/treeshake/disabled/node_modules/can-connect/main.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions test/treeshake/disabled/node_modules/can-connect/package.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions test/treeshake/disabled/node_modules/can-define/main.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions test/treeshake/disabled/node_modules/can-define/package.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions test/treeshake/disabled/node_modules/can/main.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions test/treeshake/disabled/node_modules/can/package.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions test/treeshake/disabled/node_modules/dep/another.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions test/treeshake/disabled/node_modules/dep/main.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions test/treeshake/disabled/node_modules/dep/package.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions test/treeshake/disabled/node_modules/dep2/main.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 5 additions & 0 deletions test/treeshake/disabled/node_modules/dep2/package.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions test/treeshake/disabled/node_modules/dep3/main.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions test/treeshake/disabled/node_modules/dep3/package.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 579a7d1

Please sign in to comment.