ipsos-components
Version:
Material Design components for Angular
117 lines (94 loc) • 4.28 kB
text/typescript
import {dest, src, task} from 'gulp';
import {join} from 'path';
import {composeRelease} from '../build-release';
import {inlineResourcesForDirectory} from '../inline-resources';
import {buildScssTask} from './build-scss-task';
import {sequenceTask} from './sequence-task';
import {watchFiles} from './watch-files';
import {BuildPackage} from '../build-package';
// There are no type definitions available for these imports.
const htmlmin = require('gulp-htmlmin');
const htmlMinifierOptions = {
collapseWhitespace: true,
removeComments: true,
caseSensitive: true,
removeAttributeQuotes: false
};
/** Creates a set of gulp tasks that can build the specified package. */
export function createPackageBuildTasks(buildPackage: BuildPackage) {
// Name of the package build tasks for Gulp.
const taskName = buildPackage.name;
// Name of all dependencies of the current package.
const dependencyNames = buildPackage.dependencies.map(p => p.name);
// Glob that matches all style files that need to be copied to the package output.
const stylesGlob = join(buildPackage.sourceDir, '**/*.+(scss|css)');
// Glob that matches every HTML file in the current package.
const htmlGlob = join(buildPackage.sourceDir, '**/*.html');
// List of watch tasks that need run together with the watch task of the current package.
const dependentWatchTasks = buildPackage.dependencies.map(p => `${p.name}:watch`);
/**
* Main tasks for the package building. Tasks execute the different sub-tasks in the correct
* order.
*/
task(`${taskName}:clean-build`, sequenceTask('clean', `${taskName}:build`));
task(`${taskName}:build`, sequenceTask(
// Build all required packages before building.
...dependencyNames.map(pkgName => `${pkgName}:build`),
// Build ESM and assets output.
`${taskName}:assets`,
`${taskName}:build:esm`,
// Inline assets into ESM output.
`${taskName}:assets:inline`,
// Build bundles on top of inlined ESM output.
`${taskName}:build:bundles`,
));
task(`${taskName}:build-no-bundles`, sequenceTask(
// Build the ESM output that includes all test files. Also build assets for the package.
[`${taskName}:build:esm:tests`, `${taskName}:assets`],
// Inline assets into ESM output.
`${taskName}:assets:inline`
));
/**
* Release tasks for the package. Tasks compose the release output for the package.
*/
task(`${taskName}:build-release:clean`, sequenceTask('clean', `${taskName}:build-release`));
task(`${taskName}:build-release`, [`${taskName}:build`], () => composeRelease(buildPackage));
/**
* TypeScript compilation tasks. Tasks are creating ESM, FESM, UMD bundles for releases.
*/
task(`${taskName}:build:esm`, () => buildPackage.compile());
task(`${taskName}:build:esm:tests`, () => buildPackage.compileTests());
task(`${taskName}:build:bundles`, () => buildPackage.createBundles());
/**
* Asset tasks. Building SASS files and inlining CSS, HTML files into the ESM output.
*/
task(`${taskName}:assets`, [
`${taskName}:assets:scss`,
`${taskName}:assets:es5-scss`,
`${taskName}:assets:copy-styles`,
`${taskName}:assets:html`
]);
task(`${taskName}:assets:scss`, buildScssTask(
buildPackage.outputDir, buildPackage.sourceDir, true)
);
task(`${taskName}:assets:es5-scss`, buildScssTask(
buildPackage.esm5OutputDir, buildPackage.sourceDir, true)
);
task(`${taskName}:assets:copy-styles`, () => {
return src(stylesGlob)
.pipe(dest(buildPackage.outputDir))
.pipe(dest(buildPackage.esm5OutputDir));
});
task(`${taskName}:assets:html`, () => {
return src(htmlGlob).pipe(htmlmin(htmlMinifierOptions))
.pipe(dest(buildPackage.outputDir))
.pipe(dest(buildPackage.esm5OutputDir));
});
task(`${taskName}:assets:inline`, () => inlineResourcesForDirectory(buildPackage.outputDir));
/**
* Watch tasks, that will rebuild the package whenever TS, SCSS, or HTML files change.
*/
task(`${taskName}:watch`, dependentWatchTasks, () => {
watchFiles(join(buildPackage.sourceDir, '**/*.+(ts|scss|html)'), [`${taskName}:build`]);
});
}