@payloadcms/richtext-lexical 3.23.0 → 3.24.0-canary.1cfcb91

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 (98) hide show
  1. package/dist/dependencyChecker.spec.js +0 -2
  2. package/dist/dependencyChecker.spec.js.map +1 -1
  3. package/dist/exports/client/{Field-ZQTPXWY3.js → Field-NNWFQETL.js} +2 -2
  4. package/dist/exports/client/bundled.css +1 -1
  5. package/dist/exports/client/chunk-EE27FURT.js +2 -0
  6. package/dist/exports/client/chunk-EE27FURT.js.map +7 -0
  7. package/dist/exports/client/chunk-OZ6Q4DWN.js +12 -0
  8. package/dist/exports/client/chunk-OZ6Q4DWN.js.map +7 -0
  9. package/dist/exports/client/componentInline-XEH2GDVO.js +2 -0
  10. package/dist/exports/client/index.js +10 -10
  11. package/dist/exports/client/index.js.map +3 -3
  12. package/dist/exports/react/components/RichText/converter/converters/table.d.ts.map +1 -1
  13. package/dist/exports/react/components/RichText/converter/converters/table.js +10 -7
  14. package/dist/exports/react/components/RichText/converter/converters/table.js.map +1 -1
  15. package/dist/exports/react/components/RichText/converter/converters/upload.d.ts.map +1 -1
  16. package/dist/exports/react/components/RichText/converter/converters/upload.js +14 -10
  17. package/dist/exports/react/components/RichText/converter/converters/upload.js.map +1 -1
  18. package/dist/features/blocks/client/component/index.d.ts.map +1 -1
  19. package/dist/features/blocks/client/component/index.js +5 -2
  20. package/dist/features/blocks/client/component/index.js.map +1 -1
  21. package/dist/features/blocks/client/componentInline/index.d.ts.map +1 -1
  22. package/dist/features/blocks/client/componentInline/index.js +5 -2
  23. package/dist/features/blocks/client/componentInline/index.js.map +1 -1
  24. package/dist/features/blocks/client/index.d.ts.map +1 -1
  25. package/dist/features/blocks/client/index.js +3 -2
  26. package/dist/features/blocks/client/index.js.map +1 -1
  27. package/dist/features/blocks/server/index.d.ts +3 -3
  28. package/dist/features/blocks/server/index.d.ts.map +1 -1
  29. package/dist/features/blocks/server/index.js +58 -38
  30. package/dist/features/blocks/server/index.js.map +1 -1
  31. package/dist/features/blocks/server/validate.d.ts +5 -0
  32. package/dist/features/blocks/server/validate.d.ts.map +1 -1
  33. package/dist/features/blocks/server/validate.js +8 -2
  34. package/dist/features/blocks/server/validate.js.map +1 -1
  35. package/dist/features/converters/html/field/index.d.ts.map +1 -1
  36. package/dist/features/converters/html/field/index.js +3 -43
  37. package/dist/features/converters/html/field/index.js.map +1 -1
  38. package/dist/features/experimental_table/server/index.js +1 -1
  39. package/dist/features/experimental_table/server/index.js.map +1 -1
  40. package/dist/features/indent/client/index.d.ts.map +1 -1
  41. package/dist/features/indent/client/index.js +23 -7
  42. package/dist/features/indent/client/index.js.map +1 -1
  43. package/dist/features/link/server/validate.d.ts.map +1 -1
  44. package/dist/features/link/server/validate.js +3 -2
  45. package/dist/features/link/server/validate.js.map +1 -1
  46. package/dist/features/upload/server/feature.server.d.ts.map +1 -1
  47. package/dist/features/upload/server/feature.server.js +4 -3
  48. package/dist/features/upload/server/feature.server.js.map +1 -1
  49. package/dist/features/upload/server/nodes/UploadNode.d.ts +19 -8
  50. package/dist/features/upload/server/nodes/UploadNode.d.ts.map +1 -1
  51. package/dist/features/upload/server/nodes/UploadNode.js.map +1 -1
  52. package/dist/features/upload/server/validate.d.ts.map +1 -1
  53. package/dist/features/upload/server/validate.js +5 -4
  54. package/dist/features/upload/server/validate.js.map +1 -1
  55. package/dist/field/bundled.css +1 -1
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +11 -2
  58. package/dist/index.js.map +1 -1
  59. package/dist/packages/@lexical/markdown/MarkdownExport.d.ts.map +1 -1
  60. package/dist/packages/@lexical/markdown/MarkdownExport.js +5 -5
  61. package/dist/packages/@lexical/markdown/MarkdownExport.js.map +1 -1
  62. package/dist/packages/@lexical/markdown/MarkdownImport.js +6 -5
  63. package/dist/packages/@lexical/markdown/MarkdownImport.js.map +1 -1
  64. package/dist/packages/@lexical/markdown/MarkdownShortcuts.d.ts.map +1 -1
  65. package/dist/packages/@lexical/markdown/MarkdownShortcuts.js +6 -4
  66. package/dist/packages/@lexical/markdown/MarkdownShortcuts.js.map +1 -1
  67. package/dist/packages/@lexical/markdown/MarkdownTransformers.js.map +1 -1
  68. package/dist/packages/@lexical/markdown/importTextFormatTransformer.d.ts.map +1 -1
  69. package/dist/packages/@lexical/markdown/importTextFormatTransformer.js +4 -1
  70. package/dist/packages/@lexical/markdown/importTextFormatTransformer.js.map +1 -1
  71. package/dist/packages/@lexical/markdown/importTextMatchTransformer.d.ts.map +1 -1
  72. package/dist/packages/@lexical/markdown/importTextMatchTransformer.js +1 -1
  73. package/dist/packages/@lexical/markdown/importTextMatchTransformer.js.map +1 -1
  74. package/dist/utilities/jsx/collectTopLevelJSXInLines.d.ts.map +1 -1
  75. package/dist/utilities/jsx/collectTopLevelJSXInLines.js +2 -1
  76. package/dist/utilities/jsx/collectTopLevelJSXInLines.js.map +1 -1
  77. package/dist/utilities/migrateSlateToLexical/index.js +8 -4
  78. package/dist/utilities/migrateSlateToLexical/index.js.map +1 -1
  79. package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.d.ts +3 -2
  80. package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.d.ts.map +1 -1
  81. package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.js +18 -13
  82. package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.js.map +1 -1
  83. package/dist/utilities/upgradeLexicalData/index.js +8 -4
  84. package/dist/utilities/upgradeLexicalData/index.js.map +1 -1
  85. package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.d.ts +3 -2
  86. package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.d.ts.map +1 -1
  87. package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.js +18 -13
  88. package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.js.map +1 -1
  89. package/dist/validate/hasText.js +1 -1
  90. package/dist/validate/hasText.js.map +1 -1
  91. package/package.json +7 -17
  92. package/dist/exports/client/chunk-CIY6PKN6.js +0 -12
  93. package/dist/exports/client/chunk-CIY6PKN6.js.map +0 -7
  94. package/dist/exports/client/chunk-KEEUF5NK.js +0 -2
  95. package/dist/exports/client/chunk-KEEUF5NK.js.map +0 -7
  96. package/dist/exports/client/componentInline-UG3ZWWJY.js +0 -2
  97. /package/dist/exports/client/{Field-ZQTPXWY3.js.map → Field-NNWFQETL.js.map} +0 -0
  98. /package/dist/exports/client/{componentInline-UG3ZWWJY.js.map → componentInline-XEH2GDVO.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["TableCellNode","TableNode","TableRowNode","sanitizeFields","createServerFeature","convertLexicalNodesToHTML","createNode","TableMarkdownTransformer","fields","name","type","defaultValue","required","EXPERIMENTAL_TableFeature","feature","config","isRoot","parentIsLocalized","validRelationships","collections","map","c","slug","sanitizedFields","requireFieldLevelRichTextEditor","ClientFeature","generateSchemaMap","schemaMap","Map","set","markdownTransformers","nodes","converters","html","converter","currentDepth","depth","draft","node","overrideAccess","parent","req","showHiddenFields","childrenText","lexicalNodes","children","nodeTypes","getType","tagName","headerState","headerStateClass","backgroundColor","colSpan","rowSpan","key"],"sources":["../../../../src/features/experimental_table/server/index.ts"],"sourcesContent":["import type {\n SerializedTableCellNode as _SerializedTableCellNode,\n SerializedTableNode as _SerializedTableNode,\n SerializedTableRowNode as _SerializedTableRowNode,\n} from '@lexical/table'\nimport type { Spread } from 'lexical'\nimport type { Config, Field, FieldSchemaMap } from 'payload'\n\nimport { TableCellNode, TableNode, TableRowNode } from '@lexical/table'\nimport { sanitizeFields } from 'payload'\n\nimport { createServerFeature } from '../../../utilities/createServerFeature.js'\nimport { convertLexicalNodesToHTML } from '../../converters/html/converter/index.js'\nimport { createNode } from '../../typeUtilities.js'\nimport { TableMarkdownTransformer } from '../markdownTransformer.js'\n\nconst fields: Field[] = [\n {\n name: 'rows',\n type: 'number',\n defaultValue: 5,\n required: true,\n },\n {\n name: 'columns',\n type: 'number',\n defaultValue: 5,\n required: true,\n },\n]\n\nexport type SerializedTableCellNode = Spread<\n {\n type: 'tablecell'\n },\n _SerializedTableCellNode\n>\n\nexport type SerializedTableNode = Spread<\n {\n type: 'table'\n },\n _SerializedTableNode\n>\n\nexport type SerializedTableRowNode = Spread<\n {\n type: 'tablerow'\n },\n _SerializedTableRowNode\n>\nexport const EXPERIMENTAL_TableFeature = createServerFeature({\n feature: async ({ config, isRoot, parentIsLocalized }) => {\n const validRelationships = config.collections.map((c) => c.slug) || []\n\n const sanitizedFields = await sanitizeFields({\n config: config as unknown as Config,\n fields,\n parentIsLocalized,\n requireFieldLevelRichTextEditor: isRoot,\n validRelationships,\n })\n return {\n ClientFeature: '@payloadcms/richtext-lexical/client#TableFeatureClient',\n generateSchemaMap: () => {\n const schemaMap: FieldSchemaMap = new Map()\n\n schemaMap.set('fields', {\n fields: sanitizedFields,\n })\n\n return schemaMap\n },\n markdownTransformers: [TableMarkdownTransformer],\n nodes: [\n createNode({\n converters: {\n html: {\n converter: async ({\n converters,\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n parent,\n req,\n showHiddenFields,\n }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n currentDepth,\n depth,\n draft,\n lexicalNodes: node.children,\n overrideAccess,\n parent: {\n ...node,\n parent,\n },\n req,\n showHiddenFields,\n })\n return `<table class=\"lexical-table\" style=\"border-collapse: collapse;\">${childrenText}</table>`\n },\n nodeTypes: [TableNode.getType()],\n },\n },\n node: TableNode,\n }),\n createNode({\n converters: {\n html: {\n converter: async ({\n converters,\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n parent,\n req,\n showHiddenFields,\n }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n currentDepth,\n depth,\n draft,\n lexicalNodes: node.children,\n overrideAccess,\n parent: {\n ...node,\n parent,\n },\n req,\n showHiddenFields,\n })\n\n const tagName = node.headerState > 0 ? 'th' : 'td'\n const headerStateClass = `lexical-table-cell-header-${node.headerState}`\n const backgroundColor = node.backgroundColor\n ? `background-color: ${node.backgroundColor};`\n : ''\n const colSpan = node.colSpan && node.colSpan > 1 ? `colspan=\"${node.colSpan}\"` : ''\n const rowSpan = node.rowSpan && node.rowSpan > 1 ? `rowspan=\"${node.rowSpan}\"` : ''\n\n return `<${tagName} class=\"lexical-table-cell ${headerStateClass}\" style=\"border: 1px solid #ccc; padding: 8px; ${backgroundColor}\" ${colSpan} ${rowSpan}>${childrenText}</${tagName}>`\n },\n nodeTypes: [TableCellNode.getType()],\n },\n },\n node: TableCellNode,\n }),\n createNode({\n converters: {\n html: {\n converter: async ({\n converters,\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n parent,\n req,\n showHiddenFields,\n }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n currentDepth,\n depth,\n draft,\n lexicalNodes: node.children,\n overrideAccess,\n parent: {\n ...node,\n parent,\n },\n req,\n showHiddenFields,\n })\n return `<tr class=\"lexical-table-row\">${childrenText}</tr>`\n },\n nodeTypes: [TableRowNode.getType()],\n },\n },\n node: TableRowNode,\n }),\n ],\n }\n },\n key: 'experimental_table',\n})\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["TableCellNode","TableNode","TableRowNode","sanitizeFields","createServerFeature","convertLexicalNodesToHTML","createNode","TableMarkdownTransformer","fields","name","type","defaultValue","required","EXPERIMENTAL_TableFeature","feature","config","isRoot","parentIsLocalized","validRelationships","collections","map","c","slug","sanitizedFields","requireFieldLevelRichTextEditor","ClientFeature","generateSchemaMap","schemaMap","Map","set","markdownTransformers","nodes","converters","html","converter","currentDepth","depth","draft","node","overrideAccess","parent","req","showHiddenFields","childrenText","lexicalNodes","children","nodeTypes","getType","tagName","headerState","headerStateClass","backgroundColor","colSpan","rowSpan","key"],"sources":["../../../../src/features/experimental_table/server/index.ts"],"sourcesContent":["import type {\n SerializedTableCellNode as _SerializedTableCellNode,\n SerializedTableNode as _SerializedTableNode,\n SerializedTableRowNode as _SerializedTableRowNode,\n} from '@lexical/table'\nimport type { Spread } from 'lexical'\nimport type { Config, Field, FieldSchemaMap } from 'payload'\n\nimport { TableCellNode, TableNode, TableRowNode } from '@lexical/table'\nimport { sanitizeFields } from 'payload'\n\nimport { createServerFeature } from '../../../utilities/createServerFeature.js'\nimport { convertLexicalNodesToHTML } from '../../converters/html/converter/index.js'\nimport { createNode } from '../../typeUtilities.js'\nimport { TableMarkdownTransformer } from '../markdownTransformer.js'\n\nconst fields: Field[] = [\n {\n name: 'rows',\n type: 'number',\n defaultValue: 5,\n required: true,\n },\n {\n name: 'columns',\n type: 'number',\n defaultValue: 5,\n required: true,\n },\n]\n\nexport type SerializedTableCellNode = Spread<\n {\n type: 'tablecell'\n },\n _SerializedTableCellNode\n>\n\nexport type SerializedTableNode = Spread<\n {\n type: 'table'\n },\n _SerializedTableNode\n>\n\nexport type SerializedTableRowNode = Spread<\n {\n type: 'tablerow'\n },\n _SerializedTableRowNode\n>\nexport const EXPERIMENTAL_TableFeature = createServerFeature({\n feature: async ({ config, isRoot, parentIsLocalized }) => {\n const validRelationships = config.collections.map((c) => c.slug) || []\n\n const sanitizedFields = await sanitizeFields({\n config: config as unknown as Config,\n fields,\n parentIsLocalized,\n requireFieldLevelRichTextEditor: isRoot,\n validRelationships,\n })\n return {\n ClientFeature: '@payloadcms/richtext-lexical/client#TableFeatureClient',\n generateSchemaMap: () => {\n const schemaMap: FieldSchemaMap = new Map()\n\n schemaMap.set('fields', {\n fields: sanitizedFields,\n })\n\n return schemaMap\n },\n markdownTransformers: [TableMarkdownTransformer],\n nodes: [\n createNode({\n converters: {\n html: {\n converter: async ({\n converters,\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n parent,\n req,\n showHiddenFields,\n }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n currentDepth,\n depth,\n draft,\n lexicalNodes: node.children,\n overrideAccess,\n parent: {\n ...node,\n parent,\n },\n req,\n showHiddenFields,\n })\n return `<div class=\"lexical-table-container\"><table class=\"lexical-table\" style=\"border-collapse: collapse;\">${childrenText}</table></div>`\n },\n nodeTypes: [TableNode.getType()],\n },\n },\n node: TableNode,\n }),\n createNode({\n converters: {\n html: {\n converter: async ({\n converters,\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n parent,\n req,\n showHiddenFields,\n }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n currentDepth,\n depth,\n draft,\n lexicalNodes: node.children,\n overrideAccess,\n parent: {\n ...node,\n parent,\n },\n req,\n showHiddenFields,\n })\n\n const tagName = node.headerState > 0 ? 'th' : 'td'\n const headerStateClass = `lexical-table-cell-header-${node.headerState}`\n const backgroundColor = node.backgroundColor\n ? `background-color: ${node.backgroundColor};`\n : ''\n const colSpan = node.colSpan && node.colSpan > 1 ? `colspan=\"${node.colSpan}\"` : ''\n const rowSpan = node.rowSpan && node.rowSpan > 1 ? `rowspan=\"${node.rowSpan}\"` : ''\n\n return `<${tagName} class=\"lexical-table-cell ${headerStateClass}\" style=\"border: 1px solid #ccc; padding: 8px; ${backgroundColor}\" ${colSpan} ${rowSpan}>${childrenText}</${tagName}>`\n },\n nodeTypes: [TableCellNode.getType()],\n },\n },\n node: TableCellNode,\n }),\n createNode({\n converters: {\n html: {\n converter: async ({\n converters,\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n parent,\n req,\n showHiddenFields,\n }) => {\n const childrenText = await convertLexicalNodesToHTML({\n converters,\n currentDepth,\n depth,\n draft,\n lexicalNodes: node.children,\n overrideAccess,\n parent: {\n ...node,\n parent,\n },\n req,\n showHiddenFields,\n })\n return `<tr class=\"lexical-table-row\">${childrenText}</tr>`\n },\n nodeTypes: [TableRowNode.getType()],\n },\n },\n node: TableRowNode,\n }),\n ],\n }\n },\n key: 'experimental_table',\n})\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/indent/client/index.tsx"],"names":[],"mappings":"AAyDA,eAAO,MAAM,mBAAmB,oFAa9B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/indent/client/index.tsx"],"names":[],"mappings":"AAkFA,eAAO,MAAM,mBAAmB,oFAa9B,CAAA"}
