@createjs/build
Version:
CreateJS's central build and development process.
227 lines (204 loc) • 6.77 kB
JavaScript
const gulp = require("gulp");
const rollup = require("rollup");
const babel = require("rollup-plugin-babel");
const multiEntry = require("rollup-plugin-multi-entry");
const nodeResolve = require("rollup-plugin-node-resolve");
const commonjs = require("rollup-plugin-commonjs");
const cleanup = require("rollup-plugin-cleanup");
const uglify = require("rollup-plugin-uglify").uglify;
const utils = require("./tasks/utils");
const template = require("lodash.template");
const path = require("path");
const del = require("del");
const browserSync = require("browser-sync");
//////////////////////////////////////////////////////////////
// CONSTANTS
//////////////////////////////////////////////////////////////
const base = utils.base;
const pkg = utils.pkg;
const version = utils.env.isProduction ? pkg.version : "NEXT";
// the order of the libs here is also the order that they will be bundled in combined
const libs = ["core", "tween", "easel", "sound", "preload"];
// the lib that is using this process, read as @createjs/(lib)
const lib = pkg.name.split("/")[1];
// quickrefs
const paths = {
LICENSE: "./assets/LICENSE",
BANNER: "./assets/BANNER",
dist: path.join(base, "dist"),
main: path.join(base, "src/main.js"),
plugins: path.join(base, "src/plugins"),
watch: {
js: "src/**/*.js",
plugins: "src/plugins/**/*.js",
examples: "examples/**/*",
extras: "extras/**/*",
tutorials: "tutorials/**/*",
spikes: "spikes/**/*"
}
};
//////////////////////////////////////////////////////////////
// BUNDLING
//////////////////////////////////////////////////////////////
// stores bundle caches for rebundling with rollup
const buildCaches = {};
// instantiate rollup plugins only once
const plugins = {
babel: babel({
babelrc: false,
configFile: "./babel.config.js"
}),
multiEntry: multiEntry(),
nodeResolve: nodeResolve(),
commonjs: commonjs(),
uglify: uglify({
output: {
// preserves the @license banner
comments: (node, comment) => comment.line === 1
},
compress: {
global_defs: {
// drop debug statements
DEBUG: false
}
}
}),
cleanup: cleanup({
comments: "srcmaps"
})
};
// default the build formats
const formats = (utils.env.options.format || "cjs,iife").split(",");
// returns an async function for bundling
const bundle = (format) => async () => {
const minify = utils.env.isProduction;
const filename = utils.generateBuildFilename(lib, format, minify);
const bundleOptions = {
// plugins are added below as-needed
plugins: [],
// rollup is faster if we pass in the previous bundle on a re-bundle
cache: buildCaches[filename],
};
const writeOptions = {
format,
file: path.join(paths.dist, filename),
name: "createjs",
exports: "named",
extend: true,
// min files are prepended with LICENSE, non-min with BANNER
banner: template(await utils.readFile(paths[minify ? "LICENSE" : "BANNER"]))({ name: utils.prettyName(lib) }),
// only dev builds get sourcemaps
sourcemap: !minify
};
const versionExports = {};
if (utils.env.isCombined) {
bundleOptions.plugins.push(plugins.multiEntry);
// combined bundle imports all dependencies
bundleOptions.external = () => false;
bundleOptions.input = libs.map(lib => {
const dir = `../${utils.prettyName(lib).toLowerCase()}`;
versionExports[lib] = require(path.join(dir, "package.json")).version;
// TODO: if version is "NEXT", append the git commit hash `NEXT@hash`
return path.join(dir, "src/main.js");
});
} else {
writeOptions.globals = {};
// don't globalize core lib
libs.slice(1).forEach(lib => writeOptions.globals[`@createjs/${lib}js`] = "this.createjs");
// cross-library dependencies must remain externalized for individual bundles
bundleOptions.external = id => /@createjs\/(?!core)/.test(id);
bundleOptions.input = paths.main;
versionExports[lib] = version;
}
writeOptions.outro = utils.parseVersionExport(format, versionExports);
bundleOptions.plugins.push(
plugins.nodeResolve,
plugins.commonjs,
plugins.babel
);
// only minify iife bundles
if (minify && format === "iife") {
bundleOptions.plugins.push(plugins.uglify);
} else {
bundleOptions.plugins.push(plugins.cleanup);
}
return rollup.rollup(bundleOptions).then(b => {
buildCaches[filename] = b.cache;
return b.write(writeOptions);
});
};
gulp.task("bundle:cjs", bundle("cjs"));
gulp.task("bundle:iife", bundle("iife"));
gulp.task("build", gulp.parallel.apply(gulp, formats.map(format => `bundle:${format}`)));
const bundlePlugins = (format) => async done => {
// read plugin directory, bailing if it's not found
let plugins = await utils.readDir(paths.plugins);
if (!plugins) { done(); }
// filter plugins if files flag is present
const files = utils.env.options.files;
if (files) { plugins = plugins.filter(dir => files.includes(path.basename(dir, ".js"))); }
const banner = template(await utils.readFile(paths.BANNER))({ name: utils.prettyName(lib) });
return Promise.all(
plugins.map(plugin => {
const bundleOptions = {
input: path.join(paths.plugins, plugin),
plugins: [
plugins.babel,
plugins.cleanup
],
};
const writeOptions = {
format,
file: path.join(paths.dist, "plugins", plugin),
name: "createjs",
exports: "named",
extend: true,
sourcemap: true,
banner
};
return rollup.rollup(bundleOptions).then(b => b.write(writeOptions));
})
);
};
gulp.task("plugins:cjs", bundlePlugins("cjs"));
gulp.task("plugins:iife", bundlePlugins("iife"));
gulp.task("plugins", gulp.parallel.apply(gulp, formats.map(format => `plugins:${format}`)));
//////////////////////////////////////////////////////////////
// DEV
//////////////////////////////////////////////////////////////
// browser-sync instance for dev
const browser = browserSync.create();
// serve the lib root for easy examples/extras access
gulp.task("serve", () => {
browser.init({
host: "localhost",
port: 3000,
server: {
baseDir: base,
directory: true
},
ghostMode: false,
logLevel: "info",
logPrefix: utils.prettyName(lib)
});
});
gulp.task("reload", cb => {
browser.reload();
cb();
});
gulp.task("watch", () => {
const w = paths.watch;
utils.watch([w.js, `!${w.plugins}`], gulp.series("build", "reload"));
utils.watch(w.plugins, gulp.series("plugins", "reload"));
utils.watch([w.examples, w.extras, w.tutorials, w.spikes], gulp.series("reload"));
});
gulp.task("dev", gulp.series("build", gulp.parallel("serve", "watch")));
//////////////////////////////////////////////////////////////
// LINT
//////////////////////////////////////////////////////////////
gulp.task("lint", () => {
// fail after error to break the travis build
return gulp.src(paths.src)
.pipe(eslint())
.pipe(eslint.format("codeframe"));
});