@payloadcms/richtext-lexical 4.0.0-internal.af6aad0 → 4.0.0-internal.b8a92d2

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 (152) hide show
  1. package/dist/exports/client/{Field-F22V5L4V.js → Field-QKAL7KMC.js} +1 -1
  2. package/dist/exports/client/Field-QKAL7KMC.js.map +7 -0
  3. package/dist/exports/client/bundled.css +1 -1
  4. package/dist/exports/client/index.js +21 -21
  5. package/dist/exports/client/index.js.map +4 -4
  6. package/dist/features/converters/lexicalToHtml/async/converters/heading.js +1 -1
  7. package/dist/features/converters/lexicalToHtml/async/converters/heading.js.map +1 -1
  8. package/dist/features/converters/lexicalToHtml/async/converters/list.d.ts.map +1 -1
  9. package/dist/features/converters/lexicalToHtml/async/converters/list.js +4 -3
  10. package/dist/features/converters/lexicalToHtml/async/converters/list.js.map +1 -1
  11. package/dist/features/converters/lexicalToHtml/shared/findConverterForNode.d.ts.map +1 -1
  12. package/dist/features/converters/lexicalToHtml/shared/findConverterForNode.js +3 -2
  13. package/dist/features/converters/lexicalToHtml/shared/findConverterForNode.js.map +1 -1
  14. package/dist/features/converters/lexicalToHtml/sync/converters/heading.js +1 -1
  15. package/dist/features/converters/lexicalToHtml/sync/converters/heading.js.map +1 -1
  16. package/dist/features/converters/lexicalToHtml/sync/converters/list.d.ts.map +1 -1
  17. package/dist/features/converters/lexicalToHtml/sync/converters/list.js +4 -3
  18. package/dist/features/converters/lexicalToHtml/sync/converters/list.js.map +1 -1
  19. package/dist/features/converters/lexicalToJSX/converter/converters/heading.d.ts.map +1 -1
  20. package/dist/features/converters/lexicalToJSX/converter/converters/heading.js +2 -1
  21. package/dist/features/converters/lexicalToJSX/converter/converters/heading.js.map +1 -1
  22. package/dist/features/converters/lexicalToJSX/converter/converters/list.d.ts.map +1 -1
  23. package/dist/features/converters/lexicalToJSX/converter/converters/list.js +2 -1
  24. package/dist/features/converters/lexicalToJSX/converter/converters/list.js.map +1 -1
  25. package/dist/features/heading/constants.d.ts +2 -0
  26. package/dist/features/heading/constants.d.ts.map +1 -0
  27. package/dist/features/heading/constants.js +2 -0
  28. package/dist/features/heading/constants.js.map +1 -0
  29. package/dist/features/heading/server/index.d.ts.map +1 -1
  30. package/dist/features/heading/server/index.js +5 -1
  31. package/dist/features/heading/server/index.js.map +1 -1
  32. package/dist/features/heading/server/validate.d.ts +6 -0
  33. package/dist/features/heading/server/validate.d.ts.map +1 -0
  34. package/dist/features/heading/server/validate.js +15 -0
  35. package/dist/features/heading/server/validate.js.map +1 -0
  36. package/dist/features/lists/checklist/server/index.d.ts.map +1 -1
  37. package/dist/features/lists/checklist/server/index.js +5 -2
  38. package/dist/features/lists/checklist/server/index.js.map +1 -1
  39. package/dist/features/lists/orderedList/server/index.d.ts.map +1 -1
  40. package/dist/features/lists/orderedList/server/index.js +5 -2
  41. package/dist/features/lists/orderedList/server/index.js.map +1 -1
  42. package/dist/features/lists/shared/constants.d.ts +2 -0
  43. package/dist/features/lists/shared/constants.d.ts.map +1 -0
  44. package/dist/features/lists/shared/constants.js +2 -0
  45. package/dist/features/lists/shared/constants.js.map +1 -0
  46. package/dist/features/lists/shared/validate.d.ts +5 -0
  47. package/dist/features/lists/shared/validate.d.ts.map +1 -0
  48. package/dist/features/lists/shared/validate.js +15 -0
  49. package/dist/features/lists/shared/validate.js.map +1 -0
  50. package/dist/features/lists/unorderedList/server/index.d.ts.map +1 -1
  51. package/dist/features/lists/unorderedList/server/index.js +5 -2
  52. package/dist/features/lists/unorderedList/server/index.js.map +1 -1
  53. package/dist/features/relationship/client/index.d.ts +2 -2
  54. package/dist/features/relationship/client/index.d.ts.map +1 -1
  55. package/dist/features/relationship/client/index.js.map +1 -1
  56. package/dist/features/relationship/client/plugins/index.d.ts +2 -2
  57. package/dist/features/relationship/client/plugins/index.d.ts.map +1 -1
  58. package/dist/features/relationship/client/plugins/index.js +27 -31
  59. package/dist/features/relationship/client/plugins/index.js.map +1 -1
  60. package/dist/features/relationship/client/utils/useEnabledRelationships.d.ts +2 -4
  61. package/dist/features/relationship/client/utils/useEnabledRelationships.d.ts.map +1 -1
  62. package/dist/features/relationship/client/utils/useEnabledRelationships.js +53 -20
  63. package/dist/features/relationship/client/utils/useEnabledRelationships.js.map +1 -1
  64. package/dist/features/relationship/server/graphQLPopulationPromise.d.ts +2 -2
  65. package/dist/features/relationship/server/graphQLPopulationPromise.d.ts.map +1 -1
  66. package/dist/features/relationship/server/graphQLPopulationPromise.js +2 -2
  67. package/dist/features/relationship/server/graphQLPopulationPromise.js.map +1 -1
  68. package/dist/features/relationship/server/index.d.ts +8 -1
  69. package/dist/features/relationship/server/index.d.ts.map +1 -1
  70. package/dist/features/relationship/server/index.js +28 -11
  71. package/dist/features/relationship/server/index.js.map +1 -1
  72. package/dist/features/relationship/server/schema.d.ts +2 -2
  73. package/dist/features/relationship/server/schema.d.ts.map +1 -1
  74. package/dist/features/relationship/server/schema.js +5 -10
  75. package/dist/features/relationship/server/schema.js.map +1 -1
  76. package/dist/features/relationship/shared/filterEnabledRelationshipCollections.d.ts +1 -6
  77. package/dist/features/relationship/shared/filterEnabledRelationshipCollections.d.ts.map +1 -1
  78. package/dist/features/relationship/shared/filterEnabledRelationshipCollections.js +1 -5
  79. package/dist/features/relationship/shared/filterEnabledRelationshipCollections.js.map +1 -1
  80. package/dist/features/table/client/plugins/TableActionMenuPlugin/computeSelectionCount.d.ts +8 -0
  81. package/dist/features/table/client/plugins/TableActionMenuPlugin/computeSelectionCount.d.ts.map +1 -0
  82. package/dist/features/table/client/plugins/TableActionMenuPlugin/computeSelectionCount.js +19 -0
  83. package/dist/features/table/client/plugins/TableActionMenuPlugin/computeSelectionCount.js.map +1 -0
  84. package/dist/features/table/client/plugins/TableActionMenuPlugin/index.d.ts.map +1 -1
  85. package/dist/features/table/client/plugins/TableActionMenuPlugin/index.js +16 -43
  86. package/dist/features/table/client/plugins/TableActionMenuPlugin/index.js.map +1 -1
  87. package/dist/features/toolbars/shared/ToolbarDropdown/index.css +12 -11
  88. package/dist/features/upload/client/index.d.ts +3 -2
  89. package/dist/features/upload/client/index.d.ts.map +1 -1
  90. package/dist/features/upload/client/index.js.map +1 -1
  91. package/dist/features/upload/client/plugin/index.d.ts.map +1 -1
  92. package/dist/features/upload/client/plugin/index.js +47 -52
  93. package/dist/features/upload/client/plugin/index.js.map +1 -1
  94. package/dist/features/upload/server/graphQLPopulationPromise.d.ts +2 -2
  95. package/dist/features/upload/server/graphQLPopulationPromise.d.ts.map +1 -1
  96. package/dist/features/upload/server/graphQLPopulationPromise.js +1 -1
  97. package/dist/features/upload/server/graphQLPopulationPromise.js.map +1 -1
  98. package/dist/features/upload/server/index.d.ts +6 -2
  99. package/dist/features/upload/server/index.d.ts.map +1 -1
  100. package/dist/features/upload/server/index.js +18 -14
  101. package/dist/features/upload/server/index.js.map +1 -1
  102. package/dist/features/upload/server/schema.d.ts +2 -2
  103. package/dist/features/upload/server/schema.d.ts.map +1 -1
  104. package/dist/features/upload/server/schema.js +4 -8
  105. package/dist/features/upload/server/schema.js.map +1 -1
  106. package/dist/features/upload/server/validate.d.ts +2 -2
  107. package/dist/features/upload/server/validate.d.ts.map +1 -1
  108. package/dist/features/upload/server/validate.js +3 -0
  109. package/dist/features/upload/server/validate.js.map +1 -1
  110. package/dist/field/Diff/converters/listitem/index.d.ts.map +1 -1
  111. package/dist/field/Diff/converters/listitem/index.js +2 -1
  112. package/dist/field/Diff/converters/listitem/index.js.map +1 -1
  113. package/dist/field/Diff/index.d.ts.map +1 -1
  114. package/dist/field/Diff/index.js +1 -0
  115. package/dist/field/Diff/index.js.map +1 -1
  116. package/dist/field/RenderLexical/index.d.ts +3 -1
  117. package/dist/field/RenderLexical/index.d.ts.map +1 -1
  118. package/dist/field/RenderLexical/index.js +23 -23
  119. package/dist/field/RenderLexical/index.js.map +1 -1
  120. package/dist/field/bundled.css +1 -1
  121. package/dist/index.d.ts +1 -1
  122. package/dist/index.js +1 -1
  123. package/dist/index.js.map +1 -1
  124. package/dist/lexical/LexicalEditor.js.map +1 -1
  125. package/dist/lexical/ui/icons/H3/index.d.ts.map +1 -1
  126. package/dist/lexical/ui/icons/H3/index.js +13 -6
  127. package/dist/lexical/ui/icons/H3/index.js.map +1 -1
  128. package/dist/lexical/ui/icons/H4/index.d.ts.map +1 -1
  129. package/dist/lexical/ui/icons/H4/index.js +13 -6
  130. package/dist/lexical/ui/icons/H4/index.js.map +1 -1
  131. package/dist/lexical/ui/icons/H5/index.d.ts.map +1 -1
  132. package/dist/lexical/ui/icons/H5/index.js +13 -6
  133. package/dist/lexical/ui/icons/H5/index.js.map +1 -1
  134. package/dist/lexical/ui/icons/H6/index.d.ts.map +1 -1
  135. package/dist/lexical/ui/icons/H6/index.js +13 -6
  136. package/dist/lexical/ui/icons/H6/index.js.map +1 -1
  137. package/package.json +21 -21
  138. package/dist/dependencyChecker.spec.js +0 -16
  139. package/dist/dependencyChecker.spec.js.map +0 -1
  140. package/dist/exports/client/Field-F22V5L4V.js.map +0 -7
  141. package/dist/features/converters/lexicalToPlaintext/convertLexicalToPlaintext.spec.js +0 -180
  142. package/dist/features/converters/lexicalToPlaintext/convertLexicalToPlaintext.spec.js.map +0 -1
  143. package/dist/features/link/markdownTransformer.spec.js +0 -195
  144. package/dist/features/link/markdownTransformer.spec.js.map +0 -1
  145. package/dist/features/toolbars/fixed/client/Toolbar/horizontalWheelScroll.spec.js +0 -65
  146. package/dist/features/toolbars/fixed/client/Toolbar/horizontalWheelScroll.spec.js.map +0 -1
  147. package/dist/lexical/utils/markdown/convertFromMarkdownString.spec.js +0 -88
  148. package/dist/lexical/utils/markdown/convertFromMarkdownString.spec.js.map +0 -1
  149. package/dist/lexical/utils/url.spec.js +0 -114
  150. package/dist/lexical/utils/url.spec.js.map +0 -1
  151. package/dist/utilities/jsx/jsx.spec.js +0 -178
  152. package/dist/utilities/jsx/jsx.spec.js.map +0 -1
@@ -31,29 +31,24 @@ function getDragSelection(event) {
31
31
  }
32
32
  export const INSERT_UPLOAD_COMMAND = createCommand('INSERT_UPLOAD_COMMAND');