@@ -1,7 +1,8 @@
1
1
  'use client';
2
2
 
3
3
  import { TabIndentationPlugin } from '@lexical/react/LexicalTabIndentationPlugin';
4
- import { INDENT_CONTENT_COMMAND, OUTDENT_CONTENT_COMMAND } from 'lexical';
4
+ import { $findMatchingParent } from '@lexical/utils';
5
+ import { $isElementNode, $isRangeSelection, INDENT_CONTENT_COMMAND, OUTDENT_CONTENT_COMMAND } from 'lexical';
5
6
  import { IndentDecreaseIcon } from '../../../lexical/ui/icons/IndentDecrease/index.js';
6
7
  import { IndentIncreaseIcon } from '../../../lexical/ui/icons/IndentIncrease/index.js';
7
8
  import { createClientFeature } from '../../../utilities/createClientFeature.js';
@@ -12,17 +13,32 @@ const toolbarGroups = [toolbarIndentGroupWithItems([{
12
13
  isEnabled: ({
13
14
  selection
14
15
  }) => {
15
- if (!selection || !selection?.getNodes()?.length) {
16
+ const nodes = selection?.getNodes();
17
+ if (!nodes?.length) {
16
18
  return false;
17
19
  }
18
- for (const node of selection.getNodes()) {
19
- const parent = node.getParentOrThrow();
20
- // If at least one node is indented, this should be active
21
- if ('__indent' in node && node.__indent > 0 || '__indent' in parent && parent.__indent > 0) {
20
+ let atLeastOneNodeCanOutdent = false;
21
+ const isIndentable = node => $isElementNode(node) && node.canIndent();
22
+ for (const node of nodes) {
23
+ if (isIndentable(node)) {
24
+ if (node.getIndent() <= 0) {
25
+ return false;
26
+ } else {
27
+ atLeastOneNodeCanOutdent = true;
28
+ }
29
+ }
30
+ }
31
+ if (!atLeastOneNodeCanOutdent && $isRangeSelection(selection)) {
32
+ const anchorNode = selection.anchor.getNode();
33
+ if ($findMatchingParent(anchorNode, node => isIndentable(node) && node.getIndent() > 0)) {
34
+ return true;
35
+ }
36
+ const focusNode = selection.focus.getNode();
37
+ if ($findMatchingParent(focusNode, node => isIndentable(node) && node.getIndent() > 0)) {
22
38
  return true;
23
39
  }
24
40
  }
25
- return false;
41
+ return atLeastOneNodeCanOutdent;
26
42
  },
27
43
  key: 'indentDecrease',
28
44
  label: ({
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["TabIndentationPlugin","INDENT_CONTENT_COMMAND","OUTDENT_CONTENT_COMMAND","IndentDecreaseIcon","IndentIncreaseIcon","createClientFeature","toolbarIndentGroupWithItems","toolbarGroups","ChildComponent","isActive","isEnabled","selection","getNodes","length","node","parent","getParentOrThrow","__indent","key","label","i18n","t","onSelect","editor","dispatchCommand","undefined","order","IndentFeatureClient","plugins","Component","position","toolbarFixed","groups","toolbarInline"],"sources":["../../../../src/features/indent/client/index.tsx"],"sourcesContent":["'use client'\n\nimport { TabIndentationPlugin } from '@lexical/react/LexicalTabIndentationPlugin'\nimport { INDENT_CONTENT_COMMAND, OUTDENT_CONTENT_COMMAND } from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { IndentDecreaseIcon } from '../../../lexical/ui/icons/IndentDecrease/index.js'\nimport { IndentIncreaseIcon } from '../../../lexical/ui/icons/IndentIncrease/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarIndentGroupWithItems } from './toolbarIndentGroup.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarIndentGroupWithItems([\n {\n ChildComponent: IndentDecreaseIcon,\n isActive: () => false,\n isEnabled: ({ selection }) => {\n if (!selection || !selection?.getNodes()?.length) {\n return false\n }\n for (const node of selection.getNodes()) {\n const parent = node.getParentOrThrow()\n // If at least one node is indented, this should be active\n if (\n ('__indent' in node && (node.__indent as number) > 0) ||\n ('__indent' in parent && parent.__indent > 0)\n ) {\n return true\n }\n }\n return false\n },\n key: 'indentDecrease',\n label: ({ i18n }) => {\n return i18n.t('lexical:indent:decreaseLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(OUTDENT_CONTENT_COMMAND, undefined)\n },\n order: 1,\n },\n {\n ChildComponent: IndentIncreaseIcon,\n isActive: () => false,\n key: 'indentIncrease',\n label: ({ i18n }) => {\n return i18n.t('lexical:indent:increaseLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INDENT_CONTENT_COMMAND, undefined)\n },\n order: 2,\n },\n ]),\n]\n\nexport const IndentFeatureClient = createClientFeature({\n plugins: [\n {\n Component: TabIndentationPlugin,\n position: 'normal',\n },\n ],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n"],"mappings":"AAAA;;AAEA,SAASA,oBAAoB,QAAQ;AACrC,SAASC,sBAAsB,EAAEC,uBAAuB,QAAQ;AAIhE,SAASC,kBAAkB,QAAQ;AACnC,SAASC,kBAAkB,QAAQ;AACnC,SAASC,mBAAmB,QAAQ;AACpC,SAASC,2BAA2B,QAAQ;AAE5C,MAAMC,aAAA,GAAgC,CACpCD,2BAAA,CAA4B,CAC1B;EACEE,cAAA,EAAgBL,kBAAA;EAChBM,QAAA,EAAUA,CAAA,KAAM;EAChBC,SAAA,EAAWA,CAAC;IAAEC;EAAS,CAAE;IACvB,IAAI,CAACA,SAAA,IAAa,CAACA,SAAA,EAAWC,QAAA,IAAYC,MAAA,EAAQ;MAChD,OAAO;IACT;IACA,KAAK,MAAMC,IAAA,IAAQH,SAAA,CAAUC,QAAQ,IAAI;MACvC,MAAMG,MAAA,GAASD,IAAA,CAAKE,gBAAgB;MACpC;MACA,IACE,UAAC,IAAcF,IAAA,IAAQA,IAAC,CAAKG,QAAQ,GAAc,KAClD,cAAcF,MAAA,IAAUA,MAAA,CAAOE,QAAQ,GAAG,GAC3C;QACA,OAAO;MACT;IACF;IACA,OAAO;EACT;EACAC,GAAA,EAAK;EACLC,KAAA,EAAOA,CAAC;IAAEC;EAAI,CAAE;IACd,OAAOA,IAAA,CAAKC,CAAC,CAAC;EAChB;EACAC,QAAA,EAAUA,CAAC;IAAEC;EAAM,CAAE;IACnBA,MAAA,CAAOC,eAAe,CAACtB,uBAAA,EAAyBuB,SAAA;EAClD;EACAC,KAAA,EAAO;AACT,GACA;EACElB,cAAA,EAAgBJ,kBAAA;EAChBK,QAAA,EAAUA,CAAA,KAAM;EAChBS,GAAA,EAAK;EACLC,KAAA,EAAOA,CAAC;IAAEC;EAAI,CAAE;IACd,OAAOA,IAAA,CAAKC,CAAC,CAAC;EAChB;EACAC,QAAA,EAAUA,CAAC;IAAEC;EAAM,CAAE;IACnBA,MAAA,CAAOC,eAAe,CAACvB,sBAAA,EAAwBwB,SAAA;EACjD;EACAC,KAAA,EAAO;AACT,EACD,EACF;AAED,OAAO,MAAMC,mBAAA,GAAsBtB,mBAAA,CAAoB;EACrDuB,OAAA,EAAS,CACP;IACEC,SAAA,EAAW7B,oBAAA;IACX8B,QAAA,EAAU;EACZ,EACD;EACDC,YAAA,EAAc;IACZC,MAAA,EAAQzB;EACV;EACA0B,aAAA,EAAe;IACbD,MAAA,EAAQzB;EACV;AACF","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["TabIndentationPlugin","$findMatchingParent","$isElementNode","$isRangeSelection","INDENT_CONTENT_COMMAND","OUTDENT_CONTENT_COMMAND","IndentDecreaseIcon","IndentIncreaseIcon","createClientFeature","toolbarIndentGroupWithItems","toolbarGroups","ChildComponent","isActive","isEnabled","selection","nodes","getNodes","length","atLeastOneNodeCanOutdent","isIndentable","node","canIndent","getIndent","anchorNode","anchor","getNode","focusNode","focus","key","label","i18n","t","onSelect","editor","dispatchCommand","undefined","order","IndentFeatureClient","plugins","Component","position","toolbarFixed","groups","toolbarInline"],"sources":["../../../../src/features/indent/client/index.tsx"],"sourcesContent":["'use client'\n\nimport type { ElementNode, LexicalNode } from 'lexical'\n\nimport { TabIndentationPlugin } from '@lexical/react/LexicalTabIndentationPlugin'\nimport { $findMatchingParent } from '@lexical/utils'\nimport {\n $isElementNode,\n $isRangeSelection,\n INDENT_CONTENT_COMMAND,\n OUTDENT_CONTENT_COMMAND,\n} from 'lexical'\n\nimport type { ToolbarGroup } from '../../toolbars/types.js'\n\nimport { IndentDecreaseIcon } from '../../../lexical/ui/icons/IndentDecrease/index.js'\nimport { IndentIncreaseIcon } from '../../../lexical/ui/icons/IndentIncrease/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { toolbarIndentGroupWithItems } from './toolbarIndentGroup.js'\n\nconst toolbarGroups: ToolbarGroup[] = [\n toolbarIndentGroupWithItems([\n {\n ChildComponent: IndentDecreaseIcon,\n isActive: () => false,\n isEnabled: ({ selection }) => {\n const nodes = selection?.getNodes()\n if (!nodes?.length) {\n return false\n }\n let atLeastOneNodeCanOutdent = false\n const isIndentable = (node: LexicalNode): node is ElementNode =>\n $isElementNode(node) && node.canIndent()\n for (const node of nodes) {\n if (isIndentable(node)) {\n if (node.getIndent() <= 0) {\n return false\n } else {\n atLeastOneNodeCanOutdent = true\n }\n }\n }\n if (!atLeastOneNodeCanOutdent && $isRangeSelection(selection)) {\n const anchorNode = selection.anchor.getNode()\n if (\n $findMatchingParent(anchorNode, (node) => isIndentable(node) && node.getIndent() > 0)\n ) {\n return true\n }\n const focusNode = selection.focus.getNode()\n if (\n $findMatchingParent(focusNode, (node) => isIndentable(node) && node.getIndent() > 0)\n ) {\n return true\n }\n }\n return atLeastOneNodeCanOutdent\n },\n key: 'indentDecrease',\n label: ({ i18n }) => {\n return i18n.t('lexical:indent:decreaseLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(OUTDENT_CONTENT_COMMAND, undefined)\n },\n order: 1,\n },\n {\n ChildComponent: IndentIncreaseIcon,\n isActive: () => false,\n key: 'indentIncrease',\n label: ({ i18n }) => {\n return i18n.t('lexical:indent:increaseLabel')\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INDENT_CONTENT_COMMAND, undefined)\n },\n order: 2,\n },\n ]),\n]\n\nexport const IndentFeatureClient = createClientFeature({\n plugins: [\n {\n Component: TabIndentationPlugin,\n position: 'normal',\n },\n ],\n toolbarFixed: {\n groups: toolbarGroups,\n },\n toolbarInline: {\n groups: toolbarGroups,\n },\n})\n"],"mappings":"AAAA;;AAIA,SAASA,oBAAoB,QAAQ;AACrC,SAASC,mBAAmB,QAAQ;AACpC,SACEC,cAAc,EACdC,iBAAiB,EACjBC,sBAAsB,EACtBC,uBAAuB,QAClB;AAIP,SAASC,kBAAkB,QAAQ;AACnC,SAASC,kBAAkB,QAAQ;AACnC,SAASC,mBAAmB,QAAQ;AACpC,SAASC,2BAA2B,QAAQ;AAE5C,MAAMC,aAAA,GAAgC,CACpCD,2BAAA,CAA4B,CAC1B;EACEE,cAAA,EAAgBL,kBAAA;EAChBM,QAAA,EAAUA,CAAA,KAAM;EAChBC,SAAA,EAAWA,CAAC;IAAEC;EAAS,CAAE;IACvB,MAAMC,KAAA,GAAQD,SAAA,EAAWE,QAAA;IACzB,IAAI,CAACD,KAAA,EAAOE,MAAA,EAAQ;MAClB,OAAO;IACT;IACA,IAAIC,wBAAA,GAA2B;IAC/B,MAAMC,YAAA,GAAgBC,IAAA,IACpBlB,cAAA,CAAekB,IAAA,KAASA,IAAA,CAAKC,SAAS;IACxC,KAAK,MAAMD,IAAA,IAAQL,KAAA,EAAO;MACxB,IAAII,YAAA,CAAaC,IAAA,GAAO;QACtB,IAAIA,IAAA,CAAKE,SAAS,MAAM,GAAG;UACzB,OAAO;QACT,OAAO;UACLJ,wBAAA,GAA2B;QAC7B;MACF;IACF;IACA,IAAI,CAACA,wBAAA,IAA4Bf,iBAAA,CAAkBW,SAAA,GAAY;MAC7D,MAAMS,UAAA,GAAaT,SAAA,CAAUU,MAAM,CAACC,OAAO;MAC3C,IACExB,mBAAA,CAAoBsB,UAAA,EAAaH,IAAA,IAASD,YAAA,CAAaC,IAAA,KAASA,IAAA,CAAKE,SAAS,KAAK,IACnF;QACA,OAAO;MACT;MACA,MAAMI,SAAA,GAAYZ,SAAA,CAAUa,KAAK,CAACF,OAAO;MACzC,IACExB,mBAAA,CAAoByB,SAAA,EAAYN,IAAA,IAASD,YAAA,CAAaC,IAAA,KAASA,IAAA,CAAKE,SAAS,KAAK,IAClF;QACA,OAAO;MACT;IACF;IACA,OAAOJ,wBAAA;EACT;EACAU,GAAA,EAAK;EACLC,KAAA,EAAOA,CAAC;IAAEC;EAAI,CAAE;IACd,OAAOA,IAAA,CAAKC,CAAC,CAAC;EAChB;EACAC,QAAA,EAAUA,CAAC;IAAEC;EAAM,CAAE;IACnBA,MAAA,CAAOC,eAAe,CAAC7B,uBAAA,EAAyB8B,SAAA;EAClD;EACAC,KAAA,EAAO;AACT,GACA;EACEzB,cAAA,EAAgBJ,kBAAA;EAChBK,QAAA,EAAUA,CAAA,KAAM;EAChBgB,GAAA,EAAK;EACLC,KAAA,EAAOA,CAAC;IAAEC;EAAI,CAAE;IACd,OAAOA,IAAA,CAAKC,CAAC,CAAC;EAChB;EACAC,QAAA,EAAUA,CAAC;IAAEC;EAAM,CAAE;IACnBA,MAAA,CAAOC,eAAe,CAAC9B,sBAAA,EAAwB+B,SAAA;EACjD;EACAC,KAAA,EAAO;AACT,EACD,EACF;AAED,OAAO,MAAMC,mBAAA,GAAsB7B,mBAAA,CAAoB;EACrD8B,OAAA,EAAS,CACP;IACEC,SAAA,EAAWvC,oBAAA;IACXwC,QAAA,EAAU;EACZ,EACD;EACDC,YAAA,EAAc;IACZC,MAAA,EAAQhC;EACV;EACAiC,aAAA,EAAe;IACbD,MAAA,EAAQhC;EACV;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../src/features/link/server/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAIpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACnF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAExD,eAAO,MAAM,cAAc,UAClB,sBAAsB,8BACD,KAAK,EAAE,KAClC,cAAc,CAAC,sBAAsB,GAAG,kBAAkB,CA2C5D,CAAA"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../src/features/link/server/validate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAIpC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACnF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAA;AAExD,eAAO,MAAM,cAAc,UAClB,sBAAsB,8BACD,KAAK,EAAE,KAClC,cAAc,CAAC,sBAAsB,GAAG,kBAAkB,CA4C5D,CAAA"}
@@ -33,8 +33,9 @@ export const linkValidation = (props, sanitizedFieldsWithoutText) => {
33
33
  });
34
34
  const errorPathsSet = new Set();
35
35
  for (const fieldKey in result) {
36
- if (result[fieldKey].errorPaths?.length) {
37
- for (const errorPath of result[fieldKey].errorPaths) {
36
+ const fieldState = result[fieldKey];
37
+ if (fieldState?.errorPaths?.length) {
38
+ for (const errorPath of fieldState.errorPaths) {
38
39
  errorPathsSet.add(errorPath);
39
40
  }
40
41
  }
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","names":["fieldSchemasToFormState","linkValidation","props","sanitizedFieldsWithoutText","node","validation","options","id","collectionSlug","data","operation","preferences","req","result","fields","documentData","fieldSchemaMap","undefined","initialBlockData","permissions","renderAllFields","schemaPath","errorPathsSet","Set","fieldKey","errorPaths","length","errorPath","add","Array","from","join"],"sources":["../../../../src/features/link/server/validate.ts"],"sourcesContent":["import type { Field } from 'payload'\n\nimport { fieldSchemasToFormState } from '@payloadcms/ui/forms/fieldSchemasToFormState'\n\nimport type { NodeValidation } from '../../typesServer.js'\nimport type { SerializedAutoLinkNode, SerializedLinkNode } from '../nodes/types.js'\nimport type { LinkFeatureServerProps } from './index.js'\n\nexport const linkValidation = (\n props: LinkFeatureServerProps,\n sanitizedFieldsWithoutText: Field[],\n): NodeValidation<SerializedAutoLinkNode | SerializedLinkNode> => {\n return async ({\n node,\n validation: {\n options: { id, collectionSlug, data, operation, preferences, req },\n },\n }) => {\n /**\n * Run fieldSchemasToFormState as that properly validates link fields and link sub-fields\n */\n\n const result = await fieldSchemasToFormState({\n id,\n collectionSlug,\n data: node.fields,\n documentData: data,\n fields: sanitizedFieldsWithoutText, // Sanitized in feature.server.ts\n fieldSchemaMap: undefined,\n initialBlockData: node.fields,\n operation: operation === 'create' || operation === 'update' ? operation : 'update',\n permissions: {},\n preferences,\n renderAllFields: false,\n req,\n schemaPath: '',\n })\n\n const errorPathsSet = new Set<string>()\n for (const fieldKey in result) {\n if (result[fieldKey].errorPaths?.length) {\n for (const errorPath of result[fieldKey].errorPaths) {\n errorPathsSet.add(errorPath)\n }\n }\n }\n const errorPaths = Array.from(errorPathsSet)\n\n if (errorPaths.length) {\n return 'The following fields are invalid: ' + errorPaths.join(', ')\n }\n\n return true\n }\n}\n"],"mappings":"AAEA,SAASA,uBAAuB,QAAQ;AAMxC,OAAO,MAAMC,cAAA,GAAiBA,CAC5BC,KAAA,EACAC,0BAAA;EAEA,OAAO,OAAO;IACZC,IAAI;IACJC,UAAA,EAAY;MACVC,OAAA,EAAS;QAAEC,EAAE;QAAEC,cAAc;QAAEC,IAAI;QAAEC,SAAS;QAAEC,WAAW;QAAEC;MAAG;IAAE;EACnE,CACF;IACC;;;IAIA,MAAMC,MAAA,GAAS,MAAMb,uBAAA,CAAwB;MAC3CO,EAAA;MACAC,cAAA;MACAC,IAAA,EAAML,IAAA,CAAKU,MAAM;MACjBC,YAAA,EAAcN,IAAA;MACdK,MAAA,EAAQX,0BAAA;MACRa,cAAA,EAAgBC,SAAA;MAChBC,gBAAA,EAAkBd,IAAA,CAAKU,MAAM;MAC7BJ,SAAA,EAAWA,SAAA,KAAc,YAAYA,SAAA,KAAc,WAAWA,SAAA,GAAY;MAC1ES,WAAA,EAAa,CAAC;MACdR,WAAA;MACAS,eAAA,EAAiB;MACjBR,GAAA;MACAS,UAAA,EAAY;IACd;IAEA,MAAMC,aAAA,GAAgB,IAAIC,GAAA;IAC1B,KAAK,MAAMC,QAAA,IAAYX,MAAA,EAAQ;MAC7B,IAAIA,MAAM,CAACW,QAAA,CAAS,CAACC,UAAU,EAAEC,MAAA,EAAQ;QACvC,KAAK,MAAMC,SAAA,IAAad,MAAM,CAACW,QAAA,CAAS,CAACC,UAAU,EAAE;UACnDH,aAAA,CAAcM,GAAG,CAACD,SAAA;QACpB;MACF;IACF;IACA,MAAMF,UAAA,GAAaI,KAAA,CAAMC,IAAI,CAACR,aAAA;IAE9B,IAAIG,UAAA,CAAWC,MAAM,EAAE;MACrB,OAAO,uCAAuCD,UAAA,CAAWM,IAAI,CAAC;IAChE;IAEA,OAAO;EACT;AACF","ignoreList":[]}
1
+ {"version":3,"file":"validate.js","names":["fieldSchemasToFormState","linkValidation","props","sanitizedFieldsWithoutText","node","validation","options","id","collectionSlug","data","operation","preferences","req","result","fields","documentData","fieldSchemaMap","undefined","initialBlockData","permissions","renderAllFields","schemaPath","errorPathsSet","Set","fieldKey","fieldState","errorPaths","length","errorPath","add","Array","from","join"],"sources":["../../../../src/features/link/server/validate.ts"],"sourcesContent":["import type { Field } from 'payload'\n\nimport { fieldSchemasToFormState } from '@payloadcms/ui/forms/fieldSchemasToFormState'\n\nimport type { NodeValidation } from '../../typesServer.js'\nimport type { SerializedAutoLinkNode, SerializedLinkNode } from '../nodes/types.js'\nimport type { LinkFeatureServerProps } from './index.js'\n\nexport const linkValidation = (\n props: LinkFeatureServerProps,\n sanitizedFieldsWithoutText: Field[],\n): NodeValidation<SerializedAutoLinkNode | SerializedLinkNode> => {\n return async ({\n node,\n validation: {\n options: { id, collectionSlug, data, operation, preferences, req },\n },\n }) => {\n /**\n * Run fieldSchemasToFormState as that properly validates link fields and link sub-fields\n */\n\n const result = await fieldSchemasToFormState({\n id,\n collectionSlug,\n data: node.fields,\n documentData: data,\n fields: sanitizedFieldsWithoutText, // Sanitized in feature.server.ts\n fieldSchemaMap: undefined,\n initialBlockData: node.fields,\n operation: operation === 'create' || operation === 'update' ? operation : 'update',\n permissions: {},\n preferences,\n renderAllFields: false,\n req,\n schemaPath: '',\n })\n\n const errorPathsSet = new Set<string>()\n for (const fieldKey in result) {\n const fieldState = result[fieldKey]\n if (fieldState?.errorPaths?.length) {\n for (const errorPath of fieldState.errorPaths) {\n errorPathsSet.add(errorPath)\n }\n }\n }\n const errorPaths = Array.from(errorPathsSet)\n\n if (errorPaths.length) {\n return 'The following fields are invalid: ' + errorPaths.join(', ')\n }\n\n return true\n }\n}\n"],"mappings":"AAEA,SAASA,uBAAuB,QAAQ;AAMxC,OAAO,MAAMC,cAAA,GAAiBA,CAC5BC,KAAA,EACAC,0BAAA;EAEA,OAAO,OAAO;IACZC,IAAI;IACJC,UAAA,EAAY;MACVC,OAAA,EAAS;QAAEC,EAAE;QAAEC,cAAc;QAAEC,IAAI;QAAEC,SAAS;QAAEC,WAAW;QAAEC;MAAG;IAAE;EACnE,CACF;IACC;;;IAIA,MAAMC,MAAA,GAAS,MAAMb,uBAAA,CAAwB;MAC3CO,EAAA;MACAC,cAAA;MACAC,IAAA,EAAML,IAAA,CAAKU,MAAM;MACjBC,YAAA,EAAcN,IAAA;MACdK,MAAA,EAAQX,0BAAA;MACRa,cAAA,EAAgBC,SAAA;MAChBC,gBAAA,EAAkBd,IAAA,CAAKU,MAAM;MAC7BJ,SAAA,EAAWA,SAAA,KAAc,YAAYA,SAAA,KAAc,WAAWA,SAAA,GAAY;MAC1ES,WAAA,EAAa,CAAC;MACdR,WAAA;MACAS,eAAA,EAAiB;MACjBR,GAAA;MACAS,UAAA,EAAY;IACd;IAEA,MAAMC,aAAA,GAAgB,IAAIC,GAAA;IAC1B,KAAK,MAAMC,QAAA,IAAYX,MAAA,EAAQ;MAC7B,MAAMY,UAAA,GAAaZ,MAAM,CAACW,QAAA,CAAS;MACnC,IAAIC,UAAA,EAAYC,UAAA,EAAYC,MAAA,EAAQ;QAClC,KAAK,MAAMC,SAAA,IAAaH,UAAA,CAAWC,UAAU,EAAE;UAC7CJ,aAAA,CAAcO,GAAG,CAACD,SAAA;QACpB;MACF;IACF;IACA,MAAMF,UAAA,GAAaI,KAAA,CAAMC,IAAI,CAACT,aAAA;IAE9B,IAAII,UAAA,CAAWC,MAAM,EAAE;MACrB,OAAO,uCAAuCD,UAAA,CAAWM,IAAI,CAAC;IAChE;IAEA,OAAO;EACT;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"feature.server.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/server/feature.server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEd,KAAK,EAMN,MAAM,SAAS,CAAA;AAIhB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAA;AAU3E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,CAAC,EAAE;QACZ,CAAC,UAAU,EAAE,cAAc,GAAG;YAC5B,MAAM,EAAE,KAAK,EAAE,CAAA;SAChB,CAAA;KACF,CAAA;IACD;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AASD,eAAO,MAAM,aAAa,gIAkPxB,CAAA"}
1
+ {"version":3,"file":"feature.server.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/server/feature.server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEd,KAAK,EAMN,MAAM,SAAS,CAAA;AAIhB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAA;AAU3E,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,CAAC,EAAE;QACZ,CAAC,UAAU,EAAE,cAAc,GAAG;YAC5B,MAAM,EAAE,KAAK,EAAE,CAAA;SAChB,CAAA;KACF,CAAA;IACD;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AASD,eAAO,MAAM,aAAa,gIAiPxB,CAAA"}
@@ -121,7 +121,7 @@ export const UploadFeature = createServerFeature({
121
121
  let pictureHTML = '<picture>';
122
122
  // Iterate through each size in the data.sizes object
123
123
  for (const size in uploadDocument.value?.sizes) {
124
- const imageSize = uploadDocument.value?.sizes[size];
124
+ const imageSize = uploadDocument.value.sizes[size];
125
125
  // Skip if any property of the size object is null
126
126
  if (!imageSize.width || !imageSize.height || !imageSize.mimeType || !imageSize.filesize || !imageSize.filename || !imageSize.url) {
127
127
  continue;
@@ -147,7 +147,8 @@ export const UploadFeature = createServerFeature({
147
147
  if (!node) {
148
148
  let allSubFields = [];
149
149
  for (const collection in props?.collections) {
150
- allSubFields = allSubFields.concat(props?.collections?.[collection]?.fields);
150
+ const collectionFields = props.collections[collection].fields;
151
+ allSubFields = allSubFields.concat(collectionFields);
151
152
  }
152
153
  return allSubFields;
153
154
  }
@@ -188,7 +189,7 @@ export const UploadFeature = createServerFeature({
188
189
  if (!collection) {
189
190
  return node;
190
191
  }
191
- // @ts-expect-error
192
+ // @ts-expect-error - Fix in Payload v4
192
193
  const id = node?.value?.id || node?.value // for backwards-compatibility
193
194
  ;
194
195
  const populateDepth = props?.maxDepth !== undefined && props?.maxDepth < depth ? props?.maxDepth : depth;
@@ -1 +1 @@
1
- {"version":3,"file":"feature.server.js","names":["sanitizeFields","populate","createServerFeature","createNode","uploadPopulationPromiseHOC","i18n","UploadServerNode","uploadValidation","getAbsoluteURL","url","payload","startsWith","config","serverURL","UploadFeature","feature","_config","isRoot","parentIsLocalized","props","collections","clientProps","collection","hasExtraFields","fields","length","validRelationships","map","c","slug","collectionKey","requireFieldLevelRichTextEditor","ClientFeature","clientFeatureProps","generateSchemaMap","schemaMap","Map","set","nodes","converters","html","converter","currentDepth","depth","draft","node","overrideAccess","req","showHiddenFields","id","value","uploadDocument","collectionSlug","relationTo","data","key","ignored","console","error","mimeType","filename","sizes","Object","keys","width","height","pictureHTML","size","imageSize","filesize","imageSizeURL","nodeTypes","getType","getSubFields","allSubFields","concat","collectionFieldSchema","Array","isArray","getSubFieldsData","graphQLPopulationPromises","hooks","afterRead","populateArg","populationPromises","populateDepth","maxDepth","undefined","push","select","defaultPopulate","validations","sanitizedServerFeatureProps"],"sources":["../../../../src/features/upload/server/feature.server.ts"],"sourcesContent":["import type {\n CollectionSlug,\n Config,\n Field,\n FieldSchemaMap,\n FileData,\n FileSize,\n Payload,\n TypeWithID,\n} from 'payload'\n\nimport { sanitizeFields } from 'payload'\n\nimport type { UploadFeaturePropsClient } from '../client/feature.client.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 { UploadServerNode } from './nodes/UploadNode.js'\nimport { uploadValidation } from './validate.js'\n\nexport type UploadFeatureProps = {\n collections?: {\n [collection: CollectionSlug]: {\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}\n\n/**\n * Get the absolute URL for an upload URL by potentially prepending the serverURL\n */\nfunction getAbsoluteURL(url: string, payload: Payload): string {\n return url?.startsWith('http') ? url : (payload?.config?.serverURL || '') + url\n}\n\nexport const UploadFeature = createServerFeature<\n UploadFeatureProps,\n UploadFeatureProps,\n UploadFeaturePropsClient\n>({\n feature: async ({ config: _config, isRoot, parentIsLocalized, props }) => {\n if (!props) {\n props = { collections: {} }\n }\n\n const clientProps: UploadFeaturePropsClient = {\n collections: {},\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 = await 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 nodes: [\n createNode({\n converters: {\n html: {\n converter: async ({\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n req,\n showHiddenFields,\n }) => {\n // @ts-expect-error - for backwards-compatibility\n const id = node?.value?.id || node?.value\n\n if (req?.payload) {\n const uploadDocument: {\n value?: FileData & TypeWithID\n } = {}\n\n try {\n await populate({\n id,\n collectionSlug: node.relationTo,\n currentDepth,\n data: uploadDocument,\n depth,\n draft,\n key: 'value',\n overrideAccess,\n req,\n showHiddenFields,\n })\n } catch (ignored) {\n // eslint-disable-next-line no-console\n console.error(\n 'Lexical upload node HTML converter: error fetching upload file',\n ignored,\n 'Node:',\n node,\n )\n return `<img />`\n }\n\n const url = getAbsoluteURL(uploadDocument?.value?.url ?? '', req?.payload)\n\n /**\n * If the upload is not an image, return a link to the upload\n */\n if (!uploadDocument?.value?.mimeType?.startsWith('image')) {\n return `<a href=\"${url}\" rel=\"noopener noreferrer\">${uploadDocument.value?.filename}</a>`\n }\n\n /**\n * If the upload is a simple image with no different sizes, return a simple img tag\n */\n if (\n !uploadDocument?.value?.sizes ||\n !Object.keys(uploadDocument?.value?.sizes).length\n ) {\n return `<img src=\"${url}\" alt=\"${uploadDocument?.value?.filename}\" width=\"${uploadDocument?.value?.width}\" height=\"${uploadDocument?.value?.height}\"/>`\n }\n\n /**\n * If the upload is an image with different sizes, return a picture element\n */\n let pictureHTML = '<picture>'\n\n // Iterate through each size in the data.sizes object\n for (const size in uploadDocument.value?.sizes) {\n const imageSize: {\n url?: string\n } & FileSize = uploadDocument.value?.sizes[size]\n\n // Skip if any property of the size object is null\n if (\n !imageSize.width ||\n !imageSize.height ||\n !imageSize.mimeType ||\n !imageSize.filesize ||\n !imageSize.filename ||\n !imageSize.url\n ) {\n continue\n }\n const imageSizeURL = getAbsoluteURL(imageSize?.url, req?.payload)\n\n pictureHTML += `<source srcset=\"${imageSizeURL}\" media=\"(max-width: ${imageSize.width}px)\" type=\"${imageSize.mimeType}\">`\n }\n\n // Add the default img tag\n pictureHTML += `<img src=\"${url}\" alt=\"Image\" width=\"${uploadDocument.value?.width}\" height=\"${uploadDocument.value?.height}\">`\n pictureHTML += '</picture>'\n return pictureHTML\n } else {\n return `<img src=\"${id}\" />`\n }\n },\n nodeTypes: [UploadServerNode.getType()],\n },\n },\n getSubFields: ({ node, req }) => {\n if (!node) {\n let allSubFields: Field[] = []\n for (const collection in props?.collections) {\n allSubFields = allSubFields.concat(props?.collections?.[collection]?.fields)\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 // @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 select:\n populateArg?.[collection.config.slug] ?? collection.config.defaultPopulate,\n showHiddenFields,\n }),\n )\n\n return node\n },\n ],\n },\n node: UploadServerNode,\n validations: [uploadValidation(props)],\n }),\n ],\n sanitizedServerFeatureProps: props,\n }\n },\n key: 'upload',\n})\n"],"mappings":"AAWA,SAASA,cAAc,QAAQ;AAI/B,SAASC,QAAQ,QAAQ;AACzB,SAASC,mBAAmB,QAAQ;AACpC,SAASC,UAAU,QAAQ;AAC3B,SAASC,0BAA0B,QAAQ;AAC3C,SAASC,IAAI,QAAQ;AACrB,SAASC,gBAAgB,QAAQ;AACjC,SAASC,gBAAgB,QAAQ;AAiBjC;;;AAGA,SAASC,eAAeC,GAAW,EAAEC,OAAgB;EACnD,OAAOD,GAAA,EAAKE,UAAA,CAAW,UAAUF,GAAA,GAAM,CAACC,OAAA,EAASE,MAAA,EAAQC,SAAA,IAAa,EAAC,IAAKJ,GAAA;AAC9E;AAEA,OAAO,MAAMK,aAAA,GAAgBZ,mBAAA,CAI3B;EACAa,OAAA,EAAS,MAAAA,CAAO;IAAEH,MAAA,EAAQI,OAAO;IAAEC,MAAM;IAAEC,iBAAiB;IAAEC;EAAK,CAAE;IACnE,IAAI,CAACA,KAAA,EAAO;MACVA,KAAA,GAAQ;QAAEC,WAAA,EAAa,CAAC;MAAE;IAC5B;IAEA,MAAMC,WAAA,GAAwC;MAC5CD,WAAA,EAAa,CAAC;IAChB;IACA,IAAID,KAAA,CAAMC,WAAW,EAAE;MACrB,KAAK,MAAME,UAAA,IAAcH,KAAA,CAAMC,WAAW,EAAE;QAC1CC,WAAA,CAAYD,WAAW,CAACE,UAAA,CAAW,GAAG;UACpCC,cAAA,EAAgBJ,KAAA,CAAMC,WAAW,CAACE,UAAA,CAAW,CAAEE,MAAM,CAACC,MAAM,IAAI;QAClE;MACF;IACF;IAEA,MAAMC,kBAAA,GAAqBV,OAAA,CAAQI,WAAW,CAACO,GAAG,CAAEC,CAAA,IAAMA,CAAA,CAAEC,IAAI,KAAK,EAAE;IAEvE,KAAK,MAAMC,aAAA,IAAiBX,KAAA,CAAMC,WAAW,EAAE;MAC7C,MAAME,UAAA,GAAaH,KAAA,CAAMC,WAAW,CAACU,aAAA,CAAc;MACnD,IAAIR,UAAA,CAAWE,MAAM,EAAEC,MAAA,EAAQ;QAC7BH,UAAA,CAAWE,MAAM,GAAG,MAAMxB,cAAA,CAAe;UACvCY,MAAA,EAAQI,OAAA;UACRQ,MAAA,EAAQF,UAAA,CAAWE,MAAM;UACzBN,iBAAA;UACAa,+BAAA,EAAiCd,MAAA;UACjCS;QACF;MACF;IACF;IAEA,OAAO;MACLM,aAAA,EAAe;MACfC,kBAAA,EAAoBZ,WAAA;MACpBa,iBAAA,EAAmBA,CAAC;QAAEf;MAAK,CAAE;QAC3B,IAAI,CAACA,KAAA,EAAOC,WAAA,EAAa;UACvB,OAAO;QACT;QAEA,MAAMe,SAAA,GAA4B,IAAIC,GAAA;QAEtC,KAAK,MAAMN,aAAA,IAAiBX,KAAA,CAAMC,WAAW,EAAE;UAC7C,MAAME,UAAA,GAAaH,KAAA,CAAMC,WAAW,CAACU,aAAA,CAAc;UACnD,IAAIR,UAAA,CAAWE,MAAM,EAAEC,MAAA,EAAQ;YAC7BU,SAAA,CAAUE,GAAG,CAACP,aAAA,EAAe;cAC3BN,MAAA,EAAQF,UAAA,CAAWE;YACrB;UACF;QACF;QAEA,OAAOW,SAAA;MACT;MACA9B,IAAA;MACAiC,KAAA,EAAO,CACLnC,UAAA,CAAW;QACToC,UAAA,EAAY;UACVC,IAAA,EAAM;YACJC,SAAA,EAAW,MAAAA,CAAO;cAChBC,YAAY;cACZC,KAAK;cACLC,KAAK;cACLC,IAAI;cACJC,cAAc;cACdC,GAAG;cACHC;YAAgB,CACjB;cACC;cACA,MAAMC,EAAA,GAAKJ,IAAA,EAAMK,KAAA,EAAOD,EAAA,IAAMJ,IAAA,EAAMK,KAAA;cAEpC,IAAIH,GAAA,EAAKrC,OAAA,EAAS;gBAChB,MAAMyC,cAAA,GAEF,CAAC;gBAEL,IAAI;kBACF,MAAMlD,QAAA,CAAS;oBACbgD,EAAA;oBACAG,cAAA,EAAgBP,IAAA,CAAKQ,UAAU;oBAC/BX,YAAA;oBACAY,IAAA,EAAMH,cAAA;oBACNR,KAAA;oBACAC,KAAA;oBACAW,GAAA,EAAK;oBACLT,cAAA;oBACAC,GAAA;oBACAC;kBACF;gBACF,EAAE,OAAOQ,OAAA,EAAS;kBAChB;kBACAC,OAAA,CAAQC,KAAK,CACX,kEACAF,OAAA,EACA,SACAX,IAAA;kBAEF,OAAO,SAAS;gBAClB;gBAEA,MAAMpC,GAAA,GAAMD,cAAA,CAAe2C,cAAA,EAAgBD,KAAA,EAAOzC,GAAA,IAAO,IAAIsC,GAAA,EAAKrC,OAAA;gBAElE;;;gBAGA,IAAI,CAACyC,cAAA,EAAgBD,KAAA,EAAOS,QAAA,EAAUhD,UAAA,CAAW,UAAU;kBACzD,OAAO,YAAYF,GAAA,+BAAkC0C,cAAA,CAAeD,KAAK,EAAEU,QAAA,MAAc;gBAC3F;gBAEA;;;gBAGA,IACE,CAACT,cAAA,EAAgBD,KAAA,EAAOW,KAAA,IACxB,CAACC,MAAA,CAAOC,IAAI,CAACZ,cAAA,EAAgBD,KAAA,EAAOW,KAAA,EAAOpC,MAAM,EACjD;kBACA,OAAO,aAAahB,GAAA,UAAa0C,cAAA,EAAgBD,KAAA,EAAOU,QAAA,YAAoBT,cAAA,EAAgBD,KAAA,EAAOc,KAAA,cAAmBb,cAAA,EAAgBD,KAAA,EAAOe,MAAA,KAAW;gBAC1J;gBAEA;;;gBAGA,IAAIC,WAAA,GAAc;gBAElB;gBACA,KAAK,MAAMC,IAAA,IAAQhB,cAAA,CAAeD,KAAK,EAAEW,KAAA,EAAO;kBAC9C,MAAMO,SAAA,GAESjB,cAAA,CAAeD,KAAK,EAAEW,KAAK,CAACM,IAAA,CAAK;kBAEhD;kBACA,IACE,CAACC,SAAA,CAAUJ,KAAK,IAChB,CAACI,SAAA,CAAUH,MAAM,IACjB,CAACG,SAAA,CAAUT,QAAQ,IACnB,CAACS,SAAA,CAAUC,QAAQ,IACnB,CAACD,SAAA,CAAUR,QAAQ,IACnB,CAACQ,SAAA,CAAU3D,GAAG,EACd;oBACA;kBACF;kBACA,MAAM6D,YAAA,GAAe9D,cAAA,CAAe4D,SAAA,EAAW3D,GAAA,EAAKsC,GAAA,EAAKrC,OAAA;kBAEzDwD,WAAA,IAAe,mBAAmBI,YAAA,wBAAoCF,SAAA,CAAUJ,KAAK,cAAcI,SAAA,CAAUT,QAAQ,IAAI;gBAC3H;gBAEA;gBACAO,WAAA,IAAe,aAAazD,GAAA,wBAA2B0C,cAAA,CAAeD,KAAK,EAAEc,KAAA,aAAkBb,cAAA,CAAeD,KAAK,EAAEe,MAAA,IAAU;gBAC/HC,WAAA,IAAe;gBACf,OAAOA,WAAA;cACT,OAAO;gBACL,OAAO,aAAajB,EAAA,MAAQ;cAC9B;YACF;YACAsB,SAAA,EAAW,CAACjE,gBAAA,CAAiBkE,OAAO;UACtC;QACF;QACAC,YAAA,EAAcA,CAAC;UAAE5B,IAAI;UAAEE;QAAG,CAAE;UAC1B,IAAI,CAACF,IAAA,EAAM;YACT,IAAI6B,YAAA,GAAwB,EAAE;YAC9B,KAAK,MAAMpD,UAAA,IAAcH,KAAA,EAAOC,WAAA,EAAa;cAC3CsD,YAAA,GAAeA,YAAA,CAAaC,MAAM,CAACxD,KAAA,EAAOC,WAAA,GAAcE,UAAA,CAAW,EAAEE,MAAA;YACvE;YACA,OAAOkD,YAAA;UACT;UACA,MAAMpD,UAAA,GAAayB,GAAA,GAAMA,GAAA,CAAIrC,OAAO,CAACU,WAAW,CAACyB,IAAA,EAAMQ,UAAA,CAAW,GAAG;UAErE,IAAI/B,UAAA,EAAY;YACd,MAAMsD,qBAAA,GAAwBzD,KAAA,EAAOC,WAAA,GAAcyB,IAAA,EAAMQ,UAAA,CAAW,EAAE7B,MAAA;YAEtE,IAAIqD,KAAA,CAAMC,OAAO,CAACF,qBAAA,GAAwB;cACxC,IAAI,CAACA,qBAAA,EAAuBnD,MAAA,EAAQ;gBAClC,OAAO;cACT;cACA,OAAOmD,qBAAA;YACT;UACF;UACA,OAAO;QACT;QACAG,gBAAA,EAAkBA,CAAC;UAAElC;QAAI,CAAE;UACzB,OAAOA,IAAA,EAAMrB,MAAA;QACf;QACAwD,yBAAA,EAA2B,CAAC5E,0BAAA,CAA2Be,KAAA,EAAO;QAC9D8D,KAAA,EAAO;UACLC,SAAA,EAAW,CACT,CAAC;YACCxC,YAAY;YACZC,KAAK;YACLC,KAAK;YACLC,IAAI;YACJC,cAAc;YACdqC,WAAW;YACXC,kBAAkB;YAClBrC,GAAG;YACHC;UAAgB,CACjB;YACC,IAAI,CAACH,IAAA,EAAMK,KAAA,EAAO;cAChB,OAAOL,IAAA;YACT;YACA,MAAMvB,UAAA,GAAayB,GAAA,CAAIrC,OAAO,CAACU,WAAW,CAACyB,IAAA,EAAMQ,UAAA,CAAW;YAE5D,IAAI,CAAC/B,UAAA,EAAY;cACf,OAAOuB,IAAA;YACT;YACA;YACA,MAAMI,EAAA,GAAKJ,IAAA,EAAMK,KAAA,EAAOD,EAAA,IAAMJ,IAAA,EAAMK,KAAA,CAAM;YAAA;YAE1C,MAAMmC,aAAA,GACJlE,KAAA,EAAOmE,QAAA,KAAaC,SAAA,IAAapE,KAAA,EAAOmE,QAAA,GAAW3C,KAAA,GAAQxB,KAAA,EAAOmE,QAAA,GAAW3C,KAAA;YAE/EyC,kBAAA,CAAmBI,IAAI,CACrBvF,QAAA,CAAS;cACPgD,EAAA;cACAG,cAAA,EAAgB9B,UAAA,CAAWV,MAAM,CAACiB,IAAI;cACtCa,YAAA;cACAY,IAAA,EAAMT,IAAA;cACNF,KAAA,EAAO0C,aAAA;cACPzC,KAAA;cACAW,GAAA,EAAK;cACLT,cAAA;cACAC,GAAA;cACA0C,MAAA,EACEN,WAAA,GAAc7D,UAAA,CAAWV,MAAM,CAACiB,IAAI,CAAC,IAAIP,UAAA,CAAWV,MAAM,CAAC8E,eAAe;cAC5E1C;YACF;YAGF,OAAOH,IAAA;UACT;QAEJ;QACAA,IAAA,EAAMvC,gBAAA;QACNqF,WAAA,EAAa,CAACpF,gBAAA,CAAiBY,KAAA;MACjC,GACD;MACDyE,2BAAA,EAA6BzE;IAC/B;EACF;EACAoC,GAAA,EAAK;AACP","ignoreList":[]}
1
+ {"version":3,"file":"feature.server.js","names":["sanitizeFields","populate","createServerFeature","createNode","uploadPopulationPromiseHOC","i18n","UploadServerNode","uploadValidation","getAbsoluteURL","url","payload","startsWith","config","serverURL","UploadFeature","feature","_config","isRoot","parentIsLocalized","props","collections","clientProps","collection","hasExtraFields","fields","length","validRelationships","map","c","slug","collectionKey","requireFieldLevelRichTextEditor","ClientFeature","clientFeatureProps","generateSchemaMap","schemaMap","Map","set","nodes","converters","html","converter","currentDepth","depth","draft","node","overrideAccess","req","showHiddenFields","id","value","uploadDocument","collectionSlug","relationTo","data","key","ignored","console","error","mimeType","filename","sizes","Object","keys","width","height","pictureHTML","size","imageSize","filesize","imageSizeURL","nodeTypes","getType","getSubFields","allSubFields","collectionFields","concat","collectionFieldSchema","Array","isArray","getSubFieldsData","graphQLPopulationPromises","hooks","afterRead","populateArg","populationPromises","populateDepth","maxDepth","undefined","push","select","defaultPopulate","validations","sanitizedServerFeatureProps"],"sources":["../../../../src/features/upload/server/feature.server.ts"],"sourcesContent":["import type {\n CollectionSlug,\n Config,\n Field,\n FieldSchemaMap,\n FileData,\n FileSizeImproved,\n Payload,\n TypeWithID,\n} from 'payload'\n\nimport { sanitizeFields } from 'payload'\n\nimport type { UploadFeaturePropsClient } from '../client/feature.client.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 { UploadServerNode } from './nodes/UploadNode.js'\nimport { uploadValidation } from './validate.js'\n\nexport type UploadFeatureProps = {\n collections?: {\n [collection: CollectionSlug]: {\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}\n\n/**\n * Get the absolute URL for an upload URL by potentially prepending the serverURL\n */\nfunction getAbsoluteURL(url: string, payload: Payload): string {\n return url?.startsWith('http') ? url : (payload?.config?.serverURL || '') + url\n}\n\nexport const UploadFeature = createServerFeature<\n UploadFeatureProps,\n UploadFeatureProps,\n UploadFeaturePropsClient\n>({\n feature: async ({ config: _config, isRoot, parentIsLocalized, props }) => {\n if (!props) {\n props = { collections: {} }\n }\n\n const clientProps: UploadFeaturePropsClient = {\n collections: {},\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 = await 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 nodes: [\n createNode({\n converters: {\n html: {\n converter: async ({\n currentDepth,\n depth,\n draft,\n node,\n overrideAccess,\n req,\n showHiddenFields,\n }) => {\n // @ts-expect-error - for backwards-compatibility\n const id = node?.value?.id || node?.value\n\n if (req?.payload) {\n const uploadDocument: {\n value?: FileData & TypeWithID\n } = {}\n\n try {\n await populate({\n id,\n collectionSlug: node.relationTo,\n currentDepth,\n data: uploadDocument,\n depth,\n draft,\n key: 'value',\n overrideAccess,\n req,\n showHiddenFields,\n })\n } catch (ignored) {\n // eslint-disable-next-line no-console\n console.error(\n 'Lexical upload node HTML converter: error fetching upload file',\n ignored,\n 'Node:',\n node,\n )\n return `<img />`\n }\n\n const url = getAbsoluteURL(uploadDocument?.value?.url ?? '', req?.payload)\n\n /**\n * If the upload is not an image, return a link to the upload\n */\n if (!uploadDocument?.value?.mimeType?.startsWith('image')) {\n return `<a href=\"${url}\" rel=\"noopener noreferrer\">${uploadDocument.value?.filename}</a>`\n }\n\n /**\n * If the upload is a simple image with no different sizes, return a simple img tag\n */\n if (\n !uploadDocument?.value?.sizes ||\n !Object.keys(uploadDocument?.value?.sizes).length\n ) {\n return `<img src=\"${url}\" alt=\"${uploadDocument?.value?.filename}\" width=\"${uploadDocument?.value?.width}\" height=\"${uploadDocument?.value?.height}\"/>`\n }\n\n /**\n * If the upload is an image with different sizes, return a picture element\n */\n let pictureHTML = '<picture>'\n\n // Iterate through each size in the data.sizes object\n for (const size in uploadDocument.value?.sizes) {\n const imageSize = uploadDocument.value.sizes[size] as FileSizeImproved\n\n // Skip if any property of the size object is null\n if (\n !imageSize.width ||\n !imageSize.height ||\n !imageSize.mimeType ||\n !imageSize.filesize ||\n !imageSize.filename ||\n !imageSize.url\n ) {\n continue\n }\n const imageSizeURL = getAbsoluteURL(imageSize?.url, req?.payload)\n\n pictureHTML += `<source srcset=\"${imageSizeURL}\" media=\"(max-width: ${imageSize.width}px)\" type=\"${imageSize.mimeType}\">`\n }\n\n // Add the default img tag\n pictureHTML += `<img src=\"${url}\" alt=\"Image\" width=\"${uploadDocument.value?.width}\" height=\"${uploadDocument.value?.height}\">`\n pictureHTML += '</picture>'\n return pictureHTML\n } else {\n return `<img src=\"${id}\" />`\n }\n },\n nodeTypes: [UploadServerNode.getType()],\n },\n },\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 // @ts-expect-error - Fix in Payload v4\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 select:\n populateArg?.[collection.config.slug] ?? collection.config.defaultPopulate,\n showHiddenFields,\n }),\n )\n\n return node\n },\n ],\n },\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,16 +1,27 @@
1
1
  import type { SerializedDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js';
2
2
  import type { DOMConversionMap, DOMExportOutput, ElementFormatType, LexicalNode, NodeKey, Spread } from 'lexical';
3
- import type { CollectionSlug, DataFromCollectionSlug, JsonObject } from 'payload';
3
+ import type { FileData, JsonObject, TypedCollection, TypeWithID } from 'payload';
4
4
  import type { JSX } from 'react';
5
5
  import { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js';
6
6
  export type UploadData<TUploadExtraFieldsData extends JsonObject = JsonObject> = {
7
- [TCollectionSlug in CollectionSlug]: {
8
- fields: TUploadExtraFieldsData;
9
- id: string;
10
- relationTo: TCollectionSlug;
11
- value: DataFromCollectionSlug<TCollectionSlug> | number | string;
12
- };
13
- }[CollectionSlug];
7
+ fields: TUploadExtraFieldsData;
8
+ /** Every lexical node that has sub-fields needs to have a unique ID. This is the ID of this upload node, not the ID of the linked upload document */
9
+ id: string;
10
+ relationTo: string;
11
+ /** Value can be just the document ID, or the full, populated document */
12
+ value: number | string | TypedCollection;
13
+ };
14
+ /**
15
+ * UploadDataImproved is a more precise type, and will replace UploadData in Payload v4.
16
+ * This type is for internal use only as it will be deprecated in the future.
17
+ * @internal
18
+ */
19
+ export type UploadDataImproved<TUploadExtraFieldsData extends JsonObject = JsonObject> = {
20
+ fields: TUploadExtraFieldsData;
21
+ id: string;
22
+ relationTo: string;
23
+ value: (FileData & TypeWithID) | number | string;
24
+ };
14
25
  export declare function isGoogleDocCheckboxImg(img: HTMLImageElement): boolean;
15
26
  export type SerializedUploadNode = {
16
27
  children?: never;
@@ -1 +1 @@
1
- {"version":3,"file":"UploadNode.d.ts","sourceRoot":"","sources":["../../../../../src/features/upload/server/nodes/UploadNode.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,6CAA6C,CAAA;AAC/F,OAAO,KAAK,EACV,gBAAgB,EAEhB,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,OAAO,EACP,MAAM,EACP,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACjF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAA;AAKhF,MAAM,MAAM,UAAU,CAAC,sBAAsB,SAAS,UAAU,GAAG,UAAU,IAAI;KAC9E,eAAe,IAAI,cAAc,GAAG;QACnC,MAAM,EAAE,sBAAsB,CAAA;QAE9B,EAAE,EAAE,MAAM,CAAA;QACV,UAAU,EAAE,eAAe,CAAA;QAE3B,KAAK,EAAE,sBAAsB,CAAC,eAAe,CAAC,GAAG,MAAM,GAAG,MAAM,CAAA;KACjE;CACF,CAAC,cAAc,CAAC,CAAA;AAEjB,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAOrE;AA8BD,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EAAE,KAAK,CAAA;IAChB,IAAI,EAAE,QAAQ,CAAA;CACf,GAAG,MAAM,CAAC,UAAU,EAAE,4BAA4B,CAAC,CAAA;AAEpD,qBAAa,gBAAiB,SAAQ,kBAAkB;IACtD,MAAM,EAAE,UAAU,CAAA;gBAEN,EACV,IAAI,EACJ,MAAM,EACN,GAAG,GACJ,EAAE;QACD,IAAI,EAAE,UAAU,CAAA;QAChB,MAAM,CAAC,EAAE,iBAAiB,CAAA;QAC1B,GAAG,CAAC,EAAE,OAAO,CAAA;KACd;WAKe,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB;WAQ/C,OAAO,IAAI,MAAM;WAIjB,SAAS,IAAI,gBAAgB,CAAC,gBAAgB,CAAC;WAS/C,UAAU,CAAC,cAAc,EAAE,oBAAoB,GAAG,gBAAgB;IAsBlF,MAAM,CAAC,QAAQ,IAAI,KAAK;IAIf,QAAQ,IAAI,GAAG,CAAC,OAAO;IAKvB,SAAS,IAAI,eAAe;IAQ5B,UAAU,IAAI,oBAAoB;IAS3C,OAAO,IAAI,UAAU;IAIrB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAKtB,SAAS,IAAI,KAAK;CAG5B;AAED,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,GACL,EAAE;IACD,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAA;CAC/D,GAAG,gBAAgB,CAKnB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GACnC,IAAI,IAAI,gBAAgB,CAE1B"}
1
+ {"version":3,"file":"UploadNode.d.ts","sourceRoot":"","sources":["../../../../../src/features/upload/server/nodes/UploadNode.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,6CAA6C,CAAA;AAC/F,OAAO,KAAK,EACV,gBAAgB,EAEhB,eAAe,EACf,iBAAiB,EACjB,WAAW,EACX,OAAO,EACP,MAAM,EACP,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAChF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAA;AAEhC,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAA;AAKhF,MAAM,MAAM,UAAU,CAAC,sBAAsB,SAAS,UAAU,GAAG,UAAU,IAAI;IAC/E,MAAM,EAAE,sBAAsB,CAAA;IAC9B,qJAAqJ;IACrJ,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,yEAAyE;IACzE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,eAAe,CAAA;CACzC,CAAA;AAGD;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,CAAC,sBAAsB,SAAS,UAAU,GAAG,UAAU,IAAI;IACvF,MAAM,EAAE,sBAAsB,CAAA;IAE9B,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAElB,KAAK,EAAE,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,MAAM,GAAG,MAAM,CAAA;CACjD,CAAA;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAOrE;AA8BD,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,EAAE,KAAK,CAAA;IAChB,IAAI,EAAE,QAAQ,CAAA;CACf,GAAG,MAAM,CAAC,UAAU,EAAE,4BAA4B,CAAC,CAAA;AAEpD,qBAAa,gBAAiB,SAAQ,kBAAkB;IACtD,MAAM,EAAE,UAAU,CAAA;gBAEN,EACV,IAAI,EACJ,MAAM,EACN,GAAG,GACJ,EAAE;QACD,IAAI,EAAE,UAAU,CAAA;QAChB,MAAM,CAAC,EAAE,iBAAiB,CAAA;QAC1B,GAAG,CAAC,EAAE,OAAO,CAAA;KACd;WAKe,KAAK,CAAC,IAAI,EAAE,gBAAgB,GAAG,gBAAgB;WAQ/C,OAAO,IAAI,MAAM;WAIjB,SAAS,IAAI,gBAAgB,CAAC,gBAAgB,CAAC;WAS/C,UAAU,CAAC,cAAc,EAAE,oBAAoB,GAAG,gBAAgB;IAsBlF,MAAM,CAAC,QAAQ,IAAI,KAAK;IAIf,QAAQ,IAAI,GAAG,CAAC,OAAO;IAKvB,SAAS,IAAI,eAAe;IAQ5B,UAAU,IAAI,oBAAoB;IAS3C,OAAO,IAAI,UAAU;IAIrB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAKtB,SAAS,IAAI,KAAK;CAG5B;AAED,wBAAgB,uBAAuB,CAAC,EACtC,IAAI,GACL,EAAE;IACD,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAA;CAC/D,GAAG,gBAAgB,CAKnB;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,WAAW,GAAG,IAAI,GAAG,SAAS,GACnC,IAAI,IAAI,gBAAgB,CAE1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"UploadNode.js","names":["DecoratorBlockNode","ObjectID","$applyNodeReplacement","React","isGoogleDocCheckboxImg","img","parentElement","tagName","previousSibling","getAttribute","$convertUploadServerElement","domNode","hasAttribute","id","relationTo","node","$createUploadServerNode","data","fields","value","src","startsWith","UploadServerNode","__data","constructor","format","key","clone","__format","__key","getType","importDOM","conversion","priority","importJSON","serializedNode","version","default","toHexString","importedData","setFormat","isInline","decorate","_jsx","RawUploadComponent","nodeKey","getKey","exportDOM","element","document","createElement","setAttribute","String","exportJSON","getData","type","getLatest","setData","writable","getWritable","updateDOM","$isUploadServerNode"],"sources":["../../../../../src/features/upload/server/nodes/UploadNode.tsx"],"sourcesContent":["import type { SerializedDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport type {\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n ElementFormatType,\n LexicalNode,\n NodeKey,\n Spread,\n} from 'lexical'\nimport type { CollectionSlug, DataFromCollectionSlug, JsonObject } from 'payload'\nimport type { JSX } from 'react'\n\nimport { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport ObjectID from 'bson-objectid'\nimport { $applyNodeReplacement } from 'lexical'\nimport * as React from 'react'\n\nexport type UploadData<TUploadExtraFieldsData extends JsonObject = JsonObject> = {\n [TCollectionSlug in CollectionSlug]: {\n fields: TUploadExtraFieldsData\n // Every lexical node that has sub-fields needs to have a unique ID. This is the ID of this upload node, not the ID of the linked upload document\n id: string\n relationTo: TCollectionSlug\n // Value can be just the document ID, or the full, populated document\n value: DataFromCollectionSlug<TCollectionSlug> | number | string\n }\n}[CollectionSlug]\n\nexport function isGoogleDocCheckboxImg(img: HTMLImageElement): boolean {\n return (\n img.parentElement != null &&\n img.parentElement.tagName === 'LI' &&\n img.previousSibling === null &&\n img.getAttribute('aria-roledescription') === 'checkbox'\n )\n}\n\nfunction $convertUploadServerElement(domNode: HTMLImageElement): DOMConversionOutput | null {\n if (\n domNode.hasAttribute('data-lexical-upload-relation-to') &&\n domNode.hasAttribute('data-lexical-upload-id')\n ) {\n const id = domNode.getAttribute('data-lexical-upload-id')\n const relationTo = domNode.getAttribute('data-lexical-upload-relation-to')\n\n if (id != null && relationTo != null) {\n const node = $createUploadServerNode({\n data: {\n fields: {},\n relationTo,\n value: id,\n },\n })\n return { node }\n }\n }\n const img = domNode\n if (img.src.startsWith('file:///') || isGoogleDocCheckboxImg(img)) {\n return null\n }\n // TODO: Auto-upload functionality here!\n //}\n return null\n}\n\nexport type SerializedUploadNode = {\n children?: never // required so that our typed editor state doesn't automatically add children\n type: 'upload'\n} & Spread<UploadData, SerializedDecoratorBlockNode>\n\nexport class UploadServerNode extends DecoratorBlockNode {\n __data: UploadData\n\n constructor({\n data,\n format,\n key,\n }: {\n data: UploadData\n format?: ElementFormatType\n key?: NodeKey\n }) {\n super(format, key)\n this.__data = data\n }\n\n static override clone(node: UploadServerNode): UploadServerNode {\n return new this({\n data: node.__data,\n format: node.__format,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'upload'\n }\n\n static override importDOM(): DOMConversionMap<HTMLImageElement> {\n return {\n img: (node) => ({\n conversion: $convertUploadServerElement,\n priority: 0,\n }),\n }\n }\n\n static override importJSON(serializedNode: SerializedUploadNode): UploadServerNode {\n if (serializedNode.version === 1 && (serializedNode?.value as unknown as { id: string })?.id) {\n serializedNode.value = (serializedNode.value as unknown as { id: string }).id\n }\n if (serializedNode.version === 2 && !serializedNode?.id) {\n serializedNode.id = new ObjectID.default().toHexString()\n serializedNode.version = 3\n }\n\n const importedData: UploadData = {\n id: serializedNode.id,\n fields: serializedNode.fields,\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n\n const node = $createUploadServerNode({ data: importedData })\n node.setFormat(serializedNode.format)\n\n return node\n }\n\n static isInline(): false {\n return false\n }\n\n override decorate(): JSX.Element {\n // @ts-expect-error\n return <RawUploadComponent data={this.__data} format={this.__format} nodeKey={this.getKey()} />\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('img')\n element.setAttribute('data-lexical-upload-id', String(this.__data?.value))\n element.setAttribute('data-lexical-upload-relation-to', this.__data?.relationTo)\n\n return { element }\n }\n\n override exportJSON(): SerializedUploadNode {\n return {\n ...super.exportJSON(),\n ...this.getData(),\n type: 'upload',\n version: 3,\n }\n }\n\n getData(): UploadData {\n return this.getLatest().__data\n }\n\n setData(data: UploadData): void {\n const writable = this.getWritable()\n writable.__data = data\n }\n\n override updateDOM(): false {\n return false\n }\n}\n\nexport function $createUploadServerNode({\n data,\n}: {\n data: Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>\n}): UploadServerNode {\n if (!data?.id) {\n data.id = new ObjectID.default().toHexString()\n }\n return $applyNodeReplacement(new UploadServerNode({ data: data as UploadData }))\n}\n\nexport function $isUploadServerNode(\n node: LexicalNode | null | undefined,\n): node is UploadServerNode {\n return node instanceof UploadServerNode\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"UploadNode.js","names":["DecoratorBlockNode","ObjectID","$applyNodeReplacement","React","isGoogleDocCheckboxImg","img","parentElement","tagName","previousSibling","getAttribute","$convertUploadServerElement","domNode","hasAttribute","id","relationTo","node","$createUploadServerNode","data","fields","value","src","startsWith","UploadServerNode","__data","constructor","format","key","clone","__format","__key","getType","importDOM","conversion","priority","importJSON","serializedNode","version","default","toHexString","importedData","setFormat","isInline","decorate","_jsx","RawUploadComponent","nodeKey","getKey","exportDOM","element","document","createElement","setAttribute","String","exportJSON","getData","type","getLatest","setData","writable","getWritable","updateDOM","$isUploadServerNode"],"sources":["../../../../../src/features/upload/server/nodes/UploadNode.tsx"],"sourcesContent":["import type { SerializedDecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport type {\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n ElementFormatType,\n LexicalNode,\n NodeKey,\n Spread,\n} from 'lexical'\nimport type { FileData, JsonObject, TypedCollection, TypeWithID } from 'payload'\nimport type { JSX } from 'react'\n\nimport { DecoratorBlockNode } from '@lexical/react/LexicalDecoratorBlockNode.js'\nimport ObjectID from 'bson-objectid'\nimport { $applyNodeReplacement } from 'lexical'\nimport * as React from 'react'\n\nexport type UploadData<TUploadExtraFieldsData extends JsonObject = JsonObject> = {\n fields: TUploadExtraFieldsData\n /** Every lexical node that has sub-fields needs to have a unique ID. This is the ID of this upload node, not the ID of the linked upload document */\n id: string\n relationTo: string\n /** Value can be just the document ID, or the full, populated document */\n value: number | string | TypedCollection\n}\n\n// TODO: deprecate in Payload v4.\n/**\n * UploadDataImproved is a more precise type, and will replace UploadData in Payload v4.\n * This type is for internal use only as it will be deprecated in the future.\n * @internal\n */\nexport type UploadDataImproved<TUploadExtraFieldsData extends JsonObject = JsonObject> = {\n fields: TUploadExtraFieldsData\n // Every lexical node that has sub-fields needs to have a unique ID. This is the ID of this upload node, not the ID of the linked upload document\n id: string\n relationTo: string\n // Value can be just the document ID, or the full, populated document\n value: (FileData & TypeWithID) | number | string\n}\n\nexport function isGoogleDocCheckboxImg(img: HTMLImageElement): boolean {\n return (\n img.parentElement != null &&\n img.parentElement.tagName === 'LI' &&\n img.previousSibling === null &&\n img.getAttribute('aria-roledescription') === 'checkbox'\n )\n}\n\nfunction $convertUploadServerElement(domNode: HTMLImageElement): DOMConversionOutput | null {\n if (\n domNode.hasAttribute('data-lexical-upload-relation-to') &&\n domNode.hasAttribute('data-lexical-upload-id')\n ) {\n const id = domNode.getAttribute('data-lexical-upload-id')\n const relationTo = domNode.getAttribute('data-lexical-upload-relation-to')\n\n if (id != null && relationTo != null) {\n const node = $createUploadServerNode({\n data: {\n fields: {},\n relationTo,\n value: id,\n },\n })\n return { node }\n }\n }\n const img = domNode\n if (img.src.startsWith('file:///') || isGoogleDocCheckboxImg(img)) {\n return null\n }\n // TODO: Auto-upload functionality here!\n //}\n return null\n}\n\nexport type SerializedUploadNode = {\n children?: never // required so that our typed editor state doesn't automatically add children\n type: 'upload'\n} & Spread<UploadData, SerializedDecoratorBlockNode>\n\nexport class UploadServerNode extends DecoratorBlockNode {\n __data: UploadData\n\n constructor({\n data,\n format,\n key,\n }: {\n data: UploadData\n format?: ElementFormatType\n key?: NodeKey\n }) {\n super(format, key)\n this.__data = data\n }\n\n static override clone(node: UploadServerNode): UploadServerNode {\n return new this({\n data: node.__data,\n format: node.__format,\n key: node.__key,\n })\n }\n\n static override getType(): string {\n return 'upload'\n }\n\n static override importDOM(): DOMConversionMap<HTMLImageElement> {\n return {\n img: (node) => ({\n conversion: $convertUploadServerElement,\n priority: 0,\n }),\n }\n }\n\n static override importJSON(serializedNode: SerializedUploadNode): UploadServerNode {\n if (serializedNode.version === 1 && (serializedNode?.value as unknown as { id: string })?.id) {\n serializedNode.value = (serializedNode.value as unknown as { id: string }).id\n }\n if (serializedNode.version === 2 && !serializedNode?.id) {\n serializedNode.id = new ObjectID.default().toHexString()\n serializedNode.version = 3\n }\n\n const importedData: UploadData = {\n id: serializedNode.id,\n fields: serializedNode.fields,\n relationTo: serializedNode.relationTo,\n value: serializedNode.value,\n }\n\n const node = $createUploadServerNode({ data: importedData })\n node.setFormat(serializedNode.format)\n\n return node\n }\n\n static isInline(): false {\n return false\n }\n\n override decorate(): JSX.Element {\n // @ts-expect-error\n return <RawUploadComponent data={this.__data} format={this.__format} nodeKey={this.getKey()} />\n }\n\n override exportDOM(): DOMExportOutput {\n const element = document.createElement('img')\n element.setAttribute('data-lexical-upload-id', String(this.__data?.value))\n element.setAttribute('data-lexical-upload-relation-to', this.__data?.relationTo)\n\n return { element }\n }\n\n override exportJSON(): SerializedUploadNode {\n return {\n ...super.exportJSON(),\n ...this.getData(),\n type: 'upload',\n version: 3,\n }\n }\n\n getData(): UploadData {\n return this.getLatest().__data\n }\n\n setData(data: UploadData): void {\n const writable = this.getWritable()\n writable.__data = data\n }\n\n override updateDOM(): false {\n return false\n }\n}\n\nexport function $createUploadServerNode({\n data,\n}: {\n data: Omit<UploadData, 'id'> & Partial<Pick<UploadData, 'id'>>\n}): UploadServerNode {\n if (!data?.id) {\n data.id = new ObjectID.default().toHexString()\n }\n return $applyNodeReplacement(new UploadServerNode({ data: data as UploadData }))\n}\n\nexport function $isUploadServerNode(\n node: LexicalNode | null | undefined,\n): node is UploadServerNode {\n return node instanceof UploadServerNode\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/server/validate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAEjE,eAAO,MAAM,gBAAgB,UACpB,kBAAkB,KACxB,cAAc,CAAC,oBAAoB,CAqErC,CAAA"}
1
+ {"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../src/features/upload/server/validate.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAEjE,eAAO,MAAM,gBAAgB,UACpB,kBAAkB,KACxB,cAAc,CAAC,oBAAoB,CAsErC,CAAA"}
@@ -17,8 +17,8 @@ export const uploadValidation = props => {
17
17
  }
18
18
  }
19
19
  }) => {
20
- const idType = payload.collections[node.relationTo].customIDType || payload.db.defaultIDType;
21
- // @ts-expect-error
20
+ const idType = payload.collections[node.relationTo]?.customIDType || payload.db.defaultIDType;
21
+ // @ts-expect-error - Fix in Payload v4
22
22
  const nodeID = node?.value?.id || node?.value // for backwards-compatibility
23
23
  ;
24
24
  if (!isValidID(nodeID, idType)) {
@@ -51,8 +51,9 @@ export const uploadValidation = props => {
51
51
  });
52
52
  const errorPathsSet = new Set();
53
53
  for (const fieldKey in result) {
54
- if (result[fieldKey].errorPaths?.length) {
55
- for (const errorPath of result[fieldKey].errorPaths) {
54
+ const fieldState = result[fieldKey];
55
+ if (fieldState?.errorPaths?.length) {
56
+ for (const errorPath of fieldState.errorPaths) {
56
57
  errorPathsSet.add(errorPath);
57
58
  }
58
59
  }
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","names":["fieldSchemasToFormState","isValidID","uploadValidation","props","node","validation","options","id","data","operation","preferences","req","payload","t","idType","collections","relationTo","customIDType","db","defaultIDType","nodeID","value","Object","keys","length","collection","fields","result","collectionSlug","documentData","fieldSchemaMap","undefined","initialBlockData","permissions","renderAllFields","schemaPath","errorPathsSet","Set","fieldKey","errorPaths","errorPath","add","Array","from","join"],"sources":["../../../../src/features/upload/server/validate.ts"],"sourcesContent":["import { fieldSchemasToFormState } from '@payloadcms/ui/forms/fieldSchemasToFormState'\nimport { isValidID } from 'payload'\n\nimport type { NodeValidation } from '../../typesServer.js'\nimport type { UploadFeatureProps } from './feature.server.js'\nimport type { SerializedUploadNode } from './nodes/UploadNode.js'\n\nexport const uploadValidation = (\n props: UploadFeatureProps,\n): NodeValidation<SerializedUploadNode> => {\n return async ({\n node,\n validation: {\n options: {\n id,\n data,\n operation,\n preferences,\n req,\n req: { payload, t },\n },\n },\n }) => {\n const idType = payload.collections[node.relationTo].customIDType || payload.db.defaultIDType\n // @ts-expect-error\n const nodeID = node?.value?.id || node?.value // for backwards-compatibility\n\n if (!isValidID(nodeID, idType)) {\n return t('validation:validUploadID')\n }\n\n if (!props?.collections) {\n return true\n }\n\n if (Object.keys(props?.collections).length === 0) {\n return true\n }\n\n const collection = props?.collections[node.relationTo]\n\n if (!collection?.fields?.length) {\n return true\n }\n\n const result = await fieldSchemasToFormState({\n id,\n collectionSlug: node.relationTo,\n\n data: node?.fields ?? {},\n documentData: data,\n fields: collection.fields,\n fieldSchemaMap: undefined,\n initialBlockData: node?.fields ?? {},\n operation: operation === 'create' || operation === 'update' ? operation : 'update',\n permissions: {},\n preferences,\n renderAllFields: false,\n req,\n schemaPath: '',\n })\n\n const errorPathsSet = new Set<string>()\n for (const fieldKey in result) {\n if (result[fieldKey].errorPaths?.length) {\n for (const errorPath of result[fieldKey].errorPaths) {\n errorPathsSet.add(errorPath)\n }\n }\n }\n const errorPaths = Array.from(errorPathsSet)\n\n if (errorPaths.length) {\n return 'The following fields are invalid: ' + errorPaths.join(', ')\n }\n\n return true\n }\n}\n"],"mappings":"AAAA,SAASA,uBAAuB,QAAQ;AACxC,SAASC,SAAS,QAAQ;AAM1B,OAAO,MAAMC,gBAAA,GACXC,KAAA;EAEA,OAAO,OAAO;IACZC,IAAI;IACJC,UAAA,EAAY;MACVC,OAAA,EAAS;QACPC,EAAE;QACFC,IAAI;QACJC,SAAS;QACTC,WAAW;QACXC,GAAG;QACHA,GAAA,EAAK;UAAEC,OAAO;UAAEC;QAAC;MAAE;IACpB;EACF,CACF;IACC,MAAMC,MAAA,GAASF,OAAA,CAAQG,WAAW,CAACX,IAAA,CAAKY,UAAU,CAAC,CAACC,YAAY,IAAIL,OAAA,CAAQM,EAAE,CAACC,aAAa;IAC5F;IACA,MAAMC,MAAA,GAAShB,IAAA,EAAMiB,KAAA,EAAOd,EAAA,IAAMH,IAAA,EAAMiB,KAAA,CAAM;IAAA;IAE9C,IAAI,CAACpB,SAAA,CAAUmB,MAAA,EAAQN,MAAA,GAAS;MAC9B,OAAOD,CAAA,CAAE;IACX;IAEA,IAAI,CAACV,KAAA,EAAOY,WAAA,EAAa;MACvB,OAAO;IACT;IAEA,IAAIO,MAAA,CAAOC,IAAI,CAACpB,KAAA,EAAOY,WAAA,EAAaS,MAAM,KAAK,GAAG;MAChD,OAAO;IACT;IAEA,MAAMC,UAAA,GAAatB,KAAA,EAAOY,WAAW,CAACX,IAAA,CAAKY,UAAU,CAAC;IAEtD,IAAI,CAACS,UAAA,EAAYC,MAAA,EAAQF,MAAA,EAAQ;MAC/B,OAAO;IACT;IAEA,MAAMG,MAAA,GAAS,MAAM3B,uBAAA,CAAwB;MAC3CO,EAAA;MACAqB,cAAA,EAAgBxB,IAAA,CAAKY,UAAU;MAE/BR,IAAA,EAAMJ,IAAA,EAAMsB,MAAA,IAAU,CAAC;MACvBG,YAAA,EAAcrB,IAAA;MACdkB,MAAA,EAAQD,UAAA,CAAWC,MAAM;MACzBI,cAAA,EAAgBC,SAAA;MAChBC,gBAAA,EAAkB5B,IAAA,EAAMsB,MAAA,IAAU,CAAC;MACnCjB,SAAA,EAAWA,SAAA,KAAc,YAAYA,SAAA,KAAc,WAAWA,SAAA,GAAY;MAC1EwB,WAAA,EAAa,CAAC;MACdvB,WAAA;MACAwB,eAAA,EAAiB;MACjBvB,GAAA;MACAwB,UAAA,EAAY;IACd;IAEA,MAAMC,aAAA,GAAgB,IAAIC,GAAA;IAC1B,KAAK,MAAMC,QAAA,IAAYX,MAAA,EAAQ;MAC7B,IAAIA,MAAM,CAACW,QAAA,CAAS,CAACC,UAAU,EAAEf,MAAA,EAAQ;QACvC,KAAK,MAAMgB,SAAA,IAAab,MAAM,CAACW,QAAA,CAAS,CAACC,UAAU,EAAE;UACnDH,aAAA,CAAcK,GAAG,CAACD,SAAA;QACpB;MACF;IACF;IACA,MAAMD,UAAA,GAAaG,KAAA,CAAMC,IAAI,CAACP,aAAA;IAE9B,IAAIG,UAAA,CAAWf,MAAM,EAAE;MACrB,OAAO,uCAAuCe,UAAA,CAAWK,IAAI,CAAC;IAChE;IAEA,OAAO;EACT;AACF","ignoreList":[]}
1
+ {"version":3,"file":"validate.js","names":["fieldSchemasToFormState","isValidID","uploadValidation","props","node","validation","options","id","data","operation","preferences","req","payload","t","idType","collections","relationTo","customIDType","db","defaultIDType","nodeID","value","Object","keys","length","collection","fields","result","collectionSlug","documentData","fieldSchemaMap","undefined","initialBlockData","permissions","renderAllFields","schemaPath","errorPathsSet","Set","fieldKey","fieldState","errorPaths","errorPath","add","Array","from","join"],"sources":["../../../../src/features/upload/server/validate.ts"],"sourcesContent":["import { fieldSchemasToFormState } from '@payloadcms/ui/forms/fieldSchemasToFormState'\nimport { isValidID } from 'payload'\n\nimport type { NodeValidation } from '../../typesServer.js'\nimport type { UploadFeatureProps } from './feature.server.js'\nimport type { SerializedUploadNode } from './nodes/UploadNode.js'\n\nexport const uploadValidation = (\n props: UploadFeatureProps,\n): NodeValidation<SerializedUploadNode> => {\n return async ({\n node,\n validation: {\n options: {\n id,\n data,\n operation,\n preferences,\n req,\n req: { payload, t },\n },\n },\n }) => {\n const idType = payload.collections[node.relationTo]?.customIDType || payload.db.defaultIDType\n // @ts-expect-error - Fix in Payload v4\n const nodeID = node?.value?.id || node?.value // for backwards-compatibility\n\n if (!isValidID(nodeID, idType)) {\n return t('validation:validUploadID')\n }\n\n if (!props?.collections) {\n return true\n }\n\n if (Object.keys(props?.collections).length === 0) {\n return true\n }\n\n const collection = props?.collections[node.relationTo]\n\n if (!collection?.fields?.length) {\n return true\n }\n\n const result = await fieldSchemasToFormState({\n id,\n collectionSlug: node.relationTo,\n\n data: node?.fields ?? {},\n documentData: data,\n fields: collection.fields,\n fieldSchemaMap: undefined,\n initialBlockData: node?.fields ?? {},\n operation: operation === 'create' || operation === 'update' ? operation : 'update',\n permissions: {},\n preferences,\n renderAllFields: false,\n req,\n schemaPath: '',\n })\n\n const errorPathsSet = new Set<string>()\n for (const fieldKey in result) {\n const fieldState = result[fieldKey]\n if (fieldState?.errorPaths?.length) {\n for (const errorPath of fieldState.errorPaths) {\n errorPathsSet.add(errorPath)\n }\n }\n }\n const errorPaths = Array.from(errorPathsSet)\n\n if (errorPaths.length) {\n return 'The following fields are invalid: ' + errorPaths.join(', ')\n }\n\n return true\n }\n}\n"],"mappings":"AAAA,SAASA,uBAAuB,QAAQ;AACxC,SAASC,SAAS,QAAQ;AAM1B,OAAO,MAAMC,gBAAA,GACXC,KAAA;EAEA,OAAO,OAAO;IACZC,IAAI;IACJC,UAAA,EAAY;MACVC,OAAA,EAAS;QACPC,EAAE;QACFC,IAAI;QACJC,SAAS;QACTC,WAAW;QACXC,GAAG;QACHA,GAAA,EAAK;UAAEC,OAAO;UAAEC;QAAC;MAAE;IACpB;EACF,CACF;IACC,MAAMC,MAAA,GAASF,OAAA,CAAQG,WAAW,CAACX,IAAA,CAAKY,UAAU,CAAC,EAAEC,YAAA,IAAgBL,OAAA,CAAQM,EAAE,CAACC,aAAa;IAC7F;IACA,MAAMC,MAAA,GAAShB,IAAA,EAAMiB,KAAA,EAAOd,EAAA,IAAMH,IAAA,EAAMiB,KAAA,CAAM;IAAA;IAE9C,IAAI,CAACpB,SAAA,CAAUmB,MAAA,EAAQN,MAAA,GAAS;MAC9B,OAAOD,CAAA,CAAE;IACX;IAEA,IAAI,CAACV,KAAA,EAAOY,WAAA,EAAa;MACvB,OAAO;IACT;IAEA,IAAIO,MAAA,CAAOC,IAAI,CAACpB,KAAA,EAAOY,WAAA,EAAaS,MAAM,KAAK,GAAG;MAChD,OAAO;IACT;IAEA,MAAMC,UAAA,GAAatB,KAAA,EAAOY,WAAW,CAACX,IAAA,CAAKY,UAAU,CAAC;IAEtD,IAAI,CAACS,UAAA,EAAYC,MAAA,EAAQF,MAAA,EAAQ;MAC/B,OAAO;IACT;IAEA,MAAMG,MAAA,GAAS,MAAM3B,uBAAA,CAAwB;MAC3CO,EAAA;MACAqB,cAAA,EAAgBxB,IAAA,CAAKY,UAAU;MAE/BR,IAAA,EAAMJ,IAAA,EAAMsB,MAAA,IAAU,CAAC;MACvBG,YAAA,EAAcrB,IAAA;MACdkB,MAAA,EAAQD,UAAA,CAAWC,MAAM;MACzBI,cAAA,EAAgBC,SAAA;MAChBC,gBAAA,EAAkB5B,IAAA,EAAMsB,MAAA,IAAU,CAAC;MACnCjB,SAAA,EAAWA,SAAA,KAAc,YAAYA,SAAA,KAAc,WAAWA,SAAA,GAAY;MAC1EwB,WAAA,EAAa,CAAC;MACdvB,WAAA;MACAwB,eAAA,EAAiB;MACjBvB,GAAA;MACAwB,UAAA,EAAY;IACd;IAEA,MAAMC,aAAA,GAAgB,IAAIC,GAAA;IAC1B,KAAK,MAAMC,QAAA,IAAYX,MAAA,EAAQ;MAC7B,MAAMY,UAAA,GAAaZ,MAAM,CAACW,QAAA,CAAS;MACnC,IAAIC,UAAA,EAAYC,UAAA,EAAYhB,MAAA,EAAQ;QAClC,KAAK,MAAMiB,SAAA,IAAaF,UAAA,CAAWC,UAAU,EAAE;UAC7CJ,aAAA,CAAcM,GAAG,CAACD,SAAA;QACpB;MACF;IACF;IACA,MAAMD,UAAA,GAAaG,KAAA,CAAMC,IAAI,CAACR,aAAA;IAE9B,IAAII,UAAA,CAAWhB,MAAM,EAAE;MACrB,OAAO,uCAAuCgB,UAAA,CAAWK,IAAI,CAAC;IAChE;IAEA,OAAO;EACT;AACF","ignoreList":[]}