aboutsummaryrefslogtreecommitdiff
path: root/tools/utils/tasks_tools.ts
diff options
context:
space:
mode:
Diffstat (limited to 'tools/utils/tasks_tools.ts')
-rw-r--r--tools/utils/tasks_tools.ts64
1 files changed, 64 insertions, 0 deletions
diff --git a/tools/utils/tasks_tools.ts b/tools/utils/tasks_tools.ts
new file mode 100644
index 0000000..af1a069
--- /dev/null
+++ b/tools/utils/tasks_tools.ts
@@ -0,0 +1,64 @@
+import * as gulp from 'gulp';
+import * as util from 'gulp-util';
+import * as chalk from 'chalk';
+import * as gulpLoadPlugins from 'gulp-load-plugins';
+import * as _runSequence from 'run-sequence';
+import {readdirSync, existsSync, lstatSync} from 'fs';
+import {join} from 'path';
+import {TOOLS_DIR} from '../config';
+
+const TASKS_PATH = join(TOOLS_DIR, 'tasks');
+
+// NOTE: Remove if no issues with runSequence function below.
+// export function loadTasks(): void {
+// scanDir(TASKS_PATH, (taskname) => registerTask(taskname));
+// }
+
+export function task(taskname: string, option?: string) {
+ util.log('Loading task', chalk.yellow(taskname, option || ''));
+ return require(join('..', 'tasks', taskname))(gulp, gulpLoadPlugins(), option);
+}
+
+export function runSequence(...sequence: any[]) {
+ let tasks = [];
+ let _sequence = sequence.slice(0);
+ sequence.pop();
+
+ scanDir(TASKS_PATH, taskname => tasks.push(taskname));
+
+ sequence.forEach(task => {
+ if (tasks.indexOf(task) > -1) { registerTask(task); }
+ });
+
+ return _runSequence(..._sequence);
+}
+
+// ----------
+// Private.
+
+function registerTask(taskname: string, filename?: string, option: string = ''): void {
+ gulp.task(taskname, task(filename || taskname, option));
+}
+
+// TODO: add recursive lookup ? or enforce pattern file + folder (ie ./tools/utils & ./tools/utils.ts )
+function scanDir(root: string, cb: (taskname: string) => void) {
+ if (!existsSync(root)) return;
+
+ walk(root);
+
+ function walk(path) {
+ let files = readdirSync(path);
+ for (let i = 0; i < files.length; i += 1) {
+ let file = files[i];
+ let curPath = join(path, file);
+ // if (lstatSync(curPath).isDirectory()) { // recurse
+ // path = file;
+ // walk(curPath);
+ // }
+ if (lstatSync(curPath).isFile() && /\.ts$/.test(file)) {
+ let taskname = file.replace(/(\.ts)/, '');
+ cb(taskname);
+ }
+ }
+ }
+}