@contember/react-richtext-renderer 2.1.0-alpha.30 → 2.1.0-alpha.36

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 (211) hide show
  1. package/package.json +5 -6
  2. package/src/components/RichText.tsx +4 -2
  3. package/src/components/RichTextRenderer.tsx +0 -2
  4. package/src/hooks/useRichTextBlocksSource.ts +30 -28
  5. package/src/index.ts +0 -1
  6. package/src/internal/components/ElementRenderer.tsx +5 -2
  7. package/src/internal/components/LeafRenderer.tsx +1 -1
  8. package/src/internal/components/RenderElementFallback.tsx +3 -3
  9. package/src/types/RichTextRenderingOptions.ts +1 -1
  10. package/src/types/custom/RenderLeaf.ts +6 -8
  11. package/tests/decodeBlockSource.test.tsx +18 -17
  12. package/tests/renderElement.test.tsx +130 -83
  13. package/tests/renderLeaf.test.tsx +31 -23
  14. package/tests/renderReferences.test.tsx +82 -38
  15. package/dist/development/index.cjs +0 -17
  16. package/dist/development/index.cjs.map +0 -1
  17. package/dist/development/index.js +0 -17
  18. package/dist/development/index.js.map +0 -1
  19. package/dist/development/src/RichTextRendererError.cjs +0 -6
  20. package/dist/development/src/RichTextRendererError.cjs.map +0 -1
  21. package/dist/development/src/RichTextRendererError.js +0 -6
  22. package/dist/development/src/RichTextRendererError.js.map +0 -1
  23. package/dist/development/src/components/RichText.cjs +0 -40
  24. package/dist/development/src/components/RichText.cjs.map +0 -1
  25. package/dist/development/src/components/RichText.js +0 -40
  26. package/dist/development/src/components/RichText.js.map +0 -1
  27. package/dist/development/src/components/RichTextBlocksRenderer.cjs +0 -42
  28. package/dist/development/src/components/RichTextBlocksRenderer.cjs.map +0 -1
  29. package/dist/development/src/components/RichTextBlocksRenderer.js +0 -42
  30. package/dist/development/src/components/RichTextBlocksRenderer.js.map +0 -1
  31. package/dist/development/src/components/RichTextFieldRenderer.cjs +0 -36
  32. package/dist/development/src/components/RichTextFieldRenderer.cjs.map +0 -1
  33. package/dist/development/src/components/RichTextFieldRenderer.js +0 -36
  34. package/dist/development/src/components/RichTextFieldRenderer.js.map +0 -1
  35. package/dist/development/src/components/RichTextRenderer.cjs +0 -22
  36. package/dist/development/src/components/RichTextRenderer.cjs.map +0 -1
  37. package/dist/development/src/components/RichTextRenderer.js +0 -22
  38. package/dist/development/src/components/RichTextRenderer.js.map +0 -1
  39. package/dist/development/src/hooks/useRichTextBlocksSource.cjs +0 -62
  40. package/dist/development/src/hooks/useRichTextBlocksSource.cjs.map +0 -1
  41. package/dist/development/src/hooks/useRichTextBlocksSource.js +0 -62
  42. package/dist/development/src/hooks/useRichTextBlocksSource.js.map +0 -1
  43. package/dist/development/src/hooks/useRichTextFieldSource.cjs +0 -26
  44. package/dist/development/src/hooks/useRichTextFieldSource.cjs.map +0 -1
  45. package/dist/development/src/hooks/useRichTextFieldSource.js +0 -26
  46. package/dist/development/src/hooks/useRichTextFieldSource.js.map +0 -1
  47. package/dist/development/src/internal/components/ElementRenderer.cjs +0 -28
  48. package/dist/development/src/internal/components/ElementRenderer.cjs.map +0 -1
  49. package/dist/development/src/internal/components/ElementRenderer.js +0 -28
  50. package/dist/development/src/internal/components/ElementRenderer.js.map +0 -1
  51. package/dist/development/src/internal/components/LeafRenderer.cjs +0 -27
  52. package/dist/development/src/internal/components/LeafRenderer.cjs.map +0 -1
  53. package/dist/development/src/internal/components/LeafRenderer.js +0 -27
  54. package/dist/development/src/internal/components/LeafRenderer.js.map +0 -1
  55. package/dist/development/src/internal/components/RenderElementFallback.cjs +0 -164
  56. package/dist/development/src/internal/components/RenderElementFallback.cjs.map +0 -1
  57. package/dist/development/src/internal/components/RenderElementFallback.js +0 -164
  58. package/dist/development/src/internal/components/RenderElementFallback.js.map +0 -1
  59. package/dist/development/src/internal/components/RenderLeafFallback.cjs +0 -74
  60. package/dist/development/src/internal/components/RenderLeafFallback.cjs.map +0 -1
  61. package/dist/development/src/internal/components/RenderLeafFallback.js +0 -74
  62. package/dist/development/src/internal/components/RenderLeafFallback.js.map +0 -1
  63. package/dist/development/src/internal/defaultDeserialize.cjs +0 -14
  64. package/dist/development/src/internal/defaultDeserialize.cjs.map +0 -1
  65. package/dist/development/src/internal/defaultDeserialize.js +0 -14
  66. package/dist/development/src/internal/defaultDeserialize.js.map +0 -1
  67. package/dist/development/src/internal/renderChildren.cjs +0 -30
  68. package/dist/development/src/internal/renderChildren.cjs.map +0 -1
  69. package/dist/development/src/internal/renderChildren.js +0 -30
  70. package/dist/development/src/internal/renderChildren.js.map +0 -1
  71. package/dist/development/src/internal/useReferenceMetadata.cjs +0 -42
  72. package/dist/development/src/internal/useReferenceMetadata.cjs.map +0 -1
  73. package/dist/development/src/internal/useReferenceMetadata.js +0 -42
  74. package/dist/development/src/internal/useReferenceMetadata.js.map +0 -1
  75. package/dist/production/index.cjs +0 -17
  76. package/dist/production/index.cjs.map +0 -1
  77. package/dist/production/index.js +0 -17
  78. package/dist/production/index.js.map +0 -1
  79. package/dist/production/src/RichTextRendererError.cjs +0 -6
  80. package/dist/production/src/RichTextRendererError.cjs.map +0 -1
  81. package/dist/production/src/RichTextRendererError.js +0 -6
  82. package/dist/production/src/RichTextRendererError.js.map +0 -1
  83. package/dist/production/src/components/RichText.cjs +0 -32
  84. package/dist/production/src/components/RichText.cjs.map +0 -1
  85. package/dist/production/src/components/RichText.js +0 -32
  86. package/dist/production/src/components/RichText.js.map +0 -1
  87. package/dist/production/src/components/RichTextBlocksRenderer.cjs +0 -30
  88. package/dist/production/src/components/RichTextBlocksRenderer.cjs.map +0 -1
  89. package/dist/production/src/components/RichTextBlocksRenderer.js +0 -30
  90. package/dist/production/src/components/RichTextBlocksRenderer.js.map +0 -1
  91. package/dist/production/src/components/RichTextFieldRenderer.cjs +0 -28
  92. package/dist/production/src/components/RichTextFieldRenderer.cjs.map +0 -1
  93. package/dist/production/src/components/RichTextFieldRenderer.js +0 -28
  94. package/dist/production/src/components/RichTextFieldRenderer.js.map +0 -1
  95. package/dist/production/src/components/RichTextRenderer.cjs +0 -14
  96. package/dist/production/src/components/RichTextRenderer.cjs.map +0 -1
  97. package/dist/production/src/components/RichTextRenderer.js +0 -14
  98. package/dist/production/src/components/RichTextRenderer.js.map +0 -1
  99. package/dist/production/src/hooks/useRichTextBlocksSource.cjs +0 -62
  100. package/dist/production/src/hooks/useRichTextBlocksSource.cjs.map +0 -1
  101. package/dist/production/src/hooks/useRichTextBlocksSource.js +0 -62
  102. package/dist/production/src/hooks/useRichTextBlocksSource.js.map +0 -1
  103. package/dist/production/src/hooks/useRichTextFieldSource.cjs +0 -26
  104. package/dist/production/src/hooks/useRichTextFieldSource.cjs.map +0 -1
  105. package/dist/production/src/hooks/useRichTextFieldSource.js +0 -26
  106. package/dist/production/src/hooks/useRichTextFieldSource.js.map +0 -1
  107. package/dist/production/src/internal/components/ElementRenderer.cjs +0 -24
  108. package/dist/production/src/internal/components/ElementRenderer.cjs.map +0 -1
  109. package/dist/production/src/internal/components/ElementRenderer.js +0 -24
  110. package/dist/production/src/internal/components/ElementRenderer.js.map +0 -1
  111. package/dist/production/src/internal/components/LeafRenderer.cjs +0 -23
  112. package/dist/production/src/internal/components/LeafRenderer.cjs.map +0 -1
  113. package/dist/production/src/internal/components/LeafRenderer.js +0 -23
  114. package/dist/production/src/internal/components/LeafRenderer.js.map +0 -1
  115. package/dist/production/src/internal/components/RenderElementFallback.cjs +0 -85
  116. package/dist/production/src/internal/components/RenderElementFallback.cjs.map +0 -1
  117. package/dist/production/src/internal/components/RenderElementFallback.js +0 -85
  118. package/dist/production/src/internal/components/RenderElementFallback.js.map +0 -1
  119. package/dist/production/src/internal/components/RenderLeafFallback.cjs +0 -38
  120. package/dist/production/src/internal/components/RenderLeafFallback.cjs.map +0 -1
  121. package/dist/production/src/internal/components/RenderLeafFallback.js +0 -38
  122. package/dist/production/src/internal/components/RenderLeafFallback.js.map +0 -1
  123. package/dist/production/src/internal/defaultDeserialize.cjs +0 -14
  124. package/dist/production/src/internal/defaultDeserialize.cjs.map +0 -1
  125. package/dist/production/src/internal/defaultDeserialize.js +0 -14
  126. package/dist/production/src/internal/defaultDeserialize.js.map +0 -1
  127. package/dist/production/src/internal/renderChildren.cjs +0 -18
  128. package/dist/production/src/internal/renderChildren.cjs.map +0 -1
  129. package/dist/production/src/internal/renderChildren.js +0 -18
  130. package/dist/production/src/internal/renderChildren.js.map +0 -1
  131. package/dist/production/src/internal/useReferenceMetadata.cjs +0 -37
  132. package/dist/production/src/internal/useReferenceMetadata.cjs.map +0 -1
  133. package/dist/production/src/internal/useReferenceMetadata.js +0 -37
  134. package/dist/production/src/internal/useReferenceMetadata.js.map +0 -1
  135. package/dist/types/RichTextRendererError.d.ts +0 -3
  136. package/dist/types/RichTextRendererError.d.ts.map +0 -1
  137. package/dist/types/components/RichText.d.ts +0 -13
  138. package/dist/types/components/RichText.d.ts.map +0 -1
  139. package/dist/types/components/RichTextBlocksRenderer.d.ts +0 -10
  140. package/dist/types/components/RichTextBlocksRenderer.d.ts.map +0 -1
  141. package/dist/types/components/RichTextFieldRenderer.d.ts +0 -10
  142. package/dist/types/components/RichTextFieldRenderer.d.ts.map +0 -1
  143. package/dist/types/components/RichTextRenderer.d.ts +0 -12
  144. package/dist/types/components/RichTextRenderer.d.ts.map +0 -1
  145. package/dist/types/components/index.d.ts +0 -5
  146. package/dist/types/components/index.d.ts.map +0 -1
  147. package/dist/types/hooks/index.d.ts +0 -3
  148. package/dist/types/hooks/index.d.ts.map +0 -1
  149. package/dist/types/hooks/useRichTextBlocksSource.d.ts +0 -3
  150. package/dist/types/hooks/useRichTextBlocksSource.d.ts.map +0 -1
  151. package/dist/types/hooks/useRichTextFieldSource.d.ts +0 -3
  152. package/dist/types/hooks/useRichTextFieldSource.d.ts.map +0 -1
  153. package/dist/types/index.d.ts +0 -5
  154. package/dist/types/index.d.ts.map +0 -1
  155. package/dist/types/internal/components/ElementRenderer.d.ts +0 -14
  156. package/dist/types/internal/components/ElementRenderer.d.ts.map +0 -1
  157. package/dist/types/internal/components/LeafRenderer.d.ts +0 -12
  158. package/dist/types/internal/components/LeafRenderer.d.ts.map +0 -1
  159. package/dist/types/internal/components/RenderElementFallback.d.ts +0 -14
  160. package/dist/types/internal/components/RenderElementFallback.d.ts.map +0 -1
  161. package/dist/types/internal/components/RenderLeafFallback.d.ts +0 -6
  162. package/dist/types/internal/components/RenderLeafFallback.d.ts.map +0 -1
  163. package/dist/types/internal/defaultDeserialize.d.ts +0 -5
  164. package/dist/types/internal/defaultDeserialize.d.ts.map +0 -1
  165. package/dist/types/internal/renderChildren.d.ts +0 -8
  166. package/dist/types/internal/renderChildren.d.ts.map +0 -1
  167. package/dist/types/internal/useReferenceMetadata.d.ts +0 -9
  168. package/dist/types/internal/useReferenceMetadata.d.ts.map +0 -1
  169. package/dist/types/tsconfig.tsbuildinfo +0 -1
  170. package/dist/types/types/RenderChildren.d.ts +0 -9
  171. package/dist/types/types/RenderChildren.d.ts.map +0 -1
  172. package/dist/types/types/RichTextBlock.d.ts +0 -8
  173. package/dist/types/types/RichTextBlock.d.ts.map +0 -1
  174. package/dist/types/types/RichTextBlockSource.d.ts +0 -9
  175. package/dist/types/types/RichTextBlockSource.d.ts.map +0 -1
  176. package/dist/types/types/RichTextFieldSource.d.ts +0 -6
  177. package/dist/types/types/RichTextFieldSource.d.ts.map +0 -1
  178. package/dist/types/types/RichTextReference.d.ts +0 -5
  179. package/dist/types/types/RichTextReference.d.ts.map +0 -1
  180. package/dist/types/types/RichTextReferenceMetadata.d.ts +0 -15
  181. package/dist/types/types/RichTextReferenceMetadata.d.ts.map +0 -1
  182. package/dist/types/types/RichTextRenderingOptions.d.ts +0 -14
  183. package/dist/types/types/RichTextRenderingOptions.d.ts.map +0 -1
  184. package/dist/types/types/builtin/BuiltinElements.d.ts +0 -48
  185. package/dist/types/types/builtin/BuiltinElements.d.ts.map +0 -1
  186. package/dist/types/types/builtin/BuiltinLeaves.d.ts +0 -21
  187. package/dist/types/types/builtin/BuiltinLeaves.d.ts.map +0 -1
  188. package/dist/types/types/builtin/index.d.ts +0 -3
  189. package/dist/types/types/builtin/index.d.ts.map +0 -1
  190. package/dist/types/types/custom/ReferenceRenderer.d.ts +0 -17
  191. package/dist/types/types/custom/ReferenceRenderer.d.ts.map +0 -1
  192. package/dist/types/types/custom/RenderBlock.d.ts +0 -7
  193. package/dist/types/types/custom/RenderBlock.d.ts.map +0 -1
  194. package/dist/types/types/custom/RenderElement.d.ts +0 -24
  195. package/dist/types/types/custom/RenderElement.d.ts.map +0 -1
  196. package/dist/types/types/custom/RenderLeaf.d.ts +0 -11
  197. package/dist/types/types/custom/RenderLeaf.d.ts.map +0 -1
  198. package/dist/types/types/custom/index.d.ts +0 -5
  199. package/dist/types/types/custom/index.d.ts.map +0 -1
  200. package/dist/types/types/index.d.ts +0 -11
  201. package/dist/types/types/index.d.ts.map +0 -1
  202. package/dist/types/types/structure/RichTextChild.d.ts +0 -5
  203. package/dist/types/types/structure/RichTextChild.d.ts.map +0 -1
  204. package/dist/types/types/structure/RichTextElement.d.ts +0 -8
  205. package/dist/types/types/structure/RichTextElement.d.ts.map +0 -1
  206. package/dist/types/types/structure/RichTextLeaf.d.ts +0 -4
  207. package/dist/types/types/structure/RichTextLeaf.d.ts.map +0 -1
  208. package/dist/types/types/structure/RootEditorNode.d.ts +0 -8
  209. package/dist/types/types/structure/RootEditorNode.d.ts.map +0 -1
  210. package/dist/types/types/structure/index.d.ts +0 -5
  211. package/dist/types/types/structure/index.d.ts.map +0 -1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@contember/react-richtext-renderer",
