UNPKG

nuxt-tiptap-editor

Version:

Essentials to Quickly Integrate TipTap Editor into your Nuxt App

200 lines (193 loc) 6.44 kB
import { defineNuxtModule, createResolver, addImports, addComponent } from '@nuxt/kit'; const name = "nuxt-tiptap-editor"; const version = "2.3.1"; const defaultComposables = [ { name: "useEditor", path: "@tiptap/vue-3" } ]; const defaultNodes = [ { name: "Node", path: "@tiptap/core" }, { name: "Blockquote", path: "@tiptap/extension-blockquote" }, { name: "BulletList", path: "@tiptap/extension-bullet-list" }, { name: "OrderedList", path: "@tiptap/extension-ordered-list" }, { name: "ListItem", path: "@tiptap/extension-list-item" }, { name: "CodeBlock", path: "@tiptap/extension-code-block" }, { name: "Document", path: "@tiptap/extension-document" }, { name: "HardBreak", path: "@tiptap/extension-hard-break" }, { name: "Heading", path: "@tiptap/extension-heading" }, { name: "HorizontalRule", path: "@tiptap/extension-horizontal-rule" }, { name: "Paragraph", path: "@tiptap/extension-paragraph" }, { name: "Text", path: "@tiptap/extension-text" } ]; const defaultMarks = [ { name: "Mark", path: "@tiptap/core" }, { name: "Bold", path: "@tiptap/extension-bold" }, { name: "Code", path: "@tiptap/extension-code" }, { name: "Italic", path: "@tiptap/extension-italic" }, { name: "Link", path: "@tiptap/extension-link" }, { name: "Strike", path: "@tiptap/extension-strike" } ]; const defaultExtensions = [ { name: "Extension", path: "@tiptap/core" }, { name: "StarterKit", path: "@tiptap/starter-kit" }, { name: "Gapcursor", path: "@tiptap/extension-gapcursor" }, { name: "Dropcursor", path: "@tiptap/extension-dropcursor" }, { name: "History", path: "@tiptap/extension-history" }, { name: "Image", path: "@tiptap/extension-image" } ]; const defaultImports = [ { name: "Editor", path: "@tiptap/vue-3" }, ...defaultNodes, ...defaultMarks, ...defaultExtensions ]; const defaultComponents = [ { name: "EditorContent", path: "@tiptap/vue-3" }, { name: "FloatingMenu", path: "@tiptap/vue-3" }, { name: "BubbleMenu", path: "@tiptap/vue-3" } ]; const lowlightComposables = [ { name: "all", as: "allLanguages", path: "lowlight" }, { name: "common", as: "commonLanguages", path: "lowlight" }, { name: "createLowlight", path: "lowlight" } ]; const lowlightImports = [ { name: "CodeBlockLowlight", path: "@tiptap/extension-code-block-lowlight" } ]; const customExtensionPath = "runtime/custom-extensions"; const resolveCustomExtension = (extPath) => `${customExtensionPath}/${extPath}`; const defaultCustomExtensions = [ { name: "ImageUpload", path: resolveCustomExtension("extension-image-upload") }, { name: "ImagePlaceholder", path: resolveCustomExtension("extension-image-upload") } ]; const customImports = [...defaultCustomExtensions]; const customComposables = []; const customComponents = []; const module = defineNuxtModule({ meta: { name, version, configKey: "tiptap", compatibility: { nuxt: ">=3.0.0" } }, defaults: { prefix: "Tiptap", lowlight: false }, async setup(options, nuxt) { const resolver = createResolver(import.meta.url); const transpileModules = /* @__PURE__ */ new Set([]); const defaultComposables$1 = [ ...defaultComposables ]; const defaultImports$1 = [...defaultImports]; const defaultComponents$1 = [...defaultComponents]; const optionalImports = []; const optionalComposables = []; const optionalComponents = []; const customComposables$1 = [...customComposables]; const customImports$1 = [...customImports]; const customComponents$1 = [...customComponents]; const customCSS = []; for (const obj of defaultComposables$1) { addImports({ as: obj.as || obj.name, name: obj.name, from: obj.path }); transpileModules.add(obj.path); } for (const obj of defaultImports$1) { addImports({ as: `${options.prefix}${obj.name}`, name: obj.name, from: obj.path }); transpileModules.add(obj.path); } for (const obj of defaultComponents$1) { addComponent({ name: `${options.prefix}${obj.name}`, export: obj.name, filePath: obj.path }); transpileModules.add(obj.path); } if (options.lowlight !== false) { optionalImports.push(...lowlightImports); optionalComposables.push(...lowlightComposables); const lldefaultTheme = options.lowlight?.theme || "github-dark"; const highlightJSVersion = options.lowlight?.highlightJSVersion || "11.10.0"; const llThemeCSS = `https://unpkg.com/@highlightjs/cdn-assets@${highlightJSVersion}/styles/${lldefaultTheme}.min.css`; nuxt.options.app.head.link = [ ...nuxt.options.app.head.link || [], { rel: "stylesheet", href: llThemeCSS } ]; } for (const obj of optionalImports) { addImports({ as: `${options.prefix}${obj.name}`, name: obj.name, from: obj.path }); transpileModules.add(obj.path); } for (const obj of optionalComposables) { addImports({ as: obj.as || obj.name, name: obj.name, from: obj.path }); transpileModules.add(obj.path); } for (const obj of optionalComponents) { addComponent({ name: `${options.prefix}${obj.name}`, export: obj.name, filePath: obj.path }); transpileModules.add(obj.path); } for (const obj of customImports$1) { addImports({ as: `${options.prefix}${obj.name}`, name: obj.name, from: resolver.resolve(obj.path) }); } for (const obj of customComposables$1) { addImports({ as: obj.as || obj.name, name: obj.name, from: resolver.resolve(obj.path) }); } for (const obj of customComponents$1) { addComponent({ name: `${options.prefix}${obj.name}`, export: obj.name, filePath: resolver.resolve(obj.path) }); } nuxt.options.build.transpile = [ ...nuxt.options.build.transpile, ...Array.from(transpileModules) ]; nuxt.options.css = [...nuxt.options.css, ...customCSS]; nuxt.options.typescript = nuxt.options.typescript || {}; nuxt.options.typescript.hoist = nuxt.options.typescript.hoist || []; nuxt.options.typescript.hoist.push("@tiptap/vue-3"); console.info("Tiptap Editor initialized"); } }); export { module as default };