ckeditor5 1.37.6 → 1.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +2 -15
- data/lib/ckeditor5/rails/editor/helpers/editor_helpers.rb +7 -5
- data/lib/ckeditor5/rails/editor/props.rb +1 -4
- data/lib/ckeditor5/rails/version.rb +1 -1
- data/npm_package/dist/index.cjs +1 -1
- data/npm_package/dist/index.cjs.map +1 -1
- data/npm_package/dist/index.mjs +329 -264
- data/npm_package/dist/index.mjs.map +1 -1
- data/npm_package/dist/src/components/context.d.ts +4 -4
- data/npm_package/dist/src/components/context.d.ts.map +1 -1
- data/npm_package/dist/src/components/editor/editor.d.ts +1 -6
- data/npm_package/dist/src/components/editor/editor.d.ts.map +1 -1
- data/npm_package/dist/src/helpers/create-instance-promise.d.ts +6 -0
- data/npm_package/dist/src/helpers/create-instance-promise.d.ts.map +1 -0
- data/npm_package/dist/src/helpers/index.d.ts +1 -0
- data/npm_package/dist/src/helpers/index.d.ts.map +1 -1
- data/npm_package/package.json +3 -3
- data/spec/lib/ckeditor5/rails/editor/props_spec.rb +1 -10
- data/spec/lib/ckeditor5/rails/hooks/form_spec.rb +1 -2
- metadata +4 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/helpers/exec-if-dom-ready.ts","../src/helpers/inject-script.ts","../src/helpers/is-safe-key.ts","../src/helpers/load-async-css.ts","../src/helpers/load-async-imports.ts","../src/helpers/resolve-config-element-references.ts","../src/helpers/uid.ts","../src/components/context.ts","../src/components/editable.ts","../src/components/editor/multiroot-editables-tracker.ts","../src/components/editor/editor.ts","../src/components/ui-part.ts"],"sourcesContent":["/**\n * Executes callback when DOM is ready.\n *\n * @param callback - Function to execute when DOM is ready.\n */\nexport function execIfDOMReady(callback: VoidFunction) {\n switch (document.readyState) {\n case 'loading':\n document.addEventListener('DOMContentLoaded', callback, { once: true });\n break;\n\n case 'interactive':\n case 'complete':\n setTimeout(callback, 0);\n break;\n\n default:\n console.warn('Unexpected document.readyState:', document.readyState);\n setTimeout(callback, 0);\n }\n}\n","const SCRIPT_LOAD_PROMISES = new Map();\n\n/**\n * Dynamically loads script files based on configuration.\n * Uses caching to avoid loading the same script multiple times.\n *\n * @param url - URL of the script to load\n */\nexport function injectScript(url: string) {\n if (SCRIPT_LOAD_PROMISES.has(url)) {\n return SCRIPT_LOAD_PROMISES.get(url);\n }\n\n const promise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = url;\n script.onload = resolve;\n script.onerror = reject;\n\n document.head.appendChild(script);\n });\n\n SCRIPT_LOAD_PROMISES.set(url, promise);\n return promise;\n}\n","/**\n * Checks if a key is safe to use in configuration objects to prevent prototype pollution\n *\n * @param key - Key name to check\n * @returns True if key is safe to use\n */\nexport function isSafeKey(key: string) {\n return (\n typeof key === 'string'\n && key !== '__proto__'\n && key !== 'constructor'\n && key !== 'prototype'\n );\n}\n","/**\n * Checks if stylesheet with given href already exists in document\n *\n * @param href - Stylesheet URL to check\n * @returns True if stylesheet already exists\n */\nfunction stylesheetExists(href: string) {\n return Array\n .from(document.styleSheets)\n .some(sheet =>\n sheet.href === href || sheet.href === new URL(href, window.location.href).href,\n );\n}\n\n/**\n * Dynamically loads CSS files based on configuration\n *\n * @param stylesheets - Array of CSS file URLs to load\n * @returns Array of promises for each CSS file load\n * @throws When CSS file loading fails\n */\nexport function loadAsyncCSS(stylesheets: string[] = []) {\n const promises = stylesheets.map(href =>\n new Promise<void>((resolve, reject) => {\n if (stylesheetExists(href)) {\n resolve();\n return;\n }\n\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = href;\n\n link.onerror = reject;\n link.onload = () => resolve();\n\n document.head.appendChild(link);\n }),\n );\n\n return Promise.all(promises);\n}\n","import { injectScript } from './inject-script';\nimport { loadAsyncCSS } from './load-async-css';\n\n/**\n * Dynamically imports modules based on configuration\n *\n * @param imports - Array of import configurations\n * @param imports[].name - Name of inline plugin (for inline type)\n * @param imports[].code - Source code of inline plugin (for inline type)\n * @param imports[].import_name - Module path to import (for external type)\n * @param imports[].import_as - Name to import as (for external type)\n * @param imports[].window_name - Global window object name (for external type)\n * @param imports[].type - Type of import\n * @returns Array of loaded modules\n * @throws When plugin loading fails\n */\nexport function loadAsyncImports(imports: Array<AsyncImportRawDescription | string> = []) {\n const loadExternalPlugin = async ({ url, import_name, import_as, window_name, stylesheets }: AsyncImportRawDescription) => {\n if (stylesheets?.length) {\n await loadAsyncCSS(stylesheets);\n }\n\n if (window_name) {\n function isScriptPresent() {\n return Object.prototype.hasOwnProperty.call(window, window_name!);\n }\n\n if (url && !isScriptPresent()) {\n await injectScript(url);\n }\n\n if (!isScriptPresent()) {\n window.dispatchEvent(\n new CustomEvent(`ckeditor:request-cjs-plugin:${window_name}`),\n );\n }\n\n if (!isScriptPresent()) {\n throw new Error(\n `Plugin window['${window_name}'] not found in global scope. `\n + 'Please ensure the plugin is loaded before CKEditor initialization.',\n );\n }\n\n return (window as any)[window_name!];\n }\n\n const module = await import(import_name!);\n const imported = module[import_as || 'default'];\n\n if (!imported) {\n throw new Error(\n `Plugin \"${import_as || 'default'}\" not found in the ESM module `\n + `\"${import_name}\"! Available imports: ${Object.keys(module).join(', ')}! `\n + 'Consider changing \"import_as\" value.',\n );\n }\n\n return imported;\n };\n\n function uncompressImport(pkg: any) {\n if (typeof pkg === 'string') {\n return loadExternalPlugin({ import_name: 'ckeditor5', import_as: pkg });\n }\n\n return loadExternalPlugin(pkg);\n }\n\n return Promise.all(imports.map(uncompressImport));\n}\n\n/**\n * Type definition for plugin raw descriptor\n */\nexport type AsyncImportRawDescription = {\n url?: string;\n import_name?: string;\n import_as?: string;\n window_name?: string;\n stylesheets?: string[];\n};\n","/**\n * Resolves element references in configuration object.\n * Looks for objects with { $element: \"selector\" } format and replaces them with actual DOM elements.\n *\n * @param obj - Configuration object to process\n * @returns Processed configuration object with resolved element references\n */\nexport function resolveConfigElementReferences<T>(obj: T): T {\n if (!obj || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => resolveConfigElementReferences(item)) as T;\n }\n\n const anyObj = obj as any;\n\n if (anyObj.$element && typeof anyObj.$element === 'string') {\n const element = document.querySelector(anyObj.$element);\n\n if (!element) {\n console.warn(`Element not found for selector: ${anyObj.$element}`);\n }\n\n return (element || null) as T;\n }\n\n const result = Object.create(null);\n\n for (const [key, value] of Object.entries(obj)) {\n result[key] = resolveConfigElementReferences(value);\n }\n\n return result as T;\n}\n","/**\n * Generates a unique identifier string\n *\n * @returns Random string that can be used as unique identifier\n */\nexport function uid() {\n return Math.random().toString(36).substring(2);\n}\n","import type { ContextWatchdog } from 'ckeditor5';\n\nimport type { CKEditorComponent } from './editor';\n\nimport { execIfDOMReady, loadAsyncImports, resolveConfigElementReferences } from '../helpers';\n\nexport class CKEditorContextComponent extends HTMLElement {\n instance: ContextWatchdog | null = null;\n\n instancePromise = Promise.withResolvers<ContextWatchdog>();\n\n #connectedEditors = new Set<CKEditorComponent>();\n\n static get observedAttributes() {\n return ['plugins', 'config'];\n }\n\n async connectedCallback() {\n try {\n execIfDOMReady(() => this.#initializeContext());\n }\n catch (error) {\n console.error('Failed to initialize context:', error);\n this.dispatchEvent(new CustomEvent('context-error', { detail: error }));\n }\n }\n\n async attributeChangedCallback(_: unknown, oldValue: string | null, newValue: string | null) {\n if (oldValue !== null && oldValue !== newValue) {\n await this.#initializeContext();\n }\n }\n\n async disconnectedCallback() {\n if (this.instance) {\n await this.instance.destroy();\n this.instance = null;\n }\n }\n\n /**\n * Register editor component with this context\n *\n * @param editor - Editor component to register.\n */\n registerEditor(editor: CKEditorComponent) {\n this.#connectedEditors.add(editor);\n }\n\n /**\n * Unregister editor component from this context\n *\n * @param editor - Editor component to unregister\n */\n unregisterEditor(editor: CKEditorComponent) {\n this.#connectedEditors.delete(editor);\n }\n\n /**\n * Initialize CKEditor context with shared configuration\n *\n * @private\n */\n async #initializeContext() {\n if (this.instance) {\n this.instancePromise = Promise.withResolvers<ContextWatchdog>();\n\n await this.instance.destroy();\n\n this.instance = null;\n }\n\n // Broadcast context initialization event\n window.dispatchEvent(\n new CustomEvent('ckeditor:context:attach:before', { detail: { element: this } }),\n );\n\n const { Context, ContextWatchdog } = await import('ckeditor5');\n const plugins = await this.#getPlugins();\n const config = this.#getConfig();\n\n // Broadcast context mounting event with configuration\n window.dispatchEvent(\n new CustomEvent('ckeditor:context:attach', { detail: { config, element: this } }),\n );\n\n this.instance = new ContextWatchdog(Context, {\n crashNumberLimit: 10,\n });\n\n await this.instance.create({\n ...config,\n plugins,\n });\n\n this.instance.on('itemError', (...args) => {\n console.error('Context item error:', ...args);\n });\n\n this.instancePromise.resolve(this.instance);\n this.dispatchEvent(new CustomEvent('context-ready', { detail: this.instance }));\n\n // Reinitialize connected editors.\n await Promise.all(\n [...this.#connectedEditors].map(editor => editor.reinitializeEditor()),\n );\n }\n\n async #getPlugins() {\n const raw = this.getAttribute('plugins');\n\n return loadAsyncImports(raw ? JSON.parse(raw) : []);\n }\n\n /**\n * Gets context configuration with resolved element references.\n *\n * @private\n */\n #getConfig() {\n const config = JSON.parse(this.getAttribute('config') || '{}');\n\n return resolveConfigElementReferences(config);\n }\n}\n\ncustomElements.define('ckeditor-context-component', CKEditorContextComponent);\n","import type { CKEditorComponent } from './editor';\n\nimport { execIfDOMReady } from '../helpers/exec-if-dom-ready';\n\nexport class CKEditorEditableComponent extends HTMLElement {\n /**\n * Gets the name of this editable region\n */\n get name() {\n return this.getAttribute('name') || 'editable';\n }\n\n /**\n * Gets the actual editable DOM element.\n */\n get editableElement() {\n return this.querySelector('div')!;\n }\n\n /**\n * Root model element.\n */\n get modelElement() {\n return this.getAttribute('inline') === 'true' ? '$inlineRoot' : undefined;\n }\n\n /**\n * Initial editable data.\n */\n get initialData() {\n return this.hasAttribute('initial-data') ? this.getAttribute('initial-data')! : undefined;\n }\n\n /**\n * Lifecycle callback when element is added to DOM\n * Sets up the editable element and registers it with the parent editor\n */\n connectedCallback() {\n execIfDOMReady(() => {\n const editorComponent = this.#queryEditorElement();\n\n if (!editorComponent) {\n throw new Error('ckeditor-editable-component must be a child of ckeditor-component');\n }\n\n this.innerHTML = `<div>${this.innerHTML}</div>`;\n this.style.display = 'block';\n\n if (editorComponent.isDecoupled()) {\n editorComponent.runAfterEditorReady((editor) => {\n this.appendChild((editor.ui.view as any)[this.name].element);\n });\n }\n else if (editorComponent.editables) {\n if (!this.name) {\n throw new Error('Editable component missing required \"name\" attribute');\n }\n\n editorComponent.editables[this.name] = this;\n }\n });\n }\n\n /**\n * Lifecycle callback when element is removed\n * Un-registers this editable from the parent editor\n */\n disconnectedCallback() {\n const editorComponent = this.#queryEditorElement();\n\n if (editorComponent?.editables) {\n delete editorComponent.editables[this.name];\n }\n }\n\n /**\n * Finds the parent editor component\n */\n #queryEditorElement(): CKEditorComponent | null {\n return this.closest('ckeditor-component') || document.body.querySelector('ckeditor-component');\n }\n}\n\ncustomElements.define('ckeditor-editable-component', CKEditorEditableComponent);\n","import type { MultiRootEditor } from 'ckeditor5';\n\nimport type { CKEditorComponent } from './editor';\n\nexport class CKEditorMultiRootEditablesTracker {\n #editorElement: CKEditorComponent;\n #editables: Record<string, HTMLElement>;\n\n /**\n * Creates new tracker instance wrapped in a Proxy for dynamic property access\n *\n * @param editorElement - Parent editor component reference\n * @param initialEditables - Initial editable elements\n * @returns Proxy wrapping the tracker\n */\n constructor(\n editorElement: CKEditorComponent,\n initialEditables: Record<string, HTMLElement> = {},\n ) {\n this.#editorElement = editorElement;\n this.#editables = initialEditables;\n\n return new Proxy(this, {\n /**\n * Handles property access, returns class methods or editable elements\n *\n * @param target - The tracker instance\n * @param name - Property name being accessed\n */\n get(target: CKEditorMultiRootEditablesTracker, name: string) {\n if (typeof (target as any)[name] === 'function') {\n return (target as any)[name].bind(target);\n }\n\n return target.#editables[name];\n },\n\n /**\n * Handles setting new editable elements, triggers root attachment\n *\n * @param target - The tracker instance\n * @param name - Name of the editable root\n * @param element - Element to attach as editable\n */\n set(target: CKEditorMultiRootEditablesTracker, name: string, element: HTMLElement) {\n if (target.#editables[name] !== element) {\n void target.attachRoot(name, element);\n target.#editables[name] = element;\n }\n return true;\n },\n\n /**\n * Handles removing editable elements, triggers root detachment\n *\n * @param target - The tracker instance\n * @param name - Name of the root to remove\n */\n deleteProperty(target: CKEditorMultiRootEditablesTracker, name: string) {\n void target.detachRoot(name);\n delete target.#editables[name];\n\n return true;\n },\n });\n }\n\n /**\n * Attaches a new editable root to the editor.\n * Creates new editor root and binds UI elements.\n *\n * @param name - Name of the editable root\n * @param element - DOM element to use as editable\n * @returns Resolves when root is attached\n */\n async attachRoot(name: string, element: HTMLElement) {\n await this.detachRoot(name);\n\n return this.#editorElement.runAfterEditorReady<MultiRootEditor>((editor) => {\n const { ui, editing, model } = editor;\n const modelElement = (element as any).modelElement as string | undefined;\n const initialData = (element as any).initialData as string | undefined;\n\n editor.addRoot(name, {\n isUndoable: false,\n initialData: initialData ?? element.innerHTML,\n ...modelElement && { modelElement },\n });\n\n const root = model.document.getRoot(name);\n\n if (ui.getEditableElement(name)) {\n editor.detachEditable(root!);\n }\n\n const editable = ui.view.createEditable(name, element);\n ui.addEditable(editable);\n editing.view.forceRender();\n });\n }\n\n /**\n * Detaches an editable root from the editor.\n * Removes editor root and cleans up UI bindings.\n *\n * @param name - Name of root to detach\n * @returns Resolves when root is detached\n */\n async detachRoot(name: string) {\n return this.#editorElement.runAfterEditorReady<MultiRootEditor>((editor) => {\n const root = editor.model.document.getRoot(name);\n\n if (root) {\n editor.detachEditable(root);\n editor.detachRoot(name, true);\n }\n });\n }\n\n /**\n * Gets all currently tracked editable elements\n *\n * @returns Map of all editable elements\n */\n getAll() {\n return this.#editables;\n }\n}\n","import type { Editor, EditorWatchdog, Watchdog } from 'ckeditor5';\n\nimport type { AsyncImportRawDescription } from '../../helpers';\nimport type { CKEditorContextComponent } from '../context';\nimport type { CKEditorEditableComponent } from '../editable';\n\nimport {\n execIfDOMReady,\n isSafeKey,\n loadAsyncCSS,\n loadAsyncImports,\n resolveConfigElementReferences,\n uid,\n} from '../../helpers';\nimport { CKEditorMultiRootEditablesTracker } from './multiroot-editables-tracker';\n\nexport class CKEditorComponent extends HTMLElement {\n instancePromise = Promise.withResolvers<Editor>();\n\n watchdog: Watchdog | null = null;\n\n instance: Editor | null = null;\n\n editables: Record<string, HTMLElement> | null = Object.create(null);\n\n #initialHTML: string = '';\n\n #context: CKEditorContextComponent | null = null;\n\n #contextEditorId: string | null = null;\n\n #bundle: object | null = null;\n\n /**\n * List of attributes that trigger updates when changed.\n */\n static get observedAttributes() {\n return ['config', 'plugins', 'translations', 'type'];\n }\n\n /**\n * List of input attributes that trigger updates when changed.\n */\n static get inputAttributes() {\n return ['name', 'required', 'value'];\n }\n\n get oneditorchange() {\n return this.#getEventHandler('editorchange');\n }\n\n set oneditorchange(handler) {\n this.#setEventHandler('editorchange', handler);\n }\n\n get oneditorready() {\n return this.#getEventHandler('editorready');\n }\n\n set oneditorready(handler) {\n this.#setEventHandler('editorready', handler);\n }\n\n get oneditorerror() {\n return this.#getEventHandler('editorerror');\n }\n\n set oneditorerror(handler) {\n this.#setEventHandler('editorerror', handler);\n }\n\n /**\n * Gets event handler function from attribute or property\n *\n * @private\n * @param name - Event name without 'on' prefix\n * @returns Event handler or null\n */\n #getEventHandler(name: string): Function | null {\n if (this.hasAttribute(`on${name}`)) {\n return resolveInlineEventHandler(this.getAttribute(`on${name}`)!);\n }\n\n return (this as any)[`#${name}Handler`];\n }\n\n /**\n * Sets event handler function\n *\n * @private\n * @param name - Event name without 'on' prefix\n * @param handler - Event handler\n */\n #setEventHandler(name: string, handler: Function | null) {\n if (typeof handler === 'string') {\n this.setAttribute(`on${name}`, handler);\n }\n else {\n this.removeAttribute(`on${name}`);\n (this as any)[`#${name}Handler`] = handler;\n }\n }\n\n /**\n * Lifecycle callback when element is connected to DOM\n * Initializes the editor when DOM is ready\n *\n * @protected\n */\n connectedCallback() {\n this.#context = this.closest('ckeditor-context-component');\n this.#initialHTML = this.innerHTML;\n\n try {\n execIfDOMReady(async () => {\n if (this.#context) {\n await this.#context.instancePromise.promise;\n this.#context.registerEditor(this);\n }\n\n await this.reinitializeEditor();\n });\n }\n catch (error) {\n console.error('Failed to initialize editor:', error);\n\n const event = new CustomEvent('editor-error', { detail: error });\n\n this.dispatchEvent(event);\n this.oneditorerror?.(event);\n }\n }\n\n /**\n * Handles attribute changes and reinitializes editor if needed\n *\n * @protected\n * @param name - Name of changed attribute\n * @param oldValue - Previous attribute value\n * @param newValue - New attribute value\n */\n async attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {\n if (oldValue !== null\n && oldValue !== newValue\n && CKEditorComponent.observedAttributes.includes(name) && this.isConnected) {\n await this.reinitializeEditor();\n }\n }\n\n /**\n * Lifecycle callback when element is removed from DOM\n * Destroys the editor instance\n * @protected\n */\n async disconnectedCallback() {\n if (this.#context) {\n this.#context.unregisterEditor(this);\n }\n\n try {\n await this.#destroy();\n }\n catch (error) {\n console.error('Failed to destroy editor:', error);\n }\n }\n\n /**\n * Runs a callback after the editor is ready. It waits for editor\n * initialization if needed.\n *\n * @param callback - Callback to run\n */\n runAfterEditorReady<E extends Editor>(callback: (editor: E) => void): Promise<void> {\n if (this.instance) {\n return Promise.resolve(callback(this.instance as unknown as E));\n }\n\n return this.instancePromise.promise.then(callback as unknown as any);\n }\n\n /**\n * Determines appropriate editor element tag based on editor type\n */\n get #editorElementTag() {\n return getEditorElementTag(this.getAttribute('type'));\n }\n\n /**\n * Gets the CKEditor context instance if available.\n */\n get #contextWatchdog() {\n return this.#context?.instance;\n }\n\n /**\n * Destroys the editor instance and watchdog if available\n */\n async #destroy() {\n if (this.#contextEditorId) {\n await this.#contextWatchdog!.remove(this.#contextEditorId);\n }\n\n await this.instance?.destroy();\n this.watchdog?.destroy();\n }\n\n /**\n * Gets editor configuration with resolved element references\n */\n #getConfig() {\n return parseEditorConfig(this.getAttribute('config'));\n }\n\n /**\n * Creates a new CKEditor instance\n */\n async #initializeEditor(editablesOrContent: Record<string, HTMLElement | string> | CKEditorMultiRootEditablesTracker | string | HTMLElement) {\n await Promise.all([\n this.#ensureStylesheetsInjected(),\n this.#ensureWindowScriptsInjected(),\n ]);\n\n const { isMultiroot, content } = resolveEditorContent(editablesOrContent);\n const beforeInitEventDetails = buildBeforeInitEventDetails(content, isMultiroot);\n\n window.dispatchEvent(\n new CustomEvent('ckeditor:attach:before', { detail: beforeInitEventDetails }),\n );\n\n const Editor = await this.#getEditorConstructor();\n const [plugins, translations] = await Promise.all([\n this.#getPlugins(),\n this.#getTranslations(),\n ]);\n\n const config: Record<string, any> = {\n ...this.#getConfig(),\n ...translations.length && {\n translations,\n },\n plugins,\n };\n\n applyContentToConfig(config, content, isMultiroot, this.isClassic());\n\n window.dispatchEvent(\n new CustomEvent('ckeditor:attach', { detail: { config, ...beforeInitEventDetails } }),\n );\n\n let watchdog: EditorWatchdog | null = null;\n let instance: Editor | null = null;\n let contextId: string | null = null;\n\n if (this.#context) {\n contextId = uid();\n\n await this.#contextWatchdog!.add({\n creator: (_config: any) => Editor.create(_config),\n id: contextId,\n type: 'editor',\n config,\n });\n\n instance = this.#contextWatchdog!.getItem(contextId) as Editor;\n }\n else if (this.hasWatchdog()) {\n const { EditorWatchdog } = await import('ckeditor5');\n watchdog = new EditorWatchdog(Editor);\n\n await watchdog.create(config);\n\n instance = watchdog.editor;\n }\n else {\n instance = await Editor.create(config);\n }\n\n return {\n contextId,\n instance,\n watchdog,\n };\n }\n\n /**\n * Re-initializes the editor by destroying existing instance and creating new one\n *\n * @private\n * @returns {Promise<void>}\n */\n async reinitializeEditor() {\n if (this.instance) {\n this.instancePromise = Promise.withResolvers();\n\n await this.#destroy();\n\n this.instance = null;\n }\n\n this.style.display = 'block';\n\n if (!this.isMultiroot() && !this.isDecoupled()) {\n this.innerHTML = `<${this.#editorElementTag}>${this.#initialHTML}</${this.#editorElementTag}>`;\n this.#assignInputAttributes();\n }\n\n // Let's track changes in editables if it's a multiroot editor.\n if (this.isMultiroot()) {\n this.editables = new CKEditorMultiRootEditablesTracker(this, this.#queryEditables()) as unknown as Record<string, HTMLElement>;\n }\n else if (this.isDecoupled()) {\n this.editables = null;\n }\n else {\n this.editables = this.#queryEditables();\n }\n\n try {\n const { watchdog, instance, contextId } = await this.#initializeEditor(this.editables || this.#getConfig().root?.initialData || '');\n\n this.watchdog = watchdog;\n this.instance = instance!;\n this.#contextEditorId = contextId;\n\n this.#setupContentSync();\n this.#setupEditableHeight();\n this.#setupDataChangeListener();\n\n this.instancePromise.resolve(this.instance!);\n\n // Broadcast editor ready event\n const event = new CustomEvent('editor-ready', { detail: this.instance });\n\n this.dispatchEvent(event);\n this.oneditorready?.(event);\n }\n catch (err) {\n this.instancePromise.reject(err);\n throw err;\n }\n }\n\n /**\n * Sets up data change listener that broadcasts content changes\n */\n #setupDataChangeListener() {\n const getRootContent = (rootName: string) => this.instance!.getData({ rootName });\n const getAllRoots = () =>\n this.instance?.model.document\n .getRootNames()\n .reduce((acc, rootName) => ({\n ...acc,\n [rootName]: getRootContent(rootName),\n }), {});\n\n this.instance?.model.document.on('change:data', () => {\n const event = new CustomEvent('editor-change', {\n detail: {\n editor: this.instance,\n data: getAllRoots(),\n },\n bubbles: true,\n });\n\n this.dispatchEvent(event);\n this.oneditorchange?.(event);\n });\n }\n\n /**\n * Checks if current editor is classic type\n */\n isClassic() {\n return this.getAttribute('type') === 'ClassicEditor';\n }\n\n /**\n * Checks if current editor is balloon type\n */\n isBallon() {\n return this.getAttribute('type') === 'BalloonEditor';\n }\n\n /**\n * Checks if current editor is multiroot type\n */\n isMultiroot() {\n return this.getAttribute('type') === 'MultiRootEditor';\n }\n\n /**\n * Checks if current editor is decoupled type\n */\n isDecoupled() {\n return this.getAttribute('type') === 'DecoupledEditor';\n }\n\n /**\n * Checks if current editor has watchdog enabled\n */\n hasWatchdog() {\n return this.getAttribute('watchdog') === 'true';\n }\n\n /**\n * Queries and validates editable elements\n */\n #queryEditables() {\n if (this.isDecoupled()) {\n return {};\n }\n\n if (this.isMultiroot()) {\n const editables = [...this.querySelectorAll('ckeditor-editable-component')] as CKEditorEditableComponent[];\n\n return buildEditablesMap(editables);\n }\n\n const mainEditable = this.querySelector(this.#editorElementTag);\n\n if (!mainEditable) {\n throw new Error(`No ${this.#editorElementTag} element found`);\n }\n\n return { main: mainEditable };\n }\n\n /**\n * Copies input-related attributes from component to the main editable element\n *\n * @private\n */\n #assignInputAttributes() {\n const textarea = this.querySelector('textarea');\n\n if (!textarea) {\n return;\n }\n\n copyAttributes(this, textarea, CKEditorComponent.inputAttributes);\n }\n\n /**\n * Sets up content sync between editor and textarea element.\n *\n * @private\n */\n #setupContentSync() {\n if (!this.instance) {\n return;\n }\n\n const textarea = this.querySelector('textarea');\n\n if (!textarea) {\n return;\n }\n\n // Initial sync\n const syncInput = () => {\n this.style.position = 'relative';\n\n textarea.innerHTML = '';\n textarea.value = this.instance!.getData();\n\n hideTextareaVisually(textarea);\n };\n\n syncInput();\n\n // Listen for changes\n this.instance.model.document.on('change:data', () => {\n textarea.dispatchEvent(new Event('input', { bubbles: true }));\n textarea.dispatchEvent(new Event('change', { bubbles: true }));\n\n syncInput();\n });\n }\n\n /**\n * Sets up editable height for ClassicEditor\n *\n * @private\n */\n #setupEditableHeight() {\n if (!this.isClassic() && !this.isBallon()) {\n return;\n }\n\n const height = parseEditableHeight(this.getAttribute('editable-height'));\n\n if (height === null) {\n return;\n }\n\n applyEditableHeight(this.instance!, height);\n }\n\n /**\n * Gets bundle JSON description from translations attribute\n */\n #getBundle(): BundleDescription {\n return (this.#bundle ||= parseBundleDescription(this.getAttribute('bundle'))) as BundleDescription;\n }\n\n /**\n * Checks if all required stylesheets are injected. If not, inject.\n */\n async #ensureStylesheetsInjected() {\n await loadAsyncCSS(this.#getBundle()?.stylesheets || []);\n }\n\n /**\n * Checks if all required scripts are injected. If not, inject.\n */\n async #ensureWindowScriptsInjected() {\n const windowScripts = (this.#getBundle()?.scripts || []).filter(script => !!script.window_name);\n\n await loadAsyncImports(windowScripts);\n }\n\n /**\n * Loads translation modules\n */\n async #getTranslations() {\n const translations = this.#getBundle()?.scripts.filter(script => script.translation);\n\n return loadAsyncImports(translations);\n }\n\n /**\n * Loads plugin modules\n */\n async #getPlugins() {\n return loadAsyncImports(parsePluginDescriptors(this.getAttribute('plugins')));\n }\n\n /**\n * Gets editor constructor based on type attribute\n */\n async #getEditorConstructor() {\n const CKEditor = await import('ckeditor5');\n\n return resolveEditorConstructor(CKEditor, this.getAttribute('type'));\n }\n}\n\n/**\n * Resolves the DOM tag used for the main editable element based on the editor type.\n */\nfunction getEditorElementTag(type: string | null): 'textarea' | 'div' {\n switch (type) {\n case 'ClassicEditor':\n return 'textarea';\n\n default:\n return 'div';\n }\n}\n\n/**\n * Parses the `config` attribute JSON and resolves any `$element` references within it.\n */\nfunction parseEditorConfig(raw: string | null) {\n const config = JSON.parse(raw || '{}');\n\n return resolveConfigElementReferences(config);\n}\n\n/**\n * Resolves the `editablesOrContent` argument passed to `#initializeEditor` into a\n * normalized `{ isMultiroot, content }` shape.\n */\nfunction resolveEditorContent(\n editablesOrContent: Record<string, HTMLElement | string> | CKEditorMultiRootEditablesTracker | string | HTMLElement,\n) {\n const isMultiroot = editablesOrContent instanceof CKEditorMultiRootEditablesTracker;\n\n let content: any = editablesOrContent;\n\n if (isMultiroot) {\n content = (editablesOrContent as CKEditorMultiRootEditablesTracker).getAll();\n }\n else if (typeof editablesOrContent !== 'string') {\n content = (editablesOrContent as any)['main'];\n }\n\n return { isMultiroot, content };\n}\n\n/**\n * Builds the payload broadcasted with the `ckeditor:attach:before` / `ckeditor:attach` events.\n */\nfunction buildBeforeInitEventDetails(content: any, isMultiroot: boolean) {\n return {\n ...content instanceof HTMLElement && { element: content },\n ...typeof content === 'string' && { data: content },\n ...isMultiroot && { editables: content },\n };\n}\n\n/**\n * Applies the resolved editor content to the editor configuration, using the\n * non-deprecated `attachTo` / `root` / `roots` options instead of the legacy\n * `Editor.create( sourceElementOrData, config )` signature.\n */\nfunction applyContentToConfig(\n config: Record<string, any>,\n content: any,\n isMultiroot: boolean,\n isClassic: boolean,\n) {\n if (isMultiroot) {\n config['roots'] = buildRootsConfig(content as Record<string, CKEditorEditableComponent>);\n }\n else if (isClassic && content instanceof HTMLElement) {\n config['attachTo'] = content;\n }\n else if (content instanceof HTMLElement) {\n config['root'] = { ...config['root'], element: content };\n }\n else if (typeof content === 'string') {\n config['root'] = { ...config['root'], initialData: content };\n }\n}\n\n/**\n * Builds the `roots` configuration object used to initialize a `MultiRootEditor`.\n */\nfunction buildRootsConfig(editables: Record<string, CKEditorEditableComponent>) {\n return Object.fromEntries(\n Object.entries(editables).map(([name, element]) => {\n const modelElement = (element as any).modelElement as string | undefined;\n const initialData = (element as any).initialData as string | undefined;\n\n return [\n name,\n {\n element,\n initialData: initialData ?? element.innerHTML,\n ...modelElement && { modelElement },\n },\n ];\n }),\n );\n}\n\n/**\n * Builds a `{ [name]: element }` map out of a list of editable components, validating\n * that each one has a `name` attribute set.\n */\nfunction buildEditablesMap(elements: CKEditorEditableComponent[]): Record<string, CKEditorEditableComponent> {\n return elements.reduce((acc, element) => {\n if (!element.name) {\n throw new Error('Editable component missing required \"name\" attribute');\n }\n\n acc[element.name] = element;\n\n return acc;\n }, Object.create(null));\n}\n\n/**\n * Copies the given attributes from the source element to the target element, when present.\n */\nfunction copyAttributes(source: Element, target: Element, attrNames: readonly string[]) {\n for (const attr of attrNames) {\n if (source.hasAttribute(attr)) {\n target.setAttribute(attr, source.getAttribute(attr)!);\n }\n }\n}\n\n/**\n * Hides a `<textarea>` element visually while keeping it accessible to form submissions.\n */\nfunction hideTextareaVisually(textarea: HTMLTextAreaElement) {\n textarea.tabIndex = -1;\n\n Object.assign(textarea.style, {\n display: 'flex',\n position: 'absolute',\n bottom: '0',\n left: '50%',\n width: '1px',\n height: '1px',\n opacity: '0',\n pointerEvents: 'none',\n margin: '0',\n padding: '0',\n border: 'none',\n });\n}\n\n/**\n * Parses the `editable-height` attribute into a pixel value, or `null` when absent/invalid.\n */\nfunction parseEditableHeight(raw: string | null): number | null {\n if (raw === null) {\n return null;\n }\n\n const height = Number.parseInt(raw, 10);\n\n return Number.isNaN(height) ? null : height;\n}\n\n/**\n * Applies a fixed editing view height to the given editor instance.\n */\nfunction applyEditableHeight(instance: Editor, height: number) {\n instance.editing.view.change((writer) => {\n writer.setStyle('height', `${height}px`, instance.editing.view.document.getRoot()!);\n });\n}\n\n/**\n * Parses the `bundle` attribute JSON into a `BundleDescription`.\n */\nfunction parseBundleDescription(raw: string | null): BundleDescription {\n return JSON.parse(raw!);\n}\n\n/**\n * Parses the `plugins` attribute JSON into async import descriptors.\n */\nfunction parsePluginDescriptors(raw: string | null) {\n const items = raw ? JSON.parse(raw) : [];\n\n return items.map((item: any) =>\n typeof item === 'string'\n ? { import_name: 'ckeditor5', import_as: item }\n : item,\n );\n}\n\n/**\n * Resolves the CKEditor 5 editor constructor matching the `type` attribute.\n */\nfunction resolveEditorConstructor(ckeditorModule: object, editorType: string | null): EditorConstructor {\n if (!editorType || !Object.prototype.hasOwnProperty.call(ckeditorModule, editorType)) {\n throw new Error(`Invalid editor type: ${editorType}`);\n }\n\n return (ckeditorModule as any)[editorType] as EditorConstructor;\n}\n\n/**\n * Resolves an inline event handler attribute value (e.g. `oneditorready=\"doSomething(event)\"`)\n * into a callable function, looking it up on `window` first.\n */\nfunction resolveInlineEventHandler(handlerAttr: string): Function {\n if (!isSafeKey(handlerAttr)) {\n throw new Error(`Unsafe event handler attribute value: ${handlerAttr}`);\n }\n\n // eslint-disable-next-line no-new-func\n return (window as any)[handlerAttr] || new Function('event', handlerAttr);\n}\n\ntype EditorConstructor = {\n create: (...args: any[]) => Promise<Editor>;\n};\n\ntype BundleDescription = {\n stylesheets: string[];\n scripts: Array<AsyncImportRawDescription & {\n translation?: boolean;\n }>;\n};\n\ncustomElements.define('ckeditor-component', CKEditorComponent);\n","import type { CKEditorComponent } from './editor';\n\nimport { execIfDOMReady } from '../helpers';\n\nclass CKEditorUIPartComponent extends HTMLElement {\n /**\n * Lifecycle callback when element is added to DOM.\n * Adds the toolbar to the editor UI.\n */\n connectedCallback() {\n execIfDOMReady(async () => {\n const uiPart = this.getAttribute('name')!;\n const editor = await this.#queryEditorElement()!.instancePromise.promise;\n\n this.appendChild((editor.ui.view as any)[uiPart].element);\n });\n }\n\n /**\n * Finds the parent editor component.\n */\n #queryEditorElement(): CKEditorComponent | null {\n return this.closest('ckeditor-component') || document.body.querySelector('ckeditor-component');\n }\n}\n\ncustomElements.define('ckeditor-ui-part-component', CKEditorUIPartComponent);\n"],"names":["execIfDOMReady","callback","SCRIPT_LOAD_PROMISES","injectScript","url","promise","resolve","reject","script","isSafeKey","key","stylesheetExists","href","sheet","loadAsyncCSS","stylesheets","promises","link","loadAsyncImports","imports","loadExternalPlugin","import_name","import_as","window_name","isScriptPresent","module","imported","uncompressImport","pkg","resolveConfigElementReferences","obj","item","anyObj","element","result","value","uid","CKEditorContextComponent","#connectedEditors","#initializeContext","error","_","oldValue","newValue","editor","Context","ContextWatchdog","plugins","#getPlugins","config","#getConfig","args","raw","CKEditorEditableComponent","editorComponent","#queryEditorElement","CKEditorMultiRootEditablesTracker","#editorElement","#editables","editorElement","initialEditables","target","name","ui","editing","model","modelElement","initialData","root","editable","CKEditorComponent","#initialHTML","#context","#contextEditorId","#bundle","#getEventHandler","handler","#setEventHandler","resolveInlineEventHandler","event","#destroy","#editorElementTag","getEditorElementTag","#contextWatchdog","parseEditorConfig","#initializeEditor","editablesOrContent","#ensureStylesheetsInjected","#ensureWindowScriptsInjected","isMultiroot","content","resolveEditorContent","beforeInitEventDetails","buildBeforeInitEventDetails","Editor","#getEditorConstructor","translations","#getTranslations","applyContentToConfig","watchdog","instance","contextId","_config","EditorWatchdog","#assignInputAttributes","#queryEditables","#setupContentSync","#setupEditableHeight","#setupDataChangeListener","err","getRootContent","rootName","getAllRoots","acc","editables","buildEditablesMap","mainEditable","textarea","copyAttributes","syncInput","hideTextareaVisually","height","parseEditableHeight","applyEditableHeight","#getBundle","parseBundleDescription","windowScripts","parsePluginDescriptors","CKEditor","resolveEditorConstructor","type","isClassic","buildRootsConfig","elements","source","attrNames","attr","writer","ckeditorModule","editorType","handlerAttr","CKEditorUIPartComponent","uiPart"],"mappings":"AAKO,SAASA,EAAeC,GAAwB;AACrD,UAAQ,SAAS,YAAA;AAAA,IACf,KAAK;AACH,eAAS,iBAAiB,oBAAoBA,GAAU,EAAE,MAAM,IAAM;AACtE;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AACH,iBAAWA,GAAU,CAAC;AACtB;AAAA,IAEF;AACE,cAAQ,KAAK,mCAAmC,SAAS,UAAU,GACnE,WAAWA,GAAU,CAAC;AAAA,EAAA;AAE5B;ACpBA,MAAMC,wBAA2B,IAAA;AAQ1B,SAASC,EAAaC,GAAa;AACxC,MAAIF,EAAqB,IAAIE,CAAG;AAC9B,WAAOF,EAAqB,IAAIE,CAAG;AAGrC,QAAMC,IAAU,IAAI,QAAQ,CAACC,GAASC,MAAW;AAC/C,UAAMC,IAAS,SAAS,cAAc,QAAQ;AAC9C,IAAAA,EAAO,MAAMJ,GACbI,EAAO,SAASF,GAChBE,EAAO,UAAUD,GAEjB,SAAS,KAAK,YAAYC,CAAM;AAAA,EAClC,CAAC;AAED,SAAAN,EAAqB,IAAIE,GAAKC,CAAO,GAC9BA;AACT;AClBO,SAASI,EAAUC,GAAa;AACrC,SACE,OAAOA,KAAQ,YACZA,MAAQ,eACRA,MAAQ,iBACRA,MAAQ;AAEf;ACPA,SAASC,EAAiBC,GAAc;AACtC,SAAO,MACJ,KAAK,SAAS,WAAW,EACzB;AAAA,IAAK,CAAAC,MACJA,EAAM,SAASD,KAAQC,EAAM,SAAS,IAAI,IAAID,GAAM,OAAO,SAAS,IAAI,EAAE;AAAA,EAAA;AAEhF;AASO,SAASE,EAAaC,IAAwB,IAAI;AACvD,QAAMC,IAAWD,EAAY;AAAA,IAAI,CAAAH,MAC/B,IAAI,QAAc,CAACN,GAASC,MAAW;AACrC,UAAII,EAAiBC,CAAI,GAAG;AAC1B,QAAAN,EAAA;AACA;AAAA,MACF;AAEA,YAAMW,IAAO,SAAS,cAAc,MAAM;AAC1C,MAAAA,EAAK,MAAM,cACXA,EAAK,OAAOL,GAEZK,EAAK,UAAUV,GACfU,EAAK,SAAS,MAAMX,EAAA,GAEpB,SAAS,KAAK,YAAYW,CAAI;AAAA,IAChC,CAAC;AAAA,EAAA;AAGH,SAAO,QAAQ,IAAID,CAAQ;AAC7B;ACzBO,SAASE,EAAiBC,IAAqD,IAAI;AACxF,QAAMC,IAAqB,OAAO,EAAE,KAAAhB,GAAK,aAAAiB,GAAa,WAAAC,GAAW,aAAAC,GAAa,aAAAR,QAA6C;AAKzH,QAJIA,GAAa,UACf,MAAMD,EAAaC,CAAW,GAG5BQ,GAAa;AACf,UAASC,IAAT,WAA2B;AACzB,eAAO,OAAO,UAAU,eAAe,KAAK,QAAQD,CAAY;AAAA,MAClE;AAYA,UAVInB,KAAO,CAACoB,OACV,MAAMrB,EAAaC,CAAG,GAGnBoB,OACH,OAAO;AAAA,QACL,IAAI,YAAY,+BAA+BD,CAAW,EAAE;AAAA,MAAA,GAI5D,CAACC;AACH,cAAM,IAAI;AAAA,UACR,kBAAkBD,CAAW;AAAA,QAAA;AAKjC,aAAQ,OAAeA,CAAY;AAAA,IACrC;AAEA,UAAME,IAAS,MAAM,OAAOJ,IACtBK,IAAWD,EAAOH,KAAa,SAAS;AAE9C,QAAI,CAACI;AACH,YAAM,IAAI;AAAA,QACR,WAAWJ,KAAa,SAAS,kCAC3BD,CAAW,yBAAyB,OAAO,KAAKI,CAAM,EAAE,KAAK,IAAI,CAAC;AAAA,MAAA;AAK5E,WAAOC;AAAA,EACT;AAEA,WAASC,EAAiBC,GAAU;AAClC,WACSR,EADL,OAAOQ,KAAQ,WACS,EAAE,aAAa,aAAa,WAAWA,MAGzCA,CAH8C;AAAA,EAI1E;AAEA,SAAO,QAAQ,IAAIT,EAAQ,IAAIQ,CAAgB,CAAC;AAClD;AC/DO,SAASE,EAAkCC,GAAW;AAC3D,MAAI,CAACA,KAAO,OAAOA,KAAQ;AACzB,WAAOA;AAGT,MAAI,MAAM,QAAQA,CAAG;AACnB,WAAOA,EAAI,IAAI,CAAAC,MAAQF,EAA+BE,CAAI,CAAC;AAG7D,QAAMC,IAASF;AAEf,MAAIE,EAAO,YAAY,OAAOA,EAAO,YAAa,UAAU;AAC1D,UAAMC,IAAU,SAAS,cAAcD,EAAO,QAAQ;AAEtD,WAAKC,KACH,QAAQ,KAAK,mCAAmCD,EAAO,QAAQ,EAAE,GAG3DC,KAAW;AAAA,EACrB;AAEA,QAAMC,IAAS,uBAAO,OAAO,IAAI;AAEjC,aAAW,CAACxB,GAAKyB,CAAK,KAAK,OAAO,QAAQL,CAAG;AAC3C,IAAAI,EAAOxB,CAAG,IAAImB,EAA+BM,CAAK;AAGpD,SAAOD;AACT;AC9BO,SAASE,IAAM;AACpB,SAAO,KAAK,SAAS,SAAS,EAAE,EAAE,UAAU,CAAC;AAC/C;ACDO,MAAMC,UAAiC,YAAY;AAAA,EACxD,WAAmC;AAAA,EAEnC,kBAAkB,QAAQ,cAAA;AAAA,EAE1BC,yBAAwB,IAAA;AAAA,EAExB,WAAW,qBAAqB;AAC9B,WAAO,CAAC,WAAW,QAAQ;AAAA,EAC7B;AAAA,EAEA,MAAM,oBAAoB;AACxB,QAAI;AACF,MAAAtC,EAAe,MAAM,KAAKuC,IAAoB;AAAA,IAChD,SACOC,GAAO;AACZ,cAAQ,MAAM,iCAAiCA,CAAK,GACpD,KAAK,cAAc,IAAI,YAAY,iBAAiB,EAAE,QAAQA,EAAA,CAAO,CAAC;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,MAAM,yBAAyBC,GAAYC,GAAyBC,GAAyB;AAC3F,IAAID,MAAa,QAAQA,MAAaC,KACpC,MAAM,KAAKJ,GAAA;AAAA,EAEf;AAAA,EAEA,MAAM,uBAAuB;AAC3B,IAAI,KAAK,aACP,MAAM,KAAK,SAAS,QAAA,GACpB,KAAK,WAAW;AAAA,EAEpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAeK,GAA2B;AACxC,SAAKN,GAAkB,IAAIM,CAAM;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,iBAAiBA,GAA2B;AAC1C,SAAKN,GAAkB,OAAOM,CAAM;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAML,KAAqB;AACzB,IAAI,KAAK,aACP,KAAK,kBAAkB,QAAQ,cAAA,GAE/B,MAAM,KAAK,SAAS,QAAA,GAEpB,KAAK,WAAW,OAIlB,OAAO;AAAA,MACL,IAAI,YAAY,kCAAkC,EAAE,QAAQ,EAAE,SAAS,OAAK,CAAG;AAAA,IAAA;AAGjF,UAAM,EAAE,SAAAM,GAAS,iBAAAC,MAAoB,MAAM,OAAO,WAAW,GACvDC,IAAU,MAAM,KAAKC,GAAA,GACrBC,IAAS,KAAKC,GAAA;AAGpB,WAAO;AAAA,MACL,IAAI,YAAY,2BAA2B,EAAE,QAAQ,EAAE,QAAAD,GAAQ,SAAS,OAAK,CAAG;AAAA,IAAA,GAGlF,KAAK,WAAW,IAAIH,EAAgBD,GAAS;AAAA,MAC3C,kBAAkB;AAAA,IAAA,CACnB,GAED,MAAM,KAAK,SAAS,OAAO;AAAA,MACzB,GAAGI;AAAA,MACH,SAAAF;AAAA,IAAA,CACD,GAED,KAAK,SAAS,GAAG,aAAa,IAAII,MAAS;AACzC,cAAQ,MAAM,uBAAuB,GAAGA,CAAI;AAAA,IAC9C,CAAC,GAED,KAAK,gBAAgB,QAAQ,KAAK,QAAQ,GAC1C,KAAK,cAAc,IAAI,YAAY,iBAAiB,EAAE,QAAQ,KAAK,SAAA,CAAU,CAAC,GAG9E,MAAM,QAAQ;AAAA,MACZ,CAAC,GAAG,KAAKb,EAAiB,EAAE,IAAI,CAAAM,MAAUA,EAAO,mBAAA,CAAoB;AAAA,IAAA;AAAA,EAEzE;AAAA,EAEA,MAAMI,KAAc;AAClB,UAAMI,IAAM,KAAK,aAAa,SAAS;AAEvC,WAAOlC,EAAiBkC,IAAM,KAAK,MAAMA,CAAG,IAAI,EAAE;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOAF,KAAa;AACX,UAAMD,IAAS,KAAK,MAAM,KAAK,aAAa,QAAQ,KAAK,IAAI;AAE7D,WAAOpB,EAA+BoB,CAAM;AAAA,EAC9C;AACF;AAEA,eAAe,OAAO,8BAA8BZ,CAAwB;AC1HrE,MAAMgB,UAAkC,YAAY;AAAA;AAAA;AAAA;AAAA,EAIzD,IAAI,OAAO;AACT,WAAO,KAAK,aAAa,MAAM,KAAK;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,kBAAkB;AACpB,WAAO,KAAK,cAAc,KAAK;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAe;AACjB,WAAO,KAAK,aAAa,QAAQ,MAAM,SAAS,gBAAgB;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAc;AAChB,WAAO,KAAK,aAAa,cAAc,IAAI,KAAK,aAAa,cAAc,IAAK;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB;AAClB,IAAArD,EAAe,MAAM;AACnB,YAAMsD,IAAkB,KAAKC,GAAA;AAE7B,UAAI,CAACD;AACH,cAAM,IAAI,MAAM,mEAAmE;AAMrF,UAHA,KAAK,YAAY,QAAQ,KAAK,SAAS,UACvC,KAAK,MAAM,UAAU,SAEjBA,EAAgB;AAClB,QAAAA,EAAgB,oBAAoB,CAACV,MAAW;AAC9C,eAAK,YAAaA,EAAO,GAAG,KAAa,KAAK,IAAI,EAAE,OAAO;AAAA,QAC7D,CAAC;AAAA,eAEMU,EAAgB,WAAW;AAClC,YAAI,CAAC,KAAK;AACR,gBAAM,IAAI,MAAM,sDAAsD;AAGxE,QAAAA,EAAgB,UAAU,KAAK,IAAI,IAAI;AAAA,MACzC;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,uBAAuB;AACrB,UAAMA,IAAkB,KAAKC,GAAA;AAE7B,IAAID,GAAiB,aACnB,OAAOA,EAAgB,UAAU,KAAK,IAAI;AAAA,EAE9C;AAAA;AAAA;AAAA;AAAA,EAKAC,KAAgD;AAC9C,WAAO,KAAK,QAAQ,oBAAoB,KAAK,SAAS,KAAK,cAAc,oBAAoB;AAAA,EAC/F;AACF;AAEA,eAAe,OAAO,+BAA+BF,CAAyB;AC/EvE,MAAMG,EAAkC;AAAA,EAC7CC;AAAA,EACAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,YACEC,GACAC,IAAgD,IAChD;AACA,gBAAKH,KAAiBE,GACtB,KAAKD,KAAaE,GAEX,IAAI,MAAM,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOrB,IAAIC,GAA2CC,GAAc;AAC3D,eAAI,OAAQD,EAAeC,CAAI,KAAM,aAC3BD,EAAeC,CAAI,EAAE,KAAKD,CAAM,IAGnCA,EAAOH,GAAWI,CAAI;AAAA,MAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MASA,IAAID,GAA2CC,GAAc7B,GAAsB;AACjF,eAAI4B,EAAOH,GAAWI,CAAI,MAAM7B,MACzB4B,EAAO,WAAWC,GAAM7B,CAAO,GACpC4B,EAAOH,GAAWI,CAAI,IAAI7B,IAErB;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,eAAe4B,GAA2CC,GAAc;AACtE,eAAKD,EAAO,WAAWC,CAAI,GAC3B,OAAOD,EAAOH,GAAWI,CAAI,GAEtB;AAAA,MACT;AAAA,IAAA,CACD;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,WAAWA,GAAc7B,GAAsB;AACnD,iBAAM,KAAK,WAAW6B,CAAI,GAEnB,KAAKL,GAAe,oBAAqC,CAACb,MAAW;AAC1E,YAAM,EAAE,IAAAmB,GAAI,SAAAC,GAAS,OAAAC,EAAA,IAAUrB,GACzBsB,IAAgBjC,EAAgB,cAChCkC,IAAelC,EAAgB;AAErC,MAAAW,EAAO,QAAQkB,GAAM;AAAA,QACnB,YAAY;AAAA,QACZ,aAAaK,KAAelC,EAAQ;AAAA,QACpC,GAAGiC,KAAgB,EAAE,cAAAA,EAAA;AAAA,MAAa,CACnC;AAED,YAAME,IAAOH,EAAM,SAAS,QAAQH,CAAI;AAExC,MAAIC,EAAG,mBAAmBD,CAAI,KAC5BlB,EAAO,eAAewB,CAAK;AAG7B,YAAMC,IAAWN,EAAG,KAAK,eAAeD,GAAM7B,CAAO;AACrD,MAAA8B,EAAG,YAAYM,CAAQ,GACvBL,EAAQ,KAAK,YAAA;AAAA,IACf,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAWF,GAAc;AAC7B,WAAO,KAAKL,GAAe,oBAAqC,CAACb,MAAW;AAC1E,YAAMwB,IAAOxB,EAAO,MAAM,SAAS,QAAQkB,CAAI;AAE/C,MAAIM,MACFxB,EAAO,eAAewB,CAAI,GAC1BxB,EAAO,WAAWkB,GAAM,EAAI;AAAA,IAEhC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAS;AACP,WAAO,KAAKJ;AAAA,EACd;AACF;AC/GO,MAAMY,UAA0B,YAAY;AAAA,EACjD,kBAAkB,QAAQ,cAAA;AAAA,EAE1B,WAA4B;AAAA,EAE5B,WAA0B;AAAA,EAE1B,YAAgD,uBAAO,OAAO,IAAI;AAAA,EAElEC,KAAuB;AAAA,EAEvBC,KAA4C;AAAA,EAE5CC,KAAkC;AAAA,EAElCC,KAAyB;AAAA;AAAA;AAAA;AAAA,EAKzB,WAAW,qBAAqB;AAC9B,WAAO,CAAC,UAAU,WAAW,gBAAgB,MAAM;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,kBAAkB;AAC3B,WAAO,CAAC,QAAQ,YAAY,OAAO;AAAA,EACrC;AAAA,EAEA,IAAI,iBAAiB;AACnB,WAAO,KAAKC,GAAiB,cAAc;AAAA,EAC7C;AAAA,EAEA,IAAI,eAAeC,GAAS;AAC1B,SAAKC,GAAiB,gBAAgBD,CAAO;AAAA,EAC/C;AAAA,EAEA,IAAI,gBAAgB;AAClB,WAAO,KAAKD,GAAiB,aAAa;AAAA,EAC5C;AAAA,EAEA,IAAI,cAAcC,GAAS;AACzB,SAAKC,GAAiB,eAAeD,CAAO;AAAA,EAC9C;AAAA,EAEA,IAAI,gBAAgB;AAClB,WAAO,KAAKD,GAAiB,aAAa;AAAA,EAC5C;AAAA,EAEA,IAAI,cAAcC,GAAS;AACzB,SAAKC,GAAiB,eAAeD,CAAO;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASAD,GAAiBb,GAA+B;AAC9C,WAAI,KAAK,aAAa,KAAKA,CAAI,EAAE,IACxBgB,EAA0B,KAAK,aAAa,KAAKhB,CAAI,EAAE,CAAE,IAG1D,KAAa,IAAIA,CAAI,SAAS;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASAe,GAAiBf,GAAcc,GAA0B;AACvD,IAAI,OAAOA,KAAY,WACrB,KAAK,aAAa,KAAKd,CAAI,IAAIc,CAAO,KAGtC,KAAK,gBAAgB,KAAKd,CAAI,EAAE,GAC/B,KAAa,IAAIA,CAAI,SAAS,IAAIc;AAAA,EAEvC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,oBAAoB;AAClB,SAAKJ,KAAW,KAAK,QAAQ,4BAA4B,GACzD,KAAKD,KAAe,KAAK;AAEzB,QAAI;AACF,MAAAvE,EAAe,YAAY;AACzB,QAAI,KAAKwE,OACP,MAAM,KAAKA,GAAS,gBAAgB,SACpC,KAAKA,GAAS,eAAe,IAAI,IAGnC,MAAM,KAAK,mBAAA;AAAA,MACb,CAAC;AAAA,IACH,SACOhC,GAAO;AACZ,cAAQ,MAAM,gCAAgCA,CAAK;AAEnD,YAAMuC,IAAQ,IAAI,YAAY,gBAAgB,EAAE,QAAQvC,GAAO;AAE/D,WAAK,cAAcuC,CAAK,GACxB,KAAK,gBAAgBA,CAAK;AAAA,IAC5B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,yBAAyBjB,GAAcpB,GAAyBC,GAAyB;AAC7F,IAAID,MAAa,QACZA,MAAaC,KACb2B,EAAkB,mBAAmB,SAASR,CAAI,KAAK,KAAK,eAC/D,MAAM,KAAK,mBAAA;AAAA,EAEf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,uBAAuB;AAC3B,IAAI,KAAKU,MACP,KAAKA,GAAS,iBAAiB,IAAI;AAGrC,QAAI;AACF,YAAM,KAAKQ,GAAA;AAAA,IACb,SACOxC,GAAO;AACZ,cAAQ,MAAM,6BAA6BA,CAAK;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,oBAAsCvC,GAA8C;AAClF,WAAI,KAAK,WACA,QAAQ,QAAQA,EAAS,KAAK,QAAwB,CAAC,IAGzD,KAAK,gBAAgB,QAAQ,KAAKA,CAA0B;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,IAAIgF,KAAoB;AACtB,WAAOC,EAAoB,KAAK,aAAa,MAAM,CAAC;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAIC,KAAmB;AACrB,WAAO,KAAKX,IAAU;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAMQ,KAAW;AACf,IAAI,KAAKP,MACP,MAAM,KAAKU,GAAkB,OAAO,KAAKV,EAAgB,GAG3D,MAAM,KAAK,UAAU,QAAA,GACrB,KAAK,UAAU,QAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKAvB,KAAa;AACX,WAAOkC,EAAkB,KAAK,aAAa,QAAQ,CAAC;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAMC,GAAkBC,GAAqH;AAC3I,UAAM,QAAQ,IAAI;AAAA,MAChB,KAAKC,GAAA;AAAA,MACL,KAAKC,GAAA;AAAA,IAA6B,CACnC;AAED,UAAM,EAAE,aAAAC,GAAa,SAAAC,MAAYC,EAAqBL,CAAkB,GAClEM,IAAyBC,EAA4BH,GAASD,CAAW;AAE/E,WAAO;AAAA,MACL,IAAI,YAAY,0BAA0B,EAAE,QAAQG,GAAwB;AAAA,IAAA;AAG9E,UAAME,IAAS,MAAM,KAAKC,GAAA,GACpB,CAAChD,GAASiD,CAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,MAChD,KAAKhD,GAAA;AAAA,MACL,KAAKiD,GAAA;AAAA,IAAiB,CACvB,GAEKhD,IAA8B;AAAA,MAClC,GAAG,KAAKC,GAAA;AAAA,MACR,GAAG8C,EAAa,UAAU;AAAA,QACxB,cAAAA;AAAA,MAAA;AAAA,MAEF,SAAAjD;AAAA,IAAA;AAGF,IAAAmD,EAAqBjD,GAAQyC,GAASD,GAAa,KAAK,WAAW,GAEnE,OAAO;AAAA,MACL,IAAI,YAAY,mBAAmB,EAAE,QAAQ,EAAE,QAAAxC,GAAQ,GAAG2C,IAAuB,CAAG;AAAA,IAAA;AAGtF,QAAIO,IAAkC,MAClCC,IAA0B,MAC1BC,IAA2B;AAE/B,QAAI,KAAK7B;AACP,MAAA6B,IAAYjE,EAAA,GAEZ,MAAM,KAAK+C,GAAkB,IAAI;AAAA,QAC/B,SAAS,CAACmB,MAAiBR,EAAO,OAAOQ,CAAO;AAAA,QAChD,IAAID;AAAA,QACJ,MAAM;AAAA,QACN,QAAApD;AAAA,MAAA,CACD,GAEDmD,IAAW,KAAKjB,GAAkB,QAAQkB,CAAS;AAAA,aAE5C,KAAK,eAAe;AAC3B,YAAM,EAAE,gBAAAE,EAAA,IAAmB,MAAM,OAAO,WAAW;AACnD,MAAAJ,IAAW,IAAII,EAAeT,CAAM,GAEpC,MAAMK,EAAS,OAAOlD,CAAM,GAE5BmD,IAAWD,EAAS;AAAA,IACtB;AAEE,MAAAC,IAAW,MAAMN,EAAO,OAAO7C,CAAM;AAGvC,WAAO;AAAA,MACL,WAAAoD;AAAA,MACA,UAAAD;AAAA,MACA,UAAAD;AAAA,IAAA;AAAA,EAEJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,qBAAqB;AACzB,IAAI,KAAK,aACP,KAAK,kBAAkB,QAAQ,cAAA,GAE/B,MAAM,KAAKnB,GAAA,GAEX,KAAK,WAAW,OAGlB,KAAK,MAAM,UAAU,SAEjB,CAAC,KAAK,YAAA,KAAiB,CAAC,KAAK,kBAC/B,KAAK,YAAY,IAAI,KAAKC,EAAiB,IAAI,KAAKV,EAAY,KAAK,KAAKU,EAAiB,KAC3F,KAAKuB,GAAA,IAIH,KAAK,gBACP,KAAK,YAAY,IAAIhD,EAAkC,MAAM,KAAKiD,IAAiB,IAE5E,KAAK,gBACZ,KAAK,YAAY,OAGjB,KAAK,YAAY,KAAKA,GAAA;AAGxB,QAAI;AACF,YAAM,EAAE,UAAAN,GAAU,UAAAC,GAAU,WAAAC,EAAA,IAAc,MAAM,KAAKhB,GAAkB,KAAK,aAAa,KAAKnC,GAAA,EAAa,MAAM,eAAe,EAAE;AAElI,WAAK,WAAWiD,GAChB,KAAK,WAAWC,GAChB,KAAK3B,KAAmB4B,GAExB,KAAKK,GAAA,GACL,KAAKC,GAAA,GACL,KAAKC,GAAA,GAEL,KAAK,gBAAgB,QAAQ,KAAK,QAAS;AAG3C,YAAM7B,IAAQ,IAAI,YAAY,gBAAgB,EAAE,QAAQ,KAAK,UAAU;AAEvE,WAAK,cAAcA,CAAK,GACxB,KAAK,gBAAgBA,CAAK;AAAA,IAC5B,SACO8B,GAAK;AACV,iBAAK,gBAAgB,OAAOA,CAAG,GACzBA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKAD,KAA2B;AACzB,UAAME,IAAiB,CAACC,MAAqB,KAAK,SAAU,QAAQ,EAAE,UAAAA,GAAU,GAC1EC,IAAc,MAClB,KAAK,UAAU,MAAM,SAClB,eACA,OAAO,CAACC,GAAKF,OAAc;AAAA,MAC1B,GAAGE;AAAA,MACH,CAACF,CAAQ,GAAGD,EAAeC,CAAQ;AAAA,IAAA,IACjC,CAAA,CAAE;AAEV,SAAK,UAAU,MAAM,SAAS,GAAG,eAAe,MAAM;AACpD,YAAMhC,IAAQ,IAAI,YAAY,iBAAiB;AAAA,QAC7C,QAAQ;AAAA,UACN,QAAQ,KAAK;AAAA,UACb,MAAMiC,EAAA;AAAA,QAAY;AAAA,QAEpB,SAAS;AAAA,MAAA,CACV;AAED,WAAK,cAAcjC,CAAK,GACxB,KAAK,iBAAiBA,CAAK;AAAA,IAC7B,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,YAAY;AACV,WAAO,KAAK,aAAa,MAAM,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW;AACT,WAAO,KAAK,aAAa,MAAM,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AACZ,WAAO,KAAK,aAAa,MAAM,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AACZ,WAAO,KAAK,aAAa,MAAM,MAAM;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AACZ,WAAO,KAAK,aAAa,UAAU,MAAM;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKA0B,KAAkB;AAChB,QAAI,KAAK;AACP,aAAO,CAAA;AAGT,QAAI,KAAK,eAAe;AACtB,YAAMS,IAAY,CAAC,GAAG,KAAK,iBAAiB,6BAA6B,CAAC;AAE1E,aAAOC,EAAkBD,CAAS;AAAA,IACpC;AAEA,UAAME,IAAe,KAAK,cAAc,KAAKnC,EAAiB;AAE9D,QAAI,CAACmC;AACH,YAAM,IAAI,MAAM,MAAM,KAAKnC,EAAiB,gBAAgB;AAG9D,WAAO,EAAE,MAAMmC,EAAA;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOAZ,KAAyB;AACvB,UAAMa,IAAW,KAAK,cAAc,UAAU;AAE9C,IAAKA,KAILC,EAAe,MAAMD,GAAU/C,EAAkB,eAAe;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOAoC,KAAoB;AAClB,QAAI,CAAC,KAAK;AACR;AAGF,UAAMW,IAAW,KAAK,cAAc,UAAU;AAE9C,QAAI,CAACA;AACH;AAIF,UAAME,IAAY,MAAM;AACtB,WAAK,MAAM,WAAW,YAEtBF,EAAS,YAAY,IACrBA,EAAS,QAAQ,KAAK,SAAU,QAAA,GAEhCG,EAAqBH,CAAQ;AAAA,IAC/B;AAEA,IAAAE,EAAA,GAGA,KAAK,SAAS,MAAM,SAAS,GAAG,eAAe,MAAM;AACnD,MAAAF,EAAS,cAAc,IAAI,MAAM,SAAS,EAAE,SAAS,GAAA,CAAM,CAAC,GAC5DA,EAAS,cAAc,IAAI,MAAM,UAAU,EAAE,SAAS,GAAA,CAAM,CAAC,GAE7DE,EAAA;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOAZ,KAAuB;AACrB,QAAI,CAAC,KAAK,UAAA,KAAe,CAAC,KAAK;AAC7B;AAGF,UAAMc,IAASC,EAAoB,KAAK,aAAa,iBAAiB,CAAC;AAEvE,IAAID,MAAW,QAIfE,EAAoB,KAAK,UAAWF,CAAM;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA,EAKAG,KAAgC;AAC9B,WAAQ,KAAKlD,OAAYmD,EAAuB,KAAK,aAAa,QAAQ,CAAC;AAAA,EAC7E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAMtC,KAA6B;AACjC,UAAMzE,EAAa,KAAK8G,GAAA,GAAc,eAAe,CAAA,CAAE;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAMpC,KAA+B;AACnC,UAAMsC,KAAiB,KAAKF,GAAA,GAAc,WAAW,IAAI,OAAO,CAAApH,MAAU,CAAC,CAACA,EAAO,WAAW;AAE9F,UAAMU,EAAiB4G,CAAa;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM7B,KAAmB;AACvB,UAAMD,IAAe,KAAK4B,MAAc,QAAQ,OAAO,CAAApH,MAAUA,EAAO,WAAW;AAEnF,WAAOU,EAAiB8E,CAAY;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAMhD,KAAc;AAClB,WAAO9B,EAAiB6G,EAAuB,KAAK,aAAa,SAAS,CAAC,CAAC;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAMhC,KAAwB;AAC5B,UAAMiC,IAAW,MAAM,OAAO,WAAW;AAEzC,WAAOC,EAAyBD,GAAU,KAAK,aAAa,MAAM,CAAC;AAAA,EACrE;AACF;AAKA,SAAS9C,EAAoBgD,GAAyC;AACpE,SAAQA,MACD,kBACI,aAGA;AAEb;AAKA,SAAS9C,EAAkBhC,GAAoB;AAC7C,QAAMH,IAAS,KAAK,MAAMG,KAAO,IAAI;AAErC,SAAOvB,EAA+BoB,CAAM;AAC9C;AAMA,SAAS0C,EACPL,GACA;AACA,QAAMG,IAAcH,aAA8B9B;AAElD,MAAIkC,IAAeJ;AAEnB,SAAIG,IACFC,IAAWJ,EAAyD,OAAA,IAE7D,OAAOA,KAAuB,aACrCI,IAAWJ,EAA2B,OAGjC,EAAE,aAAAG,GAAa,SAAAC,EAAA;AACxB;AAKA,SAASG,EAA4BH,GAAcD,GAAsB;AACvE,SAAO;AAAA,IACL,GAAGC,aAAmB,eAAe,EAAE,SAASA,EAAA;AAAA,IAChD,GAAG,OAAOA,KAAY,YAAY,EAAE,MAAMA,EAAA;AAAA,IAC1C,GAAGD,KAAe,EAAE,WAAWC,EAAA;AAAA,EAAQ;AAE3C;AAOA,SAASQ,EACPjD,GACAyC,GACAD,GACA0C,GACA;AACA,EAAI1C,IACFxC,EAAO,QAAWmF,EAAiB1C,CAAoD,IAEhFyC,KAAazC,aAAmB,cACvCzC,EAAO,WAAcyC,IAEdA,aAAmB,cAC1BzC,EAAO,OAAU,EAAE,GAAGA,EAAO,MAAS,SAASyC,EAAA,IAExC,OAAOA,KAAY,aAC1BzC,EAAO,OAAU,EAAE,GAAGA,EAAO,MAAS,aAAayC,EAAA;AAEvD;AAKA,SAAS0C,EAAiBlB,GAAsD;AAC9E,SAAO,OAAO;AAAA,IACZ,OAAO,QAAQA,CAAS,EAAE,IAAI,CAAC,CAACpD,GAAM7B,CAAO,MAAM;AACjD,YAAMiC,IAAgBjC,EAAgB,cAChCkC,IAAelC,EAAgB;AAErC,aAAO;AAAA,QACL6B;AAAA,QACA;AAAA,UACE,SAAA7B;AAAA,UACA,aAAakC,KAAelC,EAAQ;AAAA,UACpC,GAAGiC,KAAgB,EAAE,cAAAA,EAAA;AAAA,QAAa;AAAA,MACpC;AAAA,IAEJ,CAAC;AAAA,EAAA;AAEL;AAMA,SAASiD,EAAkBkB,GAAkF;AAC3G,SAAOA,EAAS,OAAO,CAACpB,GAAKhF,MAAY;AACvC,QAAI,CAACA,EAAQ;AACX,YAAM,IAAI,MAAM,sDAAsD;AAGxE,WAAAgF,EAAIhF,EAAQ,IAAI,IAAIA,GAEbgF;AAAA,EACT,GAAG,uBAAO,OAAO,IAAI,CAAC;AACxB;AAKA,SAASK,EAAegB,GAAiBzE,GAAiB0E,GAA8B;AACtF,aAAWC,KAAQD;AACjB,IAAID,EAAO,aAAaE,CAAI,KAC1B3E,EAAO,aAAa2E,GAAMF,EAAO,aAAaE,CAAI,CAAE;AAG1D;AAKA,SAAShB,EAAqBH,GAA+B;AAC3D,EAAAA,EAAS,WAAW,IAEpB,OAAO,OAAOA,EAAS,OAAO;AAAA,IAC5B,SAAS;AAAA,IACT,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,eAAe;AAAA,IACf,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,QAAQ;AAAA,EAAA,CACT;AACH;AAKA,SAASK,EAAoBtE,GAAmC;AAC9D,MAAIA,MAAQ;AACV,WAAO;AAGT,QAAMqE,IAAS,OAAO,SAASrE,GAAK,EAAE;AAEtC,SAAO,OAAO,MAAMqE,CAAM,IAAI,OAAOA;AACvC;AAKA,SAASE,EAAoBvB,GAAkBqB,GAAgB;AAC7D,EAAArB,EAAS,QAAQ,KAAK,OAAO,CAACqC,MAAW;AACvC,IAAAA,EAAO,SAAS,UAAU,GAAGhB,CAAM,MAAMrB,EAAS,QAAQ,KAAK,SAAS,QAAA,CAAU;AAAA,EACpF,CAAC;AACH;AAKA,SAASyB,EAAuBzE,GAAuC;AACrE,SAAO,KAAK,MAAMA,CAAI;AACxB;AAKA,SAAS2E,EAAuB3E,GAAoB;AAGlD,UAFcA,IAAM,KAAK,MAAMA,CAAG,IAAI,CAAA,GAEzB;AAAA,IAAI,CAACrB,MAChB,OAAOA,KAAS,WACZ,EAAE,aAAa,aAAa,WAAWA,MACvCA;AAAA,EAAA;AAER;AAKA,SAASkG,EAAyBS,GAAwBC,GAA8C;AACtG,MAAI,CAACA,KAAc,CAAC,OAAO,UAAU,eAAe,KAAKD,GAAgBC,CAAU;AACjF,UAAM,IAAI,MAAM,wBAAwBA,CAAU,EAAE;AAGtD,SAAQD,EAAuBC,CAAU;AAC3C;AAMA,SAAS7D,EAA0B8D,GAA+B;AAChE,MAAI,CAACnI,EAAUmI,CAAW;AACxB,UAAM,IAAI,MAAM,yCAAyCA,CAAW,EAAE;AAIxE,SAAQ,OAAeA,CAAW,KAAK,IAAI,SAAS,SAASA,CAAW;AAC1E;AAaA,eAAe,OAAO,sBAAsBtE,CAAiB;ACjwB7D,MAAMuE,UAAgC,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,EAKhD,oBAAoB;AAClB,IAAA7I,EAAe,YAAY;AACzB,YAAM8I,IAAS,KAAK,aAAa,MAAM,GACjClG,IAAS,MAAM,KAAKW,GAAA,EAAuB,gBAAgB;AAEjE,WAAK,YAAaX,EAAO,GAAG,KAAakG,CAAM,EAAE,OAAO;AAAA,IAC1D,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKAvF,KAAgD;AAC9C,WAAO,KAAK,QAAQ,oBAAoB,KAAK,SAAS,KAAK,cAAc,oBAAoB;AAAA,EAC/F;AACF;AAEA,eAAe,OAAO,8BAA8BsF,CAAuB;"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/helpers/create-instance-promise.ts","../src/helpers/exec-if-dom-ready.ts","../src/helpers/inject-script.ts","../src/helpers/is-safe-key.ts","../src/helpers/load-async-css.ts","../src/helpers/load-async-imports.ts","../src/helpers/resolve-config-element-references.ts","../src/components/context.ts","../src/components/editable.ts","../src/components/editor/multiroot-editables-tracker.ts","../src/components/editor/editor.ts","../src/components/ui-part.ts"],"sourcesContent":["/**\n * Creates a deferred promise that does not report an unhandled rejection\n * when it's rejected while nobody is waiting for it.\n */\nexport function createInstancePromise<T>(): PromiseWithResolvers<T> {\n const deferred = Promise.withResolvers<T>();\n\n deferred.promise.catch(() => {});\n\n return deferred;\n}\n","/**\n * Executes callback when DOM is ready.\n *\n * @param callback - Function to execute when DOM is ready.\n */\nexport function execIfDOMReady(callback: VoidFunction) {\n switch (document.readyState) {\n case 'loading':\n document.addEventListener('DOMContentLoaded', callback, { once: true });\n break;\n\n case 'interactive':\n case 'complete':\n setTimeout(callback, 0);\n break;\n\n default:\n console.warn('Unexpected document.readyState:', document.readyState);\n setTimeout(callback, 0);\n }\n}\n","const SCRIPT_LOAD_PROMISES = new Map();\n\n/**\n * Dynamically loads script files based on configuration.\n * Uses caching to avoid loading the same script multiple times.\n *\n * @param url - URL of the script to load\n */\nexport function injectScript(url: string) {\n if (SCRIPT_LOAD_PROMISES.has(url)) {\n return SCRIPT_LOAD_PROMISES.get(url);\n }\n\n const promise = new Promise((resolve, reject) => {\n const script = document.createElement('script');\n script.src = url;\n script.onload = resolve;\n script.onerror = reject;\n\n document.head.appendChild(script);\n });\n\n SCRIPT_LOAD_PROMISES.set(url, promise);\n return promise;\n}\n","/**\n * Checks if a key is safe to use in configuration objects to prevent prototype pollution\n *\n * @param key - Key name to check\n * @returns True if key is safe to use\n */\nexport function isSafeKey(key: string) {\n return (\n typeof key === 'string'\n && key !== '__proto__'\n && key !== 'constructor'\n && key !== 'prototype'\n );\n}\n","/**\n * Checks if stylesheet with given href already exists in document\n *\n * @param href - Stylesheet URL to check\n * @returns True if stylesheet already exists\n */\nfunction stylesheetExists(href: string) {\n return Array\n .from(document.styleSheets)\n .some(sheet =>\n sheet.href === href || sheet.href === new URL(href, window.location.href).href,\n );\n}\n\n/**\n * Dynamically loads CSS files based on configuration\n *\n * @param stylesheets - Array of CSS file URLs to load\n * @returns Array of promises for each CSS file load\n * @throws When CSS file loading fails\n */\nexport function loadAsyncCSS(stylesheets: string[] = []) {\n const promises = stylesheets.map(href =>\n new Promise<void>((resolve, reject) => {\n if (stylesheetExists(href)) {\n resolve();\n return;\n }\n\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.href = href;\n\n link.onerror = reject;\n link.onload = () => resolve();\n\n document.head.appendChild(link);\n }),\n );\n\n return Promise.all(promises);\n}\n","import { injectScript } from './inject-script';\nimport { loadAsyncCSS } from './load-async-css';\n\n/**\n * Dynamically imports modules based on configuration\n *\n * @param imports - Array of import configurations\n * @param imports[].name - Name of inline plugin (for inline type)\n * @param imports[].code - Source code of inline plugin (for inline type)\n * @param imports[].import_name - Module path to import (for external type)\n * @param imports[].import_as - Name to import as (for external type)\n * @param imports[].window_name - Global window object name (for external type)\n * @param imports[].type - Type of import\n * @returns Array of loaded modules\n * @throws When plugin loading fails\n */\nexport function loadAsyncImports(imports: Array<AsyncImportRawDescription | string> = []) {\n const loadExternalPlugin = async ({ url, import_name, import_as, window_name, stylesheets }: AsyncImportRawDescription) => {\n if (stylesheets?.length) {\n await loadAsyncCSS(stylesheets);\n }\n\n if (window_name) {\n function isScriptPresent() {\n return Object.prototype.hasOwnProperty.call(window, window_name!);\n }\n\n if (url && !isScriptPresent()) {\n await injectScript(url);\n }\n\n if (!isScriptPresent()) {\n window.dispatchEvent(\n new CustomEvent(`ckeditor:request-cjs-plugin:${window_name}`),\n );\n }\n\n if (!isScriptPresent()) {\n throw new Error(\n `Plugin window['${window_name}'] not found in global scope. `\n + 'Please ensure the plugin is loaded before CKEditor initialization.',\n );\n }\n\n return (window as any)[window_name!];\n }\n\n const module = await import(import_name!);\n const imported = module[import_as || 'default'];\n\n if (!imported) {\n throw new Error(\n `Plugin \"${import_as || 'default'}\" not found in the ESM module `\n + `\"${import_name}\"! Available imports: ${Object.keys(module).join(', ')}! `\n + 'Consider changing \"import_as\" value.',\n );\n }\n\n return imported;\n };\n\n function uncompressImport(pkg: any) {\n if (typeof pkg === 'string') {\n return loadExternalPlugin({ import_name: 'ckeditor5', import_as: pkg });\n }\n\n return loadExternalPlugin(pkg);\n }\n\n return Promise.all(imports.map(uncompressImport));\n}\n\n/**\n * Type definition for plugin raw descriptor\n */\nexport type AsyncImportRawDescription = {\n url?: string;\n import_name?: string;\n import_as?: string;\n window_name?: string;\n stylesheets?: string[];\n};\n","/**\n * Resolves element references in configuration object.\n * Looks for objects with { $element: \"selector\" } format and replaces them with actual DOM elements.\n *\n * @param obj - Configuration object to process\n * @returns Processed configuration object with resolved element references\n */\nexport function resolveConfigElementReferences<T>(obj: T): T {\n if (!obj || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => resolveConfigElementReferences(item)) as T;\n }\n\n const anyObj = obj as any;\n\n if (anyObj.$element && typeof anyObj.$element === 'string') {\n const element = document.querySelector(anyObj.$element);\n\n if (!element) {\n console.warn(`Element not found for selector: ${anyObj.$element}`);\n }\n\n return (element || null) as T;\n }\n\n const result = Object.create(null);\n\n for (const [key, value] of Object.entries(obj)) {\n result[key] = resolveConfigElementReferences(value);\n }\n\n return result as T;\n}\n","import type { Context } from 'ckeditor5';\n\nimport type { CKEditorComponent } from './editor';\n\nimport {\n createInstancePromise,\n execIfDOMReady,\n loadAsyncImports,\n resolveConfigElementReferences,\n} from '../helpers';\n\nexport class CKEditorContextComponent extends HTMLElement {\n instance: Context | null = null;\n\n instancePromise = createInstancePromise<Context>();\n\n #connectedEditors = new Set<CKEditorComponent>();\n\n /**\n * Incremented on every (re)initialization and on disconnect. An initialization that finishes\n * with a different value is stale and destroys the context it created.\n */\n #generation = 0;\n\n /**\n * Unregisters the error callback of the current context instance.\n */\n #offEditorError: VoidFunction | null = null;\n\n static get observedAttributes() {\n return ['plugins', 'config'];\n }\n\n connectedCallback() {\n execIfDOMReady(() => this.#initializeContextSafely());\n }\n\n async attributeChangedCallback(_: unknown, oldValue: string | null, newValue: string | null) {\n if (oldValue !== null && oldValue !== newValue) {\n await this.#initializeContextSafely();\n }\n }\n\n async disconnectedCallback() {\n // Makes an initialization in progress destroy the context it creates.\n this.#generation++;\n\n try {\n await this.#destroyContext();\n }\n catch (error) {\n console.error('Failed to destroy context:', error);\n }\n }\n\n /**\n * Register editor component with this context\n *\n * @param editor - Editor component to register.\n */\n registerEditor(editor: CKEditorComponent) {\n this.#connectedEditors.add(editor);\n }\n\n /**\n * Unregister editor component from this context\n *\n * @param editor - Editor component to unregister\n */\n unregisterEditor(editor: CKEditorComponent) {\n this.#connectedEditors.delete(editor);\n }\n\n /**\n * Initializes the context and reports failures instead of leaking rejections\n * (lifecycle callbacks are not awaited by the browser).\n */\n async #initializeContextSafely() {\n const generation = ++this.#generation;\n\n try {\n await this.#initializeContext(generation);\n }\n catch (error) {\n // A newer initialization (or disconnect) owns the state now.\n if (generation !== this.#generation) {\n return;\n }\n\n // Reject editors waiting for this context (they would hang forever otherwise),\n // and let the next initialization start with a fresh promise.\n this.instancePromise.reject(error);\n this.instancePromise = createInstancePromise<Context>();\n\n this.#reportError('Failed to initialize context:', error);\n }\n }\n\n /**\n * Initialize CKEditor context with shared configuration\n *\n * @private\n * @param generation - Value of `#generation` assigned to this initialization.\n */\n async #initializeContext(generation: number) {\n // Destroying the context destroys all its editors too. They're recreated at the end.\n await this.#destroyContext();\n\n // Broadcast context initialization event\n window.dispatchEvent(\n new CustomEvent('ckeditor:context:attach:before', { detail: { element: this } }),\n );\n\n const { Context, onEditorError } = await import('ckeditor5');\n const plugins = await this.#getPlugins();\n const config = this.#getConfig();\n\n // Broadcast context mounting event with configuration\n window.dispatchEvent(\n new CustomEvent('ckeditor:context:attach', { detail: { config, element: this } }),\n );\n\n const instance = await Context.create({\n ...config,\n plugins,\n });\n\n // The element was disconnected or the context was reinitialized again in the meantime.\n if (generation !== this.#generation) {\n await instance.destroy();\n return;\n }\n\n this.instance = instance;\n\n // Nothing restarts the context after a crash anymore. Its state may be inconsistent, so lock\n // its editors in read-only mode. Errors attributed to editors are handled by editor components.\n this.#offEditorError = onEditorError(({ error, source }) => {\n if (source !== instance) {\n return;\n }\n\n for (const editor of instance.editors) {\n editor.enableReadOnlyMode('error-handling');\n }\n\n this.#reportError('Context failed:', error);\n });\n\n this.instancePromise.resolve(instance);\n this.dispatchEvent(new CustomEvent('context-ready', { detail: instance }));\n\n // Reinitialize connected editors. Their errors are reported by the editor components themselves.\n await Promise.all(\n [...this.#connectedEditors].map(editor => editor.reinitializeEditor().catch(() => {})),\n );\n }\n\n /**\n * Destroys the current context instance (and all editors created in it).\n */\n async #destroyContext() {\n const { instance } = this;\n\n if (!instance) {\n return;\n }\n\n this.#offEditorError?.();\n this.#offEditorError = null;\n\n this.instance = null;\n this.instancePromise = createInstancePromise<Context>();\n\n await instance.destroy();\n }\n\n /**\n * Logs the error and dispatches the `context-error` event.\n */\n #reportError(message: string, error: unknown) {\n console.error(message, error);\n this.dispatchEvent(new CustomEvent('context-error', { detail: error }));\n }\n\n async #getPlugins() {\n const raw = this.getAttribute('plugins');\n\n return loadAsyncImports(raw ? JSON.parse(raw) : []);\n }\n\n /**\n * Gets context configuration with resolved element references.\n *\n * @private\n */\n #getConfig() {\n const config = JSON.parse(this.getAttribute('config') || '{}');\n\n return resolveConfigElementReferences(config);\n }\n}\n\ncustomElements.define('ckeditor-context-component', CKEditorContextComponent);\n","import type { CKEditorComponent } from './editor';\n\nimport { execIfDOMReady } from '../helpers/exec-if-dom-ready';\n\nexport class CKEditorEditableComponent extends HTMLElement {\n /**\n * Gets the name of this editable region\n */\n get name() {\n return this.getAttribute('name') || 'editable';\n }\n\n /**\n * Gets the actual editable DOM element.\n */\n get editableElement() {\n return this.querySelector('div')!;\n }\n\n /**\n * Root model element.\n */\n get modelElement() {\n return this.getAttribute('inline') === 'true' ? '$inlineRoot' : undefined;\n }\n\n /**\n * Initial editable data.\n */\n get initialData() {\n return this.hasAttribute('initial-data') ? this.getAttribute('initial-data')! : undefined;\n }\n\n /**\n * Lifecycle callback when element is added to DOM\n * Sets up the editable element and registers it with the parent editor\n */\n connectedCallback() {\n execIfDOMReady(() => {\n const editorComponent = this.#queryEditorElement();\n\n if (!editorComponent) {\n throw new Error('ckeditor-editable-component must be a child of ckeditor-component');\n }\n\n this.innerHTML = `<div>${this.innerHTML}</div>`;\n this.style.display = 'block';\n\n if (editorComponent.isDecoupled()) {\n editorComponent.runAfterEditorReady((editor) => {\n this.appendChild((editor.ui.view as any)[this.name].element);\n });\n }\n else if (editorComponent.editables) {\n if (!this.name) {\n throw new Error('Editable component missing required \"name\" attribute');\n }\n\n editorComponent.editables[this.name] = this;\n }\n });\n }\n\n /**\n * Lifecycle callback when element is removed\n * Un-registers this editable from the parent editor\n */\n disconnectedCallback() {\n const editorComponent = this.#queryEditorElement();\n\n if (editorComponent?.editables) {\n delete editorComponent.editables[this.name];\n }\n }\n\n /**\n * Finds the parent editor component\n */\n #queryEditorElement(): CKEditorComponent | null {\n return this.closest('ckeditor-component') || document.body.querySelector('ckeditor-component');\n }\n}\n\ncustomElements.define('ckeditor-editable-component', CKEditorEditableComponent);\n","import type { MultiRootEditor } from 'ckeditor5';\n\nimport type { CKEditorComponent } from './editor';\n\nexport class CKEditorMultiRootEditablesTracker {\n #editorElement: CKEditorComponent;\n #editables: Record<string, HTMLElement>;\n\n /**\n * Creates new tracker instance wrapped in a Proxy for dynamic property access\n *\n * @param editorElement - Parent editor component reference\n * @param initialEditables - Initial editable elements\n * @returns Proxy wrapping the tracker\n */\n constructor(\n editorElement: CKEditorComponent,\n initialEditables: Record<string, HTMLElement> = {},\n ) {\n this.#editorElement = editorElement;\n this.#editables = initialEditables;\n\n return new Proxy(this, {\n /**\n * Handles property access, returns class methods or editable elements\n *\n * @param target - The tracker instance\n * @param name - Property name being accessed\n */\n get(target: CKEditorMultiRootEditablesTracker, name: string) {\n if (typeof (target as any)[name] === 'function') {\n return (target as any)[name].bind(target);\n }\n\n return target.#editables[name];\n },\n\n /**\n * Handles setting new editable elements, triggers root attachment\n *\n * @param target - The tracker instance\n * @param name - Name of the editable root\n * @param element - Element to attach as editable\n */\n set(target: CKEditorMultiRootEditablesTracker, name: string, element: HTMLElement) {\n if (target.#editables[name] !== element) {\n void target.attachRoot(name, element);\n target.#editables[name] = element;\n }\n return true;\n },\n\n /**\n * Handles removing editable elements, triggers root detachment\n *\n * @param target - The tracker instance\n * @param name - Name of the root to remove\n */\n deleteProperty(target: CKEditorMultiRootEditablesTracker, name: string) {\n void target.detachRoot(name);\n delete target.#editables[name];\n\n return true;\n },\n });\n }\n\n /**\n * Attaches a new editable root to the editor.\n * Creates new editor root and binds UI elements.\n *\n * @param name - Name of the editable root\n * @param element - DOM element to use as editable\n * @returns Resolves when root is attached\n */\n async attachRoot(name: string, element: HTMLElement) {\n await this.detachRoot(name);\n\n return this.#editorElement.runAfterEditorReady<MultiRootEditor>((editor) => {\n const { ui, editing, model } = editor;\n const modelElement = (element as any).modelElement as string | undefined;\n const initialData = (element as any).initialData as string | undefined;\n\n editor.addRoot(name, {\n isUndoable: false,\n initialData: initialData ?? element.innerHTML,\n ...modelElement && { modelElement },\n });\n\n const root = model.document.getRoot(name);\n\n if (ui.getEditableElement(name)) {\n editor.detachEditable(root!);\n }\n\n const editable = ui.view.createEditable(name, element);\n ui.addEditable(editable);\n editing.view.forceRender();\n });\n }\n\n /**\n * Detaches an editable root from the editor.\n * Removes editor root and cleans up UI bindings.\n *\n * @param name - Name of root to detach\n * @returns Resolves when root is detached\n */\n async detachRoot(name: string) {\n return this.#editorElement.runAfterEditorReady<MultiRootEditor>((editor) => {\n const root = editor.model.document.getRoot(name);\n\n if (root) {\n editor.detachEditable(root);\n editor.detachRoot(name, true);\n }\n });\n }\n\n /**\n * Gets all currently tracked editable elements\n *\n * @returns Map of all editable elements\n */\n getAll() {\n return this.#editables;\n }\n}\n","import type { Editor } from 'ckeditor5';\n\nimport type { AsyncImportRawDescription } from '../../helpers';\nimport type { CKEditorContextComponent } from '../context';\nimport type { CKEditorEditableComponent } from '../editable';\n\nimport {\n createInstancePromise,\n execIfDOMReady,\n isSafeKey,\n loadAsyncCSS,\n loadAsyncImports,\n resolveConfigElementReferences,\n} from '../../helpers';\nimport { CKEditorMultiRootEditablesTracker } from './multiroot-editables-tracker';\n\nexport class CKEditorComponent extends HTMLElement {\n instancePromise = createInstancePromise<Editor>();\n\n instance: Editor | null = null;\n\n editables: Record<string, HTMLElement> | null = Object.create(null);\n\n #initialHTML: string = '';\n\n #context: CKEditorContextComponent | null = null;\n\n /**\n * Incremented on every (re)initialization and on disconnect. An initialization that finishes\n * with a different value is stale and destroys the editor it created.\n */\n #generation = 0;\n\n /**\n * Unregisters the error callback of the current editor instance.\n */\n #offEditorError: VoidFunction | null = null;\n\n #bundle: object | null = null;\n\n /**\n * List of attributes that trigger updates when changed.\n */\n static get observedAttributes() {\n return ['config', 'plugins', 'translations', 'type'];\n }\n\n /**\n * List of input attributes that trigger updates when changed.\n */\n static get inputAttributes() {\n return ['name', 'required', 'value'];\n }\n\n get oneditorchange() {\n return this.#getEventHandler('editorchange');\n }\n\n set oneditorchange(handler) {\n this.#setEventHandler('editorchange', handler);\n }\n\n get oneditorready() {\n return this.#getEventHandler('editorready');\n }\n\n set oneditorready(handler) {\n this.#setEventHandler('editorready', handler);\n }\n\n get oneditorerror() {\n return this.#getEventHandler('editorerror');\n }\n\n set oneditorerror(handler) {\n this.#setEventHandler('editorerror', handler);\n }\n\n /**\n * Gets event handler function from attribute or property\n *\n * @private\n * @param name - Event name without 'on' prefix\n * @returns Event handler or null\n */\n #getEventHandler(name: string): Function | null {\n if (this.hasAttribute(`on${name}`)) {\n return resolveInlineEventHandler(this.getAttribute(`on${name}`)!);\n }\n\n return (this as any)[`#${name}Handler`];\n }\n\n /**\n * Sets event handler function\n *\n * @private\n * @param name - Event name without 'on' prefix\n * @param handler - Event handler\n */\n #setEventHandler(name: string, handler: Function | null) {\n if (typeof handler === 'string') {\n this.setAttribute(`on${name}`, handler);\n }\n else {\n this.removeAttribute(`on${name}`);\n (this as any)[`#${name}Handler`] = handler;\n }\n }\n\n /**\n * Lifecycle callback when element is connected to DOM\n * Initializes the editor when DOM is ready\n *\n * @protected\n */\n connectedCallback() {\n this.#context = this.closest('ckeditor-context-component');\n this.#initialHTML = this.innerHTML;\n\n execIfDOMReady(async () => {\n if (this.#context) {\n try {\n await this.#context.instancePromise.promise;\n }\n catch (error) {\n this.#reportError('Failed to initialize editor:', error);\n return;\n }\n\n this.#context.registerEditor(this);\n }\n\n // Errors are reported by `reinitializeEditor()` itself.\n await this.reinitializeEditor().catch(() => {});\n });\n }\n\n /**\n * Handles attribute changes and reinitializes editor if needed\n *\n * @protected\n * @param name - Name of changed attribute\n * @param oldValue - Previous attribute value\n * @param newValue - New attribute value\n */\n async attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {\n if (oldValue !== null\n && oldValue !== newValue\n && CKEditorComponent.observedAttributes.includes(name) && this.isConnected) {\n // Errors are reported by `reinitializeEditor()` itself.\n await this.reinitializeEditor().catch(() => {});\n }\n }\n\n /**\n * Lifecycle callback when element is removed from DOM\n * Destroys the editor instance\n * @protected\n */\n async disconnectedCallback() {\n if (this.#context) {\n this.#context.unregisterEditor(this);\n }\n\n // Makes an initialization in progress destroy the editor it creates.\n this.#generation++;\n\n try {\n await this.#destroy();\n }\n catch (error) {\n console.error('Failed to destroy editor:', error);\n }\n }\n\n /**\n * Runs a callback after the editor is ready. It waits for editor\n * initialization if needed.\n *\n * @param callback - Callback to run\n */\n runAfterEditorReady<E extends Editor>(callback: (editor: E) => void): Promise<void> {\n if (this.instance) {\n return Promise.resolve(callback(this.instance as unknown as E));\n }\n\n return this.instancePromise.promise.then(callback as unknown as any);\n }\n\n /**\n * Determines appropriate editor element tag based on editor type\n */\n get #editorElementTag() {\n return getEditorElementTag(this.getAttribute('type'));\n }\n\n /**\n * Destroys the current editor instance, if any.\n */\n async #destroy() {\n const instance = this.#detachInstance();\n\n // The context destroys its editors when it's destroyed (or reinitialized), so the editor\n // may be already destroyed here.\n if (instance && instance.state !== 'destroyed') {\n await instance.destroy();\n }\n }\n\n /**\n * Detaches the current editor instance from the component without destroying it.\n *\n * @returns The detached instance or `null` if there was none.\n */\n #detachInstance(): Editor | null {\n const { instance } = this;\n\n if (!instance) {\n return null;\n }\n\n this.#offEditorError?.();\n this.#offEditorError = null;\n\n this.instance = null;\n this.instancePromise = createInstancePromise<Editor>();\n\n return instance;\n }\n\n /**\n * Logs the error and dispatches the `editor-error` event.\n */\n #reportError(message: string, error: unknown) {\n console.error(message, error);\n\n const event = new CustomEvent('editor-error', { detail: error });\n\n this.dispatchEvent(event);\n this.oneditorerror?.(event);\n }\n\n /**\n * Gets editor configuration with resolved element references\n */\n #getConfig() {\n return parseEditorConfig(this.getAttribute('config'));\n }\n\n /**\n * Creates a new CKEditor instance\n */\n async #initializeEditor(editablesOrContent: Record<string, HTMLElement | string> | CKEditorMultiRootEditablesTracker | string | HTMLElement): Promise<Editor> {\n // Always take the current context instance. It may have been reinitialized in the meantime.\n const context = this.#context ? await this.#context.instancePromise.promise : null;\n\n await Promise.all([\n this.#ensureStylesheetsInjected(),\n this.#ensureWindowScriptsInjected(),\n ]);\n\n const { isMultiroot, content } = resolveEditorContent(editablesOrContent);\n const beforeInitEventDetails = buildBeforeInitEventDetails(content, isMultiroot);\n\n window.dispatchEvent(\n new CustomEvent('ckeditor:attach:before', { detail: beforeInitEventDetails }),\n );\n\n const Editor = await this.#getEditorConstructor();\n const [plugins, translations] = await Promise.all([\n this.#getPlugins(),\n this.#getTranslations(),\n ]);\n\n const config: Record<string, any> = {\n ...this.#getConfig(),\n ...translations.length && {\n translations,\n },\n plugins,\n };\n\n applyContentToConfig(config, content, isMultiroot, this.isClassic());\n\n window.dispatchEvent(\n new CustomEvent('ckeditor:attach', { detail: { config, ...beforeInitEventDetails } }),\n );\n\n return Editor.create(\n context\n ? { ...config, context }\n : config,\n );\n }\n\n /**\n * Re-initializes the editor by destroying existing instance and creating new one\n *\n * @private\n * @returns {Promise<void>}\n */\n async reinitializeEditor() {\n const generation = ++this.#generation;\n\n try {\n await this.#destroy();\n\n this.style.display = 'block';\n\n if (!this.isMultiroot() && !this.isDecoupled()) {\n this.innerHTML = `<${this.#editorElementTag}>${this.#initialHTML}</${this.#editorElementTag}>`;\n this.#assignInputAttributes();\n }\n\n // Let's track changes in editables if it's a multiroot editor.\n if (this.isMultiroot()) {\n this.editables = new CKEditorMultiRootEditablesTracker(this, this.#queryEditables()) as unknown as Record<string, HTMLElement>;\n }\n else if (this.isDecoupled()) {\n this.editables = null;\n }\n else {\n this.editables = this.#queryEditables();\n }\n\n const [instance, { onEditorError }] = await Promise.all([\n this.#initializeEditor(this.editables || this.#getConfig().root?.initialData || ''),\n import('ckeditor5'),\n ]);\n\n // The element was disconnected or the editor was reinitialized again in the meantime.\n if (generation !== this.#generation) {\n if (instance.state !== 'destroyed') {\n await instance.destroy();\n }\n\n return;\n }\n\n this.instance = instance;\n\n // Nothing restarts the editor after a crash anymore and its state may be inconsistent,\n // so lock it in read-only mode to avoid submitting broken data with the form.\n // Errors of the context are handled by the context component.\n this.#offEditorError = onEditorError(({ error, source }) => {\n if (source !== instance) {\n return;\n }\n\n instance.enableReadOnlyMode('error-handling');\n this.#reportError('Editor failed:', error);\n });\n\n // The editor may be destroyed externally (by the context or manually using `.destroy()`).\n instance.once('destroy', () => {\n if (this.instance === instance) {\n this.#detachInstance();\n }\n });\n\n this.#setupContentSync();\n this.#setupEditableHeight();\n this.#setupDataChangeListener();\n\n this.instancePromise.resolve(instance);\n\n // Broadcast editor ready event\n const event = new CustomEvent('editor-ready', { detail: instance });\n\n this.dispatchEvent(event);\n this.oneditorready?.(event);\n }\n catch (error) {\n // A newer initialization (or disconnect) owns the state now.\n if (generation !== this.#generation) {\n return;\n }\n\n // Reject callers waiting in `runAfterEditorReady()` and let the next initialization start with a fresh promise.\n this.instancePromise.reject(error);\n this.instancePromise = createInstancePromise<Editor>();\n\n this.#reportError('Failed to initialize editor:', error);\n\n throw error;\n }\n }\n\n /**\n * Sets up data change listener that broadcasts content changes\n */\n #setupDataChangeListener() {\n const getRootContent = (rootName: string) => this.instance!.getData({ rootName });\n const getAllRoots = () =>\n this.instance?.model.document\n .getRootNames()\n .reduce((acc, rootName) => ({\n ...acc,\n [rootName]: getRootContent(rootName),\n }), {});\n\n this.instance?.model.document.on('change:data', () => {\n const event = new CustomEvent('editor-change', {\n detail: {\n editor: this.instance,\n data: getAllRoots(),\n },\n bubbles: true,\n });\n\n this.dispatchEvent(event);\n this.oneditorchange?.(event);\n });\n }\n\n /**\n * Checks if current editor is classic type\n */\n isClassic() {\n return this.getAttribute('type') === 'ClassicEditor';\n }\n\n /**\n * Checks if current editor is balloon type\n */\n isBallon() {\n return this.getAttribute('type') === 'BalloonEditor';\n }\n\n /**\n * Checks if current editor is multiroot type\n */\n isMultiroot() {\n return this.getAttribute('type') === 'MultiRootEditor';\n }\n\n /**\n * Checks if current editor is decoupled type\n */\n isDecoupled() {\n return this.getAttribute('type') === 'DecoupledEditor';\n }\n\n /**\n * Queries and validates editable elements\n */\n #queryEditables() {\n if (this.isDecoupled()) {\n return {};\n }\n\n if (this.isMultiroot()) {\n const editables = [...this.querySelectorAll('ckeditor-editable-component')] as CKEditorEditableComponent[];\n\n return buildEditablesMap(editables);\n }\n\n const mainEditable = this.querySelector(this.#editorElementTag);\n\n if (!mainEditable) {\n throw new Error(`No ${this.#editorElementTag} element found`);\n }\n\n return { main: mainEditable };\n }\n\n /**\n * Copies input-related attributes from component to the main editable element\n *\n * @private\n */\n #assignInputAttributes() {\n const textarea = this.querySelector('textarea');\n\n if (!textarea) {\n return;\n }\n\n copyAttributes(this, textarea, CKEditorComponent.inputAttributes);\n }\n\n /**\n * Sets up content sync between editor and textarea element.\n *\n * @private\n */\n #setupContentSync() {\n if (!this.instance) {\n return;\n }\n\n const textarea = this.querySelector('textarea');\n\n if (!textarea) {\n return;\n }\n\n // Initial sync\n const syncInput = () => {\n this.style.position = 'relative';\n\n textarea.innerHTML = '';\n textarea.value = this.instance!.getData();\n\n hideTextareaVisually(textarea);\n };\n\n syncInput();\n\n // Listen for changes\n this.instance.model.document.on('change:data', () => {\n textarea.dispatchEvent(new Event('input', { bubbles: true }));\n textarea.dispatchEvent(new Event('change', { bubbles: true }));\n\n syncInput();\n });\n }\n\n /**\n * Sets up editable height for ClassicEditor\n *\n * @private\n */\n #setupEditableHeight() {\n if (!this.isClassic() && !this.isBallon()) {\n return;\n }\n\n const height = parseEditableHeight(this.getAttribute('editable-height'));\n\n if (height === null) {\n return;\n }\n\n applyEditableHeight(this.instance!, height);\n }\n\n /**\n * Gets bundle JSON description from translations attribute\n */\n #getBundle(): BundleDescription {\n return (this.#bundle ||= parseBundleDescription(this.getAttribute('bundle'))) as BundleDescription;\n }\n\n /**\n * Checks if all required stylesheets are injected. If not, inject.\n */\n async #ensureStylesheetsInjected() {\n await loadAsyncCSS(this.#getBundle()?.stylesheets || []);\n }\n\n /**\n * Checks if all required scripts are injected. If not, inject.\n */\n async #ensureWindowScriptsInjected() {\n const windowScripts = (this.#getBundle()?.scripts || []).filter(script => !!script.window_name);\n\n await loadAsyncImports(windowScripts);\n }\n\n /**\n * Loads translation modules\n */\n async #getTranslations() {\n const translations = this.#getBundle()?.scripts.filter(script => script.translation);\n\n return loadAsyncImports(translations);\n }\n\n /**\n * Loads plugin modules\n */\n async #getPlugins() {\n return loadAsyncImports(parsePluginDescriptors(this.getAttribute('plugins')));\n }\n\n /**\n * Gets editor constructor based on type attribute\n */\n async #getEditorConstructor() {\n const CKEditor = await import('ckeditor5');\n\n return resolveEditorConstructor(CKEditor, this.getAttribute('type'));\n }\n}\n\n/**\n * Resolves the DOM tag used for the main editable element based on the editor type.\n */\nfunction getEditorElementTag(type: string | null): 'textarea' | 'div' {\n switch (type) {\n case 'ClassicEditor':\n return 'textarea';\n\n default:\n return 'div';\n }\n}\n\n/**\n * Parses the `config` attribute JSON and resolves any `$element` references within it.\n */\nfunction parseEditorConfig(raw: string | null) {\n const config = JSON.parse(raw || '{}');\n\n return resolveConfigElementReferences(config);\n}\n\n/**\n * Resolves the `editablesOrContent` argument passed to `#initializeEditor` into a\n * normalized `{ isMultiroot, content }` shape.\n */\nfunction resolveEditorContent(\n editablesOrContent: Record<string, HTMLElement | string> | CKEditorMultiRootEditablesTracker | string | HTMLElement,\n) {\n const isMultiroot = editablesOrContent instanceof CKEditorMultiRootEditablesTracker;\n\n let content: any = editablesOrContent;\n\n if (isMultiroot) {\n content = (editablesOrContent as CKEditorMultiRootEditablesTracker).getAll();\n }\n else if (typeof editablesOrContent !== 'string') {\n content = (editablesOrContent as any)['main'];\n }\n\n return { isMultiroot, content };\n}\n\n/**\n * Builds the payload broadcasted with the `ckeditor:attach:before` / `ckeditor:attach` events.\n */\nfunction buildBeforeInitEventDetails(content: any, isMultiroot: boolean) {\n return {\n ...content instanceof HTMLElement && { element: content },\n ...typeof content === 'string' && { data: content },\n ...isMultiroot && { editables: content },\n };\n}\n\n/**\n * Applies the resolved editor content to the editor configuration, using the\n * non-deprecated `attachTo` / `root` / `roots` options instead of the legacy\n * `Editor.create( sourceElementOrData, config )` signature.\n */\nfunction applyContentToConfig(\n config: Record<string, any>,\n content: any,\n isMultiroot: boolean,\n isClassic: boolean,\n) {\n if (isMultiroot) {\n config['roots'] = buildRootsConfig(content as Record<string, CKEditorEditableComponent>);\n }\n else if (isClassic && content instanceof HTMLElement) {\n config['attachTo'] = content;\n }\n else if (content instanceof HTMLElement) {\n config['root'] = { ...config['root'], element: content };\n }\n else if (typeof content === 'string') {\n config['root'] = { ...config['root'], initialData: content };\n }\n}\n\n/**\n * Builds the `roots` configuration object used to initialize a `MultiRootEditor`.\n */\nfunction buildRootsConfig(editables: Record<string, CKEditorEditableComponent>) {\n return Object.fromEntries(\n Object.entries(editables).map(([name, element]) => {\n const modelElement = (element as any).modelElement as string | undefined;\n const initialData = (element as any).initialData as string | undefined;\n\n return [\n name,\n {\n element,\n initialData: initialData ?? element.innerHTML,\n ...modelElement && { modelElement },\n },\n ];\n }),\n );\n}\n\n/**\n * Builds a `{ [name]: element }` map out of a list of editable components, validating\n * that each one has a `name` attribute set.\n */\nfunction buildEditablesMap(elements: CKEditorEditableComponent[]): Record<string, CKEditorEditableComponent> {\n return elements.reduce((acc, element) => {\n if (!element.name) {\n throw new Error('Editable component missing required \"name\" attribute');\n }\n\n acc[element.name] = element;\n\n return acc;\n }, Object.create(null));\n}\n\n/**\n * Copies the given attributes from the source element to the target element, when present.\n */\nfunction copyAttributes(source: Element, target: Element, attrNames: readonly string[]) {\n for (const attr of attrNames) {\n if (source.hasAttribute(attr)) {\n target.setAttribute(attr, source.getAttribute(attr)!);\n }\n }\n}\n\n/**\n * Hides a `<textarea>` element visually while keeping it accessible to form submissions.\n */\nfunction hideTextareaVisually(textarea: HTMLTextAreaElement) {\n textarea.tabIndex = -1;\n\n Object.assign(textarea.style, {\n display: 'flex',\n position: 'absolute',\n bottom: '0',\n left: '50%',\n width: '1px',\n height: '1px',\n opacity: '0',\n pointerEvents: 'none',\n margin: '0',\n padding: '0',\n border: 'none',\n });\n}\n\n/**\n * Parses the `editable-height` attribute into a pixel value, or `null` when absent/invalid.\n */\nfunction parseEditableHeight(raw: string | null): number | null {\n if (raw === null) {\n return null;\n }\n\n const height = Number.parseInt(raw, 10);\n\n return Number.isNaN(height) ? null : height;\n}\n\n/**\n * Applies a fixed editing view height to the given editor instance.\n */\nfunction applyEditableHeight(instance: Editor, height: number) {\n instance.editing.view.change((writer) => {\n writer.setStyle('height', `${height}px`, instance.editing.view.document.getRoot()!);\n });\n}\n\n/**\n * Parses the `bundle` attribute JSON into a `BundleDescription`.\n */\nfunction parseBundleDescription(raw: string | null): BundleDescription {\n return JSON.parse(raw!);\n}\n\n/**\n * Parses the `plugins` attribute JSON into async import descriptors.\n */\nfunction parsePluginDescriptors(raw: string | null) {\n const items = raw ? JSON.parse(raw) : [];\n\n return items.map((item: any) =>\n typeof item === 'string'\n ? { import_name: 'ckeditor5', import_as: item }\n : item,\n );\n}\n\n/**\n * Resolves the CKEditor 5 editor constructor matching the `type` attribute.\n */\nfunction resolveEditorConstructor(ckeditorModule: object, editorType: string | null): EditorConstructor {\n if (!editorType || !Object.prototype.hasOwnProperty.call(ckeditorModule, editorType)) {\n throw new Error(`Invalid editor type: ${editorType}`);\n }\n\n return (ckeditorModule as any)[editorType] as EditorConstructor;\n}\n\n/**\n * Resolves an inline event handler attribute value (e.g. `oneditorready=\"doSomething(event)\"`)\n * into a callable function, looking it up on `window` first.\n */\nfunction resolveInlineEventHandler(handlerAttr: string): Function {\n if (!isSafeKey(handlerAttr)) {\n throw new Error(`Unsafe event handler attribute value: ${handlerAttr}`);\n }\n\n // eslint-disable-next-line no-new-func\n return (window as any)[handlerAttr] || new Function('event', handlerAttr);\n}\n\ntype EditorConstructor = {\n create: (...args: any[]) => Promise<Editor>;\n};\n\ntype BundleDescription = {\n stylesheets: string[];\n scripts: Array<AsyncImportRawDescription & {\n translation?: boolean;\n }>;\n};\n\ncustomElements.define('ckeditor-component', CKEditorComponent);\n","import type { CKEditorComponent } from './editor';\n\nimport { execIfDOMReady } from '../helpers';\n\nclass CKEditorUIPartComponent extends HTMLElement {\n /**\n * Lifecycle callback when element is added to DOM.\n * Adds the toolbar to the editor UI.\n */\n connectedCallback() {\n execIfDOMReady(async () => {\n const uiPart = this.getAttribute('name')!;\n const editor = await this.#queryEditorElement()!.instancePromise.promise;\n\n this.appendChild((editor.ui.view as any)[uiPart].element);\n });\n }\n\n /**\n * Finds the parent editor component.\n */\n #queryEditorElement(): CKEditorComponent | null {\n return this.closest('ckeditor-component') || document.body.querySelector('ckeditor-component');\n }\n}\n\ncustomElements.define('ckeditor-ui-part-component', CKEditorUIPartComponent);\n"],"names":["createInstancePromise","deferred","execIfDOMReady","callback","SCRIPT_LOAD_PROMISES","injectScript","url","promise","resolve","reject","script","isSafeKey","key","stylesheetExists","href","sheet","loadAsyncCSS","stylesheets","promises","link","loadAsyncImports","imports","loadExternalPlugin","import_name","import_as","window_name","isScriptPresent","module","imported","uncompressImport","pkg","resolveConfigElementReferences","obj","item","anyObj","element","result","value","CKEditorContextComponent","#connectedEditors","#generation","#offEditorError","#initializeContextSafely","_","oldValue","newValue","#destroyContext","error","editor","generation","#initializeContext","#reportError","Context","onEditorError","plugins","#getPlugins","config","#getConfig","instance","source","message","raw","CKEditorEditableComponent","editorComponent","#queryEditorElement","CKEditorMultiRootEditablesTracker","#editorElement","#editables","editorElement","initialEditables","target","name","ui","editing","model","modelElement","initialData","root","editable","CKEditorComponent","#initialHTML","#context","#bundle","#getEventHandler","handler","#setEventHandler","resolveInlineEventHandler","#destroy","#editorElementTag","getEditorElementTag","#detachInstance","event","parseEditorConfig","#initializeEditor","editablesOrContent","context","#ensureStylesheetsInjected","#ensureWindowScriptsInjected","isMultiroot","content","resolveEditorContent","beforeInitEventDetails","buildBeforeInitEventDetails","Editor","#getEditorConstructor","translations","#getTranslations","applyContentToConfig","#assignInputAttributes","#queryEditables","#setupContentSync","#setupEditableHeight","#setupDataChangeListener","getRootContent","rootName","getAllRoots","acc","editables","buildEditablesMap","mainEditable","textarea","copyAttributes","syncInput","hideTextareaVisually","height","parseEditableHeight","applyEditableHeight","#getBundle","parseBundleDescription","windowScripts","parsePluginDescriptors","CKEditor","resolveEditorConstructor","type","isClassic","buildRootsConfig","elements","attrNames","attr","writer","ckeditorModule","editorType","handlerAttr","CKEditorUIPartComponent","uiPart"],"mappings":"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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Context } from 'ckeditor5';
|
|
2
2
|
import { CKEditorComponent } from './editor';
|
|
3
3
|
export declare class CKEditorContextComponent extends HTMLElement {
|
|
4
4
|
#private;
|
|
5
|
-
instance:
|
|
6
|
-
instancePromise: PromiseWithResolvers<
|
|
5
|
+
instance: Context | null;
|
|
6
|
+
instancePromise: PromiseWithResolvers<Context>;
|
|
7
7
|
static get observedAttributes(): string[];
|
|
8
|
-
connectedCallback():
|
|
8
|
+
connectedCallback(): void;
|
|
9
9
|
attributeChangedCallback(_: unknown, oldValue: string | null, newValue: string | null): Promise<void>;
|
|
10
10
|
disconnectedCallback(): Promise<void>;
|
|
11
11
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/components/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/components/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AASlD,qBAAa,wBAAyB,SAAQ,WAAW;;IACvD,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAQ;IAEhC,eAAe,gCAAoC;IAenD,MAAM,KAAK,kBAAkB,aAE5B;IAED,iBAAiB;IAIX,wBAAwB,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMrF,oBAAoB;IAY1B;;;;OAIG;IACH,cAAc,CAAC,MAAM,EAAE,iBAAiB;IAIxC;;;;OAIG;IACH,gBAAgB,CAAC,MAAM,EAAE,iBAAiB;CAoI3C"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { Editor
|
|
1
|
+
import { Editor } from 'ckeditor5';
|
|
2
2
|
export declare class CKEditorComponent extends HTMLElement {
|
|
3
3
|
#private;
|
|
4
4
|
instancePromise: PromiseWithResolvers<Editor>;
|
|
5
|
-
watchdog: Watchdog | null;
|
|
6
5
|
instance: Editor | null;
|
|
7
6
|
editables: Record<string, HTMLElement> | null;
|
|
8
7
|
/**
|
|
@@ -71,9 +70,5 @@ export declare class CKEditorComponent extends HTMLElement {
|
|
|
71
70
|
* Checks if current editor is decoupled type
|
|
72
71
|
*/
|
|
73
72
|
isDecoupled(): boolean;
|
|
74
|
-
/**
|
|
75
|
-
* Checks if current editor has watchdog enabled
|
|
76
|
-
*/
|
|
77
|
-
hasWatchdog(): boolean;
|
|
78
73
|
}
|
|
79
74
|
//# sourceMappingURL=editor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../../../src/components/editor/editor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../../../src/components/editor/editor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAgBxC,qBAAa,iBAAkB,SAAQ,WAAW;;IAChD,eAAe,+BAAmC;IAElD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAQ;IAE/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,IAAI,CAAuB;IAmBpE;;OAEG;IACH,MAAM,KAAK,kBAAkB,aAE5B;IAED;;OAEG;IACH,MAAM,KAAK,eAAe,aAEzB;IAED,IAAI,cAAc,oBAEjB;IAED,IAAI,cAAc,CAAC,OAAO,iBAAA,EAEzB;IAED,IAAI,aAAa,oBAEhB;IAED,IAAI,aAAa,CAAC,OAAO,iBAAA,EAExB;IAED,IAAI,aAAa,oBAEhB;IAED,IAAI,aAAa,CAAC,OAAO,iBAAA,EAExB;IAkCD;;;;;OAKG;IACH,iBAAiB;IAsBjB;;;;;;;OAOG;IACG,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAS7F;;;;OAIG;IACG,oBAAoB;IAgB1B;;;;;OAKG;IACH,mBAAmB,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAkHnF;;;;;OAKG;IACG,kBAAkB;IAkHxB;;OAEG;IACH,SAAS;IAIT;;OAEG;IACH,QAAQ;IAIR;;OAEG;IACH,WAAW;IAIX;;OAEG;IACH,WAAW;CAiJZ"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a deferred promise that does not report an unhandled rejection
|
|
3
|
+
* when it's rejected while nobody is waiting for it.
|
|
4
|
+
*/
|
|
5
|
+
export declare function createInstancePromise<T>(): PromiseWithResolvers<T>;
|
|
6
|
+
//# sourceMappingURL=create-instance-promise.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-instance-promise.d.ts","sourceRoot":"","sources":["../../../src/helpers/create-instance-promise.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,KAAK,oBAAoB,CAAC,CAAC,CAAC,CAMlE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qCAAqC,CAAC;AACpD,cAAc,OAAO,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/helpers/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qCAAqC,CAAC;AACpD,cAAc,OAAO,CAAC"}
|
data/npm_package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ckeditor5-rails",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.38.0",
|
|
4
4
|
"description": "CKEditor 5 integration for Rails Framework",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
"typecheck": "tsc --noEmit --pretty"
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"ckeditor5": "^
|
|
33
|
-
"ckeditor5-premium-features": "^
|
|
32
|
+
"ckeditor5": "^49.0.0",
|
|
33
|
+
"ckeditor5-premium-features": "^49.0.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"typescript": "^5.5.4",
|
|
@@ -27,8 +27,7 @@ RSpec.describe CKEditor5::Rails::Editor::Props do
|
|
|
27
27
|
type: 'ClassicEditor',
|
|
28
28
|
bundle: String,
|
|
29
29
|
plugins: String,
|
|
30
|
-
config: String
|
|
31
|
-
watchdog: true
|
|
30
|
+
config: String
|
|
32
31
|
)
|
|
33
32
|
end
|
|
34
33
|
|
|
@@ -49,14 +48,6 @@ RSpec.describe CKEditor5::Rails::Editor::Props do
|
|
|
49
48
|
expect(props.to_attributes[:'editable-height']).to eq('500px')
|
|
50
49
|
end
|
|
51
50
|
end
|
|
52
|
-
|
|
53
|
-
context 'with watchdog disabled' do
|
|
54
|
-
subject(:props) { described_class.new(type, config, bundle: bundle, watchdog: false) }
|
|
55
|
-
|
|
56
|
-
it 'includes watchdog: false in attributes' do
|
|
57
|
-
expect(props.to_attributes[:watchdog]).to be false
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
51
|
end
|
|
61
52
|
|
|
62
53
|
describe '.valid_editor_type?' do
|
|
@@ -39,8 +39,7 @@ RSpec.describe CKEditor5::Rails::Hooks::Form do
|
|
|
39
39
|
name: 'post[content]',
|
|
40
40
|
id: 'post_content',
|
|
41
41
|
type: 'ClassicEditor',
|
|
42
|
-
bundle: bundle_json
|
|
43
|
-
watchdog: 'true'
|
|
42
|
+
bundle: bundle_json
|
|
44
43
|
}
|
|
45
44
|
|
|
46
45
|
expect(rendered_editor).to have_tag('ckeditor-component', with: attrs)
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ckeditor5
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.38.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Mateusz Bagiński
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: bin
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2026-10-
|
|
12
|
+
date: 2026-10-11 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: rails
|
|
@@ -119,6 +119,8 @@ files:
|
|
|
119
119
|
- npm_package/dist/src/components/index.d.ts.map
|
|
120
120
|
- npm_package/dist/src/components/ui-part.d.ts
|
|
121
121
|
- npm_package/dist/src/components/ui-part.d.ts.map
|
|
122
|
+
- npm_package/dist/src/helpers/create-instance-promise.d.ts
|
|
123
|
+
- npm_package/dist/src/helpers/create-instance-promise.d.ts.map
|
|
122
124
|
- npm_package/dist/src/helpers/exec-if-dom-ready.d.ts
|
|
123
125
|
- npm_package/dist/src/helpers/exec-if-dom-ready.d.ts.map
|
|
124
126
|
- npm_package/dist/src/helpers/index.d.ts
|