@tetherto/dev-websites-core 0.3.6 → 0.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +1 -1
  2. package/dist/cache/handler.d.mts.map +1 -1
  3. package/dist/cms/index.d.mts +2 -2
  4. package/dist/cms/index.mjs +2 -2
  5. package/dist/cms.mjs +44 -9
  6. package/dist/cms.mjs.map +1 -1
  7. package/dist/i18n/index.mjs +1 -2
  8. package/dist/index.d.mts +15 -4
  9. package/dist/index.d.mts.map +1 -1
  10. package/dist/index.mjs +2 -2
  11. package/dist/index5.d.mts +2 -2
  12. package/dist/ui/carousel/index.mjs +1 -2
  13. package/dist/ui/components/Accordion/index.mjs +1 -2
  14. package/dist/ui/components/Avatar/index.mjs +1 -2
  15. package/dist/ui/components/Badge/index.mjs +1 -2
  16. package/dist/ui/components/BadgeVersion/index.mjs +1 -2
  17. package/dist/ui/components/Button/index.mjs +1 -2
  18. package/dist/ui/components/Card/index.mjs +1 -2
  19. package/dist/ui/components/Carousel/index.mjs +1 -2
  20. package/dist/ui/components/Checkbox/index.mjs +1 -2
  21. package/dist/ui/components/CodeBlock/index.mjs +1 -2
  22. package/dist/ui/components/CodeBlockTabs/index.mjs +1 -2
  23. package/dist/ui/components/CollapsibleSection/index.mjs +1 -2
  24. package/dist/ui/components/CopyButton/index.mjs +1 -2
  25. package/dist/ui/components/CustomHtml/CustomHtml.d.mts +8 -0
  26. package/dist/ui/components/CustomHtml/CustomHtml.d.mts.map +1 -0
  27. package/dist/ui/components/CustomHtml/CustomHtml.mjs +31 -0
  28. package/dist/ui/components/CustomHtml/CustomHtml.mjs.map +1 -0
  29. package/dist/ui/components/CustomHtml/converters.d.mts +14 -0
  30. package/dist/ui/components/CustomHtml/converters.d.mts.map +1 -0
  31. package/dist/ui/components/CustomHtml/converters.mjs +9 -0
  32. package/dist/ui/components/CustomHtml/converters.mjs.map +1 -0
  33. package/dist/ui/components/CustomHtml/index.d.mts +3 -0
  34. package/dist/ui/components/CustomHtml/index.mjs +3 -0
  35. package/dist/ui/components/Dialog/index.mjs +1 -2
  36. package/dist/ui/components/EmptyState/index.mjs +1 -2
  37. package/dist/ui/components/FieldError/index.mjs +1 -2
  38. package/dist/ui/components/FormattedDate/index.mjs +1 -2
  39. package/dist/ui/components/GoogleOAuthButton/index.mjs +1 -2
  40. package/dist/ui/components/IconButton/index.mjs +1 -2
  41. package/dist/ui/components/Input/index.mjs +1 -2
  42. package/dist/ui/components/Label/index.mjs +1 -2
  43. package/dist/ui/components/LazyVideo/index.mjs +1 -2
  44. package/dist/ui/components/Pagination/index.mjs +1 -2
  45. package/dist/ui/components/PaginationItem/index.mjs +1 -2
  46. package/dist/ui/components/PasswordInput/index.mjs +1 -2
  47. package/dist/ui/components/ProgressStepper/index.mjs +1 -2
  48. package/dist/ui/components/Prose/index.mjs +1 -2
  49. package/dist/ui/components/Radio/index.mjs +1 -2
  50. package/dist/ui/components/Reveal/index.mjs +1 -2
  51. package/dist/ui/components/SearchInput/index.mjs +1 -2
  52. package/dist/ui/components/Select/index.mjs +1 -2
  53. package/dist/ui/components/Sheet/index.mjs +1 -2
  54. package/dist/ui/components/StaggerReveal/index.mjs +1 -2
  55. package/dist/ui/components/Stepper/index.mjs +1 -2
  56. package/dist/ui/components/Switch/index.mjs +1 -2
  57. package/dist/ui/components/TextButton/index.mjs +1 -2
  58. package/dist/ui/components/Textarea/index.mjs +1 -2
  59. package/dist/ui/components/Toast/index.mjs +1 -2
  60. package/dist/ui/components/Tooltip/index.mjs +1 -2
  61. package/dist/ui/components/VisuallyHidden/index.mjs +1 -2
  62. package/dist/ui/hooks/index.mjs +1 -2
  63. package/dist/ui/index.d.mts +4 -1
  64. package/dist/ui/index.mjs +1 -0
  65. package/dist/ui/utils/index.mjs +1 -2
  66. package/package.json +18 -10
