fuse-box
Version:
Fuse-Box a bundler that does it right
229 lines (198 loc) • 6.81 kB
text/typescript
import { WebIndexPluginClass } from "../../plugins/WebIndexPlugin";
import { QuantumCore } from "./QuantumCore";
import { readFuseBoxModule } from "../../Utils";
import { FileAbstraction } from "../core/FileAbstraction";
export interface ITreeShakeOptions {
shouldRemove: { (file: FileAbstraction): void }
}
export interface IQuantumExtensionParams {
target?: string;
uglify?: any;
removeExportsInterop?: boolean;
removeUseStrict?: boolean;
replaceProcessEnv?: boolean;
webIndexPlugin?: WebIndexPluginClass;
ensureES5?: boolean;
treeshake?: boolean | ITreeShakeOptions;
api?: { (core: QuantumCore): void }
warnings?: boolean;
bakeApiIntoBundle?: string;
extendServerImport?: boolean;
polyfills?: string[];
processPolyfill?: boolean;
hoisting?: boolean | { names: string[] };
containedAPI?: boolean,
manifest?: boolean | string,
}
export class QuantumOptions {
private uglify: any;
private removeExportsInterop = true;
private removeUseStrict = true;
private ensureES5 = true;
private replaceProcessEnv = true;
private containedAPI = false;
private processPolyfill = false;
private bakeApiIntoBundle: string;
private showWarnings = true;
private treeshakeOptions: ITreeShakeOptions;
private hoisting = false;
private polyfills: string[];
private hoistedNames: string[];
private extendServerImport = false;
private manifestFile: string;
public apiCallback: { (core: QuantumCore): void }
public optsTarget: string = "browser";
public treeshake = false;
public webIndexPlugin: WebIndexPluginClass;
constructor(opts: IQuantumExtensionParams) {
opts = opts || {};
if (opts.target) {
this.optsTarget = opts.target;
}
if (opts.api) {
this.apiCallback = opts.api;
}
if (opts.manifest !== undefined) {
if (typeof opts.manifest === "string") {
this.manifestFile = opts.manifest;
}
if (opts.manifest === true) {
this.manifestFile = "manifest.json";
}
}
if (opts.uglify) {
this.uglify = opts.uglify;
}
if (opts.processPolyfill !== undefined) {
this.processPolyfill = opts.processPolyfill;
}
if (opts.warnings !== undefined) {
this.showWarnings = opts.warnings;
}
if (opts.containedAPI !== undefined) {
this.containedAPI = opts.containedAPI;
}
if (Array.isArray(opts.polyfills)) {
this.polyfills = opts.polyfills;
}
// stupid exports.__esModule = true;
if (opts.removeExportsInterop !== undefined) {
this.removeExportsInterop = opts.removeExportsInterop;
}
if (opts.replaceProcessEnv !== undefined) {
this.replaceProcessEnv = this.replaceProcessEnv;
}
if (opts.removeUseStrict !== undefined) {
this.removeUseStrict = opts.removeUseStrict;
}
if (opts.webIndexPlugin) {
this.webIndexPlugin = opts.webIndexPlugin;
}
if (opts.hoisting !== undefined) {
if (typeof opts.hoisting === "boolean") {
this.hoisting = opts.hoisting as boolean;
} else {
this.hoisting = true;
const hoistingOptions = opts.hoisting as { names: string[] };
this.hoistedNames = hoistingOptions.names;
}
}
if (opts.bakeApiIntoBundle) {
this.bakeApiIntoBundle = opts.bakeApiIntoBundle;
}
if (opts.extendServerImport !== undefined) {
this.extendServerImport = opts.extendServerImport;
}
if (opts.ensureES5 !== undefined) {
this.ensureES5 = opts.ensureES5;
}
if (opts.treeshake !== undefined) {
if (typeof opts.treeshake === "boolean") {
this.treeshake = opts.treeshake;
} else {
this.treeshake = true;
this.treeshakeOptions = opts.treeshake as ITreeShakeOptions;
}
}
}
public shouldBundleProcessPolyfill() {
return this.processPolyfill === true;
}
public enableContainedAPI() {
return this.containedAPI = true;
}
public getPromisePolyfill() {
if (this.polyfills && this.polyfills.indexOf("Promise") > -1) {
return readFuseBoxModule("fuse-box-responsive-api/promise-polyfill.js");
}
}
public getManifestFilePath(): string {
return this.manifestFile;
}
public canBeRemovedByTreeShaking(file: FileAbstraction) {
if (this.treeshakeOptions) {
if (this.treeshakeOptions.shouldRemove) {
return this.treeshakeOptions.shouldRemove(file);
}
}
return true;
}
public isContained() {
return this.containedAPI;
}
public throwContainedAPIError() {
throw new Error(`
- Can't use contained api with more than 1 bundle
- Use only 1 bundle and bake the API e.g {bakeApiIntoBundle : "app"}
- Make sure code splitting is not in use
`);
}
public shouldRemoveUseStrict() {
return this.removeUseStrict;
}
public shouldEnsureES5() {
return this.ensureES5;
}
public shouldDoHoisting() {
return this.hoisting;
}
public getHoistedNames(): string[] {
return this.hoistedNames;
}
public isHoistingAllowed(name: string) {
if (this.hoistedNames) {
return this.hoistedNames.indexOf(name) > -1;
}
return true;
}
public shouldExtendServerImport() {
return this.extendServerImport;
}
public shouldShowWarnings() {
return this.showWarnings;
}
public shouldUglify() {
return this.uglify === true;
}
public shouldBakeApiIntoBundle() {
return this.bakeApiIntoBundle;
}
public shouldTreeShake() {
return this.treeshake;
}
public shouldRemoveExportsInterop() {
return this.removeExportsInterop;
}
public shouldReplaceProcessEnv() {
return this.replaceProcessEnv;
}
public isTargetUniveral() {
return this.optsTarget === "universal";
}
public isTargetServer() {
return this.optsTarget === "server";
}
public isTargetBrowser() {
return this.optsTarget === "browser";
}
}