@tiptap/static-renderer 3.0.0-beta.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.
Files changed (59) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +18 -0
  3. package/dist/index.cjs +629 -0
  4. package/dist/index.cjs.map +1 -0
  5. package/dist/index.d.cts +327 -0
  6. package/dist/index.d.ts +327 -0
  7. package/dist/index.js +584 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/json/html-string/index.cjs +111 -0
  10. package/dist/json/html-string/index.cjs.map +1 -0
  11. package/dist/json/html-string/index.d.cts +201 -0
  12. package/dist/json/html-string/index.d.ts +201 -0
  13. package/dist/json/html-string/index.js +81 -0
  14. package/dist/json/html-string/index.js.map +1 -0
  15. package/dist/json/react/index.cjs +117 -0
  16. package/dist/json/react/index.cjs.map +1 -0
  17. package/dist/json/react/index.d.cts +190 -0
  18. package/dist/json/react/index.d.ts +190 -0
  19. package/dist/json/react/index.js +79 -0
  20. package/dist/json/react/index.js.map +1 -0
  21. package/dist/json/renderer.cjs +89 -0
  22. package/dist/json/renderer.cjs.map +1 -0
  23. package/dist/json/renderer.d.cts +166 -0
  24. package/dist/json/renderer.d.ts +166 -0
  25. package/dist/json/renderer.js +64 -0
  26. package/dist/json/renderer.js.map +1 -0
  27. package/dist/pm/html-string/index.cjs +344 -0
  28. package/dist/pm/html-string/index.cjs.map +1 -0
  29. package/dist/pm/html-string/index.d.cts +175 -0
  30. package/dist/pm/html-string/index.d.ts +175 -0
  31. package/dist/pm/html-string/index.js +317 -0
  32. package/dist/pm/html-string/index.js.map +1 -0
  33. package/dist/pm/markdown/index.cjs +473 -0
  34. package/dist/pm/markdown/index.cjs.map +1 -0
  35. package/dist/pm/markdown/index.d.cts +153 -0
  36. package/dist/pm/markdown/index.d.ts +153 -0
  37. package/dist/pm/markdown/index.js +449 -0
  38. package/dist/pm/markdown/index.js.map +1 -0
  39. package/dist/pm/react/index.cjs +399 -0
  40. package/dist/pm/react/index.cjs.map +1 -0
  41. package/dist/pm/react/index.d.cts +163 -0
  42. package/dist/pm/react/index.d.ts +163 -0
  43. package/dist/pm/react/index.js +364 -0
  44. package/dist/pm/react/index.js.map +1 -0
  45. package/package.json +101 -0
  46. package/src/helpers.ts +54 -0
  47. package/src/index.ts +6 -0
  48. package/src/json/html-string/index.ts +2 -0
  49. package/src/json/html-string/string.ts +49 -0
  50. package/src/json/react/index.ts +2 -0
  51. package/src/json/react/react.ts +33 -0
  52. package/src/json/renderer.ts +241 -0
  53. package/src/pm/extensionRenderer.ts +215 -0
  54. package/src/pm/html-string/html-string.ts +105 -0
  55. package/src/pm/html-string/index.ts +2 -0
  56. package/src/pm/markdown/index.ts +2 -0
  57. package/src/pm/markdown/markdown.ts +142 -0
  58. package/src/pm/react/index.ts +2 -0
  59. package/src/pm/react/react.ts +152 -0