3
3
  "license": "Apache-2.0",
4
- "version": "2.1.0-alpha.30",
4
+ "version": "2.1.0-alpha.36",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "main": "./dist/production/index.js",
@@ -30,15 +30,14 @@
30
30
  },
31
31
  "repository": {
32
32
  "type": "git",
33
- "url": "https://github.com/contember/interface.git",
33
+ "url": "git+https://github.com/contember/contember.git",
34
34
  "directory": "packages/react-richtext-renderer"
35
35
  },
36
36
  "devDependencies": {
37
- "@testing-library/dom": "^10.4.0",
38
- "@testing-library/react": "^16.0.1",
39
- "@testing-library/react-hooks": "^8.0.1"
37
+ "@testing-library/dom": "catalog:",
38
+ "@testing-library/react": "catalog:"
40
39
  },
41
40
  "peerDependencies": {
42
- "react": "^18 || ^19"
41
+ "react": "catalog:"
43
42
  }
44
43
  }
@@ -34,10 +34,12 @@ export const RichText = <
34
34
  <>
35
35
  {blocks.map((block, i) => (
36
36
  createElement(
37
- renderBlock, {
37
+ renderBlock,
38
+ {
38
39
  block,
39
40
  key: block.id ?? i,
40
- }, renderChildren(block.content.children, {
41
+ },
42
+ renderChildren(block.content.children, {
41
43
  referenceRenderers,
42
44
  renderBlock,
43
45
  renderLeaf,
@@ -4,7 +4,6 @@ import type { RichTextLeaf } from '../types/structure/RichTextLeaf'
4
4
  import { RichTextFieldRenderer, RichTextFieldRendererProps } from './RichTextFieldRenderer'
5
5
  import { RichTextBlocksRenderer, RichTextBlocksRendererProps } from './RichTextBlocksRenderer'
6
6
 
7
-
8
7
  export type RichTextRendererProps<
9
8
  CustomElements extends RichTextElement = never,
10
9
  CustomLeaves extends RichTextLeaf = RichTextLeaf,
@@ -20,7 +19,6 @@ export const RichTextRenderer = memo(function RichTextRenderer<
20
19
  CustomElements extends RichTextElement = never,
21
20
  CustomLeaves extends RichTextLeaf = RichTextLeaf,
22
21
  >(props: RichTextRendererProps<CustomElements, CustomLeaves>) {
23
-
24
22
  if ('source' in props) {
25
23
  return <RichTextFieldRenderer<CustomElements, CustomLeaves> {...props} />
26
24
  }
@@ -18,11 +18,11 @@ export const useRichTextBlocksSource = <CustomElements extends RichTextElement,
18
18
  return blocks.map(block => {
19
19
  if (!(sourceFieldResolved in block)) {
20
20
  throw new RichTextRendererError(
21
- `Found a block without a '${sourceFieldResolved}' field. ` +
22
- (sourceField === undefined
23
- ? `The 'sourceField' prop has not been supplied, and so '${sourceFieldResolved}' was used as a default.`
24
- : `That is what the 'sourceField' prop has been set to, and so either this is a typo, ` +
25
- `or the data supplied is invalid.`),
21
+ `Found a block without a '${sourceFieldResolved}' field. `
22
+ + (sourceField === undefined
23
+ ? `The 'sourceField' prop has not been supplied, and so '${sourceFieldResolved}' was used as a default.`
24
+ : `That is what the 'sourceField' prop has been set to, and so either this is a typo, `
25
+ + `or the data supplied is invalid.`),
26
26
  )
27
27
  }
28
28
  const source = block[sourceFieldResolved]
@@ -32,38 +32,40 @@ export const useRichTextBlocksSource = <CustomElements extends RichTextElement,
32
32
 
33
33
  if (referencesField !== undefined && !(referencesFieldResolved in block)) {
34
34
  throw new RichTextRendererError(
35
- `The 'referencesField' prop is set to '${referencesFieldResolved}' but a block without such field ` +
36
- `has been encountered. Unless this is just a typo, ` +
37
- `if you do not wish to use references, avoid supplying the 'referencesField' prop.`,
35
+ `The 'referencesField' prop is set to '${referencesFieldResolved}' but a block without such field `
36
+ + `has been encountered. Unless this is just a typo, `
37
+ + `if you do not wish to use references, avoid supplying the 'referencesField' prop.`,
38
38
  )
39
39
  }
40
40
  const references = block[referencesFieldResolved]
41
41
 
42
- let normalizedReferences: Record<string, RichTextReference> | undefined = undefined
42
+ let normalizedReferences: Record<string, RichTextReference> | undefined
43
43
  if (references) {
44
44
  if (typeof Object(references)[Symbol.iterator] !== 'function') {
45
45
  throw new RichTextRendererError(`The set of references must be an iterable!`)
46
46
  }
47
47
 
48
- normalizedReferences = Object.fromEntries(Array.from(references as Iterable<RichTextReference>).map(reference => {
49
- if (!('id' in reference)) {
50
- throw new RichTextRendererError(`Found a reference without an id field.`)
51
- }
52
- if (!(referenceDiscriminationFieldResolved in reference) || typeof reference[referenceDiscriminationFieldResolved] !== 'string') {
53
- throw new RichTextRendererError(
54
- `Found a reference without a '${referenceDiscriminationFieldResolved}' field. ` +
55
- (referenceDiscriminationField === undefined
56
- ? `The 'referenceDiscriminationField' prop has not been supplied, ` +
57
- `and so '${referenceDiscriminationFieldResolved}' was used as a default.`
58
- : `That is what the 'referenceDiscriminationField' prop has been set to, ` +
59
- `and so either this is a typo, or the data supplied is invalid.`),
60
- )
61
- }
62
- return [reference.id, {
63
- ...reference,
64
- type: reference[referenceDiscriminationFieldResolved] as string,
65
- }]
66
- }))
48
+ normalizedReferences = Object.fromEntries(
49
+ Array.from(references as Iterable<RichTextReference>).map(reference => {
50
+ if (!('id' in reference)) {
51
+ throw new RichTextRendererError(`Found a reference without an id field.`)
52
+ }
53
+ if (!(referenceDiscriminationFieldResolved in reference) || typeof reference[referenceDiscriminationFieldResolved] !== 'string') {
54
+ throw new RichTextRendererError(
55
+ `Found a reference without a '${referenceDiscriminationFieldResolved}' field. `
56
+ + (referenceDiscriminationField === undefined
57
+ ? `The 'referenceDiscriminationField' prop has not been supplied, `
58
+ + `and so '${referenceDiscriminationFieldResolved}' was used as a default.`
59
+ : `That is what the 'referenceDiscriminationField' prop has been set to, `
60
+ + `and so either this is a typo, or the data supplied is invalid.`),
61
+ )
62
+ }
63
+ return [reference.id, {
64
+ ...reference,
65
+ type: reference[referenceDiscriminationFieldResolved] as string,
66
+ }]
67
+ }),
68
+ )
67
69
  }
68
70
  return {
69
71
  id: typeof block.id === 'string' ? block.id : undefined,
package/src/index.ts CHANGED
@@ -3,4 +3,3 @@ export * from './hooks'
3
3
  export * from './types'
4
4
 
5
5
  export * from './RichTextRendererError'
6
-
@@ -9,7 +9,6 @@ import type { RichTextLeaf } from '../../types/structure/RichTextLeaf'
9
9
  import { RichTextBlock } from '../../types/RichTextBlock'
10
10
  import { RichTextRenderingOptions } from '../../types/RichTextRenderingOptions'
11
11
 
12
-
13
12
  export interface ElementRendererProps<
14
13
  CustomElements extends RichTextElement = never,
15
14
  CustomLeaves extends RichTextLeaf = RichTextLeaf,
@@ -27,7 +26,11 @@ export function ElementRenderer<
27
26
  const referenceMetadata = useReferenceMetadata<CustomElements, CustomLeaves>(element, options, block)
28
27
 
29
28
  const fallback = (
30
- <RenderElementFallback<CustomElements, CustomLeaves> element={element as BuiltinElements<CustomElements, CustomLeaves>} options={options} block={block}>
29
+ <RenderElementFallback<CustomElements, CustomLeaves>
30
+ element={element as BuiltinElements<CustomElements, CustomLeaves>}
31
+ options={options}
32
+ block={block}
33
+ >
31
34
  {children}
32
35
  </RenderElementFallback>
33
36
  )
@@ -31,6 +31,6 @@ export function LeafRenderer<
31
31
  fallback,
32
32
  children: leaf.text,
33
33
  },
34
- )
34
+ )
35
35
  : fallback
36
36
  }
@@ -127,9 +127,9 @@ function ReferenceElementFallback<
127
127
  const elementMetadata = useReferenceMetadata<CustomElements, CustomLeaves>(element, options, block, true)
128
128
 
129
129
  if (
130
- elementMetadata.referenceRenderer === undefined ||
131
- elementMetadata.referenceType === undefined ||
132
- elementMetadata.reference === undefined
130
+ elementMetadata.referenceRenderer === undefined
131
+ || elementMetadata.referenceType === undefined
132
+ || elementMetadata.reference === undefined
133
133
  ) {
134
134
  return children // At least render the text contents
135
135
  }
@@ -6,7 +6,7 @@ import { RichTextReferenceMetadata } from './RichTextReferenceMetadata'
6
6
  export type UndefinedReferenceHandler<
7
7
  CustomElements extends RichTextElement = never,
8
8
  CustomLeaves extends RichTextLeaf = RichTextLeaf,
9
- Reference extends RichTextReference = RichTextReference
9
+ Reference extends RichTextReference = RichTextReference,
10
10
  > = (referenceId: string) => void | RichTextReferenceMetadata<CustomElements, CustomLeaves, Reference>
11
11
 
12
12
  export type RichTextRenderingOptions<
@@ -2,13 +2,11 @@ import { RichTextLeaf } from '../structure'
2
2
  import { ComponentType, ReactElement } from 'react'
3
3
  import { BuiltinLeaves } from '../builtin'
4
4
 
5
- export type RenderLeafProps<CustomLeaves extends RichTextLeaf = RichTextLeaf> =
6
- & {
7
- formatVersion: number
8
- leaf: CustomLeaves & BuiltinLeaves
9
- fallback: ReactElement
10
- children: string
11
- }
5
+ export type RenderLeafProps<CustomLeaves extends RichTextLeaf = RichTextLeaf> = {
6
+ formatVersion: number
7
+ leaf: CustomLeaves & BuiltinLeaves
8
+ fallback: ReactElement
9
+ children: string
10
+ }
12
11
 
13
12
  export type RenderLeaf<CustomLeaves extends RichTextLeaf> = ComponentType<RenderLeafProps<CustomLeaves>>
14
-
@@ -14,22 +14,24 @@ describe('useRichTextBlocksSource', () => {
14
14
  })
15
15
 
16
16
  test('decode blocks with references', () => {
17
- const { result } = renderHook(() => useRichTextBlocksSource({
18
- blocks: [{
19
- source: '{"formatVersion":1,"children":[{"type":"reference","children":[{"text":"Foo bar"}],"referenceId":"74bfb183-3adf-4cc1-8e8e-6d5cd700cadd"}]}',
20
- references: [
21
- {
22
- id: '74bfb183-3adf-4cc1-8e8e-6d5cd700cadd',
23
- type: 'image',
24
- url: 'https://example.com/image.png',
25
- },
26
- ],
27
-
28
- }],
29
- sourceField: 'source',
30
- referencesField: 'references',
31
- referenceDiscriminationField: 'type',
32
- }))
17
+ const { result } = renderHook(() =>
18
+ useRichTextBlocksSource({
19
+ blocks: [{
20
+ source:
21
+ '{"formatVersion":1,"children":[{"type":"reference","children":[{"text":"Foo bar"}],"referenceId":"74bfb183-3adf-4cc1-8e8e-6d5cd700cadd"}]}',
22
+ references: [
23
+ {
24
+ id: '74bfb183-3adf-4cc1-8e8e-6d5cd700cadd',
25
+ type: 'image',
26
+ url: 'https://example.com/image.png',
27
+ },
28
+ ],
29
+ }],
30
+ sourceField: 'source',
31
+ referencesField: 'references',
32
+ referenceDiscriminationField: 'type',
33
+ })
34
+ )
33
35
  expect(result.current).toStrictEqual([
34
36
  {
35
37
  'content': {
@@ -57,5 +59,4 @@ describe('useRichTextBlocksSource', () => {
57
59
  },
58
60
  ])
59
61
  })
60
-
61
62
  })
@@ -13,114 +13,161 @@ describe('paragraph rendering', () => {
13
13
  })
14
14
 
15
15
  test('render paragraph', () => {
16
- expect(render(<RichText blocks={[createBlock({
17
- type: 'paragraph',
18
- children: [{
19
- text: 'Hello',
20
- isBold: true,
21
- }],
22
- })]} />).container.innerHTML)
16
+ expect(
17
+ render(
18
+ <RichText
19
+ blocks={[createBlock({
20
+ type: 'paragraph',
21
+ children: [{
22
+ text: 'Hello',
23
+ isBold: true,
24
+ }],
25
+ })]}
26
+ />,
27
+ ).container.innerHTML,
28
+ )
23
29
  .toEqual(`<p data-contember-type="paragraph"><b>Hello</b></p>`)
24
30
  })
25
31
 
26
32
  test('render table', () => {
27
- expect(render(<RichText blocks={[createBlock({
28
- type: 'table',
29
- children: [{
30
- type: 'tableRow',
31
- children: [{
32
- type: 'tableCell',
33
- children: [{
34
- text: 'Hello',
35
- }],
36
- }],
37
- }],
38
- })]} />).container.innerHTML)
39
- .toEqual(`<table data-contember-type="table"><tbody><tr data-contember-type="tableRow"><td data-contember-type="tableCell">Hello</td></tr></tbody></table>`)
33
+ expect(
34
+ render(
35
+ <RichText
36
+ blocks={[createBlock({
37
+ type: 'table',
38
+ children: [{
39
+ type: 'tableRow',
40
+ children: [{
41
+ type: 'tableCell',
42
+ children: [{
43
+ text: 'Hello',
44
+ }],
45
+ }],
46
+ }],
47
+ })]}
48
+ />,
49
+ ).container.innerHTML,
50
+ )
51
+ .toEqual(
52
+ `<table data-contember-type="table"><tbody><tr data-contember-type="tableRow"><td data-contember-type="tableCell">Hello</td></tr></tbody></table>`,
53
+ )
40
54
  })
41
55
 
42
56
  test('render table with header', () => {
43
- expect(render(<RichText blocks={[createBlock({
44
- type: 'table',
45
- children: [{
46
- type: 'tableRow',
47
- headerScope: 'table',
48
- children: [{
49
- type: 'tableCell',
50
- children: [{
51
- text: 'Hello',
52
- }],
53
- }],
54
- }],
55
- })]} />).container.innerHTML)
56
- .toEqual(`<table data-contember-type="table"><thead><tr data-contember-type="tableRow" data-contember-headerscope="table"><td data-contember-type="tableCell">Hello</td></tr></thead><tbody></tbody></table>`)
57
+ expect(
58
+ render(
59
+ <RichText
60
+ blocks={[createBlock({
61
+ type: 'table',
62
+ children: [{
63
+ type: 'tableRow',
64
+ headerScope: 'table',
65
+ children: [{
66
+ type: 'tableCell',
67
+ children: [{
68
+ text: 'Hello',
69
+ }],
70
+ }],
71
+ }],
72
+ })]}
73
+ />,
74
+ ).container.innerHTML,
75
+ )
76
+ .toEqual(
77
+ `<table data-contember-type="table"><thead><tr data-contember-type="tableRow" data-contember-headerscope="table"><td data-contember-type="tableCell">Hello</td></tr></thead><tbody></tbody></table>`,
78
+ )
57
79
  })
58
80
 
59
81
  test('render heading', () => {
60
- expect(render(<RichText blocks={[createBlock({
61
- type: 'heading',
62
- level: 1,
63
- children: [{
64
- text: 'Hello',
65
- }],
66
- })]} />).container.innerHTML)
82
+ expect(
83
+ render(
84
+ <RichText
85
+ blocks={[createBlock({
86
+ type: 'heading',
87
+ level: 1,
88
+ children: [{
89
+ text: 'Hello',
90
+ }],
91
+ })]}
92
+ />,
93
+ ).container.innerHTML,
94
+ )
67
95
  .toEqual(`<h1 data-contember-type="heading" data-contember-level="1">Hello</h1>`)
68
96
  })
69
97
 
70
98
  test('render list', () => {
71
- expect(render(<RichText blocks={[createBlock({
72
- type: 'unorderedList',
73
- children: [{
74
- type: 'listItem',
75
- children: [{
76
- text: 'Hello',
77
- }],
78
- }],
79
- })]} />).container.innerHTML)
99
+ expect(
100
+ render(
101
+ <RichText
102
+ blocks={[createBlock({
103
+ type: 'unorderedList',
104
+ children: [{
105
+ type: 'listItem',
106
+ children: [{
107
+ text: 'Hello',
108
+ }],
109
+ }],
110
+ })]}
111
+ />,
112
+ ).container.innerHTML,
113
+ )
80
114
  .toEqual(`<ul data-contember-type="unorderedList"><li data-contember-type="listItem">Hello</li></ul>`)
81
115
  })
82
116
 
83
117
  test('render ordered list', () => {
84
- expect(render(<RichText blocks={[createBlock({
85
- type: 'orderedList',
86
- children: [{
87
- type: 'listItem',
88
- children: [{
89
- text: 'Hello',
90
- }],
91
- }],
92
- })]} />).container.innerHTML)
118
+ expect(
119
+ render(
120
+ <RichText
121
+ blocks={[createBlock({
122
+ type: 'orderedList',
123
+ children: [{
124
+ type: 'listItem',
125
+ children: [{
126
+ text: 'Hello',
127
+ }],
128
+ }],
129
+ })]}
130
+ />,
131
+ ).container.innerHTML,
132
+ )
93
133
  .toEqual(`<ol data-contember-type="orderedList"><li data-contember-type="listItem">Hello</li></ol>`)
94
134
  })
95
135
 
96
136
  test('custom element', () => {
97
- expect(render(<RichText blocks={[{
98
- content: {
99
- formatVersion: 1,
100
- children: [{
101
- type: 'blockquote',
102
- children: [
103
- {
104
- type: 'heading',
105
- level: 1,
137
+ expect(
138
+ render(
139
+ <RichText
140
+ blocks={[{
141
+ content: {
142
+ formatVersion: 1,
106
143
  children: [{
107
- text: 'Hello',
144
+ type: 'blockquote',
145
+ children: [
146
+ {
147
+ type: 'heading',
148
+ level: 1,
149
+ children: [{
150
+ text: 'Hello',
151
+ }],
152
+ },
153
+ {
154
+ text: 'Hello',
155
+ },
156
+ ],
108
157
  }],
109
158
  },
110
- {
111
- text: 'Hello',
112
- },
113
- ],
114
- }],
115
- },
116
- id: '1',
117
- references: undefined,
118
- }]} renderElement={it => {
119
- if (it.element.type === 'blockquote') {
120
- return <blockquote data-contember-type="blockquote">{it.children}</blockquote>
121
- }
122
- return it.fallback
123
- }} />).container.innerHTML)
159
+ id: '1',
160
+ references: undefined,
161
+ }]}
162
+ renderElement={it => {
163
+ if (it.element.type === 'blockquote') {
164
+ return <blockquote data-contember-type="blockquote">{it.children}</blockquote>
165
+ }
166
+ return it.fallback
167
+ }}
168
+ />,
169
+ ).container.innerHTML,
170
+ )
124
171
  .toEqual(`<blockquote data-contember-type="blockquote"><h1 data-contember-type="heading" data-contember-level="1">Hello</h1>Hello</blockquote>`)
125
172
  })
126
173
  })
@@ -25,54 +25,62 @@ describe('leaf rendering', () => {
25
25
  .toEqual(`<code>Hello</code>`)
26
26
  })
27
27
 
28
-
29
28
  test('render highlighted', () => {
30
29
  expect(render(<RichText blocks={[createLeafBlock('Hello', 'isHighlighted')]} />).container.innerHTML)
31
30
  .toEqual(`<em>Hello</em>`)
32
31
  })
33
32
 
34
-
35
33
  test('render italic', () => {
36
34
  expect(render(<RichText blocks={[createLeafBlock('Hello', 'isItalic')]} />).container.innerHTML)
37
35
  .toEqual(`<i>Hello</i>`)
38
36
  })
39
37
 
40
-
41
38
  test('render underline', () => {
42
39
  expect(render(<RichText blocks={[createLeafBlock('Hello', 'isUnderlined')]} />).container.innerHTML)
43
40
  .toEqual(`<u>Hello</u>`)
44
41
  })
45
42
 
46
-
47
43
  test('render struck through', () => {
48
44
  expect(render(<RichText blocks={[createLeafBlock('Hello', 'isStruckThrough')]} />).container.innerHTML)
49
45
  .toEqual(`<s>Hello</s>`)
50
46
  })
51
47
 
52
-
53
48
  test('render multiple', () => {
54
- expect(render(<RichText blocks={[{
55
- content: {
56
- formatVersion: 1,
57
- children: [{
58
- text: 'Hello',
59
- isBold: true,
60
- isItalic: true,
61
- }],
62
- },
63
- id: '1',
64
- references: undefined,
65
- }]} />).container.innerHTML)
49
+ expect(
50
+ render(
51
+ <RichText
52
+ blocks={[{
53
+ content: {
54
+ formatVersion: 1,
55
+ children: [{
56
+ text: 'Hello',
57
+ isBold: true,
58
+ isItalic: true,
59
+ }],
60
+ },
61
+ id: '1',
62
+ references: undefined,
63
+ }]}
64
+ />,
65
+ ).container.innerHTML,
66
+ )
66
67
  .toEqual(`<b><i>Hello</i></b>`)
67
68
  })
68
69
 
69
70
  test('render custom leaf', () => {
70
- expect(render(<RichText<never, {isSup?: boolean} & BuiltinLeaves> blocks={[createLeafBlock('Hello', 'isSup')]} renderLeaf={it => {
71
- if (it.leaf.isSup) {
72
- return <sup>{it.fallback}</sup>
73
- }
74
- return it.fallback
75
- }} />).container.innerHTML)
71
+ expect(
72
+ render(
73
+ <RichText<never, { isSup?: boolean } & BuiltinLeaves>
74
+ blocks={[createLeafBlock('Hello', 'isSup')]}
75
+ renderLeaf={it => {
76
+ if (it.leaf.isSup) {
77
+ return <sup>{it.fallback}</sup>
78
+ }
79
+ return it.fallback
80
+ }}
81
+ />,
82
+ ).container.innerHTML,
83
+ )
76
84
  .toEqual(`<sup>Hello</sup>`)
77
85
  })
78
86
  })