UNPKG

turbo-gulp

Version:

Gulp tasks to boost high-quality projects.

102 lines (100 loc) 13.8 kB
/** * This module defines the tasks to create webpack bundles. * * @module task-generators/build-webpack */ /** (Placeholder comment, see christopherthielen/typedoc-plugin-external-module-name#6) */ import fancyLog from "fancy-log"; import { Minimatch } from "minimatch"; import { posix as path, resolve as sysResolvePath } from "path"; import PluginError from "plugin-error"; import webpack from "webpack"; import webpackMerge from "webpack-merge"; import webpackStream from "webpack-stream"; import * as matcher from "../utils/matcher"; /** * Return the canonical name of the build-webpack task according to the target name. * * @param targetName Current target name * @returns {string} The canonical of the build-webpack task for the provided target */ export function getTaskName(targetName) { return `${targetName}:build:webpack`; } export function generateTask(gulp, options) { const entryFile = options.entry + ".js"; let curWebpack = webpack; let userConfiguration = {}; if (options.webpackOptions !== undefined) { if (options.webpackOptions.webpack !== undefined) { curWebpack = options.webpackOptions.webpack; } if (options.webpackOptions.configuration !== undefined) { userConfiguration = options.webpackOptions.configuration; } } const angularWebpackConfig = { context: sysResolvePath(options.projectRoot), target: "web", resolve: { extensions: [".js", ".json"], }, module: { rules: [ { test: /\.component\.js$/, loaders: ["angular2-template-loader"], include: [sysResolvePath(options.srcDir)], }, { test: /\.json$/, loaders: ["json-loader"], }, { test: /\.(html|css)$/, loaders: ["raw-loader"], }, ], }, plugins: [ new curWebpack.ContextReplacementPlugin( // The (\\|\/) piece accounts for path separators in posix and Windows /angular(\\|\/)core(\\|\/)src(\\|\/)linker/, sysResolvePath(options.srcDir), {}), ], node: { global: true, __dirname: true, __filename: true, process: true, Buffer: true, }, devtool: "inline-source-map", output: { filename: "[name].js", }, }; const task = function () { return gulp .src([path.join(options.srcDir, entryFile)], { base: options.srcDir }) .pipe(webpackStream( // TODO: Remove `as any` once webpackMerge's typing support the latest version of Webpack (with `EntryFunc`) webpackMerge(angularWebpackConfig, userConfiguration), // TODO: Remove `as any` once gulpWebpack's typing support the latest version of Webpack (with `EntryFunc`) curWebpack, (err, stats) => { // TODO: Check if err is `null` or `undefined` (success) and type properly if (err) { throw new PluginError("_build:webpack", err); } fancyLog("[_build:webpack]", stats.toString({ colors: true })); })) .pipe(gulp.dest(options.buildDir)); }; task.displayName = "_build:webpack"; return task; } export function watch(gulp, options) { const buildTask = generateTask(gulp, options); const sources = matcher.asString(matcher.join(options.srcDir, new Minimatch("**/*"))); return gulp.watch(sources, { cwd: options.srcDir }, buildTask); } //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIl9zcmMvdGFzay1nZW5lcmF0b3JzL2J1aWxkLXdlYnBhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7R0FJRztBQUVILDBGQUEwRjtBQUUxRixPQUFPLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFHakMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN0QyxPQUFPLEVBQUUsS0FBSyxJQUFJLElBQUksRUFBRSxPQUFPLElBQUksY0FBYyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hFLE9BQU8sV0FBVyxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxZQUFZLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sYUFBYSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFvQzVDOzs7OztHQUtHO0FBQ0gsTUFBTSxzQkFBc0IsVUFBa0I7SUFDNUMsT0FBTyxHQUFHLFVBQVUsZ0JBQWdCLENBQUM7QUFDdkMsQ0FBQztBQUVELE1BQU0sdUJBQXVCLElBQVUsRUFBRSxPQUFnQjtJQUN2RCxNQUFNLFNBQVMsR0FBVyxPQUFPLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNoRCxJQUFJLFVBQVUsR0FBbUIsT0FBTyxDQUFDO0lBQ3pDLElBQUksaUJBQWlCLEdBQTBCLEVBQUUsQ0FBQztJQUNsRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFO1FBQ3hDLElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO1lBQ2hELFVBQVUsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQztTQUM3QztRQUNELElBQUksT0FBTyxDQUFDLGNBQWMsQ0FBQyxhQUFhLEtBQUssU0FBUyxFQUFFO1lBQ3RELGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDO1NBQzFE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KlxuICogVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgdGFza3MgdG8gY3JlYXRlIHdlYnBhY2sgYnVuZGxlcy5cbiAqXG4gKiBAbW9kdWxlIHRhc2stZ2VuZXJhdG9ycy9idWlsZC13ZWJwYWNrXG4gKi9cblxuLyoqIChQbGFjZWhvbGRlciBjb21tZW50LCBzZWUgY2hyaXN0b3BoZXJ0aGllbGVuL3R5cGVkb2MtcGx1Z2luLWV4dGVybmFsLW1vZHVsZS1uYW1lIzYpICovXG5cbmltcG9ydCBmYW5jeUxvZyBmcm9tIFwiZmFuY3ktbG9nXCI7XG5pbXBvcnQgeyBGU1dhdGNoZXIgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IEd1bHAgfSBmcm9tIFwiZ3VscFwiO1xuaW1wb3J0IHsgTWluaW1hdGNoIH0gZnJvbSBcIm1pbmltYXRjaFwiO1xuaW1wb3J0IHsgcG9zaXggYXMgcGF0aCwgcmVzb2x2ZSBhcyBzeXNSZXNvbHZlUGF0aCB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgUGx1Z2luRXJyb3IgZnJvbSBcInBsdWdpbi1lcnJvclwiO1xuaW1wb3J0IHdlYnBhY2sgZnJvbSBcIndlYnBhY2tcIjtcbmltcG9ydCB3ZWJwYWNrTWVyZ2UgZnJvbSBcIndlYnBhY2stbWVyZ2VcIjtcbmltcG9ydCB3ZWJwYWNrU3RyZWFtIGZyb20gXCJ3ZWJwYWNrLXN0cmVhbVwiO1xuaW1wb3J0IHsgVGFza0Z1bmN0aW9uIH0gZnJvbSBcIi4uL3V0aWxzL2d1bHAtdGFzay1mdW5jdGlvblwiO1xuaW1wb3J0ICogYXMgbWF0Y2hlciBmcm9tIFwiLi4vdXRpbHMvbWF0Y2hlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbnMge1xuICAvKipcbiAgICogUm9vdCBvZiB0aGUgbWFpbiBwcm9qZWN0ICh3aXRoIHBhY2thZ2UuanNvbilcbiAgICovXG4gIHByb2plY3RSb290OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERpcmVjdG9yeSBjb250YWluaW5nIHRoZSBKUyBzb3VyY2VzLlxuICAgKi9cbiAgc3JjRGlyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERpcmVjdG9yeSB3ZXJlIHRoZSByZXN1bHQgd2lsbCBiZSBwaXBlZFxuICAgKi9cbiAgYnVpbGREaXI6IHN0cmluZztcblxuICAvKipcbiAgICogRW50cnkgbW9kdWxlLCByZWxhdGl2ZSB0byBganNTcmNEaXJgXG4gICAqL1xuICBlbnRyeTogc3RyaW5nO1xuXG4gIHdlYnBhY2tPcHRpb25zPzoge1xuICAgIC8qKlxuICAgICAqIFdlYnBhY2sgb2JqZWN0IHRvIHVzZVxuICAgICAqL1xuICAgIHdlYnBhY2s/OiB0eXBlb2Ygd2VicGFjaztcblxuICAgIC8qKlxuICAgICAqIEN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB3ZWJwYWNrIGNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBjb25maWd1cmF0aW9uPzogd2VicGFjay5Db25maWd1cmF0aW9uO1xuICB9O1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgY2Fub25pY2FsIG5hbWUgb2YgdGhlIGJ1aWxkLXdlYnBhY2sgdGFzayBhY2NvcmRpbmcgdG8gdGhlIHRhcmdldCBuYW1lLlxuICpcbiAqIEBwYXJhbSB0YXJnZXROYW1lIEN1cnJlbnQgdGFyZ2V0IG5hbWVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjYW5vbmljYWwgb2YgdGhlIGJ1aWxkLXdlYnBhY2sgdGFzayBmb3IgdGhlIHByb3ZpZGVkIHRhcmdldFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFza05hbWUodGFyZ2V0TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3RhcmdldE5hbWV9OmJ1aWxkOndlYnBhY2tgO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVUYXNrKGd1bHA6IEd1bHAsIG9wdGlvbnM6IE9wdGlvbnMpOiBUYXNrRnVuY3Rpb24ge1xuICBjb25zdCBlbnRyeUZpbGU6IHN0cmluZyA9IG9wdGlvbnMuZW50cnkgKyBcIi5qc1wiO1xuICBsZXQgY3VyV2VicGFjazogdHlwZW9mIHdlYnBhY2sgPSB3ZWJwYWNrO1xuICBsZXQgdXNlckNvbmZpZ3VyYXRpb246IHdlYnBhY2suQ29uZmlndXJhdGlvbiA9IHt9O1xuICBpZiAob3B0aW9ucy53ZWJwYWNrT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKG9wdGlvbnMud2VicGFja09wdGlvbnMud2VicGFjayAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjdXJXZWJwYWNrID0gb3B0aW9ucy53ZWJwYWNrT3B0aW9ucy53ZWJwYWNrO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy53ZWJwYWNrT3B0aW9ucy5jb25maWd1cmF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHVzZXJDb25maWd1cmF0aW9uID0gb3B0aW9ucy53ZWJwYWNrT3B0aW9ucy5jb25maWd1cmF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFuZ3VsYXJXZWJwYWNrQ29uZmlnOiB3ZWJwYWNrLkNvbmZpZ3VyYXRpb24gPSB7XG4gICAgY29udGV4dDogc3lzUmVzb2x2ZVBhdGgob3B0aW9ucy5wcm9qZWN0Um9vdCksXG4gICAgdGFyZ2V0OiBcIndlYlwiLFxuICAgIHJlc29sdmU6IHtcbiAgICAgIGV4dGVuc2lvbnM6IFtcIi5qc1wiLCBcIi5qc29uXCJdLFxuICAgIH0sXG4gICAgbW9kdWxlOiB7XG4gICAgICBydWxlczogW1xuICAgICAgICB7XG4gICAgICAgICAgdGVzdDogL1xcLmNvbXBvbmVudFxcLmpzJC8sXG4gICAgICAgICAgbG9hZGVyczogW1wiYW5ndWxhcjItdGVtcGxhdGUtbG9hZGVyXCJdLFxuICAgICAgICAgIGluY2x1ZGU6IFtzeXNSZXNvbHZlUGF0aChvcHRpb25zLnNyY0RpcildLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgdGVzdDogL1xcLmpzb24kLyxcbiAgICAgICAgICBsb2FkZXJzOiBbXCJqc29uLWxvYWRlclwiXSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIHRlc3Q6IC9cXC4oaHRtbHxjc3MpJC8sXG4gICAgICAgICAgbG9hZGVyczogW1wicmF3LWxvYWRlclwiXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSxcbiAgICBwbHVnaW5zOiBbXG4gICAgICBuZXcgY3VyV2VicGFjay5Db250ZXh0UmVwbGFjZW1lbnRQbHVnaW4oXG4gICAgICAgIC8vIFRoZSAoXFxcXHxcXC8pIHBpZWNlIGFjY291bnRzIGZvciBwYXRoIHNlcGFyYXRvcnMgaW4gcG9zaXggYW5kIFdpbmRvd3NcbiAgICAgICAgL2FuZ3VsYXIoXFxcXHxcXC8pY29yZShcXFxcfFxcLylzcmMoXFxcXHxcXC8pbGlua2VyLyxcbiAgICAgICAgc3lzUmVzb2x2ZVBhdGgob3B0aW9ucy5zcmNEaXIpLFxuICAgICAgICB7fSxcbiAgICAgICksXG4gICAgICAvLyBuZXcgd2VicGFjay5EZWZpbmVQbHVnaW4oe1xuICAgICAgLy8gICBcInByb2Nlc3MuZW52XCI6IHtcbiAgICAgIC8vICAgICBcIk5PREVfRU5WXCI6IEpTT04uc3RyaW5naWZ5KFwicHJvZHVjdGlvblwiKVxuICAgICAgLy8gICB9XG4gICAgICAvLyB9KSxcbiAgICAgIC8vIG5ldyB3ZWJwYWNrLm9wdGltaXplLkRlZHVwZVBsdWdpbigpLFxuICAgICAgLy8gbmV3IHdlYnBhY2sub3B0aW1pemUuVWdsaWZ5SnNQbHVnaW4oKVxuICAgIF0sXG4gICAgbm9kZToge1xuICAgICAgZ2xvYmFsOiB0cnVlLFxuICAgICAgX19kaXJuYW1lOiB0cnVlLFxuICAgICAgX19maWxlbmFtZTogdHJ1ZSxcbiAgICAgIHByb2Nlc3M6IHRydWUsXG4gICAgICBCdWZmZXI6IHRydWUsXG4gICAgfSxcbiAgICBkZXZ0b29sOiBcImlubGluZS1zb3VyY2UtbWFwXCIsXG4gICAgb3V0cHV0OiB7XG4gICAgICBmaWxlbmFtZTogXCJbbmFtZV0uanNcIixcbiAgICB9LFxuICB9O1xuXG4gIGNvbnN0IHRhc2s6IFRhc2tGdW5jdGlvbiA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gZ3VscFxuICAgICAgLnNyYyhbcGF0aC5qb2luKG9wdGlvbnMuc3JjRGlyLCBlbnRyeUZpbGUpXSwge2Jhc2U6IG9wdGlvbnMuc3JjRGlyfSlcbiAgICAgIC5waXBlKHdlYnBhY2tTdHJlYW0oXG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBgYXMgYW55YCBvbmNlIHdlYnBhY2tNZXJnZSdzIHR5cGluZyBzdXBwb3J0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBXZWJwYWNrICh3aXRoIGBFbnRyeUZ1bmNgKVxuICAgICAgICB3ZWJwYWNrTWVyZ2UoYW5ndWxhcldlYnBhY2tDb25maWcgYXMgYW55LCB1c2VyQ29uZmlndXJhdGlvbiBhcyBhbnkpLFxuICAgICAgICAvLyBUT0RPOiBSZW1vdmUgYGFzIGFueWAgb25jZSBndWxwV2VicGFjaydzIHR5cGluZyBzdXBwb3J0IHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBXZWJwYWNrICh3aXRoIGBFbnRyeUZ1bmNgKVxuICAgICAgICBjdXJXZWJwYWNrIGFzIGFueSxcbiAgICAgICAgKGVycjogRXJyb3IsIHN0YXRzOiB3ZWJwYWNrLlN0YXRzKTogdm9pZCA9PiB7XG4gICAgICAgICAgLy8gVE9ETzogQ2hlY2sgaWYgZXJyIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYCAoc3VjY2VzcykgYW5kIHR5cGUgcHJvcGVybHlcbiAgICAgICAgICBpZiAoPGFueT4gZXJyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUGx1Z2luRXJyb3IoXCJfYnVpbGQ6d2VicGFja1wiLCBlcnIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmYW5jeUxvZyhcIltfYnVpbGQ6d2VicGFja11cIiwgc3RhdHMudG9TdHJpbmcoe2NvbG9yczogdHJ1ZX0pKTtcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAucGlwZShndWxwLmRlc3Qob3B0aW9ucy5idWlsZERpcikpO1xuICB9O1xuICB0YXNrLmRpc3BsYXlOYW1lID0gXCJfYnVpbGQ6d2VicGFja1wiO1xuICByZXR1cm4gdGFzaztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdhdGNoKGd1bHA6IEd1bHAsIG9wdGlvbnM6IE9wdGlvbnMpOiBGU1dhdGNoZXIge1xuICBjb25zdCBidWlsZFRhc2s6IFRhc2tGdW5jdGlvbiA9IGdlbmVyYXRlVGFzayhndWxwLCBvcHRpb25zKTtcbiAgY29uc3Qgc291cmNlczogc3RyaW5nID0gbWF0Y2hlci5hc1N0cmluZyhtYXRjaGVyLmpvaW4ob3B0aW9ucy5zcmNEaXIsIG5ldyBNaW5pbWF0Y2goXCIqKi8qXCIpKSk7XG4gIHJldHVybiBndWxwLndhdGNoKHNvdXJjZXMsIHtjd2Q6IG9wdGlvbnMuc3JjRGlyfSwgYnVpbGRUYXNrKSBhcyBGU1dhdGNoZXI7XG59XG4iXSwic291cmNlUm9vdCI6Ii4uIn0=