@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.
- package/dist/dependencyChecker.spec.js +0 -2
- package/dist/dependencyChecker.spec.js.map +1 -1
- package/dist/exports/client/{Field-ZQTPXWY3.js → Field-NNWFQETL.js} +2 -2
- package/dist/exports/client/bundled.css +1 -1
- package/dist/exports/client/chunk-EE27FURT.js +2 -0
- package/dist/exports/client/chunk-EE27FURT.js.map +7 -0
- package/dist/exports/client/chunk-OZ6Q4DWN.js +12 -0
- package/dist/exports/client/chunk-OZ6Q4DWN.js.map +7 -0
- package/dist/exports/client/componentInline-XEH2GDVO.js +2 -0
- package/dist/exports/client/index.js +10 -10
- package/dist/exports/client/index.js.map +3 -3
- package/dist/exports/react/components/RichText/converter/converters/table.d.ts.map +1 -1
- package/dist/exports/react/components/RichText/converter/converters/table.js +10 -7
- package/dist/exports/react/components/RichText/converter/converters/table.js.map +1 -1
- package/dist/exports/react/components/RichText/converter/converters/upload.d.ts.map +1 -1
- package/dist/exports/react/components/RichText/converter/converters/upload.js +14 -10
- package/dist/exports/react/components/RichText/converter/converters/upload.js.map +1 -1
- package/dist/features/blocks/client/component/index.d.ts.map +1 -1
- package/dist/features/blocks/client/component/index.js +5 -2
- package/dist/features/blocks/client/component/index.js.map +1 -1
- package/dist/features/blocks/client/componentInline/index.d.ts.map +1 -1
- package/dist/features/blocks/client/componentInline/index.js +5 -2
- package/dist/features/blocks/client/componentInline/index.js.map +1 -1
- package/dist/features/blocks/client/index.d.ts.map +1 -1
- package/dist/features/blocks/client/index.js +3 -2
- package/dist/features/blocks/client/index.js.map +1 -1
- package/dist/features/blocks/server/index.d.ts +3 -3
- package/dist/features/blocks/server/index.d.ts.map +1 -1
- package/dist/features/blocks/server/index.js +58 -38
- package/dist/features/blocks/server/index.js.map +1 -1
- package/dist/features/blocks/server/validate.d.ts +5 -0
- package/dist/features/blocks/server/validate.d.ts.map +1 -1
- package/dist/features/blocks/server/validate.js +8 -2
- package/dist/features/blocks/server/validate.js.map +1 -1
- package/dist/features/converters/html/field/index.d.ts.map +1 -1
- package/dist/features/converters/html/field/index.js +3 -43
- package/dist/features/converters/html/field/index.js.map +1 -1
- package/dist/features/experimental_table/server/index.js +1 -1
- package/dist/features/experimental_table/server/index.js.map +1 -1
- package/dist/features/indent/client/index.d.ts.map +1 -1
- package/dist/features/indent/client/index.js +23 -7
- package/dist/features/indent/client/index.js.map +1 -1
- package/dist/features/link/server/validate.d.ts.map +1 -1
- package/dist/features/link/server/validate.js +3 -2
- package/dist/features/link/server/validate.js.map +1 -1
- package/dist/features/upload/server/feature.server.d.ts.map +1 -1
- package/dist/features/upload/server/feature.server.js +4 -3
- package/dist/features/upload/server/feature.server.js.map +1 -1
- package/dist/features/upload/server/nodes/UploadNode.d.ts +19 -8
- package/dist/features/upload/server/nodes/UploadNode.d.ts.map +1 -1
- package/dist/features/upload/server/nodes/UploadNode.js.map +1 -1
- package/dist/features/upload/server/validate.d.ts.map +1 -1
- package/dist/features/upload/server/validate.js +5 -4
- package/dist/features/upload/server/validate.js.map +1 -1
- package/dist/field/bundled.css +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/packages/@lexical/markdown/MarkdownExport.d.ts.map +1 -1
- package/dist/packages/@lexical/markdown/MarkdownExport.js +5 -5
- package/dist/packages/@lexical/markdown/MarkdownExport.js.map +1 -1
- package/dist/packages/@lexical/markdown/MarkdownImport.js +6 -5
- package/dist/packages/@lexical/markdown/MarkdownImport.js.map +1 -1
- package/dist/packages/@lexical/markdown/MarkdownShortcuts.d.ts.map +1 -1
- package/dist/packages/@lexical/markdown/MarkdownShortcuts.js +6 -4
- package/dist/packages/@lexical/markdown/MarkdownShortcuts.js.map +1 -1
- package/dist/packages/@lexical/markdown/MarkdownTransformers.js.map +1 -1
- package/dist/packages/@lexical/markdown/importTextFormatTransformer.d.ts.map +1 -1
- package/dist/packages/@lexical/markdown/importTextFormatTransformer.js +4 -1
- package/dist/packages/@lexical/markdown/importTextFormatTransformer.js.map +1 -1
- package/dist/packages/@lexical/markdown/importTextMatchTransformer.d.ts.map +1 -1
- package/dist/packages/@lexical/markdown/importTextMatchTransformer.js +1 -1
- package/dist/packages/@lexical/markdown/importTextMatchTransformer.js.map +1 -1
- package/dist/utilities/jsx/collectTopLevelJSXInLines.d.ts.map +1 -1
- package/dist/utilities/jsx/collectTopLevelJSXInLines.js +2 -1
- package/dist/utilities/jsx/collectTopLevelJSXInLines.js.map +1 -1
- package/dist/utilities/migrateSlateToLexical/index.js +8 -4
- package/dist/utilities/migrateSlateToLexical/index.js.map +1 -1
- package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.d.ts +3 -2
- package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.d.ts.map +1 -1
- package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.js +18 -13
- package/dist/utilities/migrateSlateToLexical/migrateDocumentFieldsRecursively.js.map +1 -1
- package/dist/utilities/upgradeLexicalData/index.js +8 -4
- package/dist/utilities/upgradeLexicalData/index.js.map +1 -1
- package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.d.ts +3 -2
- package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.d.ts.map +1 -1
- package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.js +18 -13
- package/dist/utilities/upgradeLexicalData/upgradeDocumentFieldsRecursively.js.map +1 -1
- package/dist/validate/hasText.js +1 -1
- package/dist/validate/hasText.js.map +1 -1
- package/package.json +7 -17
- package/dist/exports/client/chunk-CIY6PKN6.js +0 -12
- package/dist/exports/client/chunk-CIY6PKN6.js.map +0 -7
- package/dist/exports/client/chunk-KEEUF5NK.js +0 -2
- package/dist/exports/client/chunk-KEEUF5NK.js.map +0 -7
- package/dist/exports/client/componentInline-UG3ZWWJY.js +0 -2
- /package/dist/exports/client/{Field-ZQTPXWY3.js.map → Field-NNWFQETL.js.map} +0 -0
- /package/dist/exports/client/{componentInline-UG3ZWWJY.js.map → componentInline-XEH2GDVO.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["getTranslation","BlockIcon","InlineBlocksIcon","createClientFeature","getBlockImageComponent","BlockNode","InlineBlockNode","INSERT_BLOCK_COMMAND","INSERT_INLINE_BLOCK_COMMAND","BlocksPlugin","BlocksFeatureClient","featureClientSchemaMap","props","schemaPath","schemaMapRenderedBlockPathPrefix","schemaMapRenderedInlineBlockPathPrefix","clientSchema","blocksFields","Object","entries","filter","key","startsWith","replace","includes","map","value","inlineBlocksFields","clientBlocks","field","blocks","block","undefined","clientInlineBlocks","nodes","plugins","Component","position","sanitizedClientFeatureProps","slashMenu","groups","length","items","Icon","imageURL","imageAltText","slug","keywords","label","i18n","blockDisplayName","labels","singular","onSelect","editor","dispatchCommand","blockName","blockType","t","inlineBlock","Boolean","toolbarFixed","type","ChildComponent","index","isActive","order"],"sources":["../../../../src/features/blocks/client/index.tsx"],"sourcesContent":["'use client'\n\nimport type { I18nClient } from '@payloadcms/translations'\nimport type { BlocksFieldClient, ClientBlock } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\n\nimport type {\n SlashMenuGroup,\n SlashMenuItem,\n} from '../../../lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.js'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../toolbars/types.js'\n\nimport { BlockIcon } from '../../../lexical/ui/icons/Block/index.js'\nimport { InlineBlocksIcon } from '../../../lexical/ui/icons/InlineBlocks/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { getBlockImageComponent } from './getBlockImageComponent.js'\nimport { BlockNode } from './nodes/BlocksNode.js'\nimport { InlineBlockNode } from './nodes/InlineBlocksNode.js'\nimport { INSERT_BLOCK_COMMAND, INSERT_INLINE_BLOCK_COMMAND } from './plugin/commands.js'\nimport { BlocksPlugin } from './plugin/index.js'\nexport const BlocksFeatureClient = createClientFeature(\n ({ featureClientSchemaMap, props, schemaPath }) => {\n const schemaMapRenderedBlockPathPrefix = `${schemaPath}.lexical_internal_feature.blocks.lexical_blocks`\n const schemaMapRenderedInlineBlockPathPrefix = `${schemaPath}.lexical_internal_feature.blocks.lexical_inline_blocks`\n const clientSchema = featureClientSchemaMap['blocks']\n\n if (!clientSchema) {\n return {}\n }\n\n const blocksFields: BlocksFieldClient[] = Object.entries(clientSchema)\n .filter(\n ([key]) =>\n key.startsWith(schemaMapRenderedBlockPathPrefix + '.') &&\n !key.replace(schemaMapRenderedBlockPathPrefix + '.', '').includes('.'),\n )\n .map(([, value]) => value[0] as BlocksFieldClient)\n\n const inlineBlocksFields: BlocksFieldClient[] = Object.entries(clientSchema)\n .filter(\n ([key]) =>\n key.startsWith(schemaMapRenderedInlineBlockPathPrefix + '.') &&\n !key.replace(schemaMapRenderedInlineBlockPathPrefix + '.', '').includes('.'),\n )\n .map(([, value]) => value[0] as BlocksFieldClient)\n\n const clientBlocks: ClientBlock[] = blocksFields\n .map((field) => {\n return field.blocks[0]\n })\n .filter((block) => block !== undefined)\n\n const clientInlineBlocks: ClientBlock[] = inlineBlocksFields\n .map((field) => {\n return field.blocks[0]\n })\n .filter((block) => block !== undefined)\n\n return {\n nodes: [BlockNode, InlineBlockNode],\n plugins: [\n {\n Component: BlocksPlugin,\n position: 'normal',\n },\n ],\n sanitizedClientFeatureProps: props,\n slashMenu: {\n groups: [\n clientBlocks?.length\n ? {\n items: clientBlocks.map((block) => {\n return {\n Icon: getBlockImageComponent(block.imageURL, block.imageAltText),\n key: 'block-' + block.slug,\n keywords: ['block', 'blocks', block.slug],\n label: ({ i18n }) => {\n const blockDisplayName = block?.labels?.singular\n ? getTranslation(block.labels.singular, i18n)\n : block?.slug\n\n return blockDisplayName\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_BLOCK_COMMAND, {\n blockName: '',\n blockType: block.slug,\n })\n },\n } as SlashMenuItem\n }),\n key: 'blocks',\n label: ({ i18n }: { i18n: I18nClient<object, 'lexical:blocks:label'> }) => {\n return i18n.t('lexical:blocks:label')\n },\n }\n : null,\n clientInlineBlocks?.length\n ? {\n items: clientInlineBlocks.map((inlineBlock) => {\n return {\n Icon: InlineBlocksIcon,\n key: 'inlineBlocks-' + inlineBlock.slug,\n keywords: ['inlineBlock', 'inline block', inlineBlock.slug],\n label: ({ i18n }) => {\n const blockDisplayName = inlineBlock?.labels?.singular\n ? getTranslation(inlineBlock.labels.singular, i18n)\n : inlineBlock?.slug\n\n return blockDisplayName\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_INLINE_BLOCK_COMMAND, {\n blockName: '',\n blockType: inlineBlock.slug,\n })\n },\n } as SlashMenuItem\n }),\n key: 'inlineBlocks',\n label: ({\n i18n,\n }: {\n i18n: I18nClient<object, 'lexical:blocks:inlineBlocks:label'>\n }) => {\n return i18n.t('lexical:blocks:inlineBlocks:label')\n },\n }\n : null,\n ].filter(Boolean) as SlashMenuGroup[],\n },\n toolbarFixed: {\n groups: [\n clientBlocks.length\n ? {\n type: 'dropdown',\n ChildComponent: BlockIcon,\n items: clientBlocks.map((block, index) => {\n return {\n ChildComponent: getBlockImageComponent(block.imageURL, block.imageAltText),\n isActive: undefined, // At this point, we would be inside a sub-richtext-editor. And at this point this will be run against the focused sub-editor, not the parent editor which has the actual block. Thus, no point in running this\n key: 'block-' + block.slug,\n label: ({ i18n }) => {\n const blockDisplayName = block?.labels?.singular\n ? getTranslation(block.labels.singular, i18n)\n : block?.slug\n\n return blockDisplayName\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_BLOCK_COMMAND, {\n blockName: '',\n blockType: block.slug,\n })\n },\n order: index,\n } as ToolbarGroupItem\n }),\n key: 'blocks',\n order: 20,\n }\n : null,\n clientInlineBlocks?.length\n ? {\n type: 'dropdown',\n ChildComponent: InlineBlocksIcon,\n items: clientInlineBlocks.map((inlineBlock, index) => {\n return {\n ChildComponent: inlineBlock.imageURL\n ? getBlockImageComponent(inlineBlock.imageURL, inlineBlock.imageAltText)\n : InlineBlocksIcon,\n isActive: undefined,\n key: 'inlineBlock-' + inlineBlock.slug,\n label: ({ i18n }) => {\n const blockDisplayName = inlineBlock?.labels?.singular\n ? getTranslation(inlineBlock.labels.singular, i18n)\n : inlineBlock?.slug\n\n return blockDisplayName\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_INLINE_BLOCK_COMMAND, {\n blockName: '',\n blockType: inlineBlock.slug,\n })\n },\n order: index,\n } as ToolbarGroupItem\n }),\n key: 'inlineBlocks',\n order: 25,\n }\n : null,\n ].filter(Boolean) as ToolbarGroup[],\n },\n }\n },\n)\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["getTranslation","BlockIcon","InlineBlocksIcon","createClientFeature","getBlockImageComponent","BlockNode","InlineBlockNode","INSERT_BLOCK_COMMAND","INSERT_INLINE_BLOCK_COMMAND","BlocksPlugin","BlocksFeatureClient","config","featureClientSchemaMap","props","schemaPath","schemaMapRenderedBlockPathPrefix","schemaMapRenderedInlineBlockPathPrefix","clientSchema","blocksFields","Object","entries","filter","key","startsWith","replace","includes","map","value","inlineBlocksFields","clientBlocks","field","blockReferences","blocksMap","blocks","block","undefined","clientInlineBlocks","nodes","plugins","Component","position","sanitizedClientFeatureProps","slashMenu","groups","length","items","Icon","imageURL","imageAltText","slug","keywords","label","i18n","blockDisplayName","labels","singular","onSelect","editor","dispatchCommand","blockName","blockType","t","inlineBlock","Boolean","toolbarFixed","type","ChildComponent","index","isActive","order"],"sources":["../../../../src/features/blocks/client/index.tsx"],"sourcesContent":["'use client'\n\nimport type { I18nClient } from '@payloadcms/translations'\nimport type { BlocksFieldClient, ClientBlock } from 'payload'\n\nimport { getTranslation } from '@payloadcms/translations'\n\nimport type {\n SlashMenuGroup,\n SlashMenuItem,\n} from '../../../lexical/plugins/SlashMenu/LexicalTypeaheadMenuPlugin/types.js'\nimport type { ToolbarGroup, ToolbarGroupItem } from '../../toolbars/types.js'\n\nimport { BlockIcon } from '../../../lexical/ui/icons/Block/index.js'\nimport { InlineBlocksIcon } from '../../../lexical/ui/icons/InlineBlocks/index.js'\nimport { createClientFeature } from '../../../utilities/createClientFeature.js'\nimport { getBlockImageComponent } from './getBlockImageComponent.js'\nimport { BlockNode } from './nodes/BlocksNode.js'\nimport { InlineBlockNode } from './nodes/InlineBlocksNode.js'\nimport { INSERT_BLOCK_COMMAND, INSERT_INLINE_BLOCK_COMMAND } from './plugin/commands.js'\nimport { BlocksPlugin } from './plugin/index.js'\nexport const BlocksFeatureClient = createClientFeature(\n ({ config, featureClientSchemaMap, props, schemaPath }) => {\n const schemaMapRenderedBlockPathPrefix = `${schemaPath}.lexical_internal_feature.blocks.lexical_blocks`\n const schemaMapRenderedInlineBlockPathPrefix = `${schemaPath}.lexical_internal_feature.blocks.lexical_inline_blocks`\n const clientSchema = featureClientSchemaMap['blocks']\n\n if (!clientSchema) {\n return {}\n }\n\n const blocksFields: BlocksFieldClient[] = Object.entries(clientSchema)\n .filter(\n ([key]) =>\n key.startsWith(schemaMapRenderedBlockPathPrefix + '.') &&\n !key.replace(schemaMapRenderedBlockPathPrefix + '.', '').includes('.'),\n )\n .map(([, value]) => value[0] as BlocksFieldClient)\n\n const inlineBlocksFields: BlocksFieldClient[] = Object.entries(clientSchema)\n .filter(\n ([key]) =>\n key.startsWith(schemaMapRenderedInlineBlockPathPrefix + '.') &&\n !key.replace(schemaMapRenderedInlineBlockPathPrefix + '.', '').includes('.'),\n )\n .map(([, value]) => value[0] as BlocksFieldClient)\n\n const clientBlocks: ClientBlock[] = blocksFields\n .map((field) => {\n return field.blockReferences\n ? typeof field.blockReferences[0] === 'string'\n ? config.blocksMap[field.blockReferences[0]]\n : field.blockReferences[0]\n : field.blocks[0]\n })\n .filter((block) => block !== undefined)\n\n const clientInlineBlocks: ClientBlock[] = inlineBlocksFields\n .map((field) => {\n return field.blockReferences\n ? typeof field.blockReferences[0] === 'string'\n ? config.blocksMap[field.blockReferences[0]]\n : field.blockReferences[0]\n : field.blocks[0]\n })\n .filter((block) => block !== undefined)\n\n return {\n nodes: [BlockNode, InlineBlockNode],\n plugins: [\n {\n Component: BlocksPlugin,\n position: 'normal',\n },\n ],\n sanitizedClientFeatureProps: props,\n slashMenu: {\n groups: [\n clientBlocks?.length\n ? {\n items: clientBlocks.map((block) => {\n return {\n Icon: getBlockImageComponent(block.imageURL, block.imageAltText),\n key: 'block-' + block.slug,\n keywords: ['block', 'blocks', block.slug],\n label: ({ i18n }) => {\n const blockDisplayName = block?.labels?.singular\n ? getTranslation(block.labels.singular, i18n)\n : block?.slug\n\n return blockDisplayName\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_BLOCK_COMMAND, {\n blockName: '',\n blockType: block.slug,\n })\n },\n } as SlashMenuItem\n }),\n key: 'blocks',\n label: ({ i18n }: { i18n: I18nClient<object, 'lexical:blocks:label'> }) => {\n return i18n.t('lexical:blocks:label')\n },\n }\n : null,\n clientInlineBlocks?.length\n ? {\n items: clientInlineBlocks.map((inlineBlock) => {\n return {\n Icon: InlineBlocksIcon,\n key: 'inlineBlocks-' + inlineBlock.slug,\n keywords: ['inlineBlock', 'inline block', inlineBlock.slug],\n label: ({ i18n }) => {\n const blockDisplayName = inlineBlock?.labels?.singular\n ? getTranslation(inlineBlock.labels.singular, i18n)\n : inlineBlock?.slug\n\n return blockDisplayName\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_INLINE_BLOCK_COMMAND, {\n blockName: '',\n blockType: inlineBlock.slug,\n })\n },\n } as SlashMenuItem\n }),\n key: 'inlineBlocks',\n label: ({\n i18n,\n }: {\n i18n: I18nClient<object, 'lexical:blocks:inlineBlocks:label'>\n }) => {\n return i18n.t('lexical:blocks:inlineBlocks:label')\n },\n }\n : null,\n ].filter(Boolean) as SlashMenuGroup[],\n },\n toolbarFixed: {\n groups: [\n clientBlocks.length\n ? {\n type: 'dropdown',\n ChildComponent: BlockIcon,\n items: clientBlocks.map((block, index) => {\n return {\n ChildComponent: getBlockImageComponent(block.imageURL, block.imageAltText),\n isActive: undefined, // At this point, we would be inside a sub-richtext-editor. And at this point this will be run against the focused sub-editor, not the parent editor which has the actual block. Thus, no point in running this\n key: 'block-' + block.slug,\n label: ({ i18n }) => {\n const blockDisplayName = block?.labels?.singular\n ? getTranslation(block.labels.singular, i18n)\n : block?.slug\n\n return blockDisplayName\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_BLOCK_COMMAND, {\n blockName: '',\n blockType: block.slug,\n })\n },\n order: index,\n } as ToolbarGroupItem\n }),\n key: 'blocks',\n order: 20,\n }\n : null,\n clientInlineBlocks?.length\n ? {\n type: 'dropdown',\n ChildComponent: InlineBlocksIcon,\n items: clientInlineBlocks.map((inlineBlock, index) => {\n return {\n ChildComponent: inlineBlock.imageURL\n ? getBlockImageComponent(inlineBlock.imageURL, inlineBlock.imageAltText)\n : InlineBlocksIcon,\n isActive: undefined,\n key: 'inlineBlock-' + inlineBlock.slug,\n label: ({ i18n }) => {\n const blockDisplayName = inlineBlock?.labels?.singular\n ? getTranslation(inlineBlock.labels.singular, i18n)\n : inlineBlock?.slug\n\n return blockDisplayName\n },\n onSelect: ({ editor }) => {\n editor.dispatchCommand(INSERT_INLINE_BLOCK_COMMAND, {\n blockName: '',\n blockType: inlineBlock.slug,\n })\n },\n order: index,\n } as ToolbarGroupItem\n }),\n key: 'inlineBlocks',\n order: 25,\n }\n : null,\n ].filter(Boolean) as ToolbarGroup[],\n },\n }\n },\n)\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { Block } from 'payload';
|
|
1
|
+
import type { Block, BlockSlug } from 'payload';
|
|
2
2
|
export type BlocksFeatureProps = {
|
|
3
|
-
blocks?: Block[];
|
|
4
|
-
inlineBlocks?: Block[];
|
|
3
|
+
blocks?: (Block | BlockSlug)[] | Block[];
|
|
4
|
+
inlineBlocks?: (Block | BlockSlug)[] | Block[];
|
|
5
5
|
};
|
|
6
6
|
export declare const BlocksFeature: import("../../typesServer.js").FeatureProviderProviderServer<BlocksFeatureProps, BlocksFeatureProps, undefined>;
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/blocks/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/features/blocks/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EAEL,SAAS,EAIV,MAAM,SAAS,CAAA;AAahB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,CAAC,EAAE,CAAC,KAAK,GAAG,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,CAAA;IACxC,YAAY,CAAC,EAAE,CAAC,KAAK,GAAG,SAAS,CAAC,EAAE,GAAG,KAAK,EAAE,CAAA;CAC/C,CAAA;AAED,eAAO,MAAM,aAAa,iHAkPxB,CAAA"}
|
|
@@ -12,7 +12,7 @@ export const BlocksFeature = createServerFeature({
|
|
|
12
12
|
config: _config,
|
|
13
13
|
isRoot,
|
|
14
14
|
parentIsLocalized,
|
|
15
|
-
props
|
|
15
|
+
props: _props
|
|
16
16
|
}) => {
|
|
17
17
|
const validRelationships = _config.collections.map(c => c.slug) || [];
|
|
18
18
|
const sanitized = await sanitizeFields({
|
|
@@ -20,18 +20,34 @@ export const BlocksFeature = createServerFeature({
|
|
|
20
20
|
fields: [{
|
|
21
21
|
name: 'lexical_blocks',
|
|
22
22
|
type: 'blocks',
|
|
23
|
-
|
|
23
|
+
blockReferences: _props.blocks ?? [],
|
|
24
|
+
blocks: []
|
|
24
25
|
}, {
|
|
25
26
|
name: 'lexical_inline_blocks',
|
|
26
27
|
type: 'blocks',
|
|
27
|
-
|
|
28
|
+
blockReferences: _props.inlineBlocks ?? [],
|
|
29
|
+
blocks: []
|
|
28
30
|
}],
|
|
29
31
|
parentIsLocalized,
|
|
30
32
|
requireFieldLevelRichTextEditor: isRoot,
|
|
31
33
|
validRelationships
|
|
32
34
|
});
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
const pureBlocks = [];
|
|
36
|
+
for (const _block of sanitized[0].blockReferences ?? sanitized[0].blocks) {
|
|
37
|
+
const block = typeof _block === 'string' ? _config?.blocks?.find(b => b.slug === _block) : _block;
|
|
38
|
+
if (!block) {
|
|
39
|
+
throw new Error(`Block not found for slug: ${typeof _block === 'string' ? _block : _block?.slug}`);
|
|
40
|
+
}
|
|
41
|
+
pureBlocks.push(block);
|
|
42
|
+
}
|
|
43
|
+
const pureInlineBlocks = [];
|
|
44
|
+
for (const _block of sanitized[1].blockReferences ?? sanitized[1].blocks) {
|
|
45
|
+
const block = typeof _block === 'string' ? _config?.blocks?.find(b => b.slug === _block) : _block;
|
|
46
|
+
if (!block) {
|
|
47
|
+
throw new Error(`Block not found for slug: ${typeof _block === 'string' ? _block : _block?.slug}`);
|
|
48
|
+
}
|
|
49
|
+
pureInlineBlocks.push(block);
|
|
50
|
+
}
|
|
35
51
|
return {
|
|
36
52
|
ClientFeature: '@payloadcms/richtext-lexical/client#BlocksFeatureClient',
|
|
37
53
|
generatedTypes: {
|
|
@@ -43,32 +59,36 @@ export const BlocksFeature = createServerFeature({
|
|
|
43
59
|
i18n,
|
|
44
60
|
interfaceNameDefinitions
|
|
45
61
|
}) => {
|
|
46
|
-
if (!
|
|
62
|
+
if (!pureBlocks?.length && !pureInlineBlocks?.length) {
|
|
47
63
|
return currentSchema;
|
|
48
64
|
}
|
|
49
65
|
const fields = [];
|
|
50
|
-
if (
|
|
66
|
+
if (pureBlocks?.length) {
|
|
51
67
|
fields.push({
|
|
52
68
|
name: field?.name + '_lexical_blocks',
|
|
53
69
|
type: 'blocks',
|
|
54
|
-
blocks:
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
70
|
+
blocks: pureBlocks.map(block => {
|
|
71
|
+
return {
|
|
72
|
+
...block,
|
|
73
|
+
flattenedFields: flattenAllFields({
|
|
74
|
+
fields: block.fields
|
|
75
|
+
})
|
|
76
|
+
};
|
|
77
|
+
})
|
|
60
78
|
});
|
|
61
79
|
}
|
|
62
|
-
if (
|
|
80
|
+
if (pureInlineBlocks?.length) {
|
|
63
81
|
fields.push({
|
|
64
82
|
name: field?.name + '_lexical_inline_blocks',
|
|
65
83
|
type: 'blocks',
|
|
66
|
-
blocks:
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
84
|
+
blocks: pureInlineBlocks.map(block => {
|
|
85
|
+
return {
|
|
86
|
+
...block,
|
|
87
|
+
flattenedFields: flattenAllFields({
|
|
88
|
+
fields: block.fields
|
|
89
|
+
})
|
|
90
|
+
};
|
|
91
|
+
})
|
|
72
92
|
});
|
|
73
93
|
}
|
|
74
94
|
if (fields.length) {
|
|
@@ -80,15 +100,15 @@ export const BlocksFeature = createServerFeature({
|
|
|
80
100
|
}
|
|
81
101
|
},
|
|
82
102
|
generateSchemaMap: ({
|
|
83
|
-
|
|
103
|
+
config
|
|
84
104
|
}) => {
|
|
85
105
|
/**
|
|
86
106
|
* Add sub-fields to the schemaMap. E.g. if you have an array field as part of the block, and it runs addRow, it will request these
|
|
87
107
|
* sub-fields from the component map. Thus, we need to put them in the component map here.
|
|
88
108
|
*/
|
|
89
109
|
const schemaMap = new Map();
|
|
90
|
-
if (
|
|
91
|
-
for (const block of
|
|
110
|
+
if (pureBlocks?.length) {
|
|
111
|
+
for (const block of pureBlocks) {
|
|
92
112
|
const blockFields = [...block.fields];
|
|
93
113
|
if (block?.admin?.components) {
|
|
94
114
|
blockFields.unshift({
|
|
@@ -112,9 +132,9 @@ export const BlocksFeature = createServerFeature({
|
|
|
112
132
|
});
|
|
113
133
|
}
|
|
114
134
|
}
|
|
115
|
-
if (
|
|
135
|
+
if (pureInlineBlocks?.length) {
|
|
116
136
|
// To generate block schemaMap which generates things like the componentMap for admin.Label
|
|
117
|
-
for (const block of
|
|
137
|
+
for (const block of pureInlineBlocks) {
|
|
118
138
|
const blockFields = [...block.fields];
|
|
119
139
|
if (block?.admin?.components) {
|
|
120
140
|
blockFields.unshift({
|
|
@@ -142,8 +162,8 @@ export const BlocksFeature = createServerFeature({
|
|
|
142
162
|
},
|
|
143
163
|
i18n,
|
|
144
164
|
markdownTransformers: getBlockMarkdownTransformers({
|
|
145
|
-
blocks:
|
|
146
|
-
inlineBlocks:
|
|
165
|
+
blocks: pureBlocks,
|
|
166
|
+
inlineBlocks: pureInlineBlocks
|
|
147
167
|
}),
|
|
148
168
|
nodes: [createNode({
|
|
149
169
|
// @ts-expect-error - TODO: fix this
|
|
@@ -151,17 +171,17 @@ export const BlocksFeature = createServerFeature({
|
|
|
151
171
|
node
|
|
152
172
|
}) => {
|
|
153
173
|
if (!node) {
|
|
154
|
-
if (
|
|
174
|
+
if (pureBlocks?.length) {
|
|
155
175
|
return [{
|
|
156
176
|
name: 'lexical_blocks',
|
|
157
177
|
type: 'blocks',
|
|
158
|
-
blocks:
|
|
178
|
+
blocks: pureBlocks
|
|
159
179
|
}];
|
|
160
180
|
}
|
|
161
181
|
return [];
|
|
162
182
|
}
|
|
163
183
|
const blockType = node.fields.blockType;
|
|
164
|
-
const block =
|
|
184
|
+
const block = pureBlocks?.find(block => block.slug === blockType);
|
|
165
185
|
return block?.fields;
|
|
166
186
|
},
|
|
167
187
|
getSubFieldsData: ({
|
|
@@ -169,26 +189,26 @@ export const BlocksFeature = createServerFeature({
|
|
|
169
189
|
}) => {
|
|
170
190
|
return node?.fields;
|
|
171
191
|
},
|
|
172
|
-
graphQLPopulationPromises: [blockPopulationPromiseHOC(
|
|
192
|
+
graphQLPopulationPromises: [blockPopulationPromiseHOC(pureBlocks)],
|
|
173
193
|
node: ServerBlockNode,
|
|
174
|
-
validations: [blockValidationHOC(
|
|
194
|
+
validations: [blockValidationHOC(pureBlocks)]
|
|
175
195
|
}), createNode({
|
|
176
196
|
// @ts-expect-error - TODO: fix this
|
|
177
197
|
getSubFields: ({
|
|
178
198
|
node
|
|
179
199
|
}) => {
|
|
180
200
|
if (!node) {
|
|
181
|
-
if (
|
|
201
|
+
if (pureInlineBlocks?.length) {
|
|
182
202
|
return [{
|
|
183
203
|
name: 'lexical_inline_blocks',
|
|
184
204
|
type: 'blocks',
|
|
185
|
-
blocks:
|
|
205
|
+
blocks: pureInlineBlocks
|
|
186
206
|
}];
|
|
187
207
|
}
|
|
188
208
|
return [];
|
|
189
209
|
}
|
|
190
210
|
const blockType = node.fields.blockType;
|
|
191
|
-
const block =
|
|
211
|
+
const block = pureInlineBlocks?.find(block => block.slug === blockType);
|
|
192
212
|
return block?.fields;
|
|
193
213
|
},
|
|
194
214
|
getSubFieldsData: ({
|
|
@@ -196,11 +216,11 @@ export const BlocksFeature = createServerFeature({
|
|
|
196
216
|
}) => {
|
|
197
217
|
return node?.fields;
|
|
198
218
|
},
|
|
199
|
-
graphQLPopulationPromises: [blockPopulationPromiseHOC(
|
|
219
|
+
graphQLPopulationPromises: [blockPopulationPromiseHOC(pureInlineBlocks)],
|
|
200
220
|
node: ServerInlineBlockNode,
|
|
201
|
-
validations: [blockValidationHOC(
|
|
221
|
+
validations: [blockValidationHOC(pureInlineBlocks)]
|
|
202
222
|
})],
|
|
203
|
-
sanitizedServerFeatureProps:
|
|
223
|
+
sanitizedServerFeatureProps: _props
|
|
204
224
|
};
|
|
205
225
|
},
|
|
206
226
|
key: 'blocks'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["fieldsToJSONSchema","flattenAllFields","sanitizeFields","createServerFeature","createNode","blockPopulationPromiseHOC","i18n","getBlockMarkdownTransformers","ServerBlockNode","ServerInlineBlockNode","blockValidationHOC","BlocksFeature","feature","config","_config","isRoot","parentIsLocalized","props","validRelationships","collections","map","c","slug","sanitized","fields","name","type","blocks","inlineBlocks","requireFieldLevelRichTextEditor","ClientFeature","generatedTypes","modifyOutputSchema","collectionIDFieldTypes","currentSchema","field","interfaceNameDefinitions","length","push","block","flattenedFields","generateSchemaMap","schemaMap","Map","blockFields","admin","components","unshift","Block","BlockLabel","Label","set","markdownTransformers","nodes","getSubFields","node","blockType","find","getSubFieldsData","graphQLPopulationPromises","validations","sanitizedServerFeatureProps","key"],"sources":["../../../../src/features/blocks/server/index.ts"],"sourcesContent":["import type { Block, BlocksField, Config, FieldSchemaMap, FlattenedBlocksField } from 'payload'\n\nimport { fieldsToJSONSchema, flattenAllFields, sanitizeFields } from 'payload'\n\nimport { createServerFeature } from '../../../utilities/createServerFeature.js'\nimport { createNode } from '../../typeUtilities.js'\nimport { blockPopulationPromiseHOC } from './graphQLPopulationPromise.js'\nimport { i18n } from './i18n.js'\nimport { getBlockMarkdownTransformers } from './markdownTransformer.js'\nimport { ServerBlockNode } from './nodes/BlocksNode.js'\nimport { ServerInlineBlockNode } from './nodes/InlineBlocksNode.js'\nimport { blockValidationHOC } from './validate.js'\n\nexport type BlocksFeatureProps = {\n blocks?: Block[]\n inlineBlocks?: Block[]\n}\n\nexport const BlocksFeature = createServerFeature<BlocksFeatureProps, BlocksFeatureProps>({\n feature: async ({ config: _config, isRoot, parentIsLocalized, props }) => {\n const validRelationships = _config.collections.map((c) => c.slug) || []\n\n const sanitized = await sanitizeFields({\n config: _config as unknown as Config,\n fields: [\n {\n name: 'lexical_blocks',\n type: 'blocks',\n blocks: props.blocks ?? [],\n },\n {\n name: 'lexical_inline_blocks',\n type: 'blocks',\n blocks: props.inlineBlocks ?? [],\n },\n ],\n parentIsLocalized,\n requireFieldLevelRichTextEditor: isRoot,\n validRelationships,\n })\n\n props.blocks = (sanitized[0] as BlocksField).blocks\n props.inlineBlocks = (sanitized[1] as BlocksField).blocks\n\n return {\n ClientFeature: '@payloadcms/richtext-lexical/client#BlocksFeatureClient',\n generatedTypes: {\n modifyOutputSchema: ({\n collectionIDFieldTypes,\n config,\n currentSchema,\n field,\n i18n,\n interfaceNameDefinitions,\n }) => {\n if (!props?.blocks?.length && !props?.inlineBlocks?.length) {\n return currentSchema\n }\n\n const fields: FlattenedBlocksField[] = []\n\n if (props?.blocks?.length) {\n fields.push({\n name: field?.name + '_lexical_blocks',\n type: 'blocks',\n blocks: props.blocks.map((block) => ({\n ...block,\n flattenedFields: flattenAllFields({ fields: block.fields }),\n })),\n })\n }\n if (props?.inlineBlocks?.length) {\n fields.push({\n name: field?.name + '_lexical_inline_blocks',\n type: 'blocks',\n blocks: props.inlineBlocks.map((block) => ({\n ...block,\n flattenedFields: flattenAllFields({ fields: block.fields }),\n })),\n })\n }\n\n if (fields.length) {\n // This is only done so that interfaceNameDefinitions sets those block's interfaceNames.\n // we don't actually use the JSON Schema itself in the generated types yet.\n fieldsToJSONSchema(\n collectionIDFieldTypes,\n fields,\n interfaceNameDefinitions,\n config,\n i18n,\n )\n }\n\n return currentSchema\n },\n },\n generateSchemaMap: ({ props }) => {\n /**\n * Add sub-fields to the schemaMap. E.g. if you have an array field as part of the block, and it runs addRow, it will request these\n * sub-fields from the component map. Thus, we need to put them in the component map here.\n */\n const schemaMap: FieldSchemaMap = new Map()\n\n if (props?.blocks?.length) {\n for (const block of props.blocks) {\n const blockFields = [...block.fields]\n\n if (block?.admin?.components) {\n blockFields.unshift({\n name: `_components`,\n type: 'ui',\n admin: {\n components: {\n Block: block.admin?.components?.Block,\n BlockLabel: block.admin?.components?.Label,\n },\n },\n })\n }\n schemaMap.set(`lexical_blocks.${block.slug}.fields`, {\n fields: blockFields,\n })\n schemaMap.set(`lexical_blocks.${block.slug}`, {\n name: `lexical_blocks_${block.slug}`,\n type: 'blocks',\n blocks: [block],\n })\n }\n }\n\n if (props?.inlineBlocks?.length) {\n // To generate block schemaMap which generates things like the componentMap for admin.Label\n for (const block of props.inlineBlocks) {\n const blockFields = [...block.fields]\n\n if (block?.admin?.components) {\n blockFields.unshift({\n name: `_components`,\n type: 'ui',\n admin: {\n components: {\n Block: block.admin?.components?.Block,\n BlockLabel: block.admin?.components?.Label,\n },\n },\n })\n }\n\n schemaMap.set(`lexical_inline_blocks.${block.slug}.fields`, {\n fields: blockFields,\n })\n\n schemaMap.set(`lexical_inline_blocks.${block.slug}`, {\n name: `lexical_inline_blocks_${block.slug}`,\n type: 'blocks',\n blocks: [block],\n })\n }\n }\n\n return schemaMap\n },\n i18n,\n markdownTransformers: getBlockMarkdownTransformers({\n blocks: props.blocks,\n inlineBlocks: props.inlineBlocks,\n }),\n\n nodes: [\n createNode({\n // @ts-expect-error - TODO: fix this\n getSubFields: ({ node }) => {\n if (!node) {\n if (props?.blocks?.length) {\n return [\n {\n name: 'lexical_blocks',\n type: 'blocks',\n blocks: props.blocks,\n },\n ]\n }\n return []\n }\n\n const blockType = node.fields.blockType\n\n const block = props.blocks?.find((block) => block.slug === blockType)\n return block?.fields\n },\n getSubFieldsData: ({ node }) => {\n return node?.fields\n },\n graphQLPopulationPromises: [blockPopulationPromiseHOC(props.blocks)],\n node: ServerBlockNode,\n validations: [blockValidationHOC(props.blocks)],\n }),\n createNode({\n // @ts-expect-error - TODO: fix this\n getSubFields: ({ node }) => {\n if (!node) {\n if (props?.inlineBlocks?.length) {\n return [\n {\n name: 'lexical_inline_blocks',\n type: 'blocks',\n blocks: props.inlineBlocks,\n },\n ]\n }\n return []\n }\n\n const blockType = node.fields.blockType\n\n const block = props.inlineBlocks?.find((block) => block.slug === blockType)\n return block?.fields\n },\n getSubFieldsData: ({ node }) => {\n return node?.fields\n },\n graphQLPopulationPromises: [blockPopulationPromiseHOC(props.inlineBlocks)],\n node: ServerInlineBlockNode,\n validations: [blockValidationHOC(props.inlineBlocks)],\n }),\n ],\n sanitizedServerFeatureProps: props,\n }\n },\n key: 'blocks',\n})\n"],"mappings":"AAEA,SAASA,kBAAkB,EAAEC,gBAAgB,EAAEC,cAAc,QAAQ;AAErE,SAASC,mBAAmB,QAAQ;AACpC,SAASC,UAAU,QAAQ;AAC3B,SAASC,yBAAyB,QAAQ;AAC1C,SAASC,IAAI,QAAQ;AACrB,SAASC,4BAA4B,QAAQ;AAC7C,SAASC,eAAe,QAAQ;AAChC,SAASC,qBAAqB,QAAQ;AACtC,SAASC,kBAAkB,QAAQ;AAOnC,OAAO,MAAMC,aAAA,GAAgBR,mBAAA,CAA4D;EACvFS,OAAA,EAAS,MAAAA,CAAO;IAAEC,MAAA,EAAQC,OAAO;IAAEC,MAAM;IAAEC,iBAAiB;IAAEC;EAAK,CAAE;IACnE,MAAMC,kBAAA,GAAqBJ,OAAA,CAAQK,WAAW,CAACC,GAAG,CAAEC,CAAA,IAAMA,CAAA,CAAEC,IAAI,KAAK,EAAE;IAEvE,MAAMC,SAAA,GAAY,MAAMrB,cAAA,CAAe;MACrCW,MAAA,EAAQC,OAAA;MACRU,MAAA,EAAQ,CACN;QACEC,IAAA,EAAM;QACNC,IAAA,EAAM;QACNC,MAAA,EAAQV,KAAA,CAAMU,MAAM,IAAI;MAC1B,GACA;QACEF,IAAA,EAAM;QACNC,IAAA,EAAM;QACNC,MAAA,EAAQV,KAAA,CAAMW,YAAY,IAAI;MAChC,EACD;MACDZ,iBAAA;MACAa,+BAAA,EAAiCd,MAAA;MACjCG;IACF;IAEAD,KAAA,CAAMU,MAAM,GAAGJ,SAAU,CAAC,EAAE,CAAiBI,MAAM;IACnDV,KAAA,CAAMW,YAAY,GAAGL,SAAU,CAAC,EAAE,CAAiBI,MAAM;IAEzD,OAAO;MACLG,aAAA,EAAe;MACfC,cAAA,EAAgB;QACdC,kBAAA,EAAoBA,CAAC;UACnBC,sBAAsB;UACtBpB,MAAM;UACNqB,aAAa;UACbC,KAAK;UACL7B,IAAI;UACJ8B;QAAwB,CACzB;UACC,IAAI,CAACnB,KAAA,EAAOU,MAAA,EAAQU,MAAA,IAAU,CAACpB,KAAA,EAAOW,YAAA,EAAcS,MAAA,EAAQ;YAC1D,OAAOH,aAAA;UACT;UAEA,MAAMV,MAAA,GAAiC,EAAE;UAEzC,IAAIP,KAAA,EAAOU,MAAA,EAAQU,MAAA,EAAQ;YACzBb,MAAA,CAAOc,IAAI,CAAC;cACVb,IAAA,EAAMU,KAAA,EAAOV,IAAA,GAAO;cACpBC,IAAA,EAAM;cACNC,MAAA,EAAQV,KAAA,CAAMU,MAAM,CAACP,GAAG,CAAEmB,KAAA,KAAW;gBACnC,GAAGA,KAAK;gBACRC,eAAA,EAAiBvC,gBAAA,CAAiB;kBAAEuB,MAAA,EAAQe,KAAA,CAAMf;gBAAO;cAC3D;YACF;UACF;UACA,IAAIP,KAAA,EAAOW,YAAA,EAAcS,MAAA,EAAQ;YAC/Bb,MAAA,CAAOc,IAAI,CAAC;cACVb,IAAA,EAAMU,KAAA,EAAOV,IAAA,GAAO;cACpBC,IAAA,EAAM;cACNC,MAAA,EAAQV,KAAA,CAAMW,YAAY,CAACR,GAAG,CAAEmB,KAAA,KAAW;gBACzC,GAAGA,KAAK;gBACRC,eAAA,EAAiBvC,gBAAA,CAAiB;kBAAEuB,MAAA,EAAQe,KAAA,CAAMf;gBAAO;cAC3D;YACF;UACF;UAEA,IAAIA,MAAA,CAAOa,MAAM,EAAE;YACjB;YACA;YACArC,kBAAA,CACEiC,sBAAA,EACAT,MAAA,EACAY,wBAAA,EACAvB,MAAA,EACAP,IAAA;UAEJ;UAEA,OAAO4B,aAAA;QACT;MACF;MACAO,iBAAA,EAAmBA,CAAC;QAAExB;MAAK,CAAE;QAC3B;;;;QAIA,MAAMyB,SAAA,GAA4B,IAAIC,GAAA;QAEtC,IAAI1B,KAAA,EAAOU,MAAA,EAAQU,MAAA,EAAQ;UACzB,KAAK,MAAME,KAAA,IAAStB,KAAA,CAAMU,MAAM,EAAE;YAChC,MAAMiB,WAAA,GAAc,C,GAAIL,KAAA,CAAMf,MAAM,CAAC;YAErC,IAAIe,KAAA,EAAOM,KAAA,EAAOC,UAAA,EAAY;cAC5BF,WAAA,CAAYG,OAAO,CAAC;gBAClBtB,IAAA,EAAM,aAAa;gBACnBC,IAAA,EAAM;gBACNmB,KAAA,EAAO;kBACLC,UAAA,EAAY;oBACVE,KAAA,EAAOT,KAAA,CAAMM,KAAK,EAAEC,UAAA,EAAYE,KAAA;oBAChCC,UAAA,EAAYV,KAAA,CAAMM,KAAK,EAAEC,UAAA,EAAYI;kBACvC;gBACF;cACF;YACF;YACAR,SAAA,CAAUS,GAAG,CAAC,kBAAkBZ,KAAA,CAAMjB,IAAI,SAAS,EAAE;cACnDE,MAAA,EAAQoB;YACV;YACAF,SAAA,CAAUS,GAAG,CAAC,kBAAkBZ,KAAA,CAAMjB,IAAI,EAAE,EAAE;cAC5CG,IAAA,EAAM,kBAAkBc,KAAA,CAAMjB,IAAI,EAAE;cACpCI,IAAA,EAAM;cACNC,MAAA,EAAQ,CAACY,KAAA;YACX;UACF;QACF;QAEA,IAAItB,KAAA,EAAOW,YAAA,EAAcS,MAAA,EAAQ;UAC/B;UACA,KAAK,MAAME,KAAA,IAAStB,KAAA,CAAMW,YAAY,EAAE;YACtC,MAAMgB,WAAA,GAAc,C,GAAIL,KAAA,CAAMf,MAAM,CAAC;YAErC,IAAIe,KAAA,EAAOM,KAAA,EAAOC,UAAA,EAAY;cAC5BF,WAAA,CAAYG,OAAO,CAAC;gBAClBtB,IAAA,EAAM,aAAa;gBACnBC,IAAA,EAAM;gBACNmB,KAAA,EAAO;kBACLC,UAAA,EAAY;oBACVE,KAAA,EAAOT,KAAA,CAAMM,KAAK,EAAEC,UAAA,EAAYE,KAAA;oBAChCC,UAAA,EAAYV,KAAA,CAAMM,KAAK,EAAEC,UAAA,EAAYI;kBACvC;gBACF;cACF;YACF;YAEAR,SAAA,CAAUS,GAAG,CAAC,yBAAyBZ,KAAA,CAAMjB,IAAI,SAAS,EAAE;cAC1DE,MAAA,EAAQoB;YACV;YAEAF,SAAA,CAAUS,GAAG,CAAC,yBAAyBZ,KAAA,CAAMjB,IAAI,EAAE,EAAE;cACnDG,IAAA,EAAM,yBAAyBc,KAAA,CAAMjB,IAAI,EAAE;cAC3CI,IAAA,EAAM;cACNC,MAAA,EAAQ,CAACY,KAAA;YACX;UACF;QACF;QAEA,OAAOG,SAAA;MACT;MACApC,IAAA;MACA8C,oBAAA,EAAsB7C,4BAAA,CAA6B;QACjDoB,MAAA,EAAQV,KAAA,CAAMU,MAAM;QACpBC,YAAA,EAAcX,KAAA,CAAMW;MACtB;MAEAyB,KAAA,EAAO,CACLjD,UAAA,CAAW;QACT;QACAkD,YAAA,EAAcA,CAAC;UAAEC;QAAI,CAAE;UACrB,IAAI,CAACA,IAAA,EAAM;YACT,IAAItC,KAAA,EAAOU,MAAA,EAAQU,MAAA,EAAQ;cACzB,OAAO,CACL;gBACEZ,IAAA,EAAM;gBACNC,IAAA,EAAM;gBACNC,MAAA,EAAQV,KAAA,CAAMU;cAChB,EACD;YACH;YACA,OAAO,EAAE;UACX;UAEA,MAAM6B,SAAA,GAAYD,IAAA,CAAK/B,MAAM,CAACgC,SAAS;UAEvC,MAAMjB,KAAA,GAAQtB,KAAA,CAAMU,MAAM,EAAE8B,IAAA,CAAMlB,KAAA,IAAUA,KAAA,CAAMjB,IAAI,KAAKkC,SAAA;UAC3D,OAAOjB,KAAA,EAAOf,MAAA;QAChB;QACAkC,gBAAA,EAAkBA,CAAC;UAAEH;QAAI,CAAE;UACzB,OAAOA,IAAA,EAAM/B,MAAA;QACf;QACAmC,yBAAA,EAA2B,CAACtD,yBAAA,CAA0BY,KAAA,CAAMU,MAAM,EAAE;QACpE4B,IAAA,EAAM/C,eAAA;QACNoD,WAAA,EAAa,CAAClD,kBAAA,CAAmBO,KAAA,CAAMU,MAAM;MAC/C,IACAvB,UAAA,CAAW;QACT;QACAkD,YAAA,EAAcA,CAAC;UAAEC;QAAI,CAAE;UACrB,IAAI,CAACA,IAAA,EAAM;YACT,IAAItC,KAAA,EAAOW,YAAA,EAAcS,MAAA,EAAQ;cAC/B,OAAO,CACL;gBACEZ,IAAA,EAAM;gBACNC,IAAA,EAAM;gBACNC,MAAA,EAAQV,KAAA,CAAMW;cAChB,EACD;YACH;YACA,OAAO,EAAE;UACX;UAEA,MAAM4B,SAAA,GAAYD,IAAA,CAAK/B,MAAM,CAACgC,SAAS;UAEvC,MAAMjB,KAAA,GAAQtB,KAAA,CAAMW,YAAY,EAAE6B,IAAA,CAAMlB,KAAA,IAAUA,KAAA,CAAMjB,IAAI,KAAKkC,SAAA;UACjE,OAAOjB,KAAA,EAAOf,MAAA;QAChB;QACAkC,gBAAA,EAAkBA,CAAC;UAAEH;QAAI,CAAE;UACzB,OAAOA,IAAA,EAAM/B,MAAA;QACf;QACAmC,yBAAA,EAA2B,CAACtD,yBAAA,CAA0BY,KAAA,CAAMW,YAAY,EAAE;QAC1E2B,IAAA,EAAM9C,qBAAA;QACNmD,WAAA,EAAa,CAAClD,kBAAA,CAAmBO,KAAA,CAAMW,YAAY;MACrD,GACD;MACDiC,2BAAA,EAA6B5C;IAC/B;EACF;EACA6C,GAAA,EAAK;AACP","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["fieldsToJSONSchema","flattenAllFields","sanitizeFields","createServerFeature","createNode","blockPopulationPromiseHOC","i18n","getBlockMarkdownTransformers","ServerBlockNode","ServerInlineBlockNode","blockValidationHOC","BlocksFeature","feature","config","_config","isRoot","parentIsLocalized","props","_props","validRelationships","collections","map","c","slug","sanitized","fields","name","type","blockReferences","blocks","inlineBlocks","requireFieldLevelRichTextEditor","pureBlocks","_block","block","find","b","Error","push","pureInlineBlocks","ClientFeature","generatedTypes","modifyOutputSchema","collectionIDFieldTypes","currentSchema","field","interfaceNameDefinitions","length","flattenedFields","generateSchemaMap","schemaMap","Map","blockFields","admin","components","unshift","Block","BlockLabel","Label","set","markdownTransformers","nodes","getSubFields","node","blockType","getSubFieldsData","graphQLPopulationPromises","validations","sanitizedServerFeatureProps","key"],"sources":["../../../../src/features/blocks/server/index.ts"],"sourcesContent":["import type {\n Block,\n BlocksField,\n BlockSlug,\n Config,\n FieldSchemaMap,\n FlattenedBlocksField,\n} from 'payload'\n\nimport { fieldsToJSONSchema, flattenAllFields, sanitizeFields } from 'payload'\n\nimport { createServerFeature } from '../../../utilities/createServerFeature.js'\nimport { createNode } from '../../typeUtilities.js'\nimport { blockPopulationPromiseHOC } from './graphQLPopulationPromise.js'\nimport { i18n } from './i18n.js'\nimport { getBlockMarkdownTransformers } from './markdownTransformer.js'\nimport { ServerBlockNode } from './nodes/BlocksNode.js'\nimport { ServerInlineBlockNode } from './nodes/InlineBlocksNode.js'\nimport { blockValidationHOC } from './validate.js'\n\nexport type BlocksFeatureProps = {\n blocks?: (Block | BlockSlug)[] | Block[]\n inlineBlocks?: (Block | BlockSlug)[] | Block[]\n}\n\nexport const BlocksFeature = createServerFeature<BlocksFeatureProps, BlocksFeatureProps>({\n feature: async ({ config: _config, isRoot, parentIsLocalized, props: _props }) => {\n const validRelationships = _config.collections.map((c) => c.slug) || []\n\n const sanitized = await sanitizeFields({\n config: _config as unknown as Config,\n fields: [\n {\n name: 'lexical_blocks',\n type: 'blocks',\n blockReferences: _props.blocks ?? [],\n blocks: [],\n },\n {\n name: 'lexical_inline_blocks',\n type: 'blocks',\n blockReferences: _props.inlineBlocks ?? [],\n blocks: [],\n },\n ],\n parentIsLocalized,\n requireFieldLevelRichTextEditor: isRoot,\n validRelationships,\n })\n\n const pureBlocks: Block[] = []\n for (const _block of (sanitized[0] as BlocksField).blockReferences ??\n (sanitized[0] as BlocksField).blocks) {\n const block =\n typeof _block === 'string' ? _config?.blocks?.find((b) => b.slug === _block) : _block\n if (!block) {\n throw new Error(\n `Block not found for slug: ${typeof _block === 'string' ? _block : _block?.slug}`,\n )\n }\n pureBlocks.push(block)\n }\n\n const pureInlineBlocks: Block[] = []\n for (const _block of (sanitized[1] as BlocksField).blockReferences ??\n (sanitized[1] as BlocksField).blocks) {\n const block =\n typeof _block === 'string' ? _config?.blocks?.find((b) => b.slug === _block) : _block\n if (!block) {\n throw new Error(\n `Block not found for slug: ${typeof _block === 'string' ? _block : _block?.slug}`,\n )\n }\n pureInlineBlocks.push(block)\n }\n\n return {\n ClientFeature: '@payloadcms/richtext-lexical/client#BlocksFeatureClient',\n generatedTypes: {\n modifyOutputSchema: ({\n collectionIDFieldTypes,\n config,\n currentSchema,\n field,\n i18n,\n interfaceNameDefinitions,\n }) => {\n if (!pureBlocks?.length && !pureInlineBlocks?.length) {\n return currentSchema\n }\n\n const fields: FlattenedBlocksField[] = []\n\n if (pureBlocks?.length) {\n fields.push({\n name: field?.name + '_lexical_blocks',\n type: 'blocks',\n blocks: pureBlocks.map((block) => {\n return {\n ...block,\n flattenedFields: flattenAllFields({ fields: block.fields }),\n }\n }),\n })\n }\n if (pureInlineBlocks?.length) {\n fields.push({\n name: field?.name + '_lexical_inline_blocks',\n type: 'blocks',\n blocks: pureInlineBlocks.map((block) => {\n return {\n ...block,\n flattenedFields: flattenAllFields({ fields: block.fields }),\n }\n }),\n })\n }\n\n if (fields.length) {\n // This is only done so that interfaceNameDefinitions sets those block's interfaceNames.\n // we don't actually use the JSON Schema itself in the generated types yet.\n fieldsToJSONSchema(\n collectionIDFieldTypes,\n fields,\n interfaceNameDefinitions,\n config,\n i18n,\n )\n }\n\n return currentSchema\n },\n },\n generateSchemaMap: ({ config }) => {\n /**\n * Add sub-fields to the schemaMap. E.g. if you have an array field as part of the block, and it runs addRow, it will request these\n * sub-fields from the component map. Thus, we need to put them in the component map here.\n */\n const schemaMap: FieldSchemaMap = new Map()\n\n if (pureBlocks?.length) {\n for (const block of pureBlocks) {\n const blockFields = [...block.fields]\n\n if (block?.admin?.components) {\n blockFields.unshift({\n name: `_components`,\n type: 'ui',\n admin: {\n components: {\n Block: block.admin?.components?.Block,\n BlockLabel: block.admin?.components?.Label,\n },\n },\n })\n }\n schemaMap.set(`lexical_blocks.${block.slug}.fields`, {\n fields: blockFields,\n })\n schemaMap.set(`lexical_blocks.${block.slug}`, {\n name: `lexical_blocks_${block.slug}`,\n type: 'blocks',\n blocks: [block],\n })\n }\n }\n\n if (pureInlineBlocks?.length) {\n // To generate block schemaMap which generates things like the componentMap for admin.Label\n for (const block of pureInlineBlocks) {\n const blockFields = [...block.fields]\n\n if (block?.admin?.components) {\n blockFields.unshift({\n name: `_components`,\n type: 'ui',\n admin: {\n components: {\n Block: block.admin?.components?.Block,\n BlockLabel: block.admin?.components?.Label,\n },\n },\n })\n }\n\n schemaMap.set(`lexical_inline_blocks.${block.slug}.fields`, {\n fields: blockFields,\n })\n\n schemaMap.set(`lexical_inline_blocks.${block.slug}`, {\n name: `lexical_inline_blocks_${block.slug}`,\n type: 'blocks',\n blocks: [block],\n })\n }\n }\n\n return schemaMap\n },\n i18n,\n markdownTransformers: getBlockMarkdownTransformers({\n blocks: pureBlocks,\n inlineBlocks: pureInlineBlocks,\n }),\n\n nodes: [\n createNode({\n // @ts-expect-error - TODO: fix this\n getSubFields: ({ node }) => {\n if (!node) {\n if (pureBlocks?.length) {\n return [\n {\n name: 'lexical_blocks',\n type: 'blocks',\n blocks: pureBlocks,\n },\n ]\n }\n return []\n }\n\n const blockType = node.fields.blockType\n\n const block = pureBlocks?.find((block) => block.slug === blockType)\n return block?.fields\n },\n getSubFieldsData: ({ node }) => {\n return node?.fields\n },\n graphQLPopulationPromises: [blockPopulationPromiseHOC(pureBlocks)],\n node: ServerBlockNode,\n validations: [blockValidationHOC(pureBlocks)],\n }),\n createNode({\n // @ts-expect-error - TODO: fix this\n getSubFields: ({ node }) => {\n if (!node) {\n if (pureInlineBlocks?.length) {\n return [\n {\n name: 'lexical_inline_blocks',\n type: 'blocks',\n blocks: pureInlineBlocks,\n },\n ]\n }\n return []\n }\n\n const blockType = node.fields.blockType\n\n const block = pureInlineBlocks?.find((block) => block.slug === blockType)\n return block?.fields\n },\n getSubFieldsData: ({ node }) => {\n return node?.fields\n },\n graphQLPopulationPromises: [blockPopulationPromiseHOC(pureInlineBlocks)],\n node: ServerInlineBlockNode,\n validations: [blockValidationHOC(pureInlineBlocks)],\n }),\n ],\n sanitizedServerFeatureProps: _props,\n }\n },\n key: 'blocks',\n})\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -2,5 +2,10 @@ import type { Block } from 'payload';
|
|
|
2
2
|
import type { NodeValidation } from '../../typesServer.js';
|
|
3
3
|
import type { SerializedBlockNode } from './nodes/BlocksNode.js';
|
|
4
4
|
import type { SerializedInlineBlockNode } from './nodes/InlineBlocksNode.js';
|
|
5
|
+
/**
|
|
6
|
+
* Runs validation for blocks. This function will determine if the rich text field itself is valid. It does not handle
|
|
7
|
+
* block field error paths - this is done by the `beforeChangeTraverseFields` call in the `beforeChange` hook, called from the
|
|
8
|
+
* rich text adapter.
|
|
9
|
+
*/
|
|
5
10
|
export declare const blockValidationHOC: (blocks: Block[]) => NodeValidation<SerializedBlockNode | SerializedInlineBlockNode>;
|
|
6
11
|
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../src/features/blocks/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,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC7E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AAE5E,eAAO,MAAM,kBAAkB,WACrB,KAAK,EAAE,KACd,cAAc,CAAC,mBAAmB,GAAG,yBAAyB,
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../src/features/blocks/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,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAC7E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAA;AAE5E;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,WACrB,KAAK,EAAE,KACd,cAAc,CAAC,mBAAmB,GAAG,yBAAyB,CAqDhE,CAAA"}
|
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { fieldSchemasToFormState } from '@payloadcms/ui/forms/fieldSchemasToFormState';
|
|
2
|
+
/**
|
|
3
|
+
* Runs validation for blocks. This function will determine if the rich text field itself is valid. It does not handle
|
|
4
|
+
* block field error paths - this is done by the `beforeChangeTraverseFields` call in the `beforeChange` hook, called from the
|
|
5
|
+
* rich text adapter.
|
|
6
|
+
*/
|
|
2
7
|
export const blockValidationHOC = blocks => {
|
|
3
8
|
return async ({
|
|
4
9
|
node,
|
|
@@ -41,8 +46,9 @@ export const blockValidationHOC = blocks => {
|
|
|
41
46
|
});
|
|
42
47
|
const errorPathsSet = new Set();
|
|
43
48
|
for (const fieldKey in result) {
|
|
44
|
-
|
|
45
|
-
|
|
49
|
+
const fieldState = result[fieldKey];
|
|
50
|
+
if (fieldState?.errorPaths?.length) {
|
|
51
|
+
for (const errorPath of fieldState.errorPaths) {
|
|
46
52
|
errorPathsSet.add(errorPath);
|
|
47
53
|
}
|
|
48
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","names":["fieldSchemasToFormState","blockValidationHOC","blocks","node","validation","blockFieldData","fields","options","id","collectionSlug","data","operation","preferences","req","block","find","slug","blockType","result","documentData","fieldSchemaMap","undefined","initialBlockData","permissions","renderAllFields","schemaPath","errorPathsSet","Set","fieldKey","errorPaths","length","errorPath","add","Array","from","join"],"sources":["../../../../src/features/blocks/server/validate.ts"],"sourcesContent":["import type { Block } from 'payload'\n\nimport { fieldSchemasToFormState } from '@payloadcms/ui/forms/fieldSchemasToFormState'\n\nimport type { NodeValidation } from '../../typesServer.js'\nimport type { BlockFields, SerializedBlockNode } from './nodes/BlocksNode.js'\nimport type { SerializedInlineBlockNode } from './nodes/InlineBlocksNode.js'\n\nexport const blockValidationHOC = (\n blocks: Block[],\n): NodeValidation<SerializedBlockNode | SerializedInlineBlockNode> => {\n return async ({ node, validation }) => {\n const blockFieldData = node.fields ?? ({} as BlockFields)\n\n const {\n options: { id, collectionSlug, data, operation, preferences, req },\n } = validation\n\n // find block\n const block = blocks.find((block) => block.slug === blockFieldData.blockType)\n\n // validate block\n if (!block) {\n return `Block ${blockFieldData.blockType} not found`\n }\n\n /**\n * Run fieldSchemasToFormState as that properly validates block and block sub-fields\n */\n\n const result = await fieldSchemasToFormState({\n id,\n collectionSlug,\n data: blockFieldData,\n documentData: data,\n fields: block.fields,\n fieldSchemaMap: undefined,\n initialBlockData: blockFieldData,\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
|
|
1
|
+
{"version":3,"file":"validate.js","names":["fieldSchemasToFormState","blockValidationHOC","blocks","node","validation","blockFieldData","fields","options","id","collectionSlug","data","operation","preferences","req","block","find","slug","blockType","result","documentData","fieldSchemaMap","undefined","initialBlockData","permissions","renderAllFields","schemaPath","errorPathsSet","Set","fieldKey","fieldState","errorPaths","length","errorPath","add","Array","from","join"],"sources":["../../../../src/features/blocks/server/validate.ts"],"sourcesContent":["import type { Block } from 'payload'\n\nimport { fieldSchemasToFormState } from '@payloadcms/ui/forms/fieldSchemasToFormState'\n\nimport type { NodeValidation } from '../../typesServer.js'\nimport type { BlockFields, SerializedBlockNode } from './nodes/BlocksNode.js'\nimport type { SerializedInlineBlockNode } from './nodes/InlineBlocksNode.js'\n\n/**\n * Runs validation for blocks. This function will determine if the rich text field itself is valid. It does not handle\n * block field error paths - this is done by the `beforeChangeTraverseFields` call in the `beforeChange` hook, called from the\n * rich text adapter.\n */\nexport const blockValidationHOC = (\n blocks: Block[],\n): NodeValidation<SerializedBlockNode | SerializedInlineBlockNode> => {\n return async ({ node, validation }) => {\n const blockFieldData = node.fields ?? ({} as BlockFields)\n\n const {\n options: { id, collectionSlug, data, operation, preferences, req },\n } = validation\n\n // find block\n const block = blocks.find((block) => block.slug === blockFieldData.blockType)\n\n // validate block\n if (!block) {\n return `Block ${blockFieldData.blockType} not found`\n }\n\n /**\n * Run fieldSchemasToFormState as that properly validates block and block sub-fields\n */\n\n const result = await fieldSchemasToFormState({\n id,\n collectionSlug,\n data: blockFieldData,\n documentData: data,\n fields: block.fields,\n fieldSchemaMap: undefined,\n initialBlockData: blockFieldData,\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;;;;;AAKA,OAAO,MAAMC,kBAAA,GACXC,MAAA;EAEA,OAAO,OAAO;IAAEC,IAAI;IAAEC;EAAU,CAAE;IAChC,MAAMC,cAAA,GAAiBF,IAAA,CAAKG,MAAM,IAAK,CAAC;IAExC,MAAM;MACJC,OAAA,EAAS;QAAEC,EAAE;QAAEC,cAAc;QAAEC,IAAI;QAAEC,SAAS;QAAEC,WAAW;QAAEC;MAAG;IAAE,CACnE,GAAGT,UAAA;IAEJ;IACA,MAAMU,KAAA,GAAQZ,MAAA,CAAOa,IAAI,CAAED,KAAA,IAAUA,KAAA,CAAME,IAAI,KAAKX,cAAA,CAAeY,SAAS;IAE5E;IACA,IAAI,CAACH,KAAA,EAAO;MACV,OAAO,SAAST,cAAA,CAAeY,SAAS,YAAY;IACtD;IAEA;;;IAIA,MAAMC,MAAA,GAAS,MAAMlB,uBAAA,CAAwB;MAC3CQ,EAAA;MACAC,cAAA;MACAC,IAAA,EAAML,cAAA;MACNc,YAAA,EAAcT,IAAA;MACdJ,MAAA,EAAQQ,KAAA,CAAMR,MAAM;MACpBc,cAAA,EAAgBC,SAAA;MAChBC,gBAAA,EAAkBjB,cAAA;MAClBM,SAAA,EAAWA,SAAA,KAAc,YAAYA,SAAA,KAAc,WAAWA,SAAA,GAAY;MAC1EY,WAAA,EAAa,CAAC;MACdX,WAAA;MACAY,eAAA,EAAiB;MACjBX,GAAA;MACAY,UAAA,EAAY;IACd;IAEA,MAAMC,aAAA,GAAgB,IAAIC,GAAA;IAC1B,KAAK,MAAMC,QAAA,IAAYV,MAAA,EAAQ;MAC7B,MAAMW,UAAA,GAAaX,MAAM,CAACU,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":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/converters/html/field/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/features/converters/html/field/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAqD,MAAM,SAAS,CAAA;AAEvF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAA;AAEtF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAM1D,KAAK,KAAK,GAAG;IACX;;;;OAIG;IACH,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,sBAEnC;IACD,YAAY,EAAE,2BAA2B,CAAA;CAC1C,KAAG,aAAa,EA+ChB,CAAA;AAED,eAAO,MAAM,WAAW,EAAE;AACxB;;;;IAII;AACJ,gBAAgB,EAAE,MAAM,EACxB,KAAK,EAAE,KAAK,KACT,KAwFJ,CAAA"}
|
|
@@ -43,40 +43,6 @@ export const consolidateHTMLConverters = ({
|
|
|
43
43
|
}
|
|
44
44
|
return filteredConverters;
|
|
45
45
|
};
|
|
46
|
-
// find the path of this field, as well as its sibling fields, by looking for this `field` in fields and traversing it recursively
|
|
47
|
-
function findFieldPathAndSiblingFields(fields, path, field) {
|
|
48
|
-
for (const curField of fields) {
|
|
49
|
-
if (curField === field) {
|
|
50
|
-
return {
|
|
51
|
-
path: [...path, curField.name],
|
|
52
|
-
siblingFields: fields
|
|
53
|
-
};
|
|
54
|
-
}
|
|
55
|
-
if ('fields' in curField) {
|
|
56
|
-
const result = findFieldPathAndSiblingFields(curField.fields, 'name' in curField ? [...path, curField.name] : [...path], field);
|
|
57
|
-
if (result) {
|
|
58
|
-
return result;
|
|
59
|
-
}
|
|
60
|
-
} else if ('tabs' in curField) {
|
|
61
|
-
for (const tab of curField.tabs) {
|
|
62
|
-
const result = findFieldPathAndSiblingFields(tab.fields, 'name' in tab ? [...path, tab.name] : [...path], field);
|
|
63
|
-
if (result) {
|
|
64
|
-
return result;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
} else if ('blocks' in curField) {
|
|
68
|
-
for (const block of curField.blocks) {
|
|
69
|
-
if (block?.fields?.length) {
|
|
70
|
-
const result = findFieldPathAndSiblingFields(block.fields, [...path, curField.name, block.slug], field);
|
|
71
|
-
if (result) {
|
|
72
|
-
return result;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
return null;
|
|
79
|
-
}
|
|
80
46
|
export const lexicalHTML = (lexicalFieldName, props) => {
|
|
81
47
|
const {
|
|
82
48
|
name = 'lexicalHTML',
|
|
@@ -94,25 +60,19 @@ export const lexicalHTML = (lexicalFieldName, props) => {
|
|
|
94
60
|
},
|
|
95
61
|
hooks: {
|
|
96
62
|
afterRead: [async ({
|
|
97
|
-
collection,
|
|
98
63
|
currentDepth,
|
|
99
64
|
depth,
|
|
100
65
|
draft,
|
|
101
66
|
field,
|
|
102
|
-
global,
|
|
103
67
|
overrideAccess,
|
|
104
68
|
req,
|
|
105
69
|
showHiddenFields,
|
|
106
|
-
siblingData
|
|
70
|
+
siblingData,
|
|
71
|
+
siblingFields
|
|
107
72
|
}) => {
|
|
108
|
-
|
|
109
|
-
const foundSiblingFields = findFieldPathAndSiblingFields(fields, [], field);
|
|
110
|
-
if (!foundSiblingFields) {
|
|
73
|
+
if (!siblingFields) {
|
|
111
74
|
throw new Error(`Could not find sibling fields of current lexicalHTML field with name ${field?.name}`);
|
|
112
75
|
}
|
|
113
|
-
const {
|
|
114
|
-
siblingFields
|
|
115
|
-
} = foundSiblingFields;
|
|
116
76
|
const lexicalField = siblingFields.find(field => 'name' in field && field.name === lexicalFieldName);
|
|
117
77
|
const lexicalFieldData = siblingData[lexicalFieldName];
|
|
118
78
|
if (!lexicalFieldData) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["defaultHTMLConverters","convertLexicalToHTML","consolidateHTMLConverters","editorConfig","htmlConverterFeature","resolvedFeatureMap","get","htmlConverterFeatureProps","sanitizedServerFeatureProps","defaultConvertersWithConvertersFromFeatures","converter","features","converters","html","push","finalConverters","defaultConverters","foundNodeTypes","filteredConverters","reverse","nodeTypes","length","newConverter","filter","nodeType","includes","findFieldPathAndSiblingFields","fields","path","field","curField","name","siblingFields","result","tab","tabs","block","blocks","slug","lexicalHTML","lexicalFieldName","props","hidden","storeInDB","type","admin","editorOptions","language","hooks","afterRead","collection","currentDepth","depth","draft","global","overrideAccess","req","showHiddenFields","siblingData","foundSiblingFields","Error","lexicalField","find","lexicalFieldData","config","editor","has","data","beforeChange","value"],"sources":["../../../../../src/features/converters/html/field/index.ts"],"sourcesContent":["import type { SerializedEditorState } from 'lexical'\nimport type { Field, FieldAffectingData, RichTextField } from 'payload'\n\nimport type { SanitizedServerEditorConfig } from '../../../../lexical/config/types.js'\nimport type { AdapterProps, LexicalRichTextAdapter } from '../../../../types.js'\nimport type { HTMLConverter } from '../converter/types.js'\nimport type { HTMLConverterFeatureProps } from '../index.js'\n\nimport { defaultHTMLConverters } from '../converter/defaultConverters.js'\nimport { convertLexicalToHTML } from '../converter/index.js'\n\ntype Props = {\n /**\n * Whether the lexicalHTML field should be hidden in the admin panel\n *\n * @default true\n */\n hidden?: boolean\n name: string\n /**\n * Whether the HTML should be stored in the database\n *\n * @default false\n */\n storeInDB?: boolean\n}\n\n/**\n * Combines the default HTML converters with HTML converters found in the features, and with HTML converters configured in the htmlConverter feature.\n *\n * @param editorConfig\n */\nexport const consolidateHTMLConverters = ({\n editorConfig,\n}: {\n editorConfig: SanitizedServerEditorConfig\n}): HTMLConverter[] => {\n const htmlConverterFeature = editorConfig.resolvedFeatureMap.get('htmlConverter')\n const htmlConverterFeatureProps: HTMLConverterFeatureProps =\n htmlConverterFeature?.sanitizedServerFeatureProps\n\n const defaultConvertersWithConvertersFromFeatures = [...defaultHTMLConverters]\n\n for (const converter of editorConfig.features.converters.html) {\n defaultConvertersWithConvertersFromFeatures.push(converter)\n }\n\n const finalConverters =\n htmlConverterFeatureProps?.converters &&\n typeof htmlConverterFeatureProps?.converters === 'function'\n ? htmlConverterFeatureProps.converters({\n defaultConverters: defaultConvertersWithConvertersFromFeatures,\n })\n : (htmlConverterFeatureProps?.converters as HTMLConverter[]) ||\n defaultConvertersWithConvertersFromFeatures\n\n // filter converters by nodeTypes. The last converter in the list wins. If there are multiple converters for the same nodeType, the last one will be used and the node types will be removed from\n // previous converters. If previous converters do not have any nodeTypes left, they will be removed from the list.\n // This guarantees that user-added converters which are added after the default ones will always have precedence\n const foundNodeTypes: string[] = []\n const filteredConverters: HTMLConverter[] = []\n for (const converter of finalConverters.reverse()) {\n if (!converter.nodeTypes?.length) {\n continue\n }\n const newConverter: HTMLConverter = {\n converter: converter.converter,\n nodeTypes: [...converter.nodeTypes],\n }\n newConverter.nodeTypes = newConverter.nodeTypes.filter((nodeType) => {\n if (foundNodeTypes.includes(nodeType)) {\n return false\n }\n foundNodeTypes.push(nodeType)\n return true\n })\n\n if (newConverter.nodeTypes.length) {\n filteredConverters.push(newConverter)\n }\n }\n\n return filteredConverters\n}\n\n// find the path of this field, as well as its sibling fields, by looking for this `field` in fields and traversing it recursively\nfunction findFieldPathAndSiblingFields(\n fields: Field[],\n path: string[],\n field: FieldAffectingData,\n): {\n path: string[]\n siblingFields: Field[]\n} | null {\n for (const curField of fields) {\n if (curField === field) {\n return {\n path: [...path, curField.name],\n siblingFields: fields,\n }\n }\n\n if ('fields' in curField) {\n const result = findFieldPathAndSiblingFields(\n curField.fields,\n 'name' in curField ? [...path, curField.name] : [...path],\n field,\n )\n if (result) {\n return result\n }\n } else if ('tabs' in curField) {\n for (const tab of curField.tabs) {\n const result = findFieldPathAndSiblingFields(\n tab.fields,\n 'name' in tab ? [...path, tab.name] : [...path],\n field,\n )\n if (result) {\n return result\n }\n }\n } else if ('blocks' in curField) {\n for (const block of curField.blocks) {\n if (block?.fields?.length) {\n const result = findFieldPathAndSiblingFields(\n block.fields,\n [...path, curField.name, block.slug],\n field,\n )\n if (result) {\n return result\n }\n }\n }\n }\n }\n\n return null\n}\n\nexport const lexicalHTML: (\n /**\n * A string which matches the lexical field name you want to convert to HTML.\n *\n * This has to be a SIBLING field of this lexicalHTML field - otherwise, it won't be able to find the lexical field.\n **/\n lexicalFieldName: string,\n props: Props,\n) => Field = (lexicalFieldName, props) => {\n const { name = 'lexicalHTML', hidden = true, storeInDB = false } = props\n return {\n name,\n type: 'code',\n admin: {\n editorOptions: {\n language: 'html',\n },\n hidden,\n },\n hooks: {\n afterRead: [\n async ({\n collection,\n currentDepth,\n depth,\n draft,\n field,\n global,\n overrideAccess,\n req,\n showHiddenFields,\n siblingData,\n }) => {\n const fields = collection ? collection.fields : global!.fields\n\n const foundSiblingFields = findFieldPathAndSiblingFields(fields, [], field)\n\n if (!foundSiblingFields) {\n throw new Error(\n `Could not find sibling fields of current lexicalHTML field with name ${field?.name}`,\n )\n }\n\n const { siblingFields } = foundSiblingFields\n const lexicalField: RichTextField<SerializedEditorState, AdapterProps> =\n siblingFields.find(\n (field) => 'name' in field && field.name === lexicalFieldName,\n ) as RichTextField<SerializedEditorState, AdapterProps>\n\n const lexicalFieldData: SerializedEditorState = siblingData[lexicalFieldName]\n\n if (!lexicalFieldData) {\n return ''\n }\n\n if (!lexicalField) {\n throw new Error(\n 'You cannot use the lexicalHTML field because the referenced lexical field was not found',\n )\n }\n\n const config = (lexicalField?.editor as LexicalRichTextAdapter)?.editorConfig\n\n if (!config) {\n throw new Error(\n 'The linked lexical field does not have an editorConfig. This is needed for the lexicalHTML field.',\n )\n }\n\n if (!config?.resolvedFeatureMap?.has('htmlConverter')) {\n throw new Error(\n 'You cannot use the lexicalHTML field because the linked lexical field does not have a HTMLConverterFeature',\n )\n }\n\n const finalConverters = consolidateHTMLConverters({\n editorConfig: config,\n })\n\n return await convertLexicalToHTML({\n converters: finalConverters,\n currentDepth,\n data: lexicalFieldData,\n depth,\n draft,\n overrideAccess,\n req,\n showHiddenFields,\n })\n },\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (storeInDB) {\n return value\n }\n delete siblingData[name]\n return null\n },\n ],\n },\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["defaultHTMLConverters","convertLexicalToHTML","consolidateHTMLConverters","editorConfig","htmlConverterFeature","resolvedFeatureMap","get","htmlConverterFeatureProps","sanitizedServerFeatureProps","defaultConvertersWithConvertersFromFeatures","converter","features","converters","html","push","finalConverters","defaultConverters","foundNodeTypes","filteredConverters","reverse","nodeTypes","length","newConverter","filter","nodeType","includes","lexicalHTML","lexicalFieldName","props","name","hidden","storeInDB","type","admin","editorOptions","language","hooks","afterRead","currentDepth","depth","draft","field","overrideAccess","req","showHiddenFields","siblingData","siblingFields","Error","lexicalField","find","lexicalFieldData","config","editor","has","data","beforeChange","value"],"sources":["../../../../../src/features/converters/html/field/index.ts"],"sourcesContent":["import type { SerializedEditorState } from 'lexical'\nimport type { Field, FieldAffectingData, PayloadRequest, RichTextField } from 'payload'\n\nimport type { SanitizedServerEditorConfig } from '../../../../lexical/config/types.js'\nimport type { AdapterProps, LexicalRichTextAdapter } from '../../../../types.js'\nimport type { HTMLConverter } from '../converter/types.js'\nimport type { HTMLConverterFeatureProps } from '../index.js'\n\nimport { defaultHTMLConverters } from '../converter/defaultConverters.js'\nimport { convertLexicalToHTML } from '../converter/index.js'\n\ntype Props = {\n /**\n * Whether the lexicalHTML field should be hidden in the admin panel\n *\n * @default true\n */\n hidden?: boolean\n name: string\n /**\n * Whether the HTML should be stored in the database\n *\n * @default false\n */\n storeInDB?: boolean\n}\n\n/**\n * Combines the default HTML converters with HTML converters found in the features, and with HTML converters configured in the htmlConverter feature.\n *\n * @param editorConfig\n */\nexport const consolidateHTMLConverters = ({\n editorConfig,\n}: {\n editorConfig: SanitizedServerEditorConfig\n}): HTMLConverter[] => {\n const htmlConverterFeature = editorConfig.resolvedFeatureMap.get('htmlConverter')\n const htmlConverterFeatureProps: HTMLConverterFeatureProps =\n htmlConverterFeature?.sanitizedServerFeatureProps\n\n const defaultConvertersWithConvertersFromFeatures = [...defaultHTMLConverters]\n\n for (const converter of editorConfig.features.converters.html) {\n defaultConvertersWithConvertersFromFeatures.push(converter)\n }\n\n const finalConverters =\n htmlConverterFeatureProps?.converters &&\n typeof htmlConverterFeatureProps?.converters === 'function'\n ? htmlConverterFeatureProps.converters({\n defaultConverters: defaultConvertersWithConvertersFromFeatures,\n })\n : (htmlConverterFeatureProps?.converters as HTMLConverter[]) ||\n defaultConvertersWithConvertersFromFeatures\n\n // filter converters by nodeTypes. The last converter in the list wins. If there are multiple converters for the same nodeType, the last one will be used and the node types will be removed from\n // previous converters. If previous converters do not have any nodeTypes left, they will be removed from the list.\n // This guarantees that user-added converters which are added after the default ones will always have precedence\n const foundNodeTypes: string[] = []\n const filteredConverters: HTMLConverter[] = []\n for (const converter of finalConverters.reverse()) {\n if (!converter.nodeTypes?.length) {\n continue\n }\n const newConverter: HTMLConverter = {\n converter: converter.converter,\n nodeTypes: [...converter.nodeTypes],\n }\n newConverter.nodeTypes = newConverter.nodeTypes.filter((nodeType) => {\n if (foundNodeTypes.includes(nodeType)) {\n return false\n }\n foundNodeTypes.push(nodeType)\n return true\n })\n\n if (newConverter.nodeTypes.length) {\n filteredConverters.push(newConverter)\n }\n }\n\n return filteredConverters\n}\n\nexport const lexicalHTML: (\n /**\n * A string which matches the lexical field name you want to convert to HTML.\n *\n * This has to be a SIBLING field of this lexicalHTML field - otherwise, it won't be able to find the lexical field.\n **/\n lexicalFieldName: string,\n props: Props,\n) => Field = (lexicalFieldName, props) => {\n const { name = 'lexicalHTML', hidden = true, storeInDB = false } = props\n return {\n name,\n type: 'code',\n admin: {\n editorOptions: {\n language: 'html',\n },\n hidden,\n },\n hooks: {\n afterRead: [\n async ({\n currentDepth,\n depth,\n draft,\n field,\n overrideAccess,\n req,\n showHiddenFields,\n siblingData,\n siblingFields,\n }) => {\n if (!siblingFields) {\n throw new Error(\n `Could not find sibling fields of current lexicalHTML field with name ${field?.name}`,\n )\n }\n\n const lexicalField: RichTextField<SerializedEditorState, AdapterProps> =\n siblingFields.find(\n (field) => 'name' in field && field.name === lexicalFieldName,\n ) as RichTextField<SerializedEditorState, AdapterProps>\n\n const lexicalFieldData: SerializedEditorState = siblingData[lexicalFieldName]\n\n if (!lexicalFieldData) {\n return ''\n }\n\n if (!lexicalField) {\n throw new Error(\n 'You cannot use the lexicalHTML field because the referenced lexical field was not found',\n )\n }\n\n const config = (lexicalField?.editor as LexicalRichTextAdapter)?.editorConfig\n\n if (!config) {\n throw new Error(\n 'The linked lexical field does not have an editorConfig. This is needed for the lexicalHTML field.',\n )\n }\n\n if (!config?.resolvedFeatureMap?.has('htmlConverter')) {\n throw new Error(\n 'You cannot use the lexicalHTML field because the linked lexical field does not have a HTMLConverterFeature',\n )\n }\n\n const finalConverters = consolidateHTMLConverters({\n editorConfig: config,\n })\n\n return await convertLexicalToHTML({\n converters: finalConverters,\n currentDepth,\n data: lexicalFieldData,\n depth,\n draft,\n overrideAccess,\n req,\n showHiddenFields,\n })\n },\n ],\n beforeChange: [\n ({ siblingData, value }) => {\n if (storeInDB) {\n return value\n }\n delete siblingData[name]\n return null\n },\n ],\n },\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -67,7 +67,7 @@ export const EXPERIMENTAL_TableFeature = createServerFeature({
|
|
|
67
67
|
req,
|
|
68
68
|
showHiddenFields
|
|
69
69
|
});
|
|
70
|
-
return `<table class="lexical-table" style="border-collapse: collapse;">${childrenText}</table>`;
|
|
70
|
+
return `<div class="lexical-table-container"><table class="lexical-table" style="border-collapse: collapse;">${childrenText}</table></div>`;
|
|
71
71
|
},
|
|
72
72
|
nodeTypes: [TableNode.getType()]
|
|
73
73
|
}
|