{"version":3,"file":"index.mjs","sources":[""],"sourcesContent":["import { onWindowResize, onWindowLoad, onDOMReady } from \"@web3r/flowerkit/evt\";\r\nimport { isFnClass, isFnAsync } from \"@web3r/flowerkit/fn\";\r\nimport { getJSONFromStr } from \"@web3r/flowerkit/json\";\r\nimport { isObjPromise } from \"@web3r/flowerkit/obj\";\r\nimport { isMobileDevice, isTouchDevice, deleteCookie } from \"@web3r/flowerkit/user\";\r\nimport { getWindow, getDocument } from \"ssr-window\";\r\nimport { constants } from \"../../constants\";\r\nimport type { IStyle, ISvgIcon } from \"../../types/webpack\";\r\nimport { setVhVar, setScrollBarWidth, useLazyStyles } from \"../../utils\";\r\nimport { Dispatcher } from \"../dispatcher\";\r\nimport { Forms } from \"../forms\";\r\nimport { Localisation } from \"../localisation\";\r\nimport { Observer } from \"../observer\";\r\n\r\n\r\n/**\r\n * Входные данные для стилей или иконок.\r\n */\r\ntype TLazyEntry<Entry> =\r\n  Entry |\r\n  Promise<Entry> |\r\n  ((instance?: Core) => Entry) |\r\n  ((instance?: Core) => Promise<Entry>);\r\n\r\n/**\r\n * Callback, вызываемый после запуска ядра и плагинов.\r\n */\r\nexport type TCoreOnInitCallback = (params: {\r\n  isDebug: boolean;\r\n  plugins: Map<string, unknown>;\r\n}) => void;\r\n\r\n\r\n/**\r\n * Параметры конструктора плагина `Core`.\r\n */\r\nexport type TCoreProps = Partial<{\r\n  utils: TCoreUtilities;\r\n  plugins: TPluginMap;\r\n  styles: TStylesEntry;\r\n  icons: TIconsEntry;\r\n  isDebug: boolean | null;\r\n  clearCache: string[];\r\n  clearCacheKeys: string[];\r\n  onWindowLoad: () => void;\r\n  onWindowResize: () => void;\r\n  onDOMReady: () => void;\r\n  onInit: TCoreOnInitCallback | null;\r\n  env: string;\r\n  appNameSpace: string;\r\n  DispatcherPlugin: TPluginDefinition;\r\n  ObserverPlugin: TPluginDefinition;\r\n  globalAttr: string;\r\n}>;\r\n\r\n\r\n/**\r\n * Статистика инициализации ядра.\r\n */\r\nexport type TCoreStats = {\r\n  plugins: number;\r\n  styles: number;\r\n  icons: number;\r\n};\r\n\r\n\r\n/**\r\n * Набор пользовательских утилит ядра.\r\n */\r\nexport type TCoreUtilities = Record<string, TCoreUtility>;\r\n\r\n\r\n/**\r\n * Тип утилиты ядра, выполняемой при инициализации.\r\n */\r\nexport type TCoreUtility = () => unknown;\r\n\r\n/**\r\n * Описание записи иконок для ленивой загрузки.\r\n */\r\nexport type TIconsEntry = TLazyEntry<ISvgIcon[]>;\r\n\r\n/**\r\n * Тип плагина в виде класса.\r\n */\r\nexport type TPluginClass = {\r\n  new (...args: never[]): unknown;\r\n  isApp?: boolean;\r\n};\r\n\r\n\r\n/**\r\n * Допустимый формат определения плагина.\r\n */\r\nexport type TPluginDefinition = TPluginClass | TPluginFn | null;\r\n\r\n\r\n/**\r\n * Тип плагина в виде функции.\r\n */\r\nexport type TPluginFn = {\r\n  (...args: never[]): unknown | Promise<unknown>;\r\n  isApp?: boolean;\r\n};\r\n\r\n\r\n/**\r\n * Карта подключаемых плагинов.\r\n */\r\nexport type TPluginMap = Record<string, TPluginDefinition>;\r\n\r\n\r\n/**\r\n * Описание записи стилей для ленивой загрузки.\r\n */\r\nexport type TStylesEntry = TLazyEntry<IStyle[]>;\r\n\r\n/**\r\n * Singleton. Главный плагин, отвечающий за выполнение JS-кода, подключение стилей (в режиме локальной разработки) и добавление иконок. Вызывается непосредственно во входной точке приложения. Плагин самостоятельно ждёт наступления события `DOMContentLoaded` и выполняет другие переданные ему плагины.\r\n *\r\n * В передаваемых плагинах (классах) могут присутствовать следующие статические поля:\r\n *\r\n * - Если `isApp` с булевым значением равен true, то плагин привязывается к глобальной зоне видимости и становится доступен через `window[appNameSpace]` — `window.App` по умолчанию.\r\n *\r\n * Ядро позволяет привязать плагины, утилиты и переменные к глобальному объекту window, создав в нем соответствующий ключ, указанный через appNameSpace. В качестве значения ключа выступает объект с глобальными параметрами, среди которых присутствуют:\r\n *\r\n * - `isDebug` — состояние режима отладки;\r\n * - `svgSpriteRevision` — временная метка актуальности изменения файла спрайта с SVG-иконками приложения, по умолчанию равная текущему времени.\r\n *\r\n * Чтобы добавить или перезаписать переменные, их следует добавить в формате JSON в атрибут тела страницы, указанный в ключе globalAttr.\r\n *\r\n * @module Core\r\n * @param utils{Object=} объект с выполняемыми утилитами\r\n * @param plugins{Object=} объект с выполняемыми плагинами\r\n * @param styles{TStylesEntry=} массив/промис/функция стилей, применяемых для страницы (только для dev-версии)\r\n * @param icons{TIconsEntry=} массив/промис/функция иконок, используемых на сайте\r\n * @param isDebug{Boolean=} включение debug-режима\r\n * @param clearCache{Array=} = очистка `localStorage` и `cookies` по указанным в массиве ключам, `*` очищает все значения\r\n * @param onWindowLoad{Function=} callback для загрузки окна\r\n * @param onWindowResize{Function=} callback для изменения размера окна\r\n * @param onDOMReady{Function=} callback для загрузки DOM\r\n * @param env{String=} значение переменной окружения (`development`, `production`, `test`)\r\n * @param appNameSpace{String=} название глобальной переменной, куда могут быть записаны плагины (по умолчанию `App`)\r\n * @param DispatcherPlugin{Function} собственный экземпляр Dispatcher\r\n * @param ObserverPlugin{Function} собственный экземпляр Observer\r\n * @param globalAttr{String=} глобальный атрибут приложения на теле документа\r\n * @param onInit{Function=} функция, вызываемая после запуска всех плагинов и инициализации фреймворка\r\n * @example\r\n * import { Core, IconSprite } from \"@delement/ui/plugins\"\r\n *\r\n * new Core({\r\n *   styles: async () => [], // массив стилей\r\n *   icons: async () => [], // массив иконок\r\n *   plugins: {\r\n *     IconSprite: () => new IconSprite(\"/frontend/build/\"), // пример вызова IconSprite с другими аргументами,\r\n *     Localisation: null // пример отключения стандартного плагина\r\n *   },\r\n *   onInit: ({ plugins }) => {\r\n *     // plugins - экземпляры вызовов всех плагинов\r\n *   }\r\n * })\r\n */\r\nexport class Core {\r\n\r\n  today!: number;\r\n\r\n  utils!: TCoreUtilities;\r\n\r\n  plugins!: TPluginMap;\r\n\r\n  styles!: IStyle[];\r\n\r\n  icons!: ISvgIcon[];\r\n\r\n  isDebug!: boolean;\r\n\r\n  onWindowLoad!: (() => void) | null;\r\n\r\n  onWindowResize!: (() => void) | null;\r\n\r\n  onDOMReady!: (() => void) | null;\r\n\r\n  appNameSpace!: string;\r\n\r\n  globalAttr!: string;\r\n\r\n  clearCacheKeys!: string[];\r\n\r\n  onInit!: TCoreOnInitCallback | null;\r\n\r\n  stats!: TCoreStats;\r\n\r\n  env!: string;\r\n\r\n  #runningPlugins = new Map<string, unknown>();\r\n\r\n  #crashedPlugins = new Set<string>();\r\n\r\n  #stylesEntry: TStylesEntry = [];\r\n\r\n  #iconsEntry: TIconsEntry = [];\r\n\r\n  /**\r\n   * Singleton-экземпляр ядра приложения.\r\n   * @type {Core|null}\r\n   */\r\n  static instance: Core | null = null;\r\n\r\n  constructor(props: TCoreProps = {}) {\r\n\r\n    if (Core.instance) {\r\n      return Core.instance;\r\n    }\r\n\r\n    const {\r\n      utils = {},\r\n      plugins = {},\r\n      styles = [],\r\n      icons = [],\r\n      isDebug = null,\r\n      clearCache = [],\r\n      clearCacheKeys = [],\r\n      onWindowLoad = null,\r\n      onWindowResize = null,\r\n      onDOMReady = null,\r\n      onInit = null,\r\n      env = process.env.NODE_ENV ?? \"development\",\r\n      appNameSpace = \"App\",\r\n      DispatcherPlugin = Dispatcher,\r\n      ObserverPlugin = Observer,\r\n      globalAttr = \"data-js-app\",\r\n    } = props;\r\n\r\n    this.today = new Date().getTime();\r\n\r\n    this.#stylesEntry = styles;\r\n    this.#iconsEntry = icons;\r\n\r\n    this.utils = {\r\n      setVhVar,\r\n      setScrollBarWidth,\r\n      checkMobile: () => getDocument().documentElement.classList.toggle(constants.stateClasses.mobileDevice, isMobileDevice()),\r\n      checkTouch: () => getDocument().documentElement.classList.toggle(constants.stateClasses.touchscreen, isTouchDevice()),\r\n      ...utils,\r\n    };\r\n    this.plugins = env === \"test\" ? {\r\n      ...plugins,\r\n      DispatcherPlugin,\r\n      ObserverPlugin,\r\n    } : {\r\n      Localisation: () => Localisation.create(),\r\n      Forms,\r\n      ...plugins,\r\n      DispatcherPlugin,\r\n      ObserverPlugin,\r\n    };\r\n    this.isDebug = this.#isDebugEnabled(isDebug);\r\n    this.onWindowLoad = onWindowLoad;\r\n    this.onWindowResize = onWindowResize;\r\n    this.onDOMReady = onDOMReady;\r\n    this.appNameSpace = appNameSpace;\r\n    this.globalAttr = globalAttr;\r\n    this.clearCacheKeys = clearCacheKeys.length ? clearCacheKeys : clearCache;\r\n    this.onInit = onInit;\r\n    this.stats = {\r\n      plugins: 0,\r\n      styles: 0,\r\n      icons: 0,\r\n    };\r\n    this.env = env;\r\n    this.clearCache();\r\n    this.#bindEvents();\r\n    Core.instance = this;\r\n  }\r\n\r\n\r\n  #isDebugEnabled(isDebug: TCoreProps[\"isDebug\"]) {\r\n    return typeof isDebug === \"boolean\" ? isDebug : (getWindow().location.port.length > 0 || getWindow().location.host === \"localhost\" || (getWindow().location.search.indexOf(\"debug\") > -1) || getWindow().location.pathname.indexOf(\"/build/\") > -1);\r\n  }\r\n\r\n  /**\r\n   * Получает переданный ресурс иконок или стилей\r\n   * @private\r\n   */\r\n  async #getLazyEntry<\r\n    Entry = TLazyEntry<IStyle[] | ISvgIcon[]>,\r\n    Result = IStyle[] | ISvgIcon[]\r\n  >(entry: Entry): Promise<Result> {\r\n    try {\r\n      let result: unknown;\r\n      switch (true) {\r\n        case Array.isArray(entry): // valid array\r\n          result = entry;\r\n          break;\r\n        case typeof entry === \"function\": { // fn\r\n          result = await entry(this);\r\n          break;\r\n        }\r\n        case isObjPromise(entry): { // promise\r\n          result = await entry;\r\n          break;\r\n        }\r\n        default: // unknown type\r\n          throw new Error(`unknown entry type`);\r\n      }\r\n      if (!Array.isArray(result)) {\r\n        throw new Error(`invalid entry result, must be an Array`);\r\n      }\r\n      return result as Result;\r\n    } catch (err: unknown) {\r\n      console.error(`[Core] Error while extract entry`, err);\r\n      return [] as Result;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Очищает кеш браузера (cookies и localStorage) по указанным ключам\r\n   * @param keys{String[]=} массив ключей для очистки, \"*\" очищает всё\r\n   */\r\n  clearCache(keys: string[] = this.clearCacheKeys) {\r\n    if (Array.isArray(keys)) {\r\n\r\n      const cookies = getDocument().cookie.split(\";\");\r\n\r\n      const getCookieName = (cookie: string) => {\r\n        const eqPos = cookie.indexOf(\"=\");\r\n        return eqPos > -1 ? cookie.substring(0, eqPos) : cookie;\r\n      };\r\n\r\n      if (keys.find((key) => key === \"*\")) {\r\n        // clear all cookies\r\n        cookies.forEach((cookie: string) => {\r\n          const name = getCookieName(cookie);\r\n          if (name) {\r\n            deleteCookie(name);\r\n          }\r\n        });\r\n        // clear localStorage\r\n        getWindow().localStorage.clear();\r\n      } else {\r\n        keys\r\n          .filter((key) => !!key)\r\n          .forEach((key) => {\r\n            // clear specific cookies\r\n            cookies.forEach((cookie: string) => {\r\n              const name = getCookieName(cookie);\r\n              if (!!name && name.startsWith(key)) {\r\n                deleteCookie(name);\r\n              }\r\n            });\r\n            // clear specific localStorage items\r\n            getWindow().localStorage.removeItem(key);\r\n          });\r\n      }\r\n      if (keys.length) {\r\n        console.debug(`[Core] Cache cleared`);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Запускает утилиты — функции, выполняемые перед загрузкой приложения.\r\n   * По умолчанию это `setVhVar`, `setScrollBarWidth`, `checkMobile`, `checkTouch`.\r\n   * Более подробную информацию по утилитам можно найти в документации по Common utils.\r\n   * @private\r\n   */\r\n  #runUtils() {\r\n    Object.values(this.utils)\r\n      .filter((fn): fn is TCoreUtility => typeof fn === \"function\")\r\n      .forEach((fn) => fn());\r\n  }\r\n\r\n  /**\r\n   * Применяет стили после формирования документа.\r\n   * Используется только в локальной разработке.\r\n   * @private\r\n   */\r\n  async #resolveStyles(entry: TStylesEntry) {\r\n    const styles = await this.#getLazyEntry<TStylesEntry, IStyle[]>(entry);\r\n    this.styles = styles;\r\n    this.stats.styles = styles.length;\r\n    this.#stylesEntry = [];\r\n  }\r\n\r\n\r\n  /**\r\n   * Применяет иконки после формирования документа.\r\n   * @private\r\n   */\r\n  async #resolveIcons(entry: TIconsEntry) {\r\n    const icons = await this.#getLazyEntry<TStylesEntry, ISvgIcon[]>(entry);\r\n    this.icons = icons;\r\n    this.stats.icons = icons.length;\r\n    this.#iconsEntry = [];\r\n  }\r\n\r\n  /**\r\n   * Добавляет плагин в глобальную область видимости\r\n   * @param name{String}\r\n   * @param instance{Object}\r\n   * @param isApp{Boolean=}\r\n   * @private\r\n   */\r\n  #appendPlugin(name: string, instance: unknown, isApp = false) {\r\n    if (instance) {\r\n      if (isApp) {\r\n        const win = getWindow() as Window & Record<string, unknown>;\r\n        const app = (win[this.appNameSpace] ?? {}) as Record<string, unknown>;\r\n        app[name] = instance;\r\n        win[this.appNameSpace] = app;\r\n      }\r\n      this.#runningPlugins.set(name, instance);\r\n    } else {\r\n      this.#crashedPlugins.add(name);\r\n    }\r\n  }\r\n\r\n  #onPluginError(name: string, err: unknown) {\r\n    console.error(`[Core] Plugin \"${name}\" was crashed with error:`, err);\r\n    this.#appendPlugin(name, null, false);\r\n  }\r\n\r\n  /**\r\n   * Получает экземпляр вызова запущенного плагина по его имени\r\n   * @param name{String} имя плагина\r\n   * @returns {Object|null} экземпляр плагина или null\r\n   */\r\n  getPluginInstance(name: string) {\r\n    return this.#runningPlugins.has(name) ? this.#runningPlugins.get(name) : null;\r\n  }\r\n\r\n  /**\r\n   * Получает результат вызова функции плагина\r\n   * @param fn{*}\r\n   * @returns {*}\r\n   * @private\r\n   */\r\n  #runPlugin(fn: Exclude<TPluginDefinition, null>) {\r\n    switch (true) {\r\n      case isFnClass(fn): {\r\n        return new (fn as TPluginClass)();\r\n      }\r\n      case isFnAsync(fn): {\r\n        return (fn as TPluginFn)() as Promise<unknown>;\r\n      }\r\n      default: {\r\n        return (fn as TPluginFn)();\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Получает список корректно включенных плагинов\r\n   * @returns {Array}\r\n   */\r\n  #getFilteredPlugins() {\r\n    return (Object.entries(this.plugins) as Array<[string, TPluginDefinition]>)\r\n      .filter((entry): entry is [string, Exclude<TPluginDefinition, null>] => {\r\n        const [ name, fn ] = entry;\r\n        const isCorrect = typeof fn === \"function\" || isFnClass(fn);\r\n        if (fn === null) {\r\n          // console.debug(`[Core] \"${name}\" passed to plugins is disabled`);\r\n        } else if (!isCorrect) {\r\n          console.error(`[Core] \"${name}\" passed to plugins is not a function, async function or instance of ES6 class`);\r\n        }\r\n        return !!fn && isCorrect;\r\n      });\r\n  }\r\n\r\n  /**\r\n   * Подключает плагины синхронно\r\n   * @private\r\n   */\r\n  async #appendPlugins() {\r\n    this.stats.plugins = Object.entries(this.plugins).length;\r\n    const correctPlugins = this.#getFilteredPlugins();\r\n    const tasks = correctPlugins.map(async ([ name, fn ]) => {\r\n      const isAppFromFn = (fn as { isApp?: boolean; })?.isApp ?? false;\r\n      try {\r\n        const plugin = await Promise.resolve(this.#runPlugin(fn));\r\n        const isApp = isAppFromFn || (plugin as { constructor?: { isApp?: boolean; }; })?.constructor?.isApp || false;\r\n        this.#appendPlugin(name, plugin, isApp);\r\n      } catch (err: unknown) {\r\n        this.#onPluginError(name, err);\r\n      }\r\n    });\r\n\r\n    await Promise.all(tasks);\r\n  }\r\n\r\n  /**\r\n   * Создаёт глобальный объект\r\n   */\r\n  #setGlobalObject() {\r\n    const globalParamsRaw = getDocument().body.hasAttribute(this.globalAttr) ? getJSONFromStr(getDocument().body.getAttribute(this.globalAttr) || \"\") : {};\r\n    const globalParams = (typeof globalParamsRaw === \"object\" && globalParamsRaw !== null ? globalParamsRaw : {}) as Record<string, unknown>;\r\n    const win = getWindow() as Window & Record<string, unknown>;\r\n    win._APP_NAMESPACE = this.appNameSpace;\r\n    win[this.appNameSpace] = {\r\n      isDebug: this.isDebug,\r\n      svgSpriteRevision: this.today,\r\n      ...globalParams,\r\n    };\r\n  }\r\n\r\n\r\n  async #appendResources() {\r\n    // prepare styles\r\n    if (this.env === \"development\") {\r\n      await this.#resolveStyles(this.#stylesEntry);\r\n      this.styles.forEach((style) => {\r\n        useLazyStyles(style);\r\n      });\r\n    }\r\n    // prepare icons\r\n    await this.#resolveIcons(this.#iconsEntry);\r\n  }\r\n\r\n  /**\r\n   * Фасад. Запускает фреймворк\r\n   * @private\r\n   */\r\n  async #init() {\r\n    await this.#appendResources();\r\n    this.#runUtils();\r\n    this.#setGlobalObject();\r\n    await this.#appendPlugins();\r\n  }\r\n\r\n  /**\r\n   * Callback для загрузки DOM-дерева\r\n   * @private\r\n   */\r\n  async #handleDOMReady() {\r\n\r\n    // adds UI main class\r\n    document.documentElement.classList.add(constants.dsMainClass);\r\n\r\n    // adds dom ready class\r\n    requestAnimationFrame(() => {\r\n      requestAnimationFrame(() => {\r\n        getDocument().documentElement.classList.add(\r\n          constants.stateClasses.domReady\r\n        );\r\n      });\r\n    });\r\n\r\n    // user callback\r\n    if (typeof this.onDOMReady === \"function\") {\r\n      this.onDOMReady();\r\n    }\r\n\r\n    // run frameworkП\r\n    this.#init()\r\n      .then(() => {\r\n\r\n        // user callback\r\n        if (typeof this.onInit === \"function\") {\r\n          this.onInit({\r\n            isDebug: this.isDebug,\r\n            plugins: this.#runningPlugins,\r\n          });\r\n        }\r\n\r\n        const getPluginNames = (from: Map<string, unknown> | Set<string>) => Array.from(from.keys()).join(\", \");\r\n\r\n        console.debug(`[Core] Ready in \"${this.env}\" env with ${this.#runningPlugins.size}/${this.stats.plugins} plugins (${getPluginNames(this.#runningPlugins)}), ${this.stats.styles} lazy styles & ${this.stats.icons} icons.`);\r\n\r\n        if (this.#crashedPlugins.size) {\r\n          console.debug(`[Core] Crashed plugins:`, getPluginNames(this.#crashedPlugins));\r\n        }\r\n\r\n        return Promise.resolve();\r\n      })\r\n      .catch((err: unknown) => {\r\n        console.error(`[Core] Init failed with error:`, err);\r\n      });\r\n  }\r\n\r\n  /**\r\n   * Callback для загрузки всего документа\r\n   * @private\r\n   */\r\n  #handleWindowLoad() {\r\n    getDocument().documentElement.classList.add(constants.stateClasses.pageLoaded);\r\n    if (typeof this.onWindowLoad === \"function\") {\r\n      this.onWindowLoad();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Callback для изменения размера окна\r\n   * @private\r\n   */\r\n  #handleWindowResize() {\r\n    this.#runUtils();\r\n    if (typeof this.onWindowResize === \"function\") {\r\n      this.onWindowResize();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Установка событий на документ\r\n   * @private\r\n   */\r\n  #bindEvents() {\r\n    onDOMReady(() => this.#handleDOMReady());\r\n    onWindowLoad(() => this.#handleWindowLoad());\r\n    onWindowResize(() => this.#handleWindowResize());\r\n  }\r\n\r\n}\r\n"],"names":["Core","today","utils","plugins","styles","icons","isDebug","onWindowLoad","onWindowResize","onDOMReady","appNameSpace","globalAttr","clearCacheKeys","onInit","stats","env","runningPlugins","Map","crashedPlugins","Set","stylesEntry","iconsEntry","static","constructor","props","instance","clearCache","process","NODE_ENV","DispatcherPlugin","Dispatcher","ObserverPlugin","Observer","this","Date","getTime","setVhVar","setScrollBarWidth","checkMobile","getDocument","documentElement","classList","toggle","constants","stateClasses","mobileDevice","isMobileDevice","checkTouch","touchscreen","isTouchDevice","Localisation","create","Forms","isDebugEnabled","length","bindEvents","getWindow","location","port","host","search","indexOf","pathname","getLazyEntry","entry","result","Array","isArray","isObjPromise","Error","err","console","error","keys","cookies","cookie","split","getCookieName","eqPos","substring","find","key","forEach","name","deleteCookie","localStorage","clear","filter","startsWith","removeItem","debug","runUtils","Object","values","fn","resolveStyles","resolveIcons","appendPlugin","isApp","win","app","set","add","onPluginError","getPluginInstance","has","get","runPlugin","isFnClass","isFnAsync","getFilteredPlugins","entries","isCorrect","appendPlugins","correctPlugins","tasks","map","async","isAppFromFn","plugin","Promise","resolve","all","setGlobalObject","globalParamsRaw","body","hasAttribute","getJSONFromStr","getAttribute","globalParams","_APP_NAMESPACE","svgSpriteRevision","appendResources","style","useLazyStyles","init","handleDOMReady","document","dsMainClass","requestAnimationFrame","domReady","then","getPluginNames","from","join","size","catch","handleWindowLoad","pageLoaded","handleWindowResize"],"mappings":"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"}