33
33
  export const UploadPlugin = t0 => {
34
- const $ = _c(21);
34
+ const $ = _c(20);
35
35
  const {
36
36
  clientProps
37
37
  } = t0;
38
38
  const [editor] = useLexicalComposerContext();
39
- const t1 = clientProps?.disabledCollections;
40
- const t2 = clientProps?.enabledCollections;
41
- let t3;
42
- if ($[0] !== t1 || $[1] !== t2) {
43
- t3 = {
44
- collectionSlugsBlacklist: t1,
45
- collectionSlugsWhitelist: t2,
46
- uploads: true
39
+ let t1;
40
+ if ($[0] !== clientProps.enabledCollectionSlugs) {
41
+ t1 = {
42
+ enabledCollectionSlugs: clientProps.enabledCollectionSlugs
47
43
  };
48
- $[0] = t1;
49
- $[1] = t2;
50
- $[2] = t3;
44
+ $[0] = clientProps.enabledCollectionSlugs;
45
+ $[1] = t1;
51
46
  } else {
52
- t3 = $[2];
47
+ t1 = $[1];
53
48
  }
54
49
  const {
55
50
  enabledCollectionSlugs
56
- } = useEnabledRelationships(t3);
51
+ } = useEnabledRelationships(t1);
57
52
  const {
58
53
  modalSlug: bulkUploadModalSlug,
59
54
  setCollectionSlug,
@@ -66,12 +61,12 @@ export const UploadPlugin = t0 => {
66
61
  isModalOpen,
67
62
  openModal
68
63
  } = useModal();
69
- let t4;
70
- if ($[3] !== bulkUploadModalSlug || $[4] !== editor || $[5] !== enabledCollectionSlugs || $[6] !== isModalOpen || $[7] !== openModal || $[8] !== setCollectionSlug || $[9] !== setInitialForms || $[10] !== setOnCancel || $[11] !== setOnSuccess || $[12] !== setSelectableCollections) {
71
- t4 = t5 => {
64
+ let t2;
65
+ if ($[2] !== bulkUploadModalSlug || $[3] !== editor || $[4] !== enabledCollectionSlugs || $[5] !== isModalOpen || $[6] !== openModal || $[7] !== setCollectionSlug || $[8] !== setInitialForms || $[9] !== setOnCancel || $[10] !== setOnSuccess || $[11] !== setSelectableCollections) {
66
+ t2 = t3 => {
72
67
  const {
73
68
  files
74
- } = t5;
69
+ } = t3;
75
70
  if (files?.length === 0) {
76
71
  return;
77
72
  }
@@ -112,24 +107,24 @@ export const UploadPlugin = t0 => {
112
107
  openModal(bulkUploadModalSlug);
113
108
  }
114
109
  };
115
- $[3] = bulkUploadModalSlug;
116
- $[4] = editor;
117
- $[5] = enabledCollectionSlugs;
118
- $[6] = isModalOpen;
119
- $[7] = openModal;
120
- $[8] = setCollectionSlug;
121
- $[9] = setInitialForms;
122
- $[10] = setOnCancel;
123
- $[11] = setOnSuccess;
124
- $[12] = setSelectableCollections;
125
- $[13] = t4;
110
+ $[2] = bulkUploadModalSlug;
111
+ $[3] = editor;
112
+ $[4] = enabledCollectionSlugs;
113
+ $[5] = isModalOpen;
114
+ $[6] = openModal;
115
+ $[7] = setCollectionSlug;
116
+ $[8] = setInitialForms;
117
+ $[9] = setOnCancel;
118
+ $[10] = setOnSuccess;
119
+ $[11] = setSelectableCollections;
120
+ $[12] = t2;
126
121
  } else {
127
- t4 = $[13];
122
+ t2 = $[12];
128
123
  }
129
- const openBulkUpload = useEffectEvent(t4);
130
- let t5;
131
- if ($[14] !== editor || $[15] !== openBulkUpload) {
132
- t5 = () => {
124
+ const openBulkUpload = useEffectEvent(t2);
125
+ let t3;
126
+ if ($[13] !== editor || $[14] !== openBulkUpload) {
127
+ t3 = () => {
133
128
  if (!editor.hasNodes([UploadNode])) {
134
129
  throw new Error("UploadPlugin: UploadNode not registered on editor");
135
130
  }
@@ -311,32 +306,32 @@ export const UploadPlugin = t0 => {
311
306
  return false;
312
307
  }, COMMAND_PRIORITY_LOW));
313
308
  };
314
- $[14] = editor;
315
- $[15] = openBulkUpload;
316
- $[16] = t5;
309
+ $[13] = editor;
310
+ $[14] = openBulkUpload;
311
+ $[15] = t3;
317
312
  } else {
318
- t5 = $[16];
313
+ t3 = $[15];
319
314
  }
320
- let t6;
321
- if ($[17] !== editor) {
322
- t6 = [editor];
323
- $[17] = editor;
324
- $[18] = t6;
315
+ let t4;
316
+ if ($[16] !== editor) {
317
+ t4 = [editor];
318
+ $[16] = editor;
319
+ $[17] = t4;
325
320
  } else {
326
- t6 = $[18];
321
+ t4 = $[17];
327
322
  }
328
- useEffect(t5, t6);
329
- let t7;
330
- if ($[19] !== enabledCollectionSlugs) {
331
- t7 = _jsx(UploadDrawer, {
323
+ useEffect(t3, t4);
324
+ let t5;
325
+ if ($[18] !== enabledCollectionSlugs) {
326
+ t5 = _jsx(UploadDrawer, {
332
327
  enabledCollectionSlugs
333
328
  });
334
- $[19] = enabledCollectionSlugs;
335
- $[20] = t7;
329
+ $[18] = enabledCollectionSlugs;
330
+ $[19] = t5;
336
331
  } else {
337
- t7 = $[20];
332
+ t5 = $[19];
338
333
  }
339
- return t7;
334
+ return t5;
340
335
  };
341
336
  function _temp(file) {
342
337
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","$dfsIterator","$insertNodeToNearestRoot","mergeRegister","useBulkUpload","useEffectEvent","useModal","ObjectID","$createRangeSelection","$getPreviousSelection","$getSelection","$isParagraphNode","$isRangeSelection","$setSelection","COMMAND_PRIORITY_EDITOR","COMMAND_PRIORITY_LOW","createCommand","DROP_COMMAND","getDOMSelectionFromTarget","isHTMLElement","PASTE_COMMAND","React","useEffect","useEnabledRelationships","UploadDrawer","$createUploadNode","$isUploadNode","UploadNode","canDropImage","event","target","closest","parentElement","getDragSelection","range","domSelection","document","caretRangeFromPoint","clientX","clientY","rangeParent","collapse","rangeOffset","getRangeAt","Error","INSERT_UPLOAD_COMMAND","UploadPlugin","t0","$","clientProps","editor","t1","disabledCollections","t2","enabledCollections","t3","collectionSlugsBlacklist","collectionSlugsWhitelist","uploads","enabledCollectionSlugs","modalSlug","bulkUploadModalSlug","setCollectionSlug","setInitialForms","setOnCancel","setOnSuccess","setSelectableCollections","isModalOpen","openModal","t4","t5","files","length","initialForms","map","_temp","update","_temp2","newDocs","newDocsMap","Map","_temp3","dfsNode_0","node_0","dfsNode","node","nodeData_0","getData","nodeData","pending","newDoc","get","formID","replace","data","id","default","toHexString","fields","relationTo","collectionSlug","value","doc","openBulkUpload","hasNodes","registerNodeTransform","node_1","nodeData_1","upload","transformedImage","src","startsWith","mimeMatch","match","mimeType","base64Data","byteCharacters","atob","byteNumbers","Array","i","charCodeAt","byteArray","Uint8Array","file_0","File","split","type","file","res","fetch","blob","inferredFileName","pop","file_1","registerCommand","payload","selection","uploadNode","focus","focusNode","getNode","__first","remove","ClipboardEvent","clipboardData","types","includes","files_0","from","forEach","file_2","push","alt","selection_0","file_3","pendingUploadNode","URL","createObjectURL","focus_0","focusNode_0","event_0","DragEvent","dt","dataTransfer","files_1","file_4","preventDefault","stopPropagation","selection_1","undefined","applyDOMRange","file_5","pendingUploadNode_0","focus_1","focusNode_1","t6","t7","_jsx"],"sources":["../../../../../src/features/upload/client/plugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalCommand } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $dfsIterator, $insertNodeToNearestRoot, mergeRegister } from '@lexical/utils'\nimport { useBulkUpload, useEffectEvent, useModal } from '@payloadcms/ui'\nimport ObjectID from 'bson-objectid'\nimport {\n $createRangeSelection,\n $getPreviousSelection,\n $getSelection,\n $isParagraphNode,\n $isRangeSelection,\n $setSelection,\n COMMAND_PRIORITY_EDITOR,\n COMMAND_PRIORITY_LOW,\n createCommand,\n DROP_COMMAND,\n getDOMSelectionFromTarget,\n isHTMLElement,\n PASTE_COMMAND,\n} from 'lexical'\nimport React, { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../typesClient.js'\nimport type { Internal_UploadData, UploadData } from '../../server/schema.js'\nimport type { UploadFeaturePropsClient } from '../index.js'\n\nimport { useEnabledRelationships } from '../../../relationship/client/utils/useEnabledRelationships.js'\nimport { UploadDrawer } from '../drawer/index.js'\nimport { $createUploadNode, $isUploadNode, UploadNode } from '../nodes/UploadNode.js'\n\nexport type InsertUploadPayload = Readonly<Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>>\n\ndeclare global {\n interface DragEvent {\n rangeOffset?: number\n rangeParent?: Node\n }\n}\n\nfunction canDropImage(event: DragEvent): boolean {\n const target = event.target\n return !!(\n isHTMLElement(target) &&\n !target.closest('code, span.editor-image') &&\n isHTMLElement(target.parentElement) &&\n target.parentElement.closest('div.ContentEditable__root')\n )\n}\n\nfunction getDragSelection(event: DragEvent): null | Range | undefined {\n // Source: https://github.com/AlessioGr/lexical/blob/main/packages/lexical-playground/src/plugins/ImagesPlugin/index.tsx\n let range\n const domSelection = getDOMSelectionFromTarget(event.target)\n if (document.caretRangeFromPoint) {\n range = document.caretRangeFromPoint(event.clientX, event.clientY)\n } else if (event.rangeParent && domSelection !== null) {\n domSelection.collapse(event.rangeParent, event.rangeOffset || 0)\n range = domSelection.getRangeAt(0)\n } else {\n throw Error(`Cannot get the selection when dragging`)\n }\n\n return range\n}\n\nexport const INSERT_UPLOAD_COMMAND: LexicalCommand<InsertUploadPayload> =\n createCommand('INSERT_UPLOAD_COMMAND')\n\ntype FileToUpload = {\n alt?: string\n file: File\n /**\n * Bulk Upload Form ID that should be created, which can then be matched\n * against the node formID if the upload is successful\n */\n formID: string\n}\n\nexport const UploadPlugin: PluginComponent<UploadFeaturePropsClient> = ({ clientProps }) => {\n const [editor] = useLexicalComposerContext()\n\n const { enabledCollectionSlugs } = useEnabledRelationships({\n collectionSlugsBlacklist: clientProps?.disabledCollections,\n collectionSlugsWhitelist: clientProps?.enabledCollections,\n uploads: true,\n })\n\n const {\n modalSlug: bulkUploadModalSlug,\n setCollectionSlug,\n setInitialForms,\n setOnCancel,\n setOnSuccess,\n setSelectableCollections,\n } = useBulkUpload()\n\n const { isModalOpen, openModal } = useModal()\n\n const openBulkUpload = useEffectEvent(({ files }: { files: FileToUpload[] }) => {\n if (files?.length === 0) {\n return\n }\n\n setInitialForms((initialForms) => [\n ...(initialForms ?? []),\n ...files.map((file) => ({\n file: file.file,\n formID: file.formID,\n })),\n ])\n\n if (!isModalOpen(bulkUploadModalSlug)) {\n if (!enabledCollectionSlugs.length || !enabledCollectionSlugs[0]) {\n return\n }\n\n setCollectionSlug(enabledCollectionSlugs[0])\n setSelectableCollections(enabledCollectionSlugs)\n\n setOnCancel(() => {\n // Remove all the pending upload nodes that were added but not uploaded\n editor.update(() => {\n for (const dfsNode of $dfsIterator()) {\n const node = dfsNode.node\n\n if ($isUploadNode(node)) {\n const nodeData = node.getData()\n if ((nodeData as Internal_UploadData)?.pending) {\n node.remove()\n }\n }\n }\n })\n })\n\n setOnSuccess((newDocs) => {\n const newDocsMap = new Map(newDocs.map((doc) => [doc.formID, doc]))\n editor.update(() => {\n for (const dfsNode of $dfsIterator()) {\n const node = dfsNode.node\n if ($isUploadNode(node)) {\n const nodeData: Internal_UploadData = node.getData()\n\n if (nodeData?.pending) {\n const newDoc = newDocsMap.get(nodeData.pending?.formID)\n if (newDoc) {\n node.replace(\n $createUploadNode({\n data: {\n id: new ObjectID.default().toHexString(),\n fields: {},\n relationTo: newDoc.collectionSlug,\n value: newDoc.doc.id,\n } as UploadData,\n }),\n )\n }\n }\n }\n }\n })\n })\n\n openModal(bulkUploadModalSlug)\n }\n })\n\n useEffect(() => {\n if (!editor.hasNodes([UploadNode])) {\n throw new Error('UploadPlugin: UploadNode not registered on editor')\n }\n\n return mergeRegister(\n /**\n * Handle auto-uploading files if you copy & paste an image dom element from the clipboard\n */\n editor.registerNodeTransform(UploadNode, (node) => {\n const nodeData: Internal_UploadData = node.getData()\n if (!nodeData?.pending) {\n return\n }\n\n async function upload() {\n let transformedImage: FileToUpload | null = null\n\n const src = nodeData?.pending?.src\n const formID = nodeData?.pending?.formID as string\n\n if (src?.startsWith('data:')) {\n // It's a base64-encoded image\n const mimeMatch = src.match(/data:(image\\/[a-zA-Z]+);base64,/)\n const mimeType = mimeMatch ? mimeMatch[1] : 'image/png' // Default to PNG if MIME type not found\n const base64Data = src.replace(/^data:image\\/[a-zA-Z]+;base64,/, '')\n const byteCharacters = atob(base64Data)\n const byteNumbers = new Array(byteCharacters.length)\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i)\n }\n const byteArray = new Uint8Array(byteNumbers)\n const file = new File([byteArray], 'pasted-image.' + mimeType?.split('/', 2)[1], {\n type: mimeType,\n })\n transformedImage = { alt: undefined, file, formID }\n } else if (src?.startsWith('http') || src?.startsWith('https')) {\n // It's an image URL\n const res = await fetch(src)\n const blob = await res.blob()\n const inferredFileName =\n src.split('/').pop() || 'pasted-image' + blob.type.split('/', 2)[1]\n const file = new File([blob], inferredFileName, {\n type: blob.type,\n })\n\n transformedImage = { alt: undefined, file, formID }\n }\n\n if (!transformedImage) {\n return\n }\n\n openBulkUpload({ files: [transformedImage] })\n }\n void upload()\n }),\n editor.registerCommand<InsertUploadPayload>(\n INSERT_UPLOAD_COMMAND,\n (payload: InsertUploadPayload) => {\n editor.update(() => {\n const selection = $getSelection() || $getPreviousSelection()\n\n if ($isRangeSelection(selection)) {\n const uploadNode = $createUploadNode({\n data: {\n id: payload.id,\n fields: payload.fields,\n relationTo: payload.relationTo,\n value: payload.value,\n },\n })\n // we need to get the focus node before inserting the block node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert upload node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(uploadNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n })\n\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n ),\n editor.registerCommand(\n PASTE_COMMAND,\n (event) => {\n // Pending UploadNodes are automatically created when importDOM is called. However, if you paste a file from your computer\n // directly, importDOM won't be called, as it's not a HTML dom element. So we need to handle that case here.\n\n if (!(event instanceof ClipboardEvent)) {\n return false\n }\n const clipboardData = event.clipboardData\n\n if (!clipboardData?.types?.length || clipboardData?.types?.includes('text/html')) {\n // HTML is handled through importDOM => registerNodeTransform for pending UploadNode\n return false\n }\n\n const files: FileToUpload[] = []\n if (clipboardData?.files?.length) {\n Array.from(clipboardData.files).forEach((file) => {\n files.push({\n alt: '',\n file,\n formID: new ObjectID.default().toHexString(),\n })\n })\n }\n\n if (files.length) {\n // Insert a pending UploadNode for each image\n editor.update(() => {\n const selection = $getSelection() || $getPreviousSelection()\n\n if ($isRangeSelection(selection)) {\n for (const file of files) {\n const pendingUploadNode = $createUploadNode({\n data: {\n pending: {\n formID: file.formID,\n src: URL.createObjectURL(file.file),\n },\n } as Internal_UploadData,\n })\n // we need to get the focus node before inserting the upload node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert upload node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(pendingUploadNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n }\n })\n\n // Open the bulk drawer - the node transform will not open it for us, as it does not handle blob/file uploads\n openBulkUpload({ files })\n\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n // Handle drag & drop of files from the desktop into the editor\n editor.registerCommand(\n DROP_COMMAND,\n (event) => {\n if (!(event instanceof DragEvent)) {\n return false\n }\n\n const dt = event.dataTransfer\n\n if (!dt?.types?.length) {\n return false\n }\n\n const files: FileToUpload[] = []\n if (dt?.files?.length) {\n Array.from(dt.files).forEach((file) => {\n files.push({\n alt: '',\n file,\n formID: new ObjectID.default().toHexString(),\n })\n })\n }\n\n if (files.length) {\n // Prevent the default browser drop handling, which would open the file in the browser\n event.preventDefault()\n event.stopPropagation()\n\n // Insert a PendingUploadNode for each image\n editor.update(() => {\n if (canDropImage(event)) {\n const range = getDragSelection(event)\n const selection = $createRangeSelection()\n if (range !== null && range !== undefined) {\n selection.applyDOMRange(range)\n }\n $setSelection(selection)\n\n for (const file of files) {\n const pendingUploadNode = $createUploadNode({\n data: {\n pending: {\n formID: file.formID,\n src: URL.createObjectURL(file.file),\n },\n } as Internal_UploadData,\n })\n // we need to get the focus node before inserting the upload node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert upload node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(pendingUploadNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n }\n })\n\n // Open the bulk drawer - the node transform will not open it for us, as it does not handle blob/file uploads\n openBulkUpload({ files })\n\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor])\n\n return <UploadDrawer enabledCollectionSlugs={enabledCollectionSlugs} />\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["c","_c","useLexicalComposerContext","$dfsIterator","$insertNodeToNearestRoot","mergeRegister","useBulkUpload","useEffectEvent","useModal","ObjectID","$createRangeSelection","$getPreviousSelection","$getSelection","$isParagraphNode","$isRangeSelection","$setSelection","COMMAND_PRIORITY_EDITOR","COMMAND_PRIORITY_LOW","createCommand","DROP_COMMAND","getDOMSelectionFromTarget","isHTMLElement","PASTE_COMMAND","React","useEffect","useEnabledRelationships","UploadDrawer","$createUploadNode","$isUploadNode","UploadNode","canDropImage","event","target","closest","parentElement","getDragSelection","range","domSelection","document","caretRangeFromPoint","clientX","clientY","rangeParent","collapse","rangeOffset","getRangeAt","Error","INSERT_UPLOAD_COMMAND","UploadPlugin","t0","$","clientProps","editor","t1","enabledCollectionSlugs","modalSlug","bulkUploadModalSlug","setCollectionSlug","setInitialForms","setOnCancel","setOnSuccess","setSelectableCollections","isModalOpen","openModal","t2","t3","files","length","initialForms","map","_temp","update","_temp2","newDocs","newDocsMap","Map","_temp3","dfsNode_0","node_0","dfsNode","node","nodeData_0","getData","nodeData","pending","newDoc","get","formID","replace","data","id","default","toHexString","fields","relationTo","collectionSlug","value","doc","openBulkUpload","hasNodes","registerNodeTransform","node_1","nodeData_1","upload","transformedImage","src","startsWith","mimeMatch","match","mimeType","base64Data","byteCharacters","atob","byteNumbers","Array","i","charCodeAt","byteArray","Uint8Array","file_0","File","split","type","file","res","fetch","blob","inferredFileName","pop","file_1","registerCommand","payload","selection","uploadNode","focus","focusNode","getNode","__first","remove","ClipboardEvent","clipboardData","types","includes","files_0","from","forEach","file_2","push","alt","selection_0","file_3","pendingUploadNode","URL","createObjectURL","focus_0","focusNode_0","event_0","DragEvent","dt","dataTransfer","files_1","file_4","preventDefault","stopPropagation","selection_1","undefined","applyDOMRange","file_5","pendingUploadNode_0","focus_1","focusNode_1","t4","t5","_jsx"],"sources":["../../../../../src/features/upload/client/plugin/index.tsx"],"sourcesContent":["'use client'\nimport type { LexicalCommand } from 'lexical'\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext.js'\nimport { $dfsIterator, $insertNodeToNearestRoot, mergeRegister } from '@lexical/utils'\nimport { useBulkUpload, useEffectEvent, useModal } from '@payloadcms/ui'\nimport ObjectID from 'bson-objectid'\nimport {\n $createRangeSelection,\n $getPreviousSelection,\n $getSelection,\n $isParagraphNode,\n $isRangeSelection,\n $setSelection,\n COMMAND_PRIORITY_EDITOR,\n COMMAND_PRIORITY_LOW,\n createCommand,\n DROP_COMMAND,\n getDOMSelectionFromTarget,\n isHTMLElement,\n PASTE_COMMAND,\n} from 'lexical'\nimport React, { useEffect } from 'react'\n\nimport type { PluginComponent } from '../../../typesClient.js'\nimport type { Internal_UploadData, UploadData } from '../../server/schema.js'\nimport type { UploadFeaturePropsClient } from '../index.js'\n\nimport { useEnabledRelationships } from '../../../relationship/client/utils/useEnabledRelationships.js'\nimport { UploadDrawer } from '../drawer/index.js'\nimport { $createUploadNode, $isUploadNode, UploadNode } from '../nodes/UploadNode.js'\n\nexport type InsertUploadPayload = Readonly<Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>>\n\ndeclare global {\n interface DragEvent {\n rangeOffset?: number\n rangeParent?: Node\n }\n}\n\nfunction canDropImage(event: DragEvent): boolean {\n const target = event.target\n return !!(\n isHTMLElement(target) &&\n !target.closest('code, span.editor-image') &&\n isHTMLElement(target.parentElement) &&\n target.parentElement.closest('div.ContentEditable__root')\n )\n}\n\nfunction getDragSelection(event: DragEvent): null | Range | undefined {\n // Source: https://github.com/AlessioGr/lexical/blob/main/packages/lexical-playground/src/plugins/ImagesPlugin/index.tsx\n let range\n const domSelection = getDOMSelectionFromTarget(event.target)\n if (document.caretRangeFromPoint) {\n range = document.caretRangeFromPoint(event.clientX, event.clientY)\n } else if (event.rangeParent && domSelection !== null) {\n domSelection.collapse(event.rangeParent, event.rangeOffset || 0)\n range = domSelection.getRangeAt(0)\n } else {\n throw Error(`Cannot get the selection when dragging`)\n }\n\n return range\n}\n\nexport const INSERT_UPLOAD_COMMAND: LexicalCommand<InsertUploadPayload> =\n createCommand('INSERT_UPLOAD_COMMAND')\n\ntype FileToUpload = {\n alt?: string\n file: File\n /**\n * Bulk Upload Form ID that should be created, which can then be matched\n * against the node formID if the upload is successful\n */\n formID: string\n}\n\nexport const UploadPlugin: PluginComponent<UploadFeaturePropsClient> = ({ clientProps }) => {\n const [editor] = useLexicalComposerContext()\n\n const { enabledCollectionSlugs } = useEnabledRelationships({\n enabledCollectionSlugs: clientProps.enabledCollectionSlugs,\n })\n\n const {\n modalSlug: bulkUploadModalSlug,\n setCollectionSlug,\n setInitialForms,\n setOnCancel,\n setOnSuccess,\n setSelectableCollections,\n } = useBulkUpload()\n\n const { isModalOpen, openModal } = useModal()\n\n const openBulkUpload = useEffectEvent(({ files }: { files: FileToUpload[] }) => {\n if (files?.length === 0) {\n return\n }\n\n setInitialForms((initialForms) => [\n ...(initialForms ?? []),\n ...files.map((file) => ({\n file: file.file,\n formID: file.formID,\n })),\n ])\n\n if (!isModalOpen(bulkUploadModalSlug)) {\n if (!enabledCollectionSlugs.length || !enabledCollectionSlugs[0]) {\n return\n }\n\n setCollectionSlug(enabledCollectionSlugs[0])\n setSelectableCollections(enabledCollectionSlugs)\n\n setOnCancel(() => {\n // Remove all the pending upload nodes that were added but not uploaded\n editor.update(() => {\n for (const dfsNode of $dfsIterator()) {\n const node = dfsNode.node\n\n if ($isUploadNode(node)) {\n const nodeData = node.getData()\n if ((nodeData as Internal_UploadData)?.pending) {\n node.remove()\n }\n }\n }\n })\n })\n\n setOnSuccess((newDocs) => {\n const newDocsMap = new Map(newDocs.map((doc) => [doc.formID, doc]))\n editor.update(() => {\n for (const dfsNode of $dfsIterator()) {\n const node = dfsNode.node\n if ($isUploadNode(node)) {\n const nodeData: Internal_UploadData = node.getData()\n\n if (nodeData?.pending) {\n const newDoc = newDocsMap.get(nodeData.pending?.formID)\n if (newDoc) {\n node.replace(\n $createUploadNode({\n data: {\n id: new ObjectID.default().toHexString(),\n fields: {},\n relationTo: newDoc.collectionSlug,\n value: newDoc.doc.id,\n } as UploadData,\n }),\n )\n }\n }\n }\n }\n })\n })\n\n openModal(bulkUploadModalSlug)\n }\n })\n\n useEffect(() => {\n if (!editor.hasNodes([UploadNode])) {\n throw new Error('UploadPlugin: UploadNode not registered on editor')\n }\n\n return mergeRegister(\n /**\n * Handle auto-uploading files if you copy & paste an image dom element from the clipboard\n */\n editor.registerNodeTransform(UploadNode, (node) => {\n const nodeData: Internal_UploadData = node.getData()\n if (!nodeData?.pending) {\n return\n }\n\n async function upload() {\n let transformedImage: FileToUpload | null = null\n\n const src = nodeData?.pending?.src\n const formID = nodeData?.pending?.formID as string\n\n if (src?.startsWith('data:')) {\n // It's a base64-encoded image\n const mimeMatch = src.match(/data:(image\\/[a-zA-Z]+);base64,/)\n const mimeType = mimeMatch ? mimeMatch[1] : 'image/png' // Default to PNG if MIME type not found\n const base64Data = src.replace(/^data:image\\/[a-zA-Z]+;base64,/, '')\n const byteCharacters = atob(base64Data)\n const byteNumbers = new Array(byteCharacters.length)\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i)\n }\n const byteArray = new Uint8Array(byteNumbers)\n const file = new File([byteArray], 'pasted-image.' + mimeType?.split('/', 2)[1], {\n type: mimeType,\n })\n transformedImage = { alt: undefined, file, formID }\n } else if (src?.startsWith('http') || src?.startsWith('https')) {\n // It's an image URL\n const res = await fetch(src)\n const blob = await res.blob()\n const inferredFileName =\n src.split('/').pop() || 'pasted-image' + blob.type.split('/', 2)[1]\n const file = new File([blob], inferredFileName, {\n type: blob.type,\n })\n\n transformedImage = { alt: undefined, file, formID }\n }\n\n if (!transformedImage) {\n return\n }\n\n openBulkUpload({ files: [transformedImage] })\n }\n void upload()\n }),\n editor.registerCommand<InsertUploadPayload>(\n INSERT_UPLOAD_COMMAND,\n (payload: InsertUploadPayload) => {\n editor.update(() => {\n const selection = $getSelection() || $getPreviousSelection()\n\n if ($isRangeSelection(selection)) {\n const uploadNode = $createUploadNode({\n data: {\n id: payload.id,\n fields: payload.fields,\n relationTo: payload.relationTo,\n value: payload.value,\n },\n })\n // we need to get the focus node before inserting the block node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert upload node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(uploadNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n })\n\n return true\n },\n COMMAND_PRIORITY_EDITOR,\n ),\n editor.registerCommand(\n PASTE_COMMAND,\n (event) => {\n // Pending UploadNodes are automatically created when importDOM is called. However, if you paste a file from your computer\n // directly, importDOM won't be called, as it's not a HTML dom element. So we need to handle that case here.\n\n if (!(event instanceof ClipboardEvent)) {\n return false\n }\n const clipboardData = event.clipboardData\n\n if (!clipboardData?.types?.length || clipboardData?.types?.includes('text/html')) {\n // HTML is handled through importDOM => registerNodeTransform for pending UploadNode\n return false\n }\n\n const files: FileToUpload[] = []\n if (clipboardData?.files?.length) {\n Array.from(clipboardData.files).forEach((file) => {\n files.push({\n alt: '',\n file,\n formID: new ObjectID.default().toHexString(),\n })\n })\n }\n\n if (files.length) {\n // Insert a pending UploadNode for each image\n editor.update(() => {\n const selection = $getSelection() || $getPreviousSelection()\n\n if ($isRangeSelection(selection)) {\n for (const file of files) {\n const pendingUploadNode = $createUploadNode({\n data: {\n pending: {\n formID: file.formID,\n src: URL.createObjectURL(file.file),\n },\n } as Internal_UploadData,\n })\n // we need to get the focus node before inserting the upload node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert upload node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(pendingUploadNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n }\n })\n\n // Open the bulk drawer - the node transform will not open it for us, as it does not handle blob/file uploads\n openBulkUpload({ files })\n\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n // Handle drag & drop of files from the desktop into the editor\n editor.registerCommand(\n DROP_COMMAND,\n (event) => {\n if (!(event instanceof DragEvent)) {\n return false\n }\n\n const dt = event.dataTransfer\n\n if (!dt?.types?.length) {\n return false\n }\n\n const files: FileToUpload[] = []\n if (dt?.files?.length) {\n Array.from(dt.files).forEach((file) => {\n files.push({\n alt: '',\n file,\n formID: new ObjectID.default().toHexString(),\n })\n })\n }\n\n if (files.length) {\n // Prevent the default browser drop handling, which would open the file in the browser\n event.preventDefault()\n event.stopPropagation()\n\n // Insert a PendingUploadNode for each image\n editor.update(() => {\n if (canDropImage(event)) {\n const range = getDragSelection(event)\n const selection = $createRangeSelection()\n if (range !== null && range !== undefined) {\n selection.applyDOMRange(range)\n }\n $setSelection(selection)\n\n for (const file of files) {\n const pendingUploadNode = $createUploadNode({\n data: {\n pending: {\n formID: file.formID,\n src: URL.createObjectURL(file.file),\n },\n } as Internal_UploadData,\n })\n // we need to get the focus node before inserting the upload node, as $insertNodeToNearestRoot can change the focus node\n const { focus } = selection\n const focusNode = focus.getNode()\n // Insert upload node BEFORE potentially removing focusNode, as $insertNodeToNearestRoot errors if the focusNode doesn't exist\n $insertNodeToNearestRoot(pendingUploadNode)\n\n // Delete the node it it's an empty paragraph\n if ($isParagraphNode(focusNode) && !focusNode.__first) {\n focusNode.remove()\n }\n }\n }\n })\n\n // Open the bulk drawer - the node transform will not open it for us, as it does not handle blob/file uploads\n openBulkUpload({ files })\n\n return true\n }\n\n return false\n },\n COMMAND_PRIORITY_LOW,\n ),\n )\n }, [editor])\n\n return <UploadDrawer enabledCollectionSlugs={enabledCollectionSlugs} />\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1,5 +1,5 @@
1
1
  import type { PopulationPromise } from '../../typesServer.js';
2
- import type { UploadFeatureProps } from './index.js';
2
+ import type { UploadFeatureServerProps } from './index.js';
3
3
  import type { SerializedUploadNode } from './schema.js';
4
- export declare const uploadPopulationPromiseHOC: (props?: UploadFeatureProps) => PopulationPromise<SerializedUploadNode>;
4
+ export declare const uploadPopulationPromiseHOC: (props: UploadFeatureServerProps) => PopulationPromise<SerializedUploadNode>;
5
5
  //# sourceMappingURL=graphQLPopulationPromise.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"graphQLPopulationPromise.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/server/graphQLPopulationPromise.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAKvD,eAAO,MAAM,0BAA0B,WAC7B,kBAAkB,KACzB,iBAAiB,CAAC,oBAAoB,CAwExC,CAAA"}
1
+ {"version":3,"file":"graphQLPopulationPromise.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/server/graphQLPopulationPromise.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAA;AAC7D,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAKvD,eAAO,MAAM,0BAA0B,UAC9B,wBAAwB,KAC9B,iBAAiB,CAAC,oBAAoB,CAwExC,CAAA"}
@@ -18,7 +18,7 @@ export const uploadPopulationPromiseHOC = props => {
18
18
  req,
19
19
  showHiddenFields
20
20
  }) => {
21
- if (node?.value) {
21
+ if (node?.value && props.enabledCollectionSlugs.includes(node.relationTo)) {
22
22
  const collection = req.payload.collections[node?.relationTo];
23
23
  if (collection) {
24
24
  // @ts-expect-error
@@ -1 +1 @@
1
- {"version":3,"file":"graphQLPopulationPromise.js","names":["populate","recursivelyPopulateFieldsForGraphQL","uploadPopulationPromiseHOC","props","context","currentDepth","depth","draft","editorPopulationPromises","field","fieldPromises","findMany","flattenLocales","node","overrideAccess","parentIsLocalized","populationPromises","req","showHiddenFields","value","collection","payload","collections","relationTo","id","populateDepth","maxDepth","undefined","push","collectionSlug","config","slug","data","key","collectionFieldSchema","fields","Array","isArray","length","localized","siblingDoc"],"sources":["../../../../src/features/upload/server/graphQLPopulationPromise.ts"],"sourcesContent":["import type { PopulationPromise } from '../../typesServer.js'\nimport type { UploadFeatureProps } from './index.js'\nimport type { SerializedUploadNode } from './schema.js'\n\nimport { populate } from '../../../populateGraphQL/populate.js'\nimport { recursivelyPopulateFieldsForGraphQL } from '../../../populateGraphQL/recursivelyPopulateFieldsForGraphQL.js'\n\nexport const uploadPopulationPromiseHOC = (\n props?: UploadFeatureProps,\n): PopulationPromise<SerializedUploadNode> => {\n return ({\n context,\n currentDepth,\n depth,\n draft,\n editorPopulationPromises,\n field,\n fieldPromises,\n findMany,\n flattenLocales,\n node,\n overrideAccess,\n parentIsLocalized,\n populationPromises,\n req,\n showHiddenFields,\n }) => {\n if (node?.value) {\n const collection = req.payload.collections[node?.relationTo]\n\n if (collection) {\n // @ts-expect-error\n const id = node?.value?.id || node?.value // for backwards-compatibility\n\n const populateDepth =\n props?.maxDepth !== undefined && props?.maxDepth < depth ? props?.maxDepth : depth\n\n populationPromises.push(\n populate({\n id,\n collectionSlug: collection.config.slug,\n currentDepth,\n data: node,\n depth: populateDepth,\n draft,\n key: 'value',\n overrideAccess,\n req,\n showHiddenFields,\n }),\n )\n\n const collectionFieldSchema = props?.collections?.[node?.relationTo]?.fields\n\n if (Array.isArray(collectionFieldSchema)) {\n if (!collectionFieldSchema?.length) {\n return\n }\n recursivelyPopulateFieldsForGraphQL({\n context,\n currentDepth,\n data: node.fields || {},\n depth,\n parentIsLocalized: parentIsLocalized || field.localized || false,\n\n draft,\n editorPopulationPromises,\n fieldPromises,\n fields: collectionFieldSchema,\n findMany,\n flattenLocales,\n overrideAccess,\n populationPromises,\n req,\n showHiddenFields,\n siblingDoc: node.fields || {},\n })\n }\n }\n }\n }\n}\n"],"mappings":"AAIA,SAASA,QAAQ,QAAQ;AACzB,SAASC,mCAAmC,QAAQ;AAEpD,OAAO,MAAMC,0BAAA,GACXC,KAAA;EAEA,OAAO,CAAC;IACNC,OAAO;IACPC,YAAY;IACZC,KAAK;IACLC,KAAK;IACLC,wBAAwB;IACxBC,KAAK;IACLC,aAAa;IACbC,QAAQ;IACRC,cAAc;IACdC,IAAI;IACJC,cAAc;IACdC,iBAAiB;IACjBC,kBAAkB;IAClBC,GAAG;IACHC;EAAgB,CACjB;IACC,IAAIL,IAAA,EAAMM,KAAA,EAAO;MACf,MAAMC,UAAA,GAAaH,GAAA,CAAII,OAAO,CAACC,WAAW,CAACT,IAAA,EAAMU,UAAA,CAAW;MAE5D,IAAIH,UAAA,EAAY;QACd;QACA,MAAMI,EAAA,GAAKX,IAAA,EAAMM,KAAA,EAAOK,EAAA,IAAMX,IAAA,EAAMM,KAAA,CAAM;AAAA;QAE1C,MAAMM,aAAA,GACJtB,KAAA,EAAOuB,QAAA,KAAaC,SAAA,IAAaxB,KAAA,EAAOuB,QAAA,GAAWpB,KAAA,GAAQH,KAAA,EAAOuB,QAAA,GAAWpB,KAAA;QAE/EU,kBAAA,CAAmBY,IAAI,CACrB5B,QAAA,CAAS;UACPwB,EAAA;UACAK,cAAA,EAAgBT,UAAA,CAAWU,MAAM,CAACC,IAAI;UACtC1B,YAAA;UACA2B,IAAA,EAAMnB,IAAA;UACNP,KAAA,EAAOmB,aAAA;UACPlB,KAAA;UACA0B,GAAA,EAAK;UACLnB,cAAA;UACAG,GAAA;UACAC;QACF;QAGF,MAAMgB,qBAAA,GAAwB/B,KAAA,EAAOmB,WAAA,GAAcT,IAAA,EAAMU,UAAA,CAAW,EAAEY,MAAA;QAEtE,IAAIC,KAAA,CAAMC,OAAO,CAACH,qBAAA,GAAwB;UACxC,IAAI,CAACA,qBAAA,EAAuBI,MAAA,EAAQ;YAClC;UACF;UACArC,mCAAA,CAAoC;YAClCG,OAAA;YACAC,YAAA;YACA2B,IAAA,EAAMnB,IAAA,CAAKsB,MAAM,IAAI,CAAC;YACtB7B,KAAA;YACAS,iBAAA,EAAmBA,iBAAA,IAAqBN,KAAA,CAAM8B,SAAS,IAAI;YAE3DhC,KAAA;YACAC,wBAAA;YACAE,aAAA;YACAyB,MAAA,EAAQD,qBAAA;YACRvB,QAAA;YACAC,cAAA;YACAE,cAAA;YACAE,kBAAA;YACAC,GAAA;YACAC,gBAAA;YACAsB,UAAA,EAAY3B,IAAA,CAAKsB,MAAM,IAAI,CAAC;UAC9B;QACF;MACF;IACF;EACF;AACF","ignoreList":[]}
1
+ {"version":3,"file":"graphQLPopulationPromise.js","names":["populate","recursivelyPopulateFieldsForGraphQL","uploadPopulationPromiseHOC","props","context","currentDepth","depth","draft","editorPopulationPromises","field","fieldPromises","findMany","flattenLocales","node","overrideAccess","parentIsLocalized","populationPromises","req","showHiddenFields","value","enabledCollectionSlugs","includes","relationTo","collection","payload","collections","id","populateDepth","maxDepth","undefined","push","collectionSlug","config","slug","data","key","collectionFieldSchema","fields","Array","isArray","length","localized","siblingDoc"],"sources":["../../../../src/features/upload/server/graphQLPopulationPromise.ts"],"sourcesContent":["import type { PopulationPromise } from '../../typesServer.js'\nimport type { UploadFeatureServerProps } from './index.js'\nimport type { SerializedUploadNode } from './schema.js'\n\nimport { populate } from '../../../populateGraphQL/populate.js'\nimport { recursivelyPopulateFieldsForGraphQL } from '../../../populateGraphQL/recursivelyPopulateFieldsForGraphQL.js'\n\nexport const uploadPopulationPromiseHOC = (\n props: UploadFeatureServerProps,\n): PopulationPromise<SerializedUploadNode> => {\n return ({\n context,\n currentDepth,\n depth,\n draft,\n editorPopulationPromises,\n field,\n fieldPromises,\n findMany,\n flattenLocales,\n node,\n overrideAccess,\n parentIsLocalized,\n populationPromises,\n req,\n showHiddenFields,\n }) => {\n if (node?.value && props.enabledCollectionSlugs.includes(node.relationTo)) {\n const collection = req.payload.collections[node?.relationTo]\n\n if (collection) {\n // @ts-expect-error\n const id = node?.value?.id || node?.value // for backwards-compatibility\n\n const populateDepth =\n props?.maxDepth !== undefined && props?.maxDepth < depth ? props?.maxDepth : depth\n\n populationPromises.push(\n populate({\n id,\n collectionSlug: collection.config.slug,\n currentDepth,\n data: node,\n depth: populateDepth,\n draft,\n key: 'value',\n overrideAccess,\n req,\n showHiddenFields,\n }),\n )\n\n const collectionFieldSchema = props?.collections?.[node?.relationTo]?.fields\n\n if (Array.isArray(collectionFieldSchema)) {\n if (!collectionFieldSchema?.length) {\n return\n }\n recursivelyPopulateFieldsForGraphQL({\n context,\n currentDepth,\n data: node.fields || {},\n depth,\n parentIsLocalized: parentIsLocalized || field.localized || false,\n\n draft,\n editorPopulationPromises,\n fieldPromises,\n fields: collectionFieldSchema,\n findMany,\n flattenLocales,\n overrideAccess,\n populationPromises,\n req,\n showHiddenFields,\n siblingDoc: node.fields || {},\n })\n }\n }\n }\n }\n}\n"],"mappings":"AAIA,SAASA,QAAQ,QAAQ;AACzB,SAASC,mCAAmC,QAAQ;AAEpD,OAAO,MAAMC,0BAAA,GACXC,KAAA;EAEA,OAAO,CAAC;IACNC,OAAO;IACPC,YAAY;IACZC,KAAK;IACLC,KAAK;IACLC,wBAAwB;IACxBC,KAAK;IACLC,aAAa;IACbC,QAAQ;IACRC,cAAc;IACdC,IAAI;IACJC,cAAc;IACdC,iBAAiB;IACjBC,kBAAkB;IAClBC,GAAG;IACHC;EAAgB,CACjB;IACC,IAAIL,IAAA,EAAMM,KAAA,IAAShB,KAAA,CAAMiB,sBAAsB,CAACC,QAAQ,CAACR,IAAA,CAAKS,UAAU,GAAG;MACzE,MAAMC,UAAA,GAAaN,GAAA,CAAIO,OAAO,CAACC,WAAW,CAACZ,IAAA,EAAMS,UAAA,CAAW;MAE5D,IAAIC,UAAA,EAAY;QACd;QACA,MAAMG,EAAA,GAAKb,IAAA,EAAMM,KAAA,EAAOO,EAAA,IAAMb,IAAA,EAAMM,KAAA,CAAM;AAAA;QAE1C,MAAMQ,aAAA,GACJxB,KAAA,EAAOyB,QAAA,KAAaC,SAAA,IAAa1B,KAAA,EAAOyB,QAAA,GAAWtB,KAAA,GAAQH,KAAA,EAAOyB,QAAA,GAAWtB,KAAA;QAE/EU,kBAAA,CAAmBc,IAAI,CACrB9B,QAAA,CAAS;UACP0B,EAAA;UACAK,cAAA,EAAgBR,UAAA,CAAWS,MAAM,CAACC,IAAI;UACtC5B,YAAA;UACA6B,IAAA,EAAMrB,IAAA;UACNP,KAAA,EAAOqB,aAAA;UACPpB,KAAA;UACA4B,GAAA,EAAK;UACLrB,cAAA;UACAG,GAAA;UACAC;QACF;QAGF,MAAMkB,qBAAA,GAAwBjC,KAAA,EAAOsB,WAAA,GAAcZ,IAAA,EAAMS,UAAA,CAAW,EAAEe,MAAA;QAEtE,IAAIC,KAAA,CAAMC,OAAO,CAACH,qBAAA,GAAwB;UACxC,IAAI,CAACA,qBAAA,EAAuBI,MAAA,EAAQ;YAClC;UACF;UACAvC,mCAAA,CAAoC;YAClCG,OAAA;YACAC,YAAA;YACA6B,IAAA,EAAMrB,IAAA,CAAKwB,MAAM,IAAI,CAAC;YACtB/B,KAAA;YACAS,iBAAA,EAAmBA,iBAAA,IAAqBN,KAAA,CAAMgC,SAAS,IAAI;YAE3DlC,KAAA;YACAC,wBAAA;YACAE,aAAA;YACA2B,MAAA,EAAQD,qBAAA;YACRzB,QAAA;YACAC,cAAA;YACAE,cAAA;YACAE,kBAAA;YACAC,GAAA;YACAC,gBAAA;YACAwB,UAAA,EAAY7B,IAAA,CAAKwB,MAAM,IAAI,CAAC;UAC9B;QACF;MACF;IACF;EACF;AACF","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import type { Field, UploadCollectionSlug } from 'payload';
1
+ import type { CollectionSlug, Field, UploadCollectionSlug } from 'payload';
2
2
  import type { UploadFeaturePropsClient } from '../client/index.js';
3
3
  export type { Internal_UploadData, SerializedUploadNode, UploadData, UploadDataImproved, } from './schema.js';
4
4
  export type ExclusiveUploadFeatureProps = {
@@ -30,5 +30,9 @@ export type UploadFeatureProps = {
30
30
  */
31
31
  maxDepth?: number;
32
32
  } & ExclusiveUploadFeatureProps;
33
- export declare const UploadFeature: import("../../typesServer.js").FeatureProviderProviderServer<UploadFeatureProps, UploadFeatureProps, UploadFeaturePropsClient>;
33
+ export type UploadFeatureServerProps = {
34
+ /** Collection policy resolved during feature initialization. */
35
+ enabledCollectionSlugs: CollectionSlug[];
36
+ } & UploadFeatureProps;
37
+ export declare const UploadFeature: import("../../typesServer.js").FeatureProviderProviderServer<UploadFeatureProps, UploadFeatureServerProps, UploadFeaturePropsClient>;
34
38
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,KAAK,EAAkB,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAIlF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAYlE,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,kBAAkB,GACnB,MAAM,aAAa,CAAA;AAEpB,MAAM,MAAM,2BAA2B,GACnC;IACE;;;QAGI;IACJ,mBAAmB,CAAC,EAAE,oBAAoB,EAAE,CAAA;IAG5C,kBAAkB,CAAC,EAAE,KAAK,CAAA;CAC3B,GACD;IAEE,mBAAmB,CAAC,EAAE,KAAK,CAAA;IAE3B;;;QAGI;IACJ,kBAAkB,CAAC,EAAE,oBAAoB,EAAE,CAAA;CAC5C,CAAA;AAEL,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,CAAC,EAAE;QACZ,CAAC,UAAU,EAAE,oBAAoB,GAAG;YAClC,MAAM,EAAE,KAAK,EAAE,CAAA;SAChB,CAAA;KACF,CAAA;IACD;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,GAAG,2BAA2B,CAAA;AAE/B,eAAO,MAAM,aAAa,gIA0JxB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAU,KAAK,EAAkB,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAIlG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAalE,YAAY,EACV,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,kBAAkB,GACnB,MAAM,aAAa,CAAA;AAEpB,MAAM,MAAM,2BAA2B,GACnC;IACE;;;QAGI;IACJ,mBAAmB,CAAC,EAAE,oBAAoB,EAAE,CAAA;IAG5C,kBAAkB,CAAC,EAAE,KAAK,CAAA;CAC3B,GACD;IAEE,mBAAmB,CAAC,EAAE,KAAK,CAAA;IAE3B;;;QAGI;IACJ,kBAAkB,CAAC,EAAE,oBAAoB,EAAE,CAAA;CAC5C,CAAA;AAEL,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,CAAC,EAAE;QACZ,CAAC,UAAU,EAAE,oBAAoB,GAAG;YAClC,MAAM,EAAE,KAAK,EAAE,CAAA;SAChB,CAAA;KACF,CAAA;IACD;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,GAAG,2BAA2B,CAAA;AAE/B,MAAM,MAAM,wBAAwB,GAAG;IACrC,gEAAgE;IAChE,sBAAsB,EAAE,cAAc,EAAE,CAAA;CACzC,GAAG,kBAAkB,CAAA;AAEtB,eAAO,MAAM,aAAa,sIA6JxB,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { sanitizeFields } from 'payload';
2
2
  import { populate } from '../../../populateGraphQL/populate.js';
3
3
  import { createServerFeature } from '../../../utilities/createServerFeature.js';
4
+ import { filterEnabledRelationshipCollections } from '../../relationship/shared/filterEnabledRelationshipCollections.js';
4
5
  import { createNode } from '../../typeUtilities.js';
5
6
  import { uploadPopulationPromiseHOC } from './graphQLPopulationPromise.js';
6
7
  import { i18n } from './i18n.js';
@@ -13,22 +14,22 @@ export const UploadFeature = createServerFeature({
13
14
  config: _config,
14
15
  isRoot,
15
16
  parentIsLocalized,
16
- props
17
+ props: unsanitizedProps
17
18
  }) => {
18
- if (!props) {
19
- props = {
20
- collections: {}
21
- };
22
- }
19
+ const props = {
20
+ ...unsanitizedProps,
21
+ collections: unsanitizedProps?.collections ?? {},
22
+ enabledCollectionSlugs: filterEnabledRelationshipCollections(_config.collections, {
23
+ ...unsanitizedProps,
24
+ uploads: true
25
+ }).map(({
26
+ slug
27
+ }) => slug)
28
+ };
23
29
  const clientProps = {
24
- collections: {}
30
+ collections: {},
31
+ enabledCollectionSlugs: props.enabledCollectionSlugs
25
32
  };
26
- if (props.disabledCollections) {
27
- clientProps.disabledCollections = props.disabledCollections;
28
- }
29
- if (props.enabledCollections) {
30
- clientProps.enabledCollections = props.enabledCollections;
31
- }
32
33
  if (props.collections) {
33
34
  for (const collection in props.collections) {
34
35
  clientProps.collections[collection] = {
@@ -84,6 +85,9 @@ export const UploadFeature = createServerFeature({
84
85
  }
85
86
  return allSubFields;
86
87
  }
88
+ if (!props.enabledCollectionSlugs.includes(node.relationTo)) {
89
+ return null;
90
+ }
87
91
  const collection = req ? req.payload.collections[node?.relationTo] : null;
88
92
  if (collection) {
89
93
  const collectionFieldSchema = props?.collections?.[node?.relationTo]?.fields;
@@ -114,7 +118,7 @@ export const UploadFeature = createServerFeature({
114
118
  req,
115
119
  showHiddenFields
116
120
  }) => {
117
- if (!node?.value) {
121
+ if (!node?.value || !props.enabledCollectionSlugs.includes(node.relationTo)) {
118
122
  return node;
119
123
  }
120
124
  const collection = req.payload.collections[node?.relationTo];
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["sanitizeFields","populate","createServerFeature","createNode","uploadPopulationPromiseHOC","i18n","PAYLOAD_UPLOAD","UploadServerNode","createUploadNodeJSONSchema","uploadValidation","UploadFeature","feature","config","_config","isRoot","parentIsLocalized","props","collections","clientProps","disabledCollections","enabledCollections","collection","hasExtraFields","fields","length","validRelationships","map","c","slug","collectionKey","requireFieldLevelRichTextEditor","ClientFeature","clientFeatureProps","generateSchemaMap","schemaMap","Map","set","markdownTransformers","nodes","getSubFields","node","req","allSubFields","collectionFields","concat","payload","relationTo","collectionFieldSchema","Array","isArray","getSubFieldsData","graphQLPopulationPromises","hooks","afterRead","currentDepth","depth","draft","overrideAccess","populateArg","populationPromises","showHiddenFields","value","id","populateDepth","maxDepth","undefined","push","collectionSlug","data","key","select","defaultPopulate","jsonSchema","validations","sanitizedServerFeatureProps"],"sources":["../../../../src/features/upload/server/index.ts"],"sourcesContent":["import type { Config, Field, FieldSchemaMap, UploadCollectionSlug } from 'payload'\n\nimport { sanitizeFields } from 'payload'\n\nimport type { UploadFeaturePropsClient } from '../client/index.js'\n\nimport { populate } from '../../../populateGraphQL/populate.js'\nimport { createServerFeature } from '../../../utilities/createServerFeature.js'\nimport { createNode } from '../../typeUtilities.js'\nimport { uploadPopulationPromiseHOC } from './graphQLPopulationPromise.js'\nimport { i18n } from './i18n.js'\nimport { PAYLOAD_UPLOAD } from './markdownTransformer.js'\nimport { UploadServerNode } from './nodes/UploadNode.js'\nimport { createUploadNodeJSONSchema } from './schema.js'\nimport { uploadValidation } from './validate.js'\n\nexport type {\n Internal_UploadData,\n SerializedUploadNode,\n UploadData,\n UploadDataImproved,\n} from './schema.js'\n\nexport type ExclusiveUploadFeatureProps =\n | {\n /**\n * The collections that should be disabled. Overrides the `enableRichTextRelationship` property in the collection config.\n * When this property is set, `enabledCollections` will not be available.\n **/\n disabledCollections?: UploadCollectionSlug[]\n\n // Ensures that enabledCollections is not available when disabledCollections is set\n enabledCollections?: never\n }\n | {\n // Ensures that disabledCollections is not available when enabledCollections is set\n disabledCollections?: never\n\n /**\n * The collections that should be enabled. Overrides the `enableRichTextRelationship` property in the collection config\n * When this property is set, `disabledCollections` will not be available.\n **/\n enabledCollections?: UploadCollectionSlug[]\n }\n\nexport type UploadFeatureProps = {\n collections?: {\n [collection: UploadCollectionSlug]: {\n fields: Field[]\n }\n }\n /**\n * Sets a maximum population depth for this upload (not the fields for this upload), regardless of the remaining depth when the respective field is reached.\n * This behaves exactly like the maxDepth properties of relationship and upload fields.\n *\n * {@link https://payloadcms.com/docs/getting-started/concepts#field-level-max-depth}\n */\n maxDepth?: number\n} & ExclusiveUploadFeatureProps\n\nexport const UploadFeature = createServerFeature<\n UploadFeatureProps,\n UploadFeatureProps,\n UploadFeaturePropsClient\n>({\n feature: ({ config: _config, isRoot, parentIsLocalized, props }) => {\n if (!props) {\n props = { collections: {} }\n }\n\n const clientProps: UploadFeaturePropsClient = {\n collections: {},\n }\n if (props.disabledCollections) {\n clientProps.disabledCollections = props.disabledCollections\n }\n if (props.enabledCollections) {\n clientProps.enabledCollections = props.enabledCollections\n }\n\n if (props.collections) {\n for (const collection in props.collections) {\n clientProps.collections[collection] = {\n hasExtraFields: props.collections[collection]!.fields.length >= 1,\n }\n }\n }\n\n const validRelationships = _config.collections.map((c) => c.slug) || []\n\n for (const collectionKey in props.collections) {\n const collection = props.collections[collectionKey]!\n if (collection.fields?.length) {\n collection.fields = sanitizeFields({\n config: _config as unknown as Config,\n fields: collection.fields,\n parentIsLocalized,\n requireFieldLevelRichTextEditor: isRoot,\n validRelationships,\n })\n }\n }\n\n return {\n ClientFeature: '@payloadcms/richtext-lexical/client#UploadFeatureClient',\n clientFeatureProps: clientProps,\n generateSchemaMap: ({ props }) => {\n if (!props?.collections) {\n return null\n }\n\n const schemaMap: FieldSchemaMap = new Map()\n\n for (const collectionKey in props.collections) {\n const collection = props.collections[collectionKey]!\n if (collection.fields?.length) {\n schemaMap.set(collectionKey, {\n fields: collection.fields,\n })\n }\n }\n\n return schemaMap\n },\n i18n,\n markdownTransformers: [PAYLOAD_UPLOAD],\n nodes: [\n createNode({\n getSubFields: ({ node, req }) => {\n if (!node) {\n let allSubFields: Field[] = []\n for (const collection in props?.collections) {\n const collectionFields = props.collections[collection]!.fields\n allSubFields = allSubFields.concat(collectionFields)\n }\n return allSubFields\n }\n const collection = req ? req.payload.collections[node?.relationTo] : null\n\n if (collection) {\n const collectionFieldSchema = props?.collections?.[node?.relationTo]?.fields\n\n if (Array.isArray(collectionFieldSchema)) {\n if (!collectionFieldSchema?.length) {\n return null\n }\n return collectionFieldSchema\n }\n }\n return null\n },\n getSubFieldsData: ({ node }) => {\n return node?.fields\n },\n graphQLPopulationPromises: [uploadPopulationPromiseHOC(props)],\n hooks: {\n afterRead: [\n ({\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n populateArg,\n populationPromises,\n req,\n showHiddenFields,\n }) => {\n if (!node?.value) {\n return node\n }\n const collection = req.payload.collections[node?.relationTo]\n\n if (!collection) {\n return node\n }\n const id =\n typeof node?.value === 'object' && node.value !== null && 'id' in node.value\n ? node.value.id\n : node?.value // for backwards-compatibility\n\n const populateDepth =\n props?.maxDepth !== undefined && props?.maxDepth < depth ? props?.maxDepth : depth\n\n populationPromises.push(\n populate({\n id,\n collectionSlug: collection.config.slug,\n currentDepth,\n data: node,\n depth: populateDepth,\n draft,\n key: 'value',\n overrideAccess,\n req,\n select:\n populateArg?.[collection.config.slug] ?? collection.config.defaultPopulate,\n showHiddenFields,\n }),\n )\n\n return node\n },\n ],\n },\n jsonSchema: createUploadNodeJSONSchema(props),\n node: UploadServerNode,\n validations: [uploadValidation(props)],\n }),\n ],\n sanitizedServerFeatureProps: props,\n }\n },\n key: 'upload',\n})\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["sanitizeFields","populate","createServerFeature","filterEnabledRelationshipCollections","createNode","uploadPopulationPromiseHOC","i18n","PAYLOAD_UPLOAD","UploadServerNode","createUploadNodeJSONSchema","uploadValidation","UploadFeature","feature","config","_config","isRoot","parentIsLocalized","props","unsanitizedProps","collections","enabledCollectionSlugs","uploads","map","slug","clientProps","collection","hasExtraFields","fields","length","validRelationships","c","collectionKey","requireFieldLevelRichTextEditor","ClientFeature","clientFeatureProps","generateSchemaMap","schemaMap","Map","set","markdownTransformers","nodes","getSubFields","node","req","allSubFields","collectionFields","concat","includes","relationTo","payload","collectionFieldSchema","Array","isArray","getSubFieldsData","graphQLPopulationPromises","hooks","afterRead","currentDepth","depth","draft","overrideAccess","populateArg","populationPromises","showHiddenFields","value","id","populateDepth","maxDepth","undefined","push","collectionSlug","data","key","select","defaultPopulate","jsonSchema","validations","sanitizedServerFeatureProps"],"sources":["../../../../src/features/upload/server/index.ts"],"sourcesContent":["import type { CollectionSlug, Config, Field, FieldSchemaMap, UploadCollectionSlug } from 'payload'\n\nimport { sanitizeFields } from 'payload'\n\nimport type { UploadFeaturePropsClient } from '../client/index.js'\n\nimport { populate } from '../../../populateGraphQL/populate.js'\nimport { createServerFeature } from '../../../utilities/createServerFeature.js'\nimport { filterEnabledRelationshipCollections } from '../../relationship/shared/filterEnabledRelationshipCollections.js'\nimport { createNode } from '../../typeUtilities.js'\nimport { uploadPopulationPromiseHOC } from './graphQLPopulationPromise.js'\nimport { i18n } from './i18n.js'\nimport { PAYLOAD_UPLOAD } from './markdownTransformer.js'\nimport { UploadServerNode } from './nodes/UploadNode.js'\nimport { createUploadNodeJSONSchema } from './schema.js'\nimport { uploadValidation } from './validate.js'\n\nexport type {\n Internal_UploadData,\n SerializedUploadNode,\n UploadData,\n UploadDataImproved,\n} from './schema.js'\n\nexport type ExclusiveUploadFeatureProps =\n | {\n /**\n * The collections that should be disabled. Overrides the `enableRichTextRelationship` property in the collection config.\n * When this property is set, `enabledCollections` will not be available.\n **/\n disabledCollections?: UploadCollectionSlug[]\n\n // Ensures that enabledCollections is not available when disabledCollections is set\n enabledCollections?: never\n }\n | {\n // Ensures that disabledCollections is not available when enabledCollections is set\n disabledCollections?: never\n\n /**\n * The collections that should be enabled. Overrides the `enableRichTextRelationship` property in the collection config\n * When this property is set, `disabledCollections` will not be available.\n **/\n enabledCollections?: UploadCollectionSlug[]\n }\n\nexport type UploadFeatureProps = {\n collections?: {\n [collection: UploadCollectionSlug]: {\n fields: Field[]\n }\n }\n /**\n * Sets a maximum population depth for this upload (not the fields for this upload), regardless of the remaining depth when the respective field is reached.\n * This behaves exactly like the maxDepth properties of relationship and upload fields.\n *\n * {@link https://payloadcms.com/docs/getting-started/concepts#field-level-max-depth}\n */\n maxDepth?: number\n} & ExclusiveUploadFeatureProps\n\nexport type UploadFeatureServerProps = {\n /** Collection policy resolved during feature initialization. */\n enabledCollectionSlugs: CollectionSlug[]\n} & UploadFeatureProps\n\nexport const UploadFeature = createServerFeature<\n UploadFeatureProps,\n UploadFeatureServerProps,\n UploadFeaturePropsClient\n>({\n feature: ({ config: _config, isRoot, parentIsLocalized, props: unsanitizedProps }) => {\n const props: UploadFeatureServerProps = {\n ...unsanitizedProps,\n collections: unsanitizedProps?.collections ?? {},\n enabledCollectionSlugs: filterEnabledRelationshipCollections(_config.collections, {\n ...unsanitizedProps,\n uploads: true,\n }).map(({ slug }) => slug),\n }\n\n const clientProps: UploadFeaturePropsClient = {\n collections: {},\n enabledCollectionSlugs: props.enabledCollectionSlugs,\n }\n\n if (props.collections) {\n for (const collection in props.collections) {\n clientProps.collections[collection] = {\n hasExtraFields: props.collections[collection]!.fields.length >= 1,\n }\n }\n }\n\n const validRelationships = _config.collections.map((c) => c.slug) || []\n\n for (const collectionKey in props.collections) {\n const collection = props.collections[collectionKey]!\n if (collection.fields?.length) {\n collection.fields = sanitizeFields({\n config: _config as unknown as Config,\n fields: collection.fields,\n parentIsLocalized,\n requireFieldLevelRichTextEditor: isRoot,\n validRelationships,\n })\n }\n }\n\n return {\n ClientFeature: '@payloadcms/richtext-lexical/client#UploadFeatureClient',\n clientFeatureProps: clientProps,\n generateSchemaMap: ({ props }) => {\n if (!props?.collections) {\n return null\n }\n\n const schemaMap: FieldSchemaMap = new Map()\n\n for (const collectionKey in props.collections) {\n const collection = props.collections[collectionKey]!\n if (collection.fields?.length) {\n schemaMap.set(collectionKey, {\n fields: collection.fields,\n })\n }\n }\n\n return schemaMap\n },\n i18n,\n markdownTransformers: [PAYLOAD_UPLOAD],\n nodes: [\n createNode({\n getSubFields: ({ node, req }) => {\n if (!node) {\n let allSubFields: Field[] = []\n for (const collection in props?.collections) {\n const collectionFields = props.collections[collection]!.fields\n allSubFields = allSubFields.concat(collectionFields)\n }\n return allSubFields\n }\n if (!props.enabledCollectionSlugs.includes(node.relationTo)) {\n return null\n }\n const collection = req ? req.payload.collections[node?.relationTo] : null\n\n if (collection) {\n const collectionFieldSchema = props?.collections?.[node?.relationTo]?.fields\n\n if (Array.isArray(collectionFieldSchema)) {\n if (!collectionFieldSchema?.length) {\n return null\n }\n return collectionFieldSchema\n }\n }\n return null\n },\n getSubFieldsData: ({ node }) => {\n return node?.fields\n },\n graphQLPopulationPromises: [uploadPopulationPromiseHOC(props)],\n hooks: {\n afterRead: [\n ({\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n populateArg,\n populationPromises,\n req,\n showHiddenFields,\n }) => {\n if (!node?.value || !props.enabledCollectionSlugs.includes(node.relationTo)) {\n return node\n }\n const collection = req.payload.collections[node?.relationTo]\n\n if (!collection) {\n return node\n }\n const id =\n typeof node?.value === 'object' && node.value !== null && 'id' in node.value\n ? node.value.id\n : node?.value // for backwards-compatibility\n\n const populateDepth =\n props?.maxDepth !== undefined && props?.maxDepth < depth ? props?.maxDepth : depth\n\n populationPromises.push(\n populate({\n id,\n collectionSlug: collection.config.slug,\n currentDepth,\n data: node,\n depth: populateDepth,\n draft,\n key: 'value',\n overrideAccess,\n req,\n select:\n populateArg?.[collection.config.slug] ?? collection.config.defaultPopulate,\n showHiddenFields,\n }),\n )\n\n return node\n },\n ],\n },\n jsonSchema: createUploadNodeJSONSchema(props),\n node: UploadServerNode,\n validations: [uploadValidation(props)],\n }),\n ],\n sanitizedServerFeatureProps: props,\n }\n },\n key: 'upload',\n})\n"],"mappings":"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","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  import type { DataFromCollectionSlug, IDTypeForCollectionSlug, JsonObject, TypedUploadCollection, UploadCollectionSlug } from 'payload';
2
2
  import type { LexicalElementFormat } from '../../../types/nodeTypes.js';
3
3
  import type { JSONSchemaFn } from '../../typesServer.js';
4
- import type { UploadFeatureProps } from './index.js';
4
+ import type { UploadFeatureServerProps } from './index.js';
5
5
  export type UploadData<TFields extends JsonObject = JsonObject> = {
6
6
  [TCollectionSlug in UploadCollectionSlug]: {
7
7
  fields: TFields;
@@ -48,5 +48,5 @@ export type SerializedUploadNode<TSlugs extends UploadCollectionSlug = UploadCol
48
48
  type: 'upload';
49
49
  version: number;
50
50
  };
51
- export declare const createUploadNodeJSONSchema: (props: undefined | UploadFeatureProps) => JSONSchemaFn;
51
+ export declare const createUploadNodeJSONSchema: (props: UploadFeatureServerProps) => JSONSchemaFn;
52
52
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/server/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,UAAU,EACV,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,SAAS,CAAA;AAKhB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAKpD,MAAM,MAAM,UAAU,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,IAAI;KAC/D,eAAe,IAAI,oBAAoB,GAAG;QACzC,MAAM,EAAE,OAAO,CAAA;QACf,6DAA6D;QAC7D,EAAE,EAAE,MAAM,CAAA;QACV,UAAU,EAAE,eAAe,CAAA;QAC3B,6DAA6D;QAC7D,KAAK,EAAE,sBAAsB,CAAC,eAAe,CAAC,GAAG,uBAAuB,CAAC,eAAe,CAAC,CAAA;KAC1F;CACF,CAAC,oBAAoB,CAAC,CAAA;AAEvB,sDAAsD;AACtD,MAAM,MAAM,mBAAmB,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,IAAI;IACzE,OAAO,CAAC,EAAE;QACR,2BAA2B;QAC3B,MAAM,EAAE,MAAM,CAAA;QACd,sCAAsC;QACtC,GAAG,EAAE,MAAM,CAAA;KACZ,CAAA;CACF,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;AAEvB;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,IAAI;KACvE,eAAe,IAAI,oBAAoB,GAAG;QACzC,MAAM,EAAE,OAAO,CAAA;QACf,EAAE,EAAE,MAAM,CAAA;QACV,UAAU,EAAE,eAAe,CAAA;QAC3B,KAAK,EAAE,uBAAuB,CAAC,eAAe,CAAC,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAA;KACzF;CACF,CAAC,oBAAoB,CAAC,CAAA;AAEvB,MAAM,MAAM,oBAAoB,CAC9B,MAAM,SAAS,oBAAoB,GAAG,oBAAoB,EAC1D,OAAO,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,IAChC;KACD,KAAK,IAAI,MAAM,GAAG;QACjB,UAAU,EAAE,KAAK,CAAA;QACjB,KAAK,EAAE,sBAAsB,CAAC,KAAK,CAAC,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAA;KACtE;CACF,CAAC,MAAM,CAAC,GAAG;IACV,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,oBAAoB,CAAA;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,QAAQ,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAiCD,eAAO,MAAM,0BAA0B,UAC7B,SAAS,GAAG,kBAAkB,KAAG,YA0GxC,CAAA"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/server/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,uBAAuB,EACvB,UAAU,EACV,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,SAAS,CAAA;AAKhB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AACxD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAI1D,MAAM,MAAM,UAAU,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,IAAI;KAC/D,eAAe,IAAI,oBAAoB,GAAG;QACzC,MAAM,EAAE,OAAO,CAAA;QACf,6DAA6D;QAC7D,EAAE,EAAE,MAAM,CAAA;QACV,UAAU,EAAE,eAAe,CAAA;QAC3B,6DAA6D;QAC7D,KAAK,EAAE,sBAAsB,CAAC,eAAe,CAAC,GAAG,uBAAuB,CAAC,eAAe,CAAC,CAAA;KAC1F;CACF,CAAC,oBAAoB,CAAC,CAAA;AAEvB,sDAAsD;AACtD,MAAM,MAAM,mBAAmB,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,IAAI;IACzE,OAAO,CAAC,EAAE;QACR,2BAA2B;QAC3B,MAAM,EAAE,MAAM,CAAA;QACd,sCAAsC;QACtC,GAAG,EAAE,MAAM,CAAA;KACZ,CAAA;CACF,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;AAEvB;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,CAAC,OAAO,SAAS,UAAU,GAAG,UAAU,IAAI;KACvE,eAAe,IAAI,oBAAoB,GAAG;QACzC,MAAM,EAAE,OAAO,CAAA;QACf,EAAE,EAAE,MAAM,CAAA;QACV,UAAU,EAAE,eAAe,CAAA;QAC3B,KAAK,EAAE,uBAAuB,CAAC,eAAe,CAAC,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAA;KACzF;CACF,CAAC,oBAAoB,CAAC,CAAA;AAEvB,MAAM,MAAM,oBAAoB,CAC9B,MAAM,SAAS,oBAAoB,GAAG,oBAAoB,EAC1D,OAAO,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,IAChC;KACD,KAAK,IAAI,MAAM,GAAG;QACjB,UAAU,EAAE,KAAK,CAAA;QACjB,KAAK,EAAE,sBAAsB,CAAC,KAAK,CAAC,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAA;KACtE;CACF,CAAC,MAAM,CAAC,GAAG;IACV,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,oBAAoB,CAAA;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,QAAQ,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAiCD,eAAO,MAAM,0BAA0B,UAC7B,wBAAwB,KAAG,YAmGlC,CAAA"}
@@ -1,7 +1,6 @@
1
1
  import { createHash } from 'crypto';
2
2
  import { fieldsToJSONSchema, flattenAllFields } from 'payload';
3
3
  import { formatSchema, versionSchema } from '../../../types/jsonSchemaHelpers.js';
4
- import { filterEnabledRelationshipCollections } from '../../relationship/shared/filterEnabledRelationshipCollections.js';
5
4
  /** MUST stay byte-for-byte in sync with the runtime `SerializedUploadNode` declared above. */
6
5
  const SERIALIZED_UPLOAD_NODE_TS = `export type SerializedUploadNode<TSlugs extends keyof Config['collections'], TFields = { [k: string]: unknown }> = {
7
6
  type: 'upload';
@@ -39,11 +38,9 @@ export const createUploadNodeJSONSchema = props => ({
39
38
  }) => {
40
39
  const isInput = variant === 'input';
41
40
  typeStringDefinitions.add(isInput ? SERIALIZED_UPLOAD_NODE_INPUT_TS : SERIALIZED_UPLOAD_NODE_TS);
42
- const enabledCollections = config?.collections ? filterEnabledRelationshipCollections(config.collections, {
43
- disabledCollections: props?.disabledCollections,
44
- enabledCollections: props?.enabledCollections,
45
- uploads: true
46
- }) : [];
41
+ const {
42
+ enabledCollectionSlugs
43
+ } = props;
47
44
  // Configured extra fields are registered as their own interface and referenced here, so the
48
45
  // generated TypeScript keeps them - the node-level `tsType` would otherwise erase `fields` to
49
46
  // `{ [k: string]: unknown }`. Mirrors how LinkFeature handles custom link fields.
@@ -52,8 +49,7 @@ export const createUploadNodeJSONSchema = props => ({
52
49
  // generated union correctly pairs each `relationTo` with its own fields type. A single
53
50
  // `SerializedUploadNode<'a' | 'b', AFields | BFields>` would lose that pairing.
54
51
  const perCollectionTsTypes = [];
55
- const collectionVariants = enabledCollections.map(collection => {
56
- const slug = collection.slug;
52
+ const collectionVariants = enabledCollectionSlugs.map(slug => {
57
53
  const idType = collectionIDFieldTypes[slug] ?? 'string';
58
54
  const extraFields = props?.collections?.[slug]?.fields ?? [];
59
55
  const flattenedExtra = flattenAllFields({
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","names":["createHash","fieldsToJSONSchema","flattenAllFields","formatSchema","versionSchema","filterEnabledRelationshipCollections","SERIALIZED_UPLOAD_NODE_TS","SERIALIZED_UPLOAD_NODE_INPUT_TS","hashUploadFields","schema","update","JSON","stringify","digest","slice","toUpperCase","createUploadNodeJSONSchema","props","collectionIDFieldTypes","config","i18n","interfaceNameDefinitions","typeStringDefinitions","variant","isInput","add","enabledCollections","collections","disabledCollections","uploads","perCollectionTsTypes","collectionVariants","map","collection","slug","idType","extraFields","fields","flattenedExtra","extraFieldsSchema","length","properties","required","fieldsSchema","type","additionalProperties","fieldsTypeName","set","$ref","uploadTsName","push","id","const","format","relationTo","value","description","oneOf","version","baseSchema","tsType","join"],"sources":["../../../../src/features/upload/server/schema.ts"],"sourcesContent":["import type { JSONSchema4 } from 'json-schema'\nimport type {\n DataFromCollectionSlug,\n IDTypeForCollectionSlug,\n JsonObject,\n TypedUploadCollection,\n UploadCollectionSlug,\n} from 'payload'\n\nimport { createHash } from 'crypto'\nimport { fieldsToJSONSchema, flattenAllFields } from 'payload'\n\nimport type { LexicalElementFormat } from '../../../types/nodeTypes.js'\nimport type { JSONSchemaFn } from '../../typesServer.js'\nimport type { UploadFeatureProps } from './index.js'\n\nimport { formatSchema, versionSchema } from '../../../types/jsonSchemaHelpers.js'\nimport { filterEnabledRelationshipCollections } from '../../relationship/shared/filterEnabledRelationshipCollections.js'\n\nexport type UploadData<TFields extends JsonObject = JsonObject> = {\n [TCollectionSlug in UploadCollectionSlug]: {\n fields: TFields\n /** ID of this upload node — NOT the linked document's ID. */\n id: string\n relationTo: TCollectionSlug\n /** Either the document ID or the full populated document. */\n value: DataFromCollectionSlug<TCollectionSlug> | IDTypeForCollectionSlug<TCollectionSlug>\n }\n}[UploadCollectionSlug]\n\n/** @internal Adds a pending state to `UploadData`. */\nexport type Internal_UploadData<TFields extends JsonObject = JsonObject> = {\n pending?: {\n /** Bulk upload form ID. */\n formID: string\n /** `src` of the image DOM element. */\n src: string\n }\n} & UploadData<TFields>\n\n/**\n * More precise variant of {@link UploadData}. Replaces `UploadData` in v4.\n * @internal\n * @todo Replace UploadData with UploadDataImproved in 4.0\n */\nexport type UploadDataImproved<TFields extends JsonObject = JsonObject> = {\n [TCollectionSlug in UploadCollectionSlug]: {\n fields: TFields\n id: string\n relationTo: TCollectionSlug\n value: IDTypeForCollectionSlug<TCollectionSlug> | TypedUploadCollection[TCollectionSlug]\n }\n}[UploadCollectionSlug]\n\nexport type SerializedUploadNode<\n TSlugs extends UploadCollectionSlug = UploadCollectionSlug,\n TFields = { [k: string]: unknown },\n> = {\n [TSlug in TSlugs]: {\n relationTo: TSlug\n value: DataFromCollectionSlug<TSlug> | IDTypeForCollectionSlug<TSlug>\n }\n}[TSlugs] & {\n fields: TFields\n format: LexicalElementFormat\n id: string\n type: 'upload'\n version: number\n}\n\n/** MUST stay byte-for-byte in sync with the runtime `SerializedUploadNode` declared above. */\nconst SERIALIZED_UPLOAD_NODE_TS = `export type SerializedUploadNode<TSlugs extends keyof Config['collections'], TFields = { [k: string]: unknown }> = {\n type: 'upload';\n format: LexicalElementFormat;\n id: string;\n version: number;\n fields: TFields;\n} & {\n [TSlug in TSlugs]: {\n relationTo: TSlug;\n value: Config['collections'][TSlug]['id'] | Config['collections'][TSlug];\n };\n}[TSlugs];`\n\n/** Input variant of `SerializedUploadNode`: `value` is ID-only (you only ever write an ID). */\nconst SERIALIZED_UPLOAD_NODE_INPUT_TS = `export type SerializedUploadNodeInput<TSlugs extends keyof Config['collections'], TFields = { [k: string]: unknown }> = {\n type: 'upload';\n format: LexicalElementFormat;\n id: string;\n version: number;\n fields: TFields;\n} & {\n [TSlug in TSlugs]: {\n relationTo: TSlug;\n value: Config['collections'][TSlug]['id'];\n };\n}[TSlugs];`\n\nconst hashUploadFields = (schema: JSONSchema4): string =>\n createHash('sha256').update(JSON.stringify(schema)).digest('hex').slice(0, 8).toUpperCase()\n\nexport const createUploadNodeJSONSchema =\n (props: undefined | UploadFeatureProps): JSONSchemaFn =>\n ({\n collectionIDFieldTypes,\n config,\n i18n,\n interfaceNameDefinitions,\n typeStringDefinitions,\n variant,\n }) => {\n const isInput = variant === 'input'\n typeStringDefinitions.add(isInput ? SERIALIZED_UPLOAD_NODE_INPUT_TS : SERIALIZED_UPLOAD_NODE_TS)\n const enabledCollections = config?.collections\n ? filterEnabledRelationshipCollections(config.collections, {\n disabledCollections: props?.disabledCollections,\n enabledCollections: props?.enabledCollections,\n uploads: true,\n })\n : []\n\n // Configured extra fields are registered as their own interface and referenced here, so the\n // generated TypeScript keeps them - the node-level `tsType` would otherwise erase `fields` to\n // `{ [k: string]: unknown }`. Mirrors how LinkFeature handles custom link fields.\n //\n // Each collection gets its own `SerializedUploadNode<'slug', Fields>` instantiation so the\n // generated union correctly pairs each `relationTo` with its own fields type. A single\n // `SerializedUploadNode<'a' | 'b', AFields | BFields>` would lose that pairing.\n const perCollectionTsTypes: string[] = []\n const collectionVariants: JSONSchema4[] = enabledCollections.map((collection) => {\n const slug = collection.slug\n const idType: 'number' | 'string' = collectionIDFieldTypes[slug] ?? 'string'\n const extraFields = props?.collections?.[slug]?.fields ?? []\n const flattenedExtra = flattenAllFields({ fields: extraFields })\n const extraFieldsSchema =\n flattenedExtra.length > 0 && config\n ? fieldsToJSONSchema({\n collectionIDFieldTypes,\n config,\n fields: flattenedExtra,\n i18n,\n interfaceNameDefinitions,\n typeStringDefinitions,\n variant,\n })\n : { properties: {}, required: [] }\n\n let fieldsSchema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n properties: extraFieldsSchema.properties,\n required: extraFieldsSchema.required,\n }\n let fieldsTypeName: string | undefined\n if (flattenedExtra.length > 0) {\n fieldsTypeName = `LexicalUploadFields_${hashUploadFields(fieldsSchema)}`\n interfaceNameDefinitions.set(fieldsTypeName, fieldsSchema)\n fieldsSchema = { $ref: `#/$defs/${fieldsTypeName}` }\n }\n\n const uploadTsName = isInput ? 'SerializedUploadNodeInput' : 'SerializedUploadNode'\n perCollectionTsTypes.push(\n fieldsTypeName\n ? `${uploadTsName}<'${slug}', ${fieldsTypeName}>`\n : `${uploadTsName}<'${slug}'>`,\n )\n\n return {\n type: 'object',\n additionalProperties: false,\n properties: {\n id: { type: 'string' },\n type: { type: 'string', const: 'upload' },\n fields: fieldsSchema,\n format: formatSchema,\n relationTo: { type: 'string', const: slug },\n value: isInput\n ? { type: idType, description: 'The uploaded file ID.' }\n : {\n description:\n 'The uploaded file by ID (string or number). Populated to the full upload document when read at depth > 0.',\n oneOf: [{ type: idType }, { $ref: `#/$defs/${slug}` }],\n },\n version: versionSchema,\n },\n required: ['fields', 'format', 'id', 'relationTo', 'type', 'value', 'version'],\n }\n })\n\n let schema: JSONSchema4\n if (collectionVariants.length === 0) {\n // Fallback when no enabled upload collections.\n schema = {\n type: 'object',\n additionalProperties: true,\n properties: {\n type: { type: 'string', const: 'upload' },\n version: versionSchema,\n },\n required: ['type', 'version'],\n }\n } else {\n const baseSchema: JSONSchema4 =\n collectionVariants.length === 1 ? collectionVariants[0]! : { oneOf: collectionVariants }\n schema = { ...baseSchema, tsType: perCollectionTsTypes.join(' | ') }\n }\n\n return schema\n }\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"schema.js","names":["createHash","fieldsToJSONSchema","flattenAllFields","formatSchema","versionSchema","SERIALIZED_UPLOAD_NODE_TS","SERIALIZED_UPLOAD_NODE_INPUT_TS","hashUploadFields","schema","update","JSON","stringify","digest","slice","toUpperCase","createUploadNodeJSONSchema","props","collectionIDFieldTypes","config","i18n","interfaceNameDefinitions","typeStringDefinitions","variant","isInput","add","enabledCollectionSlugs","perCollectionTsTypes","collectionVariants","map","slug","idType","extraFields","collections","fields","flattenedExtra","extraFieldsSchema","length","properties","required","fieldsSchema","type","additionalProperties","fieldsTypeName","set","$ref","uploadTsName","push","id","const","format","relationTo","value","description","oneOf","version","baseSchema","tsType","join"],"sources":["../../../../src/features/upload/server/schema.ts"],"sourcesContent":["import type { JSONSchema4 } from 'json-schema'\nimport type {\n DataFromCollectionSlug,\n IDTypeForCollectionSlug,\n JsonObject,\n TypedUploadCollection,\n UploadCollectionSlug,\n} from 'payload'\n\nimport { createHash } from 'crypto'\nimport { fieldsToJSONSchema, flattenAllFields } from 'payload'\n\nimport type { LexicalElementFormat } from '../../../types/nodeTypes.js'\nimport type { JSONSchemaFn } from '../../typesServer.js'\nimport type { UploadFeatureServerProps } from './index.js'\n\nimport { formatSchema, versionSchema } from '../../../types/jsonSchemaHelpers.js'\n\nexport type UploadData<TFields extends JsonObject = JsonObject> = {\n [TCollectionSlug in UploadCollectionSlug]: {\n fields: TFields\n /** ID of this upload node — NOT the linked document's ID. */\n id: string\n relationTo: TCollectionSlug\n /** Either the document ID or the full populated document. */\n value: DataFromCollectionSlug<TCollectionSlug> | IDTypeForCollectionSlug<TCollectionSlug>\n }\n}[UploadCollectionSlug]\n\n/** @internal Adds a pending state to `UploadData`. */\nexport type Internal_UploadData<TFields extends JsonObject = JsonObject> = {\n pending?: {\n /** Bulk upload form ID. */\n formID: string\n /** `src` of the image DOM element. */\n src: string\n }\n} & UploadData<TFields>\n\n/**\n * More precise variant of {@link UploadData}. Replaces `UploadData` in v4.\n * @internal\n * @todo Replace UploadData with UploadDataImproved in 4.0\n */\nexport type UploadDataImproved<TFields extends JsonObject = JsonObject> = {\n [TCollectionSlug in UploadCollectionSlug]: {\n fields: TFields\n id: string\n relationTo: TCollectionSlug\n value: IDTypeForCollectionSlug<TCollectionSlug> | TypedUploadCollection[TCollectionSlug]\n }\n}[UploadCollectionSlug]\n\nexport type SerializedUploadNode<\n TSlugs extends UploadCollectionSlug = UploadCollectionSlug,\n TFields = { [k: string]: unknown },\n> = {\n [TSlug in TSlugs]: {\n relationTo: TSlug\n value: DataFromCollectionSlug<TSlug> | IDTypeForCollectionSlug<TSlug>\n }\n}[TSlugs] & {\n fields: TFields\n format: LexicalElementFormat\n id: string\n type: 'upload'\n version: number\n}\n\n/** MUST stay byte-for-byte in sync with the runtime `SerializedUploadNode` declared above. */\nconst SERIALIZED_UPLOAD_NODE_TS = `export type SerializedUploadNode<TSlugs extends keyof Config['collections'], TFields = { [k: string]: unknown }> = {\n type: 'upload';\n format: LexicalElementFormat;\n id: string;\n version: number;\n fields: TFields;\n} & {\n [TSlug in TSlugs]: {\n relationTo: TSlug;\n value: Config['collections'][TSlug]['id'] | Config['collections'][TSlug];\n };\n}[TSlugs];`\n\n/** Input variant of `SerializedUploadNode`: `value` is ID-only (you only ever write an ID). */\nconst SERIALIZED_UPLOAD_NODE_INPUT_TS = `export type SerializedUploadNodeInput<TSlugs extends keyof Config['collections'], TFields = { [k: string]: unknown }> = {\n type: 'upload';\n format: LexicalElementFormat;\n id: string;\n version: number;\n fields: TFields;\n} & {\n [TSlug in TSlugs]: {\n relationTo: TSlug;\n value: Config['collections'][TSlug]['id'];\n };\n}[TSlugs];`\n\nconst hashUploadFields = (schema: JSONSchema4): string =>\n createHash('sha256').update(JSON.stringify(schema)).digest('hex').slice(0, 8).toUpperCase()\n\nexport const createUploadNodeJSONSchema =\n (props: UploadFeatureServerProps): JSONSchemaFn =>\n ({\n collectionIDFieldTypes,\n config,\n i18n,\n interfaceNameDefinitions,\n typeStringDefinitions,\n variant,\n }) => {\n const isInput = variant === 'input'\n typeStringDefinitions.add(isInput ? SERIALIZED_UPLOAD_NODE_INPUT_TS : SERIALIZED_UPLOAD_NODE_TS)\n const { enabledCollectionSlugs } = props\n\n // Configured extra fields are registered as their own interface and referenced here, so the\n // generated TypeScript keeps them - the node-level `tsType` would otherwise erase `fields` to\n // `{ [k: string]: unknown }`. Mirrors how LinkFeature handles custom link fields.\n //\n // Each collection gets its own `SerializedUploadNode<'slug', Fields>` instantiation so the\n // generated union correctly pairs each `relationTo` with its own fields type. A single\n // `SerializedUploadNode<'a' | 'b', AFields | BFields>` would lose that pairing.\n const perCollectionTsTypes: string[] = []\n const collectionVariants: JSONSchema4[] = enabledCollectionSlugs.map((slug) => {\n const idType: 'number' | 'string' = collectionIDFieldTypes[slug] ?? 'string'\n const extraFields = props?.collections?.[slug]?.fields ?? []\n const flattenedExtra = flattenAllFields({ fields: extraFields })\n const extraFieldsSchema =\n flattenedExtra.length > 0 && config\n ? fieldsToJSONSchema({\n collectionIDFieldTypes,\n config,\n fields: flattenedExtra,\n i18n,\n interfaceNameDefinitions,\n typeStringDefinitions,\n variant,\n })\n : { properties: {}, required: [] }\n\n let fieldsSchema: JSONSchema4 = {\n type: 'object',\n additionalProperties: false,\n properties: extraFieldsSchema.properties,\n required: extraFieldsSchema.required,\n }\n let fieldsTypeName: string | undefined\n if (flattenedExtra.length > 0) {\n fieldsTypeName = `LexicalUploadFields_${hashUploadFields(fieldsSchema)}`\n interfaceNameDefinitions.set(fieldsTypeName, fieldsSchema)\n fieldsSchema = { $ref: `#/$defs/${fieldsTypeName}` }\n }\n\n const uploadTsName = isInput ? 'SerializedUploadNodeInput' : 'SerializedUploadNode'\n perCollectionTsTypes.push(\n fieldsTypeName\n ? `${uploadTsName}<'${slug}', ${fieldsTypeName}>`\n : `${uploadTsName}<'${slug}'>`,\n )\n\n return {\n type: 'object',\n additionalProperties: false,\n properties: {\n id: { type: 'string' },\n type: { type: 'string', const: 'upload' },\n fields: fieldsSchema,\n format: formatSchema,\n relationTo: { type: 'string', const: slug },\n value: isInput\n ? { type: idType, description: 'The uploaded file ID.' }\n : {\n description:\n 'The uploaded file by ID (string or number). Populated to the full upload document when read at depth > 0.',\n oneOf: [{ type: idType }, { $ref: `#/$defs/${slug}` }],\n },\n version: versionSchema,\n },\n required: ['fields', 'format', 'id', 'relationTo', 'type', 'value', 'version'],\n }\n })\n\n let schema: JSONSchema4\n if (collectionVariants.length === 0) {\n // Fallback when no enabled upload collections.\n schema = {\n type: 'object',\n additionalProperties: true,\n properties: {\n type: { type: 'string', const: 'upload' },\n version: versionSchema,\n },\n required: ['type', 'version'],\n }\n } else {\n const baseSchema: JSONSchema4 =\n collectionVariants.length === 1 ? collectionVariants[0]! : { oneOf: collectionVariants }\n schema = { ...baseSchema, tsType: perCollectionTsTypes.join(' | ') }\n }\n\n return schema\n }\n"],"mappings":"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","ignoreList":[]}