fuse-box
Version:
Fuse-Box a bundler that does it right
83 lines (76 loc) • 2.83 kB
text/typescript
//import { WorkFlowContext } from "../core/WorkflowContext";
import { File } from "../core/File";
import { Plugin, WorkFlowContext } from "../core/WorkflowContext";
import { utils } from "realm-utils";
import { extractExtension, string2RegExp, hashString, joinFuseBoxPath } from "../Utils";
import * as fs from "fs-extra";
import * as path from "path";
export interface CopyPluginOptions {
files?: string[];
useDefault?: boolean;
dest?: string;
resolve?: string;
}
/**
* @export
* @class AssetPluginClass
* @implements {Plugin}
*/
export class CopyPluginClass implements Plugin {
public extensions: Array<string>;
public test: RegExp = /.*/;
private useDefault = true;
private resolve = "/assets/";
private dest = "assets";
constructor(public options: CopyPluginOptions = {}) {
options = options || {};
if (options.useDefault !== undefined) {
this.useDefault = options.useDefault;
}
if (options.resolve !== undefined) {
this.resolve = options.resolve;
}
if (options.dest !== undefined) {
this.dest = options.dest;
}
if (utils.isArray(options.files)) {
this.extensions = [];
options.files.forEach(str => {
this.extensions.push("." + extractExtension(str));
});
this.test = string2RegExp(options.files.join("|"));
}
}
public init(context: WorkFlowContext) {
if (Array.isArray(this.extensions)) {
return this.extensions.forEach(ext => context.allowExtension(ext));
}
}
public transform(file: File) {
const context = file.context;
file.isLoaded = true;
let userFile = (!context.hash ? hashString(file.info.fuseBoxPath) + "-" : "") + path.basename(file.info.fuseBoxPath);
let userPath = path.join(this.dest, userFile);
let exportsKey = this.useDefault ? "module.exports.default" : "module.exports";
file.alternativeContent = (`${exportsKey} = "${joinFuseBoxPath(this.resolve, userFile)}";`);
if (fs.existsSync(userPath)) {
return;
}
return new Promise((resolve, reject) => {
fs.readFile(file.absPath, (err, data) => {
if (err) {
return reject();
}
return context.output.write(userPath, data).then(result => {
if (result.hash) {
file.alternativeContent = (`${exportsKey} = "${joinFuseBoxPath(this.resolve, result.filename)}";`);
}
return resolve();
}).catch(reject);
});
});
}
}
export const CopyPlugin = (options?: CopyPluginOptions) => {
return new CopyPluginClass(options);
};