fuse-box
Version:
Fuse-Box a bundler that does it right
137 lines (120 loc) • 4.63 kB
text/typescript
import { SparkTask } from "./SparkTask";
import { SparkFlow } from "./SparkFlow";
import { SparkyFilePatternOptions } from "./SparkyFilePattern";
import { each } from "realm-utils";
import { WorkFlowContext } from "../core/WorkflowContext";
import { Log } from "../Log";
import { SparkyContext, SparkyContextClass, getSparkyContext } from './SparkyContext';
import { FuseBoxOptions } from '../index';
import { FuseBox } from '../core/FuseBox';
const context = new WorkFlowContext();
context.doLog = process.env.SPARKY_LOG !== 'false';
export const log = new Log(context);
export class Sparky {
static launch = false;
static testMode = false;
static tasks = new Map<string, SparkTask>();
public static flush() {
this.tasks = new Map<string, SparkTask>();
}
/** Create a new task */
public static task(name: string, ...args): Sparky {
let callback: any;
let dependencies: string[] = [];
let secondArgument = arguments[1];
if (Array.isArray(secondArgument) || typeof secondArgument === "string") {
dependencies = [].concat(secondArgument);
callback = arguments[2];
} else {
callback = arguments[1];
}
this.tasks.set(name, new SparkTask(name, dependencies, callback));
// launching the task on next tick
if (this.launch === false && this.testMode === false) {
this.launch = true;
process.nextTick(async () => {
await this.start()
});
}
return this;
}
public static context(target:
() => { [key: string]: any } |
(new () => any) |
{ [key: string]: any }): SparkyContextClass {
return SparkyContext(target);
}
public static src(glob: string | string[], opts?: SparkyFilePatternOptions): SparkFlow {
const flow = new SparkFlow();
let globs = Array.isArray(glob) ? glob : [glob]
return flow.glob(globs, opts);
}
public static watch(glob: string | string[], opts?: SparkyFilePatternOptions) {
const flow = new SparkFlow();
let globs = Array.isArray(glob) ? glob : [glob]
return flow.watch(globs, opts);
}
public static fuse(fn: (context: any) => FuseBoxOptions) {
process.nextTick(() => {
const sparkyContext = getSparkyContext();
sparkyContext._getFuseBoxOptions = () => FuseBox.init(fn(sparkyContext))
Object.defineProperty(sparkyContext, 'fuse', {
get: () => {
if (!sparkyContext._fuseInstance) {
sparkyContext._fuseInstance = sparkyContext._getFuseBoxOptions();
}
return sparkyContext._fuseInstance;
}
});
return sparkyContext._fuseInstance;
});
}
public static init(paths: string[]) {
const flow = new SparkFlow();
flow.createFiles(paths);
return flow;
}
public static async exec(...args: Array<string | (() => any)>) {
for (const task of args) {
if (typeof task === "string") {
await this.resolve(task)
} else {
await task();
}
}
}
public static async start(tname?: string): Promise<any> {
let start = process.hrtime();
const taskName = tname || process.argv[2] || "default";
if (!this.tasks.get(taskName)) {
log.echoWarning(`Task with such name ${taskName} was not found!`);
return Promise.reject("Task not found");
}
log.echoSparkyTaskStart(taskName)
const task = this.tasks.get(taskName);
await Promise.all([
// resolve parallel dependencies
Promise.all(task.parallelDependencies.map(name => this.resolve(name))),
// resolve waterfal dependencies
each(task.waterfallDependencies, name => this.resolve(name))
])
let res;
if( typeof task.fn === 'function'){
res = await this.execute(task.fn(getSparkyContext()))
}
log.echoSparkyTaskEnd(taskName, process.hrtime(start));
return res;
}
private static execute(result: any) {
if (result instanceof SparkFlow) {
return result.exec();
}
return result;
}
private static async resolve(name: string) {
if (!this.tasks.get(name)) {
return log.echoWarning(`Task with such name ${name} was not found!`);
}
return await this.start(name);
}
}