fix: ensure leavesFirst option works correctly in traverseFields utility (#11219)

We have to ensure the arguments are handled wherever we push to the callback stack, not when we execute the callback stack.
This commit is contained in:
Alessio Gravili
2025-02-16 19:14:46 -07:00
committed by GitHub
parent 513ba636af
commit 6b9d81a746
4 changed files with 138 additions and 30 deletions

View File

@@ -15,8 +15,8 @@ const traverseArrayOrBlocksField = ({
parentRef, parentRef,
}: { }: {
callback: TraverseFieldsCallback callback: TraverseFieldsCallback
callbackStack: TraverseFieldsCallback[] callbackStack: (() => ReturnType<TraverseFieldsCallback>)[]
config: Config | SanitizedConfig config?: Config | SanitizedConfig
data: Record<string, unknown>[] data: Record<string, unknown>[]
field: ArrayField | BlocksField field: ArrayField | BlocksField
fillEmpty: boolean fillEmpty: boolean
@@ -39,16 +39,18 @@ const traverseArrayOrBlocksField = ({
for (const _block of field.blockReferences ?? field.blocks) { for (const _block of field.blockReferences ?? field.blocks) {
// TODO: iterate over blocks mapped to block slug in v4, or pass through payload.blocks // TODO: iterate over blocks mapped to block slug in v4, or pass through payload.blocks
const block = const block =
typeof _block === 'string' ? config.blocks.find((b) => b.slug === _block) : _block typeof _block === 'string' ? config?.blocks?.find((b) => b.slug === _block) : _block
traverseFields({ if (block) {
callback, traverseFields({
callbackStack, callback,
config, callbackStack,
fields: block.fields, config,
isTopLevel: false, fields: block.fields,
leavesFirst, isTopLevel: false,
parentRef, leavesFirst,
}) parentRef,
})
}
} }
} }
return return
@@ -58,7 +60,7 @@ const traverseArrayOrBlocksField = ({
if (field.type === 'blocks' && typeof ref?.blockType === 'string') { if (field.type === 'blocks' && typeof ref?.blockType === 'string') {
// TODO: iterate over blocks mapped to block slug in v4, or pass through payload.blocks // TODO: iterate over blocks mapped to block slug in v4, or pass through payload.blocks
const block = field.blockReferences const block = field.blockReferences
? ((config.blocks.find((b) => b.slug === ref.blockType) ?? ? ((config?.blocks?.find((b) => b.slug === ref.blockType) ??
field.blockReferences.find( field.blockReferences.find(
(b) => typeof b !== 'string' && b.slug === ref.blockType, (b) => typeof b !== 'string' && b.slug === ref.blockType,
)) as Block) )) as Block)
@@ -106,8 +108,8 @@ export type TraverseFieldsCallback = (args: {
type TraverseFieldsArgs = { type TraverseFieldsArgs = {
callback: TraverseFieldsCallback callback: TraverseFieldsCallback
callbackStack?: TraverseFieldsCallback[] callbackStack?: (() => ReturnType<TraverseFieldsCallback>)[]
config: Config | SanitizedConfig config?: Config | SanitizedConfig
fields: (Field | TabAsField)[] fields: (Field | TabAsField)[]
fillEmpty?: boolean fillEmpty?: boolean
isTopLevel?: boolean isTopLevel?: boolean
@@ -143,7 +145,7 @@ export const traverseFields = ({
ref = {}, ref = {},
}: TraverseFieldsArgs): void => { }: TraverseFieldsArgs): void => {
fields.some((field) => { fields.some((field) => {
let callbackStack: TraverseFieldsCallback[] = [] let callbackStack: (() => ReturnType<TraverseFieldsCallback>)[] = []
if (!isTopLevel) { if (!isTopLevel) {
callbackStack = _callbackStack callbackStack = _callbackStack
} }
@@ -159,7 +161,7 @@ export const traverseFields = ({
if (!leavesFirst && callback && callback({ field, next, parentRef, ref })) { if (!leavesFirst && callback && callback({ field, next, parentRef, ref })) {
return true return true
} else if (leavesFirst) { } else if (leavesFirst) {
callbackStack.push(callback) callbackStack.push(() => callback({ field, next, parentRef, ref }))
} }
if (skip) { if (skip) {
@@ -203,7 +205,14 @@ export const traverseFields = ({
) { ) {
return true return true
} else if (leavesFirst) { } else if (leavesFirst) {
callbackStack.push(callback) callbackStack.push(() =>
callback({
field: { ...tab, type: 'tab' },
next,
parentRef: currentParentRef,
ref: tabRef,
}),
)
} }
tabRef = tabRef[tab.name] tabRef = tabRef[tab.name]
@@ -238,7 +247,14 @@ export const traverseFields = ({
) { ) {
return true return true
} else if (leavesFirst) { } else if (leavesFirst) {
callbackStack.push(callback) callbackStack.push(() =>
callback({
field: { ...tab, type: 'tab' },
next,
parentRef: currentParentRef,
ref: tabRef,
}),
)
} }
} }
@@ -373,7 +389,7 @@ export const traverseFields = ({
if (isTopLevel) { if (isTopLevel) {
callbackStack.reverse().forEach((cb) => { callbackStack.reverse().forEach((cb) => {
cb({ field, next, parentRef, ref }) cb()
}) })
} }
}) })

104
pnpm-lock.yaml generated
View File

@@ -45,7 +45,7 @@ importers:
version: 1.50.0 version: 1.50.0
'@sentry/nextjs': '@sentry/nextjs':
specifier: ^8.33.1 specifier: ^8.33.1
version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15)))
'@sentry/node': '@sentry/node':
specifier: ^8.33.1 specifier: ^8.33.1
version: 8.37.1 version: 8.37.1
@@ -135,7 +135,7 @@ importers:
version: 10.1.3(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3) version: 10.1.3(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3)
next: next:
specifier: 15.1.5 specifier: 15.1.5
version: 15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) version: 15.1.5(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)
open: open:
specifier: ^10.1.0 specifier: ^10.1.0
version: 10.1.0 version: 10.1.0
@@ -1076,7 +1076,7 @@ importers:
dependencies: dependencies:
'@sentry/nextjs': '@sentry/nextjs':
specifier: ^8.33.1 specifier: ^8.33.1
version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15)))
'@sentry/types': '@sentry/types':
specifier: ^8.33.1 specifier: ^8.33.1
version: 8.37.1 version: 8.37.1
@@ -1598,6 +1598,10 @@ importers:
version: link:../payload version: link:../payload
test: test:
dependencies:
dequal:
specifier: 2.0.3
version: 2.0.3
devDependencies: devDependencies:
'@aws-sdk/client-s3': '@aws-sdk/client-s3':
specifier: ^3.614.0 specifier: ^3.614.0
@@ -1706,7 +1710,7 @@ importers:
version: link:../packages/ui version: link:../packages/ui
'@sentry/nextjs': '@sentry/nextjs':
specifier: ^8.33.1 specifier: ^8.33.1
version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) version: 8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.1.5(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12))
'@sentry/react': '@sentry/react':
specifier: ^7.77.0 specifier: ^7.77.0
version: 7.119.2(react@19.0.0) version: 7.119.2(react@19.0.0)
@@ -1757,7 +1761,7 @@ importers:
version: 8.9.5(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3) version: 8.9.5(@aws-sdk/credential-providers@3.687.0(@aws-sdk/client-sso-oidc@3.687.0(@aws-sdk/client-sts@3.687.0)))(socks@2.8.3)
next: next:
specifier: 15.1.5 specifier: 15.1.5
version: 15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) version: 15.1.5(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)
nodemailer: nodemailer:
specifier: 6.9.16 specifier: 6.9.16
version: 6.9.16 version: 6.9.16
@@ -7838,6 +7842,7 @@ packages:
libsql@0.4.7: libsql@0.4.7:
resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==} resolution: {integrity: sha512-T9eIRCs6b0J1SHKYIvD8+KCJMcWZ900iZyxdnSCdqxN12Z1ijzT+jY5nrk72Jw4B0HGzms2NgpryArlJqvc3Lw==}
cpu: [x64, arm64, wasm32]
os: [darwin, linux, win32] os: [darwin, linux, win32]
lie@3.1.1: lie@3.1.1:
@@ -13677,7 +13682,36 @@ snapshots:
'@sentry/utils': 7.119.2 '@sentry/utils': 7.119.2
localforage: 1.10.0 localforage: 1.10.0
'@sentry/nextjs@8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15)))': '@sentry/nextjs@8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.1.5(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12))':
dependencies:
'@opentelemetry/api': 1.9.0
'@opentelemetry/instrumentation-http': 0.53.0(@opentelemetry/api@1.9.0)
'@opentelemetry/semantic-conventions': 1.27.0
'@rollup/plugin-commonjs': 26.0.1(rollup@3.29.5)
'@sentry-internal/browser-utils': 8.37.1
'@sentry/core': 8.37.1
'@sentry/node': 8.37.1
'@sentry/opentelemetry': 8.37.1(@opentelemetry/api@1.9.0)(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.27.0)
'@sentry/react': 8.37.1(react@19.0.0)
'@sentry/types': 8.37.1
'@sentry/utils': 8.37.1
'@sentry/vercel-edge': 8.37.1
'@sentry/webpack-plugin': 2.22.6(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12))
chalk: 3.0.0
next: 15.1.5(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)
resolve: 1.22.8
rollup: 3.29.5
stacktrace-parser: 0.1.10
transitivePeerDependencies:
- '@opentelemetry/core'
- '@opentelemetry/instrumentation'
- '@opentelemetry/sdk-trace-base'
- encoding
- react
- supports-color
- webpack
'@sentry/nextjs@8.37.1(@opentelemetry/core@1.27.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.27.0(@opentelemetry/api@1.9.0))(next@15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4))(react@19.0.0)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15)))':
dependencies: dependencies:
'@opentelemetry/api': 1.9.0 '@opentelemetry/api': 1.9.0
'@opentelemetry/instrumentation-http': 0.53.0(@opentelemetry/api@1.9.0) '@opentelemetry/instrumentation-http': 0.53.0(@opentelemetry/api@1.9.0)
@@ -13693,7 +13727,7 @@ snapshots:
'@sentry/vercel-edge': 8.37.1 '@sentry/vercel-edge': 8.37.1
'@sentry/webpack-plugin': 2.22.6(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))) '@sentry/webpack-plugin': 2.22.6(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15)))
chalk: 3.0.0 chalk: 3.0.0
next: 15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) next: 15.1.5(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)
resolve: 1.22.8 resolve: 1.22.8
rollup: 3.29.5 rollup: 3.29.5
stacktrace-parser: 0.1.10 stacktrace-parser: 0.1.10
@@ -13801,6 +13835,16 @@ snapshots:
'@sentry/types': 8.37.1 '@sentry/types': 8.37.1
'@sentry/utils': 8.37.1 '@sentry/utils': 8.37.1
'@sentry/webpack-plugin@2.22.6(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12))':
dependencies:
'@sentry/bundler-plugin-core': 2.22.6
unplugin: 1.0.1
uuid: 9.0.0
webpack: 5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12)
transitivePeerDependencies:
- encoding
- supports-color
'@sentry/webpack-plugin@2.22.6(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15)))': '@sentry/webpack-plugin@2.22.6(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15)))':
dependencies: dependencies:
'@sentry/bundler-plugin-core': 2.22.6 '@sentry/bundler-plugin-core': 2.22.6
@@ -18213,7 +18257,7 @@ snapshots:
- '@babel/core' - '@babel/core'
- babel-plugin-macros - babel-plugin-macros
next@15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4): next@15.1.5(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4):
dependencies: dependencies:
'@next/env': 15.1.5 '@next/env': 15.1.5
'@swc/counter': 0.1.3 '@swc/counter': 0.1.3
@@ -19619,6 +19663,18 @@ snapshots:
ansi-escapes: 4.3.2 ansi-escapes: 4.3.2
supports-hyperlinks: 2.3.0 supports-hyperlinks: 2.3.0
terser-webpack-plugin@5.3.10(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12)):
dependencies:
'@jridgewell/trace-mapping': 0.3.25
jest-worker: 27.5.1
schema-utils: 3.3.0
serialize-javascript: 6.0.2
terser: 5.36.0
webpack: 5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12)
optionalDependencies:
'@swc/core': 1.10.12(@swc/helpers@0.5.15)
esbuild: 0.19.12
terser-webpack-plugin@5.3.10(@swc/core@1.10.12(@swc/helpers@0.5.15))(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))): terser-webpack-plugin@5.3.10(@swc/core@1.10.12(@swc/helpers@0.5.15))(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))):
dependencies: dependencies:
'@jridgewell/trace-mapping': 0.3.25 '@jridgewell/trace-mapping': 0.3.25
@@ -19916,7 +19972,7 @@ snapshots:
'@uploadthing/shared': 7.1.1 '@uploadthing/shared': 7.1.1
effect: 3.10.3 effect: 3.10.3
optionalDependencies: optionalDependencies:
next: 15.1.5(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4) next: 15.1.5(@babel/core@7.26.7)(@opentelemetry/api@1.9.0)(@playwright/test@1.50.0)(babel-plugin-macros@3.1.0)(babel-plugin-react-compiler@19.0.0-beta-714736e-20250131)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.77.4)
uri-js@4.4.1: uri-js@4.4.1:
dependencies: dependencies:
@@ -20044,6 +20100,36 @@ snapshots:
- esbuild - esbuild
- uglify-js - uglify-js
webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12):
dependencies:
'@types/eslint-scope': 3.7.7
'@types/estree': 1.0.6
'@webassemblyjs/ast': 1.14.1
'@webassemblyjs/wasm-edit': 1.14.1
'@webassemblyjs/wasm-parser': 1.14.1
acorn: 8.14.0
browserslist: 4.24.2
chrome-trace-event: 1.0.4
enhanced-resolve: 5.17.1
es-module-lexer: 1.5.4
eslint-scope: 5.1.1
events: 3.3.0
glob-to-regexp: 0.4.1
graceful-fs: 4.2.11
json-parse-even-better-errors: 2.3.1
loader-runner: 4.3.0
mime-types: 2.1.35
neo-async: 2.6.2
schema-utils: 3.3.0
tapable: 2.2.1
terser-webpack-plugin: 5.3.10(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12)(webpack@5.96.1(@swc/core@1.10.12(@swc/helpers@0.5.15))(esbuild@0.19.12))
watchpack: 2.4.2
webpack-sources: 3.2.3
transitivePeerDependencies:
- '@swc/core'
- esbuild
- uglify-js
whatwg-url@13.0.0: whatwg-url@13.0.0:
dependencies: dependencies:
tr46: 4.1.1 tr46: 4.1.1

