@atlaskit/editor-common
Version:
A package that contains common classes and components for editor and renderer
102 lines • 3.35 kB
JavaScript
import _defineProperty from "@babel/runtime/helpers/defineProperty";
export class EditorPresetBuilder {
constructor(...more) {
_defineProperty(this, "safeEntry", plugin => Array.isArray(plugin) ? plugin : [plugin, undefined]);
this.data = [...more] || [];
}
add(nextOrTuple) {
return new EditorPresetBuilder(
/**
* re-cast this to NewPlugin as we've done all the type
* safety, dependency checking, narrowing, during
* `SafePresetCheck & VerifyPluginDependencies`
*/
nextOrTuple, ...this.data);
}
maybeAdd(pluginToAdd, shouldAdd) {
const pluginOrBuilder = typeof shouldAdd === 'function' ?
// @ts-expect-error Argument of type 'SafePresetCheck<ToAddPlugin, StackPlugins>' is not assignable to parameter of type 'ToAddPlugin'.
shouldAdd(pluginToAdd, this) : shouldAdd;
if (pluginOrBuilder instanceof EditorPresetBuilder) {
return pluginOrBuilder;
}
const nextPluginStack = [
/**
* re-cast this to NewPlugin as we've done all the type
* safety, dependency checking, narrowing, during
* `SafePresetCheck & VerifyPluginDependencies`
*/
pluginOrBuilder ? pluginToAdd : undefined, ...this.data];
const nextEditorPresetBuilder = new EditorPresetBuilder(...nextPluginStack);
return nextEditorPresetBuilder;
}
has(plugin) {
return this.data.some(pluginPreset => {
if (Array.isArray(pluginPreset)) {
return pluginPreset[0] === plugin;
}
return pluginPreset === plugin;
});
}
build({
pluginInjectionAPI,
excludePlugins: maybeExcludePlugins
} = {}) {
const excludePlugins = new Set(maybeExcludePlugins ? maybeExcludePlugins : []);
const editorPlugins = this.processEditorPlugins({
pluginInjectionAPI,
excludePlugins
});
return this.removeExcludedPlugins(editorPlugins, excludePlugins);
}
verifyDuplicatedPlugins() {
const cache = new Set();
this.data.filter(Boolean).forEach(pluginEntry => {
const [pluginFn, _] = Array.isArray(pluginEntry) ? pluginEntry : [pluginEntry, undefined];
if (cache.has(pluginFn)) {
throw new Error(`${pluginFn} is already included!`);
}
cache.add(pluginFn);
});
return true;
}
processEditorPlugins({
pluginInjectionAPI,
excludePlugins
}) {
this.verifyDuplicatedPlugins();
const seen = new Set();
const pluginsDataCopy = this.data.slice();
const plugins = pluginsDataCopy.reverse().filter(Boolean).map(entry => {
const [fn, config] = this.safeEntry(entry);
if (seen.has(fn)) {
return null;
}
seen.add(fn);
if (typeof fn !== 'function') {
return null;
}
const plugin = pluginInjectionAPI ? fn({
config,
api: pluginInjectionAPI.api()
}) : fn({
config
});
if (plugin && excludePlugins !== null && excludePlugins !== void 0 && excludePlugins.has(plugin.name)) {
return null;
}
if (!pluginInjectionAPI) {
return plugin;
}
pluginInjectionAPI.onEditorPluginInitialized(plugin);
return plugin;
}).filter(Boolean);
return plugins;
}
removeExcludedPlugins(plugins, excludes) {
if (excludes) {
return plugins.filter(plugin => !plugin || !excludes.has(plugin.name));
}
return plugins;
}
}