package/dist/cms.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cms.mjs","names":[],"sources":["../src/cms/shared/access.ts","../src/cms/shared/roles.ts","../src/cms/collections/createApiTokens.ts","../src/cms/hooks/slugify.ts","../src/cms/collections/createCmsRoles.ts","../src/cms/shared/seo-fields.ts","../src/cms/collections/createAuthors.ts","../src/cms/blocks/language-options.ts","../src/cms/blocks/code.ts","../src/cms/blocks/code-tabs.ts","../src/cms/blocks/download-cta.ts","../src/cms/blocks/image.ts","../src/cms/blocks/video.ts","../src/cms/lexical/editor.ts","../src/cms/blocks/rich-text.ts","../src/cms/blocks/steps.ts","../src/cms/blocks/leaf-blocks.ts","../src/cms/blocks/accordion.ts","../src/cms/blocks/section-heading.ts","../src/cms/blocks/index.ts","../src/cms/hooks/coerce-blog-post-categories.ts","../src/cms/hooks/set-published-at.ts","../src/cms/shared/drafts-with-autosave.ts","../src/cms/collections/createBlogPosts.ts","../src/cms/collections/createCategories.ts","../src/cms/collections/createChangelog.ts","../src/cms/collections/createChangelogTags.ts","../src/cms/collections/createEventTags.ts","../src/cms/collections/createEvents.ts","../src/cms/collections/createMedia.ts","../src/cms/collections/createPages.ts","../src/cms/collections/createUsers.ts","../src/cms/globals/createSiteSettings.ts","../src/cms/applyOverride.ts","../src/cms/overrides.ts","../src/cms/buildCmsConfig.ts","../src/cms/requireEnv.ts","../src/cms/createS3MediaPlugin.ts","../src/cms/globals/createAnnouncementBanner.ts"],"sourcesContent":["import type { Access, FieldAccess, PayloadRequest } from 'payload'\nimport type { RolesOptions } from './roles.js'\n\nexport type AccessOptions = {\n /**\n * When true, disabled `api-tokens` users are denied public reads.\n * Defaults to on when the stock `api-tokens` collection is enabled.\n */\n apiTokens?: boolean\n /**\n * Turn on Admin / Moderator / Developer. `true` uses the defaults.\n * `collections` / `globals` are the permissions seeded into Roles on first boot.\n * After that, edit them in the admin. Omit to keep every CMS user as a full admin.\n */\n roles?: true | RolesOptions\n}\n\nexport type AccessHelpers = {\n adminOnly: ({ req }: { req: PayloadRequest }) => boolean\n adminOrPublished: Access\n publicRead: Access\n adminOnlyField: FieldAccess\n}\n\nconst isAdminUser = (req: PayloadRequest): boolean => req.user?.collection === 'users'\n\nconst isDisabledApiToken = (req: PayloadRequest): boolean =>\n req.user?.collection === 'api-tokens' && req.user?.enabled === false\n\n/**\n * Build access helpers. Pass `{ apiTokens: true }` when the `api-tokens`\n * collection is registered (stock by default via `buildCmsConfig`).\n */\nexport function createAccessHelpers(options: AccessOptions = {}): AccessHelpers {\n const apiTokens = options.apiTokens === true\n\n const adminOnly = ({ req }: { req: PayloadRequest }): boolean => isAdminUser(req)\n\n const adminOrPublished: Access = ({ req }) => {\n if (isAdminUser(req)) return true\n if (apiTokens && isDisabledApiToken(req)) return false\n return { _status: { equals: 'published' } }\n }\n\n const publicRead: Access = ({ req }) => {\n if (apiTokens && isDisabledApiToken(req)) return false\n return true\n }\n\n const adminOnlyField: FieldAccess = ({ req }) => isAdminUser(req)\n\n return { adminOnly, adminOrPublished, publicRead, adminOnlyField }\n}\n","import type {\n Access,\n CollectionConfig,\n Field,\n FieldAccess,\n GlobalConfig,\n Payload,\n Where,\n} from 'payload'\nimport type { StockCollectionSlug } from '../overrides.js'\n\nexport const ADMIN_ROLE = 'admin'\nexport const CMS_ROLES_SLUG = 'cms-roles'\n\nexport type RoleOption = {\n label: string\n value: string\n}\n\nexport type RoleRule = {\n /** Roles that may create, update, and see this in the admin. Admin is always included. */\n roles: readonly string[]\n /** Other callers only receive published documents. */\n drafts?: boolean\n}\n\nexport type RolesOptions = {\n /**\n * Replaces Moderator and Developer. Admin is always kept.\n * Omit to keep the defaults.\n */\n roles?: readonly RoleOption[]\n /** Appended after `roles` or the defaults. A repeated value replaces the label. */\n extraRoles?: readonly RoleOption[]\n /**\n * Replaces the default rule for that collection. Unknown slugs are for site collections;\n * read them back with `collectionRoleRule`.\n * `false` hides it from everyone except Admin and blocks create, update, and delete.\n */\n collections?: Partial<Record<string, RoleRule | false>>\n /**\n * Replaces the default rule for a stock global, or sets one for a site global.\n * `false` hides it from everyone except Admin and blocks updates.\n */\n globals?: Partial<Record<string, RoleRule | false>>\n}\n\nconst moderator = ['moderator'] as const\nconst developer = ['developer'] as const\nconst moderatorAndDeveloper = ['moderator', 'developer'] as const\n\nexport const DEFAULT_ROLES = [\n { label: 'Admin', value: ADMIN_ROLE },\n { label: 'Moderator', value: 'moderator' },\n { label: 'Developer', value: 'developer' },\n] as const satisfies readonly RoleOption[]\n\ntype RoleGatedCollection = Exclude<StockCollectionSlug, 'users'>\n\nexport const DEFAULT_COLLECTION_ROLES = {\n 'api-tokens': false,\n 'media': { roles: moderatorAndDeveloper },\n 'authors': { roles: moderator },\n 'categories': { roles: moderator },\n 'blog-posts': { roles: moderator, drafts: true },\n 'pages': { roles: moderator, drafts: true },\n 'legal-pages': { roles: moderator, drafts: true },\n 'changelog-tags': { roles: developer },\n 'changelog': { roles: developer, drafts: true },\n 'event-tags': { roles: moderator },\n 'events': { roles: moderator, drafts: true },\n} as const satisfies Partial<Record<RoleGatedCollection, RoleRule | false>>\n\nexport const DEFAULT_GLOBAL_ROLES = {\n 'site-settings': false,\n 'announcement-banner': { roles: moderator },\n} as const satisfies Record<string, RoleRule | false>\n\nexport type RolePermission = {\n target: string\n create: boolean\n update: boolean\n delete: boolean\n drafts: boolean\n}\n\nexport type RoleSeed = {\n name: string\n slug: string\n fullAccess: boolean\n permissions: RolePermission[]\n}\n\ntype RoleRecord = RoleSeed & { id: string }\n\ntype CmsUserLike = {\n collection?: string\n id?: string | number\n roles?: unknown\n}\n\ntype PermissionAction = 'create' | 'update' | 'delete' | 'drafts'\n\nlet roleCache: { byId: Map<string, RoleRecord>; bySlug: Map<string, RoleRecord> } | null = null\n\nfunction asCmsUser(user: unknown): CmsUserLike | null {\n if (!user || typeof user !== 'object') return null\n const record = user as CmsUserLike\n if (record.collection !== 'users') return null\n return record\n}\n\nfunction roleRefs(roles: unknown): { ids: string[]; slugs: string[] } {\n if (!Array.isArray(roles)) return { ids: [], slugs: [] }\n const ids: string[] = []\n const slugs: string[] = []\n roles.forEach((role) => {\n if (typeof role === 'string' || typeof role === 'number') {\n const value = String(role)\n if (/^[a-f0-9]{24}$/i.test(value)) ids.push(value)\n else if (value) slugs.push(value)\n return\n }\n if (role && typeof role === 'object' && 'id' in role && role.id != null) {\n ids.push(String(role.id))\n }\n })\n return { ids, slugs }\n}\n\nfunction readPermissions(value: unknown): RolePermission[] {\n if (!Array.isArray(value)) return []\n return value.flatMap((entry) => {\n if (!entry || typeof entry !== 'object' || !('target' in entry)) return []\n const row = entry as Partial<RolePermission>\n if (!row.target) return []\n return [\n {\n target: row.target,\n create: Boolean(row.create),\n update: Boolean(row.update),\n delete: Boolean(row.delete),\n drafts: Boolean(row.drafts),\n },\n ]\n })\n}\n\nexport async function refreshRoleCache(payload: Payload): Promise<void> {\n const found = await payload.find({\n collection: CMS_ROLES_SLUG,\n depth: 0,\n limit: 500,\n pagination: false,\n overrideAccess: true,\n })\n const byId = new Map<string, RoleRecord>()\n const bySlug = new Map<string, RoleRecord>()\n found.docs.forEach((doc) => {\n const record = doc as {\n id: string | number\n name?: string\n slug?: string\n fullAccess?: boolean\n permissions?: unknown\n }\n if (!record.slug) return\n const role: RoleRecord = {\n id: String(record.id),\n name: record.name ?? record.slug,\n slug: record.slug,\n fullAccess: Boolean(record.fullAccess) || record.slug === ADMIN_ROLE,\n permissions: readPermissions(record.permissions),\n }\n byId.set(role.id, role)\n bySlug.set(role.slug, role)\n })\n roleCache = { byId, bySlug }\n}\n\nasync function ensureRoleCache(payload: Payload): Promise<NonNullable<typeof roleCache>> {\n if (!roleCache) await refreshRoleCache(payload)\n return roleCache ?? { byId: new Map(), bySlug: new Map() }\n}\n\ntype SyncAssignment = 'guest' | 'admin' | 'unknown' | RoleRecord[]\n\nfunction lookupRoles(\n refs: { ids: string[]; slugs: string[] },\n cache: NonNullable<typeof roleCache>\n): RoleRecord[] {\n return [\n ...refs.ids.map((id) => cache.byId.get(id)),\n ...refs.slugs.map((slug) => cache.bySlug.get(slug)),\n ].filter((role): role is RoleRecord => Boolean(role))\n}\n\nfunction syncAssignment(user: unknown): SyncAssignment {\n const record = asCmsUser(user)\n if (!record) return 'guest'\n const refs = roleRefs(record.roles)\n if (refs.ids.length === 0 && refs.slugs.length === 0) return 'admin'\n if (!roleCache) return 'unknown'\n return lookupRoles(refs, roleCache)\n}\n\nasync function loadAssignment(req: {\n user?: unknown\n payload: Payload\n}): Promise<Exclude<SyncAssignment, 'unknown'>> {\n const record = asCmsUser(req.user)\n if (!record) return 'guest'\n const refs = roleRefs(record.roles)\n if (refs.ids.length === 0 && refs.slugs.length === 0) return 'admin'\n const cache = await ensureRoleCache(req.payload)\n return lookupRoles(refs, cache)\n}\n\nfunction hasPermission(roles: RoleRecord[], target: string, action: PermissionAction): boolean {\n if (roles.some((role) => role.fullAccess)) return true\n return roles.some((role) =>\n role.permissions.some((permission) => permission.target === target && permission[action])\n )\n}\n\n/**\n * `null` means this user has no roles yet and is treated as admin.\n * `true` / `false` is the cached decision. A cold cache returns `null` so the\n * nav stays visible until startup finishes loading roles.\n */\nfunction cachedPermission(user: unknown, target: string, action: PermissionAction): boolean | null {\n const assigned = syncAssignment(user)\n if (assigned === 'guest') return false\n if (assigned === 'admin') return true\n if (assigned === 'unknown') return null\n return hasPermission(assigned, target, action)\n}\n\nexport async function userIsFullAdmin(req: { user?: unknown; payload: Payload }): Promise<boolean> {\n const assigned = await loadAssignment(req)\n if (assigned === 'guest') return false\n if (assigned === 'admin') return true\n return assigned.some((role) => role.fullAccess)\n}\n\nasync function userCan(\n req: { user?: unknown; payload: Payload },\n target: string,\n action: PermissionAction\n): Promise<boolean> {\n const assigned = await loadAssignment(req)\n if (assigned === 'guest') return false\n if (assigned === 'admin') return true\n return hasPermission(assigned, target, action)\n}\n\n/**\n * Users created before the roles field existed have none stored.\n * Treat that as admin so turning roles on does not lock the panel.\n */\nexport function effectiveRoles(user: unknown): string[] {\n const assigned = syncAssignment(user)\n if (assigned === 'admin') return [ADMIN_ROLE]\n if (assigned === 'guest' || assigned === 'unknown') return []\n return assigned.map((role) => role.slug)\n}\n\nexport function userHasAnyRole(user: unknown, roles: readonly string[]): boolean {\n const assigned = effectiveRoles(user)\n if (assigned.includes(ADMIN_ROLE)) return true\n return roles.some((role) => assigned.includes(role))\n}\n\nexport function isCmsAdmin(user: unknown): boolean {\n const assigned = syncAssignment(user)\n if (assigned === 'admin') return true\n if (assigned === 'guest' || assigned === 'unknown') return false\n return assigned.some((role) => role.fullAccess)\n}\n\nexport const adminRoleAccess: Access = ({ req }) => userIsFullAdmin(req)\n\nexport function hiddenUnless(roles: readonly string[]) {\n return ({ user }: { user: unknown }) => !userHasAnyRole(user, roles)\n}\n\nexport function writeAccess(roles: readonly string[]): Access {\n return ({ req }) => userHasAnyRole(req.user, roles)\n}\n\nexport function publishedOrRoleRead(roles: readonly string[]): Access {\n return ({ req }) => {\n if (userHasAnyRole(req.user, roles)) return true\n const where: Where = { _status: { equals: 'published' } }\n return where\n }\n}\n\nconst selfOrAdminAccess: Access = async ({ req }) => {\n if (await userIsFullAdmin(req)) return true\n const record = asCmsUser(req.user)\n if (record?.id == null) return false\n const where: Where = { id: { equals: record.id } }\n return where\n}\n\nconst manageRolesAccess: FieldAccess = ({ req }) => userIsFullAdmin(req)\n\nfunction hiddenFor(target: string) {\n return ({ user }: { user: unknown }) => {\n const create = cachedPermission(user, target, 'create')\n const update = cachedPermission(user, target, 'update')\n const drafts = cachedPermission(user, target, 'drafts')\n if (create == null || update == null || drafts == null) return false\n return !(create || update || drafts)\n }\n}\n\nexport function hiddenUnlessFullAdmin() {\n return ({ user }: { user: unknown }) => {\n const assigned = syncAssignment(user)\n if (assigned === 'unknown' || assigned === 'admin') return false\n if (assigned === 'guest') return true\n return !assigned.some((role) => role.fullAccess)\n }\n}\n\nexport function resolveRoleOptions(options: RolesOptions = {}): RoleOption[] {\n const custom =\n options.roles?.filter((role) => role.value !== ADMIN_ROLE) ??\n DEFAULT_ROLES.filter((role) => role.value !== ADMIN_ROLE)\n const merged = new Map<string, RoleOption>([[ADMIN_ROLE, { label: 'Admin', value: ADMIN_ROLE }]])\n ;[...custom, ...(options.extraRoles ?? [])].forEach((role) => {\n if (!role.value || role.value === ADMIN_ROLE) return\n merged.set(role.value, { label: role.label, value: role.value })\n })\n return [...merged.values()]\n}\n\nexport function collectionRoleRule(\n options: true | RolesOptions | undefined,\n slug: string,\n fallback?: RoleRule | false\n): RoleRule | false | undefined {\n return roleRule(options, 'collections', slug, fallback)\n}\n\nexport function globalRoleRule(\n options: true | RolesOptions | undefined,\n slug: string,\n fallback?: RoleRule | false\n): RoleRule | false | undefined {\n return roleRule(options, 'globals', slug, fallback)\n}\n\nfunction roleRule(\n options: true | RolesOptions | undefined,\n kind: 'collections' | 'globals',\n slug: string,\n fallback?: RoleRule | false\n): RoleRule | false | undefined {\n const config = options === true || options == null ? {} : options\n const overrides = config[kind]\n if (overrides && Object.prototype.hasOwnProperty.call(overrides, slug)) {\n return (overrides as Record<string, RoleRule | false | undefined>)[slug]\n }\n const defaults = kind === 'collections' ? DEFAULT_COLLECTION_ROLES : DEFAULT_GLOBAL_ROLES\n if (Object.prototype.hasOwnProperty.call(defaults, slug)) {\n return defaults[slug as keyof typeof defaults]\n }\n return fallback\n}\n\nfunction rolesField(): Field {\n return {\n name: 'roles',\n type: 'relationship',\n relationTo: CMS_ROLES_SLUG,\n hasMany: true,\n saveToJWT: true,\n access: {\n create: manageRolesAccess,\n update: manageRolesAccess,\n },\n admin: {\n position: 'sidebar',\n description:\n 'Only an admin can change roles. Several roles can be combined. Empty means Admin until a role is saved. The user must sign in again before a change applies.',\n },\n }\n}\n\nfunction permissionFor(\n target: string,\n rule: RoleRule | false | undefined,\n role: string,\n collection: boolean\n): RolePermission | null {\n if (rule == null || rule === false || !rule.roles.includes(role)) return null\n return {\n target,\n create: collection,\n update: true,\n delete: false,\n drafts: collection && rule.drafts === true,\n }\n}\n\n/** Targets shown in the Roles editor: stock defaults plus anything the app configures. */\nexport function roleTargetSlugs(options: RolesOptions = {}): string[] {\n const targets = new Set<string>([\n ...Object.keys(DEFAULT_COLLECTION_ROLES),\n ...Object.keys(DEFAULT_GLOBAL_ROLES),\n ...Object.keys(options.collections ?? {}),\n ...Object.keys(options.globals ?? {}),\n ])\n targets.delete('users')\n targets.delete(CMS_ROLES_SLUG)\n return [...targets].sort()\n}\n\n/**\n * Default role documents. Existing documents with the same slug are left alone,\n * so edits made in the admin survive a restart.\n */\nexport function buildRoleSeeds(options: RolesOptions = {}): RoleSeed[] {\n const roles = resolveRoleOptions(options)\n const targets = roleTargetSlugs(options)\n return roles.map((role) => {\n if (role.value === ADMIN_ROLE) {\n return { name: role.label, slug: role.value, fullAccess: true, permissions: [] }\n }\n const permissions = targets.flatMap((target) => {\n const collection = collectionRoleRule(options, target)\n const global = globalRoleRule(options, target)\n const rule = collection !== undefined ? collection : global\n const row = permissionFor(target, rule, role.value, collection !== undefined)\n return row ? [row] : []\n })\n return { name: role.label, slug: role.value, fullAccess: false, permissions }\n })\n}\n\ntype RoleTarget = CollectionConfig | GlobalConfig\n\nfunction isCollectionConfig(config: RoleTarget): config is CollectionConfig {\n if ('auth' in config || 'upload' in config || 'labels' in config || 'defaultSort' in config) {\n return true\n }\n return Boolean(config.access && ('create' in config.access || 'delete' in config.access))\n}\n\n/** Limits create, update, and delete from the Roles collection. Admin is always allowed. */\nexport function withRoles<T extends RoleTarget>(config: T): T {\n const collection = isCollectionConfig(config)\n const users = collection && Boolean(config.auth)\n const slug = config.slug\n const versioned = 'versions' in config && Boolean(config.versions)\n\n return {\n ...config,\n admin: {\n ...config.admin,\n ...(users ? { hidden: hiddenUnlessFullAdmin() } : { hidden: hiddenFor(slug) }),\n },\n access: {\n ...config.access,\n ...(collection\n ? {\n create: users ? adminRoleAccess : ({ req }) => userCan(req, slug, 'create'),\n delete: users ? adminRoleAccess : ({ req }) => userCan(req, slug, 'delete'),\n }\n : {}),\n ...(users\n ? { read: selfOrAdminAccess, update: selfOrAdminAccess }\n : { update: ({ req }) => userCan(req, slug, 'update') }),\n ...(versioned && !users\n ? {\n read: async ({ req }) => {\n if ((await userCan(req, slug, 'update')) || (await userCan(req, slug, 'drafts'))) {\n return true\n }\n const where: Where = { _status: { equals: 'published' } }\n return where\n },\n }\n : {}),\n },\n ...(users && !(config.fields ?? []).some((field) => 'name' in field && field.name === 'roles')\n ? { fields: [...(config.fields ?? []), rolesField()] }\n : {}),\n } as T\n}\n","import type { AccessHelpers } from '../shared/access.js'\nimport type { Access, CollectionConfig } from 'payload'\n\nconst adminOrSelf: Access = ({ req }) => {\n if (req.user?.collection === 'users') return true\n if (req.user?.collection === 'api-tokens') return { id: { equals: req.user.id } }\n return false\n}\n\n/**\n * Stock API-key auth collection for server-to-server Payload REST/GraphQL clients.\n * Disable per site with `overrides['api-tokens'] = false`.\n */\nexport function createApiTokens(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'api-tokens',\n labels: {\n singular: 'API Token',\n plural: 'API Tokens',\n },\n admin: {\n useAsTitle: 'name',\n defaultColumns: ['name', 'description', 'enabled', 'createdAt'],\n description:\n 'Server-to-server tokens for non-admin clients calling the Payload REST/GraphQL API. ' +\n 'Each token authenticates as an api-tokens user and is restricted to published, public-readable content.',\n },\n auth: {\n useAPIKey: true,\n disableLocalStrategy: true,\n },\n access: {\n read: adminOrSelf,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n admin: access.adminOnly,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n admin: {\n description: 'Human-readable label, e.g. \"mobile-app-prod\" or \"partner-foo\".',\n },\n },\n {\n name: 'description',\n type: 'textarea',\n admin: {\n description: 'Who is this token for and what is it used for? Free-form notes.',\n },\n },\n {\n name: 'enabled',\n type: 'checkbox',\n defaultValue: true,\n admin: {\n position: 'sidebar',\n description:\n 'Disable to soft-revoke. To hard-revoke, clear the API Key field or delete the document.',\n },\n },\n ],\n }\n}\n","import type { FieldHook } from 'payload'\n\nexport const slugify: FieldHook = ({ value }) =>\n typeof value === 'string'\n ? value\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n : value\n","import { slugify } from '../hooks/slugify.js'\nimport {\n ADMIN_ROLE,\n CMS_ROLES_SLUG,\n buildRoleSeeds,\n hiddenUnlessFullAdmin,\n refreshRoleCache,\n userIsFullAdmin,\n type RolesOptions,\n} from '../shared/roles.js'\n\nimport type {\n CollectionAfterChangeHook,\n CollectionAfterDeleteHook,\n CollectionBeforeChangeHook,\n CollectionBeforeDeleteHook,\n CollectionConfig,\n Payload,\n PayloadRequest,\n} from 'payload'\n\nconst refresh: CollectionAfterChangeHook = ({ req }) => refreshRoleCache(req.payload)\n\nconst refreshAfterDelete: CollectionAfterDeleteHook = ({ req }) => refreshRoleCache(req.payload)\n\nconst keepAdminRole: CollectionBeforeChangeHook = ({ data, originalDoc }) => {\n if (originalDoc?.slug === ADMIN_ROLE || data?.slug === ADMIN_ROLE) {\n return { ...data, slug: ADMIN_ROLE, fullAccess: true }\n }\n return data\n}\n\nconst blockAdminDelete: CollectionBeforeDeleteHook = async ({ id, req }) => {\n const doc = await req.payload.findByID({\n collection: CMS_ROLES_SLUG,\n id,\n depth: 0,\n overrideAccess: true,\n })\n if (doc.slug === ADMIN_ROLE) {\n throw new Error('The Admin role cannot be deleted.')\n }\n}\n\nconst fullAdmin = ({ req }: { req: PayloadRequest }) => userIsFullAdmin(req)\n\nexport function createCmsRoles(targets: readonly string[]): CollectionConfig {\n return {\n slug: CMS_ROLES_SLUG,\n labels: { singular: 'Role', plural: 'Roles' },\n admin: {\n useAsTitle: 'name',\n hidden: hiddenUnlessFullAdmin(),\n description: 'Who can edit each collection and global. Only an admin can change this.',\n },\n access: {\n read: fullAdmin,\n create: fullAdmin,\n update: fullAdmin,\n delete: fullAdmin,\n },\n hooks: {\n beforeChange: [keepAdminRole],\n beforeDelete: [blockAdminDelete],\n afterChange: [refresh],\n afterDelete: [refreshAfterDelete],\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n index: true,\n hooks: { beforeValidate: [slugify] },\n admin: { description: 'Stable id. Do not change it after users are assigned this role.' },\n },\n {\n name: 'fullAccess',\n type: 'checkbox',\n defaultValue: false,\n admin: { description: 'Can edit every collection, including Roles and Users.' },\n },\n {\n name: 'permissions',\n type: 'array',\n admin: {\n condition: (data) => !data?.fullAccess,\n description: 'One row per collection or global. No row means no access.',\n },\n fields: [\n {\n name: 'target',\n type: 'select',\n required: true,\n options: targets.map((slug) => ({ label: slug, value: slug })),\n },\n { name: 'create', type: 'checkbox', defaultValue: false },\n { name: 'update', type: 'checkbox', defaultValue: false },\n { name: 'delete', type: 'checkbox', defaultValue: false },\n {\n name: 'drafts',\n type: 'checkbox',\n defaultValue: false,\n admin: { description: 'Can open unpublished documents. Update also allows this.' },\n },\n ],\n },\n ],\n }\n}\n\n/** Creates each default role once. Documents that already exist are left as edited. */\nexport async function seedDefaultCmsRoles(\n payload: Payload,\n options: RolesOptions = {}\n): Promise<void> {\n const seeds = buildRoleSeeds(options)\n await Promise.all(\n seeds.map(async (role) => {\n const existing = await payload.find({\n collection: CMS_ROLES_SLUG,\n where: { slug: { equals: role.slug } },\n limit: 1,\n depth: 0,\n overrideAccess: true,\n })\n if (existing.docs.length > 0) return\n await payload.create({\n collection: CMS_ROLES_SLUG,\n data: role,\n overrideAccess: true,\n })\n })\n )\n}\n","import type { GroupField, Validate } from 'payload'\n\nconst MAX_META_TITLE = 60\nconst MAX_META_DESCRIPTION = 160\n\nconst validateMetaTitle: Validate<string | null | undefined> = (value) => {\n if (!value || value.trim().length === 0) return 'Meta title is required.'\n if (value.length > MAX_META_TITLE)\n return `Meta title must be ${MAX_META_TITLE} characters or fewer (currently ${value.length}).`\n return true\n}\n\nconst validateMetaDescription: Validate<string | null | undefined> = (value) => {\n if (!value || value.trim().length === 0) return 'Meta description is required.'\n if (value.length > MAX_META_DESCRIPTION)\n return `Meta description must be ${MAX_META_DESCRIPTION} characters or fewer (currently ${value.length}).`\n return true\n}\n\nconst validateUrl: Validate<string | null | undefined> = (value) => {\n if (!value) return true\n try {\n new URL(value)\n return true\n } catch {\n return 'Must be a valid URL (e.g. https://example.com/page).'\n }\n}\n\nexport const seoFields: GroupField = {\n name: 'seo',\n type: 'group',\n label: 'SEO',\n fields: [\n {\n name: 'metaTitle',\n type: 'text',\n required: true,\n localized: true,\n maxLength: MAX_META_TITLE,\n validate: validateMetaTitle,\n admin: {\n description: `Required. ${MAX_META_TITLE} characters max — shown in browser tabs and search results.`,\n },\n },\n {\n name: 'metaDescription',\n type: 'textarea',\n required: true,\n localized: true,\n validate: validateMetaDescription,\n admin: {\n description: `Required. ${MAX_META_DESCRIPTION} characters max — shown in search result snippets.`,\n },\n },\n {\n name: 'ogImage',\n type: 'upload',\n relationTo: 'media',\n admin: {\n description:\n 'Used when the page is shared on social media (1200×630 recommended). Falls back to cover image if empty.',\n },\n },\n {\n name: 'canonicalUrl',\n type: 'text',\n validate: validateUrl,\n admin: {\n description: 'Override for syndicated content. Leave empty to auto-derive from slug.',\n },\n },\n {\n name: 'noIndex',\n type: 'checkbox',\n defaultValue: false,\n admin: {\n description: 'When checked, search engines will not index this page.',\n },\n },\n {\n name: 'noFollow',\n type: 'checkbox',\n defaultValue: false,\n admin: {\n description:\n 'When checked, search engines will not follow links on this page (paired with noIndex if needed).',\n },\n },\n ],\n}\n","import { slugify } from '../hooks/slugify.js'\nimport { seoFields } from '../shared/seo-fields.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\nexport function createAuthors(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'authors',\n admin: {\n useAsTitle: 'name',\n defaultColumns: ['name', 'slug', 'role'],\n },\n access: {\n read: access.publicRead,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: { position: 'sidebar' },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'avatar',\n type: 'upload',\n relationTo: 'media',\n },\n {\n name: 'role',\n type: 'text',\n localized: true,\n admin: {\n description: 'Job title or role (e.g. \"Lead Engineer\")',\n },\n },\n {\n name: 'bio',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'social',\n type: 'group',\n label: 'Social Profiles',\n admin: { position: 'sidebar' },\n fields: [\n { name: 'website', type: 'text' },\n { name: 'twitter', type: 'text', admin: { description: '@handle or full URL' } },\n { name: 'linkedin', type: 'text' },\n { name: 'github', type: 'text' },\n ],\n },\n {\n ...seoFields,\n fields: [\n ...seoFields.fields,\n {\n name: 'jsonLd',\n type: 'group',\n label: 'Structured Data Overrides',\n admin: {\n description: 'Used in JSON-LD Person schema on author pages and article bylines.',\n },\n fields: [\n {\n name: 'jobTitle',\n type: 'text',\n admin: { description: 'schema.org jobTitle (defaults to role if empty)' },\n },\n {\n name: 'worksFor',\n type: 'text',\n admin: { description: 'Organization name for schema.org worksFor' },\n },\n {\n name: 'sameAs',\n type: 'array',\n admin: {\n description: 'Extra canonical URLs for this person (Wikipedia, Crunchbase, etc.)',\n },\n fields: [{ name: 'url', type: 'text', required: true }],\n },\n ],\n },\n ],\n },\n ],\n }\n}\n","/** Shared language options for CMS code blocks and Lexical CodeBlock feature. */\nexport const languageOptions = [\n { label: 'TypeScript', value: 'typescript' },\n { label: 'JavaScript', value: 'javascript' },\n { label: 'Python', value: 'python' },\n { label: 'Bash / Shell', value: 'bash' },\n { label: 'Shell', value: 'shell' },\n { label: 'JSON', value: 'json' },\n { label: 'CSS', value: 'css' },\n { label: 'HTML', value: 'html' },\n { label: 'Rust', value: 'rust' },\n { label: 'Go', value: 'go' },\n { label: 'YAML', value: 'yaml' },\n { label: 'Markdown', value: 'markdown' },\n { label: 'Plain Text', value: 'plaintext' },\n]\n\nexport const codeBlockLanguages: Record<string, string> = Object.fromEntries(\n languageOptions.map((opt) => [opt.value, opt.label])\n)\n\nexport const defaultCodeLanguage = 'plaintext'\n","import { languageOptions } from './language-options.js'\n\nimport type { Block } from 'payload'\n\nexport const codeBlock: Block = {\n slug: 'code',\n labels: { singular: 'Code Block', plural: 'Code Blocks' },\n fields: [\n {\n name: 'language',\n type: 'select',\n defaultValue: 'typescript',\n options: languageOptions,\n },\n {\n name: 'filename',\n type: 'text',\n admin: { description: 'Optional filename label shown above the block' },\n },\n {\n name: 'code',\n type: 'code',\n required: true,\n admin: { language: 'typescript' },\n },\n ],\n}\n","import { languageOptions } from './language-options.js'\n\nimport type { Block } from 'payload'\n\nexport const codeTabsBlock: Block = {\n slug: 'code-tabs',\n labels: { singular: 'Code Tabs', plural: 'Code Tabs' },\n fields: [\n {\n name: 'tabs',\n type: 'array',\n required: true,\n minRows: 1,\n fields: [\n {\n name: 'label',\n type: 'text',\n required: true,\n admin: { description: 'Tab label (e.g. Windows, Linux, Android)' },\n },\n {\n name: 'language',\n type: 'select',\n defaultValue: 'bash',\n options: languageOptions,\n },\n {\n name: 'code',\n type: 'code',\n required: true,\n admin: { language: 'bash' },\n },\n ],\n },\n ],\n}\n","import type { Block } from 'payload'\n\nexport const downloadCtaBlock: Block = {\n slug: 'download-cta',\n labels: { singular: 'Download CTA', plural: 'Download CTAs' },\n fields: [\n {\n name: 'eyebrow',\n type: 'text',\n localized: true,\n },\n {\n name: 'heading',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'headingAccent',\n type: 'text',\n localized: true,\n },\n {\n name: 'description',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'submitLabel',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'downloadUrl',\n type: 'text',\n required: true,\n },\n {\n name: 'downloadLabel',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'successMessage',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'consent',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'footnote',\n type: 'textarea',\n localized: true,\n },\n ],\n}\n","import type { Block } from 'payload'\n\nexport const imageBlock: Block = {\n slug: 'image',\n labels: { singular: 'Image', plural: 'Images' },\n fields: [\n {\n name: 'image',\n type: 'upload',\n relationTo: 'media',\n required: true,\n },\n {\n name: 'caption',\n type: 'text',\n localized: true,\n },\n {\n name: 'size',\n type: 'select',\n defaultValue: 'full',\n options: [\n { label: 'Full Width', value: 'full' },\n { label: 'Wide', value: 'wide' },\n { label: 'Medium', value: 'medium' },\n ],\n },\n ],\n}\n","import type { Block } from 'payload'\n\nexport const videoBlock: Block = {\n slug: 'video',\n labels: { singular: 'Video', plural: 'Videos' },\n fields: [\n {\n name: 'video',\n type: 'upload',\n relationTo: 'media',\n required: true,\n filterOptions: {\n mimeType: { contains: 'video' },\n },\n },\n {\n name: 'caption',\n type: 'text',\n localized: true,\n },\n {\n name: 'size',\n type: 'select',\n defaultValue: 'full',\n options: [\n { label: 'Full Width', value: 'full' },\n { label: 'Wide', value: 'wide' },\n { label: 'Medium', value: 'medium' },\n ],\n },\n ],\n}\n","import {\n BlocksFeature,\n CodeBlock,\n EXPERIMENTAL_TableFeature,\n UploadFeature,\n editorConfigFactory,\n lexicalEditor,\n} from '@payloadcms/richtext-lexical'\n\nimport { codeBlockLanguages, defaultCodeLanguage } from '../blocks/language-options.js'\nimport { videoBlock } from '../blocks/video.js'\n\nimport type { FeatureProviderServer } from '@payloadcms/richtext-lexical'\nimport type { SanitizedConfig } from 'payload'\n\nconst richTextFeatures = ({\n defaultFeatures,\n}: {\n defaultFeatures: FeatureProviderServer[]\n rootFeatures: FeatureProviderServer[]\n}) => [\n ...defaultFeatures.filter((feature) => feature.key !== 'upload'),\n UploadFeature({\n collections: {\n media: {\n fields: [\n {\n name: 'caption',\n type: 'text',\n },\n ],\n },\n },\n }),\n BlocksFeature({\n blocks: [\n CodeBlock({\n languages: codeBlockLanguages,\n defaultLanguage: defaultCodeLanguage,\n }),\n videoBlock,\n ],\n }),\n EXPERIMENTAL_TableFeature(),\n]\n\n/**\n * Shared Lexical editor for every `richText` field.\n *\n * Adds `CodeBlock`, inline `video` block, media upload captions, and\n * `EXPERIMENTAL_TableFeature` on top of Payload defaults.\n */\n// Return type is derived from `lexicalEditor` (a public export) rather than the\n// inferred `LexicalRichTextAdapterProvider` (not re-exported), so the generated\n// declaration stays portable while keeping the narrow Lexical adapter type that\n// consumers like `editorConfigFactory.fromEditor` require.\nexport const richTextEditor = (): ReturnType<typeof lexicalEditor> =>\n lexicalEditor({\n features: richTextFeatures,\n })\n\n/** Resolve Lexical editor config for seed scripts / markdown conversion. */\nexport async function getRichTextEditorConfig(config: SanitizedConfig) {\n return editorConfigFactory.fromFeatures({\n config,\n features: richTextFeatures,\n })\n}\n","import { richTextEditor } from '../lexical/editor.js'\n\nimport type { Block } from 'payload'\n\nexport const richTextBlock: Block = {\n slug: 'rich-text',\n labels: { singular: 'Rich Text', plural: 'Rich Text Blocks' },\n fields: [\n {\n name: 'content',\n type: 'richText',\n localized: true,\n editor: richTextEditor(),\n },\n ],\n}\n","import type { Block } from 'payload'\n\nexport const stepsBlock: Block = {\n slug: 'steps',\n labels: { singular: 'Steps List', plural: 'Steps Lists' },\n fields: [\n {\n name: 'items',\n type: 'array',\n required: true,\n minRows: 1,\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'description',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'avatar',\n type: 'upload',\n relationTo: 'media',\n admin: { description: 'Optional avatar or icon shown next to the step' },\n },\n ],\n },\n ],\n}\n","import { codeBlock } from './code.js'\nimport { codeTabsBlock } from './code-tabs.js'\nimport { downloadCtaBlock } from './download-cta.js'\nimport { imageBlock } from './image.js'\nimport { richTextBlock } from './rich-text.js'\nimport { stepsBlock } from './steps.js'\nimport { videoBlock } from './video.js'\n\nimport type { Block } from 'payload'\n\nexport const leafBlocks: Block[] = [\n richTextBlock,\n codeBlock,\n codeTabsBlock,\n imageBlock,\n videoBlock,\n downloadCtaBlock,\n stepsBlock,\n]\n","import { leafBlocks } from './leaf-blocks.js'\n\nimport type { Block } from 'payload'\n\nexport const accordionBlock: Block = {\n slug: 'accordion',\n labels: { singular: 'Accordion', plural: 'Accordions' },\n fields: [\n {\n name: 'items',\n type: 'array',\n required: true,\n minRows: 1,\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'defaultOpen',\n type: 'checkbox',\n defaultValue: false,\n },\n {\n name: 'content',\n type: 'blocks',\n blocks: leafBlocks,\n localized: true,\n },\n ],\n },\n ],\n}\n","import type { Block } from 'payload'\n\nexport const sectionHeadingBlock: Block = {\n slug: 'section-heading',\n labels: { singular: 'Section Heading', plural: 'Section Headings' },\n fields: [\n {\n name: 'text',\n type: 'text',\n required: true,\n localized: true,\n },\n ],\n}\n","import { accordionBlock } from './accordion.js'\nimport { codeBlock } from './code.js'\nimport { codeTabsBlock } from './code-tabs.js'\nimport { downloadCtaBlock } from './download-cta.js'\nimport { imageBlock } from './image.js'\nimport { richTextBlock } from './rich-text.js'\nimport { sectionHeadingBlock } from './section-heading.js'\nimport { stepsBlock } from './steps.js'\nimport { videoBlock } from './video.js'\n\nimport type { Block } from 'payload'\n\nexport { richTextBlock } from './rich-text.js'\nexport { codeBlock } from './code.js'\nexport { codeTabsBlock } from './code-tabs.js'\nexport { imageBlock } from './image.js'\nexport { videoBlock } from './video.js'\nexport { downloadCtaBlock } from './download-cta.js'\nexport { stepsBlock } from './steps.js'\nexport { accordionBlock } from './accordion.js'\nexport { sectionHeadingBlock } from './section-heading.js'\nexport { leafBlocks } from './leaf-blocks.js'\nexport { languageOptions, codeBlockLanguages, defaultCodeLanguage } from './language-options.js'\n\nexport const blogContentBlocks: Block[] = [\n richTextBlock,\n codeBlock,\n codeTabsBlock,\n imageBlock,\n videoBlock,\n downloadCtaBlock,\n stepsBlock,\n accordionBlock,\n]\n\nexport const pageContentBlocks: Block[] = [\n richTextBlock,\n codeBlock,\n codeTabsBlock,\n imageBlock,\n stepsBlock,\n accordionBlock,\n]\n\nexport const showcaseContentBlocks: Block[] = [\n sectionHeadingBlock,\n richTextBlock,\n codeBlock,\n imageBlock,\n]\n","import type { CollectionAfterReadHook, CollectionBeforeChangeHook } from 'payload'\n\nfunction toCategoryIdList(value: unknown): string[] {\n if (value == null || value === '') return []\n const items = Array.isArray(value) ? value : [value]\n return items\n .map((item) => {\n if (typeof item === 'string' || typeof item === 'number') return String(item)\n if (item && typeof item === 'object' && 'id' in item && item.id != null) {\n return String(item.id)\n }\n return null\n })\n .filter((id): id is string => Boolean(id))\n}\n\n/** Posts saved before `category` became `hasMany` still store a single value. */\nexport const coerceBlogPostCategoriesOnWrite: CollectionBeforeChangeHook = ({ data }) => {\n if (!data || !('category' in data)) return data\n data.category = toCategoryIdList(data.category)\n return data\n}\n\nexport const coerceBlogPostCategoriesOnRead: CollectionAfterReadHook = ({ doc }) => {\n if (!doc) return doc\n if (doc.category == null || doc.category === '') {\n doc.category = []\n return doc\n }\n if (!Array.isArray(doc.category)) {\n doc.category = [doc.category]\n }\n return doc\n}\n","import type { CollectionBeforeChangeHook } from 'payload'\n\nexport const setPublishedAt: CollectionBeforeChangeHook = ({ data }) => {\n if (data && !data.publishedAt && data._status === 'published') {\n data.publishedAt = new Date().toISOString()\n }\n return data\n}\n","import type { CollectionConfig } from 'payload'\n\nexport const draftsWithAutosave: CollectionConfig['versions'] = {\n maxPerDoc: 25,\n drafts: {\n autosave: {\n interval: 800,\n },\n schedulePublish: true,\n },\n}\n","import { blogContentBlocks } from '../blocks/index.js'\nimport {\n coerceBlogPostCategoriesOnRead,\n coerceBlogPostCategoriesOnWrite,\n} from '../hooks/coerce-blog-post-categories.js'\nimport { setPublishedAt } from '../hooks/set-published-at.js'\nimport { slugify } from '../hooks/slugify.js'\nimport { draftsWithAutosave } from '../shared/drafts-with-autosave.js'\nimport { seoFields } from '../shared/seo-fields.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\n/** Stock blog-posts collection (no site revalidation — add via overrides.hooks). */\nexport function createBlogPosts(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'blog-posts',\n defaultSort: '-publishedAt',\n admin: {\n useAsTitle: 'title',\n defaultColumns: ['title', 'slug', 'author', 'publishedAt', '_status'],\n },\n access: {\n read: access.adminOrPublished,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n versions: draftsWithAutosave,\n hooks: {\n beforeChange: [setPublishedAt, coerceBlogPostCategoriesOnWrite],\n afterRead: [coerceBlogPostCategoriesOnRead],\n },\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: {\n position: 'sidebar',\n description: 'URL-friendly identifier. Not localized — one slug per post.',\n },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'coverImage',\n type: 'upload',\n relationTo: 'media',\n },\n {\n name: 'imageAlt',\n type: 'text',\n localized: true,\n admin: {\n description:\n 'Alt text used for the auto-generated social/OG image (`og:image:alt`). Should describe the post for screen readers.',\n },\n },\n {\n name: 'excerpt',\n type: 'textarea',\n localized: true,\n admin: {\n description: 'Short summary shown in listing cards and meta description fallback.',\n },\n },\n {\n name: 'content',\n type: 'blocks',\n localized: true,\n blocks: blogContentBlocks,\n },\n {\n name: 'author',\n type: 'relationship',\n relationTo: 'authors',\n admin: { position: 'sidebar' },\n },\n {\n name: 'category',\n type: 'relationship',\n relationTo: 'categories',\n hasMany: true,\n label: 'Categories',\n admin: { position: 'sidebar' },\n },\n {\n name: 'readingTime',\n type: 'number',\n min: 1,\n admin: {\n position: 'sidebar',\n description: 'Estimated reading time in minutes.',\n },\n },\n {\n name: 'publishedAt',\n type: 'date',\n admin: {\n position: 'sidebar',\n date: { pickerAppearance: 'dayAndTime' },\n description: 'Auto-filled on first publish if left empty.',\n },\n },\n {\n name: 'showLatestNews',\n type: 'checkbox',\n defaultValue: true,\n admin: {\n position: 'sidebar',\n description: 'Show a \"Latest News\" section at the bottom of this post.',\n },\n },\n seoFields,\n ],\n }\n}\n","import { slugify } from '../hooks/slugify.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\nexport function createCategories(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'categories',\n admin: {\n useAsTitle: 'name',\n defaultColumns: ['name', 'slug'],\n },\n access: {\n read: access.publicRead,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: { position: 'sidebar' },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'description',\n type: 'textarea',\n localized: true,\n },\n ],\n }\n}\n","import { slugify } from '../hooks/slugify.js'\nimport { draftsWithAutosave } from '../shared/drafts-with-autosave.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\n/**\n * Stock changelog collection (shared fields only).\n * Site-specific body / GitHub / related-block fields — add via `overrides.fields`.\n * Revalidation — add via `overrides.hooks`.\n */\nexport function createChangelog(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'changelog',\n labels: { singular: 'Changelog', plural: 'Changelog' },\n defaultSort: '-releaseDate',\n admin: {\n useAsTitle: 'title',\n defaultColumns: ['title', 'version', 'versionType', 'tags', 'releaseDate', '_status'],\n },\n access: {\n read: access.adminOrPublished,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n versions: draftsWithAutosave,\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n localized: true,\n admin: {\n description:\n 'Release headline shown on the changelog detail page (e.g. \"Added Solana Support\").',\n },\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: {\n position: 'sidebar',\n description: 'URL-friendly identifier. Not localized — one slug per entry.',\n },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'version',\n type: 'text',\n admin: {\n position: 'sidebar',\n description:\n 'Optional semantic version label shown in the badge, e.g. v1.1.0 or 2.3.0. Omit for non-versioned announcements.',\n },\n },\n {\n name: 'versionType',\n type: 'select',\n options: [\n { label: 'Major', value: 'major' },\n { label: 'Minor', value: 'minor' },\n { label: 'Patch', value: 'patch' },\n ],\n admin: {\n position: 'sidebar',\n description:\n 'Release line for badge styling (major / minor / patch). Editors set this explicitly.',\n },\n },\n {\n name: 'releaseDate',\n type: 'date',\n required: true,\n admin: {\n position: 'sidebar',\n date: { pickerAppearance: 'dayOnly', displayFormat: 'MMM d, yyyy' },\n },\n },\n {\n name: 'tags',\n type: 'relationship',\n relationTo: 'changelog-tags',\n hasMany: true,\n label: 'Tags',\n admin: {\n position: 'sidebar',\n description: 'Editor-managed tags from the Changelog Tags collection.',\n },\n },\n {\n name: 'heroImage',\n type: 'upload',\n relationTo: 'media',\n admin: {\n description: 'Large visual above the article body on the changelog detail page.',\n },\n },\n {\n name: 'summary',\n type: 'textarea',\n localized: true,\n admin: {\n description: 'Short excerpt for listing cards and previews.',\n },\n },\n ],\n }\n}\n","import { slugify } from '../hooks/slugify.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\n/** Stock changelog-tags (no site revalidation — add via overrides.hooks). */\nexport function createChangelogTags(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'changelog-tags',\n defaultSort: 'order',\n admin: {\n useAsTitle: 'name',\n defaultColumns: ['name', 'slug', 'order'],\n description: 'Tags shown on changelog entries.',\n },\n access: {\n read: access.publicRead,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: {\n position: 'sidebar',\n description: 'URL-friendly identifier used by listing filters.',\n },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'order',\n type: 'number',\n defaultValue: 0,\n admin: {\n position: 'sidebar',\n description: 'Display order in admin lists (ascending). Ties broken by name.',\n },\n },\n {\n name: 'description',\n type: 'textarea',\n localized: true,\n admin: { description: 'Optional context shown to editors. Not rendered publicly yet.' },\n },\n ],\n }\n}\n","import { slugify } from '../hooks/slugify.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\n/** Stock event-tags (no site revalidation — add via overrides.hooks). */\nexport function createEventTags(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'event-tags',\n labels: { singular: 'Event Tag', plural: 'Event Tags' },\n defaultSort: 'order',\n admin: {\n useAsTitle: 'name',\n defaultColumns: ['name', 'slug', 'order'],\n description:\n 'Reusable event categories (Meetup, Workshop, Hackathon, …). Editors can add types without code changes. Related from Events.',\n },\n access: {\n read: access.publicRead,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: {\n position: 'sidebar',\n description: 'URL-friendly identifier used by filters and relationships.',\n },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'order',\n type: 'number',\n defaultValue: 0,\n admin: {\n position: 'sidebar',\n description: 'Display order in admin lists (ascending). Ties broken by name.',\n },\n },\n {\n name: 'description',\n type: 'textarea',\n localized: true,\n admin: { description: 'Optional context shown to editors.' },\n },\n ],\n }\n}\n","import { setPublishedAt } from '../hooks/set-published-at.js'\nimport { slugify } from '../hooks/slugify.js'\nimport { richTextEditor } from '../lexical/editor.js'\nimport { draftsWithAutosave } from '../shared/drafts-with-autosave.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig, Validate } from 'payload'\n\n/**\n * Display abbreviations accepted in addition to IANA names (e.g. Europe/Paris).\n * Sites map these to IANA when they need a timezone database identifier.\n */\nconst TIMEZONE_ABBREVIATIONS = new Set([\n 'UTC',\n 'GMT',\n 'CET',\n 'CEST',\n 'WET',\n 'WEST',\n 'EET',\n 'EEST',\n 'BST',\n 'EST',\n 'EDT',\n 'CST',\n 'CDT',\n 'MST',\n 'MDT',\n 'PST',\n 'PDT',\n])\n\nfunction parseDate(value: unknown): Date | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value\n }\n if (typeof value === 'string' && value.trim()) {\n const date = new Date(value)\n return Number.isNaN(date.getTime()) ? null : date\n }\n return null\n}\n\nfunction isValidIanaTimeZone(timeZone: string): boolean {\n try {\n Intl.DateTimeFormat('en-US', { timeZone }).format(new Date())\n return true\n } catch {\n return false\n }\n}\n\nconst validateTimezone: Validate<string | null | undefined> = (value) => {\n if (!value || !value.trim()) return 'Timezone is required.'\n const timeZone = value.trim()\n if (TIMEZONE_ABBREVIATIONS.has(timeZone.toUpperCase())) return true\n if (isValidIanaTimeZone(timeZone)) return true\n return 'Must be a timezone abbreviation (CET, UTC, …) or a valid IANA timezone (e.g. Europe/Paris).'\n}\n\nconst validateExternalUrl: Validate<string | null | undefined> = (value) => {\n if (!value || !value.trim()) return 'External URL is required.'\n try {\n new URL(value)\n return true\n } catch {\n return 'Must be a valid URL (e.g. https://example.com/event).'\n }\n}\n\nconst validateEndsAt: Validate<string | Date | null | undefined> = (value, { siblingData }) => {\n const end = parseDate(value)\n if (!end) return 'End date and time is required.'\n\n const start = parseDate(\n siblingData && typeof siblingData === 'object' && 'startsAt' in siblingData\n ? siblingData.startsAt\n : undefined\n )\n if (start && end.getTime() <= start.getTime()) {\n return 'End date and time must be after the start.'\n }\n\n return true\n}\n\n/**\n * Stock events collection (shared fields only).\n * SEO / site-specific fields — add via `overrides.fields`.\n * Revalidation — add via `overrides.hooks`.\n */\nexport function createEvents(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'events',\n labels: { singular: 'Event', plural: 'Events' },\n defaultSort: 'startsAt',\n admin: {\n useAsTitle: 'title',\n defaultColumns: ['title', 'slug', 'tag', 'startsAt', 'endsAt', '_status'],\n description: 'Reusable events consumed by marketing / community surfaces across sites.',\n },\n access: {\n read: access.adminOrPublished,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n versions: draftsWithAutosave,\n hooks: {\n beforeChange: [setPublishedAt],\n },\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: {\n position: 'sidebar',\n description: 'URL-friendly identifier. Not localized — one slug per event.',\n },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'summary',\n type: 'textarea',\n required: true,\n localized: true,\n admin: {\n description: 'Short description for listings, previews, and calendar bodies.',\n },\n },\n {\n name: 'coverImage',\n type: 'upload',\n relationTo: 'media',\n admin: {\n description: 'Optional cover/hero image for detail or promotional surfaces.',\n },\n },\n {\n name: 'startsAt',\n type: 'date',\n required: true,\n admin: {\n position: 'sidebar',\n date: { pickerAppearance: 'dayAndTime', displayFormat: 'MMM d, yyyy h:mm a' },\n description: 'Event start date and time. Sites derive upcoming vs past from this value.',\n },\n },\n {\n name: 'endsAt',\n type: 'date',\n required: true,\n validate: validateEndsAt,\n admin: {\n position: 'sidebar',\n date: { pickerAppearance: 'dayAndTime', displayFormat: 'MMM d, yyyy h:mm a' },\n description: 'Event end date and time. Must be after the start.',\n },\n },\n {\n name: 'timezone',\n type: 'text',\n required: true,\n validate: validateTimezone,\n admin: {\n position: 'sidebar',\n description:\n 'Display timezone: abbreviation (CET, WET, UTC) or IANA name (Europe/Paris).',\n },\n },\n {\n name: 'location',\n type: 'text',\n required: true,\n localized: true,\n admin: {\n description: 'Venue or platform (e.g. Discord, Online, Lisbon).',\n },\n },\n {\n name: 'tag',\n type: 'relationship',\n relationTo: 'event-tags',\n required: true,\n admin: {\n position: 'sidebar',\n description: 'Primary event category from Event Tags.',\n },\n },\n {\n name: 'ctaKind',\n type: 'select',\n required: true,\n defaultValue: 'link',\n options: [\n { label: 'External link', value: 'link' },\n { label: 'Add to calendar', value: 'calendar' },\n ],\n admin: {\n position: 'sidebar',\n description:\n 'Primary listing action. Link opens the external URL; calendar lets the site offer an add-to-calendar flow.',\n },\n },\n {\n name: 'ctaLabel',\n type: 'text',\n required: true,\n localized: true,\n admin: {\n description: 'Label for the primary listing action (e.g. Register, Watch recording).',\n },\n },\n {\n name: 'ctaUrl',\n type: 'text',\n required: true,\n validate: validateExternalUrl,\n admin: {\n description:\n 'External event URL. Opened for link actions; included in calendar details for calendar actions.',\n },\n },\n {\n name: 'content',\n type: 'richText',\n localized: true,\n editor: richTextEditor(),\n admin: {\n description: 'Optional long-form body for event detail pages.',\n },\n },\n {\n name: 'publishedAt',\n type: 'date',\n admin: {\n position: 'sidebar',\n date: { pickerAppearance: 'dayAndTime' },\n description: 'Auto-filled on first publish if left empty.',\n },\n },\n ],\n }\n}\n","import type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\n/** Stock media upload collection (always publicly readable once uploaded). */\nexport function createMedia(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'media',\n admin: {\n useAsTitle: 'filename',\n defaultColumns: ['filename', 'alt', 'updatedAt'],\n },\n access: {\n read: access.publicRead,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n upload: {\n imageSizes: [\n {\n name: 'thumbnail',\n width: 400,\n height: 300,\n position: 'centre',\n },\n {\n name: 'card',\n width: 768,\n height: 512,\n position: 'centre',\n },\n {\n name: 'tablet',\n width: 1024,\n height: undefined,\n position: 'centre',\n },\n ],\n adminThumbnail: 'thumbnail',\n mimeTypes: ['image/*', 'video/*', 'application/pdf'],\n },\n fields: [\n {\n name: 'alt',\n type: 'text',\n required: true,\n localized: true,\n },\n ],\n }\n}\n","import { pageContentBlocks } from '../blocks/index.js'\nimport { setPublishedAt } from '../hooks/set-published-at.js'\nimport { slugify } from '../hooks/slugify.js'\nimport { draftsWithAutosave } from '../shared/drafts-with-autosave.js'\nimport { seoFields } from '../shared/seo-fields.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\nfunction createContentPageCollection(\n access: AccessHelpers,\n slug: 'pages' | 'legal-pages'\n): CollectionConfig {\n return {\n slug,\n admin: {\n useAsTitle: 'title',\n defaultColumns: ['title', 'slug', 'publishedAt', '_status'],\n },\n access: {\n read: access.adminOrPublished,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n versions: draftsWithAutosave,\n hooks: {\n beforeChange: [setPublishedAt],\n },\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: {\n position: 'sidebar',\n description: 'URL-friendly identifier. Not localized — one slug per page.',\n },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'content',\n type: 'blocks',\n localized: true,\n blocks: pageContentBlocks,\n },\n {\n name: 'publishedAt',\n type: 'date',\n admin: {\n position: 'sidebar',\n date: { pickerAppearance: 'dayAndTime' },\n description: 'Auto-filled on first publish if left empty.',\n },\n },\n seoFields,\n ],\n }\n}\n\nexport function createPages(access: AccessHelpers): CollectionConfig {\n return createContentPageCollection(access, 'pages')\n}\n\nexport function createLegalPages(access: AccessHelpers): CollectionConfig {\n return createContentPageCollection(access, 'legal-pages')\n}\n","import type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\nexport function createUsers(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'users',\n admin: {\n useAsTitle: 'email',\n },\n auth: {\n verify: false,\n },\n access: {\n read: access.adminOnly,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n admin: access.adminOnly,\n },\n fields: [\n {\n name: 'googleId',\n type: 'text',\n unique: true,\n index: true,\n admin: {\n position: 'sidebar',\n readOnly: true,\n description: 'Google OAuth user ID',\n },\n },\n {\n name: 'name',\n type: 'text',\n admin: {\n description: 'Display name from Google',\n },\n },\n {\n name: 'picture',\n type: 'text',\n admin: {\n description: 'Profile picture URL from Google',\n },\n },\n ],\n }\n}\n","import type { AccessHelpers } from '../shared/access.js'\nimport type { GlobalConfig } from 'payload'\n\nexport function createSiteSettings(access: AccessHelpers): GlobalConfig {\n return {\n slug: 'site-settings',\n label: 'Site Settings',\n access: {\n read: access.publicRead,\n update: access.adminOnly,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n localized: true,\n admin: {\n description: 'Public site name used in titles and structured data.',\n },\n },\n {\n name: 'defaultDescription',\n type: 'textarea',\n required: true,\n localized: true,\n admin: {\n description: 'Fallback meta description when a page does not define its own.',\n },\n },\n {\n name: 'defaultOgImage',\n type: 'upload',\n relationTo: 'media',\n admin: {\n description: 'Default Open Graph image (1200×630 recommended).',\n },\n },\n {\n name: 'organization',\n type: 'group',\n label: 'Organization',\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n },\n {\n name: 'legalName',\n type: 'text',\n },\n {\n name: 'description',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'logo',\n type: 'upload',\n relationTo: 'media',\n },\n {\n name: 'foundingDate',\n type: 'text',\n admin: { description: 'Year or ISO date for schema.org structured data.' },\n },\n ],\n },\n {\n name: 'social',\n type: 'group',\n label: 'Social Profiles',\n fields: [\n { name: 'twitter', type: 'text' },\n { name: 'github', type: 'text' },\n { name: 'linkedin', type: 'text' },\n ],\n },\n ],\n }\n}\n","import type { CollectionConfig, Field, GlobalConfig } from 'payload'\n\ntype OverridableConfig = CollectionConfig | GlobalConfig\n\ntype Override<TConfig extends OverridableConfig> =\n | false\n | {\n fields?: (base: Field[]) => Field[]\n hooks?: Partial<TConfig['hooks']>\n admin?: Partial<TConfig['admin']>\n access?: Partial<TConfig['access']>\n config?: (base: TConfig) => TConfig\n }\n\nexport type CollectionOverride = Override<CollectionConfig>\nexport type GlobalOverride = Override<GlobalConfig>\n\ntype HookArrays = Record<string, unknown[] | undefined>\n\n// Payload collection/global hooks are all arrays of functions, so overrides are\n// appended to the base hooks rather than replacing them.\nfunction mergeHooks(base: HookArrays | undefined, extra: HookArrays | undefined): HookArrays {\n const keys = new Set([...Object.keys(base ?? {}), ...Object.keys(extra ?? {})])\n const merged: HookArrays = {}\n keys.forEach((key) => {\n const combined = [...(base?.[key] ?? []), ...(extra?.[key] ?? [])]\n if (combined.length) merged[key] = combined\n })\n return merged\n}\n\nfunction applyOverride<TConfig extends OverridableConfig>(\n base: TConfig,\n override: Override<TConfig> | undefined\n): TConfig | null {\n if (override === false) return null\n if (!override) return base\n\n const next = {\n ...base,\n ...(override.admin && { admin: { ...base.admin, ...override.admin } }),\n ...(override.access && { access: { ...base.access, ...override.access } }),\n ...(override.fields && { fields: override.fields(base.fields ?? []) }),\n ...(override.hooks && { hooks: mergeHooks(base.hooks, override.hooks as HookArrays) }),\n } as TConfig\n\n return override.config ? override.config(next) : next\n}\n\nexport const applyCollectionOverride = (\n base: CollectionConfig,\n override: CollectionOverride | undefined\n): CollectionConfig | null => applyOverride(base, override)\n\nexport const applyGlobalOverride = (\n base: GlobalConfig,\n override: GlobalOverride | undefined\n): GlobalConfig | null => applyOverride(base, override)\n","import type { CollectionOverride, GlobalOverride } from './applyOverride.js'\n\n/** Slugs of the stock collections shipped by `buildCmsConfig`, in registration order. */\nexport const STOCK_COLLECTION_SLUGS = [\n 'users',\n 'api-tokens',\n 'media',\n 'authors',\n 'categories',\n 'blog-posts',\n 'pages',\n 'legal-pages',\n 'changelog-tags',\n 'changelog',\n 'event-tags',\n 'events',\n] as const\n\nexport type StockCollectionSlug = (typeof STOCK_COLLECTION_SLUGS)[number]\n\n/** Typed map of collection/global overrides for `buildCmsConfig`. */\nexport type Overrides = Partial<Record<StockCollectionSlug, CollectionOverride>> & {\n 'site-settings'?: GlobalOverride\n}\n","import { buildConfig } from 'payload'\n\nimport { createAccessHelpers, type AccessOptions } from './shared/access.js'\nimport { refreshRoleCache, roleTargetSlugs, withRoles, type RolesOptions } from './shared/roles.js'\nimport { createApiTokens } from './collections/createApiTokens.js'\nimport { createCmsRoles, seedDefaultCmsRoles } from './collections/createCmsRoles.js'\nimport { createAuthors } from './collections/createAuthors.js'\nimport { createBlogPosts } from './collections/createBlogPosts.js'\nimport { createCategories } from './collections/createCategories.js'\nimport { createChangelog } from './collections/createChangelog.js'\nimport { createChangelogTags } from './collections/createChangelogTags.js'\nimport { createEventTags } from './collections/createEventTags.js'\nimport { createEvents } from './collections/createEvents.js'\nimport { createMedia } from './collections/createMedia.js'\nimport { createLegalPages, createPages } from './collections/createPages.js'\nimport { createUsers } from './collections/createUsers.js'\nimport { createSiteSettings } from './globals/createSiteSettings.js'\nimport { richTextEditor } from './lexical/editor.js'\nimport { applyCollectionOverride, applyGlobalOverride } from './applyOverride.js'\nimport { STOCK_COLLECTION_SLUGS, type Overrides, type StockCollectionSlug } from './overrides.js'\n\nimport type { CollectionConfig, Config, GlobalConfig, Plugin } from 'payload'\n\nexport type BuildCmsConfigOptions<TLocale extends string = string> = {\n secret: string\n // Payload DB adapter instance (e.g. mongooseAdapter({ url }))\n db: Config['db']\n /** Sharp instance from the `sharp` package. */\n sharp?: Config['sharp']\n cors?: Config['cors']\n csrf?: Config['csrf']\n locales: readonly TLocale[]\n /** Must be one of `locales`. */\n defaultLocale: TLocale\n admin?: Config['admin']\n plugins?: Plugin[]\n /** Defaults to the package Lexical editor. */\n editor?: Config['editor']\n access?: AccessOptions\n /** Collection/global slug → override | false. */\n overrides?: Overrides\n extraCollections?: CollectionConfig[]\n extraGlobals?: GlobalConfig[]\n typescript?: Config['typescript']\n /** Extra top-level Payload config keys (e.g. endpoints, graphQL). */\n payload?: Partial<\n Omit<\n Config,\n | 'secret'\n | 'db'\n | 'sharp'\n | 'cors'\n | 'csrf'\n | 'admin'\n | 'plugins'\n | 'editor'\n | 'collections'\n | 'globals'\n | 'localization'\n | 'typescript'\n >\n >\n}\n\n/** Drop keys whose value is `undefined` so they don't clobber Payload defaults. */\nfunction defined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>\n}\n\n/**\n * Build a Payload config from shared stock collections/globals plus site\n * overrides and extras. Types are still generated in the consuming app.\n */\nexport function buildCmsConfig<const TLocale extends string>(\n options: BuildCmsConfigOptions<TLocale>\n) {\n const overrides = options.overrides ?? {}\n const access = createAccessHelpers({\n ...options.access,\n apiTokens: options.access?.apiTokens ?? overrides['api-tokens'] !== false,\n })\n\n const stock: Record<StockCollectionSlug, CollectionConfig> = {\n 'users': createUsers(access),\n 'api-tokens': createApiTokens(access),\n 'media': createMedia(access),\n 'authors': createAuthors(access),\n 'categories': createCategories(access),\n 'blog-posts': createBlogPosts(access),\n 'pages': createPages(access),\n 'legal-pages': createLegalPages(access),\n 'changelog-tags': createChangelogTags(access),\n 'changelog': createChangelog(access),\n 'event-tags': createEventTags(access),\n 'events': createEvents(access),\n }\n\n const rolesSetting = options.access?.roles\n const rolesEnabled = rolesSetting != null\n const rolesConfig: RolesOptions =\n rolesSetting === true || rolesSetting == null ? {} : rolesSetting\n if (rolesEnabled) {\n ;(Object.keys(stock) as StockCollectionSlug[]).forEach((slug) => {\n stock[slug] = withRoles(stock[slug])\n })\n }\n\n const collections = [\n ...(rolesEnabled ? [createCmsRoles(roleTargetSlugs(rolesConfig))] : []),\n ...STOCK_COLLECTION_SLUGS.map((slug) =>\n applyCollectionOverride(stock[slug], overrides[slug])\n ).filter((c): c is CollectionConfig => c !== null),\n ...(options.extraCollections ?? []),\n ]\n\n const siteSettingsBase = createSiteSettings(access)\n const siteSettingsWithRoles = rolesEnabled ? withRoles(siteSettingsBase) : siteSettingsBase\n const siteSettings = applyGlobalOverride(siteSettingsWithRoles, overrides['site-settings'])\n const globals = [...(siteSettings ? [siteSettings] : []), ...(options.extraGlobals ?? [])]\n const { jobs: jobsOverride, onInit: callerOnInit, ...payloadRest } = options.payload ?? {}\n\n return buildConfig({\n ...payloadRest,\n onInit: async (payload) => {\n if (rolesEnabled) {\n await seedDefaultCmsRoles(payload, rolesConfig)\n await refreshRoleCache(payload)\n }\n if (callerOnInit) await callerOnInit(payload)\n },\n jobs: {\n // In-process cron so Payload `schedulePublish` jobs actually run.\n // Override via `payload.jobs`. Do not use on serverless hosts.\n autoRun: [{ cron: '* * * * *' }],\n ...jobsOverride,\n },\n ...defined({\n sharp: options.sharp,\n cors: options.cors,\n csrf: options.csrf,\n plugins: options.plugins,\n }),\n secret: options.secret,\n db: options.db,\n admin: {\n user: 'users',\n ...options.admin,\n },\n editor: options.editor ?? richTextEditor(),\n collections,\n ...(globals.length ? { globals } : {}),\n localization: {\n locales: options.locales.map((code) => ({\n code,\n label: code.toUpperCase(),\n })),\n defaultLocale: options.defaultLocale,\n fallback: true,\n },\n typescript: options.typescript ?? {\n outputFile: 'src/payload-types.ts',\n },\n })\n}\n","import { createLogger } from '../utils/logger/logger.js'\n\nconst log = createLogger('env')\n\n/**\n * Read a required env var. During Next.js `phase-production-build` and\n * `generate:importmap` (when NEXT_PHASE is unset) returns \"\" instead of throwing,\n * because those phases do not connect to the DB.\n */\nexport function requireEnvAtRuntime(name: string): string {\n const value = process.env[name]\n const isBuildTime = !process.env.NEXT_PHASE || process.env.NEXT_PHASE === 'phase-production-build'\n if (!value && !isBuildTime) {\n log.error(`Missing required environment variable: ${name}`)\n throw new Error(`Missing required environment variable: ${name}`)\n }\n return value ?? ''\n}\n","import { s3Storage } from '@payloadcms/storage-s3'\n\nimport type { Plugin } from 'payload'\n\nexport type CreateS3MediaPluginOptions = {\n /** Defaults to `process.env.AWS_S3_BUCKET`. */\n bucket?: string\n accessKeyId?: string\n secretAccessKey?: string\n region?: string\n /** Custom S3-compatible endpoint (MinIO, etc.). Defaults to `AWS_S3_ENDPOINT`. */\n endpoint?: string\n /** Defaults to `AWS_S3_FORCE_PATH_STYLE === 'true'`. */\n forcePathStyle?: boolean\n /** Collection slug that owns uploads. Defaults to `media`. */\n collection?: string\n}\n\n/** Payload S3 storage plugin wired for the stock `media` collection. */\nexport function createS3MediaPlugin(options: CreateS3MediaPluginOptions = {}): Plugin {\n const bucket = options.bucket ?? process.env.AWS_S3_BUCKET ?? ''\n const endpoint = options.endpoint ?? process.env.AWS_S3_ENDPOINT ?? ''\n const forcePathStyle = options.forcePathStyle ?? process.env.AWS_S3_FORCE_PATH_STYLE === 'true'\n\n return s3Storage({\n enabled: Boolean(bucket),\n collections: {\n [options.collection ?? 'media']: true,\n },\n bucket,\n config: {\n credentials: {\n accessKeyId: options.accessKeyId ?? process.env.AWS_ACCESS_KEY_ID ?? '',\n secretAccessKey: options.secretAccessKey ?? process.env.AWS_SECRET_ACCESS_KEY ?? '',\n },\n region: options.region ?? process.env.AWS_S3_REGION ?? 'us-east-1',\n ...(endpoint ? { endpoint } : {}),\n ...(forcePathStyle ? { forcePathStyle: true } : {}),\n },\n })\n}\n","import type { AccessHelpers } from '../shared/access.js'\nimport type { GlobalConfig, Validate } from 'payload'\n\nconst validateBannerId: Validate<string | null | undefined, { enabled?: boolean | null }> = (\n value,\n { siblingData }\n) => {\n if (siblingData?.enabled && !String(value ?? '').trim()) {\n return 'Banner ID is required when the banner is enabled.'\n }\n return true\n}\n\n/** Announcement banner global (no site revalidation — add via applyGlobalOverride hooks). */\nexport function createAnnouncementBanner(access: AccessHelpers): GlobalConfig {\n return {\n slug: 'announcement-banner',\n label: 'Announcement Banner',\n admin: {\n description:\n 'Sticky site-wide banner shown above the main navigation. Bump Banner ID when replacing content so users who dismissed an older message in the current session see the new one.',\n },\n access: {\n read: access.publicRead,\n update: access.adminOnly,\n },\n fields: [\n {\n name: 'enabled',\n type: 'checkbox',\n defaultValue: false,\n admin: {\n description: 'When off, the banner is hidden on the public site.',\n },\n },\n {\n name: 'bannerId',\n type: 'text',\n admin: {\n description:\n 'Stable identifier for this banner version. Change it when publishing new copy so users who dismissed an older banner in this session see the update.',\n },\n validate: validateBannerId,\n },\n {\n type: 'row',\n fields: [\n {\n name: 'prefix',\n type: 'text',\n localized: true,\n maxLength: 8,\n admin: {\n width: '25%',\n description: 'Accent label (max 8 characters), e.g. \"New:\"',\n },\n },\n {\n name: 'description',\n type: 'text',\n localized: true,\n maxLength: 1000,\n admin: {\n width: '75%',\n description: 'Banner message (max 1000 characters).',\n },\n },\n ],\n },\n {\n type: 'row',\n fields: [\n {\n name: 'ctaLabel',\n type: 'text',\n localized: true,\n maxLength: 18,\n admin: {\n width: '50%',\n description: 'Optional button label (max 18 characters).',\n },\n },\n {\n name: 'ctaHref',\n type: 'text',\n admin: {\n width: '50%',\n description: 'Optional button URL. Relative paths stay in-site.',\n },\n },\n ],\n },\n ],\n }\n}\n"],"mappings":"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AAQ;GACN;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,WAAW;GACb;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,QAAQ;IACR,OAAO;KACL,UAAU;KACV,aAAa;IACf;IACA,OAAO,EAAE,gBAAgB,CAAC,OAAO,EAAE;GACrC;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,WAAW;IACX,OAAO,EACL,aAAa,iEACf;GACF;GACA;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,OAAO,EACL,aAAa,gEACf;GACF;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,OAAO;KACL,UAAU;KACV,MAAM;MAAE,kBAAkB;MAAc,eAAe;KAAqB;KAC5E,aAAa;IACf;GACF;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,UAAU;IACV,OAAO;KACL,UAAU;KACV,MAAM;MAAE,kBAAkB;MAAc,eAAe;KAAqB;KAC5E,aAAa;IACf;GACF;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,UAAU;IACV,OAAO;KACL,UAAU;KACV,aACE;IACJ;GACF;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,WAAW;IACX,OAAO,EACL,aAAa,oDACf;GACF;GACA;IACE,MAAM;IACN,MAAM;IACN,YAAY;IACZ,UAAU;IACV,OAAO;KACL,UAAU;KACV,aAAa;IACf;GACF;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,cAAc;IACd,SAAS,CACP;KAAE,OAAO;KAAiB,OAAO;IAAO,GACxC;KAAE,OAAO;KAAmB,OAAO;IAAW,CAChD;IACA,OAAO;KACL,UAAU;KACV,aACE;IACJ;GACF;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,WAAW;IACX,OAAO,EACL,aAAa,yEACf;GACF;GACA;IACE,MAAM;IACN,MAAM;IACN,UAAU;IACV,UAAU;IACV,OAAO,EACL,aACE,kGACJ;GACF;GACA;IACE,MAAM;IACN,MAAM;IACN,WAAW;IACX,QAAQ,eAAe;IACvB,OAAO,EACL,aAAa,kDACf;GACF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KAAK,GACpD,OAAO;CAET,OAAO;AACT;;AAGA,SAAgB,yBAAyB,QAAqC;CAC5E,OAAO;EACL,MAAM;EACN,OAAO;EACP,OAAO,EACL,aACE,iLACJ;EACA,QAAQ;GACN,MAAM,OAAO;GACb,QAAQ,OAAO;EACjB;EACA,QAAQ;GACN;IACE,MAAM;IACN,MAAM;IACN,cAAc;IACd,OAAO,EACL,aAAa,qDACf;GACF;GACA;IACE,MAAM;IACN,MAAM;IACN,OAAO,EACL,aACE,uJACJ;IACA,UAAU;GACZ;GACA;IACE,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM;KACN,WAAW;KACX,WAAW;KACX,OAAO;MACL,OAAO;MACP,aAAa;KACf;IACF,GACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;KACX,WAAW;KACX,OAAO;MACL,OAAO;MACP,aAAa;KACf;IACF,CACF;GACF;GACA;IACE,MAAM;IACN,QAAQ,CACN;KACE,MAAM;KACN,MAAM;KACN,WAAW;KACX,WAAW;KACX,OAAO;MACL,OAAO;MACP,aAAa;KACf;IACF,GACA;KACE,MAAM;KACN,MAAM;KACN,OAAO;MACL,OAAO;MACP,aAAa;KACf;IACF,CACF;GACF;EACF;CACF;AACF"}
1
+ {"version":3,"file":"cms.mjs","names":[],"sources":["../src/cms/shared/access.ts","../src/cms/shared/roles.ts","../src/cms/collections/createApiTokens.ts","../src/cms/hooks/slugify.ts","../src/cms/collections/createCmsRoles.ts","../src/cms/shared/seo-fields.ts","../src/cms/collections/createAuthors.ts","../src/cms/blocks/language-options.ts","../src/cms/blocks/code.ts","../src/cms/blocks/code-tabs.ts","../src/cms/blocks/custom-html.ts","../src/cms/blocks/download-cta.ts","../src/cms/blocks/image.ts","../src/cms/blocks/video.ts","../src/cms/lexical/editor.ts","../src/cms/blocks/rich-text.ts","../src/cms/blocks/steps.ts","../src/cms/blocks/leaf-blocks.ts","../src/cms/blocks/accordion.ts","../src/cms/blocks/section-heading.ts","../src/cms/blocks/index.ts","../src/cms/hooks/coerce-blog-post-categories.ts","../src/cms/hooks/set-published-at.ts","../src/cms/shared/drafts-with-autosave.ts","../src/cms/collections/createBlogPosts.ts","../src/cms/collections/createCategories.ts","../src/cms/collections/createChangelog.ts","../src/cms/collections/createChangelogTags.ts","../src/cms/collections/createEventTags.ts","../src/cms/collections/createEvents.ts","../src/cms/collections/createMedia.ts","../src/cms/collections/createPages.ts","../src/cms/collections/createUsers.ts","../src/cms/globals/createSiteSettings.ts","../src/cms/applyOverride.ts","../src/cms/overrides.ts","../src/cms/buildCmsConfig.ts","../src/cms/requireEnv.ts","../src/cms/createS3MediaPlugin.ts","../src/cms/globals/createAnnouncementBanner.ts"],"sourcesContent":["import type { Access, FieldAccess, PayloadRequest } from 'payload'\nimport type { RolesOptions } from './roles.js'\n\nexport type AccessOptions = {\n /**\n * When true, disabled `api-tokens` users are denied public reads.\n * Defaults to on when the stock `api-tokens` collection is enabled.\n */\n apiTokens?: boolean\n /**\n * Turn on Admin / Moderator / Developer. `true` uses the defaults.\n * `collections` / `globals` are the permissions seeded into Roles on first boot.\n * After that, edit them in the admin. Omit to keep every CMS user as a full admin.\n */\n roles?: true | RolesOptions\n}\n\nexport type AccessHelpers = {\n adminOnly: ({ req }: { req: PayloadRequest }) => boolean\n adminOrPublished: Access\n publicRead: Access\n /**\n * Media documents (list / by id / count) stay restricted; static files stay public.\n * Payload sets `isReadingStaticFile` when serving `/api/media/file/*`.\n */\n mediaRead: Access\n adminOnlyField: FieldAccess\n}\n\nconst isAdminUser = (req: PayloadRequest): boolean => req.user?.collection === 'users'\n\nconst isDisabledApiToken = (req: PayloadRequest): boolean =>\n req.user?.collection === 'api-tokens' && req.user?.enabled === false\n\n/**\n * Build access helpers. Pass `{ apiTokens: true }` when the `api-tokens`\n * collection is registered (stock by default via `buildCmsConfig`).\n */\nexport function createAccessHelpers(options: AccessOptions = {}): AccessHelpers {\n const apiTokens = options.apiTokens === true\n\n const adminOnly = ({ req }: { req: PayloadRequest }): boolean => isAdminUser(req)\n\n const adminOrPublished: Access = ({ req }) => {\n if (isAdminUser(req)) return true\n if (apiTokens && isDisabledApiToken(req)) return false\n return { _status: { equals: 'published' } }\n }\n\n const publicRead: Access = ({ req }) => {\n if (apiTokens && isDisabledApiToken(req)) return false\n return true\n }\n\n // Files via /api/media/file/* pass isReadingStaticFile; document REST reads do not.\n const mediaRead: Access = ({ req, isReadingStaticFile }) => {\n if (isReadingStaticFile) return true\n if (isAdminUser(req)) return true\n if (req.user?.collection === 'api-tokens') return !(apiTokens && isDisabledApiToken(req))\n return false\n }\n\n const adminOnlyField: FieldAccess = ({ req }) => isAdminUser(req)\n\n return { adminOnly, adminOrPublished, publicRead, mediaRead, adminOnlyField }\n}\n","import type {\n Access,\n CollectionConfig,\n Field,\n FieldAccess,\n GlobalConfig,\n Payload,\n Where,\n} from 'payload'\nimport type { StockCollectionSlug } from '../overrides.js'\n\nexport const ADMIN_ROLE = 'admin'\nexport const CMS_ROLES_SLUG = 'cms-roles'\n\nexport type RoleOption = {\n label: string\n value: string\n}\n\nexport type RoleRule = {\n /** Roles that may create, update, and see this in the admin. Admin is always included. */\n roles: readonly string[]\n /** Other callers only receive published documents. */\n drafts?: boolean\n}\n\nexport type RolesOptions = {\n /**\n * Replaces Moderator and Developer. Admin is always kept.\n * Omit to keep the defaults.\n */\n roles?: readonly RoleOption[]\n /** Appended after `roles` or the defaults. A repeated value replaces the label. */\n extraRoles?: readonly RoleOption[]\n /**\n * Replaces the default rule for that collection. Unknown slugs are for site collections;\n * read them back with `collectionRoleRule`.\n * `false` hides it from everyone except Admin and blocks create, update, and delete.\n */\n collections?: Partial<Record<string, RoleRule | false>>\n /**\n * Replaces the default rule for a stock global, or sets one for a site global.\n * `false` hides it from everyone except Admin and blocks updates.\n */\n globals?: Partial<Record<string, RoleRule | false>>\n}\n\nconst moderator = ['moderator'] as const\nconst developer = ['developer'] as const\nconst moderatorAndDeveloper = ['moderator', 'developer'] as const\n\nexport const DEFAULT_ROLES = [\n { label: 'Admin', value: ADMIN_ROLE },\n { label: 'Moderator', value: 'moderator' },\n { label: 'Developer', value: 'developer' },\n] as const satisfies readonly RoleOption[]\n\ntype RoleGatedCollection = Exclude<StockCollectionSlug, 'users'>\n\nexport const DEFAULT_COLLECTION_ROLES = {\n 'api-tokens': false,\n 'media': { roles: moderatorAndDeveloper },\n 'authors': { roles: moderator },\n 'categories': { roles: moderator },\n 'blog-posts': { roles: moderator, drafts: true },\n 'pages': { roles: moderator, drafts: true },\n 'legal-pages': { roles: moderator, drafts: true },\n 'changelog-tags': { roles: developer },\n 'changelog': { roles: developer, drafts: true },\n 'event-tags': { roles: moderator },\n 'events': { roles: moderator, drafts: true },\n} as const satisfies Partial<Record<RoleGatedCollection, RoleRule | false>>\n\nexport const DEFAULT_GLOBAL_ROLES = {\n 'site-settings': false,\n 'announcement-banner': { roles: moderator },\n} as const satisfies Record<string, RoleRule | false>\n\nexport type RolePermission = {\n target: string\n create: boolean\n update: boolean\n delete: boolean\n drafts: boolean\n}\n\nexport type RoleSeed = {\n name: string\n slug: string\n fullAccess: boolean\n permissions: RolePermission[]\n}\n\ntype RoleRecord = RoleSeed & { id: string }\n\ntype CmsUserLike = {\n collection?: string\n id?: string | number\n roles?: unknown\n}\n\ntype PermissionAction = 'create' | 'update' | 'delete' | 'drafts'\n\nlet roleCache: { byId: Map<string, RoleRecord>; bySlug: Map<string, RoleRecord> } | null = null\n\nfunction asCmsUser(user: unknown): CmsUserLike | null {\n if (!user || typeof user !== 'object') return null\n const record = user as CmsUserLike\n if (record.collection !== 'users') return null\n return record\n}\n\nfunction roleRefs(roles: unknown): { ids: string[]; slugs: string[] } {\n if (!Array.isArray(roles)) return { ids: [], slugs: [] }\n const ids: string[] = []\n const slugs: string[] = []\n roles.forEach((role) => {\n if (typeof role === 'string' || typeof role === 'number') {\n const value = String(role)\n if (/^[a-f0-9]{24}$/i.test(value)) ids.push(value)\n else if (value) slugs.push(value)\n return\n }\n if (role && typeof role === 'object' && 'id' in role && role.id != null) {\n ids.push(String(role.id))\n }\n })\n return { ids, slugs }\n}\n\nfunction readPermissions(value: unknown): RolePermission[] {\n if (!Array.isArray(value)) return []\n return value.flatMap((entry) => {\n if (!entry || typeof entry !== 'object' || !('target' in entry)) return []\n const row = entry as Partial<RolePermission>\n if (!row.target) return []\n return [\n {\n target: row.target,\n create: Boolean(row.create),\n update: Boolean(row.update),\n delete: Boolean(row.delete),\n drafts: Boolean(row.drafts),\n },\n ]\n })\n}\n\nexport async function refreshRoleCache(payload: Payload): Promise<void> {\n const found = await payload.find({\n collection: CMS_ROLES_SLUG,\n depth: 0,\n limit: 500,\n pagination: false,\n overrideAccess: true,\n })\n const byId = new Map<string, RoleRecord>()\n const bySlug = new Map<string, RoleRecord>()\n found.docs.forEach((doc) => {\n const record = doc as {\n id: string | number\n name?: string\n slug?: string\n fullAccess?: boolean\n permissions?: unknown\n }\n if (!record.slug) return\n const role: RoleRecord = {\n id: String(record.id),\n name: record.name ?? record.slug,\n slug: record.slug,\n fullAccess: Boolean(record.fullAccess) || record.slug === ADMIN_ROLE,\n permissions: readPermissions(record.permissions),\n }\n byId.set(role.id, role)\n bySlug.set(role.slug, role)\n })\n roleCache = { byId, bySlug }\n}\n\nasync function ensureRoleCache(payload: Payload): Promise<NonNullable<typeof roleCache>> {\n if (!roleCache) await refreshRoleCache(payload)\n return roleCache ?? { byId: new Map(), bySlug: new Map() }\n}\n\ntype SyncAssignment = 'guest' | 'admin' | 'unknown' | RoleRecord[]\n\nfunction lookupRoles(\n refs: { ids: string[]; slugs: string[] },\n cache: NonNullable<typeof roleCache>\n): RoleRecord[] {\n return [\n ...refs.ids.map((id) => cache.byId.get(id)),\n ...refs.slugs.map((slug) => cache.bySlug.get(slug)),\n ].filter((role): role is RoleRecord => Boolean(role))\n}\n\nfunction syncAssignment(user: unknown): SyncAssignment {\n const record = asCmsUser(user)\n if (!record) return 'guest'\n const refs = roleRefs(record.roles)\n if (refs.ids.length === 0 && refs.slugs.length === 0) return 'admin'\n if (!roleCache) return 'unknown'\n return lookupRoles(refs, roleCache)\n}\n\nasync function loadAssignment(req: {\n user?: unknown\n payload: Payload\n}): Promise<Exclude<SyncAssignment, 'unknown'>> {\n const record = asCmsUser(req.user)\n if (!record) return 'guest'\n const refs = roleRefs(record.roles)\n if (refs.ids.length === 0 && refs.slugs.length === 0) return 'admin'\n const cache = await ensureRoleCache(req.payload)\n return lookupRoles(refs, cache)\n}\n\nfunction hasPermission(roles: RoleRecord[], target: string, action: PermissionAction): boolean {\n if (roles.some((role) => role.fullAccess)) return true\n return roles.some((role) =>\n role.permissions.some((permission) => permission.target === target && permission[action])\n )\n}\n\n/**\n * `null` means this user has no roles yet and is treated as admin.\n * `true` / `false` is the cached decision. A cold cache returns `null` so the\n * nav stays visible until startup finishes loading roles.\n */\nfunction cachedPermission(user: unknown, target: string, action: PermissionAction): boolean | null {\n const assigned = syncAssignment(user)\n if (assigned === 'guest') return false\n if (assigned === 'admin') return true\n if (assigned === 'unknown') return null\n return hasPermission(assigned, target, action)\n}\n\nexport async function userIsFullAdmin(req: { user?: unknown; payload: Payload }): Promise<boolean> {\n const assigned = await loadAssignment(req)\n if (assigned === 'guest') return false\n if (assigned === 'admin') return true\n return assigned.some((role) => role.fullAccess)\n}\n\nasync function userCan(\n req: { user?: unknown; payload: Payload },\n target: string,\n action: PermissionAction\n): Promise<boolean> {\n const assigned = await loadAssignment(req)\n if (assigned === 'guest') return false\n if (assigned === 'admin') return true\n return hasPermission(assigned, target, action)\n}\n\n/**\n * Users created before the roles field existed have none stored.\n * Treat that as admin so turning roles on does not lock the panel.\n */\nexport function effectiveRoles(user: unknown): string[] {\n const assigned = syncAssignment(user)\n if (assigned === 'admin') return [ADMIN_ROLE]\n if (assigned === 'guest' || assigned === 'unknown') return []\n return assigned.map((role) => role.slug)\n}\n\nexport function userHasAnyRole(user: unknown, roles: readonly string[]): boolean {\n const assigned = effectiveRoles(user)\n if (assigned.includes(ADMIN_ROLE)) return true\n return roles.some((role) => assigned.includes(role))\n}\n\nexport function isCmsAdmin(user: unknown): boolean {\n const assigned = syncAssignment(user)\n if (assigned === 'admin') return true\n if (assigned === 'guest' || assigned === 'unknown') return false\n return assigned.some((role) => role.fullAccess)\n}\n\nexport const adminRoleAccess: Access = ({ req }) => userIsFullAdmin(req)\n\nexport function hiddenUnless(roles: readonly string[]) {\n return ({ user }: { user: unknown }) => !userHasAnyRole(user, roles)\n}\n\nexport function writeAccess(roles: readonly string[]): Access {\n return ({ req }) => userHasAnyRole(req.user, roles)\n}\n\nexport function publishedOrRoleRead(roles: readonly string[]): Access {\n return ({ req }) => {\n if (userHasAnyRole(req.user, roles)) return true\n const where: Where = { _status: { equals: 'published' } }\n return where\n }\n}\n\nconst selfOrAdminAccess: Access = async ({ req }) => {\n if (await userIsFullAdmin(req)) return true\n const record = asCmsUser(req.user)\n if (record?.id == null) return false\n const where: Where = { id: { equals: record.id } }\n return where\n}\n\nconst manageRolesAccess: FieldAccess = ({ req }) => userIsFullAdmin(req)\n\nfunction hiddenFor(target: string) {\n return ({ user }: { user: unknown }) => {\n const create = cachedPermission(user, target, 'create')\n const update = cachedPermission(user, target, 'update')\n const drafts = cachedPermission(user, target, 'drafts')\n if (create == null || update == null || drafts == null) return false\n return !(create || update || drafts)\n }\n}\n\nexport function hiddenUnlessFullAdmin() {\n return ({ user }: { user: unknown }) => {\n const assigned = syncAssignment(user)\n if (assigned === 'unknown' || assigned === 'admin') return false\n if (assigned === 'guest') return true\n return !assigned.some((role) => role.fullAccess)\n }\n}\n\nexport function resolveRoleOptions(options: RolesOptions = {}): RoleOption[] {\n const custom =\n options.roles?.filter((role) => role.value !== ADMIN_ROLE) ??\n DEFAULT_ROLES.filter((role) => role.value !== ADMIN_ROLE)\n const merged = new Map<string, RoleOption>([[ADMIN_ROLE, { label: 'Admin', value: ADMIN_ROLE }]])\n ;[...custom, ...(options.extraRoles ?? [])].forEach((role) => {\n if (!role.value || role.value === ADMIN_ROLE) return\n merged.set(role.value, { label: role.label, value: role.value })\n })\n return [...merged.values()]\n}\n\nexport function collectionRoleRule(\n options: true | RolesOptions | undefined,\n slug: string,\n fallback?: RoleRule | false\n): RoleRule | false | undefined {\n return roleRule(options, 'collections', slug, fallback)\n}\n\nexport function globalRoleRule(\n options: true | RolesOptions | undefined,\n slug: string,\n fallback?: RoleRule | false\n): RoleRule | false | undefined {\n return roleRule(options, 'globals', slug, fallback)\n}\n\nfunction roleRule(\n options: true | RolesOptions | undefined,\n kind: 'collections' | 'globals',\n slug: string,\n fallback?: RoleRule | false\n): RoleRule | false | undefined {\n const config = options === true || options == null ? {} : options\n const overrides = config[kind]\n if (overrides && Object.prototype.hasOwnProperty.call(overrides, slug)) {\n return (overrides as Record<string, RoleRule | false | undefined>)[slug]\n }\n const defaults = kind === 'collections' ? DEFAULT_COLLECTION_ROLES : DEFAULT_GLOBAL_ROLES\n if (Object.prototype.hasOwnProperty.call(defaults, slug)) {\n return defaults[slug as keyof typeof defaults]\n }\n return fallback\n}\n\nfunction rolesField(): Field {\n return {\n name: 'roles',\n type: 'relationship',\n relationTo: CMS_ROLES_SLUG,\n hasMany: true,\n saveToJWT: true,\n access: {\n create: manageRolesAccess,\n update: manageRolesAccess,\n },\n admin: {\n position: 'sidebar',\n description:\n 'Only an admin can change roles. Several roles can be combined. Empty means Admin until a role is saved. The user must sign in again before a change applies.',\n },\n }\n}\n\nfunction permissionFor(\n target: string,\n rule: RoleRule | false | undefined,\n role: string,\n collection: boolean\n): RolePermission | null {\n if (rule == null || rule === false || !rule.roles.includes(role)) return null\n return {\n target,\n create: collection,\n update: true,\n delete: false,\n drafts: collection && rule.drafts === true,\n }\n}\n\n/** Targets shown in the Roles editor: stock defaults plus anything the app configures. */\nexport function roleTargetSlugs(options: RolesOptions = {}): string[] {\n const targets = new Set<string>([\n ...Object.keys(DEFAULT_COLLECTION_ROLES),\n ...Object.keys(DEFAULT_GLOBAL_ROLES),\n ...Object.keys(options.collections ?? {}),\n ...Object.keys(options.globals ?? {}),\n ])\n targets.delete('users')\n targets.delete(CMS_ROLES_SLUG)\n return [...targets].sort()\n}\n\n/**\n * Default role documents. Existing documents with the same slug are left alone,\n * so edits made in the admin survive a restart.\n */\nexport function buildRoleSeeds(options: RolesOptions = {}): RoleSeed[] {\n const roles = resolveRoleOptions(options)\n const targets = roleTargetSlugs(options)\n return roles.map((role) => {\n if (role.value === ADMIN_ROLE) {\n return { name: role.label, slug: role.value, fullAccess: true, permissions: [] }\n }\n const permissions = targets.flatMap((target) => {\n const collection = collectionRoleRule(options, target)\n const global = globalRoleRule(options, target)\n const rule = collection !== undefined ? collection : global\n const row = permissionFor(target, rule, role.value, collection !== undefined)\n return row ? [row] : []\n })\n return { name: role.label, slug: role.value, fullAccess: false, permissions }\n })\n}\n\ntype RoleTarget = CollectionConfig | GlobalConfig\n\nfunction isCollectionConfig(config: RoleTarget): config is CollectionConfig {\n if ('auth' in config || 'upload' in config || 'labels' in config || 'defaultSort' in config) {\n return true\n }\n return Boolean(config.access && ('create' in config.access || 'delete' in config.access))\n}\n\n/** Limits create, update, and delete from the Roles collection. Admin is always allowed. */\nexport function withRoles<T extends RoleTarget>(config: T): T {\n const collection = isCollectionConfig(config)\n const users = collection && Boolean(config.auth)\n const slug = config.slug\n const versioned = 'versions' in config && Boolean(config.versions)\n\n return {\n ...config,\n admin: {\n ...config.admin,\n ...(users ? { hidden: hiddenUnlessFullAdmin() } : { hidden: hiddenFor(slug) }),\n },\n access: {\n ...config.access,\n ...(collection\n ? {\n create: users ? adminRoleAccess : ({ req }) => userCan(req, slug, 'create'),\n delete: users ? adminRoleAccess : ({ req }) => userCan(req, slug, 'delete'),\n }\n : {}),\n ...(users\n ? { read: selfOrAdminAccess, update: selfOrAdminAccess }\n : { update: ({ req }) => userCan(req, slug, 'update') }),\n ...(versioned && !users\n ? {\n read: async ({ req }) => {\n if ((await userCan(req, slug, 'update')) || (await userCan(req, slug, 'drafts'))) {\n return true\n }\n const where: Where = { _status: { equals: 'published' } }\n return where\n },\n }\n : {}),\n },\n ...(users && !(config.fields ?? []).some((field) => 'name' in field && field.name === 'roles')\n ? { fields: [...(config.fields ?? []), rolesField()] }\n : {}),\n } as T\n}\n","import type { AccessHelpers } from '../shared/access.js'\nimport type { Access, CollectionConfig } from 'payload'\n\nconst adminOrSelf: Access = ({ req }) => {\n if (req.user?.collection === 'users') return true\n if (req.user?.collection === 'api-tokens') return { id: { equals: req.user.id } }\n return false\n}\n\n/**\n * Stock API-key auth collection for server-to-server Payload REST/GraphQL clients.\n * Disable per site with `overrides['api-tokens'] = false`.\n */\nexport function createApiTokens(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'api-tokens',\n labels: {\n singular: 'API Token',\n plural: 'API Tokens',\n },\n admin: {\n useAsTitle: 'name',\n defaultColumns: ['name', 'description', 'enabled', 'createdAt'],\n description:\n 'Server-to-server tokens for non-admin clients calling the Payload REST/GraphQL API. ' +\n 'Each token authenticates as an api-tokens user and is restricted to published, public-readable content.',\n },\n auth: {\n useAPIKey: true,\n disableLocalStrategy: true,\n },\n access: {\n read: adminOrSelf,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n admin: access.adminOnly,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n admin: {\n description: 'Human-readable label, e.g. \"mobile-app-prod\" or \"partner-foo\".',\n },\n },\n {\n name: 'description',\n type: 'textarea',\n admin: {\n description: 'Who is this token for and what is it used for? Free-form notes.',\n },\n },\n {\n name: 'enabled',\n type: 'checkbox',\n defaultValue: true,\n admin: {\n position: 'sidebar',\n description:\n 'Disable to soft-revoke. To hard-revoke, clear the API Key field or delete the document.',\n },\n },\n ],\n }\n}\n","import type { FieldHook } from 'payload'\n\nexport const slugify: FieldHook = ({ value }) =>\n typeof value === 'string'\n ? value\n .toLowerCase()\n .replace(/\\s+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n : value\n","import { slugify } from '../hooks/slugify.js'\nimport {\n ADMIN_ROLE,\n CMS_ROLES_SLUG,\n buildRoleSeeds,\n hiddenUnlessFullAdmin,\n refreshRoleCache,\n userIsFullAdmin,\n type RolesOptions,\n} from '../shared/roles.js'\n\nimport type {\n CollectionAfterChangeHook,\n CollectionAfterDeleteHook,\n CollectionBeforeChangeHook,\n CollectionBeforeDeleteHook,\n CollectionConfig,\n Payload,\n PayloadRequest,\n} from 'payload'\n\nconst refresh: CollectionAfterChangeHook = ({ req }) => refreshRoleCache(req.payload)\n\nconst refreshAfterDelete: CollectionAfterDeleteHook = ({ req }) => refreshRoleCache(req.payload)\n\nconst keepAdminRole: CollectionBeforeChangeHook = ({ data, originalDoc }) => {\n if (originalDoc?.slug === ADMIN_ROLE || data?.slug === ADMIN_ROLE) {\n return { ...data, slug: ADMIN_ROLE, fullAccess: true }\n }\n return data\n}\n\nconst blockAdminDelete: CollectionBeforeDeleteHook = async ({ id, req }) => {\n const doc = await req.payload.findByID({\n collection: CMS_ROLES_SLUG,\n id,\n depth: 0,\n overrideAccess: true,\n })\n if (doc.slug === ADMIN_ROLE) {\n throw new Error('The Admin role cannot be deleted.')\n }\n}\n\nconst fullAdmin = ({ req }: { req: PayloadRequest }) => userIsFullAdmin(req)\n\nexport function createCmsRoles(targets: readonly string[]): CollectionConfig {\n return {\n slug: CMS_ROLES_SLUG,\n labels: { singular: 'Role', plural: 'Roles' },\n admin: {\n useAsTitle: 'name',\n hidden: hiddenUnlessFullAdmin(),\n description: 'Who can edit each collection and global. Only an admin can change this.',\n },\n access: {\n read: fullAdmin,\n create: fullAdmin,\n update: fullAdmin,\n delete: fullAdmin,\n },\n hooks: {\n beforeChange: [keepAdminRole],\n beforeDelete: [blockAdminDelete],\n afterChange: [refresh],\n afterDelete: [refreshAfterDelete],\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n index: true,\n hooks: { beforeValidate: [slugify] },\n admin: { description: 'Stable id. Do not change it after users are assigned this role.' },\n },\n {\n name: 'fullAccess',\n type: 'checkbox',\n defaultValue: false,\n admin: { description: 'Can edit every collection, including Roles and Users.' },\n },\n {\n name: 'permissions',\n type: 'array',\n admin: {\n condition: (data) => !data?.fullAccess,\n description: 'One row per collection or global. No row means no access.',\n },\n fields: [\n {\n name: 'target',\n type: 'select',\n required: true,\n options: targets.map((slug) => ({ label: slug, value: slug })),\n },\n { name: 'create', type: 'checkbox', defaultValue: false },\n { name: 'update', type: 'checkbox', defaultValue: false },\n { name: 'delete', type: 'checkbox', defaultValue: false },\n {\n name: 'drafts',\n type: 'checkbox',\n defaultValue: false,\n admin: { description: 'Can open unpublished documents. Update also allows this.' },\n },\n ],\n },\n ],\n }\n}\n\n/** Creates each default role once. Documents that already exist are left as edited. */\nexport async function seedDefaultCmsRoles(\n payload: Payload,\n options: RolesOptions = {}\n): Promise<void> {\n const seeds = buildRoleSeeds(options)\n await Promise.all(\n seeds.map(async (role) => {\n const existing = await payload.find({\n collection: CMS_ROLES_SLUG,\n where: { slug: { equals: role.slug } },\n limit: 1,\n depth: 0,\n overrideAccess: true,\n })\n if (existing.docs.length > 0) return\n await payload.create({\n collection: CMS_ROLES_SLUG,\n data: role,\n overrideAccess: true,\n })\n })\n )\n}\n","import type { GroupField, Validate } from 'payload'\n\nconst MAX_META_TITLE = 60\nconst MAX_META_DESCRIPTION = 160\n\nconst validateMetaTitle: Validate<string | null | undefined> = (value) => {\n if (!value || value.trim().length === 0) return 'Meta title is required.'\n if (value.length > MAX_META_TITLE)\n return `Meta title must be ${MAX_META_TITLE} characters or fewer (currently ${value.length}).`\n return true\n}\n\nconst validateMetaDescription: Validate<string | null | undefined> = (value) => {\n if (!value || value.trim().length === 0) return 'Meta description is required.'\n if (value.length > MAX_META_DESCRIPTION)\n return `Meta description must be ${MAX_META_DESCRIPTION} characters or fewer (currently ${value.length}).`\n return true\n}\n\nconst validateUrl: Validate<string | null | undefined> = (value) => {\n if (!value) return true\n try {\n new URL(value)\n return true\n } catch {\n return 'Must be a valid URL (e.g. https://example.com/page).'\n }\n}\n\nexport const seoFields: GroupField = {\n name: 'seo',\n type: 'group',\n label: 'SEO',\n fields: [\n {\n name: 'metaTitle',\n type: 'text',\n required: true,\n localized: true,\n maxLength: MAX_META_TITLE,\n validate: validateMetaTitle,\n admin: {\n description: `Required. ${MAX_META_TITLE} characters max — shown in browser tabs and search results.`,\n },\n },\n {\n name: 'metaDescription',\n type: 'textarea',\n required: true,\n localized: true,\n validate: validateMetaDescription,\n admin: {\n description: `Required. ${MAX_META_DESCRIPTION} characters max — shown in search result snippets.`,\n },\n },\n {\n name: 'ogImage',\n type: 'upload',\n relationTo: 'media',\n admin: {\n description:\n 'Used when the page is shared on social media (1200×630 recommended). Falls back to cover image if empty.',\n },\n },\n {\n name: 'canonicalUrl',\n type: 'text',\n validate: validateUrl,\n admin: {\n description: 'Override for syndicated content. Leave empty to auto-derive from slug.',\n },\n },\n {\n name: 'noIndex',\n type: 'checkbox',\n defaultValue: false,\n admin: {\n description: 'When checked, search engines will not index this page.',\n },\n },\n {\n name: 'noFollow',\n type: 'checkbox',\n defaultValue: false,\n admin: {\n description:\n 'When checked, search engines will not follow links on this page (paired with noIndex if needed).',\n },\n },\n ],\n}\n","import { slugify } from '../hooks/slugify.js'\nimport { seoFields } from '../shared/seo-fields.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\nexport function createAuthors(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'authors',\n admin: {\n useAsTitle: 'name',\n defaultColumns: ['name', 'slug', 'role'],\n },\n access: {\n read: access.publicRead,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: { position: 'sidebar' },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'avatar',\n type: 'upload',\n relationTo: 'media',\n },\n {\n name: 'role',\n type: 'text',\n localized: true,\n admin: {\n description: 'Job title or role (e.g. \"Lead Engineer\")',\n },\n },\n {\n name: 'bio',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'social',\n type: 'group',\n label: 'Social Profiles',\n admin: { position: 'sidebar' },\n fields: [\n { name: 'website', type: 'text' },\n { name: 'twitter', type: 'text', admin: { description: '@handle or full URL' } },\n { name: 'linkedin', type: 'text' },\n { name: 'github', type: 'text' },\n ],\n },\n {\n ...seoFields,\n fields: [\n ...seoFields.fields,\n {\n name: 'jsonLd',\n type: 'group',\n label: 'Structured Data Overrides',\n admin: {\n description: 'Used in JSON-LD Person schema on author pages and article bylines.',\n },\n fields: [\n {\n name: 'jobTitle',\n type: 'text',\n admin: { description: 'schema.org jobTitle (defaults to role if empty)' },\n },\n {\n name: 'worksFor',\n type: 'text',\n admin: { description: 'Organization name for schema.org worksFor' },\n },\n {\n name: 'sameAs',\n type: 'array',\n admin: {\n description: 'Extra canonical URLs for this person (Wikipedia, Crunchbase, etc.)',\n },\n fields: [{ name: 'url', type: 'text', required: true }],\n },\n ],\n },\n ],\n },\n ],\n }\n}\n","/** Shared language options for CMS code blocks and Lexical CodeBlock feature. */\nexport const languageOptions = [\n { label: 'TypeScript', value: 'typescript' },\n { label: 'JavaScript', value: 'javascript' },\n { label: 'Python', value: 'python' },\n { label: 'Bash / Shell', value: 'bash' },\n { label: 'Shell', value: 'shell' },\n { label: 'JSON', value: 'json' },\n { label: 'CSS', value: 'css' },\n { label: 'HTML', value: 'html' },\n { label: 'Rust', value: 'rust' },\n { label: 'Go', value: 'go' },\n { label: 'YAML', value: 'yaml' },\n { label: 'Markdown', value: 'markdown' },\n { label: 'Plain Text', value: 'plaintext' },\n]\n\nexport const codeBlockLanguages: Record<string, string> = Object.fromEntries(\n languageOptions.map((opt) => [opt.value, opt.label])\n)\n\nexport const defaultCodeLanguage = 'plaintext'\n","import { languageOptions } from './language-options.js'\n\nimport type { Block } from 'payload'\n\nexport const codeBlock: Block = {\n slug: 'code',\n labels: { singular: 'Code Block', plural: 'Code Blocks' },\n fields: [\n {\n name: 'language',\n type: 'select',\n defaultValue: 'typescript',\n options: languageOptions,\n },\n {\n name: 'filename',\n type: 'text',\n admin: { description: 'Optional filename label shown above the block' },\n },\n {\n name: 'code',\n type: 'code',\n required: true,\n admin: { language: 'typescript' },\n },\n ],\n}\n","import { languageOptions } from './language-options.js'\n\nimport type { Block } from 'payload'\n\nexport const codeTabsBlock: Block = {\n slug: 'code-tabs',\n labels: { singular: 'Code Tabs', plural: 'Code Tabs' },\n fields: [\n {\n name: 'tabs',\n type: 'array',\n required: true,\n minRows: 1,\n fields: [\n {\n name: 'label',\n type: 'text',\n required: true,\n admin: { description: 'Tab label (e.g. Windows, Linux, Android)' },\n },\n {\n name: 'language',\n type: 'select',\n defaultValue: 'bash',\n options: languageOptions,\n },\n {\n name: 'code',\n type: 'code',\n required: true,\n admin: { language: 'bash' },\n },\n ],\n },\n ],\n}\n","import type { Block } from 'payload'\n\nexport const customHtmlBlock: Block = {\n slug: 'custom-html',\n labels: { singular: 'Custom HTML', plural: 'Custom HTML' },\n fields: [\n {\n name: 'html',\n type: 'code',\n required: true,\n localized: true,\n admin: {\n language: 'html',\n description:\n 'Raw HTML, CSS, and scripts. Rendered as-is. Inline scripts run in the browser, same as a WordPress Custom HTML block.',\n },\n },\n ],\n}\n","import type { Block } from 'payload'\n\nexport const downloadCtaBlock: Block = {\n slug: 'download-cta',\n labels: { singular: 'Download CTA', plural: 'Download CTAs' },\n fields: [\n {\n name: 'eyebrow',\n type: 'text',\n localized: true,\n },\n {\n name: 'heading',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'headingAccent',\n type: 'text',\n localized: true,\n },\n {\n name: 'description',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'submitLabel',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'downloadUrl',\n type: 'text',\n required: true,\n },\n {\n name: 'downloadLabel',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'successMessage',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'consent',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'footnote',\n type: 'textarea',\n localized: true,\n },\n ],\n}\n","import type { Block } from 'payload'\n\nexport const imageBlock: Block = {\n slug: 'image',\n labels: { singular: 'Image', plural: 'Images' },\n fields: [\n {\n name: 'image',\n type: 'upload',\n relationTo: 'media',\n required: true,\n },\n {\n name: 'caption',\n type: 'text',\n localized: true,\n },\n {\n name: 'size',\n type: 'select',\n defaultValue: 'full',\n options: [\n { label: 'Full Width', value: 'full' },\n { label: 'Wide', value: 'wide' },\n { label: 'Medium', value: 'medium' },\n ],\n },\n ],\n}\n","import type { Block } from 'payload'\n\nexport const videoBlock: Block = {\n slug: 'video',\n labels: { singular: 'Video', plural: 'Videos' },\n fields: [\n {\n name: 'video',\n type: 'upload',\n relationTo: 'media',\n required: true,\n filterOptions: {\n mimeType: { contains: 'video' },\n },\n },\n {\n name: 'caption',\n type: 'text',\n localized: true,\n },\n {\n name: 'size',\n type: 'select',\n defaultValue: 'full',\n options: [\n { label: 'Full Width', value: 'full' },\n { label: 'Wide', value: 'wide' },\n { label: 'Medium', value: 'medium' },\n ],\n },\n ],\n}\n","import {\n BlocksFeature,\n CodeBlock,\n EXPERIMENTAL_TableFeature,\n UploadFeature,\n editorConfigFactory,\n lexicalEditor,\n} from '@payloadcms/richtext-lexical'\n\nimport { customHtmlBlock } from '../blocks/custom-html.js'\nimport { codeBlockLanguages, defaultCodeLanguage } from '../blocks/language-options.js'\nimport { videoBlock } from '../blocks/video.js'\n\nimport type { FeatureProviderServer } from '@payloadcms/richtext-lexical'\nimport type { SanitizedConfig } from 'payload'\n\nconst richTextFeatures = ({\n defaultFeatures,\n}: {\n defaultFeatures: FeatureProviderServer[]\n rootFeatures: FeatureProviderServer[]\n}) => [\n ...defaultFeatures.filter((feature) => feature.key !== 'upload'),\n UploadFeature({\n collections: {\n media: {\n fields: [\n {\n name: 'caption',\n type: 'text',\n },\n ],\n },\n },\n }),\n BlocksFeature({\n blocks: [\n CodeBlock({\n languages: codeBlockLanguages,\n defaultLanguage: defaultCodeLanguage,\n }),\n videoBlock,\n customHtmlBlock,\n ],\n }),\n EXPERIMENTAL_TableFeature(),\n]\n\n/**\n * Shared Lexical editor for every `richText` field.\n *\n * Adds `CodeBlock`, inline `video` and `custom-html` blocks, media upload\n * captions, and `EXPERIMENTAL_TableFeature` on top of Payload defaults.\n */\n// Return type is derived from `lexicalEditor` (a public export) rather than the\n// inferred `LexicalRichTextAdapterProvider` (not re-exported), so the generated\n// declaration stays portable while keeping the narrow Lexical adapter type that\n// consumers like `editorConfigFactory.fromEditor` require.\nexport const richTextEditor = (): ReturnType<typeof lexicalEditor> =>\n lexicalEditor({\n features: richTextFeatures,\n })\n\n/** Resolve Lexical editor config for seed scripts / markdown conversion. */\nexport async function getRichTextEditorConfig(config: SanitizedConfig) {\n return editorConfigFactory.fromFeatures({\n config,\n features: richTextFeatures,\n })\n}\n","import { richTextEditor } from '../lexical/editor.js'\n\nimport type { Block } from 'payload'\n\nexport const richTextBlock: Block = {\n slug: 'rich-text',\n labels: { singular: 'Rich Text', plural: 'Rich Text Blocks' },\n fields: [\n {\n name: 'content',\n type: 'richText',\n localized: true,\n editor: richTextEditor(),\n },\n ],\n}\n","import type { Block } from 'payload'\n\nexport const stepsBlock: Block = {\n slug: 'steps',\n labels: { singular: 'Steps List', plural: 'Steps Lists' },\n fields: [\n {\n name: 'items',\n type: 'array',\n required: true,\n minRows: 1,\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'description',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'avatar',\n type: 'upload',\n relationTo: 'media',\n admin: { description: 'Optional avatar or icon shown next to the step' },\n },\n ],\n },\n ],\n}\n","import { codeBlock } from './code.js'\nimport { codeTabsBlock } from './code-tabs.js'\nimport { customHtmlBlock } from './custom-html.js'\nimport { downloadCtaBlock } from './download-cta.js'\nimport { imageBlock } from './image.js'\nimport { richTextBlock } from './rich-text.js'\nimport { stepsBlock } from './steps.js'\nimport { videoBlock } from './video.js'\n\nimport type { Block } from 'payload'\n\nexport const leafBlocks: Block[] = [\n richTextBlock,\n codeBlock,\n codeTabsBlock,\n imageBlock,\n videoBlock,\n downloadCtaBlock,\n customHtmlBlock,\n stepsBlock,\n]\n","import { leafBlocks } from './leaf-blocks.js'\n\nimport type { Block } from 'payload'\n\nexport const accordionBlock: Block = {\n slug: 'accordion',\n labels: { singular: 'Accordion', plural: 'Accordions' },\n fields: [\n {\n name: 'items',\n type: 'array',\n required: true,\n minRows: 1,\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'defaultOpen',\n type: 'checkbox',\n defaultValue: false,\n },\n {\n name: 'content',\n type: 'blocks',\n blocks: leafBlocks,\n localized: true,\n },\n ],\n },\n ],\n}\n","import type { Block } from 'payload'\n\nexport const sectionHeadingBlock: Block = {\n slug: 'section-heading',\n labels: { singular: 'Section Heading', plural: 'Section Headings' },\n fields: [\n {\n name: 'text',\n type: 'text',\n required: true,\n localized: true,\n },\n ],\n}\n","import { accordionBlock } from './accordion.js'\nimport { codeBlock } from './code.js'\nimport { codeTabsBlock } from './code-tabs.js'\nimport { customHtmlBlock } from './custom-html.js'\nimport { downloadCtaBlock } from './download-cta.js'\nimport { imageBlock } from './image.js'\nimport { richTextBlock } from './rich-text.js'\nimport { sectionHeadingBlock } from './section-heading.js'\nimport { stepsBlock } from './steps.js'\nimport { videoBlock } from './video.js'\n\nimport type { Block } from 'payload'\n\nexport { richTextBlock } from './rich-text.js'\nexport { codeBlock } from './code.js'\nexport { codeTabsBlock } from './code-tabs.js'\nexport { imageBlock } from './image.js'\nexport { videoBlock } from './video.js'\nexport { customHtmlBlock } from './custom-html.js'\nexport { downloadCtaBlock } from './download-cta.js'\nexport { stepsBlock } from './steps.js'\nexport { accordionBlock } from './accordion.js'\nexport { sectionHeadingBlock } from './section-heading.js'\nexport { leafBlocks } from './leaf-blocks.js'\nexport { languageOptions, codeBlockLanguages, defaultCodeLanguage } from './language-options.js'\n\nexport const blogContentBlocks: Block[] = [\n richTextBlock,\n codeBlock,\n codeTabsBlock,\n imageBlock,\n videoBlock,\n downloadCtaBlock,\n customHtmlBlock,\n stepsBlock,\n accordionBlock,\n]\n\nexport const pageContentBlocks: Block[] = [\n richTextBlock,\n codeBlock,\n codeTabsBlock,\n imageBlock,\n stepsBlock,\n accordionBlock,\n]\n\nexport const showcaseContentBlocks: Block[] = [\n sectionHeadingBlock,\n richTextBlock,\n codeBlock,\n imageBlock,\n]\n","import type { CollectionAfterReadHook, CollectionBeforeChangeHook } from 'payload'\n\nfunction toCategoryIdList(value: unknown): string[] {\n if (value == null || value === '') return []\n const items = Array.isArray(value) ? value : [value]\n return items\n .map((item) => {\n if (typeof item === 'string' || typeof item === 'number') return String(item)\n if (item && typeof item === 'object' && 'id' in item && item.id != null) {\n return String(item.id)\n }\n return null\n })\n .filter((id): id is string => Boolean(id))\n}\n\n/** Posts saved before `category` became `hasMany` still store a single value. */\nexport const coerceBlogPostCategoriesOnWrite: CollectionBeforeChangeHook = ({ data }) => {\n if (!data || !('category' in data)) return data\n data.category = toCategoryIdList(data.category)\n return data\n}\n\nexport const coerceBlogPostCategoriesOnRead: CollectionAfterReadHook = ({ doc }) => {\n if (!doc) return doc\n if (doc.category == null || doc.category === '') {\n doc.category = []\n return doc\n }\n if (!Array.isArray(doc.category)) {\n doc.category = [doc.category]\n }\n return doc\n}\n","import type { CollectionBeforeChangeHook } from 'payload'\n\nexport const setPublishedAt: CollectionBeforeChangeHook = ({ data }) => {\n if (data && !data.publishedAt && data._status === 'published') {\n data.publishedAt = new Date().toISOString()\n }\n return data\n}\n","import type { CollectionConfig } from 'payload'\n\nexport const draftsWithAutosave: CollectionConfig['versions'] = {\n maxPerDoc: 25,\n drafts: {\n autosave: {\n interval: 800,\n },\n schedulePublish: true,\n },\n}\n","import { blogContentBlocks } from '../blocks/index.js'\nimport {\n coerceBlogPostCategoriesOnRead,\n coerceBlogPostCategoriesOnWrite,\n} from '../hooks/coerce-blog-post-categories.js'\nimport { setPublishedAt } from '../hooks/set-published-at.js'\nimport { slugify } from '../hooks/slugify.js'\nimport { draftsWithAutosave } from '../shared/drafts-with-autosave.js'\nimport { seoFields } from '../shared/seo-fields.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\n/** Stock blog-posts collection (no site revalidation — add via overrides.hooks). */\nexport function createBlogPosts(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'blog-posts',\n defaultSort: '-publishedAt',\n admin: {\n useAsTitle: 'title',\n defaultColumns: ['title', 'slug', 'author', 'publishedAt', '_status'],\n },\n access: {\n read: access.adminOrPublished,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n versions: draftsWithAutosave,\n hooks: {\n beforeChange: [setPublishedAt, coerceBlogPostCategoriesOnWrite],\n afterRead: [coerceBlogPostCategoriesOnRead],\n },\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: {\n position: 'sidebar',\n description: 'URL-friendly identifier. Not localized — one slug per post.',\n },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'coverImage',\n type: 'upload',\n relationTo: 'media',\n },\n {\n name: 'imageAlt',\n type: 'text',\n localized: true,\n admin: {\n description:\n 'Alt text used for the auto-generated social/OG image (`og:image:alt`). Should describe the post for screen readers.',\n },\n },\n {\n name: 'excerpt',\n type: 'textarea',\n localized: true,\n admin: {\n description: 'Short summary shown in listing cards and meta description fallback.',\n },\n },\n {\n name: 'content',\n type: 'blocks',\n localized: true,\n blocks: blogContentBlocks,\n },\n {\n name: 'author',\n type: 'relationship',\n relationTo: 'authors',\n admin: { position: 'sidebar' },\n },\n {\n name: 'category',\n type: 'relationship',\n relationTo: 'categories',\n hasMany: true,\n label: 'Categories',\n admin: { position: 'sidebar' },\n },\n {\n name: 'readingTime',\n type: 'number',\n min: 1,\n admin: {\n position: 'sidebar',\n description: 'Estimated reading time in minutes.',\n },\n },\n {\n name: 'publishedAt',\n type: 'date',\n admin: {\n position: 'sidebar',\n date: { pickerAppearance: 'dayAndTime' },\n description: 'Auto-filled on first publish if left empty.',\n },\n },\n {\n name: 'showLatestNews',\n type: 'checkbox',\n defaultValue: true,\n admin: {\n position: 'sidebar',\n description: 'Show a \"Latest News\" section at the bottom of this post.',\n },\n },\n seoFields,\n ],\n }\n}\n","import { slugify } from '../hooks/slugify.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\nexport function createCategories(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'categories',\n admin: {\n useAsTitle: 'name',\n defaultColumns: ['name', 'slug'],\n },\n access: {\n read: access.publicRead,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: { position: 'sidebar' },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'description',\n type: 'textarea',\n localized: true,\n },\n ],\n }\n}\n","import { slugify } from '../hooks/slugify.js'\nimport { draftsWithAutosave } from '../shared/drafts-with-autosave.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\n/**\n * Stock changelog collection (shared fields only).\n * Site-specific body / GitHub / related-block fields — add via `overrides.fields`.\n * Revalidation — add via `overrides.hooks`.\n */\nexport function createChangelog(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'changelog',\n labels: { singular: 'Changelog', plural: 'Changelog' },\n defaultSort: '-releaseDate',\n admin: {\n useAsTitle: 'title',\n defaultColumns: ['title', 'version', 'versionType', 'tags', 'releaseDate', '_status'],\n },\n access: {\n read: access.adminOrPublished,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n versions: draftsWithAutosave,\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n localized: true,\n admin: {\n description:\n 'Release headline shown on the changelog detail page (e.g. \"Added Solana Support\").',\n },\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: {\n position: 'sidebar',\n description: 'URL-friendly identifier. Not localized — one slug per entry.',\n },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'version',\n type: 'text',\n admin: {\n position: 'sidebar',\n description:\n 'Optional semantic version label shown in the badge, e.g. v1.1.0 or 2.3.0. Omit for non-versioned announcements.',\n },\n },\n {\n name: 'versionType',\n type: 'select',\n options: [\n { label: 'Major', value: 'major' },\n { label: 'Minor', value: 'minor' },\n { label: 'Patch', value: 'patch' },\n ],\n admin: {\n position: 'sidebar',\n description:\n 'Release line for badge styling (major / minor / patch). Editors set this explicitly.',\n },\n },\n {\n name: 'releaseDate',\n type: 'date',\n required: true,\n admin: {\n position: 'sidebar',\n date: { pickerAppearance: 'dayOnly', displayFormat: 'MMM d, yyyy' },\n },\n },\n {\n name: 'tags',\n type: 'relationship',\n relationTo: 'changelog-tags',\n hasMany: true,\n label: 'Tags',\n admin: {\n position: 'sidebar',\n description: 'Editor-managed tags from the Changelog Tags collection.',\n },\n },\n {\n name: 'heroImage',\n type: 'upload',\n relationTo: 'media',\n admin: {\n description: 'Large visual above the article body on the changelog detail page.',\n },\n },\n {\n name: 'summary',\n type: 'textarea',\n localized: true,\n admin: {\n description: 'Short excerpt for listing cards and previews.',\n },\n },\n ],\n }\n}\n","import { slugify } from '../hooks/slugify.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\n/** Stock changelog-tags (no site revalidation — add via overrides.hooks). */\nexport function createChangelogTags(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'changelog-tags',\n defaultSort: 'order',\n admin: {\n useAsTitle: 'name',\n defaultColumns: ['name', 'slug', 'order'],\n description: 'Tags shown on changelog entries.',\n },\n access: {\n read: access.publicRead,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: {\n position: 'sidebar',\n description: 'URL-friendly identifier used by listing filters.',\n },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'order',\n type: 'number',\n defaultValue: 0,\n admin: {\n position: 'sidebar',\n description: 'Display order in admin lists (ascending). Ties broken by name.',\n },\n },\n {\n name: 'description',\n type: 'textarea',\n localized: true,\n admin: { description: 'Optional context shown to editors. Not rendered publicly yet.' },\n },\n ],\n }\n}\n","import { slugify } from '../hooks/slugify.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\n/** Stock event-tags (no site revalidation — add via overrides.hooks). */\nexport function createEventTags(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'event-tags',\n labels: { singular: 'Event Tag', plural: 'Event Tags' },\n defaultSort: 'order',\n admin: {\n useAsTitle: 'name',\n defaultColumns: ['name', 'slug', 'order'],\n description:\n 'Reusable event categories (Meetup, Workshop, Hackathon, …). Editors can add types without code changes. Related from Events.',\n },\n access: {\n read: access.publicRead,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: {\n position: 'sidebar',\n description: 'URL-friendly identifier used by filters and relationships.',\n },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'order',\n type: 'number',\n defaultValue: 0,\n admin: {\n position: 'sidebar',\n description: 'Display order in admin lists (ascending). Ties broken by name.',\n },\n },\n {\n name: 'description',\n type: 'textarea',\n localized: true,\n admin: { description: 'Optional context shown to editors.' },\n },\n ],\n }\n}\n","import { setPublishedAt } from '../hooks/set-published-at.js'\nimport { slugify } from '../hooks/slugify.js'\nimport { richTextEditor } from '../lexical/editor.js'\nimport { draftsWithAutosave } from '../shared/drafts-with-autosave.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig, Validate } from 'payload'\n\n/**\n * Display abbreviations accepted in addition to IANA names (e.g. Europe/Paris).\n * Sites map these to IANA when they need a timezone database identifier.\n */\nconst TIMEZONE_ABBREVIATIONS = new Set([\n 'UTC',\n 'GMT',\n 'CET',\n 'CEST',\n 'WET',\n 'WEST',\n 'EET',\n 'EEST',\n 'BST',\n 'EST',\n 'EDT',\n 'CST',\n 'CDT',\n 'MST',\n 'MDT',\n 'PST',\n 'PDT',\n])\n\nfunction parseDate(value: unknown): Date | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value\n }\n if (typeof value === 'string' && value.trim()) {\n const date = new Date(value)\n return Number.isNaN(date.getTime()) ? null : date\n }\n return null\n}\n\nfunction isValidIanaTimeZone(timeZone: string): boolean {\n try {\n Intl.DateTimeFormat('en-US', { timeZone }).format(new Date())\n return true\n } catch {\n return false\n }\n}\n\nconst validateTimezone: Validate<string | null | undefined> = (value) => {\n if (!value || !value.trim()) return 'Timezone is required.'\n const timeZone = value.trim()\n if (TIMEZONE_ABBREVIATIONS.has(timeZone.toUpperCase())) return true\n if (isValidIanaTimeZone(timeZone)) return true\n return 'Must be a timezone abbreviation (CET, UTC, …) or a valid IANA timezone (e.g. Europe/Paris).'\n}\n\nconst validateExternalUrl: Validate<string | null | undefined> = (value) => {\n if (!value || !value.trim()) return 'External URL is required.'\n try {\n new URL(value)\n return true\n } catch {\n return 'Must be a valid URL (e.g. https://example.com/event).'\n }\n}\n\nconst validateEndsAt: Validate<string | Date | null | undefined> = (value, { siblingData }) => {\n const end = parseDate(value)\n if (!end) return 'End date and time is required.'\n\n const start = parseDate(\n siblingData && typeof siblingData === 'object' && 'startsAt' in siblingData\n ? siblingData.startsAt\n : undefined\n )\n if (start && end.getTime() <= start.getTime()) {\n return 'End date and time must be after the start.'\n }\n\n return true\n}\n\n/**\n * Stock events collection (shared fields only).\n * SEO / site-specific fields — add via `overrides.fields`.\n * Revalidation — add via `overrides.hooks`.\n */\nexport function createEvents(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'events',\n labels: { singular: 'Event', plural: 'Events' },\n defaultSort: 'startsAt',\n admin: {\n useAsTitle: 'title',\n defaultColumns: ['title', 'slug', 'tag', 'startsAt', 'endsAt', '_status'],\n description: 'Reusable events consumed by marketing / community surfaces across sites.',\n },\n access: {\n read: access.adminOrPublished,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n versions: draftsWithAutosave,\n hooks: {\n beforeChange: [setPublishedAt],\n },\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: {\n position: 'sidebar',\n description: 'URL-friendly identifier. Not localized — one slug per event.',\n },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'summary',\n type: 'textarea',\n required: true,\n localized: true,\n admin: {\n description: 'Short description for listings, previews, and calendar bodies.',\n },\n },\n {\n name: 'coverImage',\n type: 'upload',\n relationTo: 'media',\n admin: {\n description: 'Optional cover/hero image for detail or promotional surfaces.',\n },\n },\n {\n name: 'startsAt',\n type: 'date',\n required: true,\n admin: {\n position: 'sidebar',\n date: { pickerAppearance: 'dayAndTime', displayFormat: 'MMM d, yyyy h:mm a' },\n description: 'Event start date and time. Sites derive upcoming vs past from this value.',\n },\n },\n {\n name: 'endsAt',\n type: 'date',\n required: true,\n validate: validateEndsAt,\n admin: {\n position: 'sidebar',\n date: { pickerAppearance: 'dayAndTime', displayFormat: 'MMM d, yyyy h:mm a' },\n description: 'Event end date and time. Must be after the start.',\n },\n },\n {\n name: 'timezone',\n type: 'text',\n required: true,\n validate: validateTimezone,\n admin: {\n position: 'sidebar',\n description:\n 'Display timezone: abbreviation (CET, WET, UTC) or IANA name (Europe/Paris).',\n },\n },\n {\n name: 'location',\n type: 'text',\n required: true,\n localized: true,\n admin: {\n description: 'Venue or platform (e.g. Discord, Online, Lisbon).',\n },\n },\n {\n name: 'tag',\n type: 'relationship',\n relationTo: 'event-tags',\n required: true,\n admin: {\n position: 'sidebar',\n description: 'Primary event category from Event Tags.',\n },\n },\n {\n name: 'ctaKind',\n type: 'select',\n required: true,\n defaultValue: 'link',\n options: [\n { label: 'External link', value: 'link' },\n { label: 'Add to calendar', value: 'calendar' },\n ],\n admin: {\n position: 'sidebar',\n description:\n 'Primary listing action. Link opens the external URL; calendar lets the site offer an add-to-calendar flow.',\n },\n },\n {\n name: 'ctaLabel',\n type: 'text',\n required: true,\n localized: true,\n admin: {\n description: 'Label for the primary listing action (e.g. Register, Watch recording).',\n },\n },\n {\n name: 'ctaUrl',\n type: 'text',\n required: true,\n validate: validateExternalUrl,\n admin: {\n description:\n 'External event URL. Opened for link actions; included in calendar details for calendar actions.',\n },\n },\n {\n name: 'content',\n type: 'richText',\n localized: true,\n editor: richTextEditor(),\n admin: {\n description: 'Optional long-form body for event detail pages.',\n },\n },\n {\n name: 'publishedAt',\n type: 'date',\n admin: {\n position: 'sidebar',\n date: { pickerAppearance: 'dayAndTime' },\n description: 'Auto-filled on first publish if left empty.',\n },\n },\n ],\n }\n}\n","import type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\n/**\n * Stock media upload collection.\n * Documents are not publicly listable; files stay public via `/api/media/file/*`.\n */\nexport function createMedia(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'media',\n admin: {\n useAsTitle: 'filename',\n defaultColumns: ['filename', 'alt', 'updatedAt'],\n },\n access: {\n read: access.mediaRead,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n upload: {\n imageSizes: [\n {\n name: 'thumbnail',\n width: 400,\n height: 300,\n position: 'centre',\n },\n {\n name: 'card',\n width: 768,\n height: 512,\n position: 'centre',\n },\n {\n name: 'tablet',\n width: 1024,\n height: undefined,\n position: 'centre',\n },\n ],\n adminThumbnail: 'thumbnail',\n mimeTypes: ['image/*', 'video/*', 'application/pdf'],\n },\n fields: [\n {\n name: 'alt',\n type: 'text',\n required: true,\n localized: true,\n },\n ],\n }\n}\n","import { pageContentBlocks } from '../blocks/index.js'\nimport { setPublishedAt } from '../hooks/set-published-at.js'\nimport { slugify } from '../hooks/slugify.js'\nimport { draftsWithAutosave } from '../shared/drafts-with-autosave.js'\nimport { seoFields } from '../shared/seo-fields.js'\n\nimport type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\nfunction createContentPageCollection(\n access: AccessHelpers,\n slug: 'pages' | 'legal-pages'\n): CollectionConfig {\n return {\n slug,\n admin: {\n useAsTitle: 'title',\n defaultColumns: ['title', 'slug', 'publishedAt', '_status'],\n },\n access: {\n read: access.adminOrPublished,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n },\n versions: draftsWithAutosave,\n hooks: {\n beforeChange: [setPublishedAt],\n },\n fields: [\n {\n name: 'title',\n type: 'text',\n required: true,\n localized: true,\n },\n {\n name: 'slug',\n type: 'text',\n required: true,\n unique: true,\n admin: {\n position: 'sidebar',\n description: 'URL-friendly identifier. Not localized — one slug per page.',\n },\n hooks: { beforeValidate: [slugify] },\n },\n {\n name: 'content',\n type: 'blocks',\n localized: true,\n blocks: pageContentBlocks,\n },\n {\n name: 'publishedAt',\n type: 'date',\n admin: {\n position: 'sidebar',\n date: { pickerAppearance: 'dayAndTime' },\n description: 'Auto-filled on first publish if left empty.',\n },\n },\n seoFields,\n ],\n }\n}\n\nexport function createPages(access: AccessHelpers): CollectionConfig {\n return createContentPageCollection(access, 'pages')\n}\n\nexport function createLegalPages(access: AccessHelpers): CollectionConfig {\n return createContentPageCollection(access, 'legal-pages')\n}\n","import type { AccessHelpers } from '../shared/access.js'\nimport type { CollectionConfig } from 'payload'\n\nexport function createUsers(access: AccessHelpers): CollectionConfig {\n return {\n slug: 'users',\n admin: {\n useAsTitle: 'email',\n },\n auth: {\n verify: false,\n },\n access: {\n read: access.adminOnly,\n create: access.adminOnly,\n update: access.adminOnly,\n delete: access.adminOnly,\n admin: access.adminOnly,\n },\n fields: [\n {\n name: 'googleId',\n type: 'text',\n unique: true,\n index: true,\n admin: {\n position: 'sidebar',\n readOnly: true,\n description: 'Google OAuth user ID',\n },\n },\n {\n name: 'name',\n type: 'text',\n admin: {\n description: 'Display name from Google',\n },\n },\n {\n name: 'picture',\n type: 'text',\n admin: {\n description: 'Profile picture URL from Google',\n },\n },\n ],\n }\n}\n","import type { AccessHelpers } from '../shared/access.js'\nimport type { GlobalConfig } from 'payload'\n\nexport function createSiteSettings(access: AccessHelpers): GlobalConfig {\n return {\n slug: 'site-settings',\n label: 'Site Settings',\n access: {\n read: access.publicRead,\n update: access.adminOnly,\n },\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n localized: true,\n admin: {\n description: 'Public site name used in titles and structured data.',\n },\n },\n {\n name: 'defaultDescription',\n type: 'textarea',\n required: true,\n localized: true,\n admin: {\n description: 'Fallback meta description when a page does not define its own.',\n },\n },\n {\n name: 'defaultOgImage',\n type: 'upload',\n relationTo: 'media',\n admin: {\n description: 'Default Open Graph image (1200×630 recommended).',\n },\n },\n {\n name: 'organization',\n type: 'group',\n label: 'Organization',\n fields: [\n {\n name: 'name',\n type: 'text',\n required: true,\n },\n {\n name: 'legalName',\n type: 'text',\n },\n {\n name: 'description',\n type: 'textarea',\n localized: true,\n },\n {\n name: 'logo',\n type: 'upload',\n relationTo: 'media',\n },\n {\n name: 'foundingDate',\n type: 'text',\n admin: { description: 'Year or ISO date for schema.org structured data.' },\n },\n ],\n },\n {\n name: 'social',\n type: 'group',\n label: 'Social Profiles',\n fields: [\n { name: 'twitter', type: 'text' },\n { name: 'github', type: 'text' },\n { name: 'linkedin', type: 'text' },\n ],\n },\n ],\n }\n}\n","import type { CollectionConfig, Field, GlobalConfig } from 'payload'\n\ntype OverridableConfig = CollectionConfig | GlobalConfig\n\ntype Override<TConfig extends OverridableConfig> =\n | false\n | {\n fields?: (base: Field[]) => Field[]\n hooks?: Partial<TConfig['hooks']>\n admin?: Partial<TConfig['admin']>\n access?: Partial<TConfig['access']>\n config?: (base: TConfig) => TConfig\n }\n\nexport type CollectionOverride = Override<CollectionConfig>\nexport type GlobalOverride = Override<GlobalConfig>\n\ntype HookArrays = Record<string, unknown[] | undefined>\n\n// Payload collection/global hooks are all arrays of functions, so overrides are\n// appended to the base hooks rather than replacing them.\nfunction mergeHooks(base: HookArrays | undefined, extra: HookArrays | undefined): HookArrays {\n const keys = new Set([...Object.keys(base ?? {}), ...Object.keys(extra ?? {})])\n const merged: HookArrays = {}\n keys.forEach((key) => {\n const combined = [...(base?.[key] ?? []), ...(extra?.[key] ?? [])]\n if (combined.length) merged[key] = combined\n })\n return merged\n}\n\nfunction applyOverride<TConfig extends OverridableConfig>(\n base: TConfig,\n override: Override<TConfig> | undefined\n): TConfig | null {\n if (override === false) return null\n if (!override) return base\n\n const next = {\n ...base,\n ...(override.admin && { admin: { ...base.admin, ...override.admin } }),\n ...(override.access && { access: { ...base.access, ...override.access } }),\n ...(override.fields && { fields: override.fields(base.fields ?? []) }),\n ...(override.hooks && { hooks: mergeHooks(base.hooks, override.hooks as HookArrays) }),\n } as TConfig\n\n return override.config ? override.config(next) : next\n}\n\nexport const applyCollectionOverride = (\n base: CollectionConfig,\n override: CollectionOverride | undefined\n): CollectionConfig | null => applyOverride(base, override)\n\nexport const applyGlobalOverride = (\n base: GlobalConfig,\n override: GlobalOverride | undefined\n): GlobalConfig | null => applyOverride(base, override)\n","import type { CollectionOverride, GlobalOverride } from './applyOverride.js'\n\n/** Slugs of the stock collections shipped by `buildCmsConfig`, in registration order. */\nexport const STOCK_COLLECTION_SLUGS = [\n 'users',\n 'api-tokens',\n 'media',\n 'authors',\n 'categories',\n 'blog-posts',\n 'pages',\n 'legal-pages',\n 'changelog-tags',\n 'changelog',\n 'event-tags',\n 'events',\n] as const\n\nexport type StockCollectionSlug = (typeof STOCK_COLLECTION_SLUGS)[number]\n\n/** Typed map of collection/global overrides for `buildCmsConfig`. */\nexport type Overrides = Partial<Record<StockCollectionSlug, CollectionOverride>> & {\n 'site-settings'?: GlobalOverride\n}\n","import { buildConfig } from 'payload'\n\nimport { createAccessHelpers, type AccessOptions } from './shared/access.js'\nimport { refreshRoleCache, roleTargetSlugs, withRoles, type RolesOptions } from './shared/roles.js'\nimport { createApiTokens } from './collections/createApiTokens.js'\nimport { createCmsRoles, seedDefaultCmsRoles } from './collections/createCmsRoles.js'\nimport { createAuthors } from './collections/createAuthors.js'\nimport { createBlogPosts } from './collections/createBlogPosts.js'\nimport { createCategories } from './collections/createCategories.js'\nimport { createChangelog } from './collections/createChangelog.js'\nimport { createChangelogTags } from './collections/createChangelogTags.js'\nimport { createEventTags } from './collections/createEventTags.js'\nimport { createEvents } from './collections/createEvents.js'\nimport { createMedia } from './collections/createMedia.js'\nimport { createLegalPages, createPages } from './collections/createPages.js'\nimport { createUsers } from './collections/createUsers.js'\nimport { createSiteSettings } from './globals/createSiteSettings.js'\nimport { richTextEditor } from './lexical/editor.js'\nimport { applyCollectionOverride, applyGlobalOverride } from './applyOverride.js'\nimport { STOCK_COLLECTION_SLUGS, type Overrides, type StockCollectionSlug } from './overrides.js'\n\nimport type { CollectionConfig, Config, GlobalConfig, Plugin } from 'payload'\n\nexport type BuildCmsConfigOptions<TLocale extends string = string> = {\n secret: string\n // Payload DB adapter instance (e.g. mongooseAdapter({ url }))\n db: Config['db']\n /** Sharp instance from the `sharp` package. */\n sharp?: Config['sharp']\n cors?: Config['cors']\n csrf?: Config['csrf']\n locales: readonly TLocale[]\n /** Must be one of `locales`. */\n defaultLocale: TLocale\n admin?: Config['admin']\n plugins?: Plugin[]\n /** Defaults to the package Lexical editor. */\n editor?: Config['editor']\n access?: AccessOptions\n /** Collection/global slug → override | false. */\n overrides?: Overrides\n extraCollections?: CollectionConfig[]\n extraGlobals?: GlobalConfig[]\n typescript?: Config['typescript']\n /** Extra top-level Payload config keys (e.g. endpoints, graphQL). */\n payload?: Partial<\n Omit<\n Config,\n | 'secret'\n | 'db'\n | 'sharp'\n | 'cors'\n | 'csrf'\n | 'admin'\n | 'plugins'\n | 'editor'\n | 'collections'\n | 'globals'\n | 'localization'\n | 'typescript'\n >\n >\n}\n\n/** Drop keys whose value is `undefined` so they don't clobber Payload defaults. */\nfunction defined<T extends Record<string, unknown>>(obj: T): Partial<T> {\n return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined)) as Partial<T>\n}\n\n/**\n * Build a Payload config from shared stock collections/globals plus site\n * overrides and extras. Types are still generated in the consuming app.\n */\nexport function buildCmsConfig<const TLocale extends string>(\n options: BuildCmsConfigOptions<TLocale>\n) {\n const overrides = options.overrides ?? {}\n const access = createAccessHelpers({\n ...options.access,\n apiTokens: options.access?.apiTokens ?? overrides['api-tokens'] !== false,\n })\n\n const stock: Record<StockCollectionSlug, CollectionConfig> = {\n 'users': createUsers(access),\n 'api-tokens': createApiTokens(access),\n 'media': createMedia(access),\n 'authors': createAuthors(access),\n 'categories': createCategories(access),\n 'blog-posts': createBlogPosts(access),\n 'pages': createPages(access),\n 'legal-pages': createLegalPages(access),\n 'changelog-tags': createChangelogTags(access),\n 'changelog': createChangelog(access),\n 'event-tags': createEventTags(access),\n 'events': createEvents(access),\n }\n\n const rolesSetting = options.access?.roles\n const rolesEnabled = rolesSetting != null\n const rolesConfig: RolesOptions =\n rolesSetting === true || rolesSetting == null ? {} : rolesSetting\n if (rolesEnabled) {\n ;(Object.keys(stock) as StockCollectionSlug[]).forEach((slug) => {\n stock[slug] = withRoles(stock[slug])\n })\n }\n\n const collections = [\n ...(rolesEnabled ? [createCmsRoles(roleTargetSlugs(rolesConfig))] : []),\n ...STOCK_COLLECTION_SLUGS.map((slug) =>\n applyCollectionOverride(stock[slug], overrides[slug])\n ).filter((c): c is CollectionConfig => c !== null),\n ...(options.extraCollections ?? []),\n ]\n\n const siteSettingsBase = createSiteSettings(access)\n const siteSettingsWithRoles = rolesEnabled ? withRoles(siteSettingsBase) : siteSettingsBase\n const siteSettings = applyGlobalOverride(siteSettingsWithRoles, overrides['site-settings'])\n const globals = [...(siteSettings ? [siteSettings] : []), ...(options.extraGlobals ?? [])]\n const { jobs: jobsOverride, onInit: callerOnInit, ...payloadRest } = options.payload ?? {}\n\n return buildConfig({\n ...payloadRest,\n onInit: async (payload) => {\n if (rolesEnabled) {\n await seedDefaultCmsRoles(payload, rolesConfig)\n await refreshRoleCache(payload)\n }\n if (callerOnInit) await callerOnInit(payload)\n },\n jobs: {\n // In-process cron so Payload `schedulePublish` jobs actually run.\n // Override via `payload.jobs`. Do not use on serverless hosts.\n autoRun: [{ cron: '* * * * *' }],\n ...jobsOverride,\n },\n ...defined({\n sharp: options.sharp,\n cors: options.cors,\n csrf: options.csrf,\n plugins: options.plugins,\n }),\n secret: options.secret,\n db: options.db,\n admin: {\n user: 'users',\n ...options.admin,\n },\n editor: options.editor ?? richTextEditor(),\n collections,\n ...(globals.length ? { globals } : {}),\n localization: {\n locales: options.locales.map((code) => ({\n code,\n label: code.toUpperCase(),\n })),\n defaultLocale: options.defaultLocale,\n fallback: true,\n },\n typescript: options.typescript ?? {\n outputFile: 'src/payload-types.ts',\n },\n })\n}\n","import { createLogger } from '../utils/logger/logger.js'\n\nconst log = createLogger('env')\n\n/**\n * Read a required env var. During Next.js `phase-production-build` and\n * `generate:importmap` (when NEXT_PHASE is unset) returns \"\" instead of throwing,\n * because those phases do not connect to the DB.\n */\nexport function requireEnvAtRuntime(name: string): string {\n const value = process.env[name]\n const isBuildTime = !process.env.NEXT_PHASE || process.env.NEXT_PHASE === 'phase-production-build'\n if (!value && !isBuildTime) {\n log.error(`Missing required environment variable: ${name}`)\n throw new Error(`Missing required environment variable: ${name}`)\n }\n return value ?? ''\n}\n","import { s3Storage } from '@payloadcms/storage-s3'\n\nimport type { Plugin } from 'payload'\n\nexport type CreateS3MediaPluginOptions = {\n /** Defaults to `process.env.AWS_S3_BUCKET`. */\n bucket?: string\n accessKeyId?: string\n secretAccessKey?: string\n region?: string\n /** Custom S3-compatible endpoint (MinIO, etc.). Defaults to `AWS_S3_ENDPOINT`. */\n endpoint?: string\n /** Defaults to `AWS_S3_FORCE_PATH_STYLE === 'true'`. */\n forcePathStyle?: boolean\n /** Collection slug that owns uploads. Defaults to `media`. */\n collection?: string\n}\n\n/** Payload S3 storage plugin wired for the stock `media` collection. */\nexport function createS3MediaPlugin(options: CreateS3MediaPluginOptions = {}): Plugin {\n const bucket = options.bucket ?? process.env.AWS_S3_BUCKET ?? ''\n const endpoint = options.endpoint ?? process.env.AWS_S3_ENDPOINT ?? ''\n const forcePathStyle = options.forcePathStyle ?? process.env.AWS_S3_FORCE_PATH_STYLE === 'true'\n\n return s3Storage({\n enabled: Boolean(bucket),\n collections: {\n [options.collection ?? 'media']: true,\n },\n bucket,\n config: {\n credentials: {\n accessKeyId: options.accessKeyId ?? process.env.AWS_ACCESS_KEY_ID ?? '',\n secretAccessKey: options.secretAccessKey ?? process.env.AWS_SECRET_ACCESS_KEY ?? '',\n },\n region: options.region ?? process.env.AWS_S3_REGION ?? 'us-east-1',\n ...(endpoint ? { endpoint } : {}),\n ...(forcePathStyle ? { forcePathStyle: true } : {}),\n },\n })\n}\n","import type { AccessHelpers } from '../shared/access.js'\nimport type { GlobalConfig, Validate } from 'payload'\n\nconst validateBannerId: Validate<string | null | undefined, { enabled?: boolean | null }> = (\n value,\n { siblingData }\n) => {\n if (siblingData?.enabled && !String(value ?? '').trim()) {\n return 'Banner ID is required when the banner is enabled.'\n }\n return true\n}\n\n/** Announcement banner global (no site revalidation — add via applyGlobalOverride hooks). */\nexport function createAnnouncementBanner(access: AccessHelpers): GlobalConfig {\n return {\n slug: 'announcement-banner',\n label: 'Announcement Banner',\n admin: {\n description:\n 'Sticky site-wide banner shown above the main navigation. Bump Banner ID when replacing content so users who dismissed an older message in the current session see the new one.',\n },\n access: {\n read: access.publicRead,\n update: access.adminOnly,\n },\n fields: [\n {\n name: 'enabled',\n type: 'checkbox',\n defaultValue: false,\n admin: {\n description: 'When off, the banner is hidden on the public site.',\n },\n },\n {\n name: 'bannerId',\n type: 'text',\n admin: {\n description:\n 'Stable identifier for this banner version. Change it when publishing new copy so users who dismissed an older banner in this session see the update.',\n },\n validate: validateBannerId,\n },\n {\n type: 'row',\n fields: [\n {\n name: 'prefix',\n type: 'text',\n localized: true,\n maxLength: 8,\n admin: {\n width: '25%',\n description: 'Accent label (max 8 characters), e.g. \"New:\"',\n },\n },\n {\n name: 'description',\n type: 'text',\n localized: true,\n maxLength: 1000,\n admin: {\n width: '75%',\n description: 'Banner message (max 1000 characters).',\n },\n },\n ],\n },\n {\n type: 'row',\n fields: [\n {\n name: 'ctaLabel',\n type: 'text',\n localized: true,\n maxLength: 18,\n admin: {\n width: '50%',\n description: 'Optional button label (max 18 characters).',\n },\n },\n {\n name: 'ctaHref',\n type: 'text',\n admin: {\n width: '50%',\n description: 'Optional button URL. Relative paths stay in-site.',\n },\n },\n ],\n },\n ],\n }\n}\n"],"mappings":"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"}
@@ -1,2 +1 @@
1
- import { n as Languages, t as LanguageLabel } from "../i18n.mjs";
2
- export { LanguageLabel, Languages };
1
+ export { t as LanguageLabel, n as Languages } from "../i18n.mjs";