View File

@@ -1,3 +1,4 @@
import { dequal } from 'dequal/lite'
import { type Block, type BlockSlug, type Config, traverseFields } from 'payload' import { type Block, type BlockSlug, type Config, traverseFields } from 'payload'
export const autoDedupeBlocksPlugin = export const autoDedupeBlocksPlugin =
@@ -68,7 +69,9 @@ export const deduplicateBlock = ({
// Check if the fields are the same // Check if the fields are the same
const jsonExistingBlock = JSON.stringify(existingBlock, null, 2) const jsonExistingBlock = JSON.stringify(existingBlock, null, 2)
const jsonBlockToDeduplicate = JSON.stringify(dedupedBlock, null, 2) const jsonBlockToDeduplicate = JSON.stringify(dedupedBlock, null, 2)
if (jsonExistingBlock !== jsonBlockToDeduplicate) { // dequal check of blocks with functions removed (through JSON.stringify+JSON.parse). We cannot check the strings,
// as the order of keys in the object is not guaranteed, yet it doesn't matter for the block fields.
if (!dequal(JSON.parse(jsonExistingBlock), JSON.parse(jsonBlockToDeduplicate))) {
console.error('Block with the same slug but different fields found', { console.error('Block with the same slug but different fields found', {
slug: dedupedBlock.slug, slug: dedupedBlock.slug,
existingBlock: jsonExistingBlock, existingBlock: jsonExistingBlock,

View File

@@ -86,5 +86,8 @@
"ts-essentials": "10.0.3", "ts-essentials": "10.0.3",
"typescript": "5.7.3", "typescript": "5.7.3",
"uuid": "10.0.0" "uuid": "10.0.0"
},
"dependencies": {
"dequal": "2.0.3"
} }
} }