UNPKG

turbo-gulp

Version:

Gulp tasks to boost high-quality projects.

103 lines (101 loc) 15.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; } Object.defineProperty(exports, "__esModule", { value: true }); const gulp_rename_1 = __importDefault(require("gulp-rename")); const gulp_sourcemaps_1 = __importDefault(require("gulp-sourcemaps")); const gulp_typescript_1 = __importDefault(require("gulp-typescript")); const incident_1 = require("incident"); const merge2_1 = __importDefault(require("merge2")); const path_1 = require("path"); const typescript_1 = require("../options/typescript"); const utils_1 = require("../utils/utils"); const _typescript_1 = require("./_typescript"); function hashTypescriptError(error) { return JSON.stringify({ fileName: error.fullFilename, code: error.diagnostic.code, startPosition: error.startPosition, endPosition: error.endPosition, }); } class TypescriptReporter { constructor(throwOnError) { this.baseReporter = gulp_typescript_1.default.reporter.defaultReporter(); this.reported = new Set(); this.throwOnError = throwOnError; } error(error, typescript) { const hash = hashTypescriptError(error); if (this.reported.has(hash)) { return; } this.reported.add(hash); this.baseReporter.error(error, typescript); } finish(compilerResult) { this.baseReporter.finish(compilerResult); if (this.throwOnError && this.reported.size > 0) { throw incident_1.Incident("TypescriptError"); } } } function getBuildTypescriptTask(gulp, options, throwOnError = true) { const resolved = _typescript_1.resolveTsLocations(options); const tscOptions = Object.assign({}, options.tscOptions, { rootDir: resolved.rootDir, outDir: resolved.outDir, typeRoots: resolved.typeRoots }); utils_1.deleteUndefinedProperties(tscOptions); const task = function () { let mjsStream; let jsStream; let dtsStream; const srcStream = gulp .src(resolved.absScripts, { base: options.srcDir }) .pipe(gulp_sourcemaps_1.default.init()); const reporter = new TypescriptReporter(throwOnError); // TODO: update type definitions of `gulp-sourcemaps` const writeSourceMapsOptions = { sourceRoot: (file /* VinylFile */) => { return path_1.posix.relative(path_1.posix.dirname(file.relative), ""); }, }; if (options.outModules === typescript_1.OutModules.Js) { const compiledStream = srcStream.pipe(gulp_typescript_1.default(tscOptions, reporter)); jsStream = compiledStream.js .pipe(gulp_sourcemaps_1.default.write(writeSourceMapsOptions)); dtsStream = compiledStream.dts; } else { const mjsOptions = Object.assign({}, tscOptions, { module: "es2015" }); const compiledStream = srcStream.pipe(gulp_typescript_1.default(mjsOptions, reporter)); mjsStream = compiledStream.js .pipe(gulp_sourcemaps_1.default.write(writeSourceMapsOptions)) .pipe(gulp_rename_1.default({ extname: ".mjs" })); dtsStream = compiledStream.dts; if (options.outModules === typescript_1.OutModules.Both) { jsStream = srcStream .pipe(gulp_typescript_1.default(tscOptions, reporter)) .js .pipe(gulp_sourcemaps_1.default.write(writeSourceMapsOptions)); } } return merge2_1.default([dtsStream, jsStream, mjsStream].filter(x => x !== undefined)) .pipe(gulp.dest(options.buildDir)); }; task.displayName = "_build:scripts"; return task; } exports.getBuildTypescriptTask = getBuildTypescriptTask; function getBuildTypescriptWatchTask(gulp, options) { return () => { const buildTask = getBuildTypescriptTask(gulp, options, false); const resolved = _typescript_1.resolveTsLocations(options); return gulp.watch(resolved.absScripts, { cwd: options.srcDir }, buildTask); }; } exports.getBuildTypescriptWatchTask = getBuildTypescriptWatchTask; function getBuildTypescriptWatcher(gulp, options) { return getBuildTypescriptWatchTask(gulp, options)(); } exports.getBuildTypescriptWatcher = getBuildTypescriptWatcher; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRhcmdldC10YXNrcy9idWlsZC10eXBlc2NyaXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsOERBQXFDO0FBQ3JDLHNFQUE2QztBQUM3QyxzRUFBNkM7QUFDN0MsdUNBQW9DO0FBQ3BDLG9EQUEyQjtBQUMzQiwrQkFBMEM7QUFFMUMsc0RBQW1EO0FBRW5ELDBDQUEyRDtBQUMzRCwrQ0FBMEY7QUFJMUYsNkJBQTZCLEtBQThDO0lBQ3pFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3BCLFFBQVEsRUFBRSxLQUFLLENBQUMsWUFBWTtRQUM1QixJQUFJLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJO1FBQzNCLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYTtRQUNsQyxXQUFXLEVBQUUsS0FBSyxDQUFDLFdBQVc7S0FDL0IsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEO0lBS0UsWUFBWSxZQUFxQjtRQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLHlCQUFjLENBQUMsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzlELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztJQUNuQyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQThDLEVBQUUsVUFBZTtRQUNuRSxNQUFNLElBQUksR0FBd0IsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0QsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sQ0FBQztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQU0sQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJ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QUMseUJBQWMsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1lBQ3hELENBQUM7UUFDSCxDQUFDO1FBRUQsTUFBTSxDQUFDLGdCQUFLLENBQUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQTRCLENBQUM7YUFDbkcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDO0lBQ0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQztJQUNwQyxNQUFNLENBQUMsSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQTVERCx3REE0REM7QUFFRCxxQ0FBNEMsSUFBVSxFQUFFLE9BQXlCO0lBQy9FLE1BQU0sQ0FBQyxHQUFjLEVBQUU7UUFDckIsTUFBTSxTQUFTLEdBQWlCLHNCQUFzQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDN0UsTUFBTSxRQUFRLEdBQXdCLGdDQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBQyxFQUFFLFNBQVMsQ0FBYyxDQUFDO0lBQ3hGLENBQUMsQ0FBQztBQUNKLENBQUM7QUFORCxrRUFNQztBQUVELG1DQUEwQyxJQUFVLEVBQUUsT0FBeUI7SUFDN0UsTUFBTSxDQUFDLDJCQUEyQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQ3RELENBQUM7QUFGRCw4REFFQyIsImZpbGUiOiJ0YXJnZXQtdGFza3MvYnVpbGQtdHlwZXNjcmlwdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZTV2F0Y2hlciB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgR3VscCB9IGZyb20gXCJndWxwXCI7XG5pbXBvcnQgZ3VscFJlbmFtZSBmcm9tIFwiZ3VscC1yZW5hbWVcIjtcbmltcG9ydCBndWxwU291cmNlTWFwcyBmcm9tIFwiZ3VscC1zb3VyY2VtYXBzXCI7XG5pbXBvcnQgZ3VscFR5cGVzY3JpcHQgZnJvbSBcImd1bHAtdHlwZXNjcmlwdFwiO1xuaW1wb3J0IHsgSW5jaWRlbnQgfSBmcm9tIFwiaW5jaWRlbnRcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwibWVyZ2UyXCI7XG5pbXBvcnQgeyBwb3NpeCBhcyBwb3NpeFBhdGggfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgQ29tcGlsZXJPcHRpb25zSnNvbiB9IGZyb20gXCIuLi9vcHRpb25zL3RzY1wiO1xuaW1wb3J0IHsgT3V0TW9kdWxlcyB9IGZyb20gXCIuLi9vcHRpb25zL3R5cGVzY3JpcHRcIjtcbmltcG9ydCB7IFRhc2tGdW5jdGlvbiB9IGZyb20gXCIuLi91dGlscy9ndWxwLXRhc2stZnVuY3Rpb25cIjtcbmltcG9ydCB7IGRlbGV0ZVVuZGVmaW5lZFByb3BlcnRpZXMgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IFJlc29sdmVkVHNMb2NhdGlvbnMsIHJlc29sdmVUc0xvY2F0aW9ucywgVHlwZXNjcmlwdENvbmZpZyB9IGZyb20gXCIuL190eXBlc2NyaXB0XCI7XG5cbnR5cGUgVHlwZXNjcmlwdEVycm9ySGFzaCA9IHN0cmluZztcblxuZnVuY3Rpb24gaGFzaFR5cGVzY3JpcHRFcnJvcihlcnJvcjogZ3VscFR5cGVzY3JpcHQucmVwb3J0ZXIuVHlwZVNjcmlwdEVycm9yKTogVHlwZXNjcmlwdEVycm9ySGFzaCB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgZmlsZU5hbWU6IGVycm9yLmZ1bGxGaWxlbmFtZSxcbiAgICBjb2RlOiBlcnJvci5kaWFnbm9zdGljLmNvZGUsXG4gICAgc3RhcnRQb3NpdGlvbjogZXJyb3Iuc3RhcnRQb3NpdGlvbixcbiAgICBlbmRQb3NpdGlvbjogZXJyb3IuZW5kUG9zaXRpb24sXG4gIH0pO1xufVxuXG5jbGFzcyBUeXBlc2NyaXB0UmVwb3J0ZXIgaW1wbGVtZW50cyBndWxwVHlwZXNjcmlwdC5yZXBvcnRlci5SZXBvcnRlciB7XG4gIHJlYWRvbmx5IHRocm93T25FcnJvcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlUmVwb3J0ZXI6IGd1bHBUeXBlc2NyaXB0LnJlcG9ydGVyLlJlcG9ydGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcG9ydGVkOiBTZXQ8VHlwZXNjcmlwdEVycm9ySGFzaD47XG5cbiAgY29uc3RydWN0b3IodGhyb3dPbkVycm9yOiBib29sZWFuKSB7XG4gICAgdGhpcy5iYXNlUmVwb3J0ZXIgPSBndWxwVHlwZXNjcmlwdC5yZXBvcnRlci5kZWZhdWx0UmVwb3J0ZXIoKTtcbiAgICB0aGlzLnJlcG9ydGVkID0gbmV3IFNldCgpO1xuICAgIHRoaXMudGhyb3dPbkVycm9yID0gdGhyb3dPbkVycm9yO1xuICB9XG5cbiAgZXJyb3IoZXJyb3I6IGd1bHBUeXBlc2NyaXB0LnJlcG9ydGVyLlR5cGVTY3JpcHRFcnJvciwgdHlwZXNjcmlwdDogYW55KTogdm9pZCB7XG4gICAgY29uc3QgaGFzaDogVHlwZXNjcmlwdEVycm9ySGFzaCA9IGhhc2hUeXBlc2NyaXB0RXJyb3IoZXJyb3IpO1xuICAgIGlmICh0aGlzLnJlcG9ydGVkLmhhcyhoYXNoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlcG9ydGVkLmFkZChoYXNoKTtcbiAgICB0aGlzLmJhc2VSZXBvcnRlci5lcnJvciEoZXJyb3IsIHR5cGVzY3JpcHQpO1xuICB9XG5cbiAgZmluaXNoKGNvbXBpbGVyUmVzdWx0OiBndWxwVHlwZXNjcmlwdC5yZXBvcnRlci5Db21waWxhdGlvblJlc3VsdCk6IHZvaWQge1xuICAgIHRoaXMuYmFzZVJlcG9ydGVyLmZpbmlzaCEoY29tcGlsZXJSZXN1bHQpO1xuICAgIGlmICh0aGlzLnRocm93T25FcnJvciAmJiB0aGlzLnJlcG9ydGVkLnNpemUgPiAwKSB7XG4gICAgICB0aHJvdyBJbmNpZGVudChcIlR5cGVzY3JpcHRFcnJvclwiKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJ1aWxkVHlwZXNjcmlwdFRhc2soXG4gIGd1bHA6IEd1bHAsXG4gIG9wdGlvbnM6IFR5cGVzY3JpcHRDb25maWcsXG4gIHRocm93T25FcnJvcjogYm9vbGVhbiA9IHRydWUsXG4pOiBUYXNrRnVuY3Rpb24ge1xuICBjb25zdCByZXNvbHZlZDogUmVzb2x2ZWRUc0xvY2F0aW9ucyA9IHJlc29sdmVUc0xvY2F0aW9ucyhvcHRpb25zKTtcbiAgY29uc3QgdHNjT3B0aW9uczogQ29tcGlsZXJPcHRpb25zSnNvbiA9IHtcbiAgICAuLi5vcHRpb25zLnRzY09wdGlvbnMsXG4gICAgcm9vdERpcjogcmVzb2x2ZWQucm9vdERpcixcbiAgICBvdXREaXI6IHJlc29sdmVkLm91dERpcixcbiAgICB0eXBlUm9vdHM6IHJlc29sdmVkLnR5cGVSb290cyxcbiAgfTtcbiAgZGVsZXRlVW5kZWZpbmVkUHJvcGVydGllcyh0c2NPcHRpb25zKTtcblxuICBjb25zdCB0YXNrOiBUYXNrRnVuY3Rpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IG1qc1N0cmVhbTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtIHwgdW5kZWZpbmVkO1xuICAgIGxldCBqc1N0cmVhbTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtIHwgdW5kZWZpbmVkO1xuICAgIGxldCBkdHNTdHJlYW06IE5vZGVKUy5SZWFkYWJsZVN0cmVhbSB8IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHNyY1N0cmVhbTogTm9kZUpTLlJlYWRhYmxlU3RyZWFtID0gZ3VscFxuICAgICAgLnNyYyhyZXNvbHZlZC5hYnNTY3JpcHRzLCB7YmFzZTogb3B0aW9ucy5zcmNEaXJ9KVxuICAgICAgLnBpcGUoZ3VscFNvdXJjZU1hcHMuaW5pdCgpKTtcblxuICAgIGludGVyZmFjZSBDb21waWxlZFN0cmVhbSB7XG4gICAgICBqczogTm9kZUpTLlJlYWRhYmxlU3RyZWFtO1xuICAgICAgZHRzOiBOb2RlSlMuUmVhZGFibGVTdHJlYW07XG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3J0ZXI6IFR5cGVzY3JpcHRSZXBvcnRlciA9IG5ldyBUeXBlc2NyaXB0UmVwb3J0ZXIodGhyb3dPbkVycm9yKTtcbiAgICAvLyBUT0RPOiB1cGRhdGUgdHlwZSBkZWZpbml0aW9ucyBvZiBgZ3VscC1zb3VyY2VtYXBzYFxuICAgIGNvbnN0IHdyaXRlU291cmNlTWFwc09wdGlvbnM6IGd1bHBTb3VyY2VNYXBzLldyaXRlT3B0aW9ucyA9IDxhbnk+IHtcbiAgICAgIHNvdXJjZVJvb3Q6IChmaWxlOiBhbnkgLyogVmlueWxGaWxlICovKTogc3RyaW5nID0+IHtcbiAgICAgICAgcmV0dXJuIHBvc2l4UGF0aC5yZWxhdGl2ZShwb3NpeFBhdGguZGlybmFtZShmaWxlLnJlbGF0aXZlKSwgXCJcIik7XG4gICAgICB9LFxuICAgIH07XG4gICAgaWYgKG9wdGlvbnMub3V0TW9kdWxlcyA9PT0gT3V0TW9kdWxlcy5Kcykge1xuICAgICAgY29uc3QgY29tcGlsZWRTdHJlYW06IENvbXBpbGVkU3RyZWFtID0gc3JjU3RyZWFtLnBpcGUoZ3VscFR5cGVzY3JpcHQodHNjT3B0aW9ucywgcmVwb3J0ZXIpKTtcbiAgICAgIGpzU3RyZWFtID0gY29tcGlsZWRTdHJlYW0uanNcbiAgICAgICAgLnBpcGUoZ3VscFNvdXJjZU1hcHMud3JpdGUod3JpdGVTb3VyY2VNYXBzT3B0aW9ucykpO1xuICAgICAgZHRzU3RyZWFtID0gY29tcGlsZWRTdHJlYW0uZHRzO1xuICAgIH0gZWxzZSB7IC8vIE1qcyBvciBCb3RoXG4gICAgICBjb25zdCBtanNPcHRpb25zOiBDb21waWxlck9wdGlvbnNKc29uID0gey4uLnRzY09wdGlvbnMsIG1vZHVsZTogXCJlczIwMTVcIn07XG4gICAgICBjb25zdCBjb21waWxlZFN0cmVhbTogQ29tcGlsZWRTdHJlYW0gPSBzcmNTdHJlYW0ucGlwZShndWxwVHlwZXNjcmlwdChtanNPcHRpb25zLCByZXBvcnRlcikpO1xuICAgICAgbWpzU3RyZWFtID0gY29tcGlsZWRTdHJlYW0uanNcbiAgICAgICAgLnBpcGUoZ3VscFNvdXJjZU1hcHMud3JpdGUod3JpdGVTb3VyY2VNYXBzT3B0aW9ucykpXG4gICAgICAgIC5waXBlKGd1bHBSZW5hbWUoe2V4dG5hbWU6IFwiLm1qc1wifSkpO1xuICAgICAgZHRzU3RyZWFtID0gY29tcGlsZWRTdHJlYW0uZHRzO1xuICAgICAgaWYgKG9wdGlvbnMub3V0TW9kdWxlcyA9PT0gT3V0TW9kdWxlcy5Cb3RoKSB7XG4gICAgICAgIGpzU3RyZWFtID0gc3JjU3RyZWFtXG4gICAgICAgICAgLnBpcGUoZ3VscFR5cGVzY3JpcHQodHNjT3B0aW9ucywgcmVwb3J0ZXIpKVxuICAgICAgICAgIC5qc1xuICAgICAgICAgIC5waXBlKGd1bHBTb3VyY2VNYXBzLndyaXRlKHdyaXRlU291cmNlTWFwc09wdGlvbnMpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbWVyZ2UoW2R0c1N0cmVhbSwganNTdHJlYW0sIG1qc1N0cmVhbV0uZmlsdGVyKHggPT4geCAhPT0gdW5kZWZpbmVkKSBhcyBOb2RlSlMuUmVhZGFibGVTdHJlYW1bXSlcbiAgICAgIC5waXBlKGd1bHAuZGVzdChvcHRpb25zLmJ1aWxkRGlyKSk7XG4gIH07XG4gIHRhc2suZGlzcGxheU5hbWUgPSBcIl9idWlsZDpzY3JpcHRzXCI7XG4gIHJldHVybiB0YXNrO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnVpbGRUeXBlc2NyaXB0V2F0Y2hUYXNrKGd1bHA6IEd1bHAsIG9wdGlvbnM6IFR5cGVzY3JpcHRDb25maWcpOiAoKSA9PiBGU1dhdGNoZXIge1xuICByZXR1cm4gKCk6IEZTV2F0Y2hlciA9PiB7XG4gICAgY29uc3QgYnVpbGRUYXNrOiBUYXNrRnVuY3Rpb24gPSBnZXRCdWlsZFR5cGVzY3JpcHRUYXNrKGd1bHAsIG9wdGlvbnMsIGZhbHNlKTtcbiAgICBjb25zdCByZXNvbHZlZDogUmVzb2x2ZWRUc0xvY2F0aW9ucyA9IHJlc29sdmVUc0xvY2F0aW9ucyhvcHRpb25zKTtcbiAgICByZXR1cm4gZ3VscC53YXRjaChyZXNvbHZlZC5hYnNTY3JpcHRzLCB7Y3dkOiBvcHRpb25zLnNyY0Rpcn0sIGJ1aWxkVGFzaykgYXMgRlNXYXRjaGVyO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnVpbGRUeXBlc2NyaXB0V2F0Y2hlcihndWxwOiBHdWxwLCBvcHRpb25zOiBUeXBlc2NyaXB0Q29uZmlnKTogRlNXYXRjaGVyIHtcbiAgcmV0dXJuIGdldEJ1aWxkVHlwZXNjcmlwdFdhdGNoVGFzayhndWxwLCBvcHRpb25zKSgpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIuLiJ9