@contember/react-client 0.7.0-alpha.20

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 (168) hide show
  1. package/LICENSE +186 -0
  2. package/dist/development/ClientError.js +5 -0
  3. package/dist/development/ClientError.js.map +1 -0
  4. package/dist/development/ContemberClient.js +30 -0
  5. package/dist/development/ContemberClient.js.map +1 -0
  6. package/dist/development/apiRequest/apiRequestReducer.js +33 -0
  7. package/dist/development/apiRequest/apiRequestReducer.js.map +1 -0
  8. package/dist/development/apiRequest/useApiRequest.js +43 -0
  9. package/dist/development/apiRequest/useApiRequest.js.map +1 -0
  10. package/dist/development/auth/SessionTokenContext.js +6 -0
  11. package/dist/development/auth/SessionTokenContext.js.map +1 -0
  12. package/dist/development/auth/useLoginRequest.js +18 -0
  13. package/dist/development/auth/useLoginRequest.js.map +1 -0
  14. package/dist/development/auth/useSessionToken.js +7 -0
  15. package/dist/development/auth/useSessionToken.js.map +1 -0
  16. package/dist/development/components/RichTextRenderer/ElementRenderer.js +25 -0
  17. package/dist/development/components/RichTextRenderer/ElementRenderer.js.map +1 -0
  18. package/dist/development/components/RichTextRenderer/LeafRenderer.js +21 -0
  19. package/dist/development/components/RichTextRenderer/LeafRenderer.js.map +1 -0
  20. package/dist/development/components/RichTextRenderer/RenderElementFallback.js +107 -0
  21. package/dist/development/components/RichTextRenderer/RenderElementFallback.js.map +1 -0
  22. package/dist/development/components/RichTextRenderer/RenderLeafFallback.js +36 -0
  23. package/dist/development/components/RichTextRenderer/RenderLeafFallback.js.map +1 -0
  24. package/dist/development/components/RichTextRenderer/RichTextRenderMetadataContext.js +14 -0
  25. package/dist/development/components/RichTextRenderer/RichTextRenderMetadataContext.js.map +1 -0
  26. package/dist/development/components/RichTextRenderer/RichTextRenderer.js +91 -0
  27. package/dist/development/components/RichTextRenderer/RichTextRenderer.js.map +1 -0
  28. package/dist/development/components/RichTextRenderer/RichTextRendererError.js +5 -0
  29. package/dist/development/components/RichTextRenderer/RichTextRendererError.js.map +1 -0
  30. package/dist/development/components/RichTextRenderer/defaultDeserialize.js +13 -0
  31. package/dist/development/components/RichTextRenderer/defaultDeserialize.js.map +1 -0
  32. package/dist/development/components/RichTextRenderer/renderChildren.js +29 -0
  33. package/dist/development/components/RichTextRenderer/renderChildren.js.map +1 -0
  34. package/dist/development/components/RichTextRenderer/resolveRichTextElementMetadata.js +27 -0
  35. package/dist/development/components/RichTextRenderer/resolveRichTextElementMetadata.js.map +1 -0
  36. package/dist/development/config/ApiBaseUrlContext.js +6 -0
  37. package/dist/development/config/ApiBaseUrlContext.js.map +1 -0
  38. package/dist/development/config/LoginTokenContext.js +6 -0
  39. package/dist/development/config/LoginTokenContext.js.map +1 -0
  40. package/dist/development/config/useApiBaseUrl.js +7 -0
  41. package/dist/development/config/useApiBaseUrl.js.map +1 -0
  42. package/dist/development/config/useLoginToken.js +7 -0
  43. package/dist/development/config/useLoginToken.js.map +1 -0
  44. package/dist/development/content/useContentApiRequest.js +7 -0
  45. package/dist/development/content/useContentApiRequest.js.map +1 -0
  46. package/dist/development/content/useContentGraphQlClient.js +7 -0
  47. package/dist/development/content/useContentGraphQlClient.js.map +1 -0
  48. package/dist/development/content/useCurrentContentGraphQlClient.js +19 -0
  49. package/dist/development/content/useCurrentContentGraphQlClient.js.map +1 -0
  50. package/dist/development/index.js +31 -0
  51. package/dist/development/index.js.map +1 -0
  52. package/dist/development/project/ProjectSlugContext.js +6 -0
  53. package/dist/development/project/ProjectSlugContext.js.map +1 -0
  54. package/dist/development/project/StageSlugContext.js +6 -0
  55. package/dist/development/project/StageSlugContext.js.map +1 -0
  56. package/dist/development/project/useProjectSlug.js +7 -0
  57. package/dist/development/project/useProjectSlug.js.map +1 -0
  58. package/dist/development/project/useStageSlug.js +7 -0
  59. package/dist/development/project/useStageSlug.js.map +1 -0
  60. package/dist/development/system/useCurrentSystemGraphQlClient.js +14 -0
  61. package/dist/development/system/useCurrentSystemGraphQlClient.js.map +1 -0
  62. package/dist/development/system/useDiffQuery.js +17 -0
  63. package/dist/development/system/useDiffQuery.js.map +1 -0
  64. package/dist/development/system/useReleaseTreeMutation.js +17 -0
  65. package/dist/development/system/useReleaseTreeMutation.js.map +1 -0
  66. package/dist/development/system/useSystemApiRequest.js +7 -0
  67. package/dist/development/system/useSystemApiRequest.js.map +1 -0
  68. package/dist/development/system/useSystemGraphQlClient.js +7 -0
  69. package/dist/development/system/useSystemGraphQlClient.js.map +1 -0
  70. package/dist/development/tenant/useTenantApiRequest.js +7 -0
  71. package/dist/development/tenant/useTenantApiRequest.js.map +1 -0
  72. package/dist/development/tenant/useTenantGraphQlClient.js +7 -0
  73. package/dist/development/tenant/useTenantGraphQlClient.js.map +1 -0
  74. package/dist/development/upload/fileUploadReducer.js +162 -0
  75. package/dist/development/upload/fileUploadReducer.js.map +1 -0
  76. package/dist/development/upload/toFileId.js +9 -0
  77. package/dist/development/upload/toFileId.js.map +1 -0
  78. package/dist/development/upload/useFileUpload.js +192 -0
  79. package/dist/development/upload/useFileUpload.js.map +1 -0
  80. package/dist/development/useGraphQlClient.js +13 -0
  81. package/dist/development/useGraphQlClient.js.map +1 -0
  82. package/dist/development/utils/assertNever.js +6 -0
  83. package/dist/development/utils/assertNever.js.map +1 -0
  84. package/dist/production/ClientError.js +4 -0
  85. package/dist/production/ClientError.js.map +1 -0
  86. package/dist/production/ContemberClient.js +28 -0
  87. package/dist/production/ContemberClient.js.map +1 -0
  88. package/dist/production/apiRequest/apiRequestReducer.js +32 -0
  89. package/dist/production/apiRequest/apiRequestReducer.js.map +1 -0
  90. package/dist/production/apiRequest/useApiRequest.js +41 -0
  91. package/dist/production/apiRequest/useApiRequest.js.map +1 -0
  92. package/dist/production/auth/SessionTokenContext.js +4 -0
  93. package/dist/production/auth/SessionTokenContext.js.map +1 -0
  94. package/dist/production/auth/useLoginRequest.js +16 -0
  95. package/dist/production/auth/useLoginRequest.js.map +1 -0
  96. package/dist/production/auth/useSessionToken.js +5 -0
  97. package/dist/production/auth/useSessionToken.js.map +1 -0
  98. package/dist/production/components/RichTextRenderer/ElementRenderer.js +23 -0
  99. package/dist/production/components/RichTextRenderer/ElementRenderer.js.map +1 -0
  100. package/dist/production/components/RichTextRenderer/LeafRenderer.js +19 -0
  101. package/dist/production/components/RichTextRenderer/LeafRenderer.js.map +1 -0
  102. package/dist/production/components/RichTextRenderer/RenderElementFallback.js +104 -0
  103. package/dist/production/components/RichTextRenderer/RenderElementFallback.js.map +1 -0
  104. package/dist/production/components/RichTextRenderer/RenderLeafFallback.js +34 -0
  105. package/dist/production/components/RichTextRenderer/RenderLeafFallback.js.map +1 -0
  106. package/dist/production/components/RichTextRenderer/RichTextRenderMetadataContext.js +12 -0
  107. package/dist/production/components/RichTextRenderer/RichTextRenderMetadataContext.js.map +1 -0
  108. package/dist/production/components/RichTextRenderer/RichTextRenderer.js +89 -0
  109. package/dist/production/components/RichTextRenderer/RichTextRenderer.js.map +1 -0
  110. package/dist/production/components/RichTextRenderer/RichTextRendererError.js +4 -0
  111. package/dist/production/components/RichTextRenderer/RichTextRendererError.js.map +1 -0
  112. package/dist/production/components/RichTextRenderer/defaultDeserialize.js +12 -0
  113. package/dist/production/components/RichTextRenderer/defaultDeserialize.js.map +1 -0
  114. package/dist/production/components/RichTextRenderer/renderChildren.js +27 -0
  115. package/dist/production/components/RichTextRenderer/renderChildren.js.map +1 -0
  116. package/dist/production/components/RichTextRenderer/resolveRichTextElementMetadata.js +25 -0
  117. package/dist/production/components/RichTextRenderer/resolveRichTextElementMetadata.js.map +1 -0
  118. package/dist/production/config/ApiBaseUrlContext.js +4 -0
  119. package/dist/production/config/ApiBaseUrlContext.js.map +1 -0
  120. package/dist/production/config/LoginTokenContext.js +4 -0
  121. package/dist/production/config/LoginTokenContext.js.map +1 -0
  122. package/dist/production/config/useApiBaseUrl.js +5 -0
  123. package/dist/production/config/useApiBaseUrl.js.map +1 -0
  124. package/dist/production/config/useLoginToken.js +5 -0
  125. package/dist/production/config/useLoginToken.js.map +1 -0
  126. package/dist/production/content/useContentApiRequest.js +5 -0
  127. package/dist/production/content/useContentApiRequest.js.map +1 -0
  128. package/dist/production/content/useContentGraphQlClient.js +5 -0
  129. package/dist/production/content/useContentGraphQlClient.js.map +1 -0
  130. package/dist/production/content/useCurrentContentGraphQlClient.js +17 -0
  131. package/dist/production/content/useCurrentContentGraphQlClient.js.map +1 -0
  132. package/dist/production/index.js +31 -0
  133. package/dist/production/index.js.map +1 -0
  134. package/dist/production/project/ProjectSlugContext.js +4 -0
  135. package/dist/production/project/ProjectSlugContext.js.map +1 -0
  136. package/dist/production/project/StageSlugContext.js +4 -0
  137. package/dist/production/project/StageSlugContext.js.map +1 -0
  138. package/dist/production/project/useProjectSlug.js +5 -0
  139. package/dist/production/project/useProjectSlug.js.map +1 -0
  140. package/dist/production/project/useStageSlug.js +5 -0
  141. package/dist/production/project/useStageSlug.js.map +1 -0
  142. package/dist/production/system/useCurrentSystemGraphQlClient.js +12 -0
  143. package/dist/production/system/useCurrentSystemGraphQlClient.js.map +1 -0
  144. package/dist/production/system/useDiffQuery.js +15 -0
  145. package/dist/production/system/useDiffQuery.js.map +1 -0
  146. package/dist/production/system/useReleaseTreeMutation.js +15 -0
  147. package/dist/production/system/useReleaseTreeMutation.js.map +1 -0
  148. package/dist/production/system/useSystemApiRequest.js +5 -0
  149. package/dist/production/system/useSystemApiRequest.js.map +1 -0
  150. package/dist/production/system/useSystemGraphQlClient.js +5 -0
  151. package/dist/production/system/useSystemGraphQlClient.js.map +1 -0
  152. package/dist/production/tenant/useTenantApiRequest.js +5 -0
  153. package/dist/production/tenant/useTenantApiRequest.js.map +1 -0
  154. package/dist/production/tenant/useTenantGraphQlClient.js +5 -0
  155. package/dist/production/tenant/useTenantGraphQlClient.js.map +1 -0
  156. package/dist/production/upload/fileUploadReducer.js +160 -0
  157. package/dist/production/upload/fileUploadReducer.js.map +1 -0
  158. package/dist/production/upload/toFileId.js +8 -0
  159. package/dist/production/upload/toFileId.js.map +1 -0
  160. package/dist/production/upload/useFileUpload.js +190 -0
  161. package/dist/production/upload/useFileUpload.js.map +1 -0
  162. package/dist/production/useGraphQlClient.js +11 -0
  163. package/dist/production/useGraphQlClient.js.map +1 -0
  164. package/dist/production/utils/assertNever.js +5 -0
  165. package/dist/production/utils/assertNever.js.map +1 -0
  166. package/dist/react-client.d.ts +370 -0
  167. package/package.json +31 -0
  168. package/readme.md +22 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFileUpload.js","sources":["../../../src/upload/useFileUpload.ts"],"sourcesContent":["import { FileUploader, S3FileUploader, UploadedFileMetadata } from '@contember/client'\nimport { Reducer, useCallback, useEffect, useMemo, useReducer, useRef } from 'react'\nimport { useCurrentContentGraphQlClient } from '../content'\nimport type { FileId } from './FileId'\nimport type { FileUploadAction } from './FileUploadAction'\nimport type { FileUploadCompoundState } from './FileUploadCompoundState'\nimport type { FileUploadMetadata } from './FileUploadMetadata'\nimport type { FileUploadMultiTemporalState } from './FileUploadMultiTemporalState'\nimport type {\n\tPurgeUpload,\n\tFileUploadOperations,\n\tInitializeUpload,\n\tStartUpload,\n\tStartUploadFileOptions,\n\tFailUpload,\n} from './FileUploadOperations'\nimport { fileUploadReducer, initializeFileUploadState } from './fileUploadReducer'\nimport type { FileWithMetadata } from './FileWithMetadata'\nimport { toFileId } from './toFileId'\n\nexport type FileUpload<Result = unknown, Metadata = undefined> = [\n\tFileUploadCompoundState<Result, Metadata>,\n\tFileUploadOperations<Metadata>,\n]\n\nexport interface FileUploadOptions {\n\tmaxUpdateFrequency?: number // This does NOT apply to all kinds of updates.\n}\n\nexport const useFileUpload = <Result = unknown, Metadata = undefined>(\n\toptions?: FileUploadOptions,\n): FileUpload<Result, Metadata> => {\n\tconst maxUpdateFrequency = options?.maxUpdateFrequency ?? 100\n\n\tconst contentApiClient = useCurrentContentGraphQlClient()\n\n\tconst updateTimeoutRef = useRef<number | undefined>(undefined)\n\tconst isFirstRenderRef = useRef(true)\n\tconst fileIdSeedRef = useRef(1)\n\n\tconst [multiTemporalState, dispatch] = useReducer<\n\t\tReducer<FileUploadMultiTemporalState<Result, Metadata>, FileUploadAction<Result, Metadata>>,\n\t\tundefined\n\t>(fileUploadReducer, undefined, initializeFileUploadState)\n\tconst multiTemporalStateRef = useRef(multiTemporalState)\n\n\tconst defaultUploader = useMemo(() => new S3FileUploader(), [])\n\n\tuseEffect(() => {\n\t\tmultiTemporalStateRef.current = multiTemporalState\n\t})\n\n\tconst purgeUpload = useCallback<PurgeUpload>(files => {\n\t\tdispatch({\n\t\t\ttype: 'purge',\n\t\t\tfiles,\n\t\t})\n\t}, [])\n\tconst failUpload = useCallback<FailUpload>(error => {\n\t\tdispatch({\n\t\t\ttype: 'finishWithError',\n\t\t\terror,\n\t\t})\n\t}, [])\n\tconst initializeUpload = useCallback<InitializeUpload>(\n\t\tfiles => {\n\t\t\tconst newFileIds = new Set<FileId>()\n\t\t\tconst fileWithMetadataByFileConfig = new Map<FileId, FileWithMetadata>()\n\n\t\t\tfor (const fileMaybeWithId of files) {\n\t\t\t\tconst abortController = new AbortController()\n\n\t\t\t\tlet fileId: FileId\n\t\t\t\tlet file: File\n\n\t\t\t\tif (fileMaybeWithId instanceof File) {\n\t\t\t\t\tfileId = `__contember__file-${fileIdSeedRef.current++}`\n\t\t\t\t\tfile = fileMaybeWithId\n\t\t\t\t} else {\n\t\t\t\t\tfileId = fileMaybeWithId[0]\n\t\t\t\t\tfile = fileMaybeWithId[1]\n\t\t\t\t}\n\n\t\t\t\tabortController.signal.addEventListener('abort', () => {\n\t\t\t\t\tpurgeUpload([fileId])\n\t\t\t\t})\n\n\t\t\t\tfileWithMetadataByFileConfig.set(fileId, {\n\t\t\t\t\tpreviewUrl: URL.createObjectURL(file),\n\t\t\t\t\tabortController,\n\t\t\t\t\tfile,\n\t\t\t\t\tfileId,\n\t\t\t\t})\n\n\t\t\t\tnewFileIds.add(fileId)\n\t\t\t}\n\t\t\tif (fileWithMetadataByFileConfig.size === 0) {\n\t\t\t\treturn fileWithMetadataByFileConfig\n\t\t\t}\n\n\t\t\tif (newFileIds.size) {\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: 'purge',\n\t\t\t\t\tfiles: newFileIds,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tdispatch({\n\t\t\t\ttype: 'initialize',\n\t\t\t\tfiles: fileWithMetadataByFileConfig,\n\t\t\t})\n\n\t\t\treturn fileWithMetadataByFileConfig\n\t\t},\n\t\t[purgeUpload],\n\t)\n\tconst startUpload = useCallback<StartUpload<Metadata>>(\n\t\tfiles => {\n\t\t\tconst filesById = new Map<FileId, FileUploadMetadata<Metadata>>()\n\t\t\tconst groupedByUploader: Map<FileUploader, Map<File, UploadedFileMetadata>> = new Map()\n\n\t\t\tconst currentState = multiTemporalStateRef.current\n\n\t\t\tfor (const fileOrIdMaybeWithOptions of files) {\n\t\t\t\tlet fileOrId: File | FileId\n\t\t\t\tlet options: StartUploadFileOptions<Metadata>\n\n\t\t\t\tif (Array.isArray(fileOrIdMaybeWithOptions)) {\n\t\t\t\t\tfileOrId = fileOrIdMaybeWithOptions[0]\n\t\t\t\t\toptions = fileOrIdMaybeWithOptions[1]\n\t\t\t\t} else {\n\t\t\t\t\tfileOrId = fileOrIdMaybeWithOptions\n\t\t\t\t\toptions = {}\n\t\t\t\t}\n\t\t\t\tconst { uploader = defaultUploader, metadata } = options\n\n\t\t\t\tconst fileId = toFileId(currentState, fileOrId)\n\t\t\t\tconst fileState = currentState.liveState.get(fileId)\n\n\t\t\t\tif (fileState === undefined || fileState.readyState !== 'initializing') {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Trying to startUpload a file that hasn't been previously initialized. ` +\n\t\t\t\t\t\t\t`This will be possible in future, but isn't yet.`,\n\t\t\t\t\t)\n\t\t\t\t}\n\n\t\t\t\tfilesById.set(fileId, {\n\t\t\t\t\tuploader,\n\t\t\t\t\tmetadata,\n\t\t\t\t})\n\n\t\t\t\tlet filesWithSameUploader = groupedByUploader.get(uploader)\n\t\t\t\tif (filesWithSameUploader === undefined) {\n\t\t\t\t\tgroupedByUploader.set(uploader, (filesWithSameUploader = new Map()))\n\t\t\t\t}\n\t\t\t\tfilesWithSameUploader.set(fileState.file, {\n\t\t\t\t\tabortSignal: fileState.abortController.signal,\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tdispatch({\n\t\t\t\ttype: 'startUploading',\n\t\t\t\tfiles: filesById,\n\t\t\t})\n\n\t\t\tfor (const [uploader, filesForUpload] of groupedByUploader) {\n\t\t\t\ttry {\n\t\t\t\t\tuploader.upload(filesForUpload, {\n\t\t\t\t\t\tonProgress: progress => {\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: 'updateUploadProgress',\n\t\t\t\t\t\t\t\tprogress,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonSuccess: result => {\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: 'finishSuccessfully',\n\t\t\t\t\t\t\t\tresult,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t\tonError: error => {\n\t\t\t\t\t\t\tdispatch({\n\t\t\t\t\t\t\t\ttype: 'finishWithError',\n\t\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcontentApiClient,\n\t\t\t\t\t})\n\t\t\t\t} catch (error) {\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: 'finishWithError',\n\t\t\t\t\t\terror: Array.from(filesForUpload).map(([file]) => [file, error]),\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t[contentApiClient, defaultUploader],\n\t)\n\n\tconst operations = useMemo<FileUploadOperations<Metadata>>(\n\t\t() => ({\n\t\t\tfailUpload,\n\t\t\tinitializeUpload,\n\t\t\tpurgeUpload,\n\t\t\tstartUpload,\n\t\t}),\n\t\t[failUpload, initializeUpload, purgeUpload, startUpload],\n\t)\n\n\tuseEffect(() => {\n\t\tif (isFirstRenderRef.current) {\n\t\t\treturn\n\t\t}\n\t\tif (multiTemporalState.isLiveStateDirty) {\n\t\t\tconst now = Date.now()\n\t\t\tconst timeDelta = Math.max(now - multiTemporalState.lastUpdateTime, 0) // The max is just a sanity check\n\t\t\tif (timeDelta > maxUpdateFrequency) {\n\t\t\t\tif (updateTimeoutRef.current !== undefined) {\n\t\t\t\t\tclearTimeout(updateTimeoutRef.current)\n\t\t\t\t}\n\t\t\t\tdispatch({\n\t\t\t\t\ttype: 'publishNewestState',\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tif (updateTimeoutRef.current !== undefined) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tupdateTimeoutRef.current = window.setTimeout(() => {\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: 'publishNewestState',\n\t\t\t\t\t})\n\t\t\t\t\tupdateTimeoutRef.current = undefined\n\t\t\t\t}, maxUpdateFrequency - timeDelta)\n\t\t\t}\n\t\t}\n\t}, [\n\t\tmultiTemporalState.isLiveStateDirty,\n\t\tmultiTemporalState.lastUpdateTime,\n\t\tmultiTemporalState.liveState,\n\t\tmultiTemporalState.publicState,\n\t\tmaxUpdateFrequency,\n\t])\n\n\tuseEffect(\n\t\t() => () => {\n\t\t\tfor (const [, state] of multiTemporalStateRef.current.liveState) {\n\t\t\t\tURL.revokeObjectURL(state.previewUrl)\n\t\t\t}\n\t\t\tfor (const [, state] of multiTemporalStateRef.current.publicState) {\n\t\t\t\tURL.revokeObjectURL(state.previewUrl)\n\t\t\t}\n\t\t},\n\t\t[],\n\t)\n\n\t// For this to work, this effect must be the last one to run.\n\tuseEffect(() => {\n\t\tisFirstRenderRef.current = false\n\t}, [])\n\n\treturn [multiTemporalState.publicState, operations]\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { GraphQlClient } from '@contember/client';
2
+ import { useMemo } from 'react';
3
+ import { useApiBaseUrl } from './config/useApiBaseUrl.js';
4
+ import { useSessionToken } from './auth/useSessionToken.js';
5
+
6
+ const useGraphQlClient = (path) => {
7
+ const apiBaseUrl = useApiBaseUrl();
8
+ const sessionToken = useSessionToken();
9
+ return useMemo(() => new GraphQlClient(`${apiBaseUrl}${path}`, sessionToken), [apiBaseUrl, path, sessionToken]);
10
+ };
11
+
12
+ export { useGraphQlClient };
13
+ //# sourceMappingURL=useGraphQlClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGraphQlClient.js","sources":["../../src/useGraphQlClient.ts"],"sourcesContent":["import { GraphQlClient } from '@contember/client'\nimport { useMemo } from 'react'\nimport { useSessionToken } from './auth'\nimport { useApiBaseUrl } from './config'\n\nexport const useGraphQlClient = (path: string): GraphQlClient => {\n\tconst apiBaseUrl = useApiBaseUrl()\n\tconst sessionToken = useSessionToken()\n\treturn useMemo(() => new GraphQlClient(`${apiBaseUrl}${path}`, sessionToken), [apiBaseUrl, path, sessionToken])\n}\n"],"names":[],"mappings":";;;;;MAKa,mBAAmB,CAAC,SAAgC;AAChE,QAAM,aAAa;AACnB,QAAM,eAAe;AACrB,SAAO,QAAQ,MAAM,IAAI,cAAc,GAAG,aAAa,QAAQ,eAAe,CAAC,YAAY,MAAM;AAAA;;;;"}
@@ -0,0 +1,6 @@
1
+ function assertNever(_) {
2
+ throw new Error();
3
+ }
4
+
5
+ export { assertNever };
6
+ //# sourceMappingURL=assertNever.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertNever.js","sources":["../../../src/utils/assertNever.ts"],"sourcesContent":["export function assertNever(_: never): asserts _ is never {\n\tthrow new Error()\n}\n"],"names":[],"mappings":"qBAA4B,GAA8B;AACzD,QAAM,IAAI;AAAA;;;;"}
@@ -0,0 +1,4 @@
1
+ class ClientError extends Error {
2
+ }
3
+ export { ClientError };
4
+ //# sourceMappingURL=ClientError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClientError.js","sources":["../../src/ClientError.ts"],"sourcesContent":["export class ClientError extends Error {}\n"],"names":[],"mappings":"0BAAiC,MAAM;AAAA;;"}
@@ -0,0 +1,28 @@
1
+ import { memo, createElement } from "react";
2
+ import { ApiBaseUrlContext } from "./config/ApiBaseUrlContext.js";
3
+ import { LoginTokenContext } from "./config/LoginTokenContext.js";
4
+ import { SessionTokenContext } from "./auth/SessionTokenContext.js";
5
+ import { ProjectSlugContext } from "./project/ProjectSlugContext.js";
6
+ import { StageSlugContext } from "./project/StageSlugContext.js";
7
+ const ContemberClient = memo(function ContemberClient2({
8
+ apiBaseUrl,
9
+ children,
10
+ loginToken,
11
+ project,
12
+ sessionToken,
13
+ stage
14
+ }) {
15
+ return /* @__PURE__ */ createElement(ApiBaseUrlContext.Provider, {
16
+ value: apiBaseUrl
17
+ }, /* @__PURE__ */ createElement(LoginTokenContext.Provider, {
18
+ value: loginToken
19
+ }, /* @__PURE__ */ createElement(SessionTokenContext.Provider, {
20
+ value: sessionToken
21
+ }, /* @__PURE__ */ createElement(ProjectSlugContext.Provider, {
22
+ value: project
23
+ }, /* @__PURE__ */ createElement(StageSlugContext.Provider, {
24
+ value: stage
25
+ }, children)))));
26
+ });
27
+ export { ContemberClient };
28
+ //# sourceMappingURL=ContemberClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ContemberClient.js","sources":["../../src/ContemberClient.tsx"],"sourcesContent":["import { memo, ReactNode } from 'react'\nimport { SessionTokenContext } from './auth'\nimport { ApiBaseUrlContext, LoginTokenContext } from './config'\nimport { ProjectSlugContext, StageSlugContext } from './project'\n\nexport interface ContemberClientProps {\n\tapiBaseUrl: string\n\tsessionToken?: string\n\tloginToken?: string\n\tproject?: string\n\tstage?: string\n}\n\nexport const ContemberClient = memo<ContemberClientProps & { children: React.ReactNode }>(function ContemberClient({\n\tapiBaseUrl,\n\tchildren,\n\tloginToken,\n\tproject,\n\tsessionToken,\n\tstage,\n}) {\n\treturn (\n\t\t<ApiBaseUrlContext.Provider value={apiBaseUrl}>\n\t\t\t<LoginTokenContext.Provider value={loginToken}>\n\t\t\t\t<SessionTokenContext.Provider value={sessionToken}>\n\t\t\t\t\t<ProjectSlugContext.Provider value={project}>\n\t\t\t\t\t\t<StageSlugContext.Provider value={stage}>{children}</StageSlugContext.Provider>\n\t\t\t\t\t</ProjectSlugContext.Provider>\n\t\t\t\t</SessionTokenContext.Provider>\n\t\t\t</LoginTokenContext.Provider>\n\t\t</ApiBaseUrlContext.Provider>\n\t)\n})\n"],"names":[],"mappings":";;;;;;MAaa,kBAAkB,KAA2D,0BAAyB;AAAA,EAClH;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GACE;uCAEA,kBAAkB,UAAnB;AAAA,IAA4B,OAAO;AAAA,mCACjC,kBAAkB,UAAnB;AAAA,IAA4B,OAAO;AAAA,mCACjC,oBAAoB,UAArB;AAAA,IAA8B,OAAO;AAAA,mCACnC,mBAAmB,UAApB;AAAA,IAA6B,OAAO;AAAA,mCAClC,iBAAiB,UAAlB;AAAA,IAA2B,OAAO;AAAA,KAAQ;AAAA;;"}
@@ -0,0 +1,32 @@
1
+ const apiRequestReducer = (previousState, action) => {
2
+ switch (action.type) {
3
+ case "uninitialize":
4
+ return {
5
+ readyState: "uninitialized",
6
+ isFinished: false,
7
+ isLoading: false
8
+ };
9
+ case "initialize":
10
+ return {
11
+ readyState: "pending",
12
+ isFinished: false,
13
+ isLoading: true
14
+ };
15
+ case "resolveSuccessfully":
16
+ return {
17
+ readyState: "networkSuccess",
18
+ data: action.data,
19
+ isFinished: true,
20
+ isLoading: false
21
+ };
22
+ case "resolveWithError":
23
+ return {
24
+ readyState: "networkError",
25
+ data: action.error,
26
+ isFinished: true,
27
+ isLoading: false
28
+ };
29
+ }
30
+ };
31
+ export { apiRequestReducer };
32
+ //# sourceMappingURL=apiRequestReducer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apiRequestReducer.js","sources":["../../../src/apiRequest/apiRequestReducer.ts"],"sourcesContent":["import type { ApiRequestAction } from './ApiRequestAction'\nimport type { ApiRequestState } from './ApiRequestState'\n\nexport type ApiRequestReducer<SuccessData> = (\n\tpreviousState: ApiRequestState<SuccessData>,\n\taction: ApiRequestAction<SuccessData>,\n) => ApiRequestState<SuccessData>\n\nexport const apiRequestReducer = <SuccessData>(\n\tpreviousState: ApiRequestState<SuccessData>,\n\taction: ApiRequestAction<SuccessData>,\n): ApiRequestState<SuccessData> => {\n\tswitch (action.type) {\n\t\tcase 'uninitialize':\n\t\t\treturn {\n\t\t\t\treadyState: 'uninitialized',\n\t\t\t\tisFinished: false,\n\t\t\t\tisLoading: false,\n\t\t\t}\n\t\tcase 'initialize':\n\t\t\treturn {\n\t\t\t\treadyState: 'pending',\n\t\t\t\tisFinished: false,\n\t\t\t\tisLoading: true,\n\t\t\t}\n\t\tcase 'resolveSuccessfully':\n\t\t\treturn {\n\t\t\t\treadyState: 'networkSuccess',\n\t\t\t\tdata: action.data,\n\t\t\t\tisFinished: true,\n\t\t\t\tisLoading: false,\n\t\t\t}\n\t\tcase 'resolveWithError':\n\t\t\treturn {\n\t\t\t\treadyState: 'networkError',\n\t\t\t\tdata: action.error,\n\t\t\t\tisFinished: true,\n\t\t\t\tisLoading: false,\n\t\t\t}\n\t}\n}\n"],"names":[],"mappings":"MAQa,oBAAoB,CAChC,eACA,WACkC;UAC1B,OAAO;AAAA,SACT;aACG;AAAA,QACN,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA;AAAA,SAER;aACG;AAAA,QACN,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,WAAW;AAAA;AAAA,SAER;aACG;AAAA,QACN,YAAY;AAAA,QACZ,MAAM,OAAO;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA;AAAA,SAER;aACG;AAAA,QACN,YAAY;AAAA,QACZ,MAAM,OAAO;AAAA,QACb,YAAY;AAAA,QACZ,WAAW;AAAA;AAAA;AAAA;;"}
@@ -0,0 +1,41 @@
1
+ import { useReducer, useRef, useCallback, useEffect } from "react";
2
+ import { apiRequestReducer } from "./apiRequestReducer.js";
3
+ const initialState = {
4
+ isLoading: false,
5
+ isFinished: false,
6
+ readyState: "uninitialized"
7
+ };
8
+ const useApiRequest = (client) => {
9
+ const [state, dispatch] = useReducer(apiRequestReducer, initialState);
10
+ const isUnmountedRef = useRef(false);
11
+ const sendRequest = useCallback(async (query, variables = {}, options) => {
12
+ if (isUnmountedRef.current) {
13
+ return Promise.reject();
14
+ }
15
+ dispatch({
16
+ type: "initialize"
17
+ });
18
+ return client.sendRequest(query, {
19
+ ...options,
20
+ variables
21
+ }).then((data) => {
22
+ dispatch({
23
+ type: "resolveSuccessfully",
24
+ data
25
+ });
26
+ return Promise.resolve(data);
27
+ }).catch((error) => {
28
+ dispatch({
29
+ type: "resolveWithError",
30
+ error
31
+ });
32
+ return Promise.reject(error);
33
+ });
34
+ }, [client]);
35
+ useEffect(() => () => {
36
+ isUnmountedRef.current = true;
37
+ }, []);
38
+ return [state, sendRequest];
39
+ };
40
+ export { useApiRequest };
41
+ //# sourceMappingURL=useApiRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useApiRequest.js","sources":["../../../src/apiRequest/useApiRequest.ts"],"sourcesContent":["import type {\n\tGraphQlClient,\n\tGraphQlClientFailedRequestMetadata,\n\tGraphQlClientRequestOptions,\n\tGraphQlClientVariables,\n} from '@contember/client'\nimport { useCallback, useEffect, useReducer, useRef } from 'react'\nimport { ApiRequestReducer, apiRequestReducer } from './apiRequestReducer'\nimport type { ApiRequestState } from './ApiRequestState'\n\nconst initialState: ApiRequestState<any> = {\n\tisLoading: false,\n\tisFinished: false,\n\treadyState: 'uninitialized',\n}\n\nexport type UseApiRequestResult<SuccessData> = [\n\tApiRequestState<SuccessData>,\n\t(\n\t\tquery: string,\n\t\tvariables?: GraphQlClientVariables,\n\t\toptions?: Omit<GraphQlClientRequestOptions, 'variables'>,\n\t) => Promise<SuccessData>,\n]\n\nexport const useApiRequest = <SuccessData>(client: GraphQlClient): UseApiRequestResult<SuccessData> => {\n\tconst [state, dispatch] = useReducer(apiRequestReducer as ApiRequestReducer<SuccessData>, initialState)\n\n\tconst isUnmountedRef = useRef(false)\n\tconst sendRequest = useCallback(\n\t\tasync (\n\t\t\tquery: string,\n\t\t\tvariables: GraphQlClientVariables = {},\n\t\t\toptions?: Omit<GraphQlClientRequestOptions, 'variables'>,\n\t\t): Promise<SuccessData> => {\n\t\t\tif (isUnmountedRef.current) {\n\t\t\t\treturn Promise.reject()\n\t\t\t}\n\t\t\tdispatch({\n\t\t\t\ttype: 'initialize',\n\t\t\t})\n\t\t\treturn client\n\t\t\t\t.sendRequest<SuccessData>(query, {\n\t\t\t\t\t...options,\n\t\t\t\t\tvariables,\n\t\t\t\t})\n\t\t\t\t.then(data => {\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: 'resolveSuccessfully',\n\t\t\t\t\t\tdata,\n\t\t\t\t\t})\n\t\t\t\t\treturn Promise.resolve(data)\n\t\t\t\t})\n\t\t\t\t.catch((error: GraphQlClientFailedRequestMetadata) => {\n\t\t\t\t\tdispatch({\n\t\t\t\t\t\ttype: 'resolveWithError',\n\t\t\t\t\t\terror,\n\t\t\t\t\t})\n\t\t\t\t\treturn Promise.reject(error)\n\t\t\t\t})\n\t\t},\n\t\t[client],\n\t)\n\n\tuseEffect(\n\t\t() => () => {\n\t\t\tisUnmountedRef.current = true\n\t\t},\n\t\t[], // This empty array is crucial! Otherwise it will first \"unmount\" before second render no matter what.\n\t)\n\n\treturn [state, sendRequest]\n}\n"],"names":[],"mappings":";;AAUA,MAAM,eAAqC;AAAA,EAC1C,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA;MAYA,gBAAgB,CAAc,WAA4D;QAChG,CAAC,OAAO,YAAY,WAAW,mBAAqD;QAEpF,iBAAiB,OAAO;QACxB,cAAc,YACnB,OACC,OACA,YAAoC,IACpC,YAC0B;QACtB,eAAe,SAAS;aACpB,QAAQ;AAAA;aAEP;AAAA,MACR,MAAM;AAAA;WAEA,OACL,YAAyB,OAAO;AAAA,SAC7B;AAAA,MACH;AAAA,OAEA,KAAK,UAAQ;eACJ;AAAA,QACR,MAAM;AAAA,QACN;AAAA;aAEM,QAAQ,QAAQ;AAAA,OAEvB,MAAM,CAAC,UAA8C;eAC5C;AAAA,QACR,MAAM;AAAA,QACN;AAAA;aAEM,QAAQ,OAAO;AAAA;AAAA,KAGzB,CAAC;YAID,MAAM,MAAM;mBACI,UAAU;AAAA,KAE1B;SAGM,CAAC,OAAO;AAAA;;"}
@@ -0,0 +1,4 @@
1
+ import { createContext } from "react";
2
+ const SessionTokenContext = createContext(void 0);
3
+ export { SessionTokenContext };
4
+ //# sourceMappingURL=SessionTokenContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionTokenContext.js","sources":["../../../src/auth/SessionTokenContext.ts"],"sourcesContent":["import { createContext } from 'react'\n\nexport const SessionTokenContext = createContext<string | undefined>(undefined)\n"],"names":[],"mappings":";MAEa,sBAAsB,cAAkC;;"}
@@ -0,0 +1,16 @@
1
+ import { loginMutation } from "@contember/client";
2
+ import { useCallback } from "react";
3
+ import { useTenantApiRequest } from "../tenant/useTenantApiRequest.js";
4
+ import { useLoginToken } from "../config/useLoginToken.js";
5
+ const useLoginRequest = () => {
6
+ const [requestState, sendRequest] = useTenantApiRequest();
7
+ const loginToken = useLoginToken();
8
+ const login = useCallback((email, password) => sendRequest(loginMutation, {
9
+ email,
10
+ password,
11
+ expiration: 3600 * 24 * 14
12
+ }, { apiTokenOverride: loginToken }), [sendRequest, loginToken]);
13
+ return [requestState, login];
14
+ };
15
+ export { useLoginRequest };
16
+ //# sourceMappingURL=useLoginRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useLoginRequest.js","sources":["../../../src/auth/useLoginRequest.ts"],"sourcesContent":["import { loginMutation, LoginMutationResponse } from '@contember/client'\nimport { useCallback } from 'react'\nimport type { ApiRequestState } from '../apiRequest'\nimport { useLoginToken } from '../config'\nimport { useTenantApiRequest } from '../tenant'\n\nexport const useLoginRequest = (): [\n\tApiRequestState<LoginMutationResponse>,\n\t(email: string, password: string) => Promise<LoginMutationResponse>,\n] => {\n\tconst [requestState, sendRequest] = useTenantApiRequest<LoginMutationResponse>()\n\tconst loginToken = useLoginToken()\n\n\tconst login = useCallback(\n\t\t(email: string, password: string) =>\n\t\t\tsendRequest(\n\t\t\t\tloginMutation,\n\t\t\t\t{\n\t\t\t\t\temail,\n\t\t\t\t\tpassword,\n\t\t\t\t\texpiration: 3600 * 24 * 14, // Two weeks\n\t\t\t\t},\n\t\t\t\t{ apiTokenOverride: loginToken },\n\t\t\t),\n\t\t[sendRequest, loginToken],\n\t)\n\n\treturn [requestState, login]\n}\n"],"names":[],"mappings":";;;;MAMa,kBAAkB,MAG1B;QACE,CAAC,cAAc,eAAe;QAC9B,aAAa;QAEb,QAAQ,YACb,CAAC,OAAe,aACf,YACC,eACA;AAAA,IACC;AAAA,IACA;AAAA,IACA,YAAY,OAAO,KAAK;AAAA,KAEzB,EAAE,kBAAkB,eAEtB,CAAC,aAAa;SAGR,CAAC,cAAc;AAAA;;"}
@@ -0,0 +1,5 @@
1
+ import { useContext } from "react";
2
+ import { SessionTokenContext } from "./SessionTokenContext.js";
3
+ const useSessionToken = () => useContext(SessionTokenContext);
4
+ export { useSessionToken };
5
+ //# sourceMappingURL=useSessionToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSessionToken.js","sources":["../../../src/auth/useSessionToken.ts"],"sourcesContent":["import { useContext } from 'react'\nimport { SessionTokenContext } from './SessionTokenContext'\n\nexport const useSessionToken = () => useContext(SessionTokenContext)\n"],"names":[],"mappings":";;MAGa,kBAAkB,MAAM,WAAW;;"}
@@ -0,0 +1,23 @@
1
+ import { createElement } from "react";
2
+ import { renderChildren } from "./renderChildren.js";
3
+ import { RenderElementFallback } from "./RenderElementFallback.js";
4
+ import { resolveRichTextElementMetadata } from "./resolveRichTextElementMetadata.js";
5
+ import { useRichTextRenderMetadata } from "./RichTextRenderMetadataContext.js";
6
+ function ElementRenderer({ element, children, options }) {
7
+ const metadata = useRichTextRenderMetadata();
8
+ const elementMetadata = resolveRichTextElementMetadata(element, metadata);
9
+ const fallback = /* @__PURE__ */ createElement(RenderElementFallback, {
10
+ element,
11
+ options
12
+ }, children);
13
+ return options.renderElement ? createElement(options.renderElement, {
14
+ ...elementMetadata,
15
+ element,
16
+ fallback,
17
+ children,
18
+ renderChildren,
19
+ renderChildrenOptions: options
20
+ }) : fallback;
21
+ }
22
+ export { ElementRenderer };
23
+ //# sourceMappingURL=ElementRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ElementRenderer.js","sources":["../../../../src/components/RichTextRenderer/ElementRenderer.tsx"],"sourcesContent":["import type { ComponentType, ReactElement } from 'react'\nimport { createElement } from 'react'\nimport type { BuiltinElements } from './BuiltinElements'\nimport type { BuiltinLeaves } from './BuiltinLeaves'\nimport type { RenderChildrenOptions } from './renderChildren'\nimport { renderChildren } from './renderChildren'\nimport { RenderElementFallback } from './RenderElementFallback'\nimport { resolveRichTextElementMetadata } from './resolveRichTextElementMetadata'\nimport type { RichTextElement } from './RichTextElement'\nimport type { RichTextElementMetadata } from './RichTextElementMetadata'\nimport type { RichTextLeaf } from './RichTextLeaf'\nimport type { RichTextReference } from './RichTextReference'\nimport { useRichTextRenderMetadata } from './RichTextRenderMetadataContext'\n\nexport type RenderElement<\n\tCustomElements extends RichTextElement = never,\n\tCustomLeaves extends RichTextLeaf = never,\n\tReference extends RichTextReference = RichTextReference,\n> = ComponentType<\n\t{\n\t\telement: CustomElements | BuiltinElements<CustomElements, CustomLeaves>\n\t\tchildren: ReactElement\n\n\t\tfallback: ReactElement\n\n\t\trenderChildren: (\n\t\t\tchildren:\n\t\t\t\t| CustomElements\n\t\t\t\t| BuiltinElements<CustomElements, CustomLeaves>\n\t\t\t\t| CustomLeaves\n\t\t\t\t| BuiltinLeaves\n\t\t\t\t| Array<CustomElements | BuiltinElements<CustomElements, CustomLeaves> | CustomLeaves | BuiltinLeaves>,\n\t\t\toptions: RenderChildrenOptions<CustomElements, CustomLeaves>,\n\t\t) => ReactElement\n\t\trenderChildrenOptions: RenderChildrenOptions<CustomElements, CustomLeaves>\n\t} & RichTextElementMetadata<CustomElements, CustomLeaves, Reference>\n>\n\nexport interface ElementRendererProps<\n\tCustomElements extends RichTextElement = never,\n\tCustomLeaves extends RichTextLeaf = never,\n> {\n\telement: CustomElements | BuiltinElements<CustomElements, CustomLeaves>\n\tchildren: ReactElement\n\toptions: RenderChildrenOptions<CustomElements, CustomLeaves>\n}\n\nexport function ElementRenderer<\n\tCustomElements extends RichTextElement = never,\n\tCustomLeaves extends RichTextLeaf = never,\n>({ element, children, options }: ElementRendererProps<CustomElements, CustomLeaves>) {\n\tconst metadata = useRichTextRenderMetadata<CustomElements, CustomLeaves>()\n\tconst elementMetadata = resolveRichTextElementMetadata<CustomElements, CustomLeaves>(element, metadata)\n\n\tconst fallback = (\n\t\t<RenderElementFallback element={element as BuiltinElements} options={options}>\n\t\t\t{children}\n\t\t</RenderElementFallback>\n\t)\n\n\treturn options.renderElement\n\t\t? createElement(options.renderElement, {\n\t\t\t\t...elementMetadata,\n\t\t\t\telement,\n\t\t\t\tfallback,\n\t\t\t\tchildren,\n\t\t\t\trenderChildren,\n\t\t\t\trenderChildrenOptions: options,\n\t\t })\n\t\t: fallback\n}\n"],"names":[],"mappings":";;;;;yBAkDE,EAAE,SAAS,UAAU,WAA+D;QAC/E,WAAW;QACX,kBAAkB,+BAA6D,SAAS;QAExF,yCACJ,uBAAD;AAAA,IAAuB;AAAA,IAAqC;AAAA,KAC1D;SAII,QAAQ,gBACZ,cAAc,QAAQ,eAAe;AAAA,OAClC;AAAA,IACH;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,uBAAuB;AAAA,OAEvB;AAAA;;"}
@@ -0,0 +1,19 @@
1
+ import { createElement } from "react";
2
+ import { RenderLeafFallback } from "./RenderLeafFallback.js";
3
+ import { useRichTextRenderMetadata } from "./RichTextRenderMetadataContext.js";
4
+ function LeafRenderer({
5
+ leaf,
6
+ renderLeaf
7
+ }) {
8
+ const formatVersion = useRichTextRenderMetadata().formatVersion;
9
+ const fallback = /* @__PURE__ */ createElement(RenderLeafFallback, {
10
+ leaf
11
+ });
12
+ return renderLeaf ? createElement(renderLeaf, {
13
+ formatVersion,
14
+ leaf,
15
+ fallback
16
+ }, leaf.text) : fallback;
17
+ }
18
+ export { LeafRenderer };
19
+ //# sourceMappingURL=LeafRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LeafRenderer.js","sources":["../../../../src/components/RichTextRenderer/LeafRenderer.tsx"],"sourcesContent":["import type { ComponentType, ReactElement } from 'react'\nimport { createElement } from 'react'\nimport type { BuiltinLeaves } from './BuiltinLeaves'\nimport { RenderLeafFallback } from './RenderLeafFallback'\nimport type { RichTextLeaf } from './RichTextLeaf'\nimport type { RichTextLeafMetadata } from './RichTextLeafMetadata'\nimport { useRichTextRenderMetadata } from './RichTextRenderMetadataContext'\n\nexport type RenderLeaf<CustomLeaves extends RichTextLeaf> = ComponentType<\n\t{\n\t\tleaf: CustomLeaves | BuiltinLeaves\n\t\tfallback: ReactElement\n\t} & RichTextLeafMetadata\n>\n\nexport interface LeafRendererProps<CustomLeaves extends RichTextLeaf = never> {\n\trenderLeaf?: RenderLeaf<CustomLeaves>\n\tleaf: CustomLeaves | BuiltinLeaves\n}\n\nexport function LeafRenderer<CustomLeaves extends RichTextLeaf = never>({\n\tleaf,\n\trenderLeaf,\n}: LeafRendererProps<CustomLeaves>) {\n\tconst formatVersion = useRichTextRenderMetadata().formatVersion\n\tconst fallback = <RenderLeafFallback leaf={leaf} />\n\n\treturn renderLeaf\n\t\t? createElement(\n\t\t\t\trenderLeaf,\n\t\t\t\t{\n\t\t\t\t\tformatVersion,\n\t\t\t\t\tleaf,\n\t\t\t\t\tfallback,\n\t\t\t\t},\n\t\t\t\tleaf.text,\n\t\t )\n\t\t: fallback\n}\n"],"names":[],"mappings":";;;sBAoBwE;AAAA,EACvE;AAAA,EACA;AAAA,GACmC;QAC7B,gBAAgB,4BAA4B;QAC5C,yCAAY,oBAAD;AAAA,IAAoB;AAAA;SAE9B,aACJ,cACA,YACA;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,KAED,KAAK,QAEL;AAAA;;"}
@@ -0,0 +1,104 @@
1
+ import { createElement, Fragment } from "react";
2
+ import { renderChildren } from "./renderChildren.js";
3
+ import { resolveRichTextElementMetadata } from "./resolveRichTextElementMetadata.js";
4
+ import { useRichTextRenderMetadata } from "./RichTextRenderMetadataContext.js";
5
+ const getElementDataAttributes = (element, attributeNamePrefix = "contember-") => {
6
+ const { children, referenceId, ...extendedSpecifics } = element;
7
+ return Object.fromEntries(Object.entries(extendedSpecifics).filter(([, value]) => {
8
+ const t = typeof value;
9
+ return t === "string" || t === "number" || t === "boolean";
10
+ }).map(([attribute, value]) => [`data-${attributeNamePrefix}${attribute.toLowerCase()}`, value]));
11
+ };
12
+ function RenderElementFallback({ element, children, options }) {
13
+ const attributes = getElementDataAttributes(element, options.attributeNamePrefix);
14
+ switch (element.type) {
15
+ case "anchor":
16
+ return /* @__PURE__ */ createElement("a", {
17
+ ...attributes,
18
+ href: element.href
19
+ }, children);
20
+ case "heading":
21
+ return createElement(`h${element.level}`, attributes, children);
22
+ case "horizontalRule":
23
+ return /* @__PURE__ */ createElement("hr", {
24
+ ...attributes
25
+ });
26
+ case "listItem":
27
+ return /* @__PURE__ */ createElement("li", {
28
+ ...attributes
29
+ }, children);
30
+ case "orderedList":
31
+ return /* @__PURE__ */ createElement("ol", {
32
+ ...attributes
33
+ }, children);
34
+ case "paragraph":
35
+ return /* @__PURE__ */ createElement("p", {
36
+ ...attributes
37
+ }, children);
38
+ case "reference": {
39
+ return /* @__PURE__ */ createElement(ReferenceElementFallback, {
40
+ element,
41
+ children
42
+ });
43
+ }
44
+ case "scrollTarget":
45
+ return /* @__PURE__ */ createElement("span", {
46
+ ...attributes,
47
+ id: element.identifier
48
+ }, children);
49
+ case "table": {
50
+ const firstRow = element.children[0];
51
+ if (!firstRow || firstRow.headerScope !== "table") {
52
+ return /* @__PURE__ */ createElement("table", {
53
+ ...attributes
54
+ }, /* @__PURE__ */ createElement("tbody", null, children));
55
+ }
56
+ return /* @__PURE__ */ createElement("table", {
57
+ ...attributes
58
+ }, /* @__PURE__ */ createElement("thead", null, renderChildren([firstRow], options)), /* @__PURE__ */ createElement("tbody", null, renderChildren(element.children.slice(1), options)));
59
+ }
60
+ case "tableRow":
61
+ return /* @__PURE__ */ createElement("tr", {
62
+ ...attributes
63
+ }, children);
64
+ case "tableCell": {
65
+ if (element.headerScope) {
66
+ return /* @__PURE__ */ createElement("th", {
67
+ ...attributes,
68
+ scope: element.headerScope
69
+ }, children);
70
+ }
71
+ return /* @__PURE__ */ createElement("td", {
72
+ ...attributes
73
+ }, children);
74
+ }
75
+ case "unorderedList":
76
+ return /* @__PURE__ */ createElement("ul", {
77
+ ...attributes
78
+ }, children);
79
+ default: {
80
+ {
81
+ return children;
82
+ }
83
+ }
84
+ }
85
+ }
86
+ function ReferenceElementFallback({ element, children }) {
87
+ const metadata = useRichTextRenderMetadata();
88
+ const elementMetadata = resolveRichTextElementMetadata(element, metadata);
89
+ if (elementMetadata.referenceRenderer === void 0 || elementMetadata.referenceType === void 0 || elementMetadata.reference === void 0) {
90
+ {
91
+ return children;
92
+ }
93
+ }
94
+ return /* @__PURE__ */ createElement(Fragment, null, elementMetadata.referenceRenderer?.({
95
+ referenceType: elementMetadata.referenceType,
96
+ referenceRenderer: elementMetadata.referenceRenderer,
97
+ reference: elementMetadata.reference,
98
+ formatVersion: elementMetadata.formatVersion,
99
+ element,
100
+ children
101
+ }));
102
+ }
103
+ export { RenderElementFallback };
104
+ //# sourceMappingURL=RenderElementFallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenderElementFallback.js","sources":["../../../../src/components/RichTextRenderer/RenderElementFallback.tsx"],"sourcesContent":["import { createElement, ReactElement } from 'react'\nimport type { BuiltinElements, RichTextReferenceElement, RichTextTableRowElement } from './BuiltinElements'\nimport { renderChildren, RenderChildrenOptions } from './renderChildren'\nimport { resolveRichTextElementMetadata } from './resolveRichTextElementMetadata'\nimport type { RichTextElement } from './RichTextElement'\nimport type { RichTextLeaf } from './RichTextLeaf'\nimport { RichTextRendererError } from './RichTextRendererError'\nimport { useRichTextRenderMetadata } from './RichTextRenderMetadataContext'\n\nexport interface RenderElementFallbackProps<\n\tCustomElements extends RichTextElement = never,\n\tCustomLeaves extends RichTextLeaf = never,\n> {\n\telement: BuiltinElements<CustomElements, CustomLeaves>\n\tchildren: ReactElement\n\toptions: RenderChildrenOptions<CustomElements, CustomLeaves>\n}\n\nconst getElementDataAttributes = <\n\tCustomElements extends RichTextElement = never,\n\tCustomLeaves extends RichTextLeaf = never,\n>(\n\telement: RichTextElement<CustomElements, CustomLeaves>,\n\tattributeNamePrefix: string = 'contember-',\n): {\n\t[dataAttribute: string]: string | number | boolean\n} => {\n\tconst { children, referenceId, ...extendedSpecifics } = element\n\n\treturn Object.fromEntries(\n\t\tObject.entries(extendedSpecifics)\n\t\t\t.filter(([, value]) => {\n\t\t\t\tconst t = typeof value\n\t\t\t\treturn t === 'string' || t === 'number' || t === 'boolean'\n\t\t\t})\n\t\t\t.map(([attribute, value]) => [`data-${attributeNamePrefix}${attribute.toLowerCase()}`, value]),\n\t)\n}\n\nexport function RenderElementFallback<\n\tCustomElements extends RichTextElement = never,\n\tCustomLeaves extends RichTextLeaf = never,\n>({ element, children, options }: RenderElementFallbackProps<CustomElements, CustomLeaves>) {\n\tconst attributes = getElementDataAttributes(element, options.attributeNamePrefix)\n\n\tswitch (element.type) {\n\t\tcase 'anchor':\n\t\t\treturn (\n\t\t\t\t<a {...attributes} href={element.href}>\n\t\t\t\t\t{children}\n\t\t\t\t</a>\n\t\t\t)\n\t\tcase 'heading':\n\t\t\treturn createElement(`h${element.level}`, attributes, children) // TODO numbered\n\t\tcase 'horizontalRule':\n\t\t\treturn <hr {...attributes} />\n\t\tcase 'listItem':\n\t\t\treturn <li {...attributes}>{children}</li>\n\t\tcase 'orderedList':\n\t\t\treturn <ol {...attributes}>{children}</ol>\n\t\tcase 'paragraph':\n\t\t\treturn <p {...attributes}>{children}</p>\n\t\tcase 'reference': {\n\t\t\treturn <ReferenceElementFallback element={element} children={children} />\n\t\t}\n\t\tcase 'scrollTarget':\n\t\t\treturn (\n\t\t\t\t<span {...attributes} id={element.identifier}>\n\t\t\t\t\t{children}\n\t\t\t\t</span>\n\t\t\t)\n\t\tcase 'table': {\n\t\t\tconst firstRow = element.children[0] as RichTextTableRowElement<CustomElements, CustomLeaves> | undefined\n\t\t\tif (!firstRow || firstRow.headerScope !== 'table') {\n\t\t\t\treturn (\n\t\t\t\t\t<table {...attributes}>\n\t\t\t\t\t\t<tbody>{children}</tbody>\n\t\t\t\t\t</table>\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn (\n\t\t\t\t<table {...attributes}>\n\t\t\t\t\t<thead>{renderChildren<CustomElements, CustomLeaves>([firstRow], options)}</thead>\n\t\t\t\t\t<tbody>{renderChildren<CustomElements, CustomLeaves>(element.children.slice(1) as any, options)}</tbody>\n\t\t\t\t</table>\n\t\t\t)\n\t\t}\n\t\tcase 'tableRow':\n\t\t\treturn <tr {...attributes}>{children}</tr>\n\t\tcase 'tableCell': {\n\t\t\tif (element.headerScope) {\n\t\t\t\treturn (\n\t\t\t\t\t<th {...attributes} scope={element.headerScope}>\n\t\t\t\t\t\t{children}\n\t\t\t\t\t</th>\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn <td {...attributes}>{children}</td>\n\t\t}\n\t\tcase 'unorderedList':\n\t\t\treturn <ul {...attributes}>{children}</ul>\n\t\tdefault: {\n\t\t\tif (import.meta.env.DEV) {\n\t\t\t\tthrow new RichTextRendererError(\n\t\t\t\t\t`RichTextRenderer: unknown element of type '${(element as { type: string }).type}'.`,\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\treturn children // At least render the text contents\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction ReferenceElementFallback<\n\tCustomElements extends RichTextElement = never,\n\tCustomLeaves extends RichTextLeaf = never,\n>({ element, children }: { element: RichTextReferenceElement<CustomElements, CustomLeaves>; children: ReactElement }) {\n\tconst metadata = useRichTextRenderMetadata<CustomElements, CustomLeaves>()\n\tconst elementMetadata = resolveRichTextElementMetadata<CustomElements, CustomLeaves>(element, metadata)\n\n\tif (\n\t\telementMetadata.referenceRenderer === undefined ||\n\t\telementMetadata.referenceType === undefined ||\n\t\telementMetadata.reference === undefined\n\t) {\n\t\tif (import.meta.env.DEV) {\n\t\t\tthrow new RichTextRendererError(\n\t\t\t\t`RichTextRenderer: cannot render reference of type '${elementMetadata.referenceType}'.`,\n\t\t\t)\n\t\t} else {\n\t\t\treturn children // At least render the text contents\n\t\t}\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t{elementMetadata.referenceRenderer?.({\n\t\t\t\treferenceType: elementMetadata.referenceType,\n\t\t\t\treferenceRenderer: elementMetadata.referenceRenderer,\n\t\t\t\treference: elementMetadata.reference,\n\t\t\t\tformatVersion: elementMetadata.formatVersion,\n\t\t\t\telement,\n\t\t\t\tchildren,\n\t\t\t})}\n\t\t</>\n\t)\n}\n"],"names":[],"mappings":";;;;AAkBA,MAAM,2BAA2B,CAIhC,SACA,sBAA8B,iBAG1B;QACE,EAAE,UAAU,gBAAgB,sBAAsB;SAEjD,OAAO,YACb,OAAO,QAAQ,mBACb,OAAO,CAAC,GAAG,WAAW;UAChB,IAAI,OAAO;WACV,MAAM,YAAY,MAAM,YAAY,MAAM;AAAA,KAEjD,IAAI,CAAC,CAAC,WAAW,WAAW,CAAC,QAAQ,sBAAsB,UAAU,iBAAiB;AAAA;+BAOxF,EAAE,SAAS,UAAU,WAAqE;QACrF,aAAa,yBAAyB,SAAS,QAAQ;UAErD,QAAQ;AAAA,SACV;2CAEF,KAAD;AAAA,WAAO;AAAA,QAAY,MAAM,QAAQ;AAAA,SAC/B;AAAA,SAGC;aACG,cAAc,IAAI,QAAQ,SAAS,YAAY;AAAA,SAClD;2CACI,MAAD;AAAA,WAAQ;AAAA;AAAA,SACX;2CACI,MAAD;AAAA,WAAQ;AAAA,SAAa;AAAA,SACxB;2CACI,MAAD;AAAA,WAAQ;AAAA,SAAa;AAAA,SACxB;2CACI,KAAD;AAAA,WAAO;AAAA,SAAa;AAAA,SACvB,aAAa;2CACT,0BAAD;AAAA,QAA0B;AAAA,QAAkB;AAAA;AAAA;AAAA,SAE/C;2CAEF,QAAD;AAAA,WAAU;AAAA,QAAY,IAAI,QAAQ;AAAA,SAChC;AAAA,SAGC,SAAS;YACP,WAAW,QAAQ,SAAS;UAC9B,CAAC,YAAY,SAAS,gBAAgB,SAAS;6CAEhD,SAAD;AAAA,aAAW;AAAA,yCACT,SAAD,MAAQ;AAAA;2CAKT,SAAD;AAAA,WAAW;AAAA,uCACT,SAAD,MAAQ,eAA6C,CAAC,WAAW,yCAChE,SAAD,MAAQ,eAA6C,QAAQ,SAAS,MAAM,IAAW;AAAA;AAAA,SAIrF;2CACI,MAAD;AAAA,WAAQ;AAAA,SAAa;AAAA,SACxB,aAAa;UACb,QAAQ,aAAa;6CAEtB,MAAD;AAAA,aAAQ;AAAA,UAAY,OAAO,QAAQ;AAAA,WACjC;AAAA;2CAII,MAAD;AAAA,WAAQ;AAAA,SAAa;AAAA;AAAA,SAExB;2CACI,MAAD;AAAA,WAAQ;AAAA,SAAa;AAAA,aACpB;AAKD;eACC;AAAA;AAAA;AAAA;AAAA;AAMX,kCAGE,EAAE,SAAS,YAAyG;QAC/G,WAAW;QACX,kBAAkB,+BAA6D,SAAS;MAG7F,gBAAgB,sBAAsB,UACtC,gBAAgB,kBAAkB,UAClC,gBAAgB,cAAc,QAC7B;AAKM;aACC;AAAA;AAAA;uDAMN,gBAAgB,oBAAoB;AAAA,IACpC,eAAe,gBAAgB;AAAA,IAC/B,mBAAmB,gBAAgB;AAAA,IACnC,WAAW,gBAAgB;AAAA,IAC3B,eAAe,gBAAgB;AAAA,IAC/B;AAAA,IACA;AAAA;AAAA;;"}
@@ -0,0 +1,34 @@
1
+ import { createElement, Fragment } from "react";
2
+ function jsxN2br(text) {
3
+ const lines = text.split("\n");
4
+ if (lines.length <= 1) {
5
+ return text;
6
+ }
7
+ return lines.map((line, i) => /* @__PURE__ */ createElement(Fragment, {
8
+ key: i
9
+ }, !!i && /* @__PURE__ */ createElement("br", null), line));
10
+ }
11
+ function RenderLeafFallback({ leaf }) {
12
+ let element = jsxN2br(leaf.text);
13
+ if ("isCode" in leaf && leaf.isCode === true) {
14
+ element = /* @__PURE__ */ createElement("code", null, element);
15
+ }
16
+ if ("isStruckThrough" in leaf && leaf.isStruckThrough === true) {
17
+ element = /* @__PURE__ */ createElement("s", null, element);
18
+ }
19
+ if ("isHighlighted" in leaf && leaf.isHighlighted === true) {
20
+ element = /* @__PURE__ */ createElement("em", null, element);
21
+ }
22
+ if ("isUnderlined" in leaf && leaf.isUnderlined === true) {
23
+ element = /* @__PURE__ */ createElement("u", null, element);
24
+ }
25
+ if ("isItalic" in leaf && leaf.isItalic === true) {
26
+ element = /* @__PURE__ */ createElement("i", null, element);
27
+ }
28
+ if ("isBold" in leaf && leaf.isBold === true) {
29
+ element = /* @__PURE__ */ createElement("b", null, element);
30
+ }
31
+ return /* @__PURE__ */ createElement(Fragment, null, element);
32
+ }
33
+ export { RenderLeafFallback };
34
+ //# sourceMappingURL=RenderLeafFallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RenderLeafFallback.js","sources":["../../../../src/components/RichTextRenderer/RenderLeafFallback.tsx"],"sourcesContent":["import { Fragment, ReactNode } from 'react'\nimport type { BuiltinLeaves } from './BuiltinLeaves'\n\nexport interface RenderLeafFallbackProps {\n\tleaf: BuiltinLeaves\n}\n\nfunction jsxN2br(text: string): ReactNode {\n\tconst lines = text.split('\\n')\n\tif (lines.length <= 1) {\n\t\treturn text\n\t}\n\treturn lines.map((line, i) => (\n\t\t<Fragment key={i}>\n\t\t\t{!!i && <br />}\n\t\t\t{line}\n\t\t</Fragment>\n\t))\n}\n\nexport function RenderLeafFallback({ leaf }: RenderLeafFallbackProps) {\n\tlet element = jsxN2br(leaf.text)\n\n\tif ('isCode' in leaf && leaf.isCode === true) {\n\t\telement = <code>{element}</code>\n\t}\n\tif ('isStruckThrough' in leaf && leaf.isStruckThrough === true) {\n\t\telement = <s>{element}</s>\n\t}\n\tif ('isHighlighted' in leaf && leaf.isHighlighted === true) {\n\t\telement = <em>{element}</em>\n\t}\n\tif ('isUnderlined' in leaf && leaf.isUnderlined === true) {\n\t\telement = <u>{element}</u>\n\t}\n\tif ('isItalic' in leaf && leaf.isItalic === true) {\n\t\telement = <i>{element}</i>\n\t}\n\tif ('isBold' in leaf && leaf.isBold === true) {\n\t\telement = <b>{element}</b>\n\t}\n\treturn <>{element}</>\n}\n"],"names":[],"mappings":";AAOA,iBAAiB,MAAyB;QACnC,QAAQ,KAAK,MAAM;MACrB,MAAM,UAAU,GAAG;WACf;AAAA;SAED,MAAM,IAAI,CAAC,MAAM,oCACtB,UAAD;AAAA,IAAU,KAAK;AAAA,KACb,CAAC,CAAC,mCAAM,MAAD,OACP;AAAA;4BAK+B,EAAE,QAAiC;MACjE,UAAU,QAAQ,KAAK;MAEvB,YAAY,QAAQ,KAAK,WAAW,MAAM;4CAClC,QAAD,MAAO;AAAA;MAEd,qBAAqB,QAAQ,KAAK,oBAAoB,MAAM;4CACpD,KAAD,MAAI;AAAA;MAEX,mBAAmB,QAAQ,KAAK,kBAAkB,MAAM;4CAChD,MAAD,MAAK;AAAA;MAEZ,kBAAkB,QAAQ,KAAK,iBAAiB,MAAM;4CAC9C,KAAD,MAAI;AAAA;MAEX,cAAc,QAAQ,KAAK,aAAa,MAAM;4CACtC,KAAD,MAAI;AAAA;MAEX,YAAY,QAAQ,KAAK,WAAW,MAAM;4CAClC,KAAD,MAAI;AAAA;uDAEL;AAAA;;"}
@@ -0,0 +1,12 @@
1
+ import { createContext, useContext } from "react";
2
+ const RichTextRenderMetadataContext = createContext({
3
+ formatVersion: 0,
4
+ referencesField: void 0,
5
+ referenceDiscriminationField: void 0,
6
+ referenceRenderers: {},
7
+ references: void 0
8
+ });
9
+ RichTextRenderMetadataContext.displayName = "RichTextRenderMetadataContext";
10
+ const useRichTextRenderMetadata = () => useContext(RichTextRenderMetadataContext);
11
+ export { RichTextRenderMetadataContext, useRichTextRenderMetadata };
12
+ //# sourceMappingURL=RichTextRenderMetadataContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichTextRenderMetadataContext.js","sources":["../../../../src/components/RichTextRenderer/RichTextRenderMetadataContext.ts"],"sourcesContent":["import { createContext, useContext } from 'react'\nimport type { RichTextElement } from './RichTextElement'\nimport type { RichTextLeaf } from './RichTextLeaf'\nimport type { RichTextReference } from './RichTextReference'\nimport type { RichTextRenderMetadata } from './RichTextRenderMetadata'\n\nexport const RichTextRenderMetadataContext = createContext<RichTextRenderMetadata<any, any, any>>({\n\tformatVersion: 0,\n\treferencesField: undefined,\n\treferenceDiscriminationField: undefined,\n\treferenceRenderers: {},\n\treferences: undefined,\n})\nRichTextRenderMetadataContext.displayName = 'RichTextRenderMetadataContext'\n\nexport const useRichTextRenderMetadata = <\n\tCustomElements extends RichTextElement = never,\n\tCustomLeaves extends RichTextLeaf = never,\n\tReference extends RichTextReference = RichTextReference,\n>() => useContext(RichTextRenderMetadataContext) as RichTextRenderMetadata<CustomElements, CustomLeaves, Reference>\n"],"names":[],"mappings":";MAMa,gCAAgC,cAAqD;AAAA,EACjG,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,8BAA8B;AAAA,EAC9B,oBAAoB;AAAA,EACpB,YAAY;AAAA;AAEb,8BAA8B,cAAc;MAE/B,4BAA4B,MAIlC,WAAW;;"}
@@ -0,0 +1,89 @@
1
+ import { memo, useMemo, createElement, Fragment } from "react";
2
+ import { defaultDeserialize } from "./defaultDeserialize.js";
3
+ import { renderChildren } from "./renderChildren.js";
4
+ import { RichTextRendererError } from "./RichTextRendererError.js";
5
+ import { RichTextRenderMetadataContext } from "./RichTextRenderMetadataContext.js";
6
+ const RichTextRenderer = memo(function RichTextRenderer2({
7
+ deserialize = defaultDeserialize,
8
+ renderElement,
9
+ renderLeaf,
10
+ attributeNamePrefix,
11
+ ...sourceProps
12
+ }) {
13
+ const normalizedSource = useMemo(() => {
14
+ if ("source" in sourceProps && !("blocks" in sourceProps)) {
15
+ return [
16
+ {
17
+ content: sourceProps.source ? deserialize(sourceProps.source) : {
18
+ formatVersion: 0,
19
+ children: []
20
+ },
21
+ id: void 0,
22
+ referencesField: void 0,
23
+ referenceDiscriminationField: void 0,
24
+ referenceRenderers: {},
25
+ references: void 0
26
+ }
27
+ ];
28
+ }
29
+ if ("blocks" in sourceProps) {
30
+ const sourceField = sourceProps.sourceField ?? "source";
31
+ const referencesField = sourceProps.referencesField ?? "references";
32
+ const referenceDiscriminationField = sourceProps.referenceDiscriminationField ?? "type";
33
+ return sourceProps.blocks.map((block) => {
34
+ if (!(sourceField in block)) {
35
+ throw new RichTextRendererError(`Found a block without a '${sourceField}' field. ` + (sourceProps.sourceField === void 0 ? `The 'sourceField' prop has not been supplied, and so '${sourceField}' was used as a default.` : `That is what the 'sourceField' prop has been set to, and so either this is a typo, or the data supplied is invalid.`));
36
+ }
37
+ const source = block[sourceField];
38
+ if (typeof source !== "string") {
39
+ throw new RichTextRendererError(`Found a block whose source is not a string.`);
40
+ }
41
+ if (sourceProps.referencesField !== void 0 && !(referencesField in block)) {
42
+ throw new RichTextRendererError(`The 'referencesField' prop is set to '${referencesField}' but a block without such field has been encountered. Unless this is just a typo, if you do not wish to use references, avoid supplying the 'referencesField' prop.`);
43
+ }
44
+ const references = block[referencesField];
45
+ let normalizedReferences = void 0;
46
+ if (references) {
47
+ if (typeof Object(references)[Symbol.iterator] !== "function") {
48
+ throw new RichTextRendererError(`The set of references must be an iterable!`);
49
+ }
50
+ normalizedReferences = new Map();
51
+ for (const reference of references) {
52
+ if (!("id" in reference)) {
53
+ throw new RichTextRendererError(`Found a reference without an id field.`);
54
+ }
55
+ if (!(referenceDiscriminationField in reference)) {
56
+ throw new RichTextRendererError(`Found a reference without a '${referenceDiscriminationField}' field. ` + (sourceProps.referenceDiscriminationField === void 0 ? `The 'referenceDiscriminationField' prop has not been supplied, and so '${referenceDiscriminationField}' was used as a default.` : `That is what the 'referenceDiscriminationField' prop has been set to, and so either this is a typo, or the data supplied is invalid.`));
57
+ }
58
+ normalizedReferences.set(reference.id, reference);
59
+ }
60
+ }
61
+ return {
62
+ id: typeof block.id === "string" ? block.id : void 0,
63
+ content: deserialize(source),
64
+ referenceDiscriminationField,
65
+ referenceRenderers: sourceProps.referenceRenderers ?? {},
66
+ referencesField,
67
+ references: normalizedReferences
68
+ };
69
+ });
70
+ }
71
+ throw new RichTextRendererError(`RichTextRenderer: invalid data supplied.`);
72
+ }, [deserialize, sourceProps]);
73
+ return /* @__PURE__ */ createElement(Fragment, null, normalizedSource.map((block, i) => /* @__PURE__ */ createElement(RichTextRenderMetadataContext.Provider, {
74
+ key: block.id ?? i,
75
+ value: {
76
+ formatVersion: block.content.formatVersion,
77
+ referenceRenderers: block.referenceRenderers,
78
+ referencesField: block.referencesField,
79
+ referenceDiscriminationField: block.referenceDiscriminationField,
80
+ references: block.references
81
+ }
82
+ }, renderChildren(block.content.children, {
83
+ renderLeaf,
84
+ renderElement,
85
+ attributeNamePrefix
86
+ }))));
87
+ });
88
+ export { RichTextRenderer };
89
+ //# sourceMappingURL=RichTextRenderer.js.map