ckeditor5-phoenix 1.20.0 → 1.22.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.
- package/dist/hooks/editor/plugins/sync-editor-with-phoenix.d.ts.map +1 -1
- package/dist/hooks/root-value-sentinel/index.d.ts +3 -0
- package/dist/hooks/root-value-sentinel/index.d.ts.map +1 -0
- package/dist/hooks/root-value-sentinel/root-attributes-updater.d.ts +16 -0
- package/dist/hooks/root-value-sentinel/root-attributes-updater.d.ts.map +1 -0
- package/dist/hooks/root-value-sentinel/root-value-sentinel.d.ts +2 -0
- package/dist/hooks/root-value-sentinel/root-value-sentinel.d.ts.map +1 -0
- package/dist/index.cjs +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +209 -182
- package/dist/index.mjs.map +1 -1
- package/dist/shared/index.d.ts +1 -0
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/parse-json-if-present.d.ts +10 -0
- package/dist/shared/parse-json-if-present.d.ts.map +1 -0
- package/package.json +2 -2
- package/src/hooks/editor/editor.test.ts +79 -0
- package/src/hooks/editor/plugins/sync-editor-with-phoenix.ts +18 -1
- package/src/hooks/root-value-sentinel/index.ts +2 -0
- package/src/hooks/root-value-sentinel/root-attributes-updater.ts +46 -0
- package/src/hooks/{root-value-sentinel.test.ts → root-value-sentinel/root-value-sentinel.test.ts} +102 -7
- package/src/hooks/{root-value-sentinel.ts → root-value-sentinel/root-value-sentinel.ts} +30 -16
- package/src/shared/index.ts +1 -0
- package/src/shared/parse-json-if-present.test.ts +25 -0
- package/src/shared/parse-json-if-present.ts +15 -0
- package/test-utils/editor/create-root-value-sentinel-element.ts +5 -0
- package/dist/hooks/root-value-sentinel.d.ts +0 -2
- package/dist/hooks/root-value-sentinel.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-editor-with-phoenix.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/plugins/sync-editor-with-phoenix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C;;;;;;;;;;GAUG;AACH,wBAAsB,iCAAiC,CAAC,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"sync-editor-with-phoenix.d.ts","sourceRoot":"","sources":["../../../../src/hooks/editor/plugins/sync-editor-with-phoenix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI3C;;;;;;;;;;GAUG;AACH,wBAAsB,iCAAiC,CAAC,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAsHlG;AAED,KAAK,KAAK,GAAG;IACX,QAAQ,EAAE,QAAQ,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE;QACN,MAAM,EAAE,OAAO,CAAC;QAChB,KAAK,EAAE,OAAO,CAAC;QACf,IAAI,EAAE,OAAO,CAAC;QACd,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACjD,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC;CACxE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/root-value-sentinel/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Editor } from 'ckeditor5';
|
|
2
|
+
/**
|
|
3
|
+
* Creates a function that synchronizes root attributes on the given editor root.
|
|
4
|
+
*
|
|
5
|
+
* The returned function tracks which attributes were set by itself and will only
|
|
6
|
+
* remove attributes it previously managed. This avoids interfering with other
|
|
7
|
+
* consumers that may also change attributes on the same root.
|
|
8
|
+
*
|
|
9
|
+
* @param editor The editor instance containing the root to manage.
|
|
10
|
+
* @param rootName The name of the root to manage attributes on.
|
|
11
|
+
* @returns A function that can be called with the desired set of attributes to apply them to the root.
|
|
12
|
+
* Calling the function with `null` or an empty object will clear all attributes previously set by it.
|
|
13
|
+
*/
|
|
14
|
+
export declare function createRootAttributesUpdater(editor: Editor, rootName: string): RootAttributesUpdater;
|
|
15
|
+
export type RootAttributesUpdater = (rootAttributes?: Record<string, unknown> | null) => void;
|
|
16
|
+
//# sourceMappingURL=root-attributes-updater.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-attributes-updater.d.ts","sourceRoot":"","sources":["../../../src/hooks/root-value-sentinel/root-attributes-updater.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC;;;;;;;;;;;GAWG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,qBAAqB,CA6BnG;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"root-value-sentinel.d.ts","sourceRoot":"","sources":["../../../src/hooks/root-value-sentinel/root-value-sentinel.ts"],"names":[],"mappings":"AA0IA,eAAO,MAAM,qBAAqB,kGAA8B,CAAC"}
|
package/dist/index.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
"use strict";var et=Object.create;var U=Object.defineProperty;var rt=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var it=Object.getPrototypeOf,nt=Object.prototype.hasOwnProperty;var ot=(i,t,e,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of at(t))!nt.call(i,n)&&n!==e&&U(i,n,{get:()=>t[n],enumerable:!(a=rt(t,n))||a.enumerable});return i};var r=(i,t,e)=>(e=i!=null?et(it(i)):{},ot(t||!i||!i.__esModule?U(e,"default",{value:i,enumerable:!0}):e,i));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class F{items=new Map;initializationErrors=new Map;pendingCallbacks=new Map;watchers=new Set;execute(t,e,a){const n=this.items.get(t),o=this.initializationErrors.get(t);return o?(a?.(o),Promise.reject(o)):n?Promise.resolve(e(n)):new Promise((s,l)=>{const c=this.getPendingCallbacks(t);c.success.push(async u=>{s(await e(u))}),a?c.error.push(a):c.error.push(l)})}register(t,e){if(this.items.has(t))throw new Error(`Item with ID "${t}" is already registered.`);this.resetErrors(t),this.items.set(t,e);const a=this.pendingCallbacks.get(t);a&&(a.success.forEach(n=>n(e)),this.pendingCallbacks.delete(t)),this.registerAsDefault(t,e),this.notifyWatchers()}error(t,e){this.items.delete(t),this.initializationErrors.set(t,e);const a=this.pendingCallbacks.get(t);a&&(a.error.forEach(n=>n(e)),this.pendingCallbacks.delete(t)),this.initializationErrors.size===1&&!this.items.size&&this.error(null,e),this.notifyWatchers()}resetErrors(t){const{initializationErrors:e}=this;e.has(null)&&e.get(null)===e.get(t)&&e.delete(null),e.delete(t)}unregister(t){if(!this.items.has(t))throw new Error(`Item with ID "${t}" is not registered.`);t&&this.items.get(null)===this.items.get(t)&&this.unregister(null),this.items.delete(t),this.pendingCallbacks.delete(t),this.notifyWatchers()}getItems(){return Array.from(this.items.values())}hasItem(t){return this.items.has(t)}waitFor(t){return new Promise((e,a)=>{this.execute(t,e,a)})}async destroyAll(){const t=Array.from(new Set(this.items.values())).map(e=>e.destroy());this.items.clear(),this.pendingCallbacks.clear(),await Promise.all(t),this.notifyWatchers()}watch(t){return this.watchers.add(t),t(new Map(this.items),new Map(this.initializationErrors)),this.unwatch.bind(this,t)}unwatch(t){this.watchers.delete(t)}notifyWatchers(){this.watchers.forEach(t=>t(new Map(this.items),new Map(this.initializationErrors)))}getPendingCallbacks(t){let e=this.pendingCallbacks.get(t);return e||(e={success:[],error:[]},this.pendingCallbacks.set(t,e)),e}registerAsDefault(t,e){this.items.size===1&&t!==null&&this.register(null,e)}}function st(i){return i.replace(/[-_\s]+(.)?/g,(t,e)=>e?e.toUpperCase():"").replace(/^./,t=>t.toLowerCase())}function $(i,t){let e=null;return(...a)=>{e&&clearTimeout(e),e=setTimeout(()=>{t(...a)},i)}}function ct(i){if(Object.prototype.toString.call(i)!=="[object Object]")return!1;const t=Object.getPrototypeOf(i);return t===Object.prototype||t===null}function x(i){if(Array.isArray(i))return i.map(x);if(ct(i)){const t=Object.create(null);for(const[e,a]of Object.entries(i))t[st(e)]=x(a);return t}return i}function ut(i,t){const e=Object.entries(i).filter(([a,n])=>t(n,a));return Object.fromEntries(e)}function lt(){const i=document.querySelector('meta[name="csrf-token"]');if(i)return i.getAttribute("content");const t=document.cookie.match(/(?:^|; )_csrf_token=([^;]*)/);return t?decodeURIComponent(t[1]):null}class v{state="mounting";el;_beforeDestroyCallbacks=[];onBeforeDestroy(t){this._beforeDestroyCallbacks.push(t)}pushEvent;pushEventTo;handleEvent;mounted(){}destroyed(){}updated(){}isBeingDestroyed(){return this.state==="destroyed"||this.state==="destroying"}_runBeforeDestroyCallbacks(){for(const t of this._beforeDestroyCallbacks.reverse())t();this._beforeDestroyCallbacks=[]}}function C(i){return{async mounted(){const t=new i;this.el.instance=t,t.el=this.el,t.pushEvent=(a,n,o)=>this.pushEvent?.(a,n,o),t.pushEventTo=(a,n,o,s)=>this.pushEventTo?.(a,n,o,s),t.handleEvent=(a,n)=>this.handleEvent?.(a,n),t.state="mounting";const e=await t.mounted?.();return t.state="mounted",e},beforeUpdate(){this.el.instance.beforeUpdate?.()},async destroyed(){const{instance:t}=this.el;t.state="destroying",t._runBeforeDestroyCallbacks(),await t.destroyed?.(),t.state="destroyed"},disconnected(){this.el.instance.disconnected?.()},reconnected(){this.el.instance.reconnected?.()},updated(){this.el.instance.updated?.()}}}function B(i){return Object.keys(i).length===0&&i.constructor===Object}function dt(i){return i==null}function j(i,t){const e=Object.entries(i).map(([a,n])=>[a,t(n,a)]);return Object.fromEntries(e)}function N(i){if(i===null)return null;const t=Number.parseInt(i,10);return Number.isNaN(t)?null:t}function mt(i,t){if(i===t)return!0;const e=Object.keys(i),a=Object.keys(t);if(e.length!==a.length)return!1;for(const n of e)if(i[n]!==t[n]||!Object.prototype.hasOwnProperty.call(t,n))return!1;return!0}function ht(){return Math.random().toString(36).substring(2)}function pt(i,{timeOutAfter:t=500,retryAfter:e=100}={}){return new Promise((a,n)=>{const o=Date.now();let s=null;const l=setTimeout(()=>{n(s??new Error("Timeout"))},t),c=async()=>{try{const u=await i();clearTimeout(l),a(u)}catch(u){s=u,Date.now()-o>t?n(u):setTimeout(c,e)}};c()})}const V=Symbol.for("context-editor-watchdog");async function ft({element:i,context:t,creator:e,config:a}){const n=ht();await t.add({creator:(c,u)=>e.create(c,u),id:n,sourceElementOrData:i,type:"editor",config:a});const o=t.getItem(n),s={state:"available",editorContextId:n,context:t};o[V]=s;const l=t.destroy.bind(t);return t.destroy=async()=>(s.state="unavailable",l()),{...s,editor:o}}function K(i){return V in i?i[V]:null}function T(i){return["inline","classic","balloon","decoupled"].includes(i)}async function wt(i){const t=await import("ckeditor5"),a={inline:t.InlineEditor,balloon:t.BalloonEditor,classic:t.ClassicEditor,decoupled:t.DecoupledEditor,multiroot:t.MultiRootEditor}[i];if(!a)throw new Error(`Unsupported editor type: ${i}`);return a}class O{static the=new O;plugins=new Map;constructor(){}register(t,e){if(this.plugins.has(t))throw new Error(`Plugin with name "${t}" is already registered.`);return this.plugins.set(t,e),this.unregister.bind(this,t)}unregister(t){if(!this.plugins.has(t))throw new Error(`Plugin with name "${t}" is not registered.`);this.plugins.delete(t)}unregisterAll(){this.plugins.clear()}async get(t){return this.plugins.get(t)?.()}has(t){return this.plugins.has(t)}}async function L(i){const t=await import("ckeditor5");let e=null;const a=i.map(async n=>{const o=await O.the.get(n);if(o)return o;const{[n]:s}=t;if(s)return s;if(!e)try{e=await import("ckeditor5-premium-features")}catch(c){console.error(`Failed to load premium package: ${c}`)}const{[n]:l}=e||{};if(l)return l;throw new Error(`Plugin "${n}" not found in base or premium packages.`)});return{loadedPlugins:await Promise.all(a),hasPremium:!!e}}async function G(i,t){const e=[i.ui,i.content];return await Promise.all([W("ckeditor5",e),t&&W("ckeditor5-premium-features",e)].filter(n=>!!n)).then(n=>n.flat())}async function W(i,t){return await Promise.all(t.filter(e=>e!=="en").map(async e=>{const a=await gt(i,e);return a?.default??a}).filter(Boolean))}async function gt(i,t){try{if(i==="ckeditor5")switch(t){case"af":return await import("ckeditor5/translations/af.js");case"ar":return await import("ckeditor5/translations/ar.js");case"ast":return await import("ckeditor5/translations/ast.js");case"az":return await import("ckeditor5/translations/az.js");case"bg":return await import("ckeditor5/translations/bg.js");case"bn":return await import("ckeditor5/translations/bn.js");case"bs":return await import("ckeditor5/translations/bs.js");case"ca":return await import("ckeditor5/translations/ca.js");case"cs":return await import("ckeditor5/translations/cs.js");case"da":return await import("ckeditor5/translations/da.js");case"de":return await import("ckeditor5/translations/de.js");case"de-ch":return await import("ckeditor5/translations/de-ch.js");case"el":return await import("ckeditor5/translations/el.js");case"en":return await import("ckeditor5/translations/en.js");case"en-au":return await import("ckeditor5/translations/en-au.js");case"en-gb":return await import("ckeditor5/translations/en-gb.js");case"eo":return await import("ckeditor5/translations/eo.js");case"es":return await import("ckeditor5/translations/es.js");case"es-co":return await import("ckeditor5/translations/es-co.js");case"et":return await import("ckeditor5/translations/et.js");case"eu":return await import("ckeditor5/translations/eu.js");case"fa":return await import("ckeditor5/translations/fa.js");case"fi":return await import("ckeditor5/translations/fi.js");case"fr":return await import("ckeditor5/translations/fr.js");case"gl":return await import("ckeditor5/translations/gl.js");case"gu":return await import("ckeditor5/translations/gu.js");case"he":return await import("ckeditor5/translations/he.js");case"hi":return await import("ckeditor5/translations/hi.js");case"hr":return await import("ckeditor5/translations/hr.js");case"hu":return await import("ckeditor5/translations/hu.js");case"hy":return await import("ckeditor5/translations/hy.js");case"id":return await import("ckeditor5/translations/id.js");case"it":return await import("ckeditor5/translations/it.js");case"ja":return await import("ckeditor5/translations/ja.js");case"jv":return await import("ckeditor5/translations/jv.js");case"kk":return await import("ckeditor5/translations/kk.js");case"km":return await import("ckeditor5/translations/km.js");case"kn":return await import("ckeditor5/translations/kn.js");case"ko":return await import("ckeditor5/translations/ko.js");case"ku":return await import("ckeditor5/translations/ku.js");case"lt":return await import("ckeditor5/translations/lt.js");case"lv":return await import("ckeditor5/translations/lv.js");case"ms":return await import("ckeditor5/translations/ms.js");case"nb":return await import("ckeditor5/translations/nb.js");case"ne":return await import("ckeditor5/translations/ne.js");case"nl":return await import("ckeditor5/translations/nl.js");case"no":return await import("ckeditor5/translations/no.js");case"oc":return await import("ckeditor5/translations/oc.js");case"pl":return await import("ckeditor5/translations/pl.js");case"pt":return await import("ckeditor5/translations/pt.js");case"pt-br":return await import("ckeditor5/translations/pt-br.js");case"ro":return await import("ckeditor5/translations/ro.js");case"ru":return await import("ckeditor5/translations/ru.js");case"si":return await import("ckeditor5/translations/si.js");case"sk":return await import("ckeditor5/translations/sk.js");case"sl":return await import("ckeditor5/translations/sl.js");case"sq":return await import("ckeditor5/translations/sq.js");case"sr":return await import("ckeditor5/translations/sr.js");case"sr-latn":return await import("ckeditor5/translations/sr-latn.js");case"sv":return await import("ckeditor5/translations/sv.js");case"th":return await import("ckeditor5/translations/th.js");case"tk":return await import("ckeditor5/translations/tk.js");case"tr":return await import("ckeditor5/translations/tr.js");case"tt":return await import("ckeditor5/translations/tt.js");case"ug":return await import("ckeditor5/translations/ug.js");case"uk":return await import("ckeditor5/translations/uk.js");case"ur":return await import("ckeditor5/translations/ur.js");case"uz":return await import("ckeditor5/translations/uz.js");case"vi":return await import("ckeditor5/translations/vi.js");case"zh":return await import("ckeditor5/translations/zh.js");case"zh-cn":return await import("ckeditor5/translations/zh-cn.js");default:return console.warn(`Language ${t} not found in ckeditor5 translations`),null}else switch(t){case"af":return await import("ckeditor5-premium-features/translations/af.js");case"ar":return await import("ckeditor5-premium-features/translations/ar.js");case"ast":return await import("ckeditor5-premium-features/translations/ast.js");case"az":return await import("ckeditor5-premium-features/translations/az.js");case"bg":return await import("ckeditor5-premium-features/translations/bg.js");case"bn":return await import("ckeditor5-premium-features/translations/bn.js");case"bs":return await import("ckeditor5-premium-features/translations/bs.js");case"ca":return await import("ckeditor5-premium-features/translations/ca.js");case"cs":return await import("ckeditor5-premium-features/translations/cs.js");case"da":return await import("ckeditor5-premium-features/translations/da.js");case"de":return await import("ckeditor5-premium-features/translations/de.js");case"de-ch":return await import("ckeditor5-premium-features/translations/de-ch.js");case"el":return await import("ckeditor5-premium-features/translations/el.js");case"en":return await import("ckeditor5-premium-features/translations/en.js");case"en-au":return await import("ckeditor5-premium-features/translations/en-au.js");case"en-gb":return await import("ckeditor5-premium-features/translations/en-gb.js");case"eo":return await import("ckeditor5-premium-features/translations/eo.js");case"es":return await import("ckeditor5-premium-features/translations/es.js");case"es-co":return await import("ckeditor5-premium-features/translations/es-co.js");case"et":return await import("ckeditor5-premium-features/translations/et.js");case"eu":return await import("ckeditor5-premium-features/translations/eu.js");case"fa":return await import("ckeditor5-premium-features/translations/fa.js");case"fi":return await import("ckeditor5-premium-features/translations/fi.js");case"fr":return await import("ckeditor5-premium-features/translations/fr.js");case"gl":return await import("ckeditor5-premium-features/translations/gl.js");case"gu":return await import("ckeditor5-premium-features/translations/gu.js");case"he":return await import("ckeditor5-premium-features/translations/he.js");case"hi":return await import("ckeditor5-premium-features/translations/hi.js");case"hr":return await import("ckeditor5-premium-features/translations/hr.js");case"hu":return await import("ckeditor5-premium-features/translations/hu.js");case"hy":return await import("ckeditor5-premium-features/translations/hy.js");case"id":return await import("ckeditor5-premium-features/translations/id.js");case"it":return await import("ckeditor5-premium-features/translations/it.js");case"ja":return await import("ckeditor5-premium-features/translations/ja.js");case"jv":return await import("ckeditor5-premium-features/translations/jv.js");case"kk":return await import("ckeditor5-premium-features/translations/kk.js");case"km":return await import("ckeditor5-premium-features/translations/km.js");case"kn":return await import("ckeditor5-premium-features/translations/kn.js");case"ko":return await import("ckeditor5-premium-features/translations/ko.js");case"ku":return await import("ckeditor5-premium-features/translations/ku.js");case"lt":return await import("ckeditor5-premium-features/translations/lt.js");case"lv":return await import("ckeditor5-premium-features/translations/lv.js");case"ms":return await import("ckeditor5-premium-features/translations/ms.js");case"nb":return await import("ckeditor5-premium-features/translations/nb.js");case"ne":return await import("ckeditor5-premium-features/translations/ne.js");case"nl":return await import("ckeditor5-premium-features/translations/nl.js");case"no":return await import("ckeditor5-premium-features/translations/no.js");case"oc":return await import("ckeditor5-premium-features/translations/oc.js");case"pl":return await import("ckeditor5-premium-features/translations/pl.js");case"pt":return await import("ckeditor5-premium-features/translations/pt.js");case"pt-br":return await import("ckeditor5-premium-features/translations/pt-br.js");case"ro":return await import("ckeditor5-premium-features/translations/ro.js");case"ru":return await import("ckeditor5-premium-features/translations/ru.js");case"si":return await import("ckeditor5-premium-features/translations/si.js");case"sk":return await import("ckeditor5-premium-features/translations/sk.js");case"sl":return await import("ckeditor5-premium-features/translations/sl.js");case"sq":return await import("ckeditor5-premium-features/translations/sq.js");case"sr":return await import("ckeditor5-premium-features/translations/sr.js");case"sr-latn":return await import("ckeditor5-premium-features/translations/sr-latn.js");case"sv":return await import("ckeditor5-premium-features/translations/sv.js");case"th":return await import("ckeditor5-premium-features/translations/th.js");case"tk":return await import("ckeditor5-premium-features/translations/tk.js");case"tr":return await import("ckeditor5-premium-features/translations/tr.js");case"tt":return await import("ckeditor5-premium-features/translations/tt.js");case"ug":return await import("ckeditor5-premium-features/translations/ug.js");case"uk":return await import("ckeditor5-premium-features/translations/uk.js");case"ur":return await import("ckeditor5-premium-features/translations/ur.js");case"uz":return await import("ckeditor5-premium-features/translations/uz.js");case"vi":return await import("ckeditor5-premium-features/translations/vi.js");case"zh":return await import("ckeditor5-premium-features/translations/zh.js");case"zh-cn":return await import("ckeditor5-premium-features/translations/zh-cn.js");default:return console.warn(`Language ${t} not found in premium translations`),await import("ckeditor5-premium-features/translations/en.js")}}catch(e){return console.error(`Failed to load translation for ${i}/${t}:`,e),null}}function Y(i){return j(i,t=>({dictionary:t}))}function J(i){const t=X(i);return j(t,({content:e})=>e)}function _(i){const t=X(i),e=j(t,({initialValue:a})=>a);return ut(e,a=>typeof a=="string")}function X(i){const t=document.querySelectorAll([`[data-cke-editor-id="${i}"][data-cke-editable-root-name]`,"[data-cke-editable-root-name]:not([data-cke-editor-id])"].join(", ")),e=Array.from(t).reduce((l,c)=>{const u=c.getAttribute("data-cke-editable-root-name"),d=c.getAttribute("data-cke-editable-initial-value")||"",h=c.querySelector("[data-cke-editable-content]");return!u||!h?l:{...l,[u]:{content:h,initialValue:d}}},Object.create({})),a=document.querySelector(`[phx-hook="CKEditor5"][id="${i}"]`);if(!a)return e;const n=a.getAttribute("data-cke-initial-value")||"",o=a.querySelector(`#${i}_editor `),s=e.main;return s?{...e,main:{...s,initialValue:s.initialValue||n}}:o?{...e,main:{content:o,initialValue:n}}:e}const q=["inline","classic","balloon","decoupled","multiroot"];function yt(i){const t=i.getAttribute("data-cke-preset");if(!t)throw new Error('CKEditor5 hook requires a "cke-preset" attribute on the element.');const{type:e,config:a,license:n,...o}=JSON.parse(t);if(!e||!a||!n)throw new Error('CKEditor5 hook configuration must include "editor", "config", and "license" properties.');if(!q.includes(e))throw new Error(`Invalid editor type: ${e}. Must be one of: ${q.join(", ")}.`);return{type:e,license:n,config:x(a),customTranslations:o.customTranslations||o.custom_translations}}function I(i){if(!i||typeof i!="object")return i;if(Array.isArray(i))return i.map(a=>I(a));const t=i;if(t.$element&&typeof t.$element=="string"){const a=document.querySelector(t.$element);return a||console.warn(`Element not found for selector: ${t.$element}`),a||null}const e=Object.create(null);for(const[a,n]of Object.entries(i))e[a]=I(n);return e}function A(i,t,e){if(!e||typeof e!="object")return e;if(Array.isArray(e))return e.map(o=>A(i,t,o));const a=e;if(a.$translation&&typeof a.$translation=="string"){const o=a.$translation,s=bt(i,o,t);return s===void 0&&console.warn(`Translation not found for key: ${o}`),s!==void 0?s:null}const n=Object.create(null);for(const[o,s]of Object.entries(e))n[o]=A(i,t,s);return n}function bt(i,t,e){for(const a of i){const n=a[e];if(n?.dictionary&&t in n.dictionary)return n.dictionary[t]}}function kt(i,t){const{editing:e}=i;e.view.change(a=>{a.setStyle("height",`${t}px`,e.view.document.getRoot())})}const R=Symbol.for("elixir-editor-watchdog");async function Et(i){const{EditorWatchdog:t}=await import("ckeditor5"),e=new t(i);return e.setCreator(async(...a)=>{const n=await i.create(...a);return n[R]=e,n}),{watchdog:e,Constructor:{create:async(...a)=>(await e.create(...a),e.editor)}}}function Q(i){return R in i?i[R]:null}class w extends F{static the=new w}function Pt(i){const t=i.getAttribute("data-cke-context");if(!t)throw new Error('CKEditor5 hook requires a "data-cke-context" attribute on the element.');const{config:e,...a}=JSON.parse(t);return{config:x(e),customTranslations:a.customTranslations||a.custom_translations,watchdogConfig:a.watchdogConfig||a.watchdog_config}}class vt extends v{contextPromise=null;get attrs(){const t=a=>this.el.getAttribute(a)||null,e={id:this.el.id,config:Pt(this.el),language:{ui:t("data-cke-language")||"en",content:t("data-cke-content-language")||"en"}};return Object.defineProperty(this,"attrs",{value:e,writable:!1,configurable:!1,enumerable:!0}),e}async mounted(){const{id:t,language:e}=this.attrs,{customTranslations:a,watchdogConfig:n,config:{plugins:o,...s}}=this.attrs.config,{loadedPlugins:l,hasPremium:c}=await L(o??[]),d=[...await G(e,c),Y(a?.dictionary||{})].filter(k=>!B(k));let h=I(s);h=A([...d].reverse(),e.ui,h),this.contextPromise=(async()=>{const{ContextWatchdog:k,Context:y}=await import("ckeditor5"),g=new k(y,{crashNumberLimit:10,...n});return await g.create({...h,language:e,plugins:l,...d.length&&{translations:d}}),g.on("itemError",(...E)=>{console.error("Context item error:",...E)}),g})();const f=await this.contextPromise;this.isBeingDestroyed()||w.the.register(t,f)}async destroyed(){const{id:t}=this.attrs;this.el.style.display="none";try{await(await this.contextPromise)?.destroy()}finally{this.contextPromise=null,w.the.hasItem(t)&&w.the.unregister(t)}}}function Ct(i){return i.hasAttribute("data-cke-context")}function Tt(i){let t=i;for(;t;){if(Ct(t))return t;t=t.parentElement}return null}async function xt(i){const t=Tt(i);return t?w.the.waitFor(t.id):null}const It=C(vt);class p extends F{static the=new p}class At extends v{editorPromise=null;get attrs(){const t={editableId:this.el.getAttribute("id"),editorId:this.el.getAttribute("data-cke-editor-id")||null,rootName:this.el.getAttribute("data-cke-editable-root-name"),initialValue:this.el.getAttribute("data-cke-editable-initial-value")||""};return Object.defineProperty(this,"attrs",{value:t,writable:!1,configurable:!1,enumerable:!0}),t}async mounted(){const{editableId:t,editorId:e,rootName:a,initialValue:n}=this.attrs,o=this.el.querySelector(`#${t}_input`);this.editorPromise=p.the.execute(e,s=>{if(this.isBeingDestroyed())return null;const{ui:l,editing:c,model:u}=s;if(u.document.getRoot(a))return s;s.addRoot(a,{isUndoable:!1,data:n});const d=this.el.querySelector("[data-cke-editable-content]"),h=l.view.createEditable(a,d);if(l.addEditable(h),c.view.forceRender(),o){const f=Dt(o,s,a);this.onBeforeDestroy(f)}return s})}async destroyed(){const{rootName:t}=this.attrs;this.el.style.display="none";const e=await this.editorPromise;if(this.editorPromise=null,e&&e.state!=="destroyed"){const a=e.model.document.getRoot(t);a&&"detachEditable"in e&&(e.ui.view.editables[t]&&e.detachEditable(a),a.isAttached()&&e.detachRoot(t,!1))}}}const Ot=C(At);function Dt(i,t,e){const a=()=>{i.value=t.getData({rootName:e})},n=$(200,a);return t.model.document.on("change:data",n),a(),()=>{t.model.document.off("change:data",n)}}async function St(){const{Plugin:i,FileRepository:t}=await import("ckeditor5");return class extends i{static get pluginName(){return"PhoenixUploadAdapter"}static get requires(){return[t]}init(){const{editor:a}=this,{plugins:n,config:o}=a,s=o.get("phoenixUpload.url");if(!s||n.has("SimpleUploadAdapter")||n.has("Base64UploadAdapter")||n.has("CKFinderUploadAdapter"))return;const l=n.get(t);l.createUploadAdapter=c=>new Vt(c,s)}}}class Vt{loader;uploadUrl;abortController=null;constructor(t,e){this.loader=t,this.uploadUrl=e}async upload(){const t=await this.loader.file;this.abortController=new AbortController;const e=new FormData;e.append("file",t),t.size&&(this.loader.uploadTotal=t.size,this.loader.uploaded=0);const a={},n=lt();n&&(a["X-CSRF-Token"]=n);try{const o=await fetch(this.uploadUrl,{method:"POST",headers:a,body:e,signal:this.abortController.signal});if(!o.ok){let l="Couldn't upload file!";try{const c=await o.json();c?.error?.message&&(l=c.error.message)}catch{}throw new Error(l)}return this.loader.uploaded=this.loader.uploadTotal,{default:(await o.json()).url}}catch(o){throw o.name==="AbortError"?o:o.message||"Couldn't upload file!"}}abort(){this.abortController?.abort(),this.abortController=null}}async function Rt({editorId:i,saveDebounceMs:t}){const{Plugin:e}=await import("ckeditor5");return class extends e{input=null;form=null;static get pluginName(){return"SyncEditorWithInput"}afterInit(){const{editor:n}=this;this.input=document.getElementById(`${i}_input`),this.input&&(n.model.document.on("change:data",$(t,()=>this.sync())),n.once("ready",this.sync),this.form=this.input.closest("form"),this.form?.addEventListener("submit",this.sync))}sync=()=>{const n=this.editor.getData();this.input.value=n,this.input.dispatchEvent(new Event("input",{bubbles:!0}))};destroy(){this.form&&this.form.removeEventListener("submit",this.sync),this.input=null,this.form=null}}}async function $t(i){const{Plugin:t}=await import("ckeditor5"),{editorId:e,saveDebounceMs:a,events:n,pushEvent:o,handleEvent:s}=i;return class extends t{static get pluginName(){return"SyncEditorWithPhoenix"}init(){const{editor:c}=this;n.change&&this.setupTypingContentPush(),n.blur&&this.setupEventPush("blur"),n.focus&&this.setupEventPush("focus"),n.ready&&this.editor.once("ready",()=>{o("ckeditor5:ready",{editorId:e,data:S(c)})}),s("ckeditor5:set-data",({editorId:u,data:d})=>{(dt(u)||u===e)&&c.setData(d)})}setupTypingContentPush(){const{editor:c}=this;let u=null;const d=()=>{const f=S(c);(!u||!mt(u,f))&&(o("ckeditor5:change",{editorId:e,data:f}),u=f)},h=$(a,d);c.model.document.on("change:data",h),c.once("ready",d)}setupEventPush(c){const{editor:u}=this,d=()=>{const{isFocused:h}=u.ui.focusTracker;(h?"focus":"blur")===c&&o(`ckeditor5:${c}`,{editorId:e,data:S(u)})};u.ui.focusTracker.on("change:isFocused",d)}}}function S(i){return i.model.document.getRootNames().reduce((e,a)=>(e[a]=i.getData({rootName:a}),e),Object.create({}))}class jt extends v{editorPromise=null;get attrs(){const{el:t}=this,e=t.getAttribute.bind(t),a=t.hasAttribute.bind(t),n={editorId:e("id"),contextId:e("data-cke-context-id"),preset:yt(t),editableHeight:N(e("data-cke-editable-height")),watchdog:a("data-cke-watchdog"),events:{change:a("data-cke-change-event"),blur:a("data-cke-blur-event"),focus:a("data-cke-focus-event"),ready:a("data-cke-ready-event")},saveDebounceMs:N(e("data-cke-save-debounce-ms"))??400,language:{ui:e("data-cke-language")||"en",content:e("data-cke-content-language")||"en"}};return Object.defineProperty(this,"attrs",{value:n,writable:!1,configurable:!1,enumerable:!0}),n}async mounted(){const{editorId:t}=this.attrs;p.the.resetErrors(t);try{this.editorPromise=this.createEditor();const e=await this.editorPromise;this.isBeingDestroyed()||(p.the.register(t,e),e.once("destroy",()=>{p.the.hasItem(t)&&p.the.unregister(t)}))}catch(e){this.editorPromise=null,p.the.error(t,e)}return this}async destroyed(){this.el.style.display="none";try{const t=await this.editorPromise;if(!t)return;const e=K(t),a=Q(t);e?e.state!=="unavailable"&&await e.context.remove(e.editorContextId):a?await a.destroy():await t.destroy()}finally{this.editorPromise=null}}async createEditor(){const{preset:t,editorId:e,contextId:a,editableHeight:n,events:o,saveDebounceMs:s,language:l,watchdog:c}=this.attrs,{customTranslations:u,type:d,license:h,config:{plugins:f,...k}}=t;let y=await wt(d);const g=await(a?w.the.waitFor(a):xt(this.el));if(c&&!g){const m=await Et(y);({Constructor:y}=m),m.watchdog.on("restart",()=>{const b=m.watchdog.editor;this.editorPromise=Promise.resolve(b),p.the.register(e,b)})}const{loadedPlugins:E,hasPremium:tt}=await L(f);T(d)&&E.push(await Rt({editorId:e,saveDebounceMs:s})),E.push(...await Promise.all([$t({editorId:e,saveDebounceMs:s,events:o,pushEvent:this.pushEvent.bind(this),handleEvent:this.handleEvent.bind(this)}),St()]));const D=[...await G(l,tt),Y(u?.dictionary||{})].filter(m=>!B(m));let P=_(e);T(d)&&(P=P.main||"");const M=await(async()=>{let m=J(e);if(!(m instanceof HTMLElement)&&!("main"in m)){const z=d==="decoupled"?["main"]:Object.keys(P);Z(m,z)||(m=await Mt(e,z),P=_(e))}T(d)&&"main"in m&&(m=m.main);let b=I(k);b=A([...D].reverse(),l.ui,b);const H={...b,initialData:P,licenseKey:h.key,plugins:E,language:l,...D.length&&{translations:D}};return!g||!(m instanceof HTMLElement)?y.create(m,H):(await ft({context:g,element:m,creator:y,config:H})).editor})();return T(d)&&n&&kt(M,n),M}}function Z(i,t){return t.every(e=>i[e])}async function Mt(i,t){return pt(()=>{const e=J(i);if(!Z(e,t))throw new Error(`It looks like not all required root elements are present yet.
|
|
1
|
+
"use strict";var et=Object.create;var z=Object.defineProperty;var rt=Object.getOwnPropertyDescriptor;var at=Object.getOwnPropertyNames;var it=Object.getPrototypeOf,nt=Object.prototype.hasOwnProperty;var ot=(a,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of at(t))!nt.call(a,n)&&n!==e&&z(a,n,{get:()=>t[n],enumerable:!(i=rt(t,n))||i.enumerable});return a};var r=(a,t,e)=>(e=a!=null?et(it(a)):{},ot(t||!a||!a.__esModule?z(e,"default",{value:a,enumerable:!0}):e,a));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});class _{items=new Map;initializationErrors=new Map;pendingCallbacks=new Map;watchers=new Set;execute(t,e,i){const n=this.items.get(t),o=this.initializationErrors.get(t);return o?(i?.(o),Promise.reject(o)):n?Promise.resolve(e(n)):new Promise((s,u)=>{const c=this.getPendingCallbacks(t);c.success.push(async l=>{s(await e(l))}),i?c.error.push(i):c.error.push(u)})}register(t,e){if(this.items.has(t))throw new Error(`Item with ID "${t}" is already registered.`);this.resetErrors(t),this.items.set(t,e);const i=this.pendingCallbacks.get(t);i&&(i.success.forEach(n=>n(e)),this.pendingCallbacks.delete(t)),this.registerAsDefault(t,e),this.notifyWatchers()}error(t,e){this.items.delete(t),this.initializationErrors.set(t,e);const i=this.pendingCallbacks.get(t);i&&(i.error.forEach(n=>n(e)),this.pendingCallbacks.delete(t)),this.initializationErrors.size===1&&!this.items.size&&this.error(null,e),this.notifyWatchers()}resetErrors(t){const{initializationErrors:e}=this;e.has(null)&&e.get(null)===e.get(t)&&e.delete(null),e.delete(t)}unregister(t){if(!this.items.has(t))throw new Error(`Item with ID "${t}" is not registered.`);t&&this.items.get(null)===this.items.get(t)&&this.unregister(null),this.items.delete(t),this.pendingCallbacks.delete(t),this.notifyWatchers()}getItems(){return Array.from(this.items.values())}hasItem(t){return this.items.has(t)}waitFor(t){return new Promise((e,i)=>{this.execute(t,e,i)})}async destroyAll(){const t=Array.from(new Set(this.items.values())).map(e=>e.destroy());this.items.clear(),this.pendingCallbacks.clear(),await Promise.all(t),this.notifyWatchers()}watch(t){return this.watchers.add(t),t(new Map(this.items),new Map(this.initializationErrors)),this.unwatch.bind(this,t)}unwatch(t){this.watchers.delete(t)}notifyWatchers(){this.watchers.forEach(t=>t(new Map(this.items),new Map(this.initializationErrors)))}getPendingCallbacks(t){let e=this.pendingCallbacks.get(t);return e||(e={success:[],error:[]},this.pendingCallbacks.set(t,e)),e}registerAsDefault(t,e){this.items.size===1&&t!==null&&this.register(null,e)}}function st(a){return a.replace(/[-_\s]+(.)?/g,(t,e)=>e?e.toUpperCase():"").replace(/^./,t=>t.toLowerCase())}function $(a,t){let e=null;return(...i)=>{e&&clearTimeout(e),e=setTimeout(()=>{t(...i)},a)}}function ct(a){if(Object.prototype.toString.call(a)!=="[object Object]")return!1;const t=Object.getPrototypeOf(a);return t===Object.prototype||t===null}function A(a){if(Array.isArray(a))return a.map(A);if(ct(a)){const t=Object.create(null);for(const[e,i]of Object.entries(a))t[st(e)]=A(i);return t}return a}function ut(a,t){const e=Object.entries(a).filter(([i,n])=>t(n,i));return Object.fromEntries(e)}function lt(){const a=document.querySelector('meta[name="csrf-token"]');if(a)return a.getAttribute("content");const t=document.cookie.match(/(?:^|; )_csrf_token=([^;]*)/);return t?decodeURIComponent(t[1]):null}class P{state="mounting";el;_beforeDestroyCallbacks=[];onBeforeDestroy(t){this._beforeDestroyCallbacks.push(t)}pushEvent;pushEventTo;handleEvent;mounted(){}destroyed(){}updated(){}isBeingDestroyed(){return this.state==="destroyed"||this.state==="destroying"}_runBeforeDestroyCallbacks(){for(const t of this._beforeDestroyCallbacks.reverse())t();this._beforeDestroyCallbacks=[]}}function C(a){return{async mounted(){const t=new a;this.el.instance=t,t.el=this.el,t.pushEvent=(i,n,o)=>this.pushEvent?.(i,n,o),t.pushEventTo=(i,n,o,s)=>this.pushEventTo?.(i,n,o,s),t.handleEvent=(i,n)=>this.handleEvent?.(i,n),t.state="mounting";const e=await t.mounted?.();return t.state="mounted",e},beforeUpdate(){this.el.instance.beforeUpdate?.()},async destroyed(){const{instance:t}=this.el;t.state="destroying",t._runBeforeDestroyCallbacks(),await t.destroyed?.(),t.state="destroyed"},disconnected(){this.el.instance.disconnected?.()},reconnected(){this.el.instance.reconnected?.()},updated(){this.el.instance.updated?.()}}}function B(a){return Object.keys(a).length===0&&a.constructor===Object}function dt(a){return a==null}function U(a,t){const e=Object.entries(a).map(([i,n])=>[i,t(n,i)]);return Object.fromEntries(e)}function N(a){if(a===null)return null;const t=Number.parseInt(a,10);return Number.isNaN(t)?null:t}function mt(a){return a==null||a.trim()===""?null:JSON.parse(a)}function ht(a,t){if(a===t)return!0;const e=Object.keys(a),i=Object.keys(t);if(e.length!==i.length)return!1;for(const n of e)if(a[n]!==t[n]||!Object.prototype.hasOwnProperty.call(t,n))return!1;return!0}function pt(){return Math.random().toString(36).substring(2)}function ft(a,{timeOutAfter:t=500,retryAfter:e=100}={}){return new Promise((i,n)=>{const o=Date.now();let s=null;const u=setTimeout(()=>{n(s??new Error("Timeout"))},t),c=async()=>{try{const l=await a();clearTimeout(u),i(l)}catch(l){s=l,Date.now()-o>t?n(l):setTimeout(c,e)}};c()})}const V=Symbol.for("context-editor-watchdog");async function wt({element:a,context:t,creator:e,config:i}){const n=pt();await t.add({creator:(c,l)=>e.create(c,l),id:n,sourceElementOrData:a,type:"editor",config:i});const o=t.getItem(n),s={state:"available",editorContextId:n,context:t};o[V]=s;const u=t.destroy.bind(t);return t.destroy=async()=>(s.state="unavailable",u()),{...s,editor:o}}function K(a){return V in a?a[V]:null}function T(a){return["inline","classic","balloon","decoupled"].includes(a)}async function gt(a){const t=await import("ckeditor5"),i={inline:t.InlineEditor,balloon:t.BalloonEditor,classic:t.ClassicEditor,decoupled:t.DecoupledEditor,multiroot:t.MultiRootEditor}[a];if(!i)throw new Error(`Unsupported editor type: ${a}`);return i}class O{static the=new O;plugins=new Map;constructor(){}register(t,e){if(this.plugins.has(t))throw new Error(`Plugin with name "${t}" is already registered.`);return this.plugins.set(t,e),this.unregister.bind(this,t)}unregister(t){if(!this.plugins.has(t))throw new Error(`Plugin with name "${t}" is not registered.`);this.plugins.delete(t)}unregisterAll(){this.plugins.clear()}async get(t){return this.plugins.get(t)?.()}has(t){return this.plugins.has(t)}}async function L(a){const t=await import("ckeditor5");let e=null;const i=a.map(async n=>{const o=await O.the.get(n);if(o)return o;const{[n]:s}=t;if(s)return s;if(!e)try{e=await import("ckeditor5-premium-features")}catch(c){console.error(`Failed to load premium package: ${c}`)}const{[n]:u}=e||{};if(u)return u;throw new Error(`Plugin "${n}" not found in base or premium packages.`)});return{loadedPlugins:await Promise.all(i),hasPremium:!!e}}async function J(a,t){const e=[a.ui,a.content];return await Promise.all([q("ckeditor5",e),t&&q("ckeditor5-premium-features",e)].filter(n=>!!n)).then(n=>n.flat())}async function q(a,t){return await Promise.all(t.filter(e=>e!=="en").map(async e=>{const i=await yt(a,e);return i?.default??i}).filter(Boolean))}async function yt(a,t){try{if(a==="ckeditor5")switch(t){case"af":return await import("ckeditor5/translations/af.js");case"ar":return await import("ckeditor5/translations/ar.js");case"ast":return await import("ckeditor5/translations/ast.js");case"az":return await import("ckeditor5/translations/az.js");case"bg":return await import("ckeditor5/translations/bg.js");case"bn":return await import("ckeditor5/translations/bn.js");case"bs":return await import("ckeditor5/translations/bs.js");case"ca":return await import("ckeditor5/translations/ca.js");case"cs":return await import("ckeditor5/translations/cs.js");case"da":return await import("ckeditor5/translations/da.js");case"de":return await import("ckeditor5/translations/de.js");case"de-ch":return await import("ckeditor5/translations/de-ch.js");case"el":return await import("ckeditor5/translations/el.js");case"en":return await import("ckeditor5/translations/en.js");case"en-au":return await import("ckeditor5/translations/en-au.js");case"en-gb":return await import("ckeditor5/translations/en-gb.js");case"eo":return await import("ckeditor5/translations/eo.js");case"es":return await import("ckeditor5/translations/es.js");case"es-co":return await import("ckeditor5/translations/es-co.js");case"et":return await import("ckeditor5/translations/et.js");case"eu":return await import("ckeditor5/translations/eu.js");case"fa":return await import("ckeditor5/translations/fa.js");case"fi":return await import("ckeditor5/translations/fi.js");case"fr":return await import("ckeditor5/translations/fr.js");case"gl":return await import("ckeditor5/translations/gl.js");case"gu":return await import("ckeditor5/translations/gu.js");case"he":return await import("ckeditor5/translations/he.js");case"hi":return await import("ckeditor5/translations/hi.js");case"hr":return await import("ckeditor5/translations/hr.js");case"hu":return await import("ckeditor5/translations/hu.js");case"hy":return await import("ckeditor5/translations/hy.js");case"id":return await import("ckeditor5/translations/id.js");case"it":return await import("ckeditor5/translations/it.js");case"ja":return await import("ckeditor5/translations/ja.js");case"jv":return await import("ckeditor5/translations/jv.js");case"kk":return await import("ckeditor5/translations/kk.js");case"km":return await import("ckeditor5/translations/km.js");case"kn":return await import("ckeditor5/translations/kn.js");case"ko":return await import("ckeditor5/translations/ko.js");case"ku":return await import("ckeditor5/translations/ku.js");case"lt":return await import("ckeditor5/translations/lt.js");case"lv":return await import("ckeditor5/translations/lv.js");case"ms":return await import("ckeditor5/translations/ms.js");case"nb":return await import("ckeditor5/translations/nb.js");case"ne":return await import("ckeditor5/translations/ne.js");case"nl":return await import("ckeditor5/translations/nl.js");case"no":return await import("ckeditor5/translations/no.js");case"oc":return await import("ckeditor5/translations/oc.js");case"pl":return await import("ckeditor5/translations/pl.js");case"pt":return await import("ckeditor5/translations/pt.js");case"pt-br":return await import("ckeditor5/translations/pt-br.js");case"ro":return await import("ckeditor5/translations/ro.js");case"ru":return await import("ckeditor5/translations/ru.js");case"si":return await import("ckeditor5/translations/si.js");case"sk":return await import("ckeditor5/translations/sk.js");case"sl":return await import("ckeditor5/translations/sl.js");case"sq":return await import("ckeditor5/translations/sq.js");case"sr":return await import("ckeditor5/translations/sr.js");case"sr-latn":return await import("ckeditor5/translations/sr-latn.js");case"sv":return await import("ckeditor5/translations/sv.js");case"th":return await import("ckeditor5/translations/th.js");case"tk":return await import("ckeditor5/translations/tk.js");case"tr":return await import("ckeditor5/translations/tr.js");case"tt":return await import("ckeditor5/translations/tt.js");case"ug":return await import("ckeditor5/translations/ug.js");case"uk":return await import("ckeditor5/translations/uk.js");case"ur":return await import("ckeditor5/translations/ur.js");case"uz":return await import("ckeditor5/translations/uz.js");case"vi":return await import("ckeditor5/translations/vi.js");case"zh":return await import("ckeditor5/translations/zh.js");case"zh-cn":return await import("ckeditor5/translations/zh-cn.js");default:return console.warn(`Language ${t} not found in ckeditor5 translations`),null}else switch(t){case"af":return await import("ckeditor5-premium-features/translations/af.js");case"ar":return await import("ckeditor5-premium-features/translations/ar.js");case"ast":return await import("ckeditor5-premium-features/translations/ast.js");case"az":return await import("ckeditor5-premium-features/translations/az.js");case"bg":return await import("ckeditor5-premium-features/translations/bg.js");case"bn":return await import("ckeditor5-premium-features/translations/bn.js");case"bs":return await import("ckeditor5-premium-features/translations/bs.js");case"ca":return await import("ckeditor5-premium-features/translations/ca.js");case"cs":return await import("ckeditor5-premium-features/translations/cs.js");case"da":return await import("ckeditor5-premium-features/translations/da.js");case"de":return await import("ckeditor5-premium-features/translations/de.js");case"de-ch":return await import("ckeditor5-premium-features/translations/de-ch.js");case"el":return await import("ckeditor5-premium-features/translations/el.js");case"en":return await import("ckeditor5-premium-features/translations/en.js");case"en-au":return await import("ckeditor5-premium-features/translations/en-au.js");case"en-gb":return await import("ckeditor5-premium-features/translations/en-gb.js");case"eo":return await import("ckeditor5-premium-features/translations/eo.js");case"es":return await import("ckeditor5-premium-features/translations/es.js");case"es-co":return await import("ckeditor5-premium-features/translations/es-co.js");case"et":return await import("ckeditor5-premium-features/translations/et.js");case"eu":return await import("ckeditor5-premium-features/translations/eu.js");case"fa":return await import("ckeditor5-premium-features/translations/fa.js");case"fi":return await import("ckeditor5-premium-features/translations/fi.js");case"fr":return await import("ckeditor5-premium-features/translations/fr.js");case"gl":return await import("ckeditor5-premium-features/translations/gl.js");case"gu":return await import("ckeditor5-premium-features/translations/gu.js");case"he":return await import("ckeditor5-premium-features/translations/he.js");case"hi":return await import("ckeditor5-premium-features/translations/hi.js");case"hr":return await import("ckeditor5-premium-features/translations/hr.js");case"hu":return await import("ckeditor5-premium-features/translations/hu.js");case"hy":return await import("ckeditor5-premium-features/translations/hy.js");case"id":return await import("ckeditor5-premium-features/translations/id.js");case"it":return await import("ckeditor5-premium-features/translations/it.js");case"ja":return await import("ckeditor5-premium-features/translations/ja.js");case"jv":return await import("ckeditor5-premium-features/translations/jv.js");case"kk":return await import("ckeditor5-premium-features/translations/kk.js");case"km":return await import("ckeditor5-premium-features/translations/km.js");case"kn":return await import("ckeditor5-premium-features/translations/kn.js");case"ko":return await import("ckeditor5-premium-features/translations/ko.js");case"ku":return await import("ckeditor5-premium-features/translations/ku.js");case"lt":return await import("ckeditor5-premium-features/translations/lt.js");case"lv":return await import("ckeditor5-premium-features/translations/lv.js");case"ms":return await import("ckeditor5-premium-features/translations/ms.js");case"nb":return await import("ckeditor5-premium-features/translations/nb.js");case"ne":return await import("ckeditor5-premium-features/translations/ne.js");case"nl":return await import("ckeditor5-premium-features/translations/nl.js");case"no":return await import("ckeditor5-premium-features/translations/no.js");case"oc":return await import("ckeditor5-premium-features/translations/oc.js");case"pl":return await import("ckeditor5-premium-features/translations/pl.js");case"pt":return await import("ckeditor5-premium-features/translations/pt.js");case"pt-br":return await import("ckeditor5-premium-features/translations/pt-br.js");case"ro":return await import("ckeditor5-premium-features/translations/ro.js");case"ru":return await import("ckeditor5-premium-features/translations/ru.js");case"si":return await import("ckeditor5-premium-features/translations/si.js");case"sk":return await import("ckeditor5-premium-features/translations/sk.js");case"sl":return await import("ckeditor5-premium-features/translations/sl.js");case"sq":return await import("ckeditor5-premium-features/translations/sq.js");case"sr":return await import("ckeditor5-premium-features/translations/sr.js");case"sr-latn":return await import("ckeditor5-premium-features/translations/sr-latn.js");case"sv":return await import("ckeditor5-premium-features/translations/sv.js");case"th":return await import("ckeditor5-premium-features/translations/th.js");case"tk":return await import("ckeditor5-premium-features/translations/tk.js");case"tr":return await import("ckeditor5-premium-features/translations/tr.js");case"tt":return await import("ckeditor5-premium-features/translations/tt.js");case"ug":return await import("ckeditor5-premium-features/translations/ug.js");case"uk":return await import("ckeditor5-premium-features/translations/uk.js");case"ur":return await import("ckeditor5-premium-features/translations/ur.js");case"uz":return await import("ckeditor5-premium-features/translations/uz.js");case"vi":return await import("ckeditor5-premium-features/translations/vi.js");case"zh":return await import("ckeditor5-premium-features/translations/zh.js");case"zh-cn":return await import("ckeditor5-premium-features/translations/zh-cn.js");default:return console.warn(`Language ${t} not found in premium translations`),await import("ckeditor5-premium-features/translations/en.js")}}catch(e){return console.error(`Failed to load translation for ${a}/${t}:`,e),null}}function G(a){return U(a,t=>({dictionary:t}))}function Y(a){const t=X(a);return U(t,({content:e})=>e)}function F(a){const t=X(a),e=U(t,({initialValue:i})=>i);return ut(e,i=>typeof i=="string")}function X(a){const t=document.querySelectorAll([`[data-cke-editor-id="${a}"][data-cke-editable-root-name]`,"[data-cke-editable-root-name]:not([data-cke-editor-id])"].join(", ")),e=Array.from(t).reduce((u,c)=>{const l=c.getAttribute("data-cke-editable-root-name"),d=c.getAttribute("data-cke-editable-initial-value")||"",m=c.querySelector("[data-cke-editable-content]");return!l||!m?u:{...u,[l]:{content:m,initialValue:d}}},Object.create({})),i=document.querySelector(`[phx-hook="CKEditor5"][id="${a}"]`);if(!i)return e;const n=i.getAttribute("data-cke-initial-value")||"",o=i.querySelector(`#${a}_editor `),s=e.main;return s?{...e,main:{...s,initialValue:s.initialValue||n}}:o?{...e,main:{content:o,initialValue:n}}:e}const W=["inline","classic","balloon","decoupled","multiroot"];function bt(a){const t=a.getAttribute("data-cke-preset");if(!t)throw new Error('CKEditor5 hook requires a "cke-preset" attribute on the element.');const{type:e,config:i,license:n,...o}=JSON.parse(t);if(!e||!i||!n)throw new Error('CKEditor5 hook configuration must include "editor", "config", and "license" properties.');if(!W.includes(e))throw new Error(`Invalid editor type: ${e}. Must be one of: ${W.join(", ")}.`);return{type:e,license:n,config:A(i),customTranslations:o.customTranslations||o.custom_translations}}function I(a){if(!a||typeof a!="object")return a;if(Array.isArray(a))return a.map(i=>I(i));const t=a;if(t.$element&&typeof t.$element=="string"){const i=document.querySelector(t.$element);return i||console.warn(`Element not found for selector: ${t.$element}`),i||null}const e=Object.create(null);for(const[i,n]of Object.entries(a))e[i]=I(n);return e}function x(a,t,e){if(!e||typeof e!="object")return e;if(Array.isArray(e))return e.map(o=>x(a,t,o));const i=e;if(i.$translation&&typeof i.$translation=="string"){const o=i.$translation,s=kt(a,o,t);return s===void 0&&console.warn(`Translation not found for key: ${o}`),s!==void 0?s:null}const n=Object.create(null);for(const[o,s]of Object.entries(e))n[o]=x(a,t,s);return n}function kt(a,t,e){for(const i of a){const n=i[e];if(n?.dictionary&&t in n.dictionary)return n.dictionary[t]}}function Et(a,t){const{editing:e}=a;e.view.change(i=>{i.setStyle("height",`${t}px`,e.view.document.getRoot())})}const R=Symbol.for("elixir-editor-watchdog");async function vt(a){const{EditorWatchdog:t}=await import("ckeditor5"),e=new t(a);return e.setCreator(async(...i)=>{const n=await a.create(...i);return n[R]=e,n}),{watchdog:e,Constructor:{create:async(...i)=>(await e.create(...i),e.editor)}}}function Q(a){return R in a?a[R]:null}class g extends _{static the=new g}function Pt(a){const t=a.getAttribute("data-cke-context");if(!t)throw new Error('CKEditor5 hook requires a "data-cke-context" attribute on the element.');const{config:e,...i}=JSON.parse(t);return{config:A(e),customTranslations:i.customTranslations||i.custom_translations,watchdogConfig:i.watchdogConfig||i.watchdog_config}}class Ct extends P{contextPromise=null;get attrs(){const t=i=>this.el.getAttribute(i)||null,e={id:this.el.id,config:Pt(this.el),language:{ui:t("data-cke-language")||"en",content:t("data-cke-content-language")||"en"}};return Object.defineProperty(this,"attrs",{value:e,writable:!1,configurable:!1,enumerable:!0}),e}async mounted(){const{id:t,language:e}=this.attrs,{customTranslations:i,watchdogConfig:n,config:{plugins:o,...s}}=this.attrs.config,{loadedPlugins:u,hasPremium:c}=await L(o??[]),d=[...await J(e,c),G(i?.dictionary||{})].filter(f=>!B(f));let m=I(s);m=x([...d].reverse(),e.ui,m),this.contextPromise=(async()=>{const{ContextWatchdog:f,Context:b}=await import("ckeditor5"),y=new f(b,{crashNumberLimit:10,...n});return await y.create({...m,language:e,plugins:u,...d.length&&{translations:d}}),y.on("itemError",(...E)=>{console.error("Context item error:",...E)}),y})();const w=await this.contextPromise;this.isBeingDestroyed()||g.the.register(t,w)}async destroyed(){const{id:t}=this.attrs;this.el.style.display="none";try{await(await this.contextPromise)?.destroy()}finally{this.contextPromise=null,g.the.hasItem(t)&&g.the.unregister(t)}}}function Tt(a){return a.hasAttribute("data-cke-context")}function At(a){let t=a;for(;t;){if(Tt(t))return t;t=t.parentElement}return null}async function It(a){const t=At(a);return t?g.the.waitFor(t.id):null}const xt=C(Ct);class p extends _{static the=new p}class Ot extends P{editorPromise=null;get attrs(){const t={editableId:this.el.getAttribute("id"),editorId:this.el.getAttribute("data-cke-editor-id")||null,rootName:this.el.getAttribute("data-cke-editable-root-name"),initialValue:this.el.getAttribute("data-cke-editable-initial-value")||""};return Object.defineProperty(this,"attrs",{value:t,writable:!1,configurable:!1,enumerable:!0}),t}async mounted(){const{editableId:t,editorId:e,rootName:i,initialValue:n}=this.attrs,o=this.el.querySelector(`#${t}_input`);this.editorPromise=p.the.execute(e,s=>{if(this.isBeingDestroyed())return null;const{ui:u,editing:c,model:l}=s;if(l.document.getRoot(i))return s;s.addRoot(i,{isUndoable:!1,data:n});const d=this.el.querySelector("[data-cke-editable-content]"),m=u.view.createEditable(i,d);if(u.addEditable(m),c.view.forceRender(),o){const w=St(o,s,i);this.onBeforeDestroy(w)}return s})}async destroyed(){const{rootName:t}=this.attrs;this.el.style.display="none";const e=await this.editorPromise;if(this.editorPromise=null,e&&e.state!=="destroyed"){const i=e.model.document.getRoot(t);i&&"detachEditable"in e&&(e.ui.view.editables[t]&&e.detachEditable(i),i.isAttached()&&e.detachRoot(t,!1))}}}const Dt=C(Ot);function St(a,t,e){const i=()=>{a.value=t.getData({rootName:e})},n=$(200,i);return t.model.document.on("change:data",n),i(),()=>{t.model.document.off("change:data",n)}}async function Vt(){const{Plugin:a,FileRepository:t}=await import("ckeditor5");return class extends a{static get pluginName(){return"PhoenixUploadAdapter"}static get requires(){return[t]}init(){const{editor:i}=this,{plugins:n,config:o}=i,s=o.get("phoenixUpload.url");if(!s||n.has("SimpleUploadAdapter")||n.has("Base64UploadAdapter")||n.has("CKFinderUploadAdapter"))return;const u=n.get(t);u.createUploadAdapter=c=>new Rt(c,s)}}}class Rt{loader;uploadUrl;abortController=null;constructor(t,e){this.loader=t,this.uploadUrl=e}async upload(){const t=await this.loader.file;this.abortController=new AbortController;const e=new FormData;e.append("file",t),t.size&&(this.loader.uploadTotal=t.size,this.loader.uploaded=0);const i={},n=lt();n&&(i["X-CSRF-Token"]=n);try{const o=await fetch(this.uploadUrl,{method:"POST",headers:i,body:e,signal:this.abortController.signal});if(!o.ok){let u="Couldn't upload file!";try{const c=await o.json();c?.error?.message&&(u=c.error.message)}catch{}throw new Error(u)}return this.loader.uploaded=this.loader.uploadTotal,{default:(await o.json()).url}}catch(o){throw o.name==="AbortError"?o:o.message||"Couldn't upload file!"}}abort(){this.abortController?.abort(),this.abortController=null}}async function $t({editorId:a,saveDebounceMs:t}){const{Plugin:e}=await import("ckeditor5");return class extends e{input=null;form=null;static get pluginName(){return"SyncEditorWithInput"}afterInit(){const{editor:n}=this;this.input=document.getElementById(`${a}_input`),this.input&&(n.model.document.on("change:data",$(t,()=>this.sync())),n.once("ready",this.sync),this.form=this.input.closest("form"),this.form?.addEventListener("submit",this.sync))}sync=()=>{const n=this.editor.getData();this.input.value=n,this.input.dispatchEvent(new Event("input",{bubbles:!0}))};destroy(){this.form&&this.form.removeEventListener("submit",this.sync),this.input=null,this.form=null}}}async function Ut(a){const{Plugin:t}=await import("ckeditor5"),{editorId:e,saveDebounceMs:i,events:n,pushEvent:o,handleEvent:s}=a;return class extends t{static get pluginName(){return"SyncEditorWithPhoenix"}init(){const{editor:c}=this;n.change&&this.setupTypingContentPush(),n.blur&&this.setupEventPush("blur"),n.focus&&this.setupEventPush("focus"),n.ready&&this.editor.once("ready",()=>{o("ckeditor5:ready",{editorId:e,data:S(c)})}),s("ckeditor5:set-data",({editorId:l,data:d})=>{(dt(l)||l===e)&&c.setData(d)})}setupTypingContentPush(){const{editor:c}=this;let l=null,d=!1;const m=()=>{if(d)return;const f=S(c);(!l||!ht(l,f))&&(o("ckeditor5:change",{editorId:e,data:f}),l=f)},w=$(i,m);c.model.document.on("change:data",()=>{c.ui.focusTracker.isFocused?w():m()}),c.once("ready",m),c.once("destroy",()=>{d=!0})}setupEventPush(c){const{editor:l}=this,d=()=>{const{isFocused:m}=l.ui.focusTracker;(m?"focus":"blur")===c&&o(`ckeditor5:${c}`,{editorId:e,data:S(l)})};l.ui.focusTracker.on("change:isFocused",d)}}}function S(a){return a.model.document.getRootNames().reduce((e,i)=>(e[i]=a.getData({rootName:i}),e),Object.create({}))}class jt extends P{editorPromise=null;get attrs(){const{el:t}=this,e=t.getAttribute.bind(t),i=t.hasAttribute.bind(t),n={editorId:e("id"),contextId:e("data-cke-context-id"),preset:bt(t),editableHeight:N(e("data-cke-editable-height")),watchdog:i("data-cke-watchdog"),events:{change:i("data-cke-change-event"),blur:i("data-cke-blur-event"),focus:i("data-cke-focus-event"),ready:i("data-cke-ready-event")},saveDebounceMs:N(e("data-cke-save-debounce-ms"))??400,language:{ui:e("data-cke-language")||"en",content:e("data-cke-content-language")||"en"}};return Object.defineProperty(this,"attrs",{value:n,writable:!1,configurable:!1,enumerable:!0}),n}async mounted(){const{editorId:t}=this.attrs;p.the.resetErrors(t);try{this.editorPromise=this.createEditor();const e=await this.editorPromise;this.isBeingDestroyed()||(p.the.register(t,e),e.once("destroy",()=>{p.the.hasItem(t)&&p.the.unregister(t)}))}catch(e){this.editorPromise=null,p.the.error(t,e)}return this}async destroyed(){this.el.style.display="none";try{const t=await this.editorPromise;if(!t)return;const e=K(t),i=Q(t);e?e.state!=="unavailable"&&await e.context.remove(e.editorContextId):i?await i.destroy():await t.destroy()}finally{this.editorPromise=null}}async createEditor(){const{preset:t,editorId:e,contextId:i,editableHeight:n,events:o,saveDebounceMs:s,language:u,watchdog:c}=this.attrs,{customTranslations:l,type:d,license:m,config:{plugins:w,...f}}=t;let b=await gt(d);const y=await(i?g.the.waitFor(i):It(this.el));if(c&&!y){const h=await vt(b);({Constructor:b}=h),h.watchdog.on("restart",()=>{const k=h.watchdog.editor;this.editorPromise=Promise.resolve(k),p.the.register(e,k)})}const{loadedPlugins:E,hasPremium:tt}=await L(w);T(d)&&E.push(await $t({editorId:e,saveDebounceMs:s})),E.push(...await Promise.all([Ut({editorId:e,saveDebounceMs:s,events:o,pushEvent:this.pushEvent.bind(this),handleEvent:this.handleEvent.bind(this)}),Vt()]));const D=[...await J(u,tt),G(l?.dictionary||{})].filter(h=>!B(h));let v=F(e);T(d)&&(v=v.main||"");const j=await(async()=>{let h=Y(e);if(!(h instanceof HTMLElement)&&!("main"in h)){const H=d==="decoupled"?["main"]:Object.keys(v);Z(h,H)||(h=await Mt(e,H),v=F(e))}T(d)&&"main"in h&&(h=h.main);let k=I(f);k=x([...D].reverse(),u.ui,k);const M={...k,initialData:v,licenseKey:m.key,plugins:E,language:u,...D.length&&{translations:D}};return!y||!(h instanceof HTMLElement)?b.create(h,M):(await wt({context:y,element:h,creator:b,config:M})).editor})();return T(d)&&n&&Et(j,n),j}}function Z(a,t){return t.every(e=>a[e])}async function Mt(a,t){return ft(()=>{const e=Y(a);if(!Z(e,t))throw new Error(`It looks like not all required root elements are present yet.
|
|
2
2
|
* If you want to wait for them, ensure they are registered before editor initialization.
|
|
3
3
|
* If you want lazy initialize roots, consider removing root values from the \`initialData\` config and assign initial data in editable components.
|
|
4
|
-
Missing roots: ${t.filter(
|
|
4
|
+
Missing roots: ${t.filter(i=>!e[i]).join(", ")}.`);return e},{timeOutAfter:2e3,retryAfter:100})}const Ht=C(jt);function zt(a,t){const e=new Set;return i=>{a.model.enqueueChange({isUndoable:!1},n=>{const o=a.model.document.getRoot(t);if(o){for(const s of e)i&&s in i||(n.removeAttribute(s,o),e.delete(s));for(const[s,u]of Object.entries(i??{}))n.setAttribute(s,u,o),e.add(s)}})}}class Nt extends P{editorPromise=null;pendingValue=null;previousValue=null;attrsUpdater=null;get attrs(){return{editorId:this.el.getAttribute("data-cke-editor-id"),rootName:this.el.getAttribute("data-cke-root-name"),rootAttributes:mt(this.el.getAttribute("data-cke-root-attrs")),value:this.el.getAttribute("data-cke-value")}}async mounted(){const{editorId:t,value:e,rootName:i}=this.attrs;this.previousValue=e,this.editorPromise=p.the.execute(t,n=>this.isBeingDestroyed()?null:(this.setupSyncHandlers(n,i),n))}async updated(){const{rootName:t,value:e,rootAttributes:i}=this.attrs,n=await this.editorPromise;!n||n.state==="destroyed"||(this.attrsUpdater?.(i),e!==this.previousValue&&(this.previousValue=e,n.ui.focusTracker.isFocused?this.pendingValue=e:this.setRootValue(n,t,e)))}setupSyncHandlers(t,e){this.attrsUpdater=zt(t,e),this.attrsUpdater(this.attrs.rootAttributes);const i=()=>{this.pendingValue=null},n=()=>{!t.ui.focusTracker.isFocused&&this.pendingValue!==null&&(this.setRootValue(t,e,this.pendingValue),this.pendingValue=null)};t.model.document.on("change:data",i),t.ui.focusTracker.on("change:isFocused",n),this.onBeforeDestroy(()=>{t.model.document.off("change:data",i),t.ui.focusTracker.off("change:isFocused",n)})}setRootValue(t,e,i){t.getData({rootName:e})!==i&&t.setData({[e]:i})}}const qt=C(Nt);class Ft extends P{mountedPromise=null;get attrs(){const t={editorId:this.el.getAttribute("data-cke-editor-id")||null,name:this.el.getAttribute("data-cke-ui-part-name")};return Object.defineProperty(this,"attrs",{value:t,writable:!1,configurable:!1,enumerable:!0}),t}async mounted(){const{editorId:t,name:e}=this.attrs;this.mountedPromise=p.the.execute(t,i=>{if(this.isBeingDestroyed())return;const{ui:n}=i,o=Wt(e),s=n.view[o];if(!s){console.error(`Unknown UI part name: "${e}". Supported names are "toolbar" and "menubar".`);return}this.el.appendChild(s.element)})}async destroyed(){this.el.style.display="none",await this.mountedPromise,this.mountedPromise=null,this.el.innerHTML=""}}function Wt(a){switch(a){case"toolbar":return"toolbar";case"menubar":return"menuBarView";default:return null}}const _t=C(Ft),Bt={CKEditor5:Ht,CKEditable:Dt,CKUIPart:_t,CKContext:xt,CKRootValueSentinel:qt};exports.ContextsRegistry=g;exports.CustomEditorPluginsRegistry=O;exports.EditorsRegistry=p;exports.Hooks=Bt;exports.unwrapEditorContext=K;exports.unwrapEditorWatchdog=Q;
|
|
5
5
|
//# sourceMappingURL=index.cjs.map
|