simplr-gulp
Version:
Fully functional gulpfile.js implementation. Tailored for Single Page Application. Written in TypeScript.
123 lines (122 loc) • 5.82 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
const gulp = require("gulp");
const fs = require("fs");
const configuration_1 = require("../configuration/configuration");
const logger_1 = require("../utils/logger");
const path = require("path");
const live_reload_actions_creators_1 = require("../actions/live-reload/live-reload-actions-creators");
const tasks_handler_1 = require("../tasks/tasks-handler");
const watch_assets_task_1 = require("./tasks/watch-assets/watch-assets-task");
const watch_configs_task_1 = require("./tasks/watch-configs/watch-configs-task");
const watch_html_task_1 = require("./tasks/watch-html/watch-html-task");
const watch_scripts_task_1 = require("./tasks/watch-scripts/watch-scripts-task");
const watch_styles_task_1 = require("./tasks/watch-styles/watch-styles-task");
class WatcherTasksHandler extends tasks_handler_1.TasksHandler {
constructor() {
super((config) => {
config.Name = "Watch";
config.Tasks = [watch_assets_task_1.WatchAssetsTask, watch_configs_task_1.WatchConfigsTask, watch_html_task_1.WatchHtmlTask, watch_scripts_task_1.WatchScriptsTask, watch_styles_task_1.WatchStylesTask];
return config;
});
this.watchers = {};
this.runningTasks = new Array();
this.onTaskStart = (taskName) => {
this.runningTasks.push(taskName);
};
this.onTaskEnd = (taskName) => {
let found = this.runningTasks.indexOf(taskName);
if (found > -1) {
this.runningTasks.splice(found, 1);
}
if (this.runningTasks.length === 0) {
this.onAllTaskEnded();
}
};
this.pendingReloadFiles = new Array();
this.fileChangeHandler = (pathName, stats) => {
let targetPathName = this.removeRootSourcePath(pathName);
targetPathName = this.changeExtensionToBuilded(targetPathName);
this.pendingReloadFiles.push(targetPathName);
logger_1.LoggerInstance.log(`'${pathName}' was changed.`);
};
this.fileUnlinkHandler = (pathName) => {
let targetPathName = this.changeExtensionToBuilded(pathName);
targetPathName = this.changeRootPathToBuild(targetPathName);
fs.unlink(targetPathName, (err) => {
if (err != null) {
if (err.code === "ENOENT") {
logger_1.LoggerInstance.warn(`'${targetPathName}' has already been deleted.`);
}
else {
logger_1.LoggerInstance.error(`Failed to delete file '${targetPathName}'\n`, err);
}
}
else {
logger_1.LoggerInstance.log(`'${targetPathName}' was deleted successfully.`);
}
});
};
this.registerWatchers();
logger_1.LoggerInstance.info(`Started watching files in '${configuration_1.Configuration.GulpConfig.Directories.Source}' folder.`);
}
registerWatchers() {
Object.keys(this.constructedTasks).forEach(name => {
let task = this.constructedTasks[name];
let process = gulp.parallel(this.generateName(task.Name));
this.watchers[task.Name] = gulp.watch(task.Globs, { ignoreInitial: true }, process);
this.watchers[task.Name].on("unlink", (path) => {
this.fileUnlinkHandler(path);
if (task.Unlink != null) {
task.Unlink(path);
}
});
this.watchers[task.Name].on("change", (pathName, stats) => {
this.fileChangeHandler(pathName, stats);
if (task.Change != null) {
task.Change(pathName, stats);
}
});
task.On("start", this.onTaskStart.bind(this, task.Name));
task.On("end", this.onTaskEnd.bind(this, task.Name));
});
}
onAllTaskEnded() {
live_reload_actions_creators_1.LiveReloadActionsCreators.ReloadFiles(...this.pendingReloadFiles);
this.pendingReloadFiles = new Array();
}
removeRootSourcePath(pathName) {
let pathList = pathName.split(path.sep);
if (pathList[0] === configuration_1.Configuration.GulpConfig.Directories.Source) {
pathList[0] = "";
return path.join(...pathList);
}
else {
return pathName;
}
}
changeExtensionToBuilded(pathName) {
let currentExtension = path.extname(pathName);
if (currentExtension.length > 1) {
let currentExtensionTarget = currentExtension.slice(1);
let targetExtension = configuration_1.Configuration.DefaultExtensions[currentExtensionTarget];
if (targetExtension !== undefined) {
return pathName.slice(0, -currentExtensionTarget.length) + targetExtension;
}
}
return pathName;
}
changeRootPathToBuild(pathName) {
let pathList = pathName.split(path.sep);
if (pathList[0] === configuration_1.Configuration.GulpConfig.Directories.Source) {
pathList[0] = configuration_1.Configuration.GulpConfig.Directories.Build;
return path.join(...pathList);
}
else {
logger_1.LoggerInstance
.withType("WarcherTasksHandler.changeRootPathToBuild()")
.warn(`"${pathName}" path root is not under Source directory (${configuration_1.Configuration.GulpConfig.Directories.Source}) `);
return pathName;
}
}
}
exports.WatcherTasksHandler = WatcherTasksHandler;