@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,111 @@
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/json/html-string/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ TiptapStaticRenderer: () => TiptapStaticRenderer,
24
+ renderJSONContentToString: () => renderJSONContentToString,
25
+ serializeAttrsToHTMLString: () => serializeAttrsToHTMLString,
26
+ serializeChildrenToHTMLString: () => serializeChildrenToHTMLString
27
+ });
28
+ module.exports = __toCommonJS(index_exports);
29
+
30
+ // src/json/renderer.ts
31
+ function TiptapStaticRenderer(renderComponent, {
32
+ nodeMapping,
33
+ markMapping,
34
+ unhandledNode,
35
+ unhandledMark
36
+ }) {
37
+ return function renderContent({
38
+ content,
39
+ parent
40
+ }) {
41
+ var _a;
42
+ const nodeType = typeof content.type === "string" ? content.type : content.type.name;
43
+ const NodeHandler = (_a = nodeMapping[nodeType]) != null ? _a : unhandledNode;
44
+ if (!NodeHandler) {
45
+ throw new Error(`missing handler for node type ${nodeType}`);
46
+ }
47
+ const nodeContent = renderComponent({
48
+ component: NodeHandler,
49
+ props: {
50
+ node: content,
51
+ parent,
52
+ renderElement: renderContent,
53
+ // Lazily compute the children to avoid unnecessary recursion
54
+ get children() {
55
+ const children = [];
56
+ if (content.content) {
57
+ content.content.forEach((child) => {
58
+ children.push(
59
+ renderContent({
60
+ content: child,
61
+ parent: content
62
+ })
63
+ );
64
+ });
65
+ }
66
+ return children;
67
+ }
68
+ }
69
+ });
70
+ const markedContent = content.marks ? content.marks.reduce((acc, mark) => {
71
+ var _a2;
72
+ const markType = typeof mark.type === "string" ? mark.type : mark.type.name;
73
+ const MarkHandler = (_a2 = markMapping[markType]) != null ? _a2 : unhandledMark;
74
+ if (!MarkHandler) {
75
+ throw new Error(`missing handler for mark type ${markType}`);
76
+ }
77
+ return renderComponent({
78
+ component: MarkHandler,
79
+ props: {
80
+ mark,
81
+ parent,
82
+ node: content,
83
+ children: acc
84
+ }
85
+ });
86
+ }, nodeContent) : nodeContent;
87
+ return markedContent;
88
+ };
89
+ }
90
+
91
+ // src/json/html-string/string.ts
92
+ function renderJSONContentToString(options) {
93
+ return TiptapStaticRenderer((ctx) => {
94
+ return ctx.component(ctx.props);
95
+ }, options);
96
+ }
97
+ function serializeAttrsToHTMLString(attrs) {
98
+ const output = Object.entries(attrs || {}).map(([key, value]) => `${key.split(" ").at(-1)}=${JSON.stringify(value)}`).join(" ");
99
+ return output ? ` ${output}` : "";
100
+ }
101
+ function serializeChildrenToHTMLString(children) {
102
+ return [].concat(children || "").filter(Boolean).join("");
103
+ }
104
+ // Annotate the CommonJS export names for ESM import in node:
105
+ 0 && (module.exports = {
106
+ TiptapStaticRenderer,
107
+ renderJSONContentToString,
108
+ serializeAttrsToHTMLString,
109
+ serializeChildrenToHTMLString
110
+ });
111
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/json/html-string/index.ts","../../../src/json/renderer.ts","../../../src/json/html-string/string.ts"],"sourcesContent":["export * from '../renderer.js'\nexport * from './string.js'\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"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACmHO,SAAS,qBAiCd,iBAWA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACA;AAIA,SAAO,SAAS,cAAc;AAAA,IAC5B;AAAA,IACA;AAAA,EACF,GASgB;AArLlB;AAsLI,UAAM,WAAW,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO,QAAQ,KAAK;AAChF,UAAM,eAAc,iBAAY,QAAQ,MAApB,YAAyB;AAE7C,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,iCAAiC,QAAQ,EAAE;AAAA,IAC7D;AAEA,UAAM,cAAc,gBAAgB;AAAA,MAClC,WAAW;AAAA,MACX,OAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA,eAAe;AAAA;AAAA,QAEf,IAAI,WAAW;AAEb,gBAAM,WAA0B,CAAC;AAEjC,cAAI,QAAQ,SAAS;AACnB,oBAAQ,QAAQ,QAAQ,WAAS;AAC/B,uBAAS;AAAA,gBACP,cAAc;AAAA,kBACZ,SAAS;AAAA,kBACT,QAAQ;AAAA,gBACV,CAAC;AAAA,cACH;AAAA,YACF,CAAC;AAAA,UACH;AAEA,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAGD,UAAM,gBAAgB,QAAQ,QAC1B,QAAQ,MAAM,OAAO,CAAC,KAAK,SAAS;AA1N5C,UAAAA;AA2NU,YAAM,WAAW,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO,KAAK,KAAK;AACvE,YAAM,eAAcA,MAAA,YAAY,QAAQ,MAApB,OAAAA,MAAyB;AAE7C,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,iCAAiC,QAAQ,EAAE;AAAA,MAC7D;AAEA,aAAO,gBAAgB;AAAA,QACrB,WAAW;AAAA,QACX,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN,UAAU;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH,GAAG,WAAW,IACd;AAEJ,WAAO;AAAA,EACT;AACF;;;AC1OO,SAAS,0BAad,SAAoE;AACpE,SAAO,qBAAqB,SAAO;AACjC,WAAO,IAAI,UAAU,IAAI,KAAY;AAAA,EACvC,GAAG,OAAO;AACZ;AAOO,SAAS,2BAA2B,OAAuD;AAChG,QAAM,SAAS,OAAO,QAAQ,SAAS,CAAC,CAAC,EACtC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,IAAI,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,KAAK,UAAU,KAAK,CAAC,EAAE,EACzE,KAAK,GAAG;AAEX,SAAO,SAAS,IAAI,MAAM,KAAK;AACjC;AAOO,SAAS,8BAA8B,UAAsC;AAClF,SAAQ,CAAC,EACN,OAAO,YAAY,EAAE,EACrB,OAAO,OAAO,EACd,KAAK,EAAE;AACZ;","names":["_a"]}
@@ -0,0 +1,201 @@
1
+ import { MarkType, NodeType } from '@tiptap/core';
2
+
3
+ /**
4
+ * Props for a node renderer
5
+ */
6
+ type NodeProps<TNodeType = any, TChildren = any> = {
7
+ /**
8
+ * The current node to render
9
+ */
10
+ node: TNodeType;
11
+ /**
12
+ * Unless the node is the root node, this will always be defined
13
+ */
14
+ parent?: TNodeType;
15
+ /**
16
+ * The children of the current node
17
+ */
18
+ children?: TChildren;
19
+ /**
20
+ * Render a child element
21
+ */
22
+ renderElement: (props: {
23
+ /**
24
+ * Tiptap JSON content to render
25
+ */
26
+ content: TNodeType;
27
+ /**
28
+ * The parent node of the current node
29
+ */
30
+ parent?: TNodeType;
31
+ }) => TChildren;
32
+ };
33
+ /**
34
+ * Props for a mark renderer
35
+ */
36
+ type MarkProps<TMarkType = any, TChildren = any, TNodeType = any> = {
37
+ /**
38
+ * The current mark to render
39
+ */
40
+ mark: TMarkType;
41
+ /**
42
+ * The children of the current mark
43
+ */
44
+ children?: TChildren;
45
+ /**
46
+ * The node the current mark is applied to
47
+ */
48
+ node: TNodeType;
49
+ /**
50
+ * The node the current mark is applied to
51
+ */
52
+ parent?: TNodeType;
53
+ };
54
+ type TiptapStaticRendererOptions<
55
+ /**
56
+ * The return type of the render function (e.g. React.ReactNode, string)
57
+ */
58
+ TReturnType,
59
+ /**
60
+ * A mark type is either a JSON representation of a mark or a Prosemirror mark instance
61
+ */
62
+ TMarkType extends {
63
+ type: any;
64
+ } = MarkType,
65
+ /**
66
+ * A node type is either a JSON representation of a node or a Prosemirror node instance
67
+ */
68
+ TNodeType extends {
69
+ content?: {
70
+ forEach: (cb: (node: TNodeType) => void) => void;
71
+ };
72
+ marks?: readonly TMarkType[];
73
+ type: string | {
74
+ name: string;
75
+ };
76
+ } = NodeType,
77
+ /**
78
+ * A node renderer is a function that takes a node and its children and returns the rendered output
79
+ */
80
+ TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType,
81
+ /**
82
+ * A mark renderer is a function that takes a mark and its children and returns the rendered output
83
+ */
84
+ TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType> = {
85
+ /**
86
+ * Mapping of node types to react components
87
+ */
88
+ nodeMapping: Record<string, NoInfer<TNodeRender>>;
89
+ /**
90
+ * Mapping of mark types to react components
91
+ */
92
+ markMapping: Record<string, NoInfer<TMarkRender>>;
93
+ /**
94
+ * Component to render if a node type is not handled
95
+ */
96
+ unhandledNode?: NoInfer<TNodeRender>;
97
+ /**
98
+ * Component to render if a mark type is not handled
99
+ */
100
+ unhandledMark?: NoInfer<TMarkRender>;
101
+ };
102
+ /**
103
+ * Tiptap Static Renderer
104
+ * ----------------------
105
+ *
106
+ * This function is a basis to allow for different renderers to be created.
107
+ * Generic enough to be able to statically render Prosemirror JSON or Prosemirror Nodes.
108
+ *
109
+ * Using this function, you can create a renderer that takes a JSON representation of a Prosemirror document
110
+ * and renders it using a mapping of node types to React components or even to a string.
111
+ * This function is used as the basis to create the `reactRenderer` and `stringRenderer` functions.
112
+ */
113
+ declare function TiptapStaticRenderer<
114
+ /**
115
+ * The return type of the render function (e.g. React.ReactNode, string)
116
+ */
117
+ TReturnType,
118
+ /**
119
+ * A mark type is either a JSON representation of a mark or a Prosemirror mark instance
120
+ */
121
+ TMarkType extends {
122
+ type: string | {
123
+ name: string;
124
+ };
125
+ } = MarkType,
126
+ /**
127
+ * A node type is either a JSON representation of a node or a Prosemirror node instance
128
+ */
129
+ TNodeType extends {
130
+ content?: {
131
+ forEach: (cb: (node: TNodeType) => void) => void;
132
+ };
133
+ marks?: readonly TMarkType[];
134
+ type: string | {
135
+ name: string;
136
+ };
137
+ } = NodeType,
138
+ /**
139
+ * A node renderer is a function that takes a node and its children and returns the rendered output
140
+ */
141
+ TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType,
142
+ /**
143
+ * A mark renderer is a function that takes a mark and its children and returns the rendered output
144
+ */
145
+ TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType>(
146
+ /**
147
+ * The function that actually renders the component
148
+ */
149
+ renderComponent: (ctx: {
150
+ component: TNodeRender;
151
+ props: NodeProps<TNodeType, TReturnType | TReturnType[]>;
152
+ } | {
153
+ component: TMarkRender;
154
+ props: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>;
155
+ }) => TReturnType, { nodeMapping, markMapping, unhandledNode, unhandledMark, }: TiptapStaticRendererOptions<TReturnType, TMarkType, TNodeType, TNodeRender, TMarkRender>): ({ content, parent, }: {
156
+ /**
157
+ * Tiptap JSON content to render
158
+ */
159
+ content: TNodeType;
160
+ /**
161
+ * The parent node of the current node
162
+ */
163
+ parent?: TNodeType;
164
+ }) => TReturnType;
165
+
166
+ declare function renderJSONContentToString<
167
+ /**
168
+ * A mark type is either a JSON representation of a mark or a Prosemirror mark instance
169
+ */
170
+ TMarkType extends {
171
+ type: any;
172
+ } = MarkType,
173
+ /**
174
+ * A node type is either a JSON representation of a node or a Prosemirror node instance
175
+ */
176
+ TNodeType extends {
177
+ content?: {
178
+ forEach: (cb: (node: TNodeType) => void) => void;
179
+ };
180
+ marks?: readonly TMarkType[];
181
+ type: string | {
182
+ name: string;
183
+ };
184
+ } = NodeType>(options: TiptapStaticRendererOptions<string, TMarkType, TNodeType>): ({ content, parent, }: {
185
+ content: TNodeType;
186
+ parent?: TNodeType | undefined;
187
+ }) => string;
188
+ /**
189
+ * Serialize the attributes of a node or mark to a string
190
+ * @param attrs The attributes to serialize
191
+ * @returns The serialized attributes as a string
192
+ */
193
+ declare function serializeAttrsToHTMLString(attrs: Record<string, any> | undefined | null): string;
194
+ /**
195
+ * Serialize the children of a node or mark to a string
196
+ * @param children The children to serialize
197
+ * @returns The serialized children as a string
198
+ */
199
+ declare function serializeChildrenToHTMLString(children?: string | string[]): string;
200
+
201
+ export { type MarkProps, type NodeProps, TiptapStaticRenderer, type TiptapStaticRendererOptions, renderJSONContentToString, serializeAttrsToHTMLString, serializeChildrenToHTMLString };
@@ -0,0 +1,201 @@
1
+ import { MarkType, NodeType } from '@tiptap/core';
2
+
3
+ /**
4
+ * Props for a node renderer
5
+ */
6
+ type NodeProps<TNodeType = any, TChildren = any> = {
7
+ /**
8
+ * The current node to render
9
+ */
10
+ node: TNodeType;
11
+ /**
12
+ * Unless the node is the root node, this will always be defined
13
+ */
14
+ parent?: TNodeType;
15
+ /**
16
+ * The children of the current node
17
+ */
18
+ children?: TChildren;
19
+ /**
20
+ * Render a child element
21
+ */
22
+ renderElement: (props: {
23
+ /**
24
+ * Tiptap JSON content to render
25
+ */
26
+ content: TNodeType;
27
+ /**
28
+ * The parent node of the current node
29
+ */
30
+ parent?: TNodeType;
31
+ }) => TChildren;
32
+ };
33
+ /**
34
+ * Props for a mark renderer
35
+ */
36
+ type MarkProps<TMarkType = any, TChildren = any, TNodeType = any> = {
37
+ /**
38
+ * The current mark to render
39
+ */
40
+ mark: TMarkType;
41
+ /**
42
+ * The children of the current mark
43
+ */
44
+ children?: TChildren;
45
+ /**
46
+ * The node the current mark is applied to
47
+ */
48
+ node: TNodeType;
49
+ /**
50
+ * The node the current mark is applied to
51
+ */
52
+ parent?: TNodeType;
53
+ };
54
+ type TiptapStaticRendererOptions<
55
+ /**
56
+ * The return type of the render function (e.g. React.ReactNode, string)
57
+ */
58
+ TReturnType,
59
+ /**
60
+ * A mark type is either a JSON representation of a mark or a Prosemirror mark instance
61
+ */
62
+ TMarkType extends {
63
+ type: any;
64
+ } = MarkType,
65
+ /**
66
+ * A node type is either a JSON representation of a node or a Prosemirror node instance
67
+ */
68
+ TNodeType extends {
69
+ content?: {
70
+ forEach: (cb: (node: TNodeType) => void) => void;
71
+ };
72
+ marks?: readonly TMarkType[];
73
+ type: string | {
74
+ name: string;
75
+ };
76
+ } = NodeType,
77
+ /**
78
+ * A node renderer is a function that takes a node and its children and returns the rendered output
79
+ */
80
+ TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType,
81
+ /**
82
+ * A mark renderer is a function that takes a mark and its children and returns the rendered output
83
+ */
84
+ TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType> = {
85
+ /**
86
+ * Mapping of node types to react components
87
+ */
88
+ nodeMapping: Record<string, NoInfer<TNodeRender>>;
89
+ /**
90
+ * Mapping of mark types to react components
91
+ */
92
+ markMapping: Record<string, NoInfer<TMarkRender>>;
93
+ /**
94
+ * Component to render if a node type is not handled
95
+ */
96
+ unhandledNode?: NoInfer<TNodeRender>;
97
+ /**
98
+ * Component to render if a mark type is not handled
99
+ */
100
+ unhandledMark?: NoInfer<TMarkRender>;
101
+ };
102
+ /**
103
+ * Tiptap Static Renderer
104
+ * ----------------------
105
+ *
106
+ * This function is a basis to allow for different renderers to be created.
107
+ * Generic enough to be able to statically render Prosemirror JSON or Prosemirror Nodes.
108
+ *
109
+ * Using this function, you can create a renderer that takes a JSON representation of a Prosemirror document
110
+ * and renders it using a mapping of node types to React components or even to a string.
111
+ * This function is used as the basis to create the `reactRenderer` and `stringRenderer` functions.
112
+ */
113
+ declare function TiptapStaticRenderer<
114
+ /**
115
+ * The return type of the render function (e.g. React.ReactNode, string)
116
+ */
117
+ TReturnType,
118
+ /**
119
+ * A mark type is either a JSON representation of a mark or a Prosemirror mark instance
120
+ */
121
+ TMarkType extends {
122
+ type: string | {
123
+ name: string;
124
+ };
125
+ } = MarkType,
126
+ /**
127
+ * A node type is either a JSON representation of a node or a Prosemirror node instance
128
+ */
129
+ TNodeType extends {
130
+ content?: {
131
+ forEach: (cb: (node: TNodeType) => void) => void;
132
+ };
133
+ marks?: readonly TMarkType[];
134
+ type: string | {
135
+ name: string;
136
+ };
137
+ } = NodeType,
138
+ /**
139
+ * A node renderer is a function that takes a node and its children and returns the rendered output
140
+ */
141
+ TNodeRender extends (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType = (ctx: NodeProps<TNodeType, TReturnType | TReturnType[]>) => TReturnType,
142
+ /**
143
+ * A mark renderer is a function that takes a mark and its children and returns the rendered output
144
+ */
145
+ TMarkRender extends (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType = (ctx: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>) => TReturnType>(
146
+ /**
147
+ * The function that actually renders the component
148
+ */
149
+ renderComponent: (ctx: {
150
+ component: TNodeRender;
151
+ props: NodeProps<TNodeType, TReturnType | TReturnType[]>;
152
+ } | {
153
+ component: TMarkRender;
154
+ props: MarkProps<TMarkType, TReturnType | TReturnType[], TNodeType>;
155
+ }) => TReturnType, { nodeMapping, markMapping, unhandledNode, unhandledMark, }: TiptapStaticRendererOptions<TReturnType, TMarkType, TNodeType, TNodeRender, TMarkRender>): ({ content, parent, }: {
156
+ /**
157
+ * Tiptap JSON content to render
158
+ */
159
+ content: TNodeType;
160
+ /**
161
+ * The parent node of the current node
162
+ */
163
+ parent?: TNodeType;
164
+ }) => TReturnType;
165
+
166
+ declare function renderJSONContentToString<
167
+ /**
168
+ * A mark type is either a JSON representation of a mark or a Prosemirror mark instance
169
+ */
170
+ TMarkType extends {
171
+ type: any;
172
+ } = MarkType,
173
+ /**
174
+ * A node type is either a JSON representation of a node or a Prosemirror node instance
175
+ */
176
+ TNodeType extends {
177
+ content?: {
178
+ forEach: (cb: (node: TNodeType) => void) => void;
179
+ };
180
+ marks?: readonly TMarkType[];
181
+ type: string | {
182
+ name: string;
183
+ };
184
+ } = NodeType>(options: TiptapStaticRendererOptions<string, TMarkType, TNodeType>): ({ content, parent, }: {
185
+ content: TNodeType;
186
+ parent?: TNodeType | undefined;
187
+ }) => string;
188
+ /**
189
+ * Serialize the attributes of a node or mark to a string
190
+ * @param attrs The attributes to serialize
191
+ * @returns The serialized attributes as a string
192
+ */
193
+ declare function serializeAttrsToHTMLString(attrs: Record<string, any> | undefined | null): string;
194
+ /**
195
+ * Serialize the children of a node or mark to a string
196
+ * @param children The children to serialize
197
+ * @returns The serialized children as a string
198
+ */
199
+ declare function serializeChildrenToHTMLString(children?: string | string[]): string;
200
+
201
+ export { type MarkProps, type NodeProps, TiptapStaticRenderer, type TiptapStaticRendererOptions, renderJSONContentToString, serializeAttrsToHTMLString, serializeChildrenToHTMLString };
@@ -0,0 +1,81 @@
1
+ // src/json/renderer.ts
2
+ function TiptapStaticRenderer(renderComponent, {
3
+ nodeMapping,
4
+ markMapping,
5
+ unhandledNode,
6
+ unhandledMark
7
+ }) {
8
+ return function renderContent({
9
+ content,
10
+ parent
11
+ }) {
12
+ var _a;
13
+ const nodeType = typeof content.type === "string" ? content.type : content.type.name;
14
+ const NodeHandler = (_a = nodeMapping[nodeType]) != null ? _a : unhandledNode;
15
+ if (!NodeHandler) {
16
+ throw new Error(`missing handler for node type ${nodeType}`);
17
+ }
18
+ const nodeContent = renderComponent({
19
+ component: NodeHandler,
20
+ props: {
21
+ node: content,
22
+ parent,
23
+ renderElement: renderContent,
24
+ // Lazily compute the children to avoid unnecessary recursion
25
+ get children() {
26
+ const children = [];
27
+ if (content.content) {
28
+ content.content.forEach((child) => {
29
+ children.push(
30
+ renderContent({
31
+ content: child,
32
+ parent: content
33
+ })
34
+ );
35
+ });
36
+ }
37
+ return children;
38
+ }
39
+ }
40
+ });
41
+ const markedContent = content.marks ? content.marks.reduce((acc, mark) => {
42
+ var _a2;
43
+ const markType = typeof mark.type === "string" ? mark.type : mark.type.name;
44
+ const MarkHandler = (_a2 = markMapping[markType]) != null ? _a2 : unhandledMark;
45
+ if (!MarkHandler) {
46
+ throw new Error(`missing handler for mark type ${markType}`);
47
+ }
48
+ return renderComponent({
49
+ component: MarkHandler,
50
+ props: {
51
+ mark,
52
+ parent,
53
+ node: content,
54
+ children: acc
55
+ }
56
+ });
57
+ }, nodeContent) : nodeContent;
58
+ return markedContent;
59
+ };
60
+ }
61
+
62
+ // src/json/html-string/string.ts
63
+ function renderJSONContentToString(options) {
64
+ return TiptapStaticRenderer((ctx) => {
65
+ return ctx.component(ctx.props);
66
+ }, options);
67
+ }
68
+ function serializeAttrsToHTMLString(attrs) {
69
+ const output = Object.entries(attrs || {}).map(([key, value]) => `${key.split(" ").at(-1)}=${JSON.stringify(value)}`).join(" ");
70
+ return output ? ` ${output}` : "";
71
+ }
72
+ function serializeChildrenToHTMLString(children) {
73
+ return [].concat(children || "").filter(Boolean).join("");
74
+ }
75
+ export {
76
+ TiptapStaticRenderer,
77
+ renderJSONContentToString,
78
+ serializeAttrsToHTMLString,
79
+ serializeChildrenToHTMLString
80
+ };
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/json/renderer.ts","../../../src/json/html-string/string.ts"],"sourcesContent":["/* 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"],"mappings":";AAmHO,SAAS,qBAiCd,iBAWA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GACA;AAIA,SAAO,SAAS,cAAc;AAAA,IAC5B;AAAA,IACA;AAAA,EACF,GASgB;AArLlB;AAsLI,UAAM,WAAW,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO,QAAQ,KAAK;AAChF,UAAM,eAAc,iBAAY,QAAQ,MAApB,YAAyB;AAE7C,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,iCAAiC,QAAQ,EAAE;AAAA,IAC7D;AAEA,UAAM,cAAc,gBAAgB;AAAA,MAClC,WAAW;AAAA,MACX,OAAO;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA,eAAe;AAAA;AAAA,QAEf,IAAI,WAAW;AAEb,gBAAM,WAA0B,CAAC;AAEjC,cAAI,QAAQ,SAAS;AACnB,oBAAQ,QAAQ,QAAQ,WAAS;AAC/B,uBAAS;AAAA,gBACP,cAAc;AAAA,kBACZ,SAAS;AAAA,kBACT,QAAQ;AAAA,gBACV,CAAC;AAAA,cACH;AAAA,YACF,CAAC;AAAA,UACH;AAEA,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IACF,CAAC;AAGD,UAAM,gBAAgB,QAAQ,QAC1B,QAAQ,MAAM,OAAO,CAAC,KAAK,SAAS;AA1N5C,UAAAA;AA2NU,YAAM,WAAW,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO,KAAK,KAAK;AACvE,YAAM,eAAcA,MAAA,YAAY,QAAQ,MAApB,OAAAA,MAAyB;AAE7C,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,iCAAiC,QAAQ,EAAE;AAAA,MAC7D;AAEA,aAAO,gBAAgB;AAAA,QACrB,WAAW;AAAA,QACX,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA,MAAM;AAAA,UACN,UAAU;AAAA,QACZ;AAAA,MACF,CAAC;AAAA,IACH,GAAG,WAAW,IACd;AAEJ,WAAO;AAAA,EACT;AACF;;;AC1OO,SAAS,0BAad,SAAoE;AACpE,SAAO,qBAAqB,SAAO;AACjC,WAAO,IAAI,UAAU,IAAI,KAAY;AAAA,EACvC,GAAG,OAAO;AACZ;AAOO,SAAS,2BAA2B,OAAuD;AAChG,QAAM,SAAS,OAAO,QAAQ,SAAS,CAAC,CAAC,EACtC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,IAAI,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,KAAK,UAAU,KAAK,CAAC,EAAE,EACzE,KAAK,GAAG;AAEX,SAAO,SAAS,IAAI,MAAM,KAAK;AACjC;AAOO,SAAS,8BAA8B,UAAsC;AAClF,SAAQ,CAAC,EACN,OAAO,YAAY,EAAE,EACrB,OAAO,OAAO,EACd,KAAK,EAAE;AACZ;","names":["_a"]}