packages/babel-preset-breezr/src/createPluginCreator.ts (50 lines of code) (raw):
import { PluginTarget } from 'babel__core';
import { isFunction, isPlainObject, merge } from 'lodash';
import { IOptions, IObject, BabelCreator } from './types';
type PluginEnabled = boolean | IObject | void;
type PluginEnabledGetter = (options: IOptions) => PluginEnabled;
type PluginOptions = IObject | void;
type PluginOptionsGetter = (options: IOptions) => PluginOptions;
type MergeWith = (options: IOptions) => any;
export const createPluginOptionsGetter = (
mergeWith: MergeWith,
defaultOptions?: IObject
): PluginOptionsGetter => (options: IOptions) => {
const pluginOptions = mergeWith(options);
if (isPlainObject(pluginOptions)) {
return merge(
{},
isPlainObject(defaultOptions) ? defaultOptions : {},
pluginOptions
);
}
if (isPlainObject(defaultOptions)) {
return defaultOptions;
}
};
export default function createPluginCreator(
target: PluginTarget,
enable: boolean | PluginEnabledGetter = true,
options?: IObject | PluginOptionsGetter
): BabelCreator {
return (opt: IOptions) => {
let didEnabled: PluginEnabled | PluginEnabledGetter = enable;
if (isFunction(enable)) {
// @ts-ignore
didEnabled = enable(opt) as PluginEnabled;
}
if (!didEnabled) {
return;
}
const plugin = [target];
let pluginOptions: PluginOptions = options;
if (isFunction(options)) {
// @ts-ignore
pluginOptions = options(opt);
}
if (isPlainObject(pluginOptions)) {
plugin.push(pluginOptions as IObject);
} else if (isPlainObject(didEnabled)) {
plugin.push(didEnabled as IObject);
}
return plugin;
};
}