@delmaredigital/payload-puck 0.6.10 → 0.6.13
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/README.md +79 -1
- package/dist/admin/EditWithPuckButton.d.ts +1 -1
- package/dist/admin/EditWithPuckButton.d.ts.map +1 -1
- package/dist/admin/EditWithPuckButton.js +65 -25
- package/dist/admin/EditWithPuckButton.js.map +1 -1
- package/dist/admin/EditWithPuckCell.js +43 -13
- package/dist/admin/EditWithPuckCell.js.map +1 -1
- package/dist/admin/PuckEditorView.d.ts +1 -1
- package/dist/admin/PuckEditorView.d.ts.map +1 -1
- package/dist/admin/PuckEditorView.js +118 -32
- package/dist/admin/PuckEditorView.js.map +1 -1
- package/dist/admin/client.d.ts +2 -2
- package/dist/admin/client.d.ts.map +1 -1
- package/dist/admin/client.js +4 -4
- package/dist/admin/client.js.map +1 -1
- package/dist/admin/generateAdminComponents.js +7 -7
- package/dist/admin/generateAdminComponents.js.map +1 -1
- package/dist/admin/index.d.ts +5 -5
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +3 -2
- package/dist/admin/index.js.map +1 -1
- package/dist/ai/collections/AiContext.js +56 -29
- package/dist/ai/collections/AiContext.js.map +1 -1
- package/dist/ai/collections/AiPrompts.js +24 -19
- package/dist/ai/collections/AiPrompts.js.map +1 -1
- package/dist/ai/createAiApiRoutes.js +28 -19
- package/dist/ai/createAiApiRoutes.js.map +1 -1
- package/dist/ai/createAiGenerate.js +7 -8
- package/dist/ai/createAiGenerate.js.map +1 -1
- package/dist/ai/createAiPlugin.js +7 -9
- package/dist/ai/createAiPlugin.js.map +1 -1
- package/dist/ai/hooks/useAiContext.js +50 -39
- package/dist/ai/hooks/useAiContext.js.map +1 -1
- package/dist/ai/hooks/useAiPrompts.js +33 -25
- package/dist/ai/hooks/useAiPrompts.js.map +1 -1
- package/dist/ai/index.js +9 -10
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/plugins/ContextEditorPanel.d.ts +1 -1
- package/dist/ai/plugins/ContextEditorPanel.d.ts.map +1 -1
- package/dist/ai/plugins/ContextEditorPanel.js +399 -107
- package/dist/ai/plugins/ContextEditorPanel.js.map +1 -1
- package/dist/ai/plugins/PromptEditorPanel.d.ts +1 -1
- package/dist/ai/plugins/PromptEditorPanel.d.ts.map +1 -1
- package/dist/ai/plugins/PromptEditorPanel.js +237 -51
- package/dist/ai/plugins/PromptEditorPanel.js.map +1 -1
- package/dist/ai/plugins/contextEditorPlugin.js +12 -5
- package/dist/ai/plugins/contextEditorPlugin.js.map +1 -1
- package/dist/ai/plugins/promptApiRoutes.js +119 -50
- package/dist/ai/plugins/promptApiRoutes.js.map +1 -1
- package/dist/ai/plugins/promptEditorPlugin.js +12 -5
- package/dist/ai/plugins/promptEditorPlugin.js.map +1 -1
- package/dist/ai/presets/componentAiDefaults.js +108 -83
- package/dist/ai/presets/componentAiDefaults.js.map +1 -1
- package/dist/ai/presets/index.js +12 -18
- package/dist/ai/presets/index.js.map +1 -1
- package/dist/ai/presets/instructions/interactive.js +85 -75
- package/dist/ai/presets/instructions/interactive.js.map +1 -1
- package/dist/ai/presets/instructions/layout.js +122 -117
- package/dist/ai/presets/instructions/layout.js.map +1 -1
- package/dist/ai/presets/instructions/media.js +31 -29
- package/dist/ai/presets/instructions/media.js.map +1 -1
- package/dist/ai/presets/instructions/pagePatterns.js +4 -6
- package/dist/ai/presets/instructions/pagePatterns.js.map +1 -1
- package/dist/ai/presets/instructions/schemas.js +495 -137
- package/dist/ai/presets/instructions/schemas.js.map +1 -1
- package/dist/ai/presets/instructions/typography.js +38 -33
- package/dist/ai/presets/instructions/typography.js.map +1 -1
- package/dist/ai/tools/index.js +92 -55
- package/dist/ai/tools/index.js.map +1 -1
- package/dist/ai/types.js +7 -1
- package/dist/ai/types.js.map +1 -1
- package/dist/ai/utils/injectAiConfig.js +33 -40
- package/dist/ai/utils/injectAiConfig.js.map +1 -1
- package/dist/api/createPuckApiRoutes.d.ts +1 -1
- package/dist/api/createPuckApiRoutes.d.ts.map +1 -1
- package/dist/api/createPuckApiRoutes.js +123 -65
- package/dist/api/createPuckApiRoutes.js.map +1 -1
- package/dist/api/createPuckApiRoutesVersions.d.ts +1 -1
- package/dist/api/createPuckApiRoutesVersions.d.ts.map +1 -1
- package/dist/api/createPuckApiRoutesVersions.js +88 -37
- package/dist/api/createPuckApiRoutesVersions.js.map +1 -1
- package/dist/api/createPuckApiRoutesWithId.d.ts +1 -1
- package/dist/api/createPuckApiRoutesWithId.d.ts.map +1 -1
- package/dist/api/createPuckApiRoutesWithId.js +166 -72
- package/dist/api/createPuckApiRoutesWithId.js.map +1 -1
- package/dist/api/index.d.ts +5 -5
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +6 -6
- package/dist/api/index.js.map +1 -1
- package/dist/api/payload-config.d.js +15 -0
- package/dist/api/payload-config.d.js.map +1 -0
- package/dist/api/types.js +4 -1
- package/dist/api/types.js.map +1 -1
- package/dist/api/utils/mapRootProps.d.ts +1 -1
- package/dist/api/utils/mapRootProps.d.ts.map +1 -1
- package/dist/api/utils/mapRootProps.js +77 -44
- package/dist/api/utils/mapRootProps.js.map +1 -1
- package/dist/collections/Templates.js +24 -20
- package/dist/collections/Templates.js.map +1 -1
- package/dist/components/AccordionClient.d.ts +2 -2
- package/dist/components/AccordionClient.d.ts.map +1 -1
- package/dist/components/AccordionClient.js +81 -22
- package/dist/components/AccordionClient.js.map +1 -1
- package/dist/components/AnimatedWrapper.d.ts +2 -2
- package/dist/components/AnimatedWrapper.d.ts.map +1 -1
- package/dist/components/AnimatedWrapper.js +31 -16
- package/dist/components/AnimatedWrapper.js.map +1 -1
- package/dist/components/exports.js +2 -2
- package/dist/components/exports.js.map +1 -1
- package/dist/components/index.d.ts +5 -5
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +7 -7
- package/dist/components/index.js.map +1 -1
- package/dist/components/interactive/Accordion.d.ts +1 -1
- package/dist/components/interactive/Accordion.d.ts.map +1 -1
- package/dist/components/interactive/Accordion.js +149 -55
- package/dist/components/interactive/Accordion.js.map +1 -1
- package/dist/components/interactive/Accordion.server.d.ts +1 -1
- package/dist/components/interactive/Accordion.server.d.ts.map +1 -1
- package/dist/components/interactive/Accordion.server.js +25 -7
- package/dist/components/interactive/Accordion.server.js.map +1 -1
- package/dist/components/interactive/Button.d.ts +3 -3
- package/dist/components/interactive/Button.d.ts.map +1 -1
- package/dist/components/interactive/Button.js +89 -43
- package/dist/components/interactive/Button.js.map +1 -1
- package/dist/components/interactive/Button.server.d.ts +2 -2
- package/dist/components/interactive/Button.server.d.ts.map +1 -1
- package/dist/components/interactive/Button.server.js +40 -20
- package/dist/components/interactive/Button.server.js.map +1 -1
- package/dist/components/interactive/Card.d.ts +3 -3
- package/dist/components/interactive/Card.d.ts.map +1 -1
- package/dist/components/interactive/Card.js +131 -39
- package/dist/components/interactive/Card.js.map +1 -1
- package/dist/components/interactive/Card.server.d.ts +3 -3
- package/dist/components/interactive/Card.server.d.ts.map +1 -1
- package/dist/components/interactive/Card.server.js +72 -11
- package/dist/components/interactive/Card.server.js.map +1 -1
- package/dist/components/interactive/Divider.d.ts +1 -1
- package/dist/components/interactive/Divider.d.ts.map +1 -1
- package/dist/components/interactive/Divider.js +54 -26
- package/dist/components/interactive/Divider.js.map +1 -1
- package/dist/components/interactive/Divider.server.d.ts +1 -1
- package/dist/components/interactive/Divider.server.d.ts.map +1 -1
- package/dist/components/interactive/Divider.server.js +28 -12
- package/dist/components/interactive/Divider.server.js.map +1 -1
- package/dist/components/interactive/index.d.ts +4 -4
- package/dist/components/interactive/index.d.ts.map +1 -1
- package/dist/components/interactive/index.js +5 -5
- package/dist/components/interactive/index.js.map +1 -1
- package/dist/components/layout/Container.d.ts +1 -1
- package/dist/components/layout/Container.d.ts.map +1 -1
- package/dist/components/layout/Container.js +101 -47
- package/dist/components/layout/Container.js.map +1 -1
- package/dist/components/layout/Container.server.d.ts +1 -1
- package/dist/components/layout/Container.server.d.ts.map +1 -1
- package/dist/components/layout/Container.server.js +67 -19
- package/dist/components/layout/Container.server.js.map +1 -1
- package/dist/components/layout/Flex.d.ts +2 -2
- package/dist/components/layout/Flex.d.ts.map +1 -1
- package/dist/components/layout/Flex.js +124 -55
- package/dist/components/layout/Flex.js.map +1 -1
- package/dist/components/layout/Flex.server.d.ts +1 -1
- package/dist/components/layout/Flex.server.d.ts.map +1 -1
- package/dist/components/layout/Flex.server.js +50 -14
- package/dist/components/layout/Flex.server.js.map +1 -1
- package/dist/components/layout/Grid.d.ts +1 -1
- package/dist/components/layout/Grid.d.ts.map +1 -1
- package/dist/components/layout/Grid.js +93 -44
- package/dist/components/layout/Grid.js.map +1 -1
- package/dist/components/layout/Grid.server.d.ts +1 -1
- package/dist/components/layout/Grid.server.d.ts.map +1 -1
- package/dist/components/layout/Grid.server.js +56 -14
- package/dist/components/layout/Grid.server.js.map +1 -1
- package/dist/components/layout/Section.d.ts +1 -1
- package/dist/components/layout/Section.d.ts.map +1 -1
- package/dist/components/layout/Section.js +147 -64
- package/dist/components/layout/Section.js.map +1 -1
- package/dist/components/layout/Section.server.d.ts +1 -1
- package/dist/components/layout/Section.server.d.ts.map +1 -1
- package/dist/components/layout/Section.server.js +92 -28
- package/dist/components/layout/Section.server.js.map +1 -1
- package/dist/components/layout/Spacer.d.ts +1 -1
- package/dist/components/layout/Spacer.d.ts.map +1 -1
- package/dist/components/layout/Spacer.js +80 -30
- package/dist/components/layout/Spacer.js.map +1 -1
- package/dist/components/layout/Spacer.server.d.ts +1 -1
- package/dist/components/layout/Spacer.server.d.ts.map +1 -1
- package/dist/components/layout/Spacer.server.js +31 -9
- package/dist/components/layout/Spacer.server.js.map +1 -1
- package/dist/components/layout/Template.d.ts +1 -1
- package/dist/components/layout/Template.d.ts.map +1 -1
- package/dist/components/layout/Template.js +58 -30
- package/dist/components/layout/Template.js.map +1 -1
- package/dist/components/layout/Template.server.d.ts +1 -1
- package/dist/components/layout/Template.server.d.ts.map +1 -1
- package/dist/components/layout/Template.server.js +43 -11
- package/dist/components/layout/Template.server.js.map +1 -1
- package/dist/components/layout/index.d.ts +8 -8
- package/dist/components/layout/index.d.ts.map +1 -1
- package/dist/components/layout/index.js +8 -8
- package/dist/components/layout/index.js.map +1 -1
- package/dist/components/media/Image.d.ts +3 -3
- package/dist/components/media/Image.d.ts.map +1 -1
- package/dist/components/media/Image.js +122 -39
- package/dist/components/media/Image.js.map +1 -1
- package/dist/components/media/Image.server.d.ts +3 -3
- package/dist/components/media/Image.server.d.ts.map +1 -1
- package/dist/components/media/Image.server.js +76 -13
- package/dist/components/media/Image.server.js.map +1 -1
- package/dist/components/media/index.d.ts +1 -1
- package/dist/components/media/index.d.ts.map +1 -1
- package/dist/components/media/index.js +2 -2
- package/dist/components/media/index.js.map +1 -1
- package/dist/components/typography/Heading.d.ts +2 -2
- package/dist/components/typography/Heading.d.ts.map +1 -1
- package/dist/components/typography/Heading.js +45 -25
- package/dist/components/typography/Heading.js.map +1 -1
- package/dist/components/typography/Heading.server.d.ts +2 -2
- package/dist/components/typography/Heading.server.d.ts.map +1 -1
- package/dist/components/typography/Heading.server.js +16 -10
- package/dist/components/typography/Heading.server.js.map +1 -1
- package/dist/components/typography/RichText.editor.d.ts +1 -1
- package/dist/components/typography/RichText.editor.d.ts.map +1 -1
- package/dist/components/typography/RichText.editor.js +44 -19
- package/dist/components/typography/RichText.editor.js.map +1 -1
- package/dist/components/typography/RichText.server.d.ts +2 -2
- package/dist/components/typography/RichText.server.d.ts.map +1 -1
- package/dist/components/typography/RichText.server.js +33 -14
- package/dist/components/typography/RichText.server.js.map +1 -1
- package/dist/components/typography/Text.d.ts +2 -2
- package/dist/components/typography/Text.d.ts.map +1 -1
- package/dist/components/typography/Text.js +49 -23
- package/dist/components/typography/Text.js.map +1 -1
- package/dist/components/typography/Text.server.d.ts +2 -2
- package/dist/components/typography/Text.server.d.ts.map +1 -1
- package/dist/components/typography/Text.server.js +21 -8
- package/dist/components/typography/Text.server.js.map +1 -1
- package/dist/components/typography/index.d.ts +4 -4
- package/dist/components/typography/index.d.ts.map +1 -1
- package/dist/components/typography/index.js +5 -5
- package/dist/components/typography/index.js.map +1 -1
- package/dist/config/config.editor.d.ts +3 -3
- package/dist/config/config.editor.d.ts.map +1 -1
- package/dist/config/config.editor.js +119 -54
- package/dist/config/config.editor.js.map +1 -1
- package/dist/config/index.d.ts +4 -4
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +62 -35
- package/dist/config/index.js.map +1 -1
- package/dist/config/merge.d.ts +1 -1
- package/dist/config/merge.d.ts.map +1 -1
- package/dist/config/merge.js +23 -26
- package/dist/config/merge.js.map +1 -1
- package/dist/config/presets.d.ts +4 -4
- package/dist/config/presets.js +195 -75
- package/dist/config/presets.js.map +1 -1
- package/dist/config/types.js +6 -2
- package/dist/config/types.js.map +1 -1
- package/dist/editor/PuckEditor.d.ts +12 -4
- package/dist/editor/PuckEditor.d.ts.map +1 -1
- package/dist/editor/PuckEditor.js +168 -67
- package/dist/editor/PuckEditor.js.map +1 -1
- package/dist/editor/PuckEditorImpl.client.d.ts +4 -4
- package/dist/editor/PuckEditorImpl.client.d.ts.map +1 -1
- package/dist/editor/PuckEditorImpl.client.js +304 -152
- package/dist/editor/PuckEditorImpl.client.js.map +1 -1
- package/dist/editor/components/DarkModeStyles.js +11 -12
- package/dist/editor/components/DarkModeStyles.js.map +1 -1
- package/dist/editor/components/HeaderActions.js +308 -64
- package/dist/editor/components/HeaderActions.js.map +1 -1
- package/dist/editor/components/IframeWrapper.d.ts +1 -1
- package/dist/editor/components/IframeWrapper.d.ts.map +1 -1
- package/dist/editor/components/IframeWrapper.js +82 -58
- package/dist/editor/components/IframeWrapper.js.map +1 -1
- package/dist/editor/components/LoadingState.d.ts +1 -1
- package/dist/editor/components/LoadingState.d.ts.map +1 -1
- package/dist/editor/components/LoadingState.js +17 -3
- package/dist/editor/components/LoadingState.js.map +1 -1
- package/dist/editor/components/PreviewModal.js +234 -78
- package/dist/editor/components/PreviewModal.js.map +1 -1
- package/dist/editor/components/PreviewModeToggle.js +43 -15
- package/dist/editor/components/PreviewModeToggle.js.map +1 -1
- package/dist/editor/components/VersionHistory.js +219 -71
- package/dist/editor/components/VersionHistory.js.map +1 -1
- package/dist/editor/hooks/useDarkMode.js +36 -23
- package/dist/editor/hooks/useDarkMode.js.map +1 -1
- package/dist/editor/hooks/useUnsavedChanges.js +8 -8
- package/dist/editor/hooks/useUnsavedChanges.js.map +1 -1
- package/dist/editor/index.js +5 -6
- package/dist/editor/index.js.map +1 -1
- package/dist/editor/plugins/VersionHistoryPanel.js +236 -75
- package/dist/editor/plugins/VersionHistoryPanel.js.map +1 -1
- package/dist/editor/plugins/index.js +4 -4
- package/dist/editor/plugins/index.js.map +1 -1
- package/dist/editor/plugins/versionHistoryPlugin.js +10 -8
- package/dist/editor/plugins/versionHistoryPlugin.js.map +1 -1
- package/dist/editor/utils/detectPageTree.js +5 -5
- package/dist/editor/utils/detectPageTree.js.map +1 -1
- package/dist/editor/utils/index.js +1 -0
- package/dist/editor/utils/index.js.map +1 -1
- package/dist/editor/utils/injectPageTreeFields.js +13 -9
- package/dist/editor/utils/injectPageTreeFields.js.map +1 -1
- package/dist/endpoints/ai.js +58 -34
- package/dist/endpoints/ai.js.map +1 -1
- package/dist/endpoints/context.js +86 -40
- package/dist/endpoints/context.js.map +1 -1
- package/dist/endpoints/index.js +153 -76
- package/dist/endpoints/index.js.map +1 -1
- package/dist/endpoints/postcss.d.js +5 -0
- package/dist/endpoints/postcss.d.js.map +1 -0
- package/dist/endpoints/prompts.js +81 -39
- package/dist/endpoints/prompts.js.map +1 -1
- package/dist/endpoints/styles.js +34 -36
- package/dist/endpoints/styles.js.map +1 -1
- package/dist/exports/client.js +2 -2
- package/dist/exports/client.js.map +1 -1
- package/dist/exports/rsc.js +2 -2
- package/dist/exports/rsc.js.map +1 -1
- package/dist/fields/AlignmentField.d.ts +1 -1
- package/dist/fields/AlignmentField.d.ts.map +1 -1
- package/dist/fields/AlignmentField.js +93 -30
- package/dist/fields/AlignmentField.js.map +1 -1
- package/dist/fields/AnimationField.d.ts +2 -2
- package/dist/fields/AnimationField.d.ts.map +1 -1
- package/dist/fields/AnimationField.js +558 -84
- package/dist/fields/AnimationField.js.map +1 -1
- package/dist/fields/BackgroundField.d.ts +2 -2
- package/dist/fields/BackgroundField.d.ts.map +1 -1
- package/dist/fields/BackgroundField.js +754 -120
- package/dist/fields/BackgroundField.js.map +1 -1
- package/dist/fields/BorderField.d.ts +2 -2
- package/dist/fields/BorderField.d.ts.map +1 -1
- package/dist/fields/BorderField.js +275 -73
- package/dist/fields/BorderField.js.map +1 -1
- package/dist/fields/ColorPickerField.d.ts +2 -2
- package/dist/fields/ColorPickerField.d.ts.map +1 -1
- package/dist/fields/ColorPickerField.js +210 -68
- package/dist/fields/ColorPickerField.js.map +1 -1
- package/dist/fields/ContentAlignmentField.d.ts +1 -1
- package/dist/fields/ContentAlignmentField.d.ts.map +1 -1
- package/dist/fields/ContentAlignmentField.js +161 -75
- package/dist/fields/ContentAlignmentField.js.map +1 -1
- package/dist/fields/DimensionsField.d.ts +2 -2
- package/dist/fields/DimensionsField.d.ts.map +1 -1
- package/dist/fields/DimensionsField.js +575 -146
- package/dist/fields/DimensionsField.js.map +1 -1
- package/dist/fields/FlexAlignmentField.d.ts +2 -2
- package/dist/fields/FlexAlignmentField.d.ts.map +1 -1
- package/dist/fields/FlexAlignmentField.js +189 -51
- package/dist/fields/FlexAlignmentField.js.map +1 -1
- package/dist/fields/FolderPickerField.d.ts +8 -1
- package/dist/fields/FolderPickerField.d.ts.map +1 -1
- package/dist/fields/FolderPickerField.js +288 -75
- package/dist/fields/FolderPickerField.js.map +1 -1
- package/dist/fields/GradientEditor.d.ts +2 -2
- package/dist/fields/GradientEditor.d.ts.map +1 -1
- package/dist/fields/GradientEditor.js +462 -86
- package/dist/fields/GradientEditor.js.map +1 -1
- package/dist/fields/LockedField.d.ts +15 -2
- package/dist/fields/LockedField.d.ts.map +1 -1
- package/dist/fields/LockedField.js +180 -49
- package/dist/fields/LockedField.js.map +1 -1
- package/dist/fields/MarginField.d.ts +2 -2
- package/dist/fields/MarginField.d.ts.map +1 -1
- package/dist/fields/MarginField.js +144 -46
- package/dist/fields/MarginField.js.map +1 -1
- package/dist/fields/MediaField.d.ts +1 -1
- package/dist/fields/MediaField.d.ts.map +1 -1
- package/dist/fields/MediaField.js +688 -186
- package/dist/fields/MediaField.js.map +1 -1
- package/dist/fields/PaddingField.d.ts +2 -2
- package/dist/fields/PaddingField.d.ts.map +1 -1
- package/dist/fields/PaddingField.js +144 -46
- package/dist/fields/PaddingField.js.map +1 -1
- package/dist/fields/PageSegmentField.d.ts +15 -2
- package/dist/fields/PageSegmentField.d.ts.map +1 -1
- package/dist/fields/PageSegmentField.js +156 -54
- package/dist/fields/PageSegmentField.js.map +1 -1
- package/dist/fields/ResetField.d.ts +1 -1
- package/dist/fields/ResetField.d.ts.map +1 -1
- package/dist/fields/ResetField.js +59 -31
- package/dist/fields/ResetField.js.map +1 -1
- package/dist/fields/ResponsiveField.d.ts +1 -1
- package/dist/fields/ResponsiveField.d.ts.map +1 -1
- package/dist/fields/ResponsiveField.js +233 -90
- package/dist/fields/ResponsiveField.js.map +1 -1
- package/dist/fields/ResponsiveVisibilityField.d.ts +2 -2
- package/dist/fields/ResponsiveVisibilityField.d.ts.map +1 -1
- package/dist/fields/ResponsiveVisibilityField.js +119 -36
- package/dist/fields/ResponsiveVisibilityField.js.map +1 -1
- package/dist/fields/SizeField.d.ts +3 -3
- package/dist/fields/SizeField.d.ts.map +1 -1
- package/dist/fields/SizeField.js +226 -52
- package/dist/fields/SizeField.js.map +1 -1
- package/dist/fields/SlugPreviewField.d.ts +8 -1
- package/dist/fields/SlugPreviewField.d.ts.map +1 -1
- package/dist/fields/SlugPreviewField.js +65 -16
- package/dist/fields/SlugPreviewField.js.map +1 -1
- package/dist/fields/TemplateField.d.ts +1 -1
- package/dist/fields/TemplateField.d.ts.map +1 -1
- package/dist/fields/TemplateField.js +362 -120
- package/dist/fields/TemplateField.js.map +1 -1
- package/dist/fields/TransformField.d.ts +2 -2
- package/dist/fields/TransformField.d.ts.map +1 -1
- package/dist/fields/TransformField.js +517 -81
- package/dist/fields/TransformField.js.map +1 -1
- package/dist/fields/VerticalAlignmentField.d.ts +1 -1
- package/dist/fields/VerticalAlignmentField.d.ts.map +1 -1
- package/dist/fields/VerticalAlignmentField.js +93 -30
- package/dist/fields/VerticalAlignmentField.js.map +1 -1
- package/dist/fields/WidthField.d.ts +2 -2
- package/dist/fields/WidthField.d.ts.map +1 -1
- package/dist/fields/WidthField.js +278 -81
- package/dist/fields/WidthField.js.map +1 -1
- package/dist/fields/index.d.ts +41 -41
- package/dist/fields/index.d.ts.map +1 -1
- package/dist/fields/index.js +37 -43
- package/dist/fields/index.js.map +1 -1
- package/dist/fields/richtext/controls/ColorPickerControl.d.ts +13 -2
- package/dist/fields/richtext/controls/ColorPickerControl.d.ts.map +1 -1
- package/dist/fields/richtext/controls/ColorPickerControl.js +212 -47
- package/dist/fields/richtext/controls/ColorPickerControl.js.map +1 -1
- package/dist/fields/richtext/controls/DropdownPortal.d.ts +2 -2
- package/dist/fields/richtext/controls/DropdownPortal.d.ts.map +1 -1
- package/dist/fields/richtext/controls/DropdownPortal.js +36 -4
- package/dist/fields/richtext/controls/DropdownPortal.js.map +1 -1
- package/dist/fields/richtext/controls/FontSizeControl.d.ts +9 -1
- package/dist/fields/richtext/controls/FontSizeControl.d.ts.map +1 -1
- package/dist/fields/richtext/controls/FontSizeControl.js +109 -24
- package/dist/fields/richtext/controls/FontSizeControl.js.map +1 -1
- package/dist/fields/richtext/controls/HighlightControl.d.ts +12 -1
- package/dist/fields/richtext/controls/HighlightControl.d.ts.map +1 -1
- package/dist/fields/richtext/controls/HighlightControl.js +54 -17
- package/dist/fields/richtext/controls/HighlightControl.js.map +1 -1
- package/dist/fields/richtext/controls/index.d.ts +5 -5
- package/dist/fields/richtext/controls/index.d.ts.map +1 -1
- package/dist/fields/richtext/controls/index.js +8 -11
- package/dist/fields/richtext/controls/index.js.map +1 -1
- package/dist/fields/richtext/controls/shared.js +108 -63
- package/dist/fields/richtext/controls/shared.js.map +1 -1
- package/dist/fields/richtext/createRichTextField.d.ts +18 -4
- package/dist/fields/richtext/createRichTextField.d.ts.map +1 -1
- package/dist/fields/richtext/createRichTextField.js +113 -26
- package/dist/fields/richtext/createRichTextField.js.map +1 -1
- package/dist/fields/richtext/extensions/FontSize.js +26 -20
- package/dist/fields/richtext/extensions/FontSize.js.map +1 -1
- package/dist/fields/richtext/extensions/index.d.ts +1 -1
- package/dist/fields/richtext/extensions/index.d.ts.map +1 -1
- package/dist/fields/richtext/extensions/index.js +2 -2
- package/dist/fields/richtext/extensions/index.js.map +1 -1
- package/dist/fields/richtext/index.d.ts +6 -6
- package/dist/fields/richtext/index.d.ts.map +1 -1
- package/dist/fields/richtext/index.js +8 -8
- package/dist/fields/richtext/index.js.map +1 -1
- package/dist/fields/shared.d.ts +1 -1
- package/dist/fields/shared.d.ts.map +1 -1
- package/dist/fields/shared.js +915 -478
- package/dist/fields/shared.js.map +1 -1
- package/dist/hooks/index.d.ts +2 -2
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +3 -3
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useResponsiveStyles.d.ts +1 -1
- package/dist/hooks/useResponsiveStyles.d.ts.map +1 -1
- package/dist/hooks/useResponsiveStyles.js +36 -32
- package/dist/hooks/useResponsiveStyles.js.map +1 -1
- package/dist/hooks/useScrollAnimation.js +26 -24
- package/dist/hooks/useScrollAnimation.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/layouts/LayoutWrapper.d.ts +3 -3
- package/dist/layouts/LayoutWrapper.d.ts.map +1 -1
- package/dist/layouts/LayoutWrapper.js +115 -51
- package/dist/layouts/LayoutWrapper.js.map +1 -1
- package/dist/layouts/defaults.d.ts +1 -1
- package/dist/layouts/defaults.d.ts.map +1 -1
- package/dist/layouts/defaults.js +23 -31
- package/dist/layouts/defaults.js.map +1 -1
- package/dist/layouts/index.d.ts +4 -4
- package/dist/layouts/index.d.ts.map +1 -1
- package/dist/layouts/index.js +5 -4
- package/dist/layouts/index.js.map +1 -1
- package/dist/layouts/types.js +4 -2
- package/dist/layouts/types.js.map +1 -1
- package/dist/layouts/utils.d.ts +1 -1
- package/dist/layouts/utils.d.ts.map +1 -1
- package/dist/layouts/utils.js +32 -40
- package/dist/layouts/utils.js.map +1 -1
- package/dist/next/index.js +31 -34
- package/dist/next/index.js.map +1 -1
- package/dist/plugin/collections/Pages.d.ts +2 -2
- package/dist/plugin/collections/Pages.d.ts.map +1 -1
- package/dist/plugin/collections/Pages.js +46 -43
- package/dist/plugin/collections/Pages.js.map +1 -1
- package/dist/plugin/fields/index.d.ts +3 -3
- package/dist/plugin/fields/index.d.ts.map +1 -1
- package/dist/plugin/fields/index.js +100 -78
- package/dist/plugin/fields/index.js.map +1 -1
- package/dist/plugin/fields/types.d.ts +1 -1
- package/dist/plugin/fields/types.d.ts.map +1 -1
- package/dist/plugin/fields/types.js +26 -2
- package/dist/plugin/fields/types.js.map +1 -1
- package/dist/plugin/hooks/index.d.ts +1 -1
- package/dist/plugin/hooks/index.d.ts.map +1 -1
- package/dist/plugin/hooks/index.js +2 -2
- package/dist/plugin/hooks/index.js.map +1 -1
- package/dist/plugin/hooks/isHomepageUnique.js +28 -19
- package/dist/plugin/hooks/isHomepageUnique.js.map +1 -1
- package/dist/plugin/index.d.ts +8 -8
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +192 -188
- package/dist/plugin/index.js.map +1 -1
- package/dist/render/HybridPageRenderer.d.ts +2 -2
- package/dist/render/HybridPageRenderer.d.ts.map +1 -1
- package/dist/render/HybridPageRenderer.js +58 -10
- package/dist/render/HybridPageRenderer.js.map +1 -1
- package/dist/render/PageRenderer.d.ts +2 -2
- package/dist/render/PageRenderer.d.ts.map +1 -1
- package/dist/render/PageRenderer.js +31 -14
- package/dist/render/PageRenderer.js.map +1 -1
- package/dist/render/PuckEditor.client.d.ts +1 -1
- package/dist/render/PuckEditor.client.d.ts.map +1 -1
- package/dist/render/PuckEditor.client.js +33 -16
- package/dist/render/PuckEditor.client.js.map +1 -1
- package/dist/render/index.d.ts +5 -5
- package/dist/render/index.d.ts.map +1 -1
- package/dist/render/index.js +5 -6
- package/dist/render/index.js.map +1 -1
- package/dist/styles/puck-dark-mode.css +101 -0
- package/dist/theme/context.d.ts +2 -2
- package/dist/theme/context.d.ts.map +1 -1
- package/dist/theme/context.js +21 -18
- package/dist/theme/context.js.map +1 -1
- package/dist/theme/defaults.d.ts +1 -1
- package/dist/theme/defaults.d.ts.map +1 -1
- package/dist/theme/defaults.js +83 -37
- package/dist/theme/defaults.js.map +1 -1
- package/dist/theme/example.d.ts +1 -1
- package/dist/theme/example.d.ts.map +1 -1
- package/dist/theme/example.js +68 -30
- package/dist/theme/example.js.map +1 -1
- package/dist/theme/index.d.ts +5 -5
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +6 -5
- package/dist/theme/index.js.map +1 -1
- package/dist/theme/types.js +6 -2
- package/dist/theme/types.js.map +1 -1
- package/dist/theme/utils.d.ts +1 -1
- package/dist/theme/utils.d.ts.map +1 -1
- package/dist/theme/utils.js +24 -25
- package/dist/theme/utils.js.map +1 -1
- package/dist/types/index.d.ts +42 -6
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +3 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +13 -22
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/migration.d.ts +1 -1
- package/dist/utils/migration.d.ts.map +1 -1
- package/dist/utils/migration.js +43 -49
- package/dist/utils/migration.js.map +1 -1
- package/dist/utils/validation.d.ts +1 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +36 -43
- package/dist/utils/validation.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -1
- package/dist/version.js.map +1 -1
- package/dist/views/PuckConfigContext.d.ts +1 -1
- package/dist/views/PuckConfigContext.d.ts.map +1 -1
- package/dist/views/PuckConfigContext.js +25 -10
- package/dist/views/PuckConfigContext.js.map +1 -1
- package/dist/views/PuckEditorView.d.ts +1 -1
- package/dist/views/PuckEditorView.d.ts.map +1 -1
- package/dist/views/PuckEditorView.js +137 -41
- package/dist/views/PuckEditorView.js.map +1 -1
- package/dist/views/index.js +2 -2
- package/dist/views/index.js.map +1 -1
- package/package.json +62 -42
package/dist/utils/migration.js
CHANGED
|
@@ -3,15 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This utility converts legacy Payload CMS page block structures to the
|
|
5
5
|
* Puck visual editor format, enabling seamless migration of existing content.
|
|
6
|
-
*/
|
|
7
|
-
// =============================================================================
|
|
6
|
+
*/ // =============================================================================
|
|
8
7
|
// Block Type Mapping
|
|
9
8
|
// =============================================================================
|
|
10
9
|
/**
|
|
11
10
|
* Maps legacy Payload block types (camelCase) to Puck component types (PascalCase).
|
|
12
11
|
* Extend this map to support additional custom block types.
|
|
13
|
-
*/
|
|
14
|
-
export const blockTypeMap = {
|
|
12
|
+
*/ export const blockTypeMap = {
|
|
15
13
|
heroBlock: 'Hero',
|
|
16
14
|
richTextBlock: 'RichText',
|
|
17
15
|
containerBlock: 'Container',
|
|
@@ -25,7 +23,7 @@ export const blockTypeMap = {
|
|
|
25
23
|
buttonBlock: 'Button',
|
|
26
24
|
cardBlock: 'Card',
|
|
27
25
|
dividerBlock: 'Divider',
|
|
28
|
-
accordionBlock: 'Accordion'
|
|
26
|
+
accordionBlock: 'Accordion'
|
|
29
27
|
};
|
|
30
28
|
// =============================================================================
|
|
31
29
|
// ID Generation
|
|
@@ -33,8 +31,7 @@ export const blockTypeMap = {
|
|
|
33
31
|
/**
|
|
34
32
|
* Generates a unique ID for Puck content items.
|
|
35
33
|
* Uses a format compatible with Puck's internal ID scheme.
|
|
36
|
-
*/
|
|
37
|
-
export function generatePuckId(legacyId) {
|
|
34
|
+
*/ export function generatePuckId(legacyId) {
|
|
38
35
|
if (legacyId) {
|
|
39
36
|
return legacyId;
|
|
40
37
|
}
|
|
@@ -47,14 +44,15 @@ export function generatePuckId(legacyId) {
|
|
|
47
44
|
/**
|
|
48
45
|
* Transforms a Payload media reference (ID or Media object) to Puck MediaReference format.
|
|
49
46
|
* Handles both ID-only references and full Media objects.
|
|
50
|
-
*/
|
|
51
|
-
export function transformMediaReference(media) {
|
|
47
|
+
*/ export function transformMediaReference(media) {
|
|
52
48
|
if (media === null || media === undefined) {
|
|
53
49
|
return null;
|
|
54
50
|
}
|
|
55
51
|
if (typeof media === 'number' || typeof media === 'string') {
|
|
56
52
|
// Just an ID reference - Puck will need to fetch the full media
|
|
57
|
-
return {
|
|
53
|
+
return {
|
|
54
|
+
id: media
|
|
55
|
+
};
|
|
58
56
|
}
|
|
59
57
|
// Full media object
|
|
60
58
|
return {
|
|
@@ -62,14 +60,13 @@ export function transformMediaReference(media) {
|
|
|
62
60
|
url: media.url,
|
|
63
61
|
alt: media.alt,
|
|
64
62
|
width: media.width,
|
|
65
|
-
height: media.height
|
|
63
|
+
height: media.height
|
|
66
64
|
};
|
|
67
65
|
}
|
|
68
66
|
/**
|
|
69
67
|
* Transforms Lexical rich text content to a serialized string format.
|
|
70
68
|
* Puck stores rich text as JSON strings for the custom editors.
|
|
71
|
-
*/
|
|
72
|
-
export function transformRichText(richText) {
|
|
69
|
+
*/ export function transformRichText(richText) {
|
|
73
70
|
if (!richText) {
|
|
74
71
|
return undefined;
|
|
75
72
|
}
|
|
@@ -81,8 +78,7 @@ export function transformRichText(richText) {
|
|
|
81
78
|
if (typeof richText === 'object') {
|
|
82
79
|
try {
|
|
83
80
|
return JSON.stringify(richText);
|
|
84
|
-
}
|
|
85
|
-
catch {
|
|
81
|
+
} catch {
|
|
86
82
|
console.warn('[payload-puck] Failed to serialize rich text content');
|
|
87
83
|
return undefined;
|
|
88
84
|
}
|
|
@@ -91,19 +87,22 @@ export function transformRichText(richText) {
|
|
|
91
87
|
}
|
|
92
88
|
/**
|
|
93
89
|
* Transforms an array of relationships to Puck format.
|
|
94
|
-
*/
|
|
95
|
-
export function transformRelationshipArray(relations) {
|
|
90
|
+
*/ export function transformRelationshipArray(relations) {
|
|
96
91
|
if (!relations || !Array.isArray(relations)) {
|
|
97
92
|
return undefined;
|
|
98
93
|
}
|
|
99
|
-
return relations.map((rel)
|
|
94
|
+
return relations.map((rel)=>{
|
|
100
95
|
if (typeof rel === 'number' || typeof rel === 'string') {
|
|
101
|
-
return {
|
|
96
|
+
return {
|
|
97
|
+
id: rel,
|
|
98
|
+
title: ''
|
|
99
|
+
} // Title will need to be fetched
|
|
100
|
+
;
|
|
102
101
|
}
|
|
103
102
|
return {
|
|
104
103
|
id: rel.id,
|
|
105
104
|
title: rel.title || '',
|
|
106
|
-
slug: rel.slug
|
|
105
|
+
slug: rel.slug
|
|
107
106
|
};
|
|
108
107
|
});
|
|
109
108
|
}
|
|
@@ -112,8 +111,7 @@ export function transformRelationshipArray(relations) {
|
|
|
112
111
|
// =============================================================================
|
|
113
112
|
/**
|
|
114
113
|
* Known rich text field names in legacy blocks
|
|
115
|
-
*/
|
|
116
|
-
const RICH_TEXT_FIELDS = [
|
|
114
|
+
*/ const RICH_TEXT_FIELDS = [
|
|
117
115
|
'headingRich',
|
|
118
116
|
'subheadingRich',
|
|
119
117
|
'textRich',
|
|
@@ -121,12 +119,11 @@ const RICH_TEXT_FIELDS = [
|
|
|
121
119
|
'leftContent',
|
|
122
120
|
'rightContent',
|
|
123
121
|
'bodyContent',
|
|
124
|
-
'description'
|
|
122
|
+
'description'
|
|
125
123
|
];
|
|
126
124
|
/**
|
|
127
125
|
* Known media field names in legacy blocks
|
|
128
|
-
*/
|
|
129
|
-
const MEDIA_FIELDS = [
|
|
126
|
+
*/ const MEDIA_FIELDS = [
|
|
130
127
|
'backgroundImage',
|
|
131
128
|
'image',
|
|
132
129
|
'rightImage',
|
|
@@ -134,22 +131,21 @@ const MEDIA_FIELDS = [
|
|
|
134
131
|
'profileImage',
|
|
135
132
|
'media',
|
|
136
133
|
'thumbnail',
|
|
137
|
-
'icon'
|
|
134
|
+
'icon'
|
|
138
135
|
];
|
|
139
136
|
/**
|
|
140
137
|
* Transform props for a specific block type.
|
|
141
138
|
* Handles any block-specific transformations needed.
|
|
142
|
-
*/
|
|
143
|
-
export function transformBlockProps(block, options) {
|
|
139
|
+
*/ export function transformBlockProps(block, options) {
|
|
144
140
|
const { blockType, id, blockName, ...restProps } = block;
|
|
145
141
|
const richTextFields = options?.richTextFields || RICH_TEXT_FIELDS;
|
|
146
142
|
const mediaFields = options?.mediaFields || MEDIA_FIELDS;
|
|
147
143
|
const customTransformers = options?.customTransformers || {};
|
|
148
144
|
const props = {
|
|
149
|
-
id: generatePuckId(id)
|
|
145
|
+
id: generatePuckId(id)
|
|
150
146
|
};
|
|
151
147
|
// Process each prop based on known patterns
|
|
152
|
-
for (const [key, value] of Object.entries(restProps))
|
|
148
|
+
for (const [key, value] of Object.entries(restProps)){
|
|
153
149
|
// Check for custom transformer first
|
|
154
150
|
if (customTransformers[key]) {
|
|
155
151
|
props[key] = customTransformers[key](value);
|
|
@@ -167,12 +163,12 @@ export function transformBlockProps(block, options) {
|
|
|
167
163
|
}
|
|
168
164
|
// Array fields that need ID generation for items
|
|
169
165
|
if (Array.isArray(value)) {
|
|
170
|
-
props[key] = value.map((item)
|
|
166
|
+
props[key] = value.map((item)=>{
|
|
171
167
|
if (typeof item === 'object' && item !== null) {
|
|
172
168
|
const { id: itemId, ...itemRest } = item;
|
|
173
169
|
return {
|
|
174
170
|
...itemRest,
|
|
175
|
-
id: itemId || generatePuckId()
|
|
171
|
+
id: itemId || generatePuckId()
|
|
176
172
|
};
|
|
177
173
|
}
|
|
178
174
|
return item;
|
|
@@ -207,23 +203,22 @@ export function transformBlockProps(block, options) {
|
|
|
207
203
|
* data: { puckData },
|
|
208
204
|
* })
|
|
209
205
|
* ```
|
|
210
|
-
*/
|
|
211
|
-
|
|
212
|
-
const { blockTypeMap: customBlockTypeMap, richTextFields, mediaFields, customTransformers, skipUnknownBlocks = true, onUnknownBlock, } = options;
|
|
206
|
+
*/ export function migrateLegacyToPuck(page, options = {}) {
|
|
207
|
+
const { blockTypeMap: customBlockTypeMap, richTextFields, mediaFields, customTransformers, skipUnknownBlocks = true, onUnknownBlock } = options;
|
|
213
208
|
// Merge custom block type map with defaults
|
|
214
209
|
const effectiveBlockTypeMap = {
|
|
215
210
|
...blockTypeMap,
|
|
216
|
-
...customBlockTypeMap
|
|
211
|
+
...customBlockTypeMap
|
|
217
212
|
};
|
|
218
213
|
// Build root props
|
|
219
214
|
const rootProps = {
|
|
220
215
|
title: page.title,
|
|
221
|
-
pageLayout: page.pageLayout || 'default'
|
|
216
|
+
pageLayout: page.pageLayout || 'default'
|
|
222
217
|
};
|
|
223
218
|
// Convert layout blocks to Puck content items
|
|
224
219
|
const content = [];
|
|
225
220
|
if (page.layout && Array.isArray(page.layout)) {
|
|
226
|
-
for (const block of page.layout)
|
|
221
|
+
for (const block of page.layout){
|
|
227
222
|
const legacyBlock = block;
|
|
228
223
|
// Get the Puck component type from the legacy block type
|
|
229
224
|
const puckType = effectiveBlockTypeMap[legacyBlock.blockType];
|
|
@@ -246,12 +241,12 @@ export function migrateLegacyToPuck(page, options = {}) {
|
|
|
246
241
|
const transformedProps = transformBlockProps(legacyBlock, {
|
|
247
242
|
richTextFields,
|
|
248
243
|
mediaFields,
|
|
249
|
-
customTransformers
|
|
244
|
+
customTransformers
|
|
250
245
|
});
|
|
251
246
|
// Create the Puck content item
|
|
252
247
|
const contentItem = {
|
|
253
248
|
type: puckType,
|
|
254
|
-
props: transformedProps
|
|
249
|
+
props: transformedProps
|
|
255
250
|
};
|
|
256
251
|
content.push(contentItem);
|
|
257
252
|
}
|
|
@@ -259,10 +254,10 @@ export function migrateLegacyToPuck(page, options = {}) {
|
|
|
259
254
|
// Build the complete Puck data structure
|
|
260
255
|
const puckData = {
|
|
261
256
|
root: {
|
|
262
|
-
props: rootProps
|
|
257
|
+
props: rootProps
|
|
263
258
|
},
|
|
264
259
|
content,
|
|
265
|
-
zones: {}
|
|
260
|
+
zones: {}
|
|
266
261
|
};
|
|
267
262
|
return puckData;
|
|
268
263
|
}
|
|
@@ -273,23 +268,21 @@ export function migrateLegacyToPuck(page, options = {}) {
|
|
|
273
268
|
* @param page - The legacy page to preview
|
|
274
269
|
* @param customBlockTypeMap - Optional custom block type mapping
|
|
275
270
|
* @returns Preview information about the migration
|
|
276
|
-
*/
|
|
277
|
-
export function getMigrationPreview(page, customBlockTypeMap) {
|
|
271
|
+
*/ export function getMigrationPreview(page, customBlockTypeMap) {
|
|
278
272
|
const warnings = [];
|
|
279
273
|
const blockTypes = [];
|
|
280
274
|
const unmappedBlockTypes = [];
|
|
281
275
|
const effectiveBlockTypeMap = {
|
|
282
276
|
...blockTypeMap,
|
|
283
|
-
...customBlockTypeMap
|
|
277
|
+
...customBlockTypeMap
|
|
284
278
|
};
|
|
285
279
|
if (page.layout && Array.isArray(page.layout)) {
|
|
286
|
-
for (const block of page.layout)
|
|
280
|
+
for (const block of page.layout){
|
|
287
281
|
const legacyBlock = block;
|
|
288
282
|
const puckType = effectiveBlockTypeMap[legacyBlock.blockType];
|
|
289
283
|
if (puckType) {
|
|
290
284
|
blockTypes.push(puckType);
|
|
291
|
-
}
|
|
292
|
-
else {
|
|
285
|
+
} else {
|
|
293
286
|
warnings.push(`Unknown block type: ${legacyBlock.blockType}`);
|
|
294
287
|
if (!unmappedBlockTypes.includes(legacyBlock.blockType)) {
|
|
295
288
|
unmappedBlockTypes.push(legacyBlock.blockType);
|
|
@@ -303,7 +296,8 @@ export function getMigrationPreview(page, customBlockTypeMap) {
|
|
|
303
296
|
blockCount: page.layout?.length || 0,
|
|
304
297
|
blockTypes,
|
|
305
298
|
warnings,
|
|
306
|
-
unmappedBlockTypes
|
|
299
|
+
unmappedBlockTypes
|
|
307
300
|
};
|
|
308
301
|
}
|
|
302
|
+
|
|
309
303
|
//# sourceMappingURL=migration.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/utils/migration.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/migration.ts"],"sourcesContent":["/**\n * Migration Utility for Converting Legacy Payload CMS Pages to Puck Format\n *\n * This utility converts legacy Payload CMS page block structures to the\n * Puck visual editor format, enabling seamless migration of existing content.\n */\n\nimport type { PuckPageData, PuckRootProps, MediaObject } from '../types/index.js'\n\n// =============================================================================\n// Type Definitions\n// =============================================================================\n\n/**\n * Legacy block from Payload CMS pages.\n * Each block has a blockType discriminator and various props.\n */\nexport interface LegacyBlock {\n blockType: string\n id?: string | null\n blockName?: string | null\n [key: string]: unknown\n}\n\n/**\n * Subset of Page type used for migration.\n * Only includes fields relevant to content migration.\n */\nexport interface LegacyPage {\n title: string\n slug: string\n pageLayout?: string\n layout?: LegacyBlock[] | null\n [key: string]: unknown\n}\n\n/**\n * Media reference in Puck format\n */\nexport interface MediaReference {\n id: string | number\n url?: string\n alt?: string\n width?: number\n height?: number\n}\n\n/**\n * Puck content item structure\n */\nexport interface PuckContentItem {\n type: string\n props: { id: string; [key: string]: unknown }\n}\n\n// =============================================================================\n// Block Type Mapping\n// =============================================================================\n\n/**\n * Maps legacy Payload block types (camelCase) to Puck component types (PascalCase).\n * Extend this map to support additional custom block types.\n */\nexport const blockTypeMap: Record<string, string> = {\n heroBlock: 'Hero',\n richTextBlock: 'RichText',\n containerBlock: 'Container',\n flexBlock: 'Flex',\n gridBlock: 'Grid',\n sectionBlock: 'Section',\n spacerBlock: 'Spacer',\n headingBlock: 'Heading',\n textBlock: 'Text',\n imageBlock: 'Image',\n buttonBlock: 'Button',\n cardBlock: 'Card',\n dividerBlock: 'Divider',\n accordionBlock: 'Accordion',\n}\n\n// =============================================================================\n// ID Generation\n// =============================================================================\n\n/**\n * Generates a unique ID for Puck content items.\n * Uses a format compatible with Puck's internal ID scheme.\n */\nexport function generatePuckId(legacyId?: string | null): string {\n if (legacyId) {\n return legacyId\n }\n // Generate a random ID similar to Puck's format\n return `puck-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`\n}\n\n// =============================================================================\n// Prop Transformation Utilities\n// =============================================================================\n\n/**\n * Transforms a Payload media reference (ID or Media object) to Puck MediaReference format.\n * Handles both ID-only references and full Media objects.\n */\nexport function transformMediaReference(\n media:\n | string\n | number\n | { id: string | number; url?: string; alt?: string; width?: number; height?: number }\n | MediaObject\n | null\n | undefined\n): MediaReference | null {\n if (media === null || media === undefined) {\n return null\n }\n\n if (typeof media === 'number' || typeof media === 'string') {\n // Just an ID reference - Puck will need to fetch the full media\n return { id: media }\n }\n\n // Full media object\n return {\n id: media.id,\n url: media.url,\n alt: media.alt,\n width: media.width,\n height: media.height,\n }\n}\n\n/**\n * Transforms Lexical rich text content to a serialized string format.\n * Puck stores rich text as JSON strings for the custom editors.\n */\nexport function transformRichText(richText: unknown): string | undefined {\n if (!richText) {\n return undefined\n }\n\n // If it's already a string, return as-is\n if (typeof richText === 'string') {\n return richText\n }\n\n // If it's an object (Lexical format), serialize it\n if (typeof richText === 'object') {\n try {\n return JSON.stringify(richText)\n } catch {\n console.warn('[payload-puck] Failed to serialize rich text content')\n return undefined\n }\n }\n\n return undefined\n}\n\n/**\n * Transforms an array of relationships to Puck format.\n */\nexport function transformRelationshipArray<\n T extends { id: string | number; title?: string; slug?: string },\n>(\n relations: (string | number | T)[] | null | undefined\n): Array<{ id: string | number; title: string; slug?: string }> | undefined {\n if (!relations || !Array.isArray(relations)) {\n return undefined\n }\n\n return relations.map((rel) => {\n if (typeof rel === 'number' || typeof rel === 'string') {\n return { id: rel, title: '' } // Title will need to be fetched\n }\n return {\n id: rel.id,\n title: rel.title || '',\n slug: rel.slug,\n }\n })\n}\n\n// =============================================================================\n// Block Prop Transformation\n// =============================================================================\n\n/**\n * Known rich text field names in legacy blocks\n */\nconst RICH_TEXT_FIELDS = [\n 'headingRich',\n 'subheadingRich',\n 'textRich',\n 'content',\n 'leftContent',\n 'rightContent',\n 'bodyContent',\n 'description',\n]\n\n/**\n * Known media field names in legacy blocks\n */\nconst MEDIA_FIELDS = [\n 'backgroundImage',\n 'image',\n 'rightImage',\n 'leftImage',\n 'profileImage',\n 'media',\n 'thumbnail',\n 'icon',\n]\n\n/**\n * Transform props for a specific block type.\n * Handles any block-specific transformations needed.\n */\nexport function transformBlockProps(\n block: LegacyBlock,\n options?: {\n richTextFields?: string[]\n mediaFields?: string[]\n customTransformers?: Record<string, (value: unknown) => unknown>\n }\n): Record<string, unknown> {\n const { blockType, id, blockName, ...restProps } = block\n const richTextFields = options?.richTextFields || RICH_TEXT_FIELDS\n const mediaFields = options?.mediaFields || MEDIA_FIELDS\n const customTransformers = options?.customTransformers || {}\n\n const props: Record<string, unknown> = {\n id: generatePuckId(id),\n }\n\n // Process each prop based on known patterns\n for (const [key, value] of Object.entries(restProps)) {\n // Check for custom transformer first\n if (customTransformers[key]) {\n props[key] = customTransformers[key](value)\n continue\n }\n\n // Rich text fields - serialize Lexical content\n if (richTextFields.includes(key)) {\n props[key] = transformRichText(value)\n continue\n }\n\n // Media fields - transform to MediaReference\n if (mediaFields.includes(key)) {\n props[key] = transformMediaReference(\n value as\n | string\n | number\n | { id: string | number; url?: string; alt?: string }\n | null\n )\n continue\n }\n\n // Array fields that need ID generation for items\n if (Array.isArray(value)) {\n props[key] = value.map((item) => {\n if (typeof item === 'object' && item !== null) {\n const { id: itemId, ...itemRest } = item as {\n id?: string\n [k: string]: unknown\n }\n return {\n ...itemRest,\n id: itemId || generatePuckId(),\n }\n }\n return item\n })\n continue\n }\n\n // Default: pass through as-is\n props[key] = value\n }\n\n return props\n}\n\n// =============================================================================\n// Main Migration Function\n// =============================================================================\n\n/**\n * Options for the migration function\n */\nexport interface MigrateLegacyOptions {\n /**\n * Custom block type mapping to extend or override defaults\n */\n blockTypeMap?: Record<string, string>\n\n /**\n * Additional rich text field names to transform\n */\n richTextFields?: string[]\n\n /**\n * Additional media field names to transform\n */\n mediaFields?: string[]\n\n /**\n * Custom prop transformers for specific field names\n */\n customTransformers?: Record<string, (value: unknown) => unknown>\n\n /**\n * Whether to skip unknown block types (default: true)\n * If false, unknown blocks will throw an error\n */\n skipUnknownBlocks?: boolean\n\n /**\n * Callback for handling unknown block types\n */\n onUnknownBlock?: (block: LegacyBlock) => PuckContentItem | null\n}\n\n/**\n * Migrates a legacy Payload CMS page to Puck format.\n *\n * This function:\n * 1. Extracts root props (title, pageLayout, etc.)\n * 2. Converts each block in the layout array to a Puck content item\n * 3. Maps block types from camelCase to PascalCase using blockTypeMap\n * 4. Transforms block props appropriately\n *\n * @param page - The legacy Page object from Payload CMS\n * @param options - Migration options\n * @returns PuckPageData ready for use with the Puck editor\n *\n * @example\n * ```ts\n * const legacyPage = await payload.findByID({ collection: 'pages', id: pageId })\n * const puckData = migrateLegacyToPuck(legacyPage)\n * await payload.update({\n * collection: 'pages',\n * id: pageId,\n * data: { puckData },\n * })\n * ```\n */\nexport function migrateLegacyToPuck(\n page: LegacyPage,\n options: MigrateLegacyOptions = {}\n): PuckPageData {\n const {\n blockTypeMap: customBlockTypeMap,\n richTextFields,\n mediaFields,\n customTransformers,\n skipUnknownBlocks = true,\n onUnknownBlock,\n } = options\n\n // Merge custom block type map with defaults\n const effectiveBlockTypeMap = {\n ...blockTypeMap,\n ...customBlockTypeMap,\n }\n\n // Build root props\n const rootProps: PuckRootProps = {\n title: page.title,\n pageLayout: page.pageLayout || 'default',\n }\n\n // Convert layout blocks to Puck content items\n const content: PuckContentItem[] = []\n\n if (page.layout && Array.isArray(page.layout)) {\n for (const block of page.layout) {\n const legacyBlock = block as LegacyBlock\n\n // Get the Puck component type from the legacy block type\n const puckType = effectiveBlockTypeMap[legacyBlock.blockType]\n\n if (!puckType) {\n // Handle unknown block type\n if (onUnknownBlock) {\n const customItem = onUnknownBlock(legacyBlock)\n if (customItem) {\n content.push(customItem)\n }\n continue\n }\n\n if (skipUnknownBlocks) {\n console.warn(\n `[payload-puck] Unknown block type \"${legacyBlock.blockType}\" - skipping during migration`\n )\n continue\n }\n\n throw new Error(\n `Unknown block type \"${legacyBlock.blockType}\" encountered during migration`\n )\n }\n\n // Transform the block props\n const transformedProps = transformBlockProps(legacyBlock, {\n richTextFields,\n mediaFields,\n customTransformers,\n })\n\n // Create the Puck content item\n const contentItem: PuckContentItem = {\n type: puckType,\n props: transformedProps as { id: string; [key: string]: unknown },\n }\n\n content.push(contentItem)\n }\n }\n\n // Build the complete Puck data structure\n const puckData: PuckPageData = {\n root: {\n props: rootProps,\n },\n content,\n zones: {},\n }\n\n return puckData\n}\n\n// =============================================================================\n// Migration Preview\n// =============================================================================\n\n/**\n * Migration preview result\n */\nexport interface MigrationPreview {\n title: string\n slug: string\n blockCount: number\n blockTypes: string[]\n warnings: string[]\n unmappedBlockTypes: string[]\n}\n\n/**\n * Gets a summary of a legacy page for migration preview.\n * Useful for showing users what will be migrated before committing.\n *\n * @param page - The legacy page to preview\n * @param customBlockTypeMap - Optional custom block type mapping\n * @returns Preview information about the migration\n */\nexport function getMigrationPreview(\n page: LegacyPage,\n customBlockTypeMap?: Record<string, string>\n): MigrationPreview {\n const warnings: string[] = []\n const blockTypes: string[] = []\n const unmappedBlockTypes: string[] = []\n\n const effectiveBlockTypeMap = {\n ...blockTypeMap,\n ...customBlockTypeMap,\n }\n\n if (page.layout && Array.isArray(page.layout)) {\n for (const block of page.layout) {\n const legacyBlock = block as LegacyBlock\n const puckType = effectiveBlockTypeMap[legacyBlock.blockType]\n\n if (puckType) {\n blockTypes.push(puckType)\n } else {\n warnings.push(`Unknown block type: ${legacyBlock.blockType}`)\n if (!unmappedBlockTypes.includes(legacyBlock.blockType)) {\n unmappedBlockTypes.push(legacyBlock.blockType)\n }\n }\n }\n }\n\n return {\n title: page.title,\n slug: page.slug,\n blockCount: page.layout?.length || 0,\n blockTypes,\n warnings,\n unmappedBlockTypes,\n }\n}\n"],"names":["blockTypeMap","heroBlock","richTextBlock","containerBlock","flexBlock","gridBlock","sectionBlock","spacerBlock","headingBlock","textBlock","imageBlock","buttonBlock","cardBlock","dividerBlock","accordionBlock","generatePuckId","legacyId","Date","now","Math","random","toString","substring","transformMediaReference","media","undefined","id","url","alt","width","height","transformRichText","richText","JSON","stringify","console","warn","transformRelationshipArray","relations","Array","isArray","map","rel","title","slug","RICH_TEXT_FIELDS","MEDIA_FIELDS","transformBlockProps","block","options","blockType","blockName","restProps","richTextFields","mediaFields","customTransformers","props","key","value","Object","entries","includes","item","itemId","itemRest","migrateLegacyToPuck","page","customBlockTypeMap","skipUnknownBlocks","onUnknownBlock","effectiveBlockTypeMap","rootProps","pageLayout","content","layout","legacyBlock","puckType","customItem","push","Error","transformedProps","contentItem","type","puckData","root","zones","getMigrationPreview","warnings","blockTypes","unmappedBlockTypes","blockCount","length"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Provides validation functions for ensuring Puck data structures are well-formed.
|
|
5
5
|
*/
|
|
6
|
-
import type { PuckPageData, PuckRootProps } from '../types';
|
|
6
|
+
import type { PuckPageData, PuckRootProps } from '../types/index.js';
|
|
7
7
|
/**
|
|
8
8
|
* Result of a validation operation
|
|
9
9
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAMpE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAE3B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAA;IAEtB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAE5B;;OAEG;IACH,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAA;IAEhC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B;AAMD;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,YAAY,CA0C9D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAKtE;AAMD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,iBAAsB,GAC9B,gBAAgB,CA0JlB;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,OAAO,EACb,OAAO,CAAC,EAAE,iBAAiB,GAC1B,YAAY,CAUd;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,iBAAiB,GAC1B,gBAAgB,GAAG;IAAE,IAAI,CAAC,EAAE,YAAY,CAAA;CAAE,CAuB5C"}
|
package/dist/utils/validation.js
CHANGED
|
@@ -2,15 +2,13 @@
|
|
|
2
2
|
* Puck Data Validation Utilities
|
|
3
3
|
*
|
|
4
4
|
* Provides validation functions for ensuring Puck data structures are well-formed.
|
|
5
|
-
*/
|
|
6
|
-
// =============================================================================
|
|
5
|
+
*/ // =============================================================================
|
|
7
6
|
// Type Guards
|
|
8
7
|
// =============================================================================
|
|
9
8
|
/**
|
|
10
9
|
* Type guard to check if a value is a valid PuckPageData structure.
|
|
11
10
|
* Performs basic structural validation.
|
|
12
|
-
*/
|
|
13
|
-
export function isPuckData(data) {
|
|
11
|
+
*/ export function isPuckData(data) {
|
|
14
12
|
if (!data || typeof data !== 'object') {
|
|
15
13
|
return false;
|
|
16
14
|
}
|
|
@@ -28,7 +26,7 @@ export function isPuckData(data) {
|
|
|
28
26
|
return false;
|
|
29
27
|
}
|
|
30
28
|
// Validate each content item has required fields
|
|
31
|
-
for (const item of obj.content)
|
|
29
|
+
for (const item of obj.content){
|
|
32
30
|
if (!item || typeof item !== 'object') {
|
|
33
31
|
return false;
|
|
34
32
|
}
|
|
@@ -48,8 +46,7 @@ export function isPuckData(data) {
|
|
|
48
46
|
}
|
|
49
47
|
/**
|
|
50
48
|
* Type guard for PuckRootProps
|
|
51
|
-
*/
|
|
52
|
-
export function isPuckRootProps(props) {
|
|
49
|
+
*/ export function isPuckRootProps(props) {
|
|
53
50
|
if (!props || typeof props !== 'object') {
|
|
54
51
|
return false;
|
|
55
52
|
}
|
|
@@ -73,15 +70,20 @@ export function isPuckRootProps(props) {
|
|
|
73
70
|
* console.error('Validation errors:', result.errors)
|
|
74
71
|
* }
|
|
75
72
|
* ```
|
|
76
|
-
*/
|
|
77
|
-
|
|
78
|
-
|
|
73
|
+
*/ export function validatePuckData(data, options = {}) {
|
|
74
|
+
const { requireContentIds = true, validateRoot = true, requiredRootProps = [
|
|
75
|
+
'title'
|
|
76
|
+
], allowedComponentTypes, strictComponentTypes = false } = options;
|
|
79
77
|
const errors = [];
|
|
80
78
|
const warnings = [];
|
|
81
79
|
// Basic type check
|
|
82
80
|
if (!data || typeof data !== 'object') {
|
|
83
81
|
errors.push('Data must be a non-null object');
|
|
84
|
-
return {
|
|
82
|
+
return {
|
|
83
|
+
valid: false,
|
|
84
|
+
errors,
|
|
85
|
+
warnings
|
|
86
|
+
};
|
|
85
87
|
}
|
|
86
88
|
const obj = data;
|
|
87
89
|
// ==========================================================================
|
|
@@ -89,16 +91,14 @@ export function validatePuckData(data, options = {}) {
|
|
|
89
91
|
// ==========================================================================
|
|
90
92
|
if (!obj.root || typeof obj.root !== 'object') {
|
|
91
93
|
errors.push('Missing or invalid root object');
|
|
92
|
-
}
|
|
93
|
-
else if (validateRoot) {
|
|
94
|
+
} else if (validateRoot) {
|
|
94
95
|
const root = obj.root;
|
|
95
96
|
if (!root.props || typeof root.props !== 'object') {
|
|
96
97
|
errors.push('Missing root.props object');
|
|
97
|
-
}
|
|
98
|
-
else {
|
|
98
|
+
} else {
|
|
99
99
|
const rootProps = root.props;
|
|
100
100
|
// Check required root props
|
|
101
|
-
for (const prop of requiredRootProps)
|
|
101
|
+
for (const prop of requiredRootProps){
|
|
102
102
|
if (rootProps[prop] === undefined || rootProps[prop] === null) {
|
|
103
103
|
errors.push(`Missing required root prop: ${prop}`);
|
|
104
104
|
}
|
|
@@ -116,10 +116,9 @@ export function validatePuckData(data, options = {}) {
|
|
|
116
116
|
// ==========================================================================
|
|
117
117
|
if (!Array.isArray(obj.content)) {
|
|
118
118
|
errors.push('content must be an array');
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
119
|
+
} else {
|
|
121
120
|
const seenIds = new Set();
|
|
122
|
-
obj.content.forEach((item, index)
|
|
121
|
+
obj.content.forEach((item, index)=>{
|
|
123
122
|
if (!item || typeof item !== 'object') {
|
|
124
123
|
errors.push(`Content item at index ${index} is not an object`);
|
|
125
124
|
return;
|
|
@@ -128,14 +127,12 @@ export function validatePuckData(data, options = {}) {
|
|
|
128
127
|
// Validate type
|
|
129
128
|
if (!contentItem.type || typeof contentItem.type !== 'string') {
|
|
130
129
|
errors.push(`Content item at index ${index} missing or invalid type`);
|
|
131
|
-
}
|
|
132
|
-
else if (allowedComponentTypes) {
|
|
130
|
+
} else if (allowedComponentTypes) {
|
|
133
131
|
if (!allowedComponentTypes.includes(contentItem.type)) {
|
|
134
132
|
const message = `Unknown component type "${contentItem.type}" at index ${index}`;
|
|
135
133
|
if (strictComponentTypes) {
|
|
136
134
|
errors.push(message);
|
|
137
|
-
}
|
|
138
|
-
else {
|
|
135
|
+
} else {
|
|
139
136
|
warnings.push(message);
|
|
140
137
|
}
|
|
141
138
|
}
|
|
@@ -143,13 +140,11 @@ export function validatePuckData(data, options = {}) {
|
|
|
143
140
|
// Validate props
|
|
144
141
|
if (!contentItem.props || typeof contentItem.props !== 'object') {
|
|
145
142
|
errors.push(`Content item at index ${index} missing props object`);
|
|
146
|
-
}
|
|
147
|
-
else if (requireContentIds) {
|
|
143
|
+
} else if (requireContentIds) {
|
|
148
144
|
const props = contentItem.props;
|
|
149
145
|
if (!props.id || typeof props.id !== 'string') {
|
|
150
146
|
errors.push(`Content item at index ${index} missing or invalid props.id`);
|
|
151
|
-
}
|
|
152
|
-
else {
|
|
147
|
+
} else {
|
|
153
148
|
// Check for duplicate IDs
|
|
154
149
|
if (seenIds.has(props.id)) {
|
|
155
150
|
warnings.push(`Duplicate content item ID "${props.id}" at index ${index}`);
|
|
@@ -165,15 +160,14 @@ export function validatePuckData(data, options = {}) {
|
|
|
165
160
|
if (obj.zones !== undefined) {
|
|
166
161
|
if (typeof obj.zones !== 'object' || obj.zones === null) {
|
|
167
162
|
errors.push('zones must be an object');
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
163
|
+
} else {
|
|
170
164
|
const zones = obj.zones;
|
|
171
|
-
for (const [zoneName, zoneContent] of Object.entries(zones))
|
|
165
|
+
for (const [zoneName, zoneContent] of Object.entries(zones)){
|
|
172
166
|
if (!Array.isArray(zoneContent)) {
|
|
173
167
|
errors.push(`Zone "${zoneName}" content must be an array`);
|
|
174
168
|
continue;
|
|
175
169
|
}
|
|
176
|
-
zoneContent.forEach((item, index)
|
|
170
|
+
zoneContent.forEach((item, index)=>{
|
|
177
171
|
if (!item || typeof item !== 'object') {
|
|
178
172
|
errors.push(`Zone "${zoneName}" item at index ${index} is not an object`);
|
|
179
173
|
return;
|
|
@@ -184,8 +178,7 @@ export function validatePuckData(data, options = {}) {
|
|
|
184
178
|
}
|
|
185
179
|
if (!contentItem.props || typeof contentItem.props !== 'object') {
|
|
186
180
|
errors.push(`Zone "${zoneName}" item at index ${index} missing props object`);
|
|
187
|
-
}
|
|
188
|
-
else if (requireContentIds) {
|
|
181
|
+
} else if (requireContentIds) {
|
|
189
182
|
const props = contentItem.props;
|
|
190
183
|
if (!props.id || typeof props.id !== 'string') {
|
|
191
184
|
errors.push(`Zone "${zoneName}" item at index ${index} missing or invalid props.id`);
|
|
@@ -198,7 +191,7 @@ export function validatePuckData(data, options = {}) {
|
|
|
198
191
|
return {
|
|
199
192
|
valid: errors.length === 0,
|
|
200
193
|
errors,
|
|
201
|
-
warnings
|
|
194
|
+
warnings
|
|
202
195
|
};
|
|
203
196
|
}
|
|
204
197
|
/**
|
|
@@ -208,8 +201,7 @@ export function validatePuckData(data, options = {}) {
|
|
|
208
201
|
* @param options - Validation options
|
|
209
202
|
* @returns The validated PuckPageData
|
|
210
203
|
* @throws Error if validation fails
|
|
211
|
-
*/
|
|
212
|
-
export function assertPuckData(data, options) {
|
|
204
|
+
*/ export function assertPuckData(data, options) {
|
|
213
205
|
const result = validatePuckData(data, options);
|
|
214
206
|
if (!result.valid) {
|
|
215
207
|
throw new Error(`Invalid Puck data: ${result.errors.join('; ')}`);
|
|
@@ -222,26 +214,27 @@ export function assertPuckData(data, options) {
|
|
|
222
214
|
* @param json - JSON string to parse
|
|
223
215
|
* @param options - Validation options
|
|
224
216
|
* @returns Validation result with parsed data if valid
|
|
225
|
-
*/
|
|
226
|
-
export function parsePuckDataJson(json, options) {
|
|
217
|
+
*/ export function parsePuckDataJson(json, options) {
|
|
227
218
|
let parsed;
|
|
228
219
|
try {
|
|
229
220
|
parsed = JSON.parse(json);
|
|
230
|
-
}
|
|
231
|
-
catch (e) {
|
|
221
|
+
} catch (e) {
|
|
232
222
|
return {
|
|
233
223
|
valid: false,
|
|
234
|
-
errors: [
|
|
235
|
-
|
|
224
|
+
errors: [
|
|
225
|
+
`Invalid JSON: ${e instanceof Error ? e.message : 'Parse error'}`
|
|
226
|
+
],
|
|
227
|
+
warnings: []
|
|
236
228
|
};
|
|
237
229
|
}
|
|
238
230
|
const result = validatePuckData(parsed, options);
|
|
239
231
|
if (result.valid) {
|
|
240
232
|
return {
|
|
241
233
|
...result,
|
|
242
|
-
data: parsed
|
|
234
|
+
data: parsed
|
|
243
235
|
};
|
|
244
236
|
}
|
|
245
237
|
return result;
|
|
246
238
|
}
|
|
239
|
+
|
|
247
240
|
//# sourceMappingURL=validation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/validation.ts"],"sourcesContent":["/**\n * Puck Data Validation Utilities\n *\n * Provides validation functions for ensuring Puck data structures are well-formed.\n */\n\nimport type { PuckPageData, PuckRootProps } from '../types/index.js'\n\n// =============================================================================\n// Validation Result Types\n// =============================================================================\n\n/**\n * Result of a validation operation\n */\nexport interface ValidationResult {\n valid: boolean\n errors: string[]\n warnings: string[]\n}\n\n/**\n * Options for validation\n */\nexport interface ValidationOptions {\n /**\n * Whether to validate that all content items have IDs\n * @default true\n */\n requireContentIds?: boolean\n\n /**\n * Whether to validate root props\n * @default true\n */\n validateRoot?: boolean\n\n /**\n * Required root prop fields\n * @default ['title']\n */\n requiredRootProps?: string[]\n\n /**\n * Allowed component types (if specified, unknown types will be flagged)\n */\n allowedComponentTypes?: string[]\n\n /**\n * Whether to treat unknown component types as errors (vs warnings)\n * @default false\n */\n strictComponentTypes?: boolean\n}\n\n// =============================================================================\n// Type Guards\n// =============================================================================\n\n/**\n * Type guard to check if a value is a valid PuckPageData structure.\n * Performs basic structural validation.\n */\nexport function isPuckData(data: unknown): data is PuckPageData {\n if (!data || typeof data !== 'object') {\n return false\n }\n\n const obj = data as Record<string, unknown>\n\n // Check root structure\n if (!obj.root || typeof obj.root !== 'object') {\n return false\n }\n\n const root = obj.root as Record<string, unknown>\n if (!root.props || typeof root.props !== 'object') {\n return false\n }\n\n // Check content array\n if (!Array.isArray(obj.content)) {\n return false\n }\n\n // Validate each content item has required fields\n for (const item of obj.content) {\n if (!item || typeof item !== 'object') {\n return false\n }\n const contentItem = item as Record<string, unknown>\n if (typeof contentItem.type !== 'string') {\n return false\n }\n if (!contentItem.props || typeof contentItem.props !== 'object') {\n return false\n }\n }\n\n // Check zones (optional but must be object if present)\n if (obj.zones !== undefined && typeof obj.zones !== 'object') {\n return false\n }\n\n return true\n}\n\n/**\n * Type guard for PuckRootProps\n */\nexport function isPuckRootProps(props: unknown): props is PuckRootProps {\n if (!props || typeof props !== 'object') {\n return false\n }\n return true\n}\n\n// =============================================================================\n// Validation Functions\n// =============================================================================\n\n/**\n * Validates that a PuckPageData structure is well-formed.\n * Useful for testing and debugging migration issues.\n *\n * @param data - The data to validate\n * @param options - Validation options\n * @returns Validation result with errors and warnings\n *\n * @example\n * ```ts\n * const result = validatePuckData(puckData)\n * if (!result.valid) {\n * console.error('Validation errors:', result.errors)\n * }\n * ```\n */\nexport function validatePuckData(\n data: unknown,\n options: ValidationOptions = {}\n): ValidationResult {\n const {\n requireContentIds = true,\n validateRoot = true,\n requiredRootProps = ['title'],\n allowedComponentTypes,\n strictComponentTypes = false,\n } = options\n\n const errors: string[] = []\n const warnings: string[] = []\n\n // Basic type check\n if (!data || typeof data !== 'object') {\n errors.push('Data must be a non-null object')\n return { valid: false, errors, warnings }\n }\n\n const obj = data as Record<string, unknown>\n\n // ==========================================================================\n // Validate root structure\n // ==========================================================================\n\n if (!obj.root || typeof obj.root !== 'object') {\n errors.push('Missing or invalid root object')\n } else if (validateRoot) {\n const root = obj.root as Record<string, unknown>\n\n if (!root.props || typeof root.props !== 'object') {\n errors.push('Missing root.props object')\n } else {\n const rootProps = root.props as Record<string, unknown>\n\n // Check required root props\n for (const prop of requiredRootProps) {\n if (rootProps[prop] === undefined || rootProps[prop] === null) {\n errors.push(`Missing required root prop: ${prop}`)\n }\n }\n\n // Validate pageLayout if present\n if (rootProps.pageLayout !== undefined) {\n if (typeof rootProps.pageLayout !== 'string') {\n errors.push('root.props.pageLayout must be a string')\n }\n }\n }\n }\n\n // ==========================================================================\n // Validate content array\n // ==========================================================================\n\n if (!Array.isArray(obj.content)) {\n errors.push('content must be an array')\n } else {\n const seenIds = new Set<string>()\n\n obj.content.forEach((item, index) => {\n if (!item || typeof item !== 'object') {\n errors.push(`Content item at index ${index} is not an object`)\n return\n }\n\n const contentItem = item as Record<string, unknown>\n\n // Validate type\n if (!contentItem.type || typeof contentItem.type !== 'string') {\n errors.push(`Content item at index ${index} missing or invalid type`)\n } else if (allowedComponentTypes) {\n if (!allowedComponentTypes.includes(contentItem.type)) {\n const message = `Unknown component type \"${contentItem.type}\" at index ${index}`\n if (strictComponentTypes) {\n errors.push(message)\n } else {\n warnings.push(message)\n }\n }\n }\n\n // Validate props\n if (!contentItem.props || typeof contentItem.props !== 'object') {\n errors.push(`Content item at index ${index} missing props object`)\n } else if (requireContentIds) {\n const props = contentItem.props as Record<string, unknown>\n\n if (!props.id || typeof props.id !== 'string') {\n errors.push(`Content item at index ${index} missing or invalid props.id`)\n } else {\n // Check for duplicate IDs\n if (seenIds.has(props.id)) {\n warnings.push(\n `Duplicate content item ID \"${props.id}\" at index ${index}`\n )\n }\n seenIds.add(props.id)\n }\n }\n })\n }\n\n // ==========================================================================\n // Validate zones\n // ==========================================================================\n\n if (obj.zones !== undefined) {\n if (typeof obj.zones !== 'object' || obj.zones === null) {\n errors.push('zones must be an object')\n } else {\n const zones = obj.zones as Record<string, unknown>\n\n for (const [zoneName, zoneContent] of Object.entries(zones)) {\n if (!Array.isArray(zoneContent)) {\n errors.push(`Zone \"${zoneName}\" content must be an array`)\n continue\n }\n\n zoneContent.forEach((item, index) => {\n if (!item || typeof item !== 'object') {\n errors.push(`Zone \"${zoneName}\" item at index ${index} is not an object`)\n return\n }\n\n const contentItem = item as Record<string, unknown>\n\n if (!contentItem.type || typeof contentItem.type !== 'string') {\n errors.push(\n `Zone \"${zoneName}\" item at index ${index} missing or invalid type`\n )\n }\n\n if (!contentItem.props || typeof contentItem.props !== 'object') {\n errors.push(\n `Zone \"${zoneName}\" item at index ${index} missing props object`\n )\n } else if (requireContentIds) {\n const props = contentItem.props as Record<string, unknown>\n if (!props.id || typeof props.id !== 'string') {\n errors.push(\n `Zone \"${zoneName}\" item at index ${index} missing or invalid props.id`\n )\n }\n }\n })\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n }\n}\n\n/**\n * Validates and returns typed PuckPageData, throwing if invalid.\n *\n * @param data - The data to validate\n * @param options - Validation options\n * @returns The validated PuckPageData\n * @throws Error if validation fails\n */\nexport function assertPuckData(\n data: unknown,\n options?: ValidationOptions\n): PuckPageData {\n const result = validatePuckData(data, options)\n\n if (!result.valid) {\n throw new Error(\n `Invalid Puck data: ${result.errors.join('; ')}`\n )\n }\n\n return data as PuckPageData\n}\n\n/**\n * Safely parses JSON and validates as PuckPageData.\n *\n * @param json - JSON string to parse\n * @param options - Validation options\n * @returns Validation result with parsed data if valid\n */\nexport function parsePuckDataJson(\n json: string,\n options?: ValidationOptions\n): ValidationResult & { data?: PuckPageData } {\n let parsed: unknown\n\n try {\n parsed = JSON.parse(json)\n } catch (e) {\n return {\n valid: false,\n errors: [`Invalid JSON: ${e instanceof Error ? e.message : 'Parse error'}`],\n warnings: [],\n }\n }\n\n const result = validatePuckData(parsed, options)\n\n if (result.valid) {\n return {\n ...result,\n data: parsed as PuckPageData,\n }\n }\n\n return result\n}\n"],"names":["isPuckData","data","obj","root","props","Array","isArray","content","item","contentItem","type","zones","undefined","isPuckRootProps","validatePuckData","options","requireContentIds","validateRoot","requiredRootProps","allowedComponentTypes","strictComponentTypes","errors","warnings","push","valid","rootProps","prop","pageLayout","seenIds","Set","forEach","index","includes","message","id","has","add","zoneName","zoneContent","Object","entries","length","assertPuckData","result","Error","join","parsePuckDataJson","json","parsed","JSON","parse","e"],"mappings":"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"}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.6.
|
|
1
|
+
export declare const VERSION = "0.6.13";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/version.js
CHANGED
package/dist/version.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../src/version.ts"],"sourcesContent":["// Auto-generated by scripts/generate-version.js - do not edit manually\nexport const VERSION = '0.6.13'\n"],"names":["VERSION"],"mappings":"AAAA,uEAAuE;AACvE,OAAO,MAAMA,UAAU,SAAQ"}
|
|
@@ -146,7 +146,7 @@ export interface PuckConfigProviderProps {
|
|
|
146
146
|
/**
|
|
147
147
|
* Provider component that makes Puck configuration available to the editor
|
|
148
148
|
*/
|
|
149
|
-
export declare function PuckConfigProvider({ config, layouts, theme, plugins, editorStylesheets, editorCss, children, }: PuckConfigProviderProps): import("react
|
|
149
|
+
export declare function PuckConfigProvider({ config, layouts, theme, plugins, editorStylesheets, editorCss, children, }: PuckConfigProviderProps): import("react").JSX.Element;
|
|
150
150
|
/**
|
|
151
151
|
* Hook to access the Puck configuration
|
|
152
152
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PuckConfigContext.d.ts","sourceRoot":"","sources":["../../src/views/PuckConfigContext.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAC1E,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;IACzB;;OAEG;IACH,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B;;OAEG;IACH,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;IACtB;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,QAAA,MAAM,iBAAiB,iDAErB,CAAA;AAEF,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,MAAM,EAAE,UAAU,CAAA;IAClB;;OAEG;IACH,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B;;OAEG;IACH,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;IACtB;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,OAAO,EACP,KAAK,EACL,OAAO,EACP,iBAAiB,EACjB,SAAS,EACT,QAAQ,GACT,EAAE,uBAAuB
|
|
1
|
+
{"version":3,"file":"PuckConfigContext.d.ts","sourceRoot":"","sources":["../../src/views/PuckConfigContext.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAC1E,OAAO,KAAK,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;IACzB;;OAEG;IACH,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B;;OAEG;IACH,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;IACtB;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,QAAA,MAAM,iBAAiB,iDAErB,CAAA;AAEF,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,MAAM,EAAE,UAAU,CAAA;IAClB;;OAEG;IACH,OAAO,CAAC,EAAE,gBAAgB,EAAE,CAAA;IAC5B;;OAEG;IACH,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,EAAE,UAAU,EAAE,CAAA;IACtB;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;OAEG;IACH,QAAQ,EAAE,SAAS,CAAA;CACpB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EACjC,MAAM,EACN,OAAO,EACP,KAAK,EACL,OAAO,EACP,iBAAiB,EACjB,SAAS,EACT,QAAQ,GACT,EAAE,uBAAuB,+BAazB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,IAAI,sBAAsB,CAGtD;AAED,eAAe,iBAAiB,CAAA"}
|