fuse-box
Version:
Fuse-Box a bundler that does it right
81 lines (66 loc) • 2.39 kB
text/typescript
import { Plugin, WorkFlowContext } from '../core/WorkflowContext';
import { File } from '../core/File';
export interface IConsolidatePluginOptions {
engine: string;
extension?: string;
useDefault?: boolean;
}
export class ConsolidatePluginClass implements Plugin {
public test: RegExp;
private extension: string;
private engine: string;
private useDefault: boolean;
constructor(options: IConsolidatePluginOptions) {
if (!options.engine) {
const message = 'ConsolidatePlugin - requires an engine to be provided in the options'
throw new Error(message);
}
this.engine = options.engine;
this.extension = options.extension || `.${options.engine}`;
this.useDefault = (options.useDefault !== undefined) ? options.useDefault : true;
this.test = new RegExp(this.extension);
}
public init(context: WorkFlowContext) {
context.allowExtension(this.extension);
}
public async transform(file: File) {
const consolidate = require('consolidate');
if (file.context.useCache) {
const cached = file.context.cache.getStaticCache(file);
if (cached) {
file.isLoaded = true;
file.contents = cached.contents;
return Promise.resolve();
}
}
file.loadContents();
if (!consolidate[this.engine]) {
const message = `ConsolidatePlugin - consolidate did not recognise the engine "${this.engine}"`;
file.context.log.echoError(message);
return Promise.reject(new Error(message));
}
try {
file.contents = await consolidate[this.engine].render(file.contents, {
cache: false,
filename: 'base',
basedir: file.context.homeDir,
includeDir: file.context.homeDir
});
if (this.useDefault) {
file.contents = `module.exports.default = ${JSON.stringify(file.contents)}`;
} else {
file.contents = `module.exports = ${JSON.stringify(file.contents)}`;
}
} catch (e) {
file.context.log.echoError(`ConsolidatePlugin - could not process template, ${e}`);
return Promise.reject(e);
}
if (file.context.useCache) {
file.context.emitJavascriptHotReload(file);
file.context.cache.writeStaticCache(file, file.sourceMap);
}
}
}
export const ConsolidatePlugin = (options: IConsolidatePluginOptions) => {
return new ConsolidatePluginClass(options);
}