import { after, afterEach, before } from '@ephox/bedrock-client'; import { Arr, Obj, Optional } from '@ephox/katamari'; import { TinyHooks } from '@ephox/mcagar'; import { SugarElement } from '@ephox/sugar'; import { load } from '../loader/Loader'; import { PluginDetails, readPlugins, registerPlugins } from '../loader/Plugins'; export interface Hook { readonly editor: () => T; } export interface ShadowRootHook extends Hook { readonly shadowRoot: () => SugarElement; } const setupVersion = >( version: string, setupModules: Record void>>, setupHook: (setupPluginModules: Array<() => void>) => H ): H => { let hasFailure = false; let plugins: Optional = Optional.none(); const pluginNames = Obj.keys(setupModules); const modules = Arr.flatten(Obj.values(setupModules)); before(function (done) { // Increase the default timeout to ensure we have time to load this.timeout(4000); // Store the original plugins plugins = Optional.some(readPlugins(pluginNames)); // load the new version and restore the loaded plugins load(version, () => { plugins.each(registerPlugins); done(); }, done); }); const hook = setupHook(modules); afterEach(function () { if (this.currentTest?.isFailed() === true) { hasFailure = true; } }); after(function (done) { // Increase the default timeout to ensure we have time to load this.timeout(4000); if (hasFailure) { done(); } else { // load the latest version back into scope load('latest', () => { // Restore the original plugins plugins.each(registerPlugins); plugins = Optional.none(); done(); }, done); } }); return hook; }; const bddSetupVersion = ( version: string, settings: Record, setupModules: Record void>> = {}, focusOnInit: boolean = false ): Hook => { return setupVersion(version, setupModules, (modules) => { return TinyHooks.bddSetup(settings, modules, focusOnInit); }); }; const bddSetupVersionLight = ( version: string, settings: Record, setupModules: Record void>> = {}, focusOnInit: boolean = false ): Hook => { return setupVersion(version, setupModules, (modules) => { return TinyHooks.bddSetupLight(settings, modules, focusOnInit); }); }; const bddSetupVersionFromElement = ( version: string, settings: Record, setupElement: () => TinyHooks.SetupElement, setupModules: Record void>> = {}, focusOnInit: boolean = false ): Hook => { return setupVersion(version, setupModules, (modules) => { return TinyHooks.bddSetupFromElement(settings, setupElement, modules, focusOnInit); }); }; const bddSetupVersionInShadowRoot = ( version: string, settings: Record, setupModules: Record void>> = {}, focusOnInit: boolean = false ): ShadowRootHook => { return setupVersion(version, setupModules, (modules) => { return TinyHooks.bddSetupInShadowRoot(settings, modules, focusOnInit); }); }; export { bddSetupVersion, bddSetupVersionLight, bddSetupVersionFromElement, bddSetupVersionInShadowRoot };