@postedin/cms-client 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -0
- package/bin/dissect/cli.mjs +138 -0
- package/bin/dissect/dissect.mjs +290 -0
- package/bin/profile/build.mjs +106 -0
- package/bin/profile/fetch-log.mjs +298 -0
- package/bin/profile/format.mjs +90 -0
- package/bin/profile/interference-summary.mjs +558 -0
- package/bin/profile/interference.mjs +604 -0
- package/bin/profile/measure.mjs +137 -0
- package/bin/profile/report.mjs +90 -0
- package/bin/profile/site-env.mjs +16 -0
- package/bin/profile/summarize.mjs +429 -0
- package/dist/browser.d.ts +145 -0
- package/dist/browser.js +11 -0
- package/dist/browser.js.map +1 -0
- package/dist/chunk-6V54ITTK.js +197 -0
- package/dist/chunk-6V54ITTK.js.map +1 -0
- package/dist/chunk-MNZ7DIGC.js +51 -0
- package/dist/chunk-MNZ7DIGC.js.map +1 -0
- package/dist/form-proxy/upload-policy.d.ts +40 -0
- package/dist/form-proxy/upload-policy.js +17 -0
- package/dist/form-proxy/upload-policy.js.map +1 -0
- package/dist/index.d.ts +570 -0
- package/dist/index.js +1636 -0
- package/dist/index.js.map +1 -0
- package/dist/payload-types.d.ts +8985 -0
- package/dist/payload-types.js +1 -0
- package/dist/payload-types.js.map +1 -0
- package/package.json +74 -0
- package/src/api.ts +387 -0
- package/src/blog-listing.ts +75 -0
- package/src/browser.ts +24 -0
- package/src/client.ts +144 -0
- package/src/cms-to-href.ts +70 -0
- package/src/cms.ts +86 -0
- package/src/collections/appearance.ts +94 -0
- package/src/collections/areas.ts +29 -0
- package/src/collections/authors.ts +27 -0
- package/src/collections/banners.ts +14 -0
- package/src/collections/categories.ts +111 -0
- package/src/collections/forms.ts +29 -0
- package/src/collections/header-footer.ts +19 -0
- package/src/collections/image-links.ts +14 -0
- package/src/collections/media.ts +18 -0
- package/src/collections/options.ts +10 -0
- package/src/collections/pages.ts +83 -0
- package/src/collections/posts.ts +249 -0
- package/src/collections/project.ts +16 -0
- package/src/collections/questions.ts +35 -0
- package/src/collections/seo.ts +10 -0
- package/src/collections/tags.ts +25 -0
- package/src/collections/team-members.ts +79 -0
- package/src/config-time.ts +98 -0
- package/src/context.ts +12 -0
- package/src/decode-html.ts +8 -0
- package/src/form-proxy/cms-client.ts +95 -0
- package/src/form-proxy/cms-errors.ts +73 -0
- package/src/form-proxy/cms-write.ts +44 -0
- package/src/form-proxy/http.ts +96 -0
- package/src/form-proxy/index.ts +73 -0
- package/src/form-proxy/rate-limit.ts +46 -0
- package/src/form-proxy/submissions.ts +88 -0
- package/src/form-proxy/types.ts +23 -0
- package/src/form-proxy/upload-policy.ts +92 -0
- package/src/form-proxy/uploads.ts +81 -0
- package/src/home-page.ts +83 -0
- package/src/index.ts +68 -0
- package/src/loader.ts +83 -0
- package/src/locales.ts +80 -0
- package/src/payload-types.ts +10854 -0
- package/src/placeholder.ts +9 -0
- package/src/resolve-menu-items.ts +184 -0
- package/src/routes.ts +184 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/api.ts","../src/placeholder.ts","../src/blog-listing.ts","../src/loader.ts","../src/collections/appearance.ts","../src/collections/areas.ts","../src/collections/authors.ts","../src/collections/banners.ts","../src/decode-html.ts","../src/collections/categories.ts","../src/collections/forms.ts","../src/collections/header-footer.ts","../src/collections/image-links.ts","../src/collections/media.ts","../src/collections/options.ts","../src/collections/pages.ts","../src/collections/posts.ts","../src/collections/project.ts","../src/collections/questions.ts","../src/collections/seo.ts","../src/collections/tags.ts","../src/collections/team-members.ts","../src/cms.ts","../src/config-time.ts","../src/form-proxy/rate-limit.ts","../src/form-proxy/http.ts","../src/form-proxy/cms-write.ts","../src/form-proxy/submissions.ts","../src/form-proxy/uploads.ts","../src/form-proxy/cms-errors.ts","../src/form-proxy/cms-client.ts","../src/form-proxy/index.ts","../src/home-page.ts","../src/client.ts","../src/resolve-menu-items.ts"],"sourcesContent":["import { stringify } from 'qs-esm';\nimport type { Locale } from './locales';\nimport type { Media, Project } from './payload-types';\nimport { getRandomPlaceholderUrl } from './placeholder';\n\n// The scheme names the CMS collection the key belongs to. Build credentials\n// are project-scoped `api-keys` documents — a principal that can read one\n// project and write nothing — rather than a person's key in `users`, which\n// authenticates as that person with all of their permissions.\nconst CMS_API_KEY_COLLECTION = 'api-keys';\n\nconst DEPTH = 2;\nconst LIMIT = 1000;\n\n// How many pages of one collection are fetched at a time. A CMS on a\n// shared-tier database tears down connections under a build's request fan-out:\n// `media` on a large site is 20k+ documents, so firing its remaining 20 pages\n// in a single `Promise.all` made the CMS answer 500 and failed the build.\n// Pages are still fetched in parallel, just a few at a time.\nconst PAGE_CONCURRENCY = 4;\n\n/** Which of the two URL helpers is asking: a download link or an `<img>`. */\nexport type UploadUse = 'file' | 'image';\n\n/**\n * A site's own rule for where an upload is served from. Return a URL to use\n * it, or `undefined` to let the default rule decide. Consulted for every\n * production build, bucket or not, since a site's rewrites do not depend on\n * one; in dev the URL the CMS returned is always used.\n */\nexport type ResolveUploadUrl = (\n\tmedia: Media,\n\tuse: UploadUse,\n) => string | null | undefined;\n\nexport interface ApiOptions {\n\tapiUrl: string;\n\tapiKey: string;\n\tprojectSlug: string;\n\tuploadsBaseUrl?: string;\n\tprotectionBypassSecret?: string;\n\tisDev: boolean;\n\tpageConcurrency?: number;\n\tresolveUploadUrl?: ResolveUploadUrl;\n}\n\nexport type Collection<T> = {\n\tdocs: T[];\n\ttotalDocs: number;\n\tlimit: number;\n\ttotalPages: number;\n\tpage: number;\n\tpagingCounter: number;\n\thasPrevPage: boolean;\n\thasNextPage: boolean;\n\tprevPage: number | null;\n\tnextPage: number | null;\n};\n\n// Runs `worker` over `items` with at most `limit` in flight. Results keep the\n// order of `items`, and the first rejection rejects the whole call — the same\n// contract as the `Promise.all` this replaces.\nexport async function mapWithConcurrency<TItem, TResult>(\n\titems: TItem[],\n\tlimit: number,\n\tworker: (item: TItem, index: number) => Promise<TResult>,\n): Promise<TResult[]> {\n\tconst results = new Array<TResult>(items.length);\n\tlet next = 0;\n\n\tconst runner = async () => {\n\t\twhile (next < items.length) {\n\t\t\tconst index = next++;\n\t\t\tresults[index] = await worker(items[index], index);\n\t\t}\n\t};\n\n\tawait Promise.all(\n\t\tArray.from({ length: Math.min(limit, items.length) }, runner),\n\t);\n\n\treturn results;\n}\n\nexport type FallbackMode = 'null' | 'default';\n\nfunction applyLocale(\n\tquery: any,\n\tlocale: Locale | undefined,\n\tfallback: FallbackMode,\n) {\n\tif (!locale) {\n\t\treturn query;\n\t}\n\tquery.locale = locale;\n\t// 'null' → untranslated localized fields come back as null so callers can\n\t// use null slug/title as the \"not translated\" signal (used by collections\n\t// that drive getStaticPaths to skip untranslated entries).\n\t// 'default' → let Payload fall back to the default-locale value. Right for\n\t// globals/chrome (header, footer, seo, appearance) where we'd rather show\n\t// the default-locale content than an empty UI.\n\tif (fallback === 'null') {\n\t\tquery['fallback-locale'] = 'null';\n\t}\n\treturn query;\n}\n\nexport type FetchCmsGlobalOptions = {\n\tquery?: any;\n\tdepth?: number;\n\tlocale?: Locale;\n\tfallback?: FallbackMode;\n};\n\nexport type FetchCmsCollectionOptions = FetchCmsGlobalOptions & {\n\tstatus?: string;\n\tlimit?: number;\n\tsort?: string;\n};\n\nexport type Api = ReturnType<typeof createApi>;\n\nexport function createApi(options: ApiOptions) {\n\tconst pageConcurrency = options.pageConcurrency ?? PAGE_CONCURRENCY;\n\n\tfunction buildHeaders(): Record<string, string> {\n\t\tconst headers: Record<string, string> = {\n\t\t\tAuthorization: `${CMS_API_KEY_COLLECTION} API-Key ${options.apiKey}`,\n\t\t};\n\n\t\tif (options.protectionBypassSecret) {\n\t\t\theaders['x-vercel-protection-bypass'] = options.protectionBypassSecret;\n\t\t}\n\n\t\treturn headers;\n\t}\n\n\t// `false` asks for no project scope at all — the one query that needs it is\n\t// the project lookup itself.\n\tfunction apiUrl(url: string, query: any = {}, scoped = true) {\n\t\tif (scoped) {\n\t\t\tquery.where = {\n\t\t\t\tand: [\n\t\t\t\t\t{ 'project.slug': { equals: options.projectSlug } },\n\t\t\t\t\t...(query.where ? [query.where] : []),\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\n\t\treturn options.apiUrl + url + stringify(query, { addQueryPrefix: true });\n\t}\n\n\tfunction getUploadsPublicUrl(endpoint: string) {\n\t\treturn `${options.uploadsBaseUrl}/${endpoint}`;\n\t}\n\n\t// Uploads are served straight from the bucket at `uploadsBaseUrl`, unless\n\t// the site's `resolveUploadUrl` says otherwise. The site is asked first,\n\t// with or without a bucket: its rule points at its own rewrites.\n\t//\n\t// Without a bucket the default rule has nothing to point at, so fall back\n\t// to the absolute URL Payload itself returns and let the CMS serve the\n\t// file. Testing `isDev` alone is not enough: `pnpm build` is a production\n\t// build, so a local build took the bucket branch with no bucket configured\n\t// and emitted `/<filename>` — a root-relative path to a file that exists\n\t// nowhere in the output. That is why images render in `pnpm dev` but not\n\t// in `pnpm preview`.\n\tconst hasUploadsBucket = !!options.uploadsBaseUrl;\n\n\tfunction siteUploadUrl(media: Media, use: UploadUse) {\n\t\treturn options.resolveUploadUrl?.(media, use) ?? undefined;\n\t}\n\n\tfunction fileUrl(media?: Media | null) {\n\t\tif (!media) {\n\t\t\treturn null;\n\t\t}\n\n\t\tif (options.isDev) {\n\t\t\treturn media.url ?? null;\n\t\t}\n\n\t\tconst own = siteUploadUrl(media, 'file');\n\t\tif (own !== undefined) {\n\t\t\treturn own;\n\t\t}\n\n\t\tif (hasUploadsBucket && media.filename) {\n\t\t\treturn getUploadsPublicUrl(media.filename);\n\t\t}\n\n\t\treturn media.url ?? null;\n\t}\n\n\tfunction imageUrl(media?: Media | null) {\n\t\tif (!media) {\n\t\t\treturn getRandomPlaceholderUrl();\n\t\t}\n\n\t\tif (options.isDev) {\n\t\t\treturn media.url ?? getRandomPlaceholderUrl();\n\t\t}\n\n\t\tconst own = siteUploadUrl(media, 'image');\n\t\tif (own !== undefined) {\n\t\t\treturn own ?? getRandomPlaceholderUrl();\n\t\t}\n\n\t\tif (hasUploadsBucket && media.filename) {\n\t\t\treturn getUploadsPublicUrl(media.filename);\n\t\t}\n\n\t\treturn media.url || getRandomPlaceholderUrl();\n\t}\n\n\t// Fetch a raw uploaded file through the CMS API. Upload docs' `url` is\n\t// relative to the CMS host (e.g. /api/vcards/file/{filename}).\n\tasync function fetchCmsFile(url: string): Promise<Response> {\n\t\treturn await fetch(new URL(url, options.apiUrl), {\n\t\t\theaders: buildHeaders(),\n\t\t});\n\t}\n\n\tasync function fetchCmsGlobal<T>(\n\t\tglobal: string,\n\t\tfetchOptions: FetchCmsGlobalOptions = {},\n\t): Promise<T> {\n\t\tconst query = fetchOptions.query || {};\n\t\tconst depth = fetchOptions.depth ?? DEPTH;\n\n\t\tapplyLocale(query, fetchOptions.locale, fetchOptions.fallback ?? 'null');\n\n\t\tconst res = await fetch(\n\t\t\tapiUrl(`/api/globals/${global}`, { depth, ...query }),\n\t\t\t{ headers: buildHeaders() },\n\t\t);\n\n\t\treturn (await res.json()) as T;\n\t}\n\n\tasync function fetchCmsGlobalCollection<T>(\n\t\tcollection: string,\n\t\tfetchOptions: FetchCmsGlobalOptions = {},\n\t): Promise<T> {\n\t\tconst query = fetchOptions.query || {};\n\t\tconst depth = fetchOptions.depth ?? DEPTH;\n\n\t\tapplyLocale(query, fetchOptions.locale, fetchOptions.fallback ?? 'null');\n\n\t\tconst res = await fetch(apiUrl(`/api/${collection}`, { depth, ...query }), {\n\t\t\theaders: buildHeaders(),\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tconst url = apiUrl(`/api/${collection}`, { depth, ...query });\n\t\t\tconst text = await res.text();\n\t\t\tlet error: string;\n\n\t\t\ttry {\n\t\t\t\tconst json = JSON.parse(text);\n\t\t\t\terror = `${res.status} (${url})j: ${json.message || JSON.stringify(json)}`;\n\t\t\t} catch {\n\t\t\t\terror = `${res.status} (${url})t: ${text}`;\n\t\t\t}\n\n\t\t\tthrow new Error(error);\n\t\t}\n\n\t\tconst docs = (await res.json()).docs;\n\n\t\tif (!docs.length) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to load global collection \"${collection}\", no docs found.`,\n\t\t\t);\n\t\t}\n\n\t\treturn docs[0];\n\t}\n\n\tasync function fetchCmsCollection<T>(\n\t\tcollection: string,\n\t\tfetchOptions: FetchCmsCollectionOptions = {},\n\t): Promise<T[]> {\n\t\tconst query = fetchOptions.query || {};\n\t\tconst depth = fetchOptions.depth ?? DEPTH;\n\t\tconst limit = fetchOptions.limit || LIMIT;\n\t\tconst sort = fetchOptions.sort || '-createdAt';\n\t\tconst fields = query.fields || {};\n\n\t\tif (fetchOptions.status) {\n\t\t\tquery.where = query?.where || {};\n\t\t\tquery.where._status = { equals: fetchOptions.status };\n\t\t}\n\n\t\tapplyLocale(query, fetchOptions.locale, fetchOptions.fallback ?? 'null');\n\n\t\tconst fetchPage = async (page: number = 1): Promise<Collection<T>> => {\n\t\t\tconst res = await fetch(\n\t\t\t\tapiUrl(`/api/${collection}`, {\n\t\t\t\t\tdepth,\n\t\t\t\t\tlimit,\n\t\t\t\t\tsort,\n\t\t\t\t\tfields,\n\t\t\t\t\t...query,\n\t\t\t\t\tpage,\n\t\t\t\t}),\n\t\t\t\t{ headers: buildHeaders() },\n\t\t\t);\n\n\t\t\tif (!res.ok) {\n\t\t\t\tconst errorText = await res.text();\n\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`CMS API request failed for ${collection} (page ${page})\\n` +\n\t\t\t\t\t\t`Status: ${res.status} ${res.statusText}\\n` +\n\t\t\t\t\t\t`Details: ${errorText.substring(0, 500)}${errorText.length > 500 ? '...' : ''}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn await res.json();\n\t\t};\n\n\t\tconst firstPage = await fetchPage();\n\n\t\tlet otherPagesData: T[][] = [];\n\t\tif (firstPage.totalPages > 1) {\n\t\t\tconst otherPages = Array.from(\n\t\t\t\t{ length: firstPage.totalPages - 1 },\n\t\t\t\t(_, i) => i + 2,\n\t\t\t);\n\t\t\totherPagesData = await mapWithConcurrency(\n\t\t\t\totherPages,\n\t\t\t\tpageConcurrency,\n\t\t\t\tasync (p) => (await fetchPage(p)).docs,\n\t\t\t);\n\t\t}\n\n\t\treturn firstPage.docs.concat(otherPagesData.flat());\n\t}\n\n\tasync function fetchCmsProject(): Promise<Project> {\n\t\tconst slug = options.projectSlug;\n\t\tconst res = await fetch(\n\t\t\tapiUrl(\n\t\t\t\t'/api/projects',\n\t\t\t\t{ limit: 1, where: { slug: { equals: slug } } },\n\t\t\t\tfalse,\n\t\t\t),\n\t\t\t{ headers: buildHeaders() },\n\t\t);\n\n\t\tif (!res.ok) {\n\t\t\tconst errorText = await res.text();\n\n\t\t\tthrow new Error(\n\t\t\t\t`CMS API request failed for ProjectBySlug\\n` +\n\t\t\t\t\t`Status: ${res.status} ${res.statusText}\\n` +\n\t\t\t\t\t`Details: ${errorText.substring(0, 500)}${errorText.length > 500 ? '...' : ''}`,\n\t\t\t);\n\t\t}\n\n\t\tconst docs = (await res.json()).docs;\n\n\t\tif (!docs) {\n\t\t\tthrow new Error(\n\t\t\t\t`CMS API request failed for ProjectBySlug\\n` +\n\t\t\t\t\t`Status: ${res.status} ${res.statusText}\\n` +\n\t\t\t\t\t`Details: failed to find project by slug \"${slug}\"`,\n\t\t\t);\n\t\t}\n\n\t\treturn docs[0];\n\t}\n\n\treturn {\n\t\tapiUrl,\n\t\tbuildHeaders,\n\t\tgetUploadsPublicUrl,\n\t\tfileUrl,\n\t\timageUrl,\n\t\tfetchCmsFile,\n\t\tfetchCmsGlobal,\n\t\tfetchCmsGlobalCollection,\n\t\tfetchCmsCollection,\n\t\tfetchCmsProject,\n\t};\n}\n","export function getRandomPlaceholderUrl(width = 600, height = 400) {\n\tconst pastelColors = ['ebfaf5', 'c3c8cd', 'faf0e6', 'f5f5eb', 'f0ebfa'];\n\n\tconst randomIndex = Math.floor(Math.random() * pastelColors.length);\n\n\tconst randomColor = pastelColors[randomIndex];\n\n\treturn `https://placehold.co/${width}x${height}/${randomColor}/${randomColor}`;\n}\n","import type { Context } from './context';\nimport type { Locale } from './locales';\nimport type { Page } from './payload-types';\n\nexport interface BlogListing {\n\t/**\n\t * What the project calls its blog. `null` when no blog page is configured or\n\t * the editor left the field blank, in which case the caller falls back to the\n\t * `blog.title` translation.\n\t */\n\tname: string | null;\n\t/** Intro copy for the listing, in the dual Lexical/HTML shape. */\n\tdescription: Page['listingDescription'] | null;\n}\n\nconst EMPTY: BlogListing = { name: null, description: null };\n\nasync function fetchBlogListing(\n\tctx: Context,\n\tlocale: Locale,\n): Promise<BlogListing> {\n\tconst options = await ctx.cms(locale).options();\n\tconst configured = options.blog?.page;\n\tconst id =\n\t\ttypeof configured === 'string' ? configured : (configured?.id ?? null);\n\n\tif (!id) {\n\t\treturn EMPTY;\n\t}\n\n\t// Read the standalone document rather than the copy embedded in the options\n\t// global, for the same reason `home-page.ts` does: globals are fetched\n\t// without locale fallback, so an untranslated blog page comes back with a\n\t// null `listingName` and would head the English listing with nothing at all.\n\tconst [doc] = await ctx.api.fetchCmsCollection<Page>('pages', {\n\t\tlocale,\n\t\tfallback: 'default',\n\t\tstatus: 'published',\n\t\tlimit: 1,\n\t\tquery: { where: { id: { equals: id } } },\n\t});\n\n\tif (!doc) {\n\t\treturn EMPTY;\n\t}\n\n\treturn {\n\t\tname: doc.listingName || null,\n\t\tdescription: doc.listingDescription ?? null,\n\t};\n}\n\nexport function createBlogListing(ctx: Context) {\n\tconst cache = new Map<Locale, Promise<BlogListing>>();\n\n\t/**\n\t * The name and intro copy the CMS holds for the blog listing. Every surface that\n\t * heads a blog listing — the paginated index, the category and tag pages —\n\t * reads it from here, so a project that calls its blog something else says so\n\t * everywhere rather than only in its menu.\n\t *\n\t * Server-only. Cached per locale, so calling it from several components costs\n\t * one fetch per locale per build.\n\t */\n\treturn function getBlogListing(locale: Locale): Promise<BlogListing> {\n\t\tlet pending = cache.get(locale);\n\n\t\tif (!pending) {\n\t\t\tpending = fetchBlogListing(ctx, locale);\n\t\t\tcache.set(locale, pending);\n\t\t}\n\n\t\treturn pending;\n\t};\n}\n","export function createGlobalLoader<TInput, TOutput = TInput>(\n\tfetchFn: () => Promise<TInput>,\n\toptions?: {\n\t\ttransform?: (data: TInput) => Promise<TOutput> | TOutput;\n\t},\n) {\n\tlet cache: Promise<TOutput> | TOutput | undefined;\n\n\treturn async () => {\n\t\tif (!cache) {\n\t\t\tcache = fetchFn().then(async (data) => {\n\t\t\t\tif (options?.transform) {\n\t\t\t\t\treturn await options.transform(data);\n\t\t\t\t}\n\n\t\t\t\treturn data as unknown as TOutput;\n\t\t\t});\n\t\t}\n\n\t\treturn await cache;\n\t};\n}\n\nexport interface Doc {\n\tid: string;\n\tslug?: string;\n\tpath?: string;\n\ttitle?: string;\n\tname?: string | null;\n}\n\nexport function createCollectionLoader<\n\tTInput extends Array<any>,\n\tTOutput extends Array<any> = TInput,\n>(\n\tfetchFn: () => Promise<TInput>,\n\toptions?: {\n\t\ttransform?: (data: TInput) => Promise<TOutput> | TOutput;\n\t},\n) {\n\tlet cache: Promise<TOutput> | TOutput | undefined;\n\n\tconst load = async () => {\n\t\tif (!cache) {\n\t\t\tcache = fetchFn().then(async (data) => {\n\t\t\t\tif (options?.transform) {\n\t\t\t\t\treturn await options.transform(data);\n\t\t\t\t}\n\n\t\t\t\treturn data as unknown as TOutput;\n\t\t\t});\n\t\t}\n\n\t\treturn await cache;\n\t};\n\n\treturn Object.assign(load, {\n\t\tpage: async (\n\t\t\tpage: number,\n\t\t\tlimit: number,\n\t\t\toptions: { excluded: Doc[] } = { excluded: [] },\n\t\t) => {\n\t\t\tconst data = (await load()).filter((doc) => {\n\t\t\t\tif (!options.excluded.length) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\treturn !options.excluded.find((ex) => ex.id === doc.id);\n\t\t\t});\n\n\t\t\tconst first = (page - 1) * limit;\n\t\t\tconst last = first + limit;\n\n\t\t\treturn data.slice(first, last) as TOutput;\n\t\t},\n\t\tfind: async (predicate: Parameters<any[]['find']>[0]) => {\n\t\t\treturn ((await load()) as TOutput).find(predicate);\n\t\t},\n\t\tfilter: async (predicate: Parameters<any[]['filter']>[0]) => {\n\t\t\treturn ((await load()) as TOutput).filter(predicate);\n\t\t},\n\t});\n}\n","import type { Context } from '../context';\nimport { createGlobalLoader } from '../loader';\nimport type { Appearance } from '../payload-types';\n\nexport type WiredAppearance = Appearance & {\n\tbranding: NonNullable<Appearance['branding']> & {\n\t\tbrandColor: NonNullable<NonNullable<Appearance['branding']>['brandColor']>;\n\t\tlogo: NonNullable<NonNullable<Appearance['branding']>['logo']>;\n\t};\n\tbackgroundColor: {\n\t\tlightTheme: string;\n\t\tdarkTheme: string;\n\t};\n};\n\n/**\n * What a blank Appearance field falls back to. Both are CSS values, and both\n * are a site's own: the template states them in its theme file, so its\n * defaults are variables that file defines.\n */\nexport interface AppearanceFallbacks {\n\tbrandColor: string;\n\tbackgroundColor: { lightTheme: string; darkTheme: string };\n}\n\nexport const DEFAULT_APPEARANCE_FALLBACKS: AppearanceFallbacks = {\n\t// The theme ramp's 500.\n\tbrandColor: 'var(--color-theme-500)',\n\tbackgroundColor: {\n\t\tlightTheme: 'var(--site-background-light)',\n\t\tdarkTheme: 'var(--site-background-dark)',\n\t},\n};\n\nfunction removeInvalid<T extends Record<string, any>>(\n\tobj: T | null | undefined,\n): Partial<T> {\n\tif (obj === null || obj === undefined) {\n\t\treturn {};\n\t}\n\n\tconst cleaned: Partial<T> = {};\n\tfor (const [key, value] of Object.entries(obj)) {\n\t\tif (value !== null && value !== undefined && value !== '') {\n\t\t\tcleaned[key as keyof T] = value;\n\t\t}\n\t}\n\n\treturn cleaned;\n}\n\n// Appearance (theme/colors/fonts) is fetched once, at config time, and handed\n// to `createClient`. It has no text content that needs translation, so every\n// locale reads the same document.\n//\n// Header theming is deliberately absent: it is not an Appearance field, so it\n// lives in the site.\nexport default function (ctx: Context) {\n\treturn createGlobalLoader<Appearance, WiredAppearance>(\n\t\tasync () => {\n\t\t\tif (!ctx.options.appearance) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'cms.appearance() needs the `appearance` option of createClient: the Appearance document fetched at config time.',\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn ctx.options.appearance;\n\t\t},\n\t\t{\n\t\t\ttransform: (appearance) => {\n\t\t\t\tconst fallbacks =\n\t\t\t\t\tctx.options.appearanceFallbacks ?? DEFAULT_APPEARANCE_FALLBACKS;\n\t\t\t\treturn {\n\t\t\t\t\t...appearance,\n\t\t\t\t\tbranding: {\n\t\t\t\t\t\t...appearance.branding,\n\t\t\t\t\t\tbrandColor: appearance.branding?.brandColor || fallbacks.brandColor,\n\t\t\t\t\t\tlogo: {\n\t\t\t\t\t\t\ttype: appearance.branding?.logo?.type,\n\t\t\t\t\t\t\tdark: appearance.branding?.logo?.dark,\n\t\t\t\t\t\t\tdarkSvg: appearance.branding?.logo?.darkSvg,\n\t\t\t\t\t\t\tlight: appearance.branding?.logo?.light,\n\t\t\t\t\t\t\tlightSvg: appearance.branding?.logo?.lightSvg,\n\t\t\t\t\t\t},\n\t\t\t\t\t\ticon: appearance.branding?.icon,\n\t\t\t\t\t},\n\t\t\t\t\tbackgroundColor: {\n\t\t\t\t\t\t...fallbacks.backgroundColor,\n\t\t\t\t\t\t...removeInvalid(appearance.backgroundColor),\n\t\t\t\t\t},\n\t\t\t\t} as WiredAppearance;\n\t\t\t},\n\t\t},\n\t);\n}\n","import type { Context } from '../context';\nimport type { Area, Page } from '../payload-types';\nimport type { Locale } from '../locales';\nimport { createCollectionLoader } from '../loader';\n\nexport interface WiredArea extends Omit<Area, 'page'> {\n\tpage?: Page | null;\n}\n\nexport default function (ctx: Context, locale: Locale) {\n\tconst areas = createCollectionLoader(\n\t\t() =>\n\t\t\tctx.api.fetchCmsCollection<Area>('areas', {\n\t\t\t\tsort: '_order',\n\t\t\t\tlocale,\n\t\t\t}),\n\t\t{\n\t\t\ttransform: (areas): WiredArea[] =>\n\t\t\t\tareas.map((area) => ({\n\t\t\t\t\t...area,\n\t\t\t\t\tpage: typeof area.page === 'object' ? area.page : null,\n\t\t\t\t})),\n\t\t},\n\t);\n\n\treturn {\n\t\tall: areas,\n\t};\n}\n","import type { Context } from '../context';\nimport type { Author } from '../payload-types';\nimport type { Locale } from '../locales';\nimport { createCollectionLoader } from '../loader';\n\nexport interface WiredAuthor extends Omit<Author, 'slug'> {\n\tslug: string;\n}\n\nexport default function (ctx: Context, locale: Locale) {\n\tconst authors = createCollectionLoader(\n\t\tasync () => ctx.api.fetchCmsCollection<Author>('authors', { locale }),\n\t\t{\n\t\t\ttransform: (authors) => {\n\t\t\t\tconst validAuthors = authors.filter((author) => author.slug);\n\t\t\t\treturn validAuthors as WiredAuthor[];\n\t\t\t},\n\t\t},\n\t);\n\n\treturn {\n\t\tall: authors,\n\t\tfindBySlug: async (slug: string) => {\n\t\t\treturn authors.find((author) => author.slug === slug);\n\t\t},\n\t};\n}\n","import type { Context } from '../context';\nimport type { Banner } from '../payload-types';\nimport type { Locale } from '../locales';\nimport { createCollectionLoader } from '../loader';\n\nexport default function (ctx: Context, locale: Locale) {\n\tconst banners = createCollectionLoader(async () =>\n\t\tctx.api.fetchCmsCollection<Banner>('banners', { locale }),\n\t);\n\n\treturn {\n\t\tall: banners,\n\t};\n}\n","export function decodeHtml(str: string): string {\n\treturn str\n\t\t.replace(/&/g, '&')\n\t\t.replace(/</g, '<')\n\t\t.replace(/>/g, '>')\n\t\t.replace(/"/g, '\"')\n\t\t.replace(/'/g, \"'\");\n}\n","import type { Context } from '../context';\nimport type { Category } from '../payload-types';\nimport type { Locale } from '../locales';\nimport { decodeHtml } from '../decode-html';\nimport type { Locales } from '../locales';\nimport { createCollectionLoader } from '../loader';\n\nexport type CategoryBreadcrumb = { label: string; url: string };\n\nexport interface WiredCategory extends Omit<Category, 'parent' | 'slug'> {\n\tslug: string;\n\tparent?: WiredCategory;\n\tchildren: WiredCategory[];\n\tpath: string;\n\tbreadcrumbs: CategoryBreadcrumb[];\n}\n\n/**\n * A category plus how many posts are filed under it. The count follows the same\n * rule as `cms.posts.findByCategory`, counting a post under its primary and its\n * secondary categories alike, so the number a listing prints is the number of\n * entries the category page then shows.\n */\nexport interface CountedCategory extends WiredCategory {\n\tpostCount: number;\n}\n\nfunction getCategoryPath(category: WiredCategory): string {\n\tif (!category.parent) {\n\t\treturn category.slug;\n\t}\n\treturn `${getCategoryPath(category.parent)}/${category.slug}`;\n}\n\nfunction getCategoryBreadcrumbs(\n\tcategory: WiredCategory,\n\tlocale: Locale,\n\tprefixPath: Locales['prefixPath'],\n): CategoryBreadcrumb[] {\n\tconst ancestors = category.parent\n\t\t? getCategoryBreadcrumbs(category.parent, locale, prefixPath)\n\t\t: [];\n\tconst path = getCategoryPath(category);\n\treturn [\n\t\t...ancestors,\n\t\t{\n\t\t\tlabel: category.title,\n\t\t\turl: prefixPath(`/blog/category/${path}`, locale),\n\t\t},\n\t];\n}\n\nexport default function (ctx: Context, locale: Locale) {\n\tconst categories = createCollectionLoader(\n\t\tasync () => ctx.api.fetchCmsCollection<Category>('categories', { locale }),\n\t\t{\n\t\t\ttransform: (categories) => {\n\t\t\t\tconst catMap = new Map<string, WiredCategory>(\n\t\t\t\t\tcategories\n\t\t\t\t\t\t.filter((category) => category.slug)\n\t\t\t\t\t\t.map((category) => [\n\t\t\t\t\t\t\tcategory.id,\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t...category,\n\t\t\t\t\t\t\t\ttitle: decodeHtml(category.title),\n\t\t\t\t\t\t\t\tchildren: [],\n\t\t\t\t\t\t\t\tpath: category.slug as string,\n\t\t\t\t\t\t\t\tbreadcrumbs: [],\n\t\t\t\t\t\t\t} as WiredCategory,\n\t\t\t\t\t\t]),\n\t\t\t\t);\n\n\t\t\t\tconst wireRelationships = (category: WiredCategory) => {\n\t\t\t\t\tif (typeof category.parent === 'string') {\n\t\t\t\t\t\tconst parent = catMap.get(category.parent);\n\t\t\t\t\t\tif (parent) {\n\t\t\t\t\t\t\tcategory.parent = parent;\n\t\t\t\t\t\t\tparent.children.push(category);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\tcatMap.forEach((category) => wireRelationships(category));\n\n\t\t\t\tcatMap.forEach((category) => {\n\t\t\t\t\tcategory.path = getCategoryPath(category);\n\t\t\t\t\tcategory.breadcrumbs = getCategoryBreadcrumbs(\n\t\t\t\t\t\tcategory,\n\t\t\t\t\t\tlocale,\n\t\t\t\t\t\tctx.locales.prefixPath,\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\treturn Array.from(catMap.values());\n\t\t\t},\n\t\t},\n\t);\n\n\treturn {\n\t\tall: categories,\n\t\twire: async (category: Category | string | null | undefined) => {\n\t\t\tif (!category) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst id = typeof category === 'string' ? category : category.id;\n\n\t\t\treturn (await categories()).find((cat) => cat.id === id);\n\t\t},\n\t};\n}\n","import type { Context } from '../context';\nimport type { Form } from '../payload-types';\nimport type { Locale } from '../locales';\nimport { createCollectionLoader } from '../loader';\n\nexport default function (ctx: Context, locale: Locale) {\n\t// Forms are fetched on their own instead of relying on the copy populated\n\t// inside page/global blocks: those requests disable locale fallback, so an\n\t// untranslated label would come back null and render an unusable field.\n\t// A default-locale label beats a blank one.\n\tconst forms = createCollectionLoader(() =>\n\t\tctx.api.fetchCmsCollection<Form>('forms', { locale, fallback: 'default' }),\n\t);\n\n\tconst findById = async (id: string): Promise<Form | null> =>\n\t\t(await forms.find((form: Form) => form.id === id)) ?? null;\n\n\treturn {\n\t\tall: forms,\n\t\tfindById,\n\t\t// Swaps a form reference coming from a block for its localized document\n\t\tresolve: async (form: Form | string): Promise<Form | null> => {\n\t\t\tif (typeof form === 'string') {\n\t\t\t\treturn await findById(form);\n\t\t\t}\n\t\t\treturn (await findById(form.id)) ?? form;\n\t\t},\n\t};\n}\n","import type { Context } from '../context';\nimport type { HeaderFooter } from '../payload-types';\nimport type { Locale } from '../locales';\nimport { createGlobalLoader } from '../loader';\n\nexport type CmsHeader = NonNullable<NonNullable<HeaderFooter>['header']>;\nexport type CmsFooter = NonNullable<NonNullable<HeaderFooter>['footer']>;\n\nexport type CmsMainMenu = NonNullable<CmsHeader['mainMenu']>;\nexport type CmsMenuItem = NonNullable<CmsMainMenu[0]['menuItem']>;\nexport type CmsLink = NonNullable<CmsMenuItem['mainLink']>;\nexport type CmsSocialLinks = NonNullable<CmsHeader['socialLinks']>;\nexport type CmsCallToActionLinks = NonNullable<CmsHeader['callToActionLinks']>;\n\nexport default function (ctx: Context, locale: Locale) {\n\treturn createGlobalLoader(async () =>\n\t\tctx.api.fetchCmsGlobalCollection<HeaderFooter>('header-footer', { locale }),\n\t);\n}\n","import type { Context } from '../context';\nimport type { ImageLink } from '../payload-types';\nimport type { Locale } from '../locales';\nimport { createCollectionLoader } from '../loader';\n\nexport default function (ctx: Context, locale: Locale) {\n\tconst imageLinks = createCollectionLoader(async () =>\n\t\tctx.api.fetchCmsCollection<ImageLink>('image-links', { locale }),\n\t);\n\n\treturn {\n\t\tall: imageLinks,\n\t};\n}\n","import type { Context } from '../context';\nimport type { Media } from '../payload-types';\nimport type { Locale } from '../locales';\nimport { createCollectionLoader } from '../loader';\n\nexport default function (ctx: Context, locale: Locale) {\n\t// depth: 0 — an upload's only relationship is `project`, which the CMS's\n\t// multi-tenant plugin pins at maxDepth 0, so the response is identical to\n\t// the default depth=2 one. Populating it costs roughly 3x per page, and\n\t// this is the biggest collection a build reads.\n\tconst media = createCollectionLoader(async () =>\n\t\tctx.api.fetchCmsCollection<Media>('media', { locale, depth: 0 }),\n\t);\n\n\treturn {\n\t\tall: media,\n\t};\n}\n","import type { Context } from '../context';\nimport type { Options } from '../payload-types';\nimport type { Locale } from '../locales';\nimport { createGlobalLoader } from '../loader';\n\nexport default function (ctx: Context, locale: Locale) {\n\treturn createGlobalLoader(async () =>\n\t\tctx.api.fetchCmsGlobalCollection<Options>('options', { locale }),\n\t);\n}\n","import type { Context } from '../context';\nimport type { Page } from '../payload-types';\nimport type { Locale } from '../locales';\nimport { createCollectionLoader } from '../loader';\n\nexport interface WiredPage extends Omit<Page, 'parent'> {\n\tparent?: WiredPage;\n\tchildren: WiredPage[];\n\tpath: string;\n}\n\nexport default function (ctx: Context, locale: Locale) {\n\tconst pages = createCollectionLoader(\n\t\tasync () =>\n\t\t\tctx.api.fetchCmsCollection<Page>('pages', {\n\t\t\t\tstatus: 'published',\n\t\t\t\tlocale,\n\t\t\t}),\n\t\t{\n\t\t\ttransform: (rawPages): WiredPage[] => {\n\t\t\t\t// Pass 1: build map with path derived from Payload's breadcrumbs plugin\n\t\t\t\tconst pageMap = new Map<string, WiredPage>(\n\t\t\t\t\trawPages\n\t\t\t\t\t\t.filter((page) => page.slug)\n\t\t\t\t\t\t.map((page) => {\n\t\t\t\t\t\t\tconst path = (page.breadcrumbs?.at(-1)?.url ?? page.slug).replace(\n\t\t\t\t\t\t\t\t/^\\//,\n\t\t\t\t\t\t\t\t'',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn [page.id, { ...page, children: [], path } as WiredPage];\n\t\t\t\t\t\t}),\n\t\t\t\t);\n\n\t\t\t\t// Pass 2: wire parent references and populate children[]\n\t\t\t\t// parent may be a string ID (depth=0) or a populated object (depth>0)\n\t\t\t\tpageMap.forEach((page) => {\n\t\t\t\t\tconst rawParent = page.parent as\n\t\t\t\t\t\t| WiredPage\n\t\t\t\t\t\t| string\n\t\t\t\t\t\t| null\n\t\t\t\t\t\t| undefined;\n\t\t\t\t\tconst parentId =\n\t\t\t\t\t\ttypeof rawParent === 'string' ? rawParent : rawParent?.id;\n\t\t\t\t\tif (parentId) {\n\t\t\t\t\t\tconst parent = pageMap.get(parentId);\n\t\t\t\t\t\tif (parent) {\n\t\t\t\t\t\t\tpage.parent = parent;\n\t\t\t\t\t\t\tparent.children.push(page);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tpage.parent = undefined;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t// Pass 3: sort each parent's children by order (nulls sort last)\n\t\t\t\tpageMap.forEach((page) => {\n\t\t\t\t\tpage.children.sort((a, b) => {\n\t\t\t\t\t\tif (a.order == null && b.order == null) {\n\t\t\t\t\t\t\treturn 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (a.order == null) {\n\t\t\t\t\t\t\treturn 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (b.order == null) {\n\t\t\t\t\t\t\treturn -1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn a.order - b.order;\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\treturn Array.from(pageMap.values());\n\t\t\t},\n\t\t},\n\t);\n\n\treturn {\n\t\tall: pages,\n\t\tfindByPath: async (path: string) =>\n\t\t\t(await pages()).find((p) => p.path === path),\n\t\tfindById: async (id: string) =>\n\t\t\t(await pages()).find((p) => p.id === id) ?? null,\n\t};\n}\n","import type { Context } from '../context';\nimport { TfIdf } from 'natural/lib/natural/tfidf/index.js';\nimport type { Author, Category, Media, Post, Tag } from '../payload-types';\nimport type { Locale } from '../locales';\nimport type { WiredCategory } from './categories';\nimport { createCollectionLoader } from '../loader';\nimport type { WiredTag } from './tags';\n\nexport interface WiredPost extends Post {\n\tcoverImage?: Media | null;\n\tcategory?: WiredCategory | null;\n\tsecondaryCategories?: WiredCategory[];\n\ttags?: WiredTag[];\n\tsearchTokens: string;\n}\n\nexport async function wirePost(\n\tctx: Context,\n\tpost: Post | undefined,\n\tlocale: Locale,\n\ttags: Tag[] = [],\n): Promise<WiredPost | undefined> {\n\tif (!post) {\n\t\treturn undefined;\n\t}\n\n\tlet coverImage = post.coverImage;\n\tif (typeof coverImage === 'string') {\n\t\t// TODO: I think we need to be getting the actual image here instead\n\t\tcoverImage = undefined;\n\t}\n\n\tconst postTags = post.tags\n\t\t?.map((tag) =>\n\t\t\ttypeof tag === 'string' ? tags.find((t) => t.id === tag) : tag,\n\t\t)\n\t\t.filter((tag): tag is WiredTag => tag !== undefined);\n\n\tconst cms = ctx.cms(locale);\n\n\tconst secondaryCategories = (\n\t\tawait Promise.all(\n\t\t\t(post.secondaryCategories ?? []).map((c) =>\n\t\t\t\tcms.categories.wire(c as Category | string),\n\t\t\t),\n\t\t)\n\t).filter((c): c is WiredCategory => c != null);\n\n\tconst category = await cms.categories.wire(post.category);\n\tconst categoryTitles = [category, ...secondaryCategories]\n\t\t.filter((c): c is WiredCategory => c != null)\n\t\t.map((c) => c.title);\n\n\treturn {\n\t\t...post,\n\t\tcategory,\n\t\tsecondaryCategories,\n\t\tcoverImage,\n\t\ttags: postTags,\n\t\tsearchTokens: `${post.title} ${categoryTitles.join(' ')}`,\n\t};\n}\n\n// Only top-level team-member blocks with filter='custom' are indexed.\n// Nested blocks (inside tabs/columns) are intentionally out of scope.\nfunction collectCustomTeamMemberIds(post: WiredPost): string[] {\n\tconst ids: string[] = [];\n\tfor (const block of post.contentBlocks ?? []) {\n\t\tif (block.blockType !== 'team-member') {\n\t\t\tcontinue;\n\t\t}\n\t\tif (block.filter !== 'custom') {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const m of block.members ?? []) {\n\t\t\tconst id = typeof m === 'string' ? m : m?.id;\n\t\t\tif (id) {\n\t\t\t\tids.push(id);\n\t\t\t}\n\t\t}\n\t}\n\treturn ids;\n}\n\nexport default function (ctx: Context, locale: Locale) {\n\tconst tfIdf = new TfIdf();\n\tconst keyedPosts: Record<string, WiredPost> = {};\n\tlet teamMemberIndex: Promise<Map<string, WiredPost[]>> | null = null;\n\n\tconst posts = createCollectionLoader(\n\t\tasync () =>\n\t\t\tctx.api.fetchCmsCollection<Post>('posts', {\n\t\t\t\tstatus: 'published',\n\t\t\t\tsort: '-publishDate',\n\t\t\t\tlocale,\n\t\t\t}) || [],\n\t\t{\n\t\t\ttransform: async (posts): Promise<WiredPost[]> => {\n\t\t\t\t// Lazy-resolve cms here (not at factory call time) to avoid the\n\t\t\t\t// circular init: createCms → buildCms → posts() → createCms → ...\n\t\t\t\tconst cms = ctx.cms(locale);\n\t\t\t\tconst tags = await cms.tags.all();\n\n\t\t\t\tconst wiredPosts = await Promise.all(\n\t\t\t\t\tposts\n\t\t\t\t\t\t?.filter((post) => post.slug)\n\t\t\t\t\t\t.map(async (post) => {\n\t\t\t\t\t\t\treturn wirePost(ctx, post, locale, tags) as Promise<WiredPost>;\n\t\t\t\t\t\t}) || [],\n\t\t\t\t);\n\n\t\t\t\tconst currentYear = new Date().getFullYear();\n\n\t\t\t\t// we don't want every post used for performance reasons so instead use the last 4 years of\n\t\t\t\t// posts and if there are less than 200 then keep going until we have 100\n\t\t\t\twiredPosts.forEach((post) => {\n\t\t\t\t\tif (\n\t\t\t\t\t\tpost.publishDate &&\n\t\t\t\t\t\t(new Date(post.publishDate).getFullYear() > currentYear - 4 ||\n\t\t\t\t\t\t\ttfIdf.documents.length < 200)\n\t\t\t\t\t) {\n\t\t\t\t\t\ttfIdf.addDocument(post.searchTokens, post.id);\n\t\t\t\t\t\tkeyedPosts[post.id] = post;\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn wiredPosts;\n\t\t\t},\n\t\t},\n\t);\n\n\treturn {\n\t\tall: posts,\n\t\texists: async () => !!(await posts()).length,\n\t\tpage: async (...args: Parameters<typeof posts.page>) => {\n\t\t\treturn posts.page(...args);\n\t\t},\n\t\tlatest: async () => {\n\t\t\treturn posts.page(1, 6);\n\t\t},\n\t\tfeatured: async () => {\n\t\t\treturn (await posts()).filter((post) => post.featured).slice(0, 10);\n\t\t},\n\t\t// TF-IDF similarity over title + category titles. When similarity\n\t\t// yields fewer than `limit` posts, pad with the latest posts from the\n\t\t// same category (newest first, secondary categories count too).\n\t\trelated: async (post: WiredPost, limit: number = 6) => {\n\t\t\tconst scores: { score: number; postId: string }[] = [];\n\t\t\ttfIdf.tfidfs(post.searchTokens, (_, score, postId) => {\n\t\t\t\tscores.push({\n\t\t\t\t\tpostId: postId as string,\n\t\t\t\t\tscore,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tconst similar = scores\n\t\t\t\t.filter((entry) => entry.postId !== post.id && entry.score > 0)\n\t\t\t\t.sort((a, b) => b.score - a.score)\n\t\t\t\t.slice(0, limit)\n\t\t\t\t.map((entry) => keyedPosts[entry.postId]);\n\n\t\t\tif (similar.length >= limit) {\n\t\t\t\treturn similar;\n\t\t\t}\n\n\t\t\tconst categoryId = post.category?.id;\n\t\t\tconst seen = new Set(similar.map((p) => p.id));\n\t\t\tconst fromCategory = await posts.filter(\n\t\t\t\t(p) =>\n\t\t\t\t\tp.id !== post.id &&\n\t\t\t\t\t!seen.has(p.id) &&\n\t\t\t\t\t(!categoryId ||\n\t\t\t\t\t\tp.category?.id === categoryId ||\n\t\t\t\t\t\t(p.secondaryCategories ?? []).some(\n\t\t\t\t\t\t\t(c: WiredCategory) => c.id === categoryId,\n\t\t\t\t\t\t)),\n\t\t\t);\n\t\t\treturn [...similar, ...fromCategory.slice(0, limit - similar.length)];\n\t\t},\n\t\tfindBySlug: async (slug: string) => {\n\t\t\treturn posts.find((post) => post.slug === slug);\n\t\t},\n\t\tfindByAuthor: async (author: Author) => {\n\t\t\treturn posts.filter((post) => post.author?.id === author.id);\n\t\t},\n\t\tfindByTeamMember: async (memberId: string) => {\n\t\t\tif (!teamMemberIndex) {\n\t\t\t\tteamMemberIndex = (async () => {\n\t\t\t\t\tconst all = await posts();\n\t\t\t\t\tconst index = new Map<string, WiredPost[]>();\n\t\t\t\t\tfor (const post of all) {\n\t\t\t\t\t\tfor (const id of collectCustomTeamMemberIds(post)) {\n\t\t\t\t\t\t\tconst list = index.get(id);\n\t\t\t\t\t\t\tif (list) {\n\t\t\t\t\t\t\t\tlist.push(post);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tindex.set(id, [post]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (const list of index.values()) {\n\t\t\t\t\t\tlist.sort(\n\t\t\t\t\t\t\t(a, b) =>\n\t\t\t\t\t\t\t\tnew Date(b.publishDate ?? 0).getTime() -\n\t\t\t\t\t\t\t\tnew Date(a.publishDate ?? 0).getTime(),\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn index;\n\t\t\t\t})();\n\t\t\t}\n\t\t\treturn (await teamMemberIndex).get(memberId) ?? [];\n\t\t},\n\t\tfindByCategory: async (category: Category) => {\n\t\t\treturn posts.filter(\n\t\t\t\t(post) =>\n\t\t\t\t\tpost.category === category.id ||\n\t\t\t\t\t(post.category as Category)?.id === category.id ||\n\t\t\t\t\t(post.secondaryCategories ?? []).some(\n\t\t\t\t\t\t(c: WiredCategory) => c.id === category.id,\n\t\t\t\t\t),\n\t\t\t);\n\t\t},\n\t\tfindByTag: async (tag: Tag) => {\n\t\t\treturn posts.filter((post) => {\n\t\t\t\treturn post.tags?.some((postTag: WiredTag) => postTag.id === tag.id);\n\t\t\t});\n\t\t},\n\t\tnextInCategory: async (post: WiredPost): Promise<WiredPost | undefined> => {\n\t\t\tif (!post.category) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t\tconst allCategoryIds = new Set([\n\t\t\t\t(post.category as Category).id,\n\t\t\t\t...(post.secondaryCategories ?? []).map((c) => c.id),\n\t\t\t]);\n\t\t\tconst categoryPosts = await posts.filter(\n\t\t\t\t(p) =>\n\t\t\t\t\tallCategoryIds.has((p.category as Category)?.id ?? '') ||\n\t\t\t\t\t(p.secondaryCategories ?? []).some((c: WiredCategory) =>\n\t\t\t\t\t\tallCategoryIds.has(c.id),\n\t\t\t\t\t),\n\t\t\t);\n\t\t\tconst idx = categoryPosts.findIndex((p) => p.id === post.id);\n\t\t\treturn idx >= 0 && idx + 1 < categoryPosts.length\n\t\t\t\t? categoryPosts[idx + 1]\n\t\t\t\t: undefined;\n\t\t},\n\t};\n}\n","import type { Context } from '../context';\nimport { createGlobalLoader } from '../loader';\nimport type { Project } from '../payload-types';\n\n// The project document is fetched once, at config time, and handed to\n// `createClient`. It is the same for every locale.\nexport default function (ctx: Context) {\n\treturn createGlobalLoader(async () => {\n\t\tif (!ctx.options.project) {\n\t\t\tthrow new Error(\n\t\t\t\t'cms.project() needs the `project` option of createClient: the Project document fetched at config time.',\n\t\t\t);\n\t\t}\n\t\treturn ctx.options.project as Project;\n\t});\n}\n","import type { Context } from '../context';\nimport type { Question, QuestionTag } from '../payload-types';\nimport type { Locale } from '../locales';\nimport { createCollectionLoader } from '../loader';\n\nexport interface WiredQuestion extends Omit<Question, 'tags'> {\n\ttags: QuestionTag[];\n}\n\nexport default function (ctx: Context, locale: Locale) {\n\tconst questions = createCollectionLoader(\n\t\tasync () =>\n\t\t\tctx.api.fetchCmsCollection<Question>('questions', {\n\t\t\t\tlocale,\n\t\t\t\tsort: '_questions_questions_order',\n\t\t\t}),\n\t\t{\n\t\t\ttransform: (questions) => {\n\t\t\t\tconst validQuestions = questions.filter((question) => question.tags);\n\t\t\t\treturn validQuestions as WiredQuestion[];\n\t\t\t},\n\t\t},\n\t);\n\n\treturn {\n\t\tall: questions,\n\t\tfilterByTag: async (searchTag: QuestionTag) => {\n\t\t\treturn questions.filter((question: WiredQuestion) =>\n\t\t\t\tquestion.tags.some((tag) => {\n\t\t\t\t\treturn tag.id === searchTag.id;\n\t\t\t\t}),\n\t\t\t);\n\t\t},\n\t};\n}\n","import type { Context } from '../context';\nimport type { Seo } from '../payload-types';\nimport type { Locale } from '../locales';\nimport { createGlobalLoader } from '../loader';\n\nexport default function (ctx: Context, locale: Locale) {\n\treturn createGlobalLoader(async () =>\n\t\tctx.api.fetchCmsGlobalCollection<Seo>('seo', { locale }),\n\t);\n}\n","import type { Context } from '../context';\nimport type { Tag } from '../payload-types';\nimport type { Locale } from '../locales';\nimport { createCollectionLoader } from '../loader';\n\nexport interface WiredTag extends Tag {}\n\nexport default function (ctx: Context, locale: Locale) {\n\tconst tags = createCollectionLoader(\n\t\tasync () => ctx.api.fetchCmsCollection<Tag>('tags', { locale }),\n\t\t{\n\t\t\ttransform: (tags) => {\n\t\t\t\tconst validTags = tags.filter((tag) => tag.slug);\n\t\t\t\treturn validTags as WiredTag[];\n\t\t\t},\n\t\t},\n\t);\n\n\treturn {\n\t\tall: tags,\n\t\tfindBySlug: async (slug: string) => {\n\t\t\treturn tags.find((tag) => tag.slug === slug);\n\t\t},\n\t};\n}\n","import type { Context } from '../context';\nimport type { MemberType, TeamMember } from '../payload-types';\nimport type { Locale } from '../locales';\nimport type { WiredArea } from './areas';\nimport { createCollectionLoader } from '../loader';\n\nexport interface WiredTeamMember extends Omit<TeamMember, 'slug' | 'areas'> {\n\tslug: string;\n\t// Built from `memberAreas` at wire time. Kept under `areas` for backward\n\t// compatibility with consumers that read `member.areas.docs` (the shape\n\t// Payload's `join` field used to produce before the schema flipped to a\n\t// member-side `memberAreas` array).\n\tareas?: {\n\t\tdocs?: (string | WiredArea)[];\n\t\thasNextPage?: boolean;\n\t\ttotalDocs?: number;\n\t};\n}\n\nexport default function (ctx: Context, locale: Locale) {\n\tconst members = createCollectionLoader(\n\t\tasync () =>\n\t\t\tctx.api.fetchCmsCollection<TeamMember>('team-members', {\n\t\t\t\tsort: '_order',\n\t\t\t\tlocale,\n\t\t\t}),\n\t\t{\n\t\t\ttransform: async (members): Promise<WiredTeamMember[]> => {\n\t\t\t\tconst allAreas = await ctx.cms(locale).areas.all();\n\t\t\t\tconst areaById = new Map(allAreas.map((a) => [a.id, a]));\n\n\t\t\t\treturn members\n\t\t\t\t\t.filter((m) => m.slug)\n\t\t\t\t\t.map((m): WiredTeamMember => {\n\t\t\t\t\t\tconst docs: (string | WiredArea)[] = [];\n\t\t\t\t\t\tfor (const row of m.memberAreas ?? []) {\n\t\t\t\t\t\t\tconst ref = row.area;\n\t\t\t\t\t\t\tconst id = typeof ref === 'string' ? ref : ref.id;\n\t\t\t\t\t\t\tconst hit = areaById.get(id);\n\t\t\t\t\t\t\tif (hit) {\n\t\t\t\t\t\t\t\tdocs.push(hit);\n\t\t\t\t\t\t\t} else if (typeof ref === 'string') {\n\t\t\t\t\t\t\t\tdocs.push(ref);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdocs.push({\n\t\t\t\t\t\t\t\t\t...ref,\n\t\t\t\t\t\t\t\t\tpage: typeof ref.page === 'object' ? ref.page : null,\n\t\t\t\t\t\t\t\t} as WiredArea);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t...m,\n\t\t\t\t\t\t\tareas: {\n\t\t\t\t\t\t\t\tdocs,\n\t\t\t\t\t\t\t\thasNextPage: false,\n\t\t\t\t\t\t\t\ttotalDocs: docs.length,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} as WiredTeamMember;\n\t\t\t\t\t});\n\t\t\t},\n\t\t},\n\t);\n\n\tconst memberTypes = createCollectionLoader(() =>\n\t\tctx.api.fetchCmsCollection<MemberType>('member-types', {\n\t\t\tsort: '_order',\n\t\t\tlocale,\n\t\t}),\n\t);\n\n\treturn {\n\t\tall: members,\n\t\ttypes: memberTypes,\n\t\tfindBySlug: async (slug: string) => {\n\t\t\treturn members.find((m) => m.slug === slug);\n\t\t},\n\t};\n}\n","import appearance from './collections/appearance';\nimport areas from './collections/areas';\nimport authors from './collections/authors';\nimport banners from './collections/banners';\nimport categories, { type CountedCategory } from './collections/categories';\nimport forms from './collections/forms';\nimport headerFooter from './collections/header-footer';\nimport imageLinks from './collections/image-links';\nimport media from './collections/media';\nimport options from './collections/options';\nimport pages from './collections/pages';\nimport posts from './collections/posts';\nimport project from './collections/project';\nimport questions from './collections/questions';\nimport seo from './collections/seo';\nimport tags from './collections/tags';\nimport teamMembers from './collections/team-members';\nimport type { Context } from './context';\nimport type { Locale } from './locales';\n\nexport type Cms = ReturnType<typeof buildCms>;\n\nexport function buildCms(ctx: Context, locale: Locale) {\n\tconst categoriesService = categories(ctx, locale);\n\tconst postsService = posts(ctx, locale);\n\n\treturn {\n\t\tlocale,\n\t\tareas: areas(ctx, locale),\n\t\tauthors: authors(ctx, locale),\n\t\tbanners: banners(ctx, locale),\n\t\tappearance: appearance(ctx),\n\t\timageLinks: imageLinks(ctx, locale),\n\t\tcategories: {\n\t\t\t...categoriesService,\n\t\t\tpopulated: async () => {\n\t\t\t\tconst cats = await categoriesService.all();\n\t\t\t\tconst allPosts = await postsService.all();\n\t\t\t\tconst ids = new Set([\n\t\t\t\t\t...allPosts.map((p) => p.category?.id).filter(Boolean),\n\t\t\t\t\t...allPosts.flatMap((p) =>\n\t\t\t\t\t\t(p.secondaryCategories ?? []).map((c) => c.id),\n\t\t\t\t\t),\n\t\t\t\t]);\n\t\t\t\treturn cats.filter((c) => ids.has(c.id));\n\t\t\t},\n\t\t\t// Categories that hold posts, each with how many. `populated()`\n\t\t\t// answers only whether that number is non-zero and has five callers\n\t\t\t// depending on its shape, so this is a second reading of the same\n\t\t\t// fold rather than a change to it. Both collections are already\n\t\t\t// cached, so it costs no extra fetch.\n\t\t\twithCounts: async (): Promise<CountedCategory[]> => {\n\t\t\t\tconst cats = await categoriesService.all();\n\t\t\t\tconst allPosts = await postsService.all();\n\n\t\t\t\tconst counts = new Map<string, number>();\n\t\t\t\tfor (const post of allPosts) {\n\t\t\t\t\tconst ids = new Set(\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tpost.category?.id,\n\t\t\t\t\t\t\t...(post.secondaryCategories ?? []).map((c) => c.id),\n\t\t\t\t\t\t].filter((id): id is string => !!id),\n\t\t\t\t\t);\n\t\t\t\t\tfor (const id of ids) {\n\t\t\t\t\t\tcounts.set(id, (counts.get(id) ?? 0) + 1);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn cats\n\t\t\t\t\t.map((c) => ({ ...c, postCount: counts.get(c.id) ?? 0 }))\n\t\t\t\t\t.filter((c) => c.postCount > 0);\n\t\t\t},\n\t\t},\n\t\tforms: forms(ctx, locale),\n\t\theaderFooter: headerFooter(ctx, locale),\n\t\tmedia: media(ctx, locale),\n\t\toptions: options(ctx, locale),\n\t\tpages: pages(ctx, locale),\n\t\tposts: postsService,\n\t\tproject: project(ctx),\n\t\tquestions: questions(ctx, locale),\n\t\tseo: seo(ctx, locale),\n\t\ttags: tags(ctx, locale),\n\t\tteamMembers: teamMembers(ctx, locale),\n\t};\n}\n","import type { Api } from './api';\nimport type {\n\tAppearance,\n\tMedia,\n\tOptions,\n\tProject,\n\tRedirect,\n} from './payload-types';\nimport type { Routes } from './routes';\n\nfunction createRedirect(\n\troutes: Routes,\n\tfrom: string,\n\tto: Redirect['to'],\n): Record<string, string> | undefined {\n\tif (!to) {\n\t\treturn;\n\t}\n\n\t// These things should never be null but checking anyway for ts\n\tif (to.type === 'custom') {\n\t\tif (!to.url) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn { [from]: to.url };\n\t} else if (!to.reference) {\n\t\treturn;\n\t} else if (typeof to.reference.value === 'string') {\n\t\treturn;\n\t}\n\n\tswitch (to.reference.relationTo) {\n\t\t// NOTE: astro doesn't support external redirects so if this is that then it won't work\n\t\tcase 'pages':\n\t\t\treturn to.reference.value.slug\n\t\t\t\t? { [from]: routes.page(to.reference.value.slug) }\n\t\t\t\t: undefined;\n\t\tcase 'categories':\n\t\t\treturn to.reference.value.slug\n\t\t\t\t? { [from]: routes.blog('category', to.reference.value.slug as string) }\n\t\t\t\t: undefined;\n\t\tdefault:\n\t\t\treturn;\n\t}\n}\n\nexport function createConfigTime(api: Api, defaultRoutes: Routes) {\n\treturn {\n\t\t/** The three documents the Astro config and `createClient` need. */\n\t\tasync fetchProjectSettings(): Promise<{\n\t\t\tproject: Project;\n\t\t\tappearance: Appearance;\n\t\t\toptions: Options;\n\t\t}> {\n\t\t\tconst [project, appearance, options] = await Promise.all([\n\t\t\t\tapi.fetchCmsProject(),\n\t\t\t\tapi.fetchCmsGlobalCollection<Appearance>('appearance', { depth: 2 }),\n\t\t\t\tapi.fetchCmsGlobalCollection<Options>('options', { depth: 2 }),\n\t\t\t]);\n\n\t\t\treturn { project, appearance, options };\n\t\t},\n\n\t\t// Redirects are emitted once at build time for the whole site. Use the\n\t\t// default locale — prefixed paths are handled by page routing, not the\n\t\t// redirect table.\n\t\tasync redirects(): Promise<Record<string, string>> {\n\t\t\tconst docs = await api.fetchCmsCollection<Redirect>('redirects', {\n\t\t\t\tdepth: 2,\n\t\t\t\tlimit: 1000,\n\t\t\t});\n\n\t\t\treturn Object.assign(\n\t\t\t\t{},\n\t\t\t\t...(docs\n\t\t\t\t\t?.map(({ from, to }) => createRedirect(defaultRoutes, from, to))\n\t\t\t\t\t.filter(Boolean) ?? []),\n\t\t\t);\n\t\t},\n\n\t\t/** The favicon source file, or `false` when there is none to read. */\n\t\tasync fetchIconBuffer(icon: Media) {\n\t\t\tif (icon.url) {\n\t\t\t\tconst response = await fetch(\n\t\t\t\t\ticon.url.startsWith('/') ? api.apiUrl(icon.url, {}, false) : icon.url,\n\t\t\t\t\t{ headers: api.buildHeaders() },\n\t\t\t\t);\n\n\t\t\t\tif (response.ok) {\n\t\t\t\t\treturn Buffer.from(await response.arrayBuffer());\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false as const;\n\t\t},\n\t};\n}\n","export interface RateLimiter {\n\tallow(key: string): boolean;\n}\n\ninterface Options {\n\tlimit: number;\n\twindowMs: number;\n\tnow?: () => number;\n}\n\n// Fixed-window counter held in memory. On Vercel each function instance keeps\n// its own table, so this is a best-effort brake on bursts from one client, not\n// a global quota — the Vercel Firewall rate-limit rule is the authoritative one.\nexport function createRateLimiter({\n\tlimit,\n\twindowMs,\n\tnow = Date.now,\n}: Options): RateLimiter {\n\tconst windows = new Map<string, { start: number; count: number }>();\n\n\tfunction sweep(current: number) {\n\t\tfor (const [key, entry] of windows) {\n\t\t\tif (current - entry.start > windowMs) {\n\t\t\t\twindows.delete(key);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tallow(key) {\n\t\t\tconst current = now();\n\t\t\tconst entry = windows.get(key);\n\n\t\t\tif (!entry || current - entry.start > windowMs) {\n\t\t\t\tif (windows.size > 10_000) {\n\t\t\t\t\tsweep(current);\n\t\t\t\t}\n\t\t\t\twindows.set(key, { start: current, count: 1 });\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tentry.count += 1;\n\t\t\treturn entry.count <= limit;\n\t\t},\n\t};\n}\n","export function jsonResponse(body: unknown, status: number) {\n\treturn new Response(JSON.stringify(body), {\n\t\tstatus,\n\t\theaders: { 'Content-Type': 'application/json' },\n\t});\n}\n\nfunction declaredLength(request: Request): number | null {\n\tconst raw = request.headers.get('Content-Length');\n\tif (raw === null) {\n\t\treturn null;\n\t}\n\tconst n = Number(raw);\n\treturn Number.isFinite(n) ? n : null;\n}\n\nexport function exceedsLimit(request: Request, maxBytes: number): boolean {\n\tconst declared = declaredLength(request);\n\treturn declared !== null && declared > maxBytes;\n}\n\nexport type BodyRead<T> =\n\t| { ok: true; value: T }\n\t| { ok: false; response: Response };\n\n// Reads a body without trusting Content-Length: the declared size is a cheap\n// early exit, the actual byte count is what enforces the cap.\nexport async function readBodyWithin(\n\trequest: Request,\n\tmaxBytes: number,\n\ttooLarge: string,\n): Promise<BodyRead<ArrayBuffer>> {\n\tif (exceedsLimit(request, maxBytes)) {\n\t\treturn { ok: false, response: jsonResponse({ error: tooLarge }, 413) };\n\t}\n\n\tconst bytes = await request.arrayBuffer();\n\tif (bytes.byteLength > maxBytes) {\n\t\treturn { ok: false, response: jsonResponse({ error: tooLarge }, 413) };\n\t}\n\treturn { ok: true, value: bytes };\n}\n\nexport async function readJsonBody(\n\trequest: Request,\n\tmaxBytes: number,\n): Promise<BodyRead<unknown>> {\n\tconst read = await readBodyWithin(request, maxBytes, 'Payload too large');\n\tif (!read.ok) {\n\t\treturn read;\n\t}\n\n\ttry {\n\t\treturn {\n\t\t\tok: true,\n\t\t\tvalue: JSON.parse(new TextDecoder().decode(read.value)),\n\t\t};\n\t} catch {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tresponse: jsonResponse({ error: 'Invalid JSON' }, 400),\n\t\t};\n\t}\n}\n\nexport async function readMultipartBody(\n\trequest: Request,\n\tmaxBytes: number,\n): Promise<BodyRead<FormData>> {\n\tconst contentType = request.headers.get('Content-Type') ?? '';\n\tif (!contentType.includes('multipart/form-data')) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tresponse: jsonResponse({ error: 'Expected multipart form data' }, 400),\n\t\t};\n\t}\n\n\tconst read = await readBodyWithin(request, maxBytes, 'File too large');\n\tif (!read.ok) {\n\t\treturn read;\n\t}\n\n\ttry {\n\t\t// Re-wrapping the capped bytes keeps the multipart parser off the raw\n\t\t// request stream, so it can never buffer more than we already allowed.\n\t\tconst value = await new Response(read.value, {\n\t\t\theaders: { 'Content-Type': contentType },\n\t\t}).formData();\n\t\treturn { ok: true, value };\n\t} catch {\n\t\treturn {\n\t\t\tok: false,\n\t\t\tresponse: jsonResponse({ error: 'Invalid multipart body' }, 400),\n\t\t};\n\t}\n}\n","import { jsonResponse } from './http';\nimport type { CmsResult, FormOwnershipCheck } from './types';\n\nexport interface WriteShape {\n\t// Body the browser gets on success; only the new document id goes in.\n\tsuccess(id: string | undefined): unknown;\n\t// CMS statuses the client branches on, each with a fixed message.\n\tpassThrough: Record<number, string>;\n\t// Fixed message for every other failure, answered as 502.\n\tfailed: string;\n}\n\n// Runs a CMS write on behalf of a visitor and shapes the outcome. Never echoes\n// the CMS body: at depth > 0 it carries the populated project (deploy hooks,\n// tokens) and its errors name internal fields.\nexport async function writeThroughCms(\n\tcms: FormOwnershipCheck,\n\tformId: string,\n\twrite: () => Promise<CmsResult>,\n\tshape: WriteShape,\n): Promise<Response> {\n\tlet result: CmsResult;\n\ttry {\n\t\tif (!(await cms.formBelongsToProject(formId))) {\n\t\t\treturn jsonResponse({ error: 'Invalid form id' }, 400);\n\t\t}\n\t\tresult = await write();\n\t} catch {\n\t\treturn jsonResponse({ error: shape.failed }, 502);\n\t}\n\n\tif (result.status >= 200 && result.status < 300) {\n\t\treturn jsonResponse(shape.success(result.id), 201);\n\t}\n\tconst message = shape.passThrough[result.status];\n\tif (message !== undefined) {\n\t\t// Field *names* only, and only ones the CMS named: enough for the browser\n\t\t// to put an error under the right input, while the message it shows stays\n\t\t// the site's own. The CMS's wording never travels.\n\t\tconst fields = result.fields?.length ? { fields: result.fields } : {};\n\t\treturn jsonResponse({ error: message, ...fields }, result.status);\n\t}\n\treturn jsonResponse({ error: shape.failed }, 502);\n}\n","import type { Locale } from '../locales';\nimport { writeThroughCms } from './cms-write';\nimport { jsonResponse, readJsonBody } from './http';\nimport type { CmsResult, FormOwnershipCheck, ProxyDeps } from './types';\n\nexport interface SubmissionsCmsClient extends FormOwnershipCheck {\n\tcreateSubmission(\n\t\tpayload: {\n\t\t\tform: string;\n\t\t\tproject: string;\n\t\t\tdata: Record<string, unknown>;\n\t\t\thoneypot: string;\n\t\t},\n\t\tlocale?: Locale,\n\t): Promise<CmsResult>;\n}\n\n// Generous for a contact form, tiny for anything trying to hurt the CMS\nexport const MAX_SUBMISSION_BYTES = 64 * 1024;\n\n// Every locale the CMS schema knows: the default when a site names none.\nconst CMS_LOCALES: readonly Locale[] = ['es', 'en'];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n// The field ships empty; a real visitor never touches it. Anything else in\n// there, whatever its type, was put there by a script.\nfunction honeypotFilled(value: unknown): boolean {\n\treturn value !== undefined && value !== null && value !== '';\n}\n\nexport async function handleFormSubmission(\n\trequest: Request,\n\tdeps: ProxyDeps<SubmissionsCmsClient>,\n): Promise<Response> {\n\tif (deps.rateLimiter && !deps.rateLimiter.allow(deps.clientAddress)) {\n\t\treturn jsonResponse({ error: 'Too many requests' }, 429);\n\t}\n\n\tconst read = await readJsonBody(request, MAX_SUBMISSION_BYTES);\n\tif (!read.ok) {\n\t\treturn read.response;\n\t}\n\tconst body = read.value;\n\n\tif (!isRecord(body)) {\n\t\treturn jsonResponse({ error: 'Invalid data' }, 400);\n\t}\n\tif (typeof body.form !== 'string' || !body.form) {\n\t\treturn jsonResponse({ error: 'Invalid form id' }, 400);\n\t}\n\t// The browser does not get to pick the tenant our API key writes into\n\tif (body.project !== deps.projectId) {\n\t\treturn jsonResponse({ error: 'Invalid project id' }, 400);\n\t}\n\tif (!isRecord(body.data)) {\n\t\treturn jsonResponse({ error: 'Invalid data' }, 400);\n\t}\n\t// A filled honeypot is a bot; don't spend a CMS call on it\n\tif (honeypotFilled(body.honeypot)) {\n\t\treturn jsonResponse({ error: 'Invalid submission' }, 400);\n\t}\n\n\tconst form = body.form;\n\tconst data = body.data;\n\tconst locales = deps.locales ?? CMS_LOCALES;\n\tconst locale =\n\t\ttypeof body.locale === 'string' && locales.includes(body.locale)\n\t\t\t? (body.locale as Locale)\n\t\t\t: undefined;\n\n\treturn writeThroughCms(\n\t\tdeps.cms,\n\t\tform,\n\t\t() =>\n\t\t\tdeps.cms.createSubmission(\n\t\t\t\t{ form, project: deps.projectId, data, honeypot: '' },\n\t\t\t\tlocale,\n\t\t\t),\n\t\t{\n\t\t\tsuccess: (id) => ({ ok: true, id }),\n\t\t\tpassThrough: { 400: 'Invalid submission' },\n\t\t\tfailed: 'Submission failed',\n\t\t},\n\t);\n}\n","import { writeThroughCms } from './cms-write';\nimport { jsonResponse, readMultipartBody } from './http';\nimport { MAX_REQUEST_BYTES, MAX_UPLOAD_BYTES } from './upload-policy';\nimport type { CmsResult, FormOwnershipCheck, ProxyDeps } from './types';\n\nexport interface UploadsCmsClient extends FormOwnershipCheck {\n\tcreateUpload(\n\t\tfile: File,\n\t\tpayload: { form: string; project: string },\n\t): Promise<CmsResult>;\n}\n\nfunction parsePayload(\n\traw: FormDataEntryValue | null,\n): { form: string; project: unknown } | null {\n\tif (typeof raw !== 'string') {\n\t\treturn null;\n\t}\n\ttry {\n\t\tconst parsed = JSON.parse(raw);\n\t\tif (\n\t\t\ttypeof parsed !== 'object' ||\n\t\t\tparsed === null ||\n\t\t\ttypeof parsed.form !== 'string' ||\n\t\t\t!parsed.form\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\t\treturn { form: parsed.form, project: parsed.project };\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nexport async function handleFormUpload(\n\trequest: Request,\n\tdeps: ProxyDeps<UploadsCmsClient>,\n): Promise<Response> {\n\tif (deps.rateLimiter && !deps.rateLimiter.allow(deps.clientAddress)) {\n\t\treturn jsonResponse({ error: 'Too many requests' }, 429);\n\t}\n\n\tconst read = await readMultipartBody(request, MAX_REQUEST_BYTES);\n\tif (!read.ok) {\n\t\treturn read.response;\n\t}\n\tconst formData = read.value;\n\n\tconst file = formData.get('file');\n\tif (!(file instanceof File)) {\n\t\treturn jsonResponse({ error: 'Missing file' }, 400);\n\t}\n\tif (file.size > MAX_UPLOAD_BYTES) {\n\t\treturn jsonResponse({ error: 'File too large' }, 413);\n\t}\n\n\tconst payload = parsePayload(formData.get('_payload'));\n\tif (!payload) {\n\t\treturn jsonResponse({ error: 'Invalid form id' }, 400);\n\t}\n\t// The browser does not get to pick the tenant our API key writes into\n\tif (payload.project !== deps.projectId) {\n\t\treturn jsonResponse({ error: 'Invalid project id' }, 400);\n\t}\n\n\t// The client reads doc.id and branches on 400 (type) / 413 (size)\n\treturn writeThroughCms(\n\t\tdeps.cms,\n\t\tpayload.form,\n\t\t() =>\n\t\t\tdeps.cms.createUpload(file, {\n\t\t\t\tform: payload.form,\n\t\t\t\tproject: deps.projectId,\n\t\t\t}),\n\t\t{\n\t\t\tsuccess: (id) => ({ doc: { id } }),\n\t\t\tpassThrough: { 400: 'Invalid file', 413: 'File too large' },\n\t\t\tfailed: 'Upload failed',\n\t\t},\n\t);\n}\n","// Which of a form's own fields the CMS refused, read out of a Payload error\n// body.\n//\n// Since postedin/cms#279 a submission is validated before it is written:\n// required answers, email shape, manual option lists and an upload id that\n// must still name a live `pending` file of this form. A refusal is a `400`\n// carrying a Payload `ValidationError`, which names each failed field in\n// `errors[].path` as `data.<fieldName>` — the same name the browser posted.\n//\n// Only those names travel any further. The CMS's own wording does not: it is\n// resolved in the CMS request's language rather than the visitor's — Payload\n// takes `req.t` from the `payload-lng` cookie or the `Accept-Language` header,\n// never from the `?locale` this proxy sends, so a Spanish visitor would be\n// answered in English — and the rest of the body names internal fields. The\n// browser already knows every field name it posted, so handing the names back\n// discloses nothing, and the message the visitor reads is the site's own: form\n// chrome, like every other validation string.\n\n// A path this site can place against a field it rendered. `honeypot`, `form`\n// and `data` are refusals about the request rather than about an answer, and\n// are deliberately not matched: there is no field to hang them on.\nconst FIELD_PATH = /^data\\.([A-Za-z0-9_-]+)$/;\n\n// A form has tens of fields, not hundreds. The cap is for a body that is not\n// what we think it is rather than for one of ours.\nconst MAX_FIELDS = 50;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n// Payload nests a ValidationError's per-field errors under `data.errors`, and\n// wraps that in the top-level `errors` array every REST failure carries. Both\n// levels are read, so a plainer `{ errors: [{ path }] }` is understood too.\nfunction pathsOf(entry: unknown): string[] {\n\tif (!isRecord(entry)) {\n\t\treturn [];\n\t}\n\n\tconst paths: string[] = [];\n\tif (typeof entry.path === 'string') {\n\t\tpaths.push(entry.path);\n\t}\n\n\tconst data = entry.data;\n\tif (isRecord(data) && Array.isArray(data.errors)) {\n\t\tfor (const nested of data.errors) {\n\t\t\tif (isRecord(nested) && typeof nested.path === 'string') {\n\t\t\t\tpaths.push(nested.path);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn paths;\n}\n\nexport function refusedFieldNames(body: unknown): string[] {\n\tif (!isRecord(body) || !Array.isArray(body.errors)) {\n\t\treturn [];\n\t}\n\n\tconst names = new Set<string>();\n\tfor (const entry of body.errors) {\n\t\tfor (const path of pathsOf(entry)) {\n\t\t\tconst match = FIELD_PATH.exec(path);\n\t\t\tif (match) {\n\t\t\t\tnames.add(match[1]);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn [...names].slice(0, MAX_FIELDS);\n}\n","import type { Api } from '../api';\nimport type { Locale } from '../locales';\nimport type { Form } from '../payload-types';\nimport { refusedFieldNames } from './cms-errors';\nimport type { SubmissionsCmsClient } from './submissions';\nimport type { CmsResult } from './types';\nimport type { UploadsCmsClient } from './uploads';\n\n// Writes made on behalf of anonymous visitors. Every request pins depth=0 so\n// the CMS never populates the project relationship (which carries deploy\n// hooks and tokens) into a response we hold in memory, and callers only ever\n// get back the status, the new document id, and the names of any fields a\n// refusal named.\n//\n// depth=0 is belt and braces on a create since postedin/cms#279: the CMS\n// depopulates a submission's create response itself, so `form` and `project`\n// come back as bare ids whatever depth is asked for. Nothing here ever read\n// them — only `doc.id` — and nothing should start.\nasync function stripToStatusAndId(res: Response): Promise<CmsResult> {\n\tlet body: unknown;\n\ttry {\n\t\tbody = await res.json();\n\t} catch {\n\t\treturn { status: res.status };\n\t}\n\n\tif (!res.ok) {\n\t\treturn { status: res.status, fields: refusedFieldNames(body) };\n\t}\n\n\tconst doc = body as { doc?: { id?: unknown }; id?: unknown } | null;\n\tconst id = doc?.doc?.id ?? doc?.id;\n\treturn { status: res.status, id: typeof id === 'string' ? id : undefined };\n}\n\nexport type FormProxyCmsClient = SubmissionsCmsClient & UploadsCmsClient;\n\nexport function createFormProxyCmsClient(\n\tapi: Pick<Api, 'buildHeaders' | 'fetchCmsCollection'>,\n\tapiUrl: string,\n): FormProxyCmsClient {\n\tfunction writeUrl(path: string, locale?: Locale) {\n\t\tconst url = new URL(path, apiUrl);\n\t\turl.searchParams.set('depth', '0');\n\t\tif (locale) {\n\t\t\turl.searchParams.set('locale', locale);\n\t\t}\n\t\treturn url;\n\t}\n\n\t// Only forms of this project are visible: fetchCmsCollection scopes every\n\t// query to the client's project, so a foreign form id simply comes back empty.\n\tasync function formBelongsToProject(formId: string): Promise<boolean> {\n\t\tif (!/^[a-zA-Z0-9_-]+$/.test(formId)) {\n\t\t\treturn false;\n\t\t}\n\t\tconst docs = await api.fetchCmsCollection<Pick<Form, 'id'>>('forms', {\n\t\t\tdepth: 0,\n\t\t\tlimit: 1,\n\t\t\tquery: { where: { id: { equals: formId } } },\n\t\t});\n\t\treturn docs.some((doc) => doc.id === formId);\n\t}\n\n\treturn {\n\t\tformBelongsToProject,\n\n\t\tasync createSubmission(payload, locale?: Locale) {\n\t\t\t// `project` is still sent: the CMS derives the tenant from the form and\n\t\t\t// ignores what the body says, but an older deployment of it does not.\n\t\t\tconst res = await fetch(writeUrl('/api/form-submissions', locale), {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { ...api.buildHeaders(), 'Content-Type': 'application/json' },\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t});\n\t\t\treturn stripToStatusAndId(res);\n\t\t},\n\n\t\t// `form` in the payload is dropped by the CMS — the field is server-written\n\t\t// there, and an upload carries no form until the submission claiming it\n\t\t// arrives. It is sent anyway so an older CMS still records it, and nothing\n\t\t// on this side reads it back.\n\t\tasync createUpload(file, payload) {\n\t\t\tconst body = new FormData();\n\t\t\tbody.append('file', file, file.name);\n\t\t\tbody.append('_payload', JSON.stringify(payload));\n\t\t\tconst res = await fetch(writeUrl('/api/form-uploads'), {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: api.buildHeaders(),\n\t\t\t\tbody,\n\t\t\t});\n\t\t\treturn stripToStatusAndId(res);\n\t\t},\n\t};\n}\n","import type { Project } from '../payload-types';\nimport type { FormProxyCmsClient } from './cms-client';\nimport { createRateLimiter, type RateLimiter } from './rate-limit';\nimport { handleFormSubmission } from './submissions';\nimport type { ProxyDeps } from './types';\nimport { handleFormUpload } from './uploads';\n\nexport type { FormProxyCmsClient } from './cms-client';\nexport { createFormProxyCmsClient } from './cms-client';\nexport { refusedFieldNames } from './cms-errors';\nexport { createRateLimiter, type RateLimiter } from './rate-limit';\nexport {\n\thandleFormSubmission,\n\tMAX_SUBMISSION_BYTES,\n\ttype SubmissionsCmsClient,\n} from './submissions';\nexport type { CmsResult, FormOwnershipCheck, ProxyDeps } from './types';\nexport { handleFormUpload, type UploadsCmsClient } from './uploads';\n\n/**\n * The part of an Astro `APIContext` the proxy reads. `clientAddress` is a\n * getter that throws on a prerendered route, which is why it is read guarded.\n */\nexport interface RequestContext {\n\treadonly clientAddress: string;\n}\n\nfunction clientAddress(context: RequestContext): string {\n\ttry {\n\t\treturn context.clientAddress;\n\t} catch {\n\t\treturn 'unknown';\n\t}\n}\n\nexport type FormProxy = ReturnType<typeof createFormProxy>;\n\nexport function createFormProxy(\n\tcms: FormProxyCmsClient,\n\tproject: () => Promise<Project>,\n\tlocales: readonly string[],\n) {\n\t// One instance per function container; see rate-limit.ts for the caveat.\n\tconst submissionLimiter = createRateLimiter({\n\t\tlimit: 10,\n\t\twindowMs: 60_000,\n\t});\n\tconst uploadLimiter = createRateLimiter({ limit: 20, windowMs: 60_000 });\n\n\t// Everything a handler needs from the running site: the tenant our key\n\t// writes into, the CMS client, and who is asking.\n\tasync function buildProxyDeps(\n\t\tcontext: RequestContext,\n\t\trateLimiter: RateLimiter,\n\t): Promise<ProxyDeps<FormProxyCmsClient>> {\n\t\treturn {\n\t\t\tprojectId: (await project()).id,\n\t\t\tcms,\n\t\t\tclientAddress: clientAddress(context),\n\t\t\trateLimiter,\n\t\t\tlocales,\n\t\t};\n\t}\n\n\treturn {\n\t\tcms,\n\t\tsubmissionLimiter,\n\t\tuploadLimiter,\n\t\tbuildProxyDeps,\n\t\thandleFormSubmission,\n\t\thandleFormUpload,\n\t};\n}\n","import type { WiredPage } from './collections/pages';\nimport type { Context } from './context';\nimport type { Locale } from './locales';\nimport type { Page } from './payload-types';\nimport type { HomePageRef } from './routes';\n\nasync function fetchHomePage(\n\tctx: Context,\n\tlocale: Locale,\n): Promise<WiredPage | null> {\n\tconst options = await ctx.cms(locale).options();\n\tconst configured = options.homepage?.page;\n\tconst id =\n\t\ttypeof configured === 'string' ? configured : (configured?.id ?? null);\n\n\tif (!id) {\n\t\treturn null;\n\t}\n\n\t// Read the standalone document rather than the copy embedded in the options\n\t// global: globals are fetched without locale fallback, so an untranslated\n\t// homepage would come back with null title and null block copy and render as\n\t// a blank page. It is also the one page with no other route to reach it, so\n\t// default-locale content beats nothing at all.\n\tconst [doc] = await ctx.api.fetchCmsCollection<Page>('pages', {\n\t\tlocale,\n\t\tfallback: 'default',\n\t\tstatus: 'published',\n\t\tlimit: 1,\n\t\tquery: { where: { id: { equals: id } } },\n\t});\n\n\tif (!doc) {\n\t\treturn null;\n\t}\n\n\tconst path = (doc.breadcrumbs?.at(-1)?.url ?? doc.slug ?? '').replace(\n\t\t/^\\//,\n\t\t'',\n\t);\n\n\t// `children` stays empty: the homepage is rendered on its own, not as part of\n\t// the page tree `cms.pages` builds.\n\treturn { ...doc, children: [], parent: undefined, path } as WiredPage;\n}\n\nexport function createHomePage(ctx: Context) {\n\tconst cache = new Map<Locale, Promise<WiredPage | null>>();\n\n\t/**\n\t * The page configured as the site homepage, or `null` when the blog index is\n\t * used instead. This is the single source of truth for \"there is a homepage\":\n\t * `/` renders whatever it returns and `[...slug]` skips exactly the same\n\t * document, so the route that serves the page and the route that steps aside\n\t * for it can never disagree.\n\t *\n\t * Server-only. The result is cached per locale, so calling it from every\n\t * component costs one fetch per locale per build.\n\t */\n\tfunction getHomePage(locale: Locale): Promise<WiredPage | null> {\n\t\tlet pending = cache.get(locale);\n\n\t\tif (!pending) {\n\t\t\tpending = fetchHomePage(ctx, locale);\n\t\t\tcache.set(locale, pending);\n\t\t}\n\n\t\treturn pending;\n\t}\n\n\t/**\n\t * The homepage reduced to what URL building needs. Hand it to `createRoutes` or\n\t * `cmsToHref` — or down to a hydrated island as a prop — so links pointing at\n\t * that page resolve to `/` (or `/en/`) instead of its own slug route.\n\t */\n\tasync function getHomePageRef(locale: Locale): Promise<HomePageRef> {\n\t\tconst page = await getHomePage(locale);\n\n\t\treturn page ? { id: page.id, path: page.path } : null;\n\t}\n\n\treturn { getHomePage, getHomePageRef };\n}\n","import { createApi, type ResolveUploadUrl } from './api';\nimport { createBlogListing } from './blog-listing';\nimport { buildCms, type Cms } from './cms';\nimport { defineCmsToHref } from './cms-to-href';\nimport type { AppearanceFallbacks } from './collections/appearance';\nimport { wirePost } from './collections/posts';\nimport { createConfigTime } from './config-time';\nimport type { Context } from './context';\nimport { createFormProxy, createFormProxyCmsClient } from './form-proxy';\nimport { createHomePage } from './home-page';\nimport { createCollectionLoader, createGlobalLoader } from './loader';\nimport { defineLocales, type Locale, type LocaleOptions } from './locales';\nimport type { Appearance, Post, Project } from './payload-types';\nimport { defineRoutes } from './routes';\n\n/** What an extension collection is built from. */\nexport interface ExtensionContext {\n\tapi: Context['api'];\n\tlocale: Locale;\n\t/** The client's other services, for a collection that wires against them. */\n\tcms: (locale: Locale) => Cms;\n\tcreateCollectionLoader: typeof createCollectionLoader;\n\tcreateGlobalLoader: typeof createGlobalLoader;\n}\n\n/**\n * A collection only one site reads. It is built per locale and appears on\n * `client.cms(locale)` under the key it was registered with.\n */\nexport type Extension<T = unknown> = (context: ExtensionContext) => T;\n\n/** What each extension builds, by the key it appears under. */\nexport type Extensions = Record<string, unknown>;\n\nexport type CmsWith<E extends Extensions> = Cms & E;\n\nexport interface ClientOptions<E extends Extensions = Record<never, never>>\n\textends LocaleOptions {\n\t/** The CMS origin, e.g. `https://cms.example.com`. */\n\tapiUrl: string;\n\t/** A project-scoped `api-keys` document's key. */\n\tapiKey: string;\n\t/** Every query is scoped to this project. */\n\tprojectSlug: string;\n\t/** Public origin of the uploads bucket. Without it the CMS serves files. */\n\tuploadsBaseUrl?: string;\n\t/** Sent as `x-vercel-protection-bypass` when the CMS sits behind it. */\n\tprotectionBypassSecret?: string;\n\t/** Dev serves every upload from the CMS's own URL. */\n\tisDev: boolean;\n\t/**\n\t * The Appearance document, fetched at config time. Required for\n\t * `cms.appearance()`; a config-time client leaves it out.\n\t */\n\tappearance?: Appearance;\n\t/** What a blank Appearance field falls back to. */\n\tappearanceFallbacks?: AppearanceFallbacks;\n\t/**\n\t * The Project document, fetched at config time. Required for\n\t * `cms.project()` and the form proxy; a config-time client leaves it out.\n\t */\n\tproject?: Project;\n\t/** Collection pages fetched at a time. Default 4. */\n\tpageConcurrency?: number;\n\t/** A site's own rule for where an upload is served from. */\n\tresolveUploadUrl?: ResolveUploadUrl;\n\t/** Collections only this site reads, by the key they appear under. */\n\textensions?: { [K in keyof E]: Extension<E[K]> };\n}\n\nexport type Client<E extends Extensions = Record<never, never>> = ReturnType<\n\ttypeof createClient<E>\n>;\n\n/**\n * The CMS client a site builds once from its environment. Nothing in here\n * reads the environment itself: an npm-installed package is externalised by\n * Astro, so `import.meta.env` would be empty by the time it ran.\n */\nexport function createClient<E extends Extensions = Record<never, never>>(\n\toptions: ClientOptions<E>,\n) {\n\tconst locales = defineLocales(options);\n\tconst api = createApi(options);\n\tconst createRoutes = defineRoutes(locales);\n\tconst cmsToHref = defineCmsToHref(createRoutes);\n\n\tconst instances = new Map<Locale, CmsWith<E>>();\n\n\tconst ctx: Context = {\n\t\tapi,\n\t\tlocales,\n\t\toptions,\n\t\tcms: (locale) => cms(locale),\n\t};\n\n\tfunction cms(locale: Locale = locales.defaultLocale): CmsWith<E> {\n\t\tlet instance = instances.get(locale);\n\t\tif (!instance) {\n\t\t\tconst base = buildCms(ctx, locale);\n\t\t\tconst extended: Record<string, unknown> = {};\n\t\t\tfor (const [key, extension] of Object.entries<Extension>(\n\t\t\t\toptions.extensions ?? {},\n\t\t\t)) {\n\t\t\t\textended[key] = extension({\n\t\t\t\t\tapi,\n\t\t\t\t\tlocale,\n\t\t\t\t\tcms: ctx.cms,\n\t\t\t\t\tcreateCollectionLoader,\n\t\t\t\t\tcreateGlobalLoader,\n\t\t\t\t});\n\t\t\t}\n\t\t\tinstance = { ...base, ...extended } as CmsWith<E>;\n\t\t\tinstances.set(locale, instance);\n\t\t}\n\t\treturn instance;\n\t}\n\n\tconst { getHomePage, getHomePageRef } = createHomePage(ctx);\n\n\tconst formProxy = createFormProxy(\n\t\tcreateFormProxyCmsClient(api, options.apiUrl),\n\t\t() => cms().project(),\n\t\tlocales.locales,\n\t);\n\n\treturn {\n\t\toptions,\n\t\tlocales,\n\t\tapi,\n\t\tcms,\n\t\troutes: createRoutes,\n\t\tcmsToHref,\n\t\tgetHomePage,\n\t\tgetHomePageRef,\n\t\tgetBlogListing: createBlogListing(ctx),\n\t\t/** Wires a single post document, e.g. a draft for live preview. */\n\t\twirePost: (post: Post | undefined, locale: Locale) =>\n\t\t\twirePost(ctx, post, locale),\n\t\tformProxy,\n\t\t/** The fetches `astro.config.mjs` makes before the build starts. */\n\t\tconfig: createConfigTime(api, createRoutes(locales.defaultLocale)),\n\t};\n}\n","import type { WiredCategory } from './collections/categories';\nimport type {\n\tCmsLink,\n\tCmsMainMenu,\n\tCmsMenuItem,\n} from './collections/header-footer';\nimport type { WiredPage } from './collections/pages';\nimport type { WiredTag } from './collections/tags';\nimport type { WiredTeamMember } from './collections/team-members';\nimport type { Page } from './payload-types';\nimport type { Routes } from './routes';\n\ntype SubmenuItem = NonNullable<CmsMenuItem['submenuItems']>[0];\n\nfunction customLink(label: string, url: string): CmsLink {\n\treturn { type: 'custom', label, url };\n}\n\nfunction sortByLabel(items: SubmenuItem[]): SubmenuItem[] {\n\treturn [...items].sort((a, b) => {\n\t\tconst labelA = a.link?.label ?? '';\n\t\tconst labelB = b.link?.label ?? '';\n\t\treturn labelA.localeCompare(labelB);\n\t});\n}\n\nfunction pageToSubmenuItem(routes: Routes, page: WiredPage): SubmenuItem {\n\treturn {\n\t\ttype: 'link',\n\t\tlink: customLink(page.title, routes.page(page)),\n\t};\n}\n\nfunction categoryToSubmenuItem(\n\troutes: Routes,\n\tcategory: WiredCategory,\n): SubmenuItem {\n\treturn {\n\t\ttype: 'link',\n\t\tlink: customLink(category.title, routes.blog('category', category.path)),\n\t};\n}\n\nfunction tagToSubmenuItem(routes: Routes, tag: WiredTag): SubmenuItem {\n\treturn {\n\t\ttype: 'link',\n\t\tlink: customLink(tag.title, routes.blog('tag', tag.slug)),\n\t};\n}\n\nfunction teamMemberToSubmenuItem(\n\troutes: Routes,\n\tmember: WiredTeamMember,\n): SubmenuItem {\n\treturn {\n\t\ttype: 'link',\n\t\tlink: customLink(\n\t\t\t`${member.firstName} ${member.lastName}`.trim(),\n\t\t\troutes.team('member', member.slug),\n\t\t),\n\t};\n}\n\nexport type MenuCollectionData = {\n\tpages: WiredPage[];\n\tcategories: WiredCategory[];\n\ttags: WiredTag[];\n\tteamMembers: WiredTeamMember[];\n};\n\ntype ResolvedNested = {\n\tsubmenuItems: SubmenuItem[] | null | undefined;\n\tmainLink?: CmsLink;\n\thasMainLink?: boolean;\n};\n\n/** The words the menu adds of its own. Site copy, so the site supplies it. */\nexport type MenuLabels = {\n\t/** Heads the team-members submenu: the site's `team.title`. */\n\tteam: string;\n};\n\nfunction resolveNested(\n\tmenuItem: CmsMenuItem,\n\tdata: MenuCollectionData,\n\troutes: Routes,\n\tlabels: MenuLabels,\n): ResolvedNested {\n\tconst { nestedType } = menuItem;\n\n\tif (nestedType === 'nested-pages') {\n\t\tconst parentPage = menuItem.parentPage;\n\t\tif (!parentPage || typeof parentPage === 'string') {\n\t\t\treturn { submenuItems: menuItem.submenuItems };\n\t\t}\n\t\tconst parentId = (parentPage as Page).id;\n\t\tconst wiredParent = data.pages.find((p) => p.id === parentId);\n\t\tif (!wiredParent) {\n\t\t\treturn { submenuItems: menuItem.submenuItems };\n\t\t}\n\t\tconst mainLink = customLink(wiredParent.title, routes.page(wiredParent));\n\t\treturn {\n\t\t\tsubmenuItems: wiredParent.children.map((child) =>\n\t\t\t\tpageToSubmenuItem(routes, child),\n\t\t\t),\n\t\t\tmainLink,\n\t\t\thasMainLink: true,\n\t\t};\n\t}\n\n\tif (nestedType === 'collection') {\n\t\tconst slug = menuItem.collectionSlug;\n\n\t\tif (slug === 'categories') {\n\t\t\treturn {\n\t\t\t\tsubmenuItems: sortByLabel(\n\t\t\t\t\tdata.categories.map((c) => categoryToSubmenuItem(routes, c)),\n\t\t\t\t),\n\t\t\t\thasMainLink: false,\n\t\t\t};\n\t\t}\n\n\t\tif (slug === 'tags') {\n\t\t\treturn {\n\t\t\t\tsubmenuItems: sortByLabel(\n\t\t\t\t\tdata.tags.map((t) => tagToSubmenuItem(routes, t)),\n\t\t\t\t),\n\t\t\t\thasMainLink: false,\n\t\t\t};\n\t\t}\n\n\t\tif (slug === 'team-members') {\n\t\t\treturn {\n\t\t\t\tsubmenuItems: sortByLabel(\n\t\t\t\t\tdata.teamMembers.map((m) => teamMemberToSubmenuItem(routes, m)),\n\t\t\t\t),\n\t\t\t\tmainLink: customLink(labels.team, routes.team()),\n\t\t\t\thasMainLink: true,\n\t\t\t};\n\t\t}\n\n\t\treturn { submenuItems: menuItem.submenuItems };\n\t}\n\n\treturn { submenuItems: menuItem.submenuItems };\n}\n\nexport function resolveMenuItems(\n\tmainMenu: CmsMainMenu,\n\tdata: MenuCollectionData,\n\t// Menu entries become `type: 'custom'` links holding a finished URL, so\n\t// `cmsToHref` never sees them — build `routes` with the homepage, so it\n\t// collapses to `/` here.\n\troutes: Routes,\n\tlabels: MenuLabels,\n): CmsMainMenu {\n\treturn mainMenu.map((entry) => {\n\t\tconst menuItem = entry.menuItem;\n\t\tif (!menuItem || menuItem.type !== 'nested') {\n\t\t\treturn entry;\n\t\t}\n\n\t\tconst { submenuItems, mainLink, hasMainLink } = resolveNested(\n\t\t\tmenuItem,\n\t\t\tdata,\n\t\t\troutes,\n\t\t\tlabels,\n\t\t);\n\n\t\tconst resolvedMainLink = mainLink ?? menuItem.mainLink;\n\t\tconst resolvedHasMainLink =\n\t\t\thasMainLink !== undefined ? hasMainLink : menuItem.hasMainLink;\n\n\t\treturn {\n\t\t\t...entry,\n\t\t\tmenuItem: {\n\t\t\t\t...menuItem,\n\t\t\t\tsubmenuItems,\n\t\t\t\tmainLink: resolvedMainLink,\n\t\t\t\thasMainLink: resolvedHasMainLink,\n\t\t\t},\n\t\t};\n\t});\n}\n"],"mappings":"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","names":["options","areas","authors","categories","posts","questions","tags","members","isRecord"]}
|