@@ -0,0 +1,344 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/pm/html-string/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ domOutputSpecToHTMLString: () => domOutputSpecToHTMLString,
24
+ mapMarkExtensionToReactNode: () => mapMarkExtensionToReactNode,
25
+ mapNodeExtensionToReactNode: () => mapNodeExtensionToReactNode,
26
+ renderToElement: () => renderToElement,
27
+ renderToHTMLString: () => renderToHTMLString,
28
+ serializeAttrsToHTMLString: () => serializeAttrsToHTMLString,
29
+ serializeChildrenToHTMLString: () => serializeChildrenToHTMLString
30
+ });
31
+ module.exports = __toCommonJS(index_exports);
32
+
33
+ // src/pm/extensionRenderer.ts
34
+ var import_core2 = require("@tiptap/core");
35
+ var import_model = require("@tiptap/pm/model");
36
+
37
+ // src/helpers.ts
38
+ var import_core = require("@tiptap/core");
39
+ function getAttributes(nodeOrMark, extensionAttributes, onlyRenderedAttributes) {
40
+ const nodeOrMarkAttributes = nodeOrMark.attrs;
41
+ if (!nodeOrMarkAttributes) {
42
+ return {};
43
+ }
44
+ return extensionAttributes.filter((item) => {
45
+ if (item.type !== (typeof nodeOrMark.type === "string" ? nodeOrMark.type : nodeOrMark.type.name)) {
46
+ return false;
47
+ }
48
+ if (onlyRenderedAttributes) {
49
+ return item.attribute.rendered;
50
+ }
51
+ return true;
52
+ }).map((item) => {
53
+ if (!item.attribute.renderHTML) {
54
+ return {
55
+ [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default
56
+ };
57
+ }
58
+ return item.attribute.renderHTML(nodeOrMarkAttributes) || {
59
+ [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default
60
+ };
61
+ }).reduce((attributes, attribute) => (0, import_core.mergeAttributes)(attributes, attribute), {});
62
+ }
63
+ function getHTMLAttributes(nodeOrMark, extensionAttributes) {
64
+ return getAttributes(nodeOrMark, extensionAttributes, true);
65
+ }
66
+
67
+ // src/pm/extensionRenderer.ts
68
+ function mapNodeExtensionToReactNode(domOutputSpecToElement, extension, extensionAttributes, options) {
69
+ const context = {
70
+ name: extension.name,
71
+ options: extension.options,
72
+ storage: extension.storage,
73
+ parent: extension.parent
74
+ };
75
+ const renderToHTML = (0, import_core2.getExtensionField)(extension, "renderHTML", context);
76
+ if (!renderToHTML) {
77
+ if (options == null ? void 0 : options.unhandledNode) {
78
+ return [extension.name, options.unhandledNode];
79
+ }
80
+ return [
81
+ extension.name,
82
+ () => {
83
+ throw new Error(
84
+ `[tiptap error]: Node ${extension.name} cannot be rendered, it is missing a "renderToHTML" method, please implement it or override the corresponding "nodeMapping" method to have a custom rendering`
85
+ );
86
+ }
87
+ ];
88
+ }
89
+ return [
90
+ extension.name,
91
+ ({ node, children }) => {
92
+ try {
93
+ return domOutputSpecToElement(
94
+ renderToHTML({
95
+ node,
96
+ HTMLAttributes: getHTMLAttributes(node, extensionAttributes)
97
+ })
98
+ )(children);
99
+ } catch (e) {
100
+ throw new Error(
101
+ `[tiptap error]: Node ${extension.name} cannot be rendered, it's "renderToHTML" method threw an error: ${e.message}`,
102
+ { cause: e }
103
+ );
104
+ }
105
+ }
106
+ ];
107
+ }
108
+ function mapMarkExtensionToReactNode(domOutputSpecToElement, extension, extensionAttributes, options) {
109
+ const context = {
110
+ name: extension.name,
111
+ options: extension.options,
112
+ storage: extension.storage,
113
+ parent: extension.parent
114
+ };
115
+ const renderToHTML = (0, import_core2.getExtensionField)(extension, "renderHTML", context);
116
+ if (!renderToHTML) {
117
+ if (options == null ? void 0 : options.unhandledMark) {
118
+ return [extension.name, options.unhandledMark];
119
+ }
120
+ return [
121
+ extension.name,
122
+ () => {
123
+ throw new Error(`Node ${extension.name} cannot be rendered, it is missing a "renderToHTML" method`);
124
+ }
125
+ ];
126
+ }
127
+ return [
128
+ extension.name,
129
+ ({ mark, children }) => {
130
+ try {
131
+ return domOutputSpecToElement(
132
+ renderToHTML({
133
+ mark,
134
+ HTMLAttributes: getHTMLAttributes(mark, extensionAttributes)
135
+ })
136
+ )(children);
137
+ } catch (e) {
138
+ throw new Error(
139
+ `[tiptap error]: Mark ${extension.name} cannot be rendered, it's "renderToHTML" method threw an error: ${e.message}`,
140
+ { cause: e }
141
+ );
142
+ }
143
+ }
144
+ ];
145
+ }
146
+ function renderToElement({
147
+ renderer,
148
+ domOutputSpecToElement,
149
+ mapDefinedTypes,
150
+ content,
151
+ extensions,
152
+ options
153
+ }) {
154
+ extensions = (0, import_core2.resolveExtensions)(extensions);
155
+ const extensionAttributes = (0, import_core2.getAttributesFromExtensions)(extensions);
156
+ const { nodeExtensions, markExtensions } = (0, import_core2.splitExtensions)(extensions);
157
+ if (!(content instanceof import_model.Node)) {
158
+ content = import_model.Node.fromJSON((0, import_core2.getSchemaByResolvedExtensions)(extensions), content);
159
+ }
160
+ return renderer({
161
+ ...options,
162
+ nodeMapping: {
163
+ ...Object.fromEntries(
164
+ nodeExtensions.filter((e) => {
165
+ if (e.name in mapDefinedTypes) {
166
+ return false;
167
+ }
168
+ if (options == null ? void 0 : options.nodeMapping) {
169
+ return !(e.name in options.nodeMapping);
170
+ }
171
+ return true;
172
+ }).map(
173
+ (nodeExtension) => mapNodeExtensionToReactNode(domOutputSpecToElement, nodeExtension, extensionAttributes, options)
174
+ )
175
+ ),
176
+ ...mapDefinedTypes,
177
+ ...options == null ? void 0 : options.nodeMapping
178
+ },
179
+ markMapping: {
180
+ ...Object.fromEntries(
181
+ markExtensions.filter((e) => {
182
+ if (options == null ? void 0 : options.markMapping) {
183
+ return !(e.name in options.markMapping);
184
+ }
185
+ return true;
186
+ }).map((mark) => mapMarkExtensionToReactNode(domOutputSpecToElement, mark, extensionAttributes, options))
187
+ ),
188
+ ...options == null ? void 0 : options.markMapping
189
+ }
190
+ })({ content });
191
+ }
192
+
193
+ // src/json/renderer.ts
194
+ function TiptapStaticRenderer(renderComponent, {
195
+ nodeMapping,
196
+ markMapping,
197
+ unhandledNode,
198
+ unhandledMark
199
+ }) {
200
+ return function renderContent({
201
+ content,
202
+ parent
203
+ }) {
204
+ var _a;
205
+ const nodeType = typeof content.type === "string" ? content.type : content.type.name;
206
+ const NodeHandler = (_a = nodeMapping[nodeType]) != null ? _a : unhandledNode;
207
+ if (!NodeHandler) {
208
+ throw new Error(`missing handler for node type ${nodeType}`);
209
+ }
210
+ const nodeContent = renderComponent({
211
+ component: NodeHandler,
212
+ props: {
213
+ node: content,
214
+ parent,
215
+ renderElement: renderContent,
216
+ // Lazily compute the children to avoid unnecessary recursion
217
+ get children() {
218
+ const children = [];
219
+ if (content.content) {
220
+ content.content.forEach((child) => {
221
+ children.push(
222
+ renderContent({
223
+ content: child,
224
+ parent: content
225
+ })
226
+ );
227
+ });
228
+ }
229
+ return children;
230
+ }
231
+ }
232
+ });
233
+ const markedContent = content.marks ? content.marks.reduce((acc, mark) => {
234
+ var _a2;
235
+ const markType = typeof mark.type === "string" ? mark.type : mark.type.name;
236
+ const MarkHandler = (_a2 = markMapping[markType]) != null ? _a2 : unhandledMark;
237
+ if (!MarkHandler) {
238
+ throw new Error(`missing handler for mark type ${markType}`);
239
+ }
240
+ return renderComponent({
241
+ component: MarkHandler,
242
+ props: {
243
+ mark,
244
+ parent,
245
+ node: content,
246
+ children: acc
247
+ }
248
+ });
249
+ }, nodeContent) : nodeContent;
250
+ return markedContent;
251
+ };
252
+ }
253
+
254
+ // src/json/html-string/string.ts
255
+ function renderJSONContentToString(options) {
256
+ return TiptapStaticRenderer((ctx) => {
257
+ return ctx.component(ctx.props);
258
+ }, options);
259
+ }
260
+ function serializeAttrsToHTMLString(attrs) {
261
+ const output = Object.entries(attrs || {}).map(([key, value]) => `${key.split(" ").at(-1)}=${JSON.stringify(value)}`).join(" ");
262
+ return output ? ` ${output}` : "";
263
+ }
264
+ function serializeChildrenToHTMLString(children) {
265
+ return [].concat(children || "").filter(Boolean).join("");
266
+ }
267
+
268
+ // src/pm/html-string/html-string.ts
269
+ function domOutputSpecToHTMLString(content) {
270
+ if (typeof content === "string") {
271
+ return () => content;
272
+ }
273
+ if (typeof content === "object" && "length" in content) {
274
+ const [_tag, attrs, children, ...rest] = content;
275
+ let tag = _tag;
276
+ const parts = tag.split(" ");
277
+ if (parts.length > 1) {
278
+ tag = `${parts[1]} xmlns="${parts[0]}"`;
279
+ }
280
+ if (attrs === void 0) {
281
+ return () => `<${tag}/>`;
282
+ }
283
+ if (attrs === 0) {
284
+ return (child) => `<${tag}>${serializeChildrenToHTMLString(child)}</${tag}>`;
285
+ }
286
+ if (typeof attrs === "object") {
287
+ if (Array.isArray(attrs)) {
288
+ if (children === void 0) {
289
+ return (child) => `<${tag}>${domOutputSpecToHTMLString(attrs)(child)}</${tag}>`;
290
+ }
291
+ if (children === 0) {
292
+ return (child) => `<${tag}>${domOutputSpecToHTMLString(attrs)(child)}</${tag}>`;
293
+ }
294
+ return (child) => `<${tag}>${domOutputSpecToHTMLString(attrs)(child)}${[children].concat(rest).map((a) => domOutputSpecToHTMLString(a)(child))}</${tag}>`;
295
+ }
296
+ if (children === void 0) {
297
+ return () => `<${tag}${serializeAttrsToHTMLString(attrs)}/>`;
298
+ }
299
+ if (children === 0) {
300
+ return (child) => `<${tag}${serializeAttrsToHTMLString(attrs)}>${serializeChildrenToHTMLString(child)}</${tag}>`;
301
+ }
302
+ return (child) => `<${tag}${serializeAttrsToHTMLString(attrs)}>${[children].concat(rest).map((a) => domOutputSpecToHTMLString(a)(child)).join("")}</${tag}>`;
303
+ }
304
+ }
305
+ throw new Error(
306
+ "[tiptap error]: Unsupported DomOutputSpec type, check the `renderHTML` method output or implement a node mapping",
307
+ {
308
+ cause: content
309
+ }
310
+ );
311
+ }
312
+ function renderToHTMLString({
313
+ content,
314
+ extensions,
315
+ options
316
+ }) {
317
+ return renderToElement({
318
+ renderer: renderJSONContentToString,
319
+ domOutputSpecToElement: domOutputSpecToHTMLString,
320
+ mapDefinedTypes: {
321
+ // Map a doc node to concatenated children
322
+ doc: ({ children }) => serializeChildrenToHTMLString(children),
323
+ // Map a text node to its text content
324
+ text: ({ node }) => {
325
+ var _a;
326
+ return (_a = node.text) != null ? _a : "";
327
+ }
328
+ },
329
+ content,
330
+ extensions,
331
+ options
332
+ });
333
+ }
334
+ // Annotate the CommonJS export names for ESM import in node:
335
+ 0 && (module.exports = {
336
+ domOutputSpecToHTMLString,
337
+ mapMarkExtensionToReactNode,
338
+ mapNodeExtensionToReactNode,
339
+ renderToElement,
340
+ renderToHTMLString,
341
+ serializeAttrsToHTMLString,
342
+ serializeChildrenToHTMLString
343
+ });
344
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/pm/html-string/index.ts","../../../src/pm/extensionRenderer.ts","../../../src/helpers.ts","../../../src/json/renderer.ts","../../../src/json/html-string/string.ts","../../../src/pm/html-string/html-string.ts"],"sourcesContent":["export * from '../extensionRenderer.js'\nexport * from './html-string.js'\n","/* eslint-disable no-plusplus */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type {\n ExtensionAttribute,\n Extensions,\n JSONContent,\n Mark as MarkExtension,\n MarkConfig,\n Node as NodeExtension,\n NodeConfig,\n} from '@tiptap/core'\nimport {\n getAttributesFromExtensions,\n getExtensionField,\n getSchemaByResolvedExtensions,\n resolveExtensions,\n splitExtensions,\n} from '@tiptap/core'\nimport type { DOMOutputSpec, Mark } from '@tiptap/pm/model'\nimport { Node } from '@tiptap/pm/model'\n\nimport { getHTMLAttributes } from '../helpers.js'\nimport type { MarkProps, NodeProps, TiptapStaticRendererOptions } from '../json/renderer.js'\n\nexport type DomOutputSpecToElement<T> = (content: DOMOutputSpec) => (children?: T | T[]) => T\n\n/**\n * This takes a NodeExtension and maps it to a React component\n * @param extension The node extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapNodeExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: NodeExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledNode'>>,\n): [string, (props: NodeProps<Node, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<NodeConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledNode) {\n return [extension.name, options.unhandledNode]\n }\n return [\n extension.name,\n () => {\n throw new Error(\n `[tiptap error]: Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method, please implement it or override the corresponding \"nodeMapping\" method to have a custom rendering`,\n )\n },\n ]\n }\n\n return [\n extension.name,\n ({ node, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n node,\n HTMLAttributes: getHTMLAttributes(node, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Node ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This takes a MarkExtension and maps it to a React component\n * @param extension The mark extension to map to a React component\n * @param extensionAttributes All available extension attributes\n * @returns A tuple with the name of the extension and a React component that renders the extension\n */\nexport function mapMarkExtensionToReactNode<T>(\n domOutputSpecToElement: DomOutputSpecToElement<T>,\n extension: MarkExtension,\n extensionAttributes: ExtensionAttribute[],\n options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node>, 'unhandledMark'>>,\n): [string, (props: MarkProps<Mark, T | T[]>) => T] {\n const context = {\n name: extension.name,\n options: extension.options,\n storage: extension.storage,\n parent: extension.parent,\n }\n\n const renderToHTML = getExtensionField<MarkConfig['renderHTML']>(extension, 'renderHTML', context)\n\n if (!renderToHTML) {\n if (options?.unhandledMark) {\n return [extension.name, options.unhandledMark]\n }\n return [\n extension.name,\n () => {\n throw new Error(`Node ${extension.name} cannot be rendered, it is missing a \"renderToHTML\" method`)\n },\n ]\n }\n\n return [\n extension.name,\n ({ mark, children }) => {\n try {\n return domOutputSpecToElement(\n renderToHTML({\n mark,\n HTMLAttributes: getHTMLAttributes(mark, extensionAttributes),\n }),\n )(children)\n } catch (e) {\n throw new Error(\n `[tiptap error]: Mark ${\n extension.name\n } cannot be rendered, it's \"renderToHTML\" method threw an error: ${(e as Error).message}`,\n { cause: e },\n )\n }\n },\n ]\n}\n\n/**\n * This function will statically render a Prosemirror Node to a target element type using the given extensions\n * @param renderer The renderer to use to render the Prosemirror Node to the target element type\n * @param domOutputSpecToElement A function that takes a Prosemirror DOMOutputSpec and returns a function that takes children and returns the target element type\n * @param mapDefinedTypes An object with functions to map the doc and text types to the target element type\n * @param content The Prosemirror Node to render\n * @param extensions The extensions to use to render the Prosemirror Node\n * @param options Additional options to pass to the renderer that can override the default behavior\n * @returns The rendered target element type\n */\nexport function renderToElement<T>({\n renderer,\n domOutputSpecToElement,\n mapDefinedTypes,\n content,\n extensions,\n options,\n}: {\n renderer: (options: TiptapStaticRendererOptions<T, Mark, Node>) => (ctx: { content: Node }) => T\n domOutputSpecToElement: DomOutputSpecToElement<T>\n mapDefinedTypes: {\n doc: (props: NodeProps<Node, T | T[]>) => T\n text: (props: NodeProps<Node, T | T[]>) => T\n }\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<T, Mark, Node>>\n}): T {\n // get all extensions in order & split them into nodes and marks\n extensions = resolveExtensions(extensions)\n const extensionAttributes = getAttributesFromExtensions(extensions)\n const { nodeExtensions, markExtensions } = splitExtensions(extensions)\n\n if (!(content instanceof Node)) {\n content = Node.fromJSON(getSchemaByResolvedExtensions(extensions), content)\n }\n\n return renderer({\n ...options,\n nodeMapping: {\n ...Object.fromEntries(\n nodeExtensions\n .filter(e => {\n if (e.name in mapDefinedTypes) {\n // These are predefined types that we don't need to map\n return false\n }\n // No need to generate mappings for nodes that are already mapped\n if (options?.nodeMapping) {\n return !(e.name in options.nodeMapping)\n }\n return true\n })\n .map(nodeExtension =>\n mapNodeExtensionToReactNode<T>(domOutputSpecToElement, nodeExtension, extensionAttributes, options),\n ),\n ),\n ...mapDefinedTypes,\n ...options?.nodeMapping,\n },\n markMapping: {\n ...Object.fromEntries(\n markExtensions\n .filter(e => {\n // No need to generate mappings for marks that are already mapped\n if (options?.markMapping) {\n return !(e.name in options.markMapping)\n }\n return true\n })\n .map(mark => mapMarkExtensionToReactNode<T>(domOutputSpecToElement, mark, extensionAttributes, options)),\n ),\n ...options?.markMapping,\n },\n })({ content })\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ExtensionAttribute, type MarkType, type NodeType, mergeAttributes } from '@tiptap/core'\n\n/**\n * This function returns the attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n * @param onlyRenderedAttributes If true, only attributes that are rendered in the HTML are returned\n */\nexport function getAttributes(\n nodeOrMark: NodeType | MarkType,\n extensionAttributes: ExtensionAttribute[],\n onlyRenderedAttributes?: boolean,\n): Record<string, any> {\n const nodeOrMarkAttributes = nodeOrMark.attrs\n\n if (!nodeOrMarkAttributes) {\n return {}\n }\n\n return extensionAttributes\n .filter(item => {\n if (item.type !== (typeof nodeOrMark.type === 'string' ? nodeOrMark.type : nodeOrMark.type.name)) {\n return false\n }\n if (onlyRenderedAttributes) {\n return item.attribute.rendered\n }\n return true\n })\n .map(item => {\n if (!item.attribute.renderHTML) {\n return {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n }\n\n return (\n item.attribute.renderHTML(nodeOrMarkAttributes) || {\n [item.name]: item.name in nodeOrMarkAttributes ? nodeOrMarkAttributes[item.name] : item.attribute.default,\n }\n )\n })\n .reduce((attributes, attribute) => mergeAttributes(attributes, attribute), {})\n}\n\n/**\n * This function returns the HTML attributes of a node or mark that are defined by the given extension attributes.\n * @param nodeOrMark The node or mark to get the attributes from\n * @param extensionAttributes The extension attributes to use\n */\nexport function getHTMLAttributes(nodeOrMark: NodeType | MarkType, extensionAttributes: ExtensionAttribute[]) {\n return getAttributes(nodeOrMark, extensionAttributes, true)\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MarkType, NodeType } from '@tiptap/core'\n\n/**\n * Props for a node renderer\n */\nexport type NodeProps<TNodeType = any, TChildren = any> = {\n /**\n * The current node to render\n */\n node: TNodeType\n /**\n * Unless the node is the root node, this will always be defined\n */\n parent?: TNodeType\n /**\n * The children of the current node\n */\n children?: TChildren\n /**\n * Render a child element\n */\n renderElement: (props: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }) => TChildren\n}\n\n/**\n * Props for a mark renderer\n */\nexport type MarkProps<TMarkType = any, TChildren = any, TNodeType = any> = {\n /**\n * The current mark to render\n */\n mark: TMarkType\n /**\n * The children of the current mark\n */\n children?: TChildren\n /**\n * The node the current mark is applied to\n */\n node: TNodeType\n /**\n * The node the current mark is applied to\n */\n parent?: TNodeType\n}\n\nexport type TiptapStaticRendererOptions<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n> = {\n /**\n * Mapping of node types to react components\n */\n nodeMapping: Record<string, NoInfer<TNodeRender>>\n /**\n * Mapping of mark types to react components\n */\n markMapping: Record<string, NoInfer<TMarkRender>>\n /**\n * Component to render if a node type is not handled\n */\n unhandledNode?: NoInfer<TNodeRender>\n /**\n * Component to render if a mark type is not handled\n */\n unhandledMark?: NoInfer<TMarkRender>\n}\n\n/**\n * Tiptap Static Renderer\n * ----------------------\n *\n * This function is a basis to allow for different renderers to be created.\n * Generic enough to be able to statically render Prosemirror JSON or Prosemirror Nodes.\n *\n * Using this function, you can create a renderer that takes a JSON representation of a Prosemirror document\n * and renders it using a mapping of node types to React components or even to a string.\n * This function is used as the basis to create the `reactRenderer` and `stringRenderer` functions.\n */\nexport function TiptapStaticRenderer<\n /**\n * The return type of the render function (e.g. React.ReactNode, string)\n */\n TReturnType,\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: string | { name: string } } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n /**\n * A node renderer is a function that takes a node and its children and returns the rendered output\n */\n TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (\n ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>,\n ) => TReturnType,\n /**\n * A mark renderer is a function that takes a mark and its children and returns the rendered output\n */\n TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (\n ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>,\n ) => TReturnType,\n>(\n /**\n * The function that actually renders the component\n */\n renderComponent: (\n ctx:\n | {\n component: TNodeRender\n props: NodeProps<TNodeType, TReturnType | TReturnType[]>\n }\n | {\n component: TMarkRender\n props: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>\n },\n ) => TReturnType,\n {\n nodeMapping,\n markMapping,\n unhandledNode,\n unhandledMark,\n }: TiptapStaticRendererOptions<TReturnType, TMarkType, TNodeType, TNodeRender, TMarkRender>,\n) {\n /**\n * Render Tiptap JSON and all its children using the provided node and mark mappings.\n */\n return function renderContent({\n content,\n parent,\n }: {\n /**\n * Tiptap JSON content to render\n */\n content: TNodeType\n /**\n * The parent node of the current node\n */\n parent?: TNodeType\n }): TReturnType {\n const nodeType = typeof content.type === 'string' ? content.type : content.type.name\n const NodeHandler = nodeMapping[nodeType] ?? unhandledNode\n\n if (!NodeHandler) {\n throw new Error(`missing handler for node type ${nodeType}`)\n }\n\n const nodeContent = renderComponent({\n component: NodeHandler,\n props: {\n node: content,\n parent,\n renderElement: renderContent,\n // Lazily compute the children to avoid unnecessary recursion\n get children() {\n // recursively render child content nodes\n const children: TReturnType[] = []\n\n if (content.content) {\n content.content.forEach(child => {\n children.push(\n renderContent({\n content: child,\n parent: content,\n }),\n )\n })\n }\n\n return children\n },\n },\n })\n\n // apply marks to the content\n const markedContent = content.marks\n ? content.marks.reduce((acc, mark) => {\n const markType = typeof mark.type === 'string' ? mark.type : mark.type.name\n const MarkHandler = markMapping[markType] ?? unhandledMark\n\n if (!MarkHandler) {\n throw new Error(`missing handler for mark type ${markType}`)\n }\n\n return renderComponent({\n component: MarkHandler,\n props: {\n mark,\n parent,\n node: content,\n children: acc,\n },\n })\n }, nodeContent)\n : nodeContent\n\n return markedContent\n }\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { MarkType, NodeType } from '@tiptap/core'\n\nimport type { TiptapStaticRendererOptions } from '../renderer.js'\nimport { TiptapStaticRenderer } from '../renderer.js'\n\nexport function renderJSONContentToString<\n /**\n * A mark type is either a JSON representation of a mark or a Prosemirror mark instance\n */\n TMarkType extends { type: any } = MarkType,\n /**\n * A node type is either a JSON representation of a node or a Prosemirror node instance\n */\n TNodeType extends {\n content?: { forEach: (cb: (node: TNodeType) => void) => void }\n marks?: readonly TMarkType[]\n type: string | { name: string }\n } = NodeType,\n>(options: TiptapStaticRendererOptions<string, TMarkType, TNodeType>) {\n return TiptapStaticRenderer(ctx => {\n return ctx.component(ctx.props as any)\n }, options)\n}\n\n/**\n * Serialize the attributes of a node or mark to a string\n * @param attrs The attributes to serialize\n * @returns The serialized attributes as a string\n */\nexport function serializeAttrsToHTMLString(attrs: Record<string, any> | undefined | null): string {\n const output = Object.entries(attrs || {})\n .map(([key, value]) => `${key.split(' ').at(-1)}=${JSON.stringify(value)}`)\n .join(' ')\n\n return output ? ` ${output}` : ''\n}\n\n/**\n * Serialize the children of a node or mark to a string\n * @param children The children to serialize\n * @returns The serialized children as a string\n */\nexport function serializeChildrenToHTMLString(children?: string | string[]): string {\n return ([] as string[])\n .concat(children || '')\n .filter(Boolean)\n .join('')\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { DOMOutputSpecArray, Extensions, JSONContent } from '@tiptap/core'\nimport type { DOMOutputSpec, Mark, Node } from '@tiptap/pm/model'\n\nimport {\n renderJSONContentToString,\n serializeAttrsToHTMLString,\n serializeChildrenToHTMLString,\n} from '../../json/html-string/string.js'\nimport type { TiptapStaticRendererOptions } from '../../json/renderer.js'\nimport { renderToElement } from '../extensionRenderer.js'\n\nexport { serializeAttrsToHTMLString, serializeChildrenToHTMLString } from '../../json/html-string/string.js'\n\n/**\n * Take a DOMOutputSpec and return a function that can render it to a string\n * @param content The DOMOutputSpec to convert to a string\n * @returns A function that can render the DOMOutputSpec to a string\n */\nexport function domOutputSpecToHTMLString(content: DOMOutputSpec): (children?: string | string[]) => string {\n if (typeof content === 'string') {\n return () => content\n }\n if (typeof content === 'object' && 'length' in content) {\n const [_tag, attrs, children, ...rest] = content as DOMOutputSpecArray\n let tag = _tag\n const parts = tag.split(' ')\n\n if (parts.length > 1) {\n tag = `${parts[1]} xmlns=\"${parts[0]}\"`\n }\n\n if (attrs === undefined) {\n return () => `<${tag}/>`\n }\n if (attrs === 0) {\n return child => `<${tag}>${serializeChildrenToHTMLString(child)}</${tag}>`\n }\n if (typeof attrs === 'object') {\n if (Array.isArray(attrs)) {\n if (children === undefined) {\n return child => `<${tag}>${domOutputSpecToHTMLString(attrs as DOMOutputSpecArray)(child)}</${tag}>`\n }\n if (children === 0) {\n return child => `<${tag}>${domOutputSpecToHTMLString(attrs as DOMOutputSpecArray)(child)}</${tag}>`\n }\n return child =>\n `<${tag}>${domOutputSpecToHTMLString(attrs as DOMOutputSpecArray)(child)}${[children]\n .concat(rest)\n .map(a => domOutputSpecToHTMLString(a)(child))}</${tag}>`\n }\n if (children === undefined) {\n return () => `<${tag}${serializeAttrsToHTMLString(attrs)}/>`\n }\n if (children === 0) {\n return child => `<${tag}${serializeAttrsToHTMLString(attrs)}>${serializeChildrenToHTMLString(child)}</${tag}>`\n }\n\n return child =>\n `<${tag}${serializeAttrsToHTMLString(attrs)}>${[children]\n .concat(rest)\n .map(a => domOutputSpecToHTMLString(a)(child))\n .join('')}</${tag}>`\n }\n }\n\n // TODO support DOM elements? How to handle them?\n throw new Error(\n '[tiptap error]: Unsupported DomOutputSpec type, check the `renderHTML` method output or implement a node mapping',\n {\n cause: content,\n },\n )\n}\n\n/**\n * This function will statically render a Prosemirror Node to HTML using the provided extensions and options\n * @param content The content to render to HTML\n * @param extensions The extensions to use for rendering\n * @param options The options to use for rendering\n * @returns The rendered HTML string\n */\nexport function renderToHTMLString({\n content,\n extensions,\n options,\n}: {\n content: Node | JSONContent\n extensions: Extensions\n options?: Partial<TiptapStaticRendererOptions<string, Mark, Node>>\n}): string {\n return renderToElement<string>({\n renderer: renderJSONContentToString,\n domOutputSpecToElement: domOutputSpecToHTMLString,\n mapDefinedTypes: {\n // Map a doc node to concatenated children\n doc: ({ children }) => serializeChildrenToHTMLString(children),\n // Map a text node to its text content\n text: ({ node }) => node.text ?? '',\n },\n content,\n extensions,\n options,\n })\n}\n"],"mappings":"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","names":["import_core","_a"]}
@@ -0,0 +1,175 @@
1
+ import { MarkType, NodeType, Node, ExtensionAttribute, Mark as Mark$1, JSONContent, Extensions } from '@tiptap/core';
2
+ import { DOMOutputSpec, Mark, Node as Node$1 } from '@tiptap/pm/model';
3
+
4
+ /**
5
+ * Props for a node renderer
6
+ */
7
+ type NodeProps<TNodeType = any, TChildren = any> = {
8
+ /**
9
+ * The current node to render
10
+ */
11
+ node: TNodeType;
12
+ /**
13
+ * Unless the node is the root node, this will always be defined
14
+ */
15
+ parent?: TNodeType;
16
+ /**
17
+ * The children of the current node
18
+ */
19
+ children?: TChildren;
20
+ /**
21
+ * Render a child element
22
+ */
23
+ renderElement: (props: {
24
+ /**
25
+ * Tiptap JSON content to render
26
+ */
27
+ content: TNodeType;
28
+ /**
29
+ * The parent node of the current node
30
+ */
31
+ parent?: TNodeType;
32
+ }) => TChildren;
33
+ };
34
+ /**
35
+ * Props for a mark renderer
36
+ */
37
+ type MarkProps<TMarkType = any, TChildren = any, TNodeType = any> = {
38
+ /**
39
+ * The current mark to render
40
+ */
41
+ mark: TMarkType;
42
+ /**
43
+ * The children of the current mark
44
+ */
45
+ children?: TChildren;
46
+ /**
47
+ * The node the current mark is applied to
48
+ */
49
+ node: TNodeType;
50
+ /**
51
+ * The node the current mark is applied to
52
+ */
53
+ parent?: TNodeType;
54
+ };
55
+ type TiptapStaticRendererOptions<
56
+ /**
57
+ * The return type of the render function (e.g. React.ReactNode, string)
58
+ */
59
+ TReturnType,
60
+ /**
61
+ * A mark type is either a JSON representation of a mark or a Prosemirror mark instance
62
+ */
63
+ TMarkType extends {
64
+ type: any;
65
+ } = MarkType,
66
+ /**
67
+ * A node type is either a JSON representation of a node or a Prosemirror node instance
68
+ */
69
+ TNodeType extends {
70
+ content?: {
71
+ forEach: (cb: (node: TNodeType) => void) => void;
72
+ };
73
+ marks?: readonly TMarkType[];
74
+ type: string | {
75
+ name: string;
76
+ };
77
+ } = NodeType,
78
+ /**
79
+ * A node renderer is a function that takes a node and its children and returns the rendered output
80
+ */
81
+ TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType,
82
+ /**
83
+ * A mark renderer is a function that takes a mark and its children and returns the rendered output
84
+ */
85
+ TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType> = {
86
+ /**
87
+ * Mapping of node types to react components
88
+ */
89
+ nodeMapping: Record<string, NoInfer<TNodeRender>>;
90
+ /**
91
+ * Mapping of mark types to react components
92
+ */
93
+ markMapping: Record<string, NoInfer<TMarkRender>>;
94
+ /**
95
+ * Component to render if a node type is not handled
96
+ */
97
+ unhandledNode?: NoInfer<TNodeRender>;
98
+ /**
99
+ * Component to render if a mark type is not handled
100
+ */
101
+ unhandledMark?: NoInfer<TMarkRender>;
102
+ };
103
+
104
+ type DomOutputSpecToElement<T> = (content: DOMOutputSpec) => (children?: T | T[]) => T;
105
+ /**
106
+ * This takes a NodeExtension and maps it to a React component
107
+ * @param extension The node extension to map to a React component
108
+ * @param extensionAttributes All available extension attributes
109
+ * @returns A tuple with the name of the extension and a React component that renders the extension
110
+ */
111
+ declare function mapNodeExtensionToReactNode<T>(domOutputSpecToElement: DomOutputSpecToElement<T>, extension: Node, extensionAttributes: ExtensionAttribute[], options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node$1>, 'unhandledNode'>>): [string, (props: NodeProps<Node$1, T | T[]>) => T];
112
+ /**
113
+ * This takes a MarkExtension and maps it to a React component
114
+ * @param extension The mark extension to map to a React component
115
+ * @param extensionAttributes All available extension attributes
116
+ * @returns A tuple with the name of the extension and a React component that renders the extension
117
+ */
118
+ declare function mapMarkExtensionToReactNode<T>(domOutputSpecToElement: DomOutputSpecToElement<T>, extension: Mark$1, extensionAttributes: ExtensionAttribute[], options?: Partial<Pick<TiptapStaticRendererOptions<T, Mark, Node$1>, 'unhandledMark'>>): [string, (props: MarkProps<Mark, T | T[]>) => T];
119
+ /**
120
+ * This function will statically render a Prosemirror Node to a target element type using the given extensions
121
+ * @param renderer The renderer to use to render the Prosemirror Node to the target element type
122
+ * @param domOutputSpecToElement A function that takes a Prosemirror DOMOutputSpec and returns a function that takes children and returns the target element type
123
+ * @param mapDefinedTypes An object with functions to map the doc and text types to the target element type
124
+ * @param content The Prosemirror Node to render
125
+ * @param extensions The extensions to use to render the Prosemirror Node
126
+ * @param options Additional options to pass to the renderer that can override the default behavior
127
+ * @returns The rendered target element type
128
+ */
129
+ declare function renderToElement<T>({ renderer, domOutputSpecToElement, mapDefinedTypes, content, extensions, options, }: {
130
+ renderer: (options: TiptapStaticRendererOptions<T, Mark, Node$1>) => (ctx: {
131
+ content: Node$1;
132
+ }) => T;
133
+ domOutputSpecToElement: DomOutputSpecToElement<T>;
134
+ mapDefinedTypes: {
135
+ doc: (props: NodeProps<Node$1, T | T[]>) => T;
136
+ text: (props: NodeProps<Node$1, T | T[]>) => T;
137
+ };
138
+ content: Node$1 | JSONContent;
139
+ extensions: Extensions;
140
+ options?: Partial<TiptapStaticRendererOptions<T, Mark, Node$1>>;
141
+ }): T;
142
+
143
+ /**
144
+ * Serialize the attributes of a node or mark to a string
145
+ * @param attrs The attributes to serialize
146
+ * @returns The serialized attributes as a string
147
+ */
148
+ declare function serializeAttrsToHTMLString(attrs: Record<string, any> | undefined | null): string;
149
+ /**
150
+ * Serialize the children of a node or mark to a string
151
+ * @param children The children to serialize
152
+ * @returns The serialized children as a string
153
+ */
154
+ declare function serializeChildrenToHTMLString(children?: string | string[]): string;
155
+
156
+ /**
157
+ * Take a DOMOutputSpec and return a function that can render it to a string
158
+ * @param content The DOMOutputSpec to convert to a string
159
+ * @returns A function that can render the DOMOutputSpec to a string
160
+ */
161
+ declare function domOutputSpecToHTMLString(content: DOMOutputSpec): (children?: string | string[]) => string;
162
+ /**
163
+ * This function will statically render a Prosemirror Node to HTML using the provided extensions and options
164
+ * @param content The content to render to HTML
165
+ * @param extensions The extensions to use for rendering
166
+ * @param options The options to use for rendering
167
+ * @returns The rendered HTML string
168
+ */
169
+ declare function renderToHTMLString({ content, extensions, options, }: {
170
+ content: Node$1 | JSONContent;
171
+ extensions: Extensions;
172
+ options?: Partial<TiptapStaticRendererOptions<string, Mark, Node$1>>;
173
+ }): string;
174
+
175
+ export { type DomOutputSpecToElement, domOutputSpecToHTMLString, mapMarkExtensionToReactNode, mapNodeExtensionToReactNode, renderToElement, renderToHTMLString, serializeAttrsToHTMLString, serializeChildrenToHTMLString };