{"version":3,"file":"configurable.js","sources":["src/configurable.js"],"sourcesContent":["import * as editorModule from \"django-prose-editor/editor\"\nimport {\n createTextareaEditor,\n initializeEditors,\n} from \"django-prose-editor/editor\"\n\nconst marker = \"data-django-prose-editor-configurable\"\n\nconst EXTENSIONS = { ...editorModule }\n\nconst moduleLoadPromises = new Map()\n\nasync function loadExtensionModules(moduleUrls) {\n if (!moduleUrls?.length) return\n\n const loadPromises = moduleUrls.map((url) => {\n if (moduleLoadPromises.has(url)) {\n return moduleLoadPromises.get(url)\n }\n\n const loadPromise = import(url)\n .then((module) => {\n Object.assign(EXTENSIONS, module)\n })\n .catch((error) => {\n console.error(`Error loading extension module from ${url}:`, error)\n // Remove failed modules from cache\n moduleLoadPromises.delete(url)\n })\n\n moduleLoadPromises.set(url, loadPromise)\n return loadPromise\n })\n\n // Wait for all modules to load\n await Promise.all(loadPromises)\n}\n\nasync function createEditorAsync(textarea, config = null) {\n if (textarea.closest(\".prose-editor\")) return null\n\n config = config || JSON.parse(textarea.getAttribute(marker) || \"{}\")\n\n if (config.js_modules?.length) {\n await loadExtensionModules(config.js_modules)\n }\n\n const extensions = []\n\n // Process all extensions from the config\n for (const [extensionName, extensionConfig] of Object.entries(\n config.extensions,\n )) {\n const extension = EXTENSIONS[extensionName]\n if (extension) {\n // If the extension has a configuration object (not empty), pass it to the extension\n if (typeof extensionConfig === \"object\") {\n extensions.push(extension.configure(extensionConfig))\n } else {\n extensions.push(extension)\n }\n }\n }\n\n return createTextareaEditor(textarea, extensions)\n}\n\n// Track pending editor initializations\nconst pendingEditors = new WeakMap()\n\n// Function for the initializeEditors callback\nfunction createEditor(textarea, config = null) {\n // Check if we already have a pending initialization for this textarea\n if (pendingEditors.has(textarea)) {\n return pendingEditors.get(textarea)\n }\n\n // Create a promise for the editor initialization\n const editorPromise = createEditorAsync(textarea, config)\n .then((editor) => {\n // The editor is initialized and ready to use\n if (editor) {\n const event = new CustomEvent(\"prose-editor:ready\", {\n detail: { editor, textarea },\n bubbles: true,\n })\n textarea.dispatchEvent(event)\n }\n // Remove from pending tracking once complete\n pendingEditors.delete(textarea)\n return editor\n })\n .catch((error) => {\n console.error(\"Error initializing prose editor:\", error)\n // Remove from pending tracking on error\n pendingEditors.delete(textarea)\n return null\n })\n\n // Track this pending initialization\n pendingEditors.set(textarea, editorPromise)\n\n // Return the promise\n return editorPromise\n}\n\n// Initialize all editors with the configurable marker\ninitializeEditors(createEditor, `[${marker}]`)\n\n// Export utility functions for external use\nexport { createEditor }\n"],"names":["marker","EXTENSIONS","editorModule","moduleLoadPromises","Map","pendingEditors","WeakMap","createEditor","textarea","config","editorPromise","createEditorAsync","_config_js_modules","moduleUrls","JSON","loadPromises","url","loadPromise","module","Object","error","console","Promise","extensions","extensionName","extensionConfig","extension","createTextareaEditor","editor","event","CustomEvent","initializeEditors"],"mappings":"kWAMA,IAAMA,EAAS,wCAETC,EAAa,A,iaAAA,GAAKC,GAElBC,EAAqB,IAAIC,IA0DzBC,EAAiB,IAAIC,QAG3B,SAASC,EAAaC,CAAQ,CAAEC,EAAS,IAAI,EAE3C,GAAIJ,EAAe,GAAG,CAACG,GACrB,OAAOH,EAAe,GAAG,CAACG,GAI5B,IAAME,EAAgBC,AAxCxB,UAAiCH,CAAQ,CAAEC,EAAS,IAAI,E,yBAKlDG,EA/B8BC,EA2BlC,GAAIL,EAAS,OAAO,CAAC,iBAAkB,OAAO,IAI1C,QAAAI,CAAAA,EAAAA,AAFJH,CAAAA,EAASA,GAAUK,KAAK,KAAK,CAACN,EAAS,YAAY,CAACR,IAAW,KAAI,EAExD,UAAU,AAAD,EAAhBY,KAAAA,EAAAA,EAAmB,MAAM,AAAD,GAC1B,OAhCgCC,EAgCLJ,EAAO,UAAU,C,cA/B9C,GAAI,CAACI,CAAAA,MAAAA,EAAAA,KAAAA,EAAAA,EAAY,MAAM,AAAD,EAAG,OAEzB,IAAME,EAAeF,EAAW,GAAG,CAAC,AAACG,IACnC,GAAIb,EAAmB,GAAG,CAACa,GACzB,OAAOb,EAAmB,GAAG,CAACa,GAGhC,IAAMC,EAAc,MAAM,CAACD,GACxB,IAAI,CAAC,AAACE,IACLC,OAAO,MAAM,CAAClB,EAAYiB,EAC5B,GACC,KAAK,CAAC,AAACE,IACNC,QAAQ,KAAK,CAAC,CAAC,oCAAoC,EAAEL,EAAI,CAAC,CAAC,CAAEI,GAE7DjB,EAAmB,MAAM,CAACa,EAC5B,GAGF,OADAb,EAAmB,GAAG,CAACa,EAAKC,GACrBA,CACT,EAGA,OAAMK,QAAQ,GAAG,CAACP,EACpB,KAQgD,EAG9C,IAAMQ,EAAa,EAAE,CAGrB,IAAK,GAAM,CAACC,EAAeC,EAAgB,GAAIN,OAAO,OAAO,CAC3DV,EAAO,UAAU,EAChB,CACD,IAAMiB,EAAYzB,CAAU,CAACuB,EAAc,CACvCE,IAEE,AAA2B,UAA3B,OAAOD,EACTF,EAAW,IAAI,CAACG,EAAU,SAAS,CAACD,IAEpCF,EAAW,IAAI,CAACG,GAGtB,CAEA,MAAOC,AAAAA,GAAAA,EAAAA,oBAAAA,AAAAA,EAAqBnB,EAAUe,EACxC,I,GAa0Cf,EAAUC,GAC/C,IAAI,CAAC,AAACmB,IAEL,GAAIA,EAAQ,CACV,IAAMC,EAAQ,IAAIC,YAAY,qBAAsB,CAClD,OAAQ,CAAEF,OAAAA,EAAQpB,SAAAA,CAAS,EAC3B,QAAS,EACX,GACAA,EAAS,aAAa,CAACqB,EACzB,CAGA,OADAxB,EAAe,MAAM,CAACG,GACfoB,CACT,GACC,KAAK,CAAC,AAACR,IACNC,QAAQ,KAAK,CAAC,mCAAoCD,GAElDf,EAAe,MAAM,CAACG,GACf,OAOX,OAHAH,EAAe,GAAG,CAACG,EAAUE,GAGtBA,CACT,CAGAqB,AAAAA,GAAAA,EAAAA,iBAAAA,AAAAA,EAAkBxB,EAAc,CAAC,CAAC,EAAEP,EAAO,CAAC,CAAC,S"}