nuxt-tiptap-editor
Version:
Essentials to Quickly Integrate TipTap Editor into your Nuxt App
200 lines (193 loc) • 6.44 kB
JavaScript
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 };