From 785bd624af0fc444d6db1f92d165b597f065b1a2 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Mon, 23 Jun 2025 13:17:39 -0400 Subject: [PATCH 1/4] fix: live preview client types --- .../payload/src/collections/config/client.ts | 33 +++++++++++++++++-- packages/payload/src/config/client.ts | 30 +++++++++++++++-- packages/payload/src/config/types.ts | 12 ++++--- 3 files changed, 64 insertions(+), 11 deletions(-) diff --git a/packages/payload/src/collections/config/client.ts b/packages/payload/src/collections/config/client.ts index 80fb81fa553..2902d210136 100644 --- a/packages/payload/src/collections/config/client.ts +++ b/packages/payload/src/collections/config/client.ts @@ -122,7 +122,9 @@ export const createClientCollectionConfig = ({ if (!collection.admin) { break } + clientCollection.admin = {} as ClientCollectionConfig['admin'] + for (const adminKey in collection.admin) { if (serverOnlyCollectionAdminProperties.includes(adminKey as any)) { continue @@ -139,56 +141,70 @@ export const createClientCollectionConfig = ({ } } else if (typeof collection.admin.description === 'function') { const description = collection.admin.description({ t: i18n.t as TFunction }) + if (description) { clientCollection.admin.description = description } } break case 'livePreview': - clientCollection.admin.livePreview = - {} as ClientCollectionConfig['admin']['livePreview'] + clientCollection.admin.livePreview = {} as LivePreviewConfig + if (collection.admin.livePreview?.breakpoints) { - clientCollection.admin.livePreview!.breakpoints = + clientCollection.admin.livePreview.breakpoints = collection.admin.livePreview.breakpoints } break + case 'preview': if (collection.admin.preview) { clientCollection.admin.preview = true } + break + default: ;(clientCollection as any).admin[adminKey] = collection.admin[adminKey as keyof SanitizedCollectionConfig['admin']] } } + break + case 'auth': if (!collection.auth) { break } + clientCollection.auth = {} as { verify?: true } & SanitizedCollectionConfig['auth'] + if (collection.auth.cookies) { clientCollection.auth.cookies = collection.auth.cookies } + if (collection.auth.depth !== undefined) { // Check for undefined as it can be a number (0) clientCollection.auth.depth = collection.auth.depth } + if (collection.auth.disableLocalStrategy) { clientCollection.auth.disableLocalStrategy = collection.auth.disableLocalStrategy } + if (collection.auth.lockTime !== undefined) { // Check for undefined as it can be a number (0) clientCollection.auth.lockTime = collection.auth.lockTime } + if (collection.auth.loginWithUsername) { clientCollection.auth.loginWithUsername = collection.auth.loginWithUsername } + if (collection.auth.maxLoginAttempts !== undefined) { // Check for undefined as it can be a number (0) clientCollection.auth.maxLoginAttempts = collection.auth.maxLoginAttempts } + if (collection.auth.removeTokenFromResponses) { clientCollection.auth.removeTokenFromResponses = collection.auth.removeTokenFromResponses } @@ -196,13 +212,16 @@ export const createClientCollectionConfig = ({ if (collection.auth.useAPIKey) { clientCollection.auth.useAPIKey = collection.auth.useAPIKey } + if (collection.auth.tokenExpiration) { clientCollection.auth.tokenExpiration = collection.auth.tokenExpiration } + if (collection.auth.verify) { clientCollection.auth.verify = true } break + case 'fields': clientCollection.fields = createClientFields({ defaultIDType, @@ -210,7 +229,9 @@ export const createClientCollectionConfig = ({ i18n, importMap, }) + break + case 'labels': clientCollection.labels = { plural: @@ -222,16 +243,21 @@ export const createClientCollectionConfig = ({ ? collection.labels.singular({ i18n, t: i18n.t as TFunction }) : collection.labels.singular, } + break + case 'upload': if (!collection.upload) { break } + clientCollection.upload = {} as SanitizedUploadConfig + for (const uploadKey in collection.upload) { if (serverOnlyUploadProperties.includes(uploadKey as any)) { continue } + if (uploadKey === 'imageSizes') { clientCollection.upload.imageSizes = collection.upload.imageSizes?.map((size) => { const sanitizedSize = { ...size } @@ -245,6 +271,7 @@ export const createClientCollectionConfig = ({ collection.upload[uploadKey as keyof SanitizedUploadConfig] } } + break default: diff --git a/packages/payload/src/config/client.ts b/packages/payload/src/config/client.ts index 9d0d696befd..1519eaeb43c 100644 --- a/packages/payload/src/config/client.ts +++ b/packages/payload/src/config/client.ts @@ -5,7 +5,7 @@ import type { ImportMap } from '../bin/generateImportMap/index.js' import type { ClientBlock } from '../fields/config/types.js' import type { BlockSlug } from '../index.js' import type { - LivePreviewConfig, + RootLivePreviewConfig, SanitizedConfig, ServerOnlyLivePreviewProperties, } from './types.js' @@ -44,7 +44,7 @@ export type ServerOnlyRootAdminProperties = keyof Pick + livePreview?: Omit } & Omit blocks: ClientBlock[] collections: ClientCollectionConfig[] @@ -54,7 +54,7 @@ export type UnsanitizedClientConfig = { export type ClientConfig = { admin: { - livePreview?: Omit + livePreview?: Omit } & Omit blocks: ClientBlock[] blocksMap: Record @@ -103,6 +103,7 @@ export const createClientConfig = ({ if (serverOnlyConfigProperties.includes(key as any)) { continue } + switch (key) { case 'admin': clientConfig.admin = { @@ -117,6 +118,7 @@ export const createClientConfig = ({ timezones: config.admin.timezones, user: config.admin.user, } + if (config.admin.livePreview) { clientConfig.admin.livePreview = {} @@ -124,7 +126,9 @@ export const createClientConfig = ({ clientConfig.admin.livePreview.breakpoints = config.admin.livePreview.breakpoints } } + break + case 'blocks': { ;(clientConfig.blocks as ClientBlock[]) = createClientBlocks({ blocks: config.blocks!, @@ -135,6 +139,7 @@ export const createClientConfig = ({ break } + case 'collections': ;(clientConfig.collections as ClientCollectionConfig[]) = createClientCollectionConfigs({ collections: config.collections, @@ -142,7 +147,9 @@ export const createClientConfig = ({ i18n, importMap, }) + break + case 'folders': if (config.folders) { clientConfig.folders = { @@ -152,6 +159,7 @@ export const createClientConfig = ({ fieldName: config.folders.fieldName, } } + break case 'globals': @@ -161,49 +169,65 @@ export const createClientConfig = ({ i18n, importMap, }) + break + case 'localization': if (typeof config.localization === 'object' && config.localization) { clientConfig.localization = {} + if (config.localization.defaultLocale) { clientConfig.localization.defaultLocale = config.localization.defaultLocale } + if (config.localization.defaultLocalePublishOption) { clientConfig.localization.defaultLocalePublishOption = config.localization.defaultLocalePublishOption } + if (config.localization.fallback) { clientConfig.localization.fallback = config.localization.fallback } + if (config.localization.localeCodes) { clientConfig.localization.localeCodes = config.localization.localeCodes } + if (config.localization.locales) { clientConfig.localization.locales = [] + for (const locale of config.localization.locales) { if (locale) { const clientLocale: Partial<(typeof config.localization.locales)[0]> = {} + if (locale.code) { clientLocale.code = locale.code } + if (locale.fallbackLocale) { clientLocale.fallbackLocale = locale.fallbackLocale } + if (locale.label) { clientLocale.label = locale.label } + if (locale.rtl) { clientLocale.rtl = locale.rtl } + clientConfig.localization.locales.push(clientLocale) } } } } + break + default: ;(clientConfig as any)[key] = config[key as keyof SanitizedConfig] } } + return clientConfig as ClientConfig } diff --git a/packages/payload/src/config/types.ts b/packages/payload/src/config/types.ts index 346cce47dad..7aa042bd874 100644 --- a/packages/payload/src/config/types.ts +++ b/packages/payload/src/config/types.ts @@ -172,6 +172,11 @@ export type LivePreviewConfig = { | string } +export type RootLivePreviewConfig = { + collections?: string[] + globals?: string[] +} & LivePreviewConfig + export type OGImageConfig = { alt?: string height?: number | string @@ -202,7 +207,7 @@ export type MetaConfig = { titleSuffix?: string } & DeepClone -export type ServerOnlyLivePreviewProperties = keyof Pick +export type ServerOnlyLivePreviewProperties = keyof Pick type GeneratePreviewURLOptions = { locale: string @@ -861,10 +866,7 @@ export type Config = { */ importMapFile?: string } - livePreview?: { - collections?: string[] - globals?: string[] - } & LivePreviewConfig + livePreview?: RootLivePreviewConfig /** Base meta data to use for the Admin Panel. Included properties are titleSuffix, ogImage, and favicon. */ meta?: MetaConfig routes?: { From 66b7da4e3abbe660977b556affa2e89cb2220869 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Mon, 23 Jun 2025 13:46:53 -0400 Subject: [PATCH 2/4] adds collections and globals to client --- packages/payload/src/config/client.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/payload/src/config/client.ts b/packages/payload/src/config/client.ts index 1519eaeb43c..2213dc54cfd 100644 --- a/packages/payload/src/config/client.ts +++ b/packages/payload/src/config/client.ts @@ -88,6 +88,9 @@ export const serverOnlyConfigProperties: readonly Partial[] = + ['url'] + export const createClientConfig = ({ config, i18n, @@ -125,6 +128,14 @@ export const createClientConfig = ({ if (config.admin.livePreview.breakpoints) { clientConfig.admin.livePreview.breakpoints = config.admin.livePreview.breakpoints } + + if (config.admin.livePreview.collections) { + clientConfig.admin.livePreview.collections = config.admin.livePreview.collections + } + + if (config.admin.livePreview.globals) { + clientConfig.admin.livePreview.globals = config.admin.livePreview.globals + } } break From 26e9dd9df088091e85a1fee300e2480a0a9d7bce Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Mon, 23 Jun 2025 16:26:31 -0400 Subject: [PATCH 3/4] rm unecessary type cast --- packages/payload/src/collections/config/client.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/payload/src/collections/config/client.ts b/packages/payload/src/collections/config/client.ts index 2902d210136..ffd29798a4f 100644 --- a/packages/payload/src/collections/config/client.ts +++ b/packages/payload/src/collections/config/client.ts @@ -147,13 +147,15 @@ export const createClientCollectionConfig = ({ } } break + case 'livePreview': - clientCollection.admin.livePreview = {} as LivePreviewConfig + clientCollection.admin.livePreview = {} if (collection.admin.livePreview?.breakpoints) { clientCollection.admin.livePreview.breakpoints = collection.admin.livePreview.breakpoints } + break case 'preview': @@ -220,6 +222,7 @@ export const createClientCollectionConfig = ({ if (collection.auth.verify) { clientCollection.auth.verify = true } + break case 'fields': From 3312581b57da8779c8c6385281b36c2395008202 Mon Sep 17 00:00:00 2001 From: Jacob Fletcher Date: Mon, 23 Jun 2025 16:39:37 -0400 Subject: [PATCH 4/4] rm unused type --- packages/payload/src/config/client.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/payload/src/config/client.ts b/packages/payload/src/config/client.ts index 2213dc54cfd..f6fa1266d96 100644 --- a/packages/payload/src/config/client.ts +++ b/packages/payload/src/config/client.ts @@ -88,9 +88,6 @@ export const serverOnlyConfigProperties: readonly Partial[] = - ['url'] - export const createClientConfig = ({ config, i18n,