@weatherboard/cms 0.3.0 → 0.5.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/sanity.ts", "../src/contracts/query.ts", "../src/adapters/sanity/adapter.ts"],
4
- "sourcesContent": ["import \"server-only\";\nexport { createSanityAdapter, sanityBindingFromEnv } from \"./adapters/sanity/adapter.js\";\nexport type { SanityBinding, SanityAdapterOptions } from \"./adapters/sanity/adapter.js\";\n", "/** A-1822 S1 owns this implementation. S0 registers the public signatures. */\nexport type CmsParams = Readonly<Record<string, string | number | boolean | null>>;\nexport type CmsDependencies = {\n readonly types: readonly string[];\n readonly ids?: readonly string[];\n};\nexport type CmsResolution<T> = {\n readonly data: T;\n readonly fallbackFields: readonly string[];\n readonly warnings?: readonly \"siteHero.layout.defaulted\"[];\n};\nexport type CmsQuery<T> = {\n readonly name: string;\n readonly query: string;\n readonly params: CmsParams;\n readonly dependencies: CmsDependencies;\n readonly resolve: (raw: unknown, fallback: T) => CmsResolution<T>;\n};\n\nconst TYPE = /^[A-Za-z][A-Za-z0-9_]{0,63}$/;\nconst ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;\nconst SCOPE = /^[a-z0-9]{6,12}\\.[a-z][a-z0-9_-]{0,63}$/;\n\nfunction dependenciesCopy(dependencies: CmsDependencies): CmsDependencies {\n if (!dependencies || !Array.isArray(dependencies.types) || dependencies.types.length === 0) {\n throw new TypeError(\"CMS dependencies require document types\");\n }\n const types = [...dependencies.types];\n for (const type of types) {\n if (typeof type !== \"string\" || !TYPE.test(type)) throw new TypeError(\"Invalid CMS document type\");\n }\n if (dependencies.ids !== undefined && !Array.isArray(dependencies.ids)) throw new TypeError(\"Invalid CMS document IDs\");\n const ids = dependencies.ids === undefined ? undefined : [...dependencies.ids];\n for (const id of ids ?? []) {\n if (typeof id !== \"string\" || !ID.test(id) || /^(drafts|versions)\\./.test(id)) {\n throw new TypeError(\"Invalid CMS document ID\");\n }\n }\n if (new Set(types).size + new Set(ids).size > 128) throw new TypeError(\"Too many CMS tags\");\n return Object.freeze({ types: Object.freeze(types), ...(ids === undefined ? {} : { ids: Object.freeze(ids) }) });\n}\n\nexport function defineCmsQuery<T>(query: CmsQuery<T>): CmsQuery<T> {\n if (!query || typeof query.name !== \"string\" || !/^[A-Za-z][A-Za-z0-9_.-]{0,127}$/.test(query.name)\n || typeof query.query !== \"string\" || query.query.trim() === \"\" || typeof query.resolve !== \"function\") {\n throw new TypeError(\"Invalid CMS query configuration\");\n }\n const params = query.params;\n if (!params || typeof params !== \"object\" || (Object.getPrototypeOf(params) !== Object.prototype && Object.getPrototypeOf(params) !== null)) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n const copied: Record<string, string | number | boolean | null> = {};\n for (const key of Reflect.ownKeys(params)) {\n const descriptor = Object.getOwnPropertyDescriptor(params, key);\n if (typeof key !== \"string\" || !descriptor || !Object.hasOwn(descriptor, \"value\") || !descriptor.enumerable) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n const value: unknown = descriptor.value;\n if (!(value === null || typeof value === \"string\" || typeof value === \"boolean\" || (typeof value === \"number\" && Number.isFinite(value)))) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n Object.defineProperty(copied, key, { value, enumerable: true });\n }\n return Object.freeze({ name: query.name, query: query.query, params: Object.freeze(copied), dependencies: dependenciesCopy(query.dependencies), resolve: query.resolve });\n}\n\nexport function cmsTags(scope: string, dependencies: CmsDependencies): readonly string[] {\n if (typeof scope !== \"string\" || scope.length > 77 || !SCOPE.test(scope)) throw new TypeError(\"Invalid CMS scope\");\n const copied = dependenciesCopy(dependencies);\n const tags = [\n ...[...new Set(copied.types)].sort().map((type) => `cms:${scope}:type:${type}`),\n ...[...new Set(copied.ids ?? [])].sort().map((id) => `cms:${scope}:id:${id}`),\n ];\n return Object.freeze(tags);\n}\n", "import type { CmsAdapter, CmsFetch } from \"../../runtime/reader.js\";\nimport { cmsTags, defineCmsQuery } from \"../../contracts/query.js\";\n\nexport type SanityBinding = {\n readonly projectId: string;\n readonly dataset: string;\n readonly apiVersion: string;\n};\nexport type SanityAdapterOptions = {\n readonly binding: SanityBinding;\n readonly readToken?: string;\n readonly fetchImpl?: CmsFetch;\n readonly timeoutMs?: number;\n};\n\nconst RESPONSE_LIMIT = 2 * 1024 * 1024;\n\nfunction bindingCopy(binding: SanityBinding): SanityBinding {\n if (!binding || typeof binding.projectId !== \"string\" || !/^[a-z0-9]{6,12}$/.test(binding.projectId)\n || typeof binding.dataset !== \"string\" || !/^[a-z][a-z0-9_-]{0,63}$/.test(binding.dataset)\n || typeof binding.apiVersion !== \"string\" || !/^v?\\d{4}-\\d{2}-\\d{2}$/.test(binding.apiVersion)) {\n throw new TypeError(\"Invalid Sanity binding configuration\");\n }\n return Object.freeze({ projectId: binding.projectId, dataset: binding.dataset, apiVersion: binding.apiVersion.replace(/^v/, \"\") });\n}\n\n/** Applies policy via fetch's Next metadata. Standard fetch has no persistent cache or HTML invalidation. */\nexport function createSanityAdapter(options: SanityAdapterOptions): CmsAdapter {\n const binding = bindingCopy(options?.binding);\n const timeoutMs = options.timeoutMs ?? 1500;\n const token = options.readToken;\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0 || timeoutMs > 2147483647\n || (options.fetchImpl !== undefined && typeof options.fetchImpl !== \"function\")\n || (token !== undefined && (typeof token !== \"string\" || token.trim() === \"\" || /[\\r\\n]/.test(token)))) {\n throw new TypeError(\"Invalid Sanity adapter configuration\");\n }\n const fetchImpl = options.fetchImpl;\n const scope = `${binding.projectId}.${binding.dataset}`;\n return Object.freeze({\n scope,\n async read(query, policy) {\n // Direct structural callers receive the same configuration refusals.\n let validated;\n try {\n if (!policy || !Number.isSafeInteger(policy.revalidateSeconds) || policy.revalidateSeconds < 3600 || !Array.isArray(policy.tags)) throw new TypeError();\n const types: string[] = [];\n const ids: string[] = [];\n for (const tag of policy.tags) {\n if (typeof tag !== \"string\") throw new TypeError();\n if (tag.startsWith(`cms:${scope}:type:`)) types.push(tag.slice(`cms:${scope}:type:`.length));\n else if (tag.startsWith(`cms:${scope}:id:`)) ids.push(tag.slice(`cms:${scope}:id:`.length));\n else throw new TypeError();\n }\n const expected = cmsTags(scope, { types, ids });\n if (expected.length !== policy.tags.length || expected.some((tag, i) => tag !== policy.tags[i])) throw new TypeError();\n validated = defineCmsQuery({ ...query, dependencies: { types, ids }, resolve: (raw: unknown) => ({ data: raw, fallbackFields: [] }) });\n } catch { throw new TypeError(\"Invalid Sanity read configuration\"); }\n const url = new URL(`https://${binding.projectId}.api.sanity.io/v${binding.apiVersion}/data/query/${binding.dataset}`);\n url.searchParams.set(\"query\", validated.query);\n url.searchParams.set(\"perspective\", \"published\");\n for (const key of Object.keys(validated.params).sort()) url.searchParams.set(`$${key}`, JSON.stringify(validated.params[key]));\n const controller = new AbortController();\n let bodyReader: ReadableStreamDefaultReader<Uint8Array> | undefined;\n let expired = false;\n const cancel = (): void => {\n controller.abort();\n if (bodyReader) void bodyReader.cancel().catch(() => {});\n };\n let timer: ReturnType<typeof setTimeout> | undefined;\n const deadline = new Promise<Awaited<ReturnType<CmsAdapter[\"read\"]>>>((resolve) => {\n timer = setTimeout(() => {\n expired = true;\n cancel();\n resolve({ ok: false, reason: \"timeout\" });\n }, timeoutMs);\n });\n const work = async (): Promise<Awaited<ReturnType<CmsAdapter[\"read\"]>>> => {\n try {\n // Look up global fetch at read time so Next's patched fetch is retained.\n const response = await (fetchImpl ?? globalThis.fetch)(url.href, {\n method: \"GET\", redirect: \"error\", signal: controller.signal,\n headers: token === undefined ? {} : { Authorization: `Bearer ${token}` },\n next: { revalidate: policy.revalidateSeconds, tags: [...policy.tags] },\n });\n if (expired) { void response.body?.cancel().catch(() => {}); return { ok: false, reason: \"timeout\" }; }\n if (!response.ok) {\n void response.body?.cancel().catch(() => {});\n const status = response.status;\n const reason = status === 402 ? \"plan-limit\" : status === 401 || status === 403 ? \"permission\"\n : status === 429 ? \"rate-limit\" : \"upstream\";\n return { ok: false, reason, status };\n }\n if (!response.body) return { ok: false, reason: \"malformed\" };\n bodyReader = response.body.getReader();\n let bytes = 0;\n let text = \"\";\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n while (true) {\n const chunk = await bodyReader.read();\n if (expired) return { ok: false, reason: \"timeout\" };\n if (chunk.done) break;\n bytes += chunk.value.byteLength;\n if (bytes > RESPONSE_LIMIT) { cancel(); return { ok: false, reason: \"malformed\" }; }\n try { text += decoder.decode(chunk.value, { stream: true }); }\n catch { cancel(); return { ok: false, reason: \"malformed\" }; }\n }\n try {\n text += decoder.decode();\n const envelope: unknown = JSON.parse(text);\n if (!envelope || typeof envelope !== \"object\" || Array.isArray(envelope) || !Object.hasOwn(envelope, \"result\")) return { ok: false, reason: \"malformed\" };\n return { ok: true, value: (envelope as Record<string, unknown>).result };\n } catch { return { ok: false, reason: \"malformed\" }; }\n } catch { return { ok: false, reason: expired ? \"timeout\" : \"network\" }; }\n };\n try { return await Promise.race([work(), deadline]); }\n finally { clearTimeout(timer); }\n },\n } satisfies CmsAdapter);\n}\n\nexport function sanityBindingFromEnv(env: Readonly<Record<string, string | undefined>>): SanityBinding {\n return bindingCopy({ projectId: env.SANITY_PROJECT_ID, dataset: env.SANITY_DATASET, apiVersion: env.SANITY_API_VERSION } as SanityBinding);\n}\n"],
4
+ "sourcesContent": ["import \"server-only\";\nexport { createSanityAdapter, sanityBindingFromEnv } from \"./adapters/sanity/adapter.js\";\nexport type { SanityBinding, SanityAdapterOptions } from \"./adapters/sanity/adapter.js\";\n", "/** A-1822 S1 owns this implementation. S0 registers the public signatures. */\nexport type CmsParams = Readonly<Record<string, string | number | boolean | null>>;\nexport type CmsDependencies = {\n readonly types: readonly string[];\n readonly ids?: readonly string[];\n};\nexport type CmsResolution<T> = {\n readonly data: T;\n readonly fallbackFields: readonly string[];\n readonly warnings?: readonly (\"siteHero.layout.defaulted\" | \"siteHero.tagline.dropped\" | \"siteHero.taglines.defaulted\")[];\n};\nexport type CmsQuery<T> = {\n readonly name: string;\n readonly query: string;\n readonly params: CmsParams;\n readonly dependencies: CmsDependencies;\n readonly resolve: (raw: unknown, fallback: T) => CmsResolution<T>;\n};\n\nconst TYPE = /^[A-Za-z][A-Za-z0-9_]{0,63}$/;\nconst ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;\nconst SCOPE = /^[a-z0-9]{6,12}\\.[a-z][a-z0-9_-]{0,63}$/;\n\nfunction dependenciesCopy(dependencies: CmsDependencies): CmsDependencies {\n if (!dependencies || !Array.isArray(dependencies.types) || dependencies.types.length === 0) {\n throw new TypeError(\"CMS dependencies require document types\");\n }\n const types = [...dependencies.types];\n for (const type of types) {\n if (typeof type !== \"string\" || !TYPE.test(type)) throw new TypeError(\"Invalid CMS document type\");\n }\n if (dependencies.ids !== undefined && !Array.isArray(dependencies.ids)) throw new TypeError(\"Invalid CMS document IDs\");\n const ids = dependencies.ids === undefined ? undefined : [...dependencies.ids];\n for (const id of ids ?? []) {\n if (typeof id !== \"string\" || !ID.test(id) || /^(drafts|versions)\\./.test(id)) {\n throw new TypeError(\"Invalid CMS document ID\");\n }\n }\n if (new Set(types).size + new Set(ids).size > 128) throw new TypeError(\"Too many CMS tags\");\n return Object.freeze({ types: Object.freeze(types), ...(ids === undefined ? {} : { ids: Object.freeze(ids) }) });\n}\n\nexport function defineCmsQuery<T>(query: CmsQuery<T>): CmsQuery<T> {\n if (!query || typeof query.name !== \"string\" || !/^[A-Za-z][A-Za-z0-9_.-]{0,127}$/.test(query.name)\n || typeof query.query !== \"string\" || query.query.trim() === \"\" || typeof query.resolve !== \"function\") {\n throw new TypeError(\"Invalid CMS query configuration\");\n }\n const params = query.params;\n if (!params || typeof params !== \"object\" || (Object.getPrototypeOf(params) !== Object.prototype && Object.getPrototypeOf(params) !== null)) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n const copied: Record<string, string | number | boolean | null> = {};\n for (const key of Reflect.ownKeys(params)) {\n const descriptor = Object.getOwnPropertyDescriptor(params, key);\n if (typeof key !== \"string\" || !descriptor || !Object.hasOwn(descriptor, \"value\") || !descriptor.enumerable) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n const value: unknown = descriptor.value;\n if (!(value === null || typeof value === \"string\" || typeof value === \"boolean\" || (typeof value === \"number\" && Number.isFinite(value)))) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n Object.defineProperty(copied, key, { value, enumerable: true });\n }\n return Object.freeze({ name: query.name, query: query.query, params: Object.freeze(copied), dependencies: dependenciesCopy(query.dependencies), resolve: query.resolve });\n}\n\nexport function cmsTags(scope: string, dependencies: CmsDependencies): readonly string[] {\n if (typeof scope !== \"string\" || scope.length > 77 || !SCOPE.test(scope)) throw new TypeError(\"Invalid CMS scope\");\n const copied = dependenciesCopy(dependencies);\n const tags = [\n ...[...new Set(copied.types)].sort().map((type) => `cms:${scope}:type:${type}`),\n ...[...new Set(copied.ids ?? [])].sort().map((id) => `cms:${scope}:id:${id}`),\n ];\n return Object.freeze(tags);\n}\n", "import type { CmsAdapter, CmsFetch } from \"../../runtime/reader.js\";\nimport { cmsTags, defineCmsQuery } from \"../../contracts/query.js\";\n\nexport type SanityBinding = {\n readonly projectId: string;\n readonly dataset: string;\n readonly apiVersion: string;\n};\nexport type SanityAdapterOptions = {\n readonly binding: SanityBinding;\n readonly readToken?: string;\n readonly fetchImpl?: CmsFetch;\n readonly timeoutMs?: number;\n};\n\nconst RESPONSE_LIMIT = 2 * 1024 * 1024;\n\nfunction bindingCopy(binding: SanityBinding): SanityBinding {\n if (!binding || typeof binding.projectId !== \"string\" || !/^[a-z0-9]{6,12}$/.test(binding.projectId)\n || typeof binding.dataset !== \"string\" || !/^[a-z][a-z0-9_-]{0,63}$/.test(binding.dataset)\n || typeof binding.apiVersion !== \"string\" || !/^v?\\d{4}-\\d{2}-\\d{2}$/.test(binding.apiVersion)) {\n throw new TypeError(\"Invalid Sanity binding configuration\");\n }\n return Object.freeze({ projectId: binding.projectId, dataset: binding.dataset, apiVersion: binding.apiVersion.replace(/^v/, \"\") });\n}\n\n/** Applies policy via fetch's Next metadata. Standard fetch has no persistent cache or HTML invalidation. */\nexport function createSanityAdapter(options: SanityAdapterOptions): CmsAdapter {\n const binding = bindingCopy(options?.binding);\n const timeoutMs = options.timeoutMs ?? 1500;\n const token = options.readToken;\n if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0 || timeoutMs > 2147483647\n || (options.fetchImpl !== undefined && typeof options.fetchImpl !== \"function\")\n || (token !== undefined && (typeof token !== \"string\" || token.trim() === \"\" || /[\\r\\n]/.test(token)))) {\n throw new TypeError(\"Invalid Sanity adapter configuration\");\n }\n const fetchImpl = options.fetchImpl;\n const scope = `${binding.projectId}.${binding.dataset}`;\n return Object.freeze({\n scope,\n async read(query, policy) {\n // Direct structural callers receive the same configuration refusals.\n let validated;\n try {\n if (!policy || !Number.isSafeInteger(policy.revalidateSeconds) || policy.revalidateSeconds < 3600 || !Array.isArray(policy.tags)) throw new TypeError();\n const types: string[] = [];\n const ids: string[] = [];\n for (const tag of policy.tags) {\n if (typeof tag !== \"string\") throw new TypeError();\n if (tag.startsWith(`cms:${scope}:type:`)) types.push(tag.slice(`cms:${scope}:type:`.length));\n else if (tag.startsWith(`cms:${scope}:id:`)) ids.push(tag.slice(`cms:${scope}:id:`.length));\n else throw new TypeError();\n }\n const expected = cmsTags(scope, { types, ids });\n if (expected.length !== policy.tags.length || expected.some((tag, i) => tag !== policy.tags[i])) throw new TypeError();\n validated = defineCmsQuery({ ...query, dependencies: { types, ids }, resolve: (raw: unknown) => ({ data: raw, fallbackFields: [] }) });\n } catch { throw new TypeError(\"Invalid Sanity read configuration\"); }\n const url = new URL(`https://${binding.projectId}.api.sanity.io/v${binding.apiVersion}/data/query/${binding.dataset}`);\n url.searchParams.set(\"query\", validated.query);\n url.searchParams.set(\"perspective\", \"published\");\n for (const key of Object.keys(validated.params).sort()) url.searchParams.set(`$${key}`, JSON.stringify(validated.params[key]));\n const controller = new AbortController();\n let bodyReader: ReadableStreamDefaultReader<Uint8Array> | undefined;\n let expired = false;\n const cancel = (): void => {\n controller.abort();\n if (bodyReader) void bodyReader.cancel().catch(() => {});\n };\n let timer: ReturnType<typeof setTimeout> | undefined;\n const deadline = new Promise<Awaited<ReturnType<CmsAdapter[\"read\"]>>>((resolve) => {\n timer = setTimeout(() => {\n expired = true;\n cancel();\n resolve({ ok: false, reason: \"timeout\" });\n }, timeoutMs);\n });\n const work = async (): Promise<Awaited<ReturnType<CmsAdapter[\"read\"]>>> => {\n try {\n // Look up global fetch at read time so Next's patched fetch is retained.\n const response = await (fetchImpl ?? globalThis.fetch)(url.href, {\n method: \"GET\", redirect: \"error\", signal: controller.signal,\n headers: token === undefined ? {} : { Authorization: `Bearer ${token}` },\n next: { revalidate: policy.revalidateSeconds, tags: [...policy.tags] },\n });\n if (expired) { void response.body?.cancel().catch(() => {}); return { ok: false, reason: \"timeout\" }; }\n if (!response.ok) {\n void response.body?.cancel().catch(() => {});\n const status = response.status;\n const reason = status === 402 ? \"plan-limit\" : status === 401 || status === 403 ? \"permission\"\n : status === 429 ? \"rate-limit\" : \"upstream\";\n return { ok: false, reason, status };\n }\n if (!response.body) return { ok: false, reason: \"malformed\" };\n bodyReader = response.body.getReader();\n let bytes = 0;\n let text = \"\";\n const decoder = new TextDecoder(\"utf-8\", { fatal: true });\n while (true) {\n const chunk = await bodyReader.read();\n if (expired) return { ok: false, reason: \"timeout\" };\n if (chunk.done) break;\n bytes += chunk.value.byteLength;\n if (bytes > RESPONSE_LIMIT) { cancel(); return { ok: false, reason: \"malformed\" }; }\n try { text += decoder.decode(chunk.value, { stream: true }); }\n catch { cancel(); return { ok: false, reason: \"malformed\" }; }\n }\n try {\n text += decoder.decode();\n const envelope: unknown = JSON.parse(text);\n if (!envelope || typeof envelope !== \"object\" || Array.isArray(envelope) || !Object.hasOwn(envelope, \"result\")) return { ok: false, reason: \"malformed\" };\n return { ok: true, value: (envelope as Record<string, unknown>).result };\n } catch { return { ok: false, reason: \"malformed\" }; }\n } catch { return { ok: false, reason: expired ? \"timeout\" : \"network\" }; }\n };\n try { return await Promise.race([work(), deadline]); }\n finally { clearTimeout(timer); }\n },\n } satisfies CmsAdapter);\n}\n\nexport function sanityBindingFromEnv(env: Readonly<Record<string, string | undefined>>): SanityBinding {\n return bindingCopy({ projectId: env.SANITY_PROJECT_ID, dataset: env.SANITY_DATASET, apiVersion: env.SANITY_API_VERSION } as SanityBinding);\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["TYPE", "ID", "SCOPE", "dependenciesCopy", "dependencies", "types", "type", "ids", "id", "defineCmsQuery", "query", "params", "copied", "key", "descriptor", "value", "cmsTags", "scope", "tags", "RESPONSE_LIMIT", "bindingCopy", "binding", "createSanityAdapter", "options", "timeoutMs", "token", "fetchImpl", "scope", "query", "policy", "validated", "types", "ids", "tag", "expected", "cmsTags", "i", "defineCmsQuery", "raw", "url", "key", "controller", "bodyReader", "expired", "cancel", "timer", "deadline", "resolve", "work", "response", "status", "bytes", "text", "decoder", "chunk", "envelope", "sanityBindingFromEnv", "env"]
7
7
  }
package/dist/server.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var u=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var S=(e,r)=>{for(var n in r)u(e,n,{get:r[n],enumerable:!0})},h=(e,r,n,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of k(r))!v.call(e,t)&&t!==n&&u(e,t,{get:()=>r[t],enumerable:!(a=R(r,t))||a.enumerable});return e};var O=e=>h(u({},"__esModule",{value:!0}),e);var F={};S(F,{createCmsReader:()=>T});module.exports=O(F);var I=require("server-only");var A=/^[A-Za-z][A-Za-z0-9_]{0,63}$/,x=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/,z=/^[a-z0-9]{6,12}\.[a-z][a-z0-9_-]{0,63}$/;function g(e){if(!e||!Array.isArray(e.types)||e.types.length===0)throw new TypeError("CMS dependencies require document types");let r=[...e.types];for(let a of r)if(typeof a!="string"||!A.test(a))throw new TypeError("Invalid CMS document type");if(e.ids!==void 0&&!Array.isArray(e.ids))throw new TypeError("Invalid CMS document IDs");let n=e.ids===void 0?void 0:[...e.ids];for(let a of n??[])if(typeof a!="string"||!x.test(a)||/^(drafts|versions)\./.test(a))throw new TypeError("Invalid CMS document ID");if(new Set(r).size+new Set(n).size>128)throw new TypeError("Too many CMS tags");return Object.freeze({types:Object.freeze(r),...n===void 0?{}:{ids:Object.freeze(n)}})}function w(e){if(!e||typeof e.name!="string"||!/^[A-Za-z][A-Za-z0-9_.-]{0,127}$/.test(e.name)||typeof e.query!="string"||e.query.trim()===""||typeof e.resolve!="function")throw new TypeError("Invalid CMS query configuration");let r=e.params;if(!r||typeof r!="object"||Object.getPrototypeOf(r)!==Object.prototype&&Object.getPrototypeOf(r)!==null)throw new TypeError("CMS params must be plain JSON scalars");let n={};for(let a of Reflect.ownKeys(r)){let t=Object.getOwnPropertyDescriptor(r,a);if(typeof a!="string"||!t||!Object.hasOwn(t,"value")||!t.enumerable)throw new TypeError("CMS params must be plain JSON scalars");let s=t.value;if(!(s===null||typeof s=="string"||typeof s=="boolean"||typeof s=="number"&&Number.isFinite(s)))throw new TypeError("CMS params must be plain JSON scalars");Object.defineProperty(n,a,{value:s,enumerable:!0})}return Object.freeze({name:e.name,query:e.query,params:Object.freeze(n),dependencies:g(e.dependencies),resolve:e.resolve})}function p(e,r){if(typeof e!="string"||e.length>77||!z.test(e))throw new TypeError("Invalid CMS scope");let n=g(r),a=[...[...new Set(n.types)].sort().map(t=>`cms:${e}:type:${t}`),...[...new Set(n.ids??[])].sort().map(t=>`cms:${e}:id:${t}`)];return Object.freeze(a)}function b(e){if(!e||!Object.hasOwn(e,"data")||!Array.isArray(e.fallbackFields)||![...e.fallbackFields].every(r=>typeof r=="string"&&(r==="$"||/^[A-Za-z][A-Za-z0-9_.[\]-]{0,127}$/.test(r))))throw new TypeError("Invalid CMS resolution");if(e.warnings!==void 0&&(!Array.isArray(e.warnings)||![...e.warnings].every(r=>r==="siteHero.layout.defaulted")))throw new TypeError("Invalid CMS resolution warnings");return{data:e.data,fallbackFields:Object.freeze([...new Set(e.fallbackFields)]),...e.warnings?.length?{warnings:Object.freeze([...new Set(e.warnings)])}:{}}}function T(e){let r=e?.revalidateSeconds??3600;if(!Number.isSafeInteger(r)||r<3600||!e?.adapter||typeof e.adapter.read!="function"||e.onDiagnostic!==void 0&&typeof e.onDiagnostic!="function")throw new TypeError("Invalid CMS reader configuration");let n=e.adapter;p(n.scope,{types:["ScopeValidation"]});let a=t=>{try{e.onDiagnostic?e.onDiagnostic(t):console.warn(JSON.stringify(t))}catch{}};return{async read(t,s){let l,f,C;try{if(l=w(t),C=p(n.scope,l.dependencies),!s||!Object.hasOwn(s,"fallback"))throw new TypeError;f=b(l.resolve(null,s.fallback))}catch{throw new TypeError("Invalid CMS query or fallback configuration")}let m=(c,y,d)=>(a({event:"cms.fallback",query:l.name,reason:c,fields:["$"],...y===void 0?{}:{status:y},...d?{warnings:d}:{}}),{data:f.data,source:"fallback",fallbackFields:["$"],reason:c,...d?{warnings:d}:{}}),o;try{o=await n.read({name:l.name,query:l.query,params:l.params},{tags:C,revalidateSeconds:r})}catch{return m("network")}if(!o.ok){let y=["configuration","network","timeout","rate-limit","upstream","plan-limit","permission","malformed"].includes(o.reason)?o.reason:"malformed",d=Number.isInteger(o.status)&&(o.status??0)>=100&&(o.status??0)<=599?o.status:void 0;return m(y,d)}if(o.value===null||o.value===void 0)return m("missing");let i;try{i=b(l.resolve(o.value,s.fallback))}catch{return m("malformed")}return i.fallbackFields.includes("$")?{...m("invalid-field",void 0,i.warnings),data:i.data}:i.fallbackFields.length>0?(a({event:"cms.partial-fallback",query:l.name,reason:"invalid-field",fields:i.fallbackFields,...i.warnings?{warnings:i.warnings}:{}}),{...i,source:"mixed",reason:"invalid-field"}):{...i,source:"cms"}}}}0&&(module.exports={createCmsReader});
1
+ "use strict";var u=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var v=Object.prototype.hasOwnProperty;var S=(e,r)=>{for(var n in r)u(e,n,{get:r[n],enumerable:!0})},h=(e,r,n,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of k(r))!v.call(e,t)&&t!==n&&u(e,t,{get:()=>r[t],enumerable:!(a=R(r,t))||a.enumerable});return e};var O=e=>h(u({},"__esModule",{value:!0}),e);var F={};S(F,{createCmsReader:()=>T});module.exports=O(F);var I=require("server-only");var A=/^[A-Za-z][A-Za-z0-9_]{0,63}$/,x=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/,z=/^[a-z0-9]{6,12}\.[a-z][a-z0-9_-]{0,63}$/;function g(e){if(!e||!Array.isArray(e.types)||e.types.length===0)throw new TypeError("CMS dependencies require document types");let r=[...e.types];for(let a of r)if(typeof a!="string"||!A.test(a))throw new TypeError("Invalid CMS document type");if(e.ids!==void 0&&!Array.isArray(e.ids))throw new TypeError("Invalid CMS document IDs");let n=e.ids===void 0?void 0:[...e.ids];for(let a of n??[])if(typeof a!="string"||!x.test(a)||/^(drafts|versions)\./.test(a))throw new TypeError("Invalid CMS document ID");if(new Set(r).size+new Set(n).size>128)throw new TypeError("Too many CMS tags");return Object.freeze({types:Object.freeze(r),...n===void 0?{}:{ids:Object.freeze(n)}})}function w(e){if(!e||typeof e.name!="string"||!/^[A-Za-z][A-Za-z0-9_.-]{0,127}$/.test(e.name)||typeof e.query!="string"||e.query.trim()===""||typeof e.resolve!="function")throw new TypeError("Invalid CMS query configuration");let r=e.params;if(!r||typeof r!="object"||Object.getPrototypeOf(r)!==Object.prototype&&Object.getPrototypeOf(r)!==null)throw new TypeError("CMS params must be plain JSON scalars");let n={};for(let a of Reflect.ownKeys(r)){let t=Object.getOwnPropertyDescriptor(r,a);if(typeof a!="string"||!t||!Object.hasOwn(t,"value")||!t.enumerable)throw new TypeError("CMS params must be plain JSON scalars");let s=t.value;if(!(s===null||typeof s=="string"||typeof s=="boolean"||typeof s=="number"&&Number.isFinite(s)))throw new TypeError("CMS params must be plain JSON scalars");Object.defineProperty(n,a,{value:s,enumerable:!0})}return Object.freeze({name:e.name,query:e.query,params:Object.freeze(n),dependencies:g(e.dependencies),resolve:e.resolve})}function p(e,r){if(typeof e!="string"||e.length>77||!z.test(e))throw new TypeError("Invalid CMS scope");let n=g(r),a=[...[...new Set(n.types)].sort().map(t=>`cms:${e}:type:${t}`),...[...new Set(n.ids??[])].sort().map(t=>`cms:${e}:id:${t}`)];return Object.freeze(a)}function b(e){if(!e||!Object.hasOwn(e,"data")||!Array.isArray(e.fallbackFields)||![...e.fallbackFields].every(r=>typeof r=="string"&&(r==="$"||/^[A-Za-z][A-Za-z0-9_.[\]-]{0,127}$/.test(r))))throw new TypeError("Invalid CMS resolution");if(e.warnings!==void 0&&(!Array.isArray(e.warnings)||![...e.warnings].every(r=>r==="siteHero.layout.defaulted"||r==="siteHero.tagline.dropped"||r==="siteHero.taglines.defaulted")))throw new TypeError("Invalid CMS resolution warnings");return{data:e.data,fallbackFields:Object.freeze([...new Set(e.fallbackFields)]),...e.warnings?.length?{warnings:Object.freeze([...new Set(e.warnings)])}:{}}}function T(e){let r=e?.revalidateSeconds??3600;if(!Number.isSafeInteger(r)||r<3600||!e?.adapter||typeof e.adapter.read!="function"||e.onDiagnostic!==void 0&&typeof e.onDiagnostic!="function")throw new TypeError("Invalid CMS reader configuration");let n=e.adapter;p(n.scope,{types:["ScopeValidation"]});let a=t=>{try{e.onDiagnostic?e.onDiagnostic(t):console.warn(JSON.stringify(t))}catch{}};return{async read(t,s){let l,f,C;try{if(l=w(t),C=p(n.scope,l.dependencies),!s||!Object.hasOwn(s,"fallback"))throw new TypeError;f=b(l.resolve(null,s.fallback))}catch{throw new TypeError("Invalid CMS query or fallback configuration")}let m=(c,y,d)=>(a({event:"cms.fallback",query:l.name,reason:c,fields:["$"],...y===void 0?{}:{status:y},...d?{warnings:d}:{}}),{data:f.data,source:"fallback",fallbackFields:["$"],reason:c,...d?{warnings:d}:{}}),o;try{o=await n.read({name:l.name,query:l.query,params:l.params},{tags:C,revalidateSeconds:r})}catch{return m("network")}if(!o.ok){let y=["configuration","network","timeout","rate-limit","upstream","plan-limit","permission","malformed"].includes(o.reason)?o.reason:"malformed",d=Number.isInteger(o.status)&&(o.status??0)>=100&&(o.status??0)<=599?o.status:void 0;return m(y,d)}if(o.value===null||o.value===void 0)return m("missing");let i;try{i=b(l.resolve(o.value,s.fallback))}catch{return m("malformed")}return i.fallbackFields.includes("$")?{...m("invalid-field",void 0,i.warnings),data:i.data}:i.fallbackFields.length>0?(a({event:"cms.partial-fallback",query:l.name,reason:"invalid-field",fields:i.fallbackFields,...i.warnings?{warnings:i.warnings}:{}}),{...i,source:"mixed",reason:"invalid-field"}):{...i,source:"cms"}}}}0&&(module.exports={createCmsReader});
2
2
  //# sourceMappingURL=server.cjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/server.ts", "../src/contracts/query.ts", "../src/runtime/reader.ts"],
4
- "sourcesContent": ["import \"server-only\";\nexport { createCmsReader } from \"./runtime/reader.js\";\nexport type {\n CmsFailure, CmsDiagnostic, CmsFetch, CmsReadPolicy, CmsAdapterResult,\n CmsAdapter, CmsReadResult, CmsReaderOptions, CmsReader,\n} from \"./runtime/reader.js\";\n", "/** A-1822 S1 owns this implementation. S0 registers the public signatures. */\nexport type CmsParams = Readonly<Record<string, string | number | boolean | null>>;\nexport type CmsDependencies = {\n readonly types: readonly string[];\n readonly ids?: readonly string[];\n};\nexport type CmsResolution<T> = {\n readonly data: T;\n readonly fallbackFields: readonly string[];\n readonly warnings?: readonly \"siteHero.layout.defaulted\"[];\n};\nexport type CmsQuery<T> = {\n readonly name: string;\n readonly query: string;\n readonly params: CmsParams;\n readonly dependencies: CmsDependencies;\n readonly resolve: (raw: unknown, fallback: T) => CmsResolution<T>;\n};\n\nconst TYPE = /^[A-Za-z][A-Za-z0-9_]{0,63}$/;\nconst ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;\nconst SCOPE = /^[a-z0-9]{6,12}\\.[a-z][a-z0-9_-]{0,63}$/;\n\nfunction dependenciesCopy(dependencies: CmsDependencies): CmsDependencies {\n if (!dependencies || !Array.isArray(dependencies.types) || dependencies.types.length === 0) {\n throw new TypeError(\"CMS dependencies require document types\");\n }\n const types = [...dependencies.types];\n for (const type of types) {\n if (typeof type !== \"string\" || !TYPE.test(type)) throw new TypeError(\"Invalid CMS document type\");\n }\n if (dependencies.ids !== undefined && !Array.isArray(dependencies.ids)) throw new TypeError(\"Invalid CMS document IDs\");\n const ids = dependencies.ids === undefined ? undefined : [...dependencies.ids];\n for (const id of ids ?? []) {\n if (typeof id !== \"string\" || !ID.test(id) || /^(drafts|versions)\\./.test(id)) {\n throw new TypeError(\"Invalid CMS document ID\");\n }\n }\n if (new Set(types).size + new Set(ids).size > 128) throw new TypeError(\"Too many CMS tags\");\n return Object.freeze({ types: Object.freeze(types), ...(ids === undefined ? {} : { ids: Object.freeze(ids) }) });\n}\n\nexport function defineCmsQuery<T>(query: CmsQuery<T>): CmsQuery<T> {\n if (!query || typeof query.name !== \"string\" || !/^[A-Za-z][A-Za-z0-9_.-]{0,127}$/.test(query.name)\n || typeof query.query !== \"string\" || query.query.trim() === \"\" || typeof query.resolve !== \"function\") {\n throw new TypeError(\"Invalid CMS query configuration\");\n }\n const params = query.params;\n if (!params || typeof params !== \"object\" || (Object.getPrototypeOf(params) !== Object.prototype && Object.getPrototypeOf(params) !== null)) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n const copied: Record<string, string | number | boolean | null> = {};\n for (const key of Reflect.ownKeys(params)) {\n const descriptor = Object.getOwnPropertyDescriptor(params, key);\n if (typeof key !== \"string\" || !descriptor || !Object.hasOwn(descriptor, \"value\") || !descriptor.enumerable) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n const value: unknown = descriptor.value;\n if (!(value === null || typeof value === \"string\" || typeof value === \"boolean\" || (typeof value === \"number\" && Number.isFinite(value)))) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n Object.defineProperty(copied, key, { value, enumerable: true });\n }\n return Object.freeze({ name: query.name, query: query.query, params: Object.freeze(copied), dependencies: dependenciesCopy(query.dependencies), resolve: query.resolve });\n}\n\nexport function cmsTags(scope: string, dependencies: CmsDependencies): readonly string[] {\n if (typeof scope !== \"string\" || scope.length > 77 || !SCOPE.test(scope)) throw new TypeError(\"Invalid CMS scope\");\n const copied = dependenciesCopy(dependencies);\n const tags = [\n ...[...new Set(copied.types)].sort().map((type) => `cms:${scope}:type:${type}`),\n ...[...new Set(copied.ids ?? [])].sort().map((id) => `cms:${scope}:id:${id}`),\n ];\n return Object.freeze(tags);\n}\n", "import { cmsTags, defineCmsQuery, type CmsQuery, type CmsResolution } from \"../contracts/query.js\";\n\nexport type CmsFailure = \"configuration\" | \"network\" | \"timeout\" | \"rate-limit\"\n | \"upstream\" | \"plan-limit\" | \"permission\" | \"malformed\";\nexport type CmsDiagnostic = {\n readonly event: \"cms.fallback\" | \"cms.partial-fallback\" | \"cms.refused\";\n readonly query: string;\n readonly reason: CmsFailure | \"missing\" | \"invalid-field\";\n readonly status?: number;\n readonly fields: readonly string[];\n readonly warnings?: CmsResolution<unknown>[\"warnings\"];\n};\nexport type CmsFetch = (url: string, init: RequestInit & {\n next?: { revalidate: number; tags: string[] };\n}) => Promise<Response>;\nexport type CmsReadPolicy = {\n readonly tags: readonly string[];\n readonly revalidateSeconds: number;\n};\nexport type CmsAdapterResult =\n | { readonly ok: true; readonly value: unknown }\n | { readonly ok: false; readonly reason: CmsFailure; readonly status?: number };\nexport type CmsAdapter = {\n readonly scope: string;\n read(query: Pick<CmsQuery<unknown>, \"name\" | \"query\" | \"params\">,\n policy: CmsReadPolicy): Promise<CmsAdapterResult>;\n};\nexport type CmsReadResult<T> = {\n readonly data: T;\n readonly source: \"cms\" | \"mixed\" | \"fallback\";\n readonly fallbackFields: readonly string[];\n readonly reason?: CmsFailure | \"missing\" | \"invalid-field\";\n readonly warnings?: CmsResolution<unknown>[\"warnings\"];\n};\nexport type CmsReaderOptions = {\n readonly adapter: CmsAdapter;\n readonly revalidateSeconds?: number;\n readonly onDiagnostic?: (event: CmsDiagnostic) => void;\n};\nexport type CmsReader = {\n read<T>(query: CmsQuery<T>, options: { readonly fallback: T }): Promise<CmsReadResult<T>>;\n};\n\nfunction resolution<T>(value: CmsResolution<T>): CmsResolution<T> {\n if (!value || !Object.hasOwn(value, \"data\") || !Array.isArray(value.fallbackFields)\n || ![...value.fallbackFields].every((field: unknown) => typeof field === \"string\"\n && (field === \"$\" || /^[A-Za-z][A-Za-z0-9_.[\\]-]{0,127}$/.test(field)))) {\n throw new TypeError(\"Invalid CMS resolution\");\n }\n if (value.warnings !== undefined && (!Array.isArray(value.warnings)\n || ![...value.warnings].every((warning) => warning === \"siteHero.layout.defaulted\"))) {\n throw new TypeError(\"Invalid CMS resolution warnings\");\n }\n return { data: value.data, fallbackFields: Object.freeze([...new Set(value.fallbackFields)]),\n ...(value.warnings?.length ? { warnings: Object.freeze([...new Set(value.warnings)]) } : {}) };\n}\n\n/** Forwards cache policy; persistence and rendered-output invalidation belong to the host. */\nexport function createCmsReader(options: CmsReaderOptions): CmsReader {\n const seconds = options?.revalidateSeconds ?? 3600;\n if (!Number.isSafeInteger(seconds) || seconds < 3600 || !options?.adapter\n || typeof options.adapter.read !== \"function\"\n || (options.onDiagnostic !== undefined && typeof options.onDiagnostic !== \"function\")) {\n throw new TypeError(\"Invalid CMS reader configuration\");\n }\n const adapter = options.adapter;\n // Validate the scope without assuming any particular shared content types.\n cmsTags(adapter.scope, { types: [\"ScopeValidation\"] });\n const notify = (event: CmsDiagnostic): void => {\n try {\n if (options.onDiagnostic) options.onDiagnostic(event);\n else console.warn(JSON.stringify(event));\n } catch { /* Reporting must not break visitor rendering. */ }\n };\n return {\n async read<T>(input: CmsQuery<T>, readOptions: { readonly fallback: T }): Promise<CmsReadResult<T>> {\n let query: CmsQuery<T>;\n let local: CmsResolution<T>;\n let tags: readonly string[];\n try {\n query = defineCmsQuery(input);\n tags = cmsTags(adapter.scope, query.dependencies);\n if (!readOptions || !Object.hasOwn(readOptions, \"fallback\")) throw new TypeError();\n // Built-in resolvers validate fallback here, before any I/O.\n local = resolution(query.resolve(null, readOptions.fallback));\n } catch {\n throw new TypeError(\"Invalid CMS query or fallback configuration\");\n }\n const fallback = (reason: CmsFailure | \"missing\" | \"invalid-field\", status?: number, warnings?: CmsResolution<T>[\"warnings\"]): CmsReadResult<T> => {\n notify({ event: \"cms.fallback\", query: query.name, reason, fields: [\"$\"],\n ...(status === undefined ? {} : { status }), ...(warnings ? { warnings } : {}) });\n return { data: local.data, source: \"fallback\", fallbackFields: [\"$\"], reason, ...(warnings ? { warnings } : {}) };\n };\n let result: CmsAdapterResult;\n try {\n result = await adapter.read({ name: query.name, query: query.query, params: query.params },\n { tags, revalidateSeconds: seconds });\n } catch { return fallback(\"network\"); }\n if (!result.ok) {\n const reasons: readonly CmsFailure[] = [\"configuration\", \"network\", \"timeout\", \"rate-limit\", \"upstream\", \"plan-limit\", \"permission\", \"malformed\"];\n const reason = reasons.includes(result.reason) ? result.reason : \"malformed\";\n const status = Number.isInteger(result.status) && (result.status ?? 0) >= 100 && (result.status ?? 0) <= 599 ? result.status : undefined;\n return fallback(reason, status);\n }\n if (result.value === null || result.value === undefined) return fallback(\"missing\");\n let resolved: CmsResolution<T>;\n try { resolved = resolution(query.resolve(result.value, readOptions.fallback)); }\n catch { return fallback(\"malformed\"); }\n if (resolved.fallbackFields.includes(\"$\")) {\n return { ...fallback(\"invalid-field\", undefined, resolved.warnings), data: resolved.data };\n }\n if (resolved.fallbackFields.length > 0) {\n notify({ event: \"cms.partial-fallback\", query: query.name, reason: \"invalid-field\", fields: resolved.fallbackFields, ...(resolved.warnings ? { warnings: resolved.warnings } : {}) });\n return { ...resolved, source: \"mixed\", reason: \"invalid-field\" };\n }\n return { ...resolved, source: \"cms\" };\n },\n };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import \"server-only\";\nexport { createCmsReader } from \"./runtime/reader.js\";\nexport type {\n CmsFailure, CmsDiagnostic, CmsFetch, CmsReadPolicy, CmsAdapterResult,\n CmsAdapter, CmsReadResult, CmsReaderOptions, CmsReader,\n} from \"./runtime/reader.js\";\n", "/** A-1822 S1 owns this implementation. S0 registers the public signatures. */\nexport type CmsParams = Readonly<Record<string, string | number | boolean | null>>;\nexport type CmsDependencies = {\n readonly types: readonly string[];\n readonly ids?: readonly string[];\n};\nexport type CmsResolution<T> = {\n readonly data: T;\n readonly fallbackFields: readonly string[];\n readonly warnings?: readonly (\"siteHero.layout.defaulted\" | \"siteHero.tagline.dropped\" | \"siteHero.taglines.defaulted\")[];\n};\nexport type CmsQuery<T> = {\n readonly name: string;\n readonly query: string;\n readonly params: CmsParams;\n readonly dependencies: CmsDependencies;\n readonly resolve: (raw: unknown, fallback: T) => CmsResolution<T>;\n};\n\nconst TYPE = /^[A-Za-z][A-Za-z0-9_]{0,63}$/;\nconst ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;\nconst SCOPE = /^[a-z0-9]{6,12}\\.[a-z][a-z0-9_-]{0,63}$/;\n\nfunction dependenciesCopy(dependencies: CmsDependencies): CmsDependencies {\n if (!dependencies || !Array.isArray(dependencies.types) || dependencies.types.length === 0) {\n throw new TypeError(\"CMS dependencies require document types\");\n }\n const types = [...dependencies.types];\n for (const type of types) {\n if (typeof type !== \"string\" || !TYPE.test(type)) throw new TypeError(\"Invalid CMS document type\");\n }\n if (dependencies.ids !== undefined && !Array.isArray(dependencies.ids)) throw new TypeError(\"Invalid CMS document IDs\");\n const ids = dependencies.ids === undefined ? undefined : [...dependencies.ids];\n for (const id of ids ?? []) {\n if (typeof id !== \"string\" || !ID.test(id) || /^(drafts|versions)\\./.test(id)) {\n throw new TypeError(\"Invalid CMS document ID\");\n }\n }\n if (new Set(types).size + new Set(ids).size > 128) throw new TypeError(\"Too many CMS tags\");\n return Object.freeze({ types: Object.freeze(types), ...(ids === undefined ? {} : { ids: Object.freeze(ids) }) });\n}\n\nexport function defineCmsQuery<T>(query: CmsQuery<T>): CmsQuery<T> {\n if (!query || typeof query.name !== \"string\" || !/^[A-Za-z][A-Za-z0-9_.-]{0,127}$/.test(query.name)\n || typeof query.query !== \"string\" || query.query.trim() === \"\" || typeof query.resolve !== \"function\") {\n throw new TypeError(\"Invalid CMS query configuration\");\n }\n const params = query.params;\n if (!params || typeof params !== \"object\" || (Object.getPrototypeOf(params) !== Object.prototype && Object.getPrototypeOf(params) !== null)) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n const copied: Record<string, string | number | boolean | null> = {};\n for (const key of Reflect.ownKeys(params)) {\n const descriptor = Object.getOwnPropertyDescriptor(params, key);\n if (typeof key !== \"string\" || !descriptor || !Object.hasOwn(descriptor, \"value\") || !descriptor.enumerable) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n const value: unknown = descriptor.value;\n if (!(value === null || typeof value === \"string\" || typeof value === \"boolean\" || (typeof value === \"number\" && Number.isFinite(value)))) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n Object.defineProperty(copied, key, { value, enumerable: true });\n }\n return Object.freeze({ name: query.name, query: query.query, params: Object.freeze(copied), dependencies: dependenciesCopy(query.dependencies), resolve: query.resolve });\n}\n\nexport function cmsTags(scope: string, dependencies: CmsDependencies): readonly string[] {\n if (typeof scope !== \"string\" || scope.length > 77 || !SCOPE.test(scope)) throw new TypeError(\"Invalid CMS scope\");\n const copied = dependenciesCopy(dependencies);\n const tags = [\n ...[...new Set(copied.types)].sort().map((type) => `cms:${scope}:type:${type}`),\n ...[...new Set(copied.ids ?? [])].sort().map((id) => `cms:${scope}:id:${id}`),\n ];\n return Object.freeze(tags);\n}\n", "import { cmsTags, defineCmsQuery, type CmsQuery, type CmsResolution } from \"../contracts/query.js\";\n\nexport type CmsFailure = \"configuration\" | \"network\" | \"timeout\" | \"rate-limit\"\n | \"upstream\" | \"plan-limit\" | \"permission\" | \"malformed\";\nexport type CmsDiagnostic = {\n readonly event: \"cms.fallback\" | \"cms.partial-fallback\" | \"cms.refused\";\n readonly query: string;\n readonly reason: CmsFailure | \"missing\" | \"invalid-field\";\n readonly status?: number;\n readonly fields: readonly string[];\n readonly warnings?: CmsResolution<unknown>[\"warnings\"];\n};\nexport type CmsFetch = (url: string, init: RequestInit & {\n next?: { revalidate: number; tags: string[] };\n}) => Promise<Response>;\nexport type CmsReadPolicy = {\n readonly tags: readonly string[];\n readonly revalidateSeconds: number;\n};\nexport type CmsAdapterResult =\n | { readonly ok: true; readonly value: unknown }\n | { readonly ok: false; readonly reason: CmsFailure; readonly status?: number };\nexport type CmsAdapter = {\n readonly scope: string;\n read(query: Pick<CmsQuery<unknown>, \"name\" | \"query\" | \"params\">,\n policy: CmsReadPolicy): Promise<CmsAdapterResult>;\n};\nexport type CmsReadResult<T> = {\n readonly data: T;\n readonly source: \"cms\" | \"mixed\" | \"fallback\";\n readonly fallbackFields: readonly string[];\n readonly reason?: CmsFailure | \"missing\" | \"invalid-field\";\n readonly warnings?: CmsResolution<unknown>[\"warnings\"];\n};\nexport type CmsReaderOptions = {\n readonly adapter: CmsAdapter;\n readonly revalidateSeconds?: number;\n readonly onDiagnostic?: (event: CmsDiagnostic) => void;\n};\nexport type CmsReader = {\n read<T>(query: CmsQuery<T>, options: { readonly fallback: T }): Promise<CmsReadResult<T>>;\n};\n\nfunction resolution<T>(value: CmsResolution<T>): CmsResolution<T> {\n if (!value || !Object.hasOwn(value, \"data\") || !Array.isArray(value.fallbackFields)\n || ![...value.fallbackFields].every((field: unknown) => typeof field === \"string\"\n && (field === \"$\" || /^[A-Za-z][A-Za-z0-9_.[\\]-]{0,127}$/.test(field)))) {\n throw new TypeError(\"Invalid CMS resolution\");\n }\n if (value.warnings !== undefined && (!Array.isArray(value.warnings)\n || ![...value.warnings].every((warning) => warning === \"siteHero.layout.defaulted\"\n || warning === \"siteHero.tagline.dropped\" || warning === \"siteHero.taglines.defaulted\"))) {\n throw new TypeError(\"Invalid CMS resolution warnings\");\n }\n return { data: value.data, fallbackFields: Object.freeze([...new Set(value.fallbackFields)]),\n ...(value.warnings?.length ? { warnings: Object.freeze([...new Set(value.warnings)]) } : {}) };\n}\n\n/** Forwards cache policy; persistence and rendered-output invalidation belong to the host. */\nexport function createCmsReader(options: CmsReaderOptions): CmsReader {\n const seconds = options?.revalidateSeconds ?? 3600;\n if (!Number.isSafeInteger(seconds) || seconds < 3600 || !options?.adapter\n || typeof options.adapter.read !== \"function\"\n || (options.onDiagnostic !== undefined && typeof options.onDiagnostic !== \"function\")) {\n throw new TypeError(\"Invalid CMS reader configuration\");\n }\n const adapter = options.adapter;\n // Validate the scope without assuming any particular shared content types.\n cmsTags(adapter.scope, { types: [\"ScopeValidation\"] });\n const notify = (event: CmsDiagnostic): void => {\n try {\n if (options.onDiagnostic) options.onDiagnostic(event);\n else console.warn(JSON.stringify(event));\n } catch { /* Reporting must not break visitor rendering. */ }\n };\n return {\n async read<T>(input: CmsQuery<T>, readOptions: { readonly fallback: T }): Promise<CmsReadResult<T>> {\n let query: CmsQuery<T>;\n let local: CmsResolution<T>;\n let tags: readonly string[];\n try {\n query = defineCmsQuery(input);\n tags = cmsTags(adapter.scope, query.dependencies);\n if (!readOptions || !Object.hasOwn(readOptions, \"fallback\")) throw new TypeError();\n // Built-in resolvers validate fallback here, before any I/O.\n local = resolution(query.resolve(null, readOptions.fallback));\n } catch {\n throw new TypeError(\"Invalid CMS query or fallback configuration\");\n }\n const fallback = (reason: CmsFailure | \"missing\" | \"invalid-field\", status?: number, warnings?: CmsResolution<T>[\"warnings\"]): CmsReadResult<T> => {\n notify({ event: \"cms.fallback\", query: query.name, reason, fields: [\"$\"],\n ...(status === undefined ? {} : { status }), ...(warnings ? { warnings } : {}) });\n return { data: local.data, source: \"fallback\", fallbackFields: [\"$\"], reason, ...(warnings ? { warnings } : {}) };\n };\n let result: CmsAdapterResult;\n try {\n result = await adapter.read({ name: query.name, query: query.query, params: query.params },\n { tags, revalidateSeconds: seconds });\n } catch { return fallback(\"network\"); }\n if (!result.ok) {\n const reasons: readonly CmsFailure[] = [\"configuration\", \"network\", \"timeout\", \"rate-limit\", \"upstream\", \"plan-limit\", \"permission\", \"malformed\"];\n const reason = reasons.includes(result.reason) ? result.reason : \"malformed\";\n const status = Number.isInteger(result.status) && (result.status ?? 0) >= 100 && (result.status ?? 0) <= 599 ? result.status : undefined;\n return fallback(reason, status);\n }\n if (result.value === null || result.value === undefined) return fallback(\"missing\");\n let resolved: CmsResolution<T>;\n try { resolved = resolution(query.resolve(result.value, readOptions.fallback)); }\n catch { return fallback(\"malformed\"); }\n if (resolved.fallbackFields.includes(\"$\")) {\n return { ...fallback(\"invalid-field\", undefined, resolved.warnings), data: resolved.data };\n }\n if (resolved.fallbackFields.length > 0) {\n notify({ event: \"cms.partial-fallback\", query: query.name, reason: \"invalid-field\", fields: resolved.fallbackFields, ...(resolved.warnings ? { warnings: resolved.warnings } : {}) });\n return { ...resolved, source: \"mixed\", reason: \"invalid-field\" };\n }\n return { ...resolved, source: \"cms\" };\n },\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["server_exports", "__export", "createCmsReader", "__toCommonJS", "import_server_only", "TYPE", "ID", "SCOPE", "dependenciesCopy", "dependencies", "types", "type", "ids", "id", "defineCmsQuery", "query", "params", "copied", "key", "descriptor", "value", "cmsTags", "scope", "tags", "resolution", "value", "field", "warning", "createCmsReader", "options", "seconds", "adapter", "cmsTags", "notify", "event", "input", "readOptions", "query", "local", "tags", "defineCmsQuery", "fallback", "reason", "status", "warnings", "result", "resolved"]
7
7
  }
package/dist/server.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import"server-only";var b=/^[A-Za-z][A-Za-z0-9_]{0,63}$/,T=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/,R=/^[a-z0-9]{6,12}\.[a-z][a-z0-9_-]{0,63}$/;function C(e){if(!e||!Array.isArray(e.types)||e.types.length===0)throw new TypeError("CMS dependencies require document types");let r=[...e.types];for(let n of r)if(typeof n!="string"||!b.test(n))throw new TypeError("Invalid CMS document type");if(e.ids!==void 0&&!Array.isArray(e.ids))throw new TypeError("Invalid CMS document IDs");let t=e.ids===void 0?void 0:[...e.ids];for(let n of t??[])if(typeof n!="string"||!T.test(n)||/^(drafts|versions)\./.test(n))throw new TypeError("Invalid CMS document ID");if(new Set(r).size+new Set(t).size>128)throw new TypeError("Too many CMS tags");return Object.freeze({types:Object.freeze(r),...t===void 0?{}:{ids:Object.freeze(t)}})}function g(e){if(!e||typeof e.name!="string"||!/^[A-Za-z][A-Za-z0-9_.-]{0,127}$/.test(e.name)||typeof e.query!="string"||e.query.trim()===""||typeof e.resolve!="function")throw new TypeError("Invalid CMS query configuration");let r=e.params;if(!r||typeof r!="object"||Object.getPrototypeOf(r)!==Object.prototype&&Object.getPrototypeOf(r)!==null)throw new TypeError("CMS params must be plain JSON scalars");let t={};for(let n of Reflect.ownKeys(r)){let a=Object.getOwnPropertyDescriptor(r,n);if(typeof n!="string"||!a||!Object.hasOwn(a,"value")||!a.enumerable)throw new TypeError("CMS params must be plain JSON scalars");let s=a.value;if(!(s===null||typeof s=="string"||typeof s=="boolean"||typeof s=="number"&&Number.isFinite(s)))throw new TypeError("CMS params must be plain JSON scalars");Object.defineProperty(t,n,{value:s,enumerable:!0})}return Object.freeze({name:e.name,query:e.query,params:Object.freeze(t),dependencies:C(e.dependencies),resolve:e.resolve})}function u(e,r){if(typeof e!="string"||e.length>77||!R.test(e))throw new TypeError("Invalid CMS scope");let t=C(r),n=[...[...new Set(t.types)].sort().map(a=>`cms:${e}:type:${a}`),...[...new Set(t.ids??[])].sort().map(a=>`cms:${e}:id:${a}`)];return Object.freeze(n)}function w(e){if(!e||!Object.hasOwn(e,"data")||!Array.isArray(e.fallbackFields)||![...e.fallbackFields].every(r=>typeof r=="string"&&(r==="$"||/^[A-Za-z][A-Za-z0-9_.[\]-]{0,127}$/.test(r))))throw new TypeError("Invalid CMS resolution");if(e.warnings!==void 0&&(!Array.isArray(e.warnings)||![...e.warnings].every(r=>r==="siteHero.layout.defaulted")))throw new TypeError("Invalid CMS resolution warnings");return{data:e.data,fallbackFields:Object.freeze([...new Set(e.fallbackFields)]),...e.warnings?.length?{warnings:Object.freeze([...new Set(e.warnings)])}:{}}}function k(e){let r=e?.revalidateSeconds??3600;if(!Number.isSafeInteger(r)||r<3600||!e?.adapter||typeof e.adapter.read!="function"||e.onDiagnostic!==void 0&&typeof e.onDiagnostic!="function")throw new TypeError("Invalid CMS reader configuration");let t=e.adapter;u(t.scope,{types:["ScopeValidation"]});let n=a=>{try{e.onDiagnostic?e.onDiagnostic(a):console.warn(JSON.stringify(a))}catch{}};return{async read(a,s){let l,p,f;try{if(l=g(a),f=u(t.scope,l.dependencies),!s||!Object.hasOwn(s,"fallback"))throw new TypeError;p=w(l.resolve(null,s.fallback))}catch{throw new TypeError("Invalid CMS query or fallback configuration")}let m=(c,y,d)=>(n({event:"cms.fallback",query:l.name,reason:c,fields:["$"],...y===void 0?{}:{status:y},...d?{warnings:d}:{}}),{data:p.data,source:"fallback",fallbackFields:["$"],reason:c,...d?{warnings:d}:{}}),o;try{o=await t.read({name:l.name,query:l.query,params:l.params},{tags:f,revalidateSeconds:r})}catch{return m("network")}if(!o.ok){let y=["configuration","network","timeout","rate-limit","upstream","plan-limit","permission","malformed"].includes(o.reason)?o.reason:"malformed",d=Number.isInteger(o.status)&&(o.status??0)>=100&&(o.status??0)<=599?o.status:void 0;return m(y,d)}if(o.value===null||o.value===void 0)return m("missing");let i;try{i=w(l.resolve(o.value,s.fallback))}catch{return m("malformed")}return i.fallbackFields.includes("$")?{...m("invalid-field",void 0,i.warnings),data:i.data}:i.fallbackFields.length>0?(n({event:"cms.partial-fallback",query:l.name,reason:"invalid-field",fields:i.fallbackFields,...i.warnings?{warnings:i.warnings}:{}}),{...i,source:"mixed",reason:"invalid-field"}):{...i,source:"cms"}}}}export{k as createCmsReader};
1
+ import"server-only";var b=/^[A-Za-z][A-Za-z0-9_]{0,63}$/,T=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/,R=/^[a-z0-9]{6,12}\.[a-z][a-z0-9_-]{0,63}$/;function C(e){if(!e||!Array.isArray(e.types)||e.types.length===0)throw new TypeError("CMS dependencies require document types");let r=[...e.types];for(let n of r)if(typeof n!="string"||!b.test(n))throw new TypeError("Invalid CMS document type");if(e.ids!==void 0&&!Array.isArray(e.ids))throw new TypeError("Invalid CMS document IDs");let t=e.ids===void 0?void 0:[...e.ids];for(let n of t??[])if(typeof n!="string"||!T.test(n)||/^(drafts|versions)\./.test(n))throw new TypeError("Invalid CMS document ID");if(new Set(r).size+new Set(t).size>128)throw new TypeError("Too many CMS tags");return Object.freeze({types:Object.freeze(r),...t===void 0?{}:{ids:Object.freeze(t)}})}function g(e){if(!e||typeof e.name!="string"||!/^[A-Za-z][A-Za-z0-9_.-]{0,127}$/.test(e.name)||typeof e.query!="string"||e.query.trim()===""||typeof e.resolve!="function")throw new TypeError("Invalid CMS query configuration");let r=e.params;if(!r||typeof r!="object"||Object.getPrototypeOf(r)!==Object.prototype&&Object.getPrototypeOf(r)!==null)throw new TypeError("CMS params must be plain JSON scalars");let t={};for(let n of Reflect.ownKeys(r)){let a=Object.getOwnPropertyDescriptor(r,n);if(typeof n!="string"||!a||!Object.hasOwn(a,"value")||!a.enumerable)throw new TypeError("CMS params must be plain JSON scalars");let s=a.value;if(!(s===null||typeof s=="string"||typeof s=="boolean"||typeof s=="number"&&Number.isFinite(s)))throw new TypeError("CMS params must be plain JSON scalars");Object.defineProperty(t,n,{value:s,enumerable:!0})}return Object.freeze({name:e.name,query:e.query,params:Object.freeze(t),dependencies:C(e.dependencies),resolve:e.resolve})}function u(e,r){if(typeof e!="string"||e.length>77||!R.test(e))throw new TypeError("Invalid CMS scope");let t=C(r),n=[...[...new Set(t.types)].sort().map(a=>`cms:${e}:type:${a}`),...[...new Set(t.ids??[])].sort().map(a=>`cms:${e}:id:${a}`)];return Object.freeze(n)}function w(e){if(!e||!Object.hasOwn(e,"data")||!Array.isArray(e.fallbackFields)||![...e.fallbackFields].every(r=>typeof r=="string"&&(r==="$"||/^[A-Za-z][A-Za-z0-9_.[\]-]{0,127}$/.test(r))))throw new TypeError("Invalid CMS resolution");if(e.warnings!==void 0&&(!Array.isArray(e.warnings)||![...e.warnings].every(r=>r==="siteHero.layout.defaulted"||r==="siteHero.tagline.dropped"||r==="siteHero.taglines.defaulted")))throw new TypeError("Invalid CMS resolution warnings");return{data:e.data,fallbackFields:Object.freeze([...new Set(e.fallbackFields)]),...e.warnings?.length?{warnings:Object.freeze([...new Set(e.warnings)])}:{}}}function k(e){let r=e?.revalidateSeconds??3600;if(!Number.isSafeInteger(r)||r<3600||!e?.adapter||typeof e.adapter.read!="function"||e.onDiagnostic!==void 0&&typeof e.onDiagnostic!="function")throw new TypeError("Invalid CMS reader configuration");let t=e.adapter;u(t.scope,{types:["ScopeValidation"]});let n=a=>{try{e.onDiagnostic?e.onDiagnostic(a):console.warn(JSON.stringify(a))}catch{}};return{async read(a,s){let l,p,f;try{if(l=g(a),f=u(t.scope,l.dependencies),!s||!Object.hasOwn(s,"fallback"))throw new TypeError;p=w(l.resolve(null,s.fallback))}catch{throw new TypeError("Invalid CMS query or fallback configuration")}let m=(c,y,d)=>(n({event:"cms.fallback",query:l.name,reason:c,fields:["$"],...y===void 0?{}:{status:y},...d?{warnings:d}:{}}),{data:p.data,source:"fallback",fallbackFields:["$"],reason:c,...d?{warnings:d}:{}}),o;try{o=await t.read({name:l.name,query:l.query,params:l.params},{tags:f,revalidateSeconds:r})}catch{return m("network")}if(!o.ok){let y=["configuration","network","timeout","rate-limit","upstream","plan-limit","permission","malformed"].includes(o.reason)?o.reason:"malformed",d=Number.isInteger(o.status)&&(o.status??0)>=100&&(o.status??0)<=599?o.status:void 0;return m(y,d)}if(o.value===null||o.value===void 0)return m("missing");let i;try{i=w(l.resolve(o.value,s.fallback))}catch{return m("malformed")}return i.fallbackFields.includes("$")?{...m("invalid-field",void 0,i.warnings),data:i.data}:i.fallbackFields.length>0?(n({event:"cms.partial-fallback",query:l.name,reason:"invalid-field",fields:i.fallbackFields,...i.warnings?{warnings:i.warnings}:{}}),{...i,source:"mixed",reason:"invalid-field"}):{...i,source:"cms"}}}}export{k as createCmsReader};
2
2
  //# sourceMappingURL=server.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/server.ts", "../src/contracts/query.ts", "../src/runtime/reader.ts"],
4
- "sourcesContent": ["import \"server-only\";\nexport { createCmsReader } from \"./runtime/reader.js\";\nexport type {\n CmsFailure, CmsDiagnostic, CmsFetch, CmsReadPolicy, CmsAdapterResult,\n CmsAdapter, CmsReadResult, CmsReaderOptions, CmsReader,\n} from \"./runtime/reader.js\";\n", "/** A-1822 S1 owns this implementation. S0 registers the public signatures. */\nexport type CmsParams = Readonly<Record<string, string | number | boolean | null>>;\nexport type CmsDependencies = {\n readonly types: readonly string[];\n readonly ids?: readonly string[];\n};\nexport type CmsResolution<T> = {\n readonly data: T;\n readonly fallbackFields: readonly string[];\n readonly warnings?: readonly \"siteHero.layout.defaulted\"[];\n};\nexport type CmsQuery<T> = {\n readonly name: string;\n readonly query: string;\n readonly params: CmsParams;\n readonly dependencies: CmsDependencies;\n readonly resolve: (raw: unknown, fallback: T) => CmsResolution<T>;\n};\n\nconst TYPE = /^[A-Za-z][A-Za-z0-9_]{0,63}$/;\nconst ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;\nconst SCOPE = /^[a-z0-9]{6,12}\\.[a-z][a-z0-9_-]{0,63}$/;\n\nfunction dependenciesCopy(dependencies: CmsDependencies): CmsDependencies {\n if (!dependencies || !Array.isArray(dependencies.types) || dependencies.types.length === 0) {\n throw new TypeError(\"CMS dependencies require document types\");\n }\n const types = [...dependencies.types];\n for (const type of types) {\n if (typeof type !== \"string\" || !TYPE.test(type)) throw new TypeError(\"Invalid CMS document type\");\n }\n if (dependencies.ids !== undefined && !Array.isArray(dependencies.ids)) throw new TypeError(\"Invalid CMS document IDs\");\n const ids = dependencies.ids === undefined ? undefined : [...dependencies.ids];\n for (const id of ids ?? []) {\n if (typeof id !== \"string\" || !ID.test(id) || /^(drafts|versions)\\./.test(id)) {\n throw new TypeError(\"Invalid CMS document ID\");\n }\n }\n if (new Set(types).size + new Set(ids).size > 128) throw new TypeError(\"Too many CMS tags\");\n return Object.freeze({ types: Object.freeze(types), ...(ids === undefined ? {} : { ids: Object.freeze(ids) }) });\n}\n\nexport function defineCmsQuery<T>(query: CmsQuery<T>): CmsQuery<T> {\n if (!query || typeof query.name !== \"string\" || !/^[A-Za-z][A-Za-z0-9_.-]{0,127}$/.test(query.name)\n || typeof query.query !== \"string\" || query.query.trim() === \"\" || typeof query.resolve !== \"function\") {\n throw new TypeError(\"Invalid CMS query configuration\");\n }\n const params = query.params;\n if (!params || typeof params !== \"object\" || (Object.getPrototypeOf(params) !== Object.prototype && Object.getPrototypeOf(params) !== null)) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n const copied: Record<string, string | number | boolean | null> = {};\n for (const key of Reflect.ownKeys(params)) {\n const descriptor = Object.getOwnPropertyDescriptor(params, key);\n if (typeof key !== \"string\" || !descriptor || !Object.hasOwn(descriptor, \"value\") || !descriptor.enumerable) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n const value: unknown = descriptor.value;\n if (!(value === null || typeof value === \"string\" || typeof value === \"boolean\" || (typeof value === \"number\" && Number.isFinite(value)))) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n Object.defineProperty(copied, key, { value, enumerable: true });\n }\n return Object.freeze({ name: query.name, query: query.query, params: Object.freeze(copied), dependencies: dependenciesCopy(query.dependencies), resolve: query.resolve });\n}\n\nexport function cmsTags(scope: string, dependencies: CmsDependencies): readonly string[] {\n if (typeof scope !== \"string\" || scope.length > 77 || !SCOPE.test(scope)) throw new TypeError(\"Invalid CMS scope\");\n const copied = dependenciesCopy(dependencies);\n const tags = [\n ...[...new Set(copied.types)].sort().map((type) => `cms:${scope}:type:${type}`),\n ...[...new Set(copied.ids ?? [])].sort().map((id) => `cms:${scope}:id:${id}`),\n ];\n return Object.freeze(tags);\n}\n", "import { cmsTags, defineCmsQuery, type CmsQuery, type CmsResolution } from \"../contracts/query.js\";\n\nexport type CmsFailure = \"configuration\" | \"network\" | \"timeout\" | \"rate-limit\"\n | \"upstream\" | \"plan-limit\" | \"permission\" | \"malformed\";\nexport type CmsDiagnostic = {\n readonly event: \"cms.fallback\" | \"cms.partial-fallback\" | \"cms.refused\";\n readonly query: string;\n readonly reason: CmsFailure | \"missing\" | \"invalid-field\";\n readonly status?: number;\n readonly fields: readonly string[];\n readonly warnings?: CmsResolution<unknown>[\"warnings\"];\n};\nexport type CmsFetch = (url: string, init: RequestInit & {\n next?: { revalidate: number; tags: string[] };\n}) => Promise<Response>;\nexport type CmsReadPolicy = {\n readonly tags: readonly string[];\n readonly revalidateSeconds: number;\n};\nexport type CmsAdapterResult =\n | { readonly ok: true; readonly value: unknown }\n | { readonly ok: false; readonly reason: CmsFailure; readonly status?: number };\nexport type CmsAdapter = {\n readonly scope: string;\n read(query: Pick<CmsQuery<unknown>, \"name\" | \"query\" | \"params\">,\n policy: CmsReadPolicy): Promise<CmsAdapterResult>;\n};\nexport type CmsReadResult<T> = {\n readonly data: T;\n readonly source: \"cms\" | \"mixed\" | \"fallback\";\n readonly fallbackFields: readonly string[];\n readonly reason?: CmsFailure | \"missing\" | \"invalid-field\";\n readonly warnings?: CmsResolution<unknown>[\"warnings\"];\n};\nexport type CmsReaderOptions = {\n readonly adapter: CmsAdapter;\n readonly revalidateSeconds?: number;\n readonly onDiagnostic?: (event: CmsDiagnostic) => void;\n};\nexport type CmsReader = {\n read<T>(query: CmsQuery<T>, options: { readonly fallback: T }): Promise<CmsReadResult<T>>;\n};\n\nfunction resolution<T>(value: CmsResolution<T>): CmsResolution<T> {\n if (!value || !Object.hasOwn(value, \"data\") || !Array.isArray(value.fallbackFields)\n || ![...value.fallbackFields].every((field: unknown) => typeof field === \"string\"\n && (field === \"$\" || /^[A-Za-z][A-Za-z0-9_.[\\]-]{0,127}$/.test(field)))) {\n throw new TypeError(\"Invalid CMS resolution\");\n }\n if (value.warnings !== undefined && (!Array.isArray(value.warnings)\n || ![...value.warnings].every((warning) => warning === \"siteHero.layout.defaulted\"))) {\n throw new TypeError(\"Invalid CMS resolution warnings\");\n }\n return { data: value.data, fallbackFields: Object.freeze([...new Set(value.fallbackFields)]),\n ...(value.warnings?.length ? { warnings: Object.freeze([...new Set(value.warnings)]) } : {}) };\n}\n\n/** Forwards cache policy; persistence and rendered-output invalidation belong to the host. */\nexport function createCmsReader(options: CmsReaderOptions): CmsReader {\n const seconds = options?.revalidateSeconds ?? 3600;\n if (!Number.isSafeInteger(seconds) || seconds < 3600 || !options?.adapter\n || typeof options.adapter.read !== \"function\"\n || (options.onDiagnostic !== undefined && typeof options.onDiagnostic !== \"function\")) {\n throw new TypeError(\"Invalid CMS reader configuration\");\n }\n const adapter = options.adapter;\n // Validate the scope without assuming any particular shared content types.\n cmsTags(adapter.scope, { types: [\"ScopeValidation\"] });\n const notify = (event: CmsDiagnostic): void => {\n try {\n if (options.onDiagnostic) options.onDiagnostic(event);\n else console.warn(JSON.stringify(event));\n } catch { /* Reporting must not break visitor rendering. */ }\n };\n return {\n async read<T>(input: CmsQuery<T>, readOptions: { readonly fallback: T }): Promise<CmsReadResult<T>> {\n let query: CmsQuery<T>;\n let local: CmsResolution<T>;\n let tags: readonly string[];\n try {\n query = defineCmsQuery(input);\n tags = cmsTags(adapter.scope, query.dependencies);\n if (!readOptions || !Object.hasOwn(readOptions, \"fallback\")) throw new TypeError();\n // Built-in resolvers validate fallback here, before any I/O.\n local = resolution(query.resolve(null, readOptions.fallback));\n } catch {\n throw new TypeError(\"Invalid CMS query or fallback configuration\");\n }\n const fallback = (reason: CmsFailure | \"missing\" | \"invalid-field\", status?: number, warnings?: CmsResolution<T>[\"warnings\"]): CmsReadResult<T> => {\n notify({ event: \"cms.fallback\", query: query.name, reason, fields: [\"$\"],\n ...(status === undefined ? {} : { status }), ...(warnings ? { warnings } : {}) });\n return { data: local.data, source: \"fallback\", fallbackFields: [\"$\"], reason, ...(warnings ? { warnings } : {}) };\n };\n let result: CmsAdapterResult;\n try {\n result = await adapter.read({ name: query.name, query: query.query, params: query.params },\n { tags, revalidateSeconds: seconds });\n } catch { return fallback(\"network\"); }\n if (!result.ok) {\n const reasons: readonly CmsFailure[] = [\"configuration\", \"network\", \"timeout\", \"rate-limit\", \"upstream\", \"plan-limit\", \"permission\", \"malformed\"];\n const reason = reasons.includes(result.reason) ? result.reason : \"malformed\";\n const status = Number.isInteger(result.status) && (result.status ?? 0) >= 100 && (result.status ?? 0) <= 599 ? result.status : undefined;\n return fallback(reason, status);\n }\n if (result.value === null || result.value === undefined) return fallback(\"missing\");\n let resolved: CmsResolution<T>;\n try { resolved = resolution(query.resolve(result.value, readOptions.fallback)); }\n catch { return fallback(\"malformed\"); }\n if (resolved.fallbackFields.includes(\"$\")) {\n return { ...fallback(\"invalid-field\", undefined, resolved.warnings), data: resolved.data };\n }\n if (resolved.fallbackFields.length > 0) {\n notify({ event: \"cms.partial-fallback\", query: query.name, reason: \"invalid-field\", fields: resolved.fallbackFields, ...(resolved.warnings ? { warnings: resolved.warnings } : {}) });\n return { ...resolved, source: \"mixed\", reason: \"invalid-field\" };\n }\n return { ...resolved, source: \"cms\" };\n },\n };\n}\n"],
5
- "mappings": "AAAA,MAAO,cCmBP,IAAMA,EAAO,+BACPC,EAAK,qCACLC,EAAQ,0CAEd,SAASC,EAAiBC,EAAgD,CACxE,GAAI,CAACA,GAAgB,CAAC,MAAM,QAAQA,EAAa,KAAK,GAAKA,EAAa,MAAM,SAAW,EACvF,MAAM,IAAI,UAAU,yCAAyC,EAE/D,IAAMC,EAAQ,CAAC,GAAGD,EAAa,KAAK,EACpC,QAAWE,KAAQD,EACjB,GAAI,OAAOC,GAAS,UAAY,CAACN,EAAK,KAAKM,CAAI,EAAG,MAAM,IAAI,UAAU,2BAA2B,EAEnG,GAAIF,EAAa,MAAQ,QAAa,CAAC,MAAM,QAAQA,EAAa,GAAG,EAAG,MAAM,IAAI,UAAU,0BAA0B,EACtH,IAAMG,EAAMH,EAAa,MAAQ,OAAY,OAAY,CAAC,GAAGA,EAAa,GAAG,EAC7E,QAAWI,KAAMD,GAAO,CAAC,EACvB,GAAI,OAAOC,GAAO,UAAY,CAACP,EAAG,KAAKO,CAAE,GAAK,uBAAuB,KAAKA,CAAE,EAC1E,MAAM,IAAI,UAAU,yBAAyB,EAGjD,GAAI,IAAI,IAAIH,CAAK,EAAE,KAAO,IAAI,IAAIE,CAAG,EAAE,KAAO,IAAK,MAAM,IAAI,UAAU,mBAAmB,EAC1F,OAAO,OAAO,OAAO,CAAE,MAAO,OAAO,OAAOF,CAAK,EAAG,GAAIE,IAAQ,OAAY,CAAC,EAAI,CAAE,IAAK,OAAO,OAAOA,CAAG,CAAE,CAAG,CAAC,CACjH,CAEO,SAASE,EAAkBC,EAAiC,CACjE,GAAI,CAACA,GAAS,OAAOA,EAAM,MAAS,UAAY,CAAC,kCAAkC,KAAKA,EAAM,IAAI,GAC7F,OAAOA,EAAM,OAAU,UAAYA,EAAM,MAAM,KAAK,IAAM,IAAM,OAAOA,EAAM,SAAY,WAC5F,MAAM,IAAI,UAAU,iCAAiC,EAEvD,IAAMC,EAASD,EAAM,OACrB,GAAI,CAACC,GAAU,OAAOA,GAAW,UAAa,OAAO,eAAeA,CAAM,IAAM,OAAO,WAAa,OAAO,eAAeA,CAAM,IAAM,KACpI,MAAM,IAAI,UAAU,uCAAuC,EAE7D,IAAMC,EAA2D,CAAC,EAClE,QAAWC,KAAO,QAAQ,QAAQF,CAAM,EAAG,CACzC,IAAMG,EAAa,OAAO,yBAAyBH,EAAQE,CAAG,EAC9D,GAAI,OAAOA,GAAQ,UAAY,CAACC,GAAc,CAAC,OAAO,OAAOA,EAAY,OAAO,GAAK,CAACA,EAAW,WAC/F,MAAM,IAAI,UAAU,uCAAuC,EAE7D,IAAMC,EAAiBD,EAAW,MAClC,GAAI,EAAEC,IAAU,MAAQ,OAAOA,GAAU,UAAY,OAAOA,GAAU,WAAc,OAAOA,GAAU,UAAY,OAAO,SAASA,CAAK,GACpI,MAAM,IAAI,UAAU,uCAAuC,EAE7D,OAAO,eAAeH,EAAQC,EAAK,CAAE,MAAAE,EAAO,WAAY,EAAK,CAAC,CAChE,CACA,OAAO,OAAO,OAAO,CAAE,KAAML,EAAM,KAAM,MAAOA,EAAM,MAAO,OAAQ,OAAO,OAAOE,CAAM,EAAG,aAAcT,EAAiBO,EAAM,YAAY,EAAG,QAASA,EAAM,OAAQ,CAAC,CAC1K,CAEO,SAASM,EAAQC,EAAeb,EAAkD,CACvF,GAAI,OAAOa,GAAU,UAAYA,EAAM,OAAS,IAAM,CAACf,EAAM,KAAKe,CAAK,EAAG,MAAM,IAAI,UAAU,mBAAmB,EACjH,IAAML,EAAST,EAAiBC,CAAY,EACtCc,EAAO,CACX,GAAG,CAAC,GAAG,IAAI,IAAIN,EAAO,KAAK,CAAC,EAAE,KAAK,EAAE,IAAKN,GAAS,OAAOW,CAAK,SAASX,CAAI,EAAE,EAC9E,GAAG,CAAC,GAAG,IAAI,IAAIM,EAAO,KAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAKJ,GAAO,OAAOS,CAAK,OAAOT,CAAE,EAAE,CAC9E,EACA,OAAO,OAAO,OAAOU,CAAI,CAC3B,CC/BA,SAASC,EAAcC,EAA2C,CAChE,GAAI,CAACA,GAAS,CAAC,OAAO,OAAOA,EAAO,MAAM,GAAK,CAAC,MAAM,QAAQA,EAAM,cAAc,GAC7E,CAAC,CAAC,GAAGA,EAAM,cAAc,EAAE,MAAOC,GAAmB,OAAOA,GAAU,WACnEA,IAAU,KAAO,qCAAqC,KAAKA,CAAK,EAAE,EACxE,MAAM,IAAI,UAAU,wBAAwB,EAE9C,GAAID,EAAM,WAAa,SAAc,CAAC,MAAM,QAAQA,EAAM,QAAQ,GAC7D,CAAC,CAAC,GAAGA,EAAM,QAAQ,EAAE,MAAOE,GAAYA,IAAY,2BAA2B,GAClF,MAAM,IAAI,UAAU,iCAAiC,EAEvD,MAAO,CAAE,KAAMF,EAAM,KAAM,eAAgB,OAAO,OAAO,CAAC,GAAG,IAAI,IAAIA,EAAM,cAAc,CAAC,CAAC,EACzF,GAAIA,EAAM,UAAU,OAAS,CAAE,SAAU,OAAO,OAAO,CAAC,GAAG,IAAI,IAAIA,EAAM,QAAQ,CAAC,CAAC,CAAE,EAAI,CAAC,CAAG,CACjG,CAGO,SAASG,EAAgBC,EAAsC,CACpE,IAAMC,EAAUD,GAAS,mBAAqB,KAC9C,GAAI,CAAC,OAAO,cAAcC,CAAO,GAAKA,EAAU,MAAQ,CAACD,GAAS,SAC7D,OAAOA,EAAQ,QAAQ,MAAS,YAC/BA,EAAQ,eAAiB,QAAa,OAAOA,EAAQ,cAAiB,WAC1E,MAAM,IAAI,UAAU,kCAAkC,EAExD,IAAME,EAAUF,EAAQ,QAExBG,EAAQD,EAAQ,MAAO,CAAE,MAAO,CAAC,iBAAiB,CAAE,CAAC,EACrD,IAAME,EAAUC,GAA+B,CAC7C,GAAI,CACEL,EAAQ,aAAcA,EAAQ,aAAaK,CAAK,EAC/C,QAAQ,KAAK,KAAK,UAAUA,CAAK,CAAC,CACzC,MAAQ,CAAoD,CAC9D,EACA,MAAO,CACL,MAAM,KAAQC,EAAoBC,EAAkE,CAClG,IAAIC,EACAC,EACAC,EACJ,GAAI,CAGF,GAFAF,EAAQG,EAAeL,CAAK,EAC5BI,EAAOP,EAAQD,EAAQ,MAAOM,EAAM,YAAY,EAC5C,CAACD,GAAe,CAAC,OAAO,OAAOA,EAAa,UAAU,EAAG,MAAM,IAAI,UAEvEE,EAAQd,EAAWa,EAAM,QAAQ,KAAMD,EAAY,QAAQ,CAAC,CAC9D,MAAQ,CACN,MAAM,IAAI,UAAU,6CAA6C,CACnE,CACA,IAAMK,EAAW,CAACC,EAAkDC,EAAiBC,KACnFX,EAAO,CAAE,MAAO,eAAgB,MAAOI,EAAM,KAAM,OAAAK,EAAQ,OAAQ,CAAC,GAAG,EACrE,GAAIC,IAAW,OAAY,CAAC,EAAI,CAAE,OAAAA,CAAO,EAAI,GAAIC,EAAW,CAAE,SAAAA,CAAS,EAAI,CAAC,CAAG,CAAC,EAC3E,CAAE,KAAMN,EAAM,KAAM,OAAQ,WAAY,eAAgB,CAAC,GAAG,EAAG,OAAAI,EAAQ,GAAIE,EAAW,CAAE,SAAAA,CAAS,EAAI,CAAC,CAAG,GAE9GC,EACJ,GAAI,CACFA,EAAS,MAAMd,EAAQ,KAAK,CAAE,KAAMM,EAAM,KAAM,MAAOA,EAAM,MAAO,OAAQA,EAAM,MAAO,EACvF,CAAE,KAAAE,EAAM,kBAAmBT,CAAQ,CAAC,CACxC,MAAQ,CAAE,OAAOW,EAAS,SAAS,CAAG,CACtC,GAAI,CAACI,EAAO,GAAI,CAEd,IAAMH,EADiC,CAAC,gBAAiB,UAAW,UAAW,aAAc,WAAY,aAAc,aAAc,WAAW,EACzH,SAASG,EAAO,MAAM,EAAIA,EAAO,OAAS,YAC3DF,EAAS,OAAO,UAAUE,EAAO,MAAM,IAAMA,EAAO,QAAU,IAAM,MAAQA,EAAO,QAAU,IAAM,IAAMA,EAAO,OAAS,OAC/H,OAAOJ,EAASC,EAAQC,CAAM,CAChC,CACA,GAAIE,EAAO,QAAU,MAAQA,EAAO,QAAU,OAAW,OAAOJ,EAAS,SAAS,EAClF,IAAIK,EACJ,GAAI,CAAEA,EAAWtB,EAAWa,EAAM,QAAQQ,EAAO,MAAOT,EAAY,QAAQ,CAAC,CAAG,MAC1E,CAAE,OAAOK,EAAS,WAAW,CAAG,CACtC,OAAIK,EAAS,eAAe,SAAS,GAAG,EAC/B,CAAE,GAAGL,EAAS,gBAAiB,OAAWK,EAAS,QAAQ,EAAG,KAAMA,EAAS,IAAK,EAEvFA,EAAS,eAAe,OAAS,GACnCb,EAAO,CAAE,MAAO,uBAAwB,MAAOI,EAAM,KAAM,OAAQ,gBAAiB,OAAQS,EAAS,eAAgB,GAAIA,EAAS,SAAW,CAAE,SAAUA,EAAS,QAAS,EAAI,CAAC,CAAG,CAAC,EAC7K,CAAE,GAAGA,EAAU,OAAQ,QAAS,OAAQ,eAAgB,GAE1D,CAAE,GAAGA,EAAU,OAAQ,KAAM,CACtC,CACF,CACF",
4
+ "sourcesContent": ["import \"server-only\";\nexport { createCmsReader } from \"./runtime/reader.js\";\nexport type {\n CmsFailure, CmsDiagnostic, CmsFetch, CmsReadPolicy, CmsAdapterResult,\n CmsAdapter, CmsReadResult, CmsReaderOptions, CmsReader,\n} from \"./runtime/reader.js\";\n", "/** A-1822 S1 owns this implementation. S0 registers the public signatures. */\nexport type CmsParams = Readonly<Record<string, string | number | boolean | null>>;\nexport type CmsDependencies = {\n readonly types: readonly string[];\n readonly ids?: readonly string[];\n};\nexport type CmsResolution<T> = {\n readonly data: T;\n readonly fallbackFields: readonly string[];\n readonly warnings?: readonly (\"siteHero.layout.defaulted\" | \"siteHero.tagline.dropped\" | \"siteHero.taglines.defaulted\")[];\n};\nexport type CmsQuery<T> = {\n readonly name: string;\n readonly query: string;\n readonly params: CmsParams;\n readonly dependencies: CmsDependencies;\n readonly resolve: (raw: unknown, fallback: T) => CmsResolution<T>;\n};\n\nconst TYPE = /^[A-Za-z][A-Za-z0-9_]{0,63}$/;\nconst ID = /^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;\nconst SCOPE = /^[a-z0-9]{6,12}\\.[a-z][a-z0-9_-]{0,63}$/;\n\nfunction dependenciesCopy(dependencies: CmsDependencies): CmsDependencies {\n if (!dependencies || !Array.isArray(dependencies.types) || dependencies.types.length === 0) {\n throw new TypeError(\"CMS dependencies require document types\");\n }\n const types = [...dependencies.types];\n for (const type of types) {\n if (typeof type !== \"string\" || !TYPE.test(type)) throw new TypeError(\"Invalid CMS document type\");\n }\n if (dependencies.ids !== undefined && !Array.isArray(dependencies.ids)) throw new TypeError(\"Invalid CMS document IDs\");\n const ids = dependencies.ids === undefined ? undefined : [...dependencies.ids];\n for (const id of ids ?? []) {\n if (typeof id !== \"string\" || !ID.test(id) || /^(drafts|versions)\\./.test(id)) {\n throw new TypeError(\"Invalid CMS document ID\");\n }\n }\n if (new Set(types).size + new Set(ids).size > 128) throw new TypeError(\"Too many CMS tags\");\n return Object.freeze({ types: Object.freeze(types), ...(ids === undefined ? {} : { ids: Object.freeze(ids) }) });\n}\n\nexport function defineCmsQuery<T>(query: CmsQuery<T>): CmsQuery<T> {\n if (!query || typeof query.name !== \"string\" || !/^[A-Za-z][A-Za-z0-9_.-]{0,127}$/.test(query.name)\n || typeof query.query !== \"string\" || query.query.trim() === \"\" || typeof query.resolve !== \"function\") {\n throw new TypeError(\"Invalid CMS query configuration\");\n }\n const params = query.params;\n if (!params || typeof params !== \"object\" || (Object.getPrototypeOf(params) !== Object.prototype && Object.getPrototypeOf(params) !== null)) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n const copied: Record<string, string | number | boolean | null> = {};\n for (const key of Reflect.ownKeys(params)) {\n const descriptor = Object.getOwnPropertyDescriptor(params, key);\n if (typeof key !== \"string\" || !descriptor || !Object.hasOwn(descriptor, \"value\") || !descriptor.enumerable) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n const value: unknown = descriptor.value;\n if (!(value === null || typeof value === \"string\" || typeof value === \"boolean\" || (typeof value === \"number\" && Number.isFinite(value)))) {\n throw new TypeError(\"CMS params must be plain JSON scalars\");\n }\n Object.defineProperty(copied, key, { value, enumerable: true });\n }\n return Object.freeze({ name: query.name, query: query.query, params: Object.freeze(copied), dependencies: dependenciesCopy(query.dependencies), resolve: query.resolve });\n}\n\nexport function cmsTags(scope: string, dependencies: CmsDependencies): readonly string[] {\n if (typeof scope !== \"string\" || scope.length > 77 || !SCOPE.test(scope)) throw new TypeError(\"Invalid CMS scope\");\n const copied = dependenciesCopy(dependencies);\n const tags = [\n ...[...new Set(copied.types)].sort().map((type) => `cms:${scope}:type:${type}`),\n ...[...new Set(copied.ids ?? [])].sort().map((id) => `cms:${scope}:id:${id}`),\n ];\n return Object.freeze(tags);\n}\n", "import { cmsTags, defineCmsQuery, type CmsQuery, type CmsResolution } from \"../contracts/query.js\";\n\nexport type CmsFailure = \"configuration\" | \"network\" | \"timeout\" | \"rate-limit\"\n | \"upstream\" | \"plan-limit\" | \"permission\" | \"malformed\";\nexport type CmsDiagnostic = {\n readonly event: \"cms.fallback\" | \"cms.partial-fallback\" | \"cms.refused\";\n readonly query: string;\n readonly reason: CmsFailure | \"missing\" | \"invalid-field\";\n readonly status?: number;\n readonly fields: readonly string[];\n readonly warnings?: CmsResolution<unknown>[\"warnings\"];\n};\nexport type CmsFetch = (url: string, init: RequestInit & {\n next?: { revalidate: number; tags: string[] };\n}) => Promise<Response>;\nexport type CmsReadPolicy = {\n readonly tags: readonly string[];\n readonly revalidateSeconds: number;\n};\nexport type CmsAdapterResult =\n | { readonly ok: true; readonly value: unknown }\n | { readonly ok: false; readonly reason: CmsFailure; readonly status?: number };\nexport type CmsAdapter = {\n readonly scope: string;\n read(query: Pick<CmsQuery<unknown>, \"name\" | \"query\" | \"params\">,\n policy: CmsReadPolicy): Promise<CmsAdapterResult>;\n};\nexport type CmsReadResult<T> = {\n readonly data: T;\n readonly source: \"cms\" | \"mixed\" | \"fallback\";\n readonly fallbackFields: readonly string[];\n readonly reason?: CmsFailure | \"missing\" | \"invalid-field\";\n readonly warnings?: CmsResolution<unknown>[\"warnings\"];\n};\nexport type CmsReaderOptions = {\n readonly adapter: CmsAdapter;\n readonly revalidateSeconds?: number;\n readonly onDiagnostic?: (event: CmsDiagnostic) => void;\n};\nexport type CmsReader = {\n read<T>(query: CmsQuery<T>, options: { readonly fallback: T }): Promise<CmsReadResult<T>>;\n};\n\nfunction resolution<T>(value: CmsResolution<T>): CmsResolution<T> {\n if (!value || !Object.hasOwn(value, \"data\") || !Array.isArray(value.fallbackFields)\n || ![...value.fallbackFields].every((field: unknown) => typeof field === \"string\"\n && (field === \"$\" || /^[A-Za-z][A-Za-z0-9_.[\\]-]{0,127}$/.test(field)))) {\n throw new TypeError(\"Invalid CMS resolution\");\n }\n if (value.warnings !== undefined && (!Array.isArray(value.warnings)\n || ![...value.warnings].every((warning) => warning === \"siteHero.layout.defaulted\"\n || warning === \"siteHero.tagline.dropped\" || warning === \"siteHero.taglines.defaulted\"))) {\n throw new TypeError(\"Invalid CMS resolution warnings\");\n }\n return { data: value.data, fallbackFields: Object.freeze([...new Set(value.fallbackFields)]),\n ...(value.warnings?.length ? { warnings: Object.freeze([...new Set(value.warnings)]) } : {}) };\n}\n\n/** Forwards cache policy; persistence and rendered-output invalidation belong to the host. */\nexport function createCmsReader(options: CmsReaderOptions): CmsReader {\n const seconds = options?.revalidateSeconds ?? 3600;\n if (!Number.isSafeInteger(seconds) || seconds < 3600 || !options?.adapter\n || typeof options.adapter.read !== \"function\"\n || (options.onDiagnostic !== undefined && typeof options.onDiagnostic !== \"function\")) {\n throw new TypeError(\"Invalid CMS reader configuration\");\n }\n const adapter = options.adapter;\n // Validate the scope without assuming any particular shared content types.\n cmsTags(adapter.scope, { types: [\"ScopeValidation\"] });\n const notify = (event: CmsDiagnostic): void => {\n try {\n if (options.onDiagnostic) options.onDiagnostic(event);\n else console.warn(JSON.stringify(event));\n } catch { /* Reporting must not break visitor rendering. */ }\n };\n return {\n async read<T>(input: CmsQuery<T>, readOptions: { readonly fallback: T }): Promise<CmsReadResult<T>> {\n let query: CmsQuery<T>;\n let local: CmsResolution<T>;\n let tags: readonly string[];\n try {\n query = defineCmsQuery(input);\n tags = cmsTags(adapter.scope, query.dependencies);\n if (!readOptions || !Object.hasOwn(readOptions, \"fallback\")) throw new TypeError();\n // Built-in resolvers validate fallback here, before any I/O.\n local = resolution(query.resolve(null, readOptions.fallback));\n } catch {\n throw new TypeError(\"Invalid CMS query or fallback configuration\");\n }\n const fallback = (reason: CmsFailure | \"missing\" | \"invalid-field\", status?: number, warnings?: CmsResolution<T>[\"warnings\"]): CmsReadResult<T> => {\n notify({ event: \"cms.fallback\", query: query.name, reason, fields: [\"$\"],\n ...(status === undefined ? {} : { status }), ...(warnings ? { warnings } : {}) });\n return { data: local.data, source: \"fallback\", fallbackFields: [\"$\"], reason, ...(warnings ? { warnings } : {}) };\n };\n let result: CmsAdapterResult;\n try {\n result = await adapter.read({ name: query.name, query: query.query, params: query.params },\n { tags, revalidateSeconds: seconds });\n } catch { return fallback(\"network\"); }\n if (!result.ok) {\n const reasons: readonly CmsFailure[] = [\"configuration\", \"network\", \"timeout\", \"rate-limit\", \"upstream\", \"plan-limit\", \"permission\", \"malformed\"];\n const reason = reasons.includes(result.reason) ? result.reason : \"malformed\";\n const status = Number.isInteger(result.status) && (result.status ?? 0) >= 100 && (result.status ?? 0) <= 599 ? result.status : undefined;\n return fallback(reason, status);\n }\n if (result.value === null || result.value === undefined) return fallback(\"missing\");\n let resolved: CmsResolution<T>;\n try { resolved = resolution(query.resolve(result.value, readOptions.fallback)); }\n catch { return fallback(\"malformed\"); }\n if (resolved.fallbackFields.includes(\"$\")) {\n return { ...fallback(\"invalid-field\", undefined, resolved.warnings), data: resolved.data };\n }\n if (resolved.fallbackFields.length > 0) {\n notify({ event: \"cms.partial-fallback\", query: query.name, reason: \"invalid-field\", fields: resolved.fallbackFields, ...(resolved.warnings ? { warnings: resolved.warnings } : {}) });\n return { ...resolved, source: \"mixed\", reason: \"invalid-field\" };\n }\n return { ...resolved, source: \"cms\" };\n },\n };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["TYPE", "ID", "SCOPE", "dependenciesCopy", "dependencies", "types", "type", "ids", "id", "defineCmsQuery", "query", "params", "copied", "key", "descriptor", "value", "cmsTags", "scope", "tags", "resolution", "value", "field", "warning", "createCmsReader", "options", "seconds", "adapter", "cmsTags", "notify", "event", "input", "readOptions", "query", "local", "tags", "defineCmsQuery", "fallback", "reason", "status", "warnings", "result", "resolved"]
7
7
  }
@@ -1,7 +1,7 @@
1
- "use strict";var sn=Object.defineProperty;var Dn=Object.getOwnPropertyDescriptor;var jn=Object.getOwnPropertyNames;var qn=Object.prototype.hasOwnProperty;var Mn=(n,e)=>{for(var t in e)sn(n,t,{get:e[t],enumerable:!0})},Gn=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of jn(e))!qn.call(n,i)&&i!==t&&sn(n,i,{get:()=>e[i],enumerable:!(o=Dn(e,i))||o.enumerable});return n};var Un=n=>Gn(sn({},"__esModule",{value:!0}),n);var vn={};Mn(vn,{CONTENT_PAGES_QUERY:()=>en,CONTENT_PAGE_BY_SLUG_QUERY:()=>tn,HEADING_LIST_LAYOUTS:()=>L,HOME_PAGE_DOCUMENT_QUERY:()=>G,MALFORMED_CONTENT:()=>X,MalformedContentError:()=>b,READER_ACTION_HREF:()=>z,READER_GALLERY_PHOTO_LIMIT:()=>B,READER_GALLERY_PHOTO_MIN:()=>Y,READER_HOME_PAGE_ID:()=>O,READER_JUMP_LINK:()=>D,READER_PHOTO_SLUG:()=>F,READER_SECTION_KINDS:()=>mn,READER_SITE_SETTINGS_ID:()=>x,READER_STORY_LAYOUTS:()=>Q,SECTION_LAYOUT_DEFAULTS:()=>R,SECTION_WARNINGS:()=>_,SITE_HERO_LAYOUTS:()=>yn,SITE_HERO_LAYOUT_WARNING:()=>gn,SITE_HERO_TAGLINE_MAX_LENGTH:()=>fn,SPLIT_LAYOUTS:()=>A,STAGGER_ROW_LAYOUTS:()=>H,campaignState:()=>pn,contentPageQuery:()=>On,contentPagesQuery:()=>xn,createSiteContentReader:()=>Rn,homeContentQuery:()=>$n,parseContentPage:()=>M,parseHomePage:()=>v,parseSiteHero:()=>hn,parseSiteSettings:()=>nn,portableTextToMarkdown:()=>Tn,siteHeroQuery:()=>Nn,siteSettingsQuery:()=>Ln,validateSiteHeroTaglines:()=>rn});module.exports=Un(vn);function S(n){if(!Array.isArray(n))return!1;for(let e=0;e<n.length;e+=1)if(!Object.hasOwn(n,e))return!1;return!0}var Yn=/^[A-Za-z][A-Za-z0-9_]{0,63}$/,Bn=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function Wn(n){if(!n||!Array.isArray(n.types)||n.types.length===0)throw new TypeError("CMS dependencies require document types");let e=[...n.types];for(let o of e)if(typeof o!="string"||!Yn.test(o))throw new TypeError("Invalid CMS document type");if(n.ids!==void 0&&!Array.isArray(n.ids))throw new TypeError("Invalid CMS document IDs");let t=n.ids===void 0?void 0:[...n.ids];for(let o of t??[])if(typeof o!="string"||!Bn.test(o)||/^(drafts|versions)\./.test(o))throw new TypeError("Invalid CMS document ID");if(new Set(e).size+new Set(t).size>128)throw new TypeError("Too many CMS tags");return Object.freeze({types:Object.freeze(e),...t===void 0?{}:{ids:Object.freeze(t)}})}function E(n){if(!n||typeof n.name!="string"||!/^[A-Za-z][A-Za-z0-9_.-]{0,127}$/.test(n.name)||typeof n.query!="string"||n.query.trim()===""||typeof n.resolve!="function")throw new TypeError("Invalid CMS query configuration");let e=n.params;if(!e||typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype&&Object.getPrototypeOf(e)!==null)throw new TypeError("CMS params must be plain JSON scalars");let t={};for(let o of Reflect.ownKeys(e)){let i=Object.getOwnPropertyDescriptor(e,o);if(typeof o!="string"||!i||!Object.hasOwn(i,"value")||!i.enumerable)throw new TypeError("CMS params must be plain JSON scalars");let r=i.value;if(!(r===null||typeof r=="string"||typeof r=="boolean"||typeof r=="number"&&Number.isFinite(r)))throw new TypeError("CMS params must be plain JSON scalars");Object.defineProperty(t,o,{value:r,enumerable:!0})}return Object.freeze({name:n.name,query:n.query,params:Object.freeze(t),dependencies:Wn(n.dependencies),resolve:n.resolve})}var A=["media-end","media-start","media-below"],L=["beside","stacked"],H=["staggered","aligned"],R={Split:"media-end",HeadingList:"beside",StaggerRow:"staggered"},mn={featureStoriesBlock:"feature_stories",surfaceCardBlock:"cta",accentBandBlock:"accent_band",locationsBlock:"locations",textMediaBlock:"text_media",faqBlock:"faq",galleryBlock:"gallery",contactBlock:"contact"},Y=2,B=4,_={layoutDefaulted:"section.layout.defaulted",unknownType:"section.type.unknown",imageMissingAlt:"section.image.missing-alt",imageMissingAsset:"section.image.missing-asset",emptySkipped:"section.empty.skipped"};var h=n=>n!==null&&typeof n=="object"&&!Array.isArray(n),I=n=>typeof n=="string"&&n.trim()!=="",N=n=>n===null||typeof n=="string",$=n=>n===null||typeof n=="string"&&F.test(n),Sn=n=>typeof n=="string"&&z.test(n),w=n=>I(n)||h(n)&&I(n.text)&&(n.copySource==="captured"||n.copySource==="proposed"),T=n=>n===null||w(n),wn=n=>h(n)&&w(n.label)&&Sn(n.href),P=n=>n===null||wn(n),Z=n=>n===null||typeof n=="string"&&D.test(n),W=(n,e)=>n.some(t=>t===e),an=n=>h(n)&&I(n.asset)&&I(n.alt)&&N(n.caption)&&(n.hotspot===null||h(n.hotspot)&&typeof n.hotspot.x=="number"&&typeof n.hotspot.y=="number");function bn(n){if(!h(n))return!1;switch(n.kind){case"campaign":return P(n.action)&&S(n.images)&&n.images.every(e=>typeof e=="string"&&$(e));case"locations":return(n.anchor===null||typeof n.anchor=="string"&&D.test(n.anchor))&&w(n.heading)&&T(n.tail)&&$(n.image);case"feature_stories":return w(n.heading)&&T(n.tail)&&S(n.items)&&n.items.length>0&&n.items.every(e=>h(e)&&w(e.heading)&&w(e.body)&&wn(e.action)&&$(e.image)&&Q.some(t=>t===e.shape)&&typeof e.card=="boolean");case"accent_band":return w(n.heading)&&w(n.body)&&P(n.action)&&$(n.image);case"cta":return I(n.heading)&&N(n.body)&&h(n.link)&&I(n.link.label)&&Sn(n.link.href);default:return!1}}function Fn(n){if(!h(n))return!1;switch(n.kind){case"campaign":return!1;case"text_media":return Z(n.anchor)&&W(A,n.layout)&&w(n.heading)&&T(n.tail)&&w(n.body)&&P(n.action)&&(n.image===null||an(n.image));case"faq":return Z(n.anchor)&&W(L,n.layout)&&w(n.heading)&&T(n.tail)&&T(n.intro)&&S(n.items)&&n.items.length>0&&n.items.every(e=>h(e)&&w(e.question)&&w(e.answer));case"gallery":return Z(n.anchor)&&W(H,n.layout)&&T(n.heading)&&S(n.images)&&n.images.length>0&&n.images.every(an);case"contact":return Z(n.anchor)&&W(A,n.layout)&&w(n.heading)&&T(n.body)&&typeof n.showEmail=="boolean"&&typeof n.showPhone=="boolean"&&P(n.action)&&(n.image===null||an(n.image));default:return bn(n)}}function zn(n,e){if(n===void 0)return e===void 0;if(!S(n)||!n.every(Fn)||!S(e)||!e.every(r=>h(r)&&W(Object.values(_),r.code)&&I(r.where)))return!1;let t=n,o=t.flatMap(r=>"anchor"in r&&r.anchor!==null?[r.anchor]:[]);return new Set(o).size!==o.length?!1:t.flatMap(r=>{switch(r.kind){case"text_media":case"contact":case"accent_band":return[r.action?.href];case"feature_stories":return r.items.map(a=>a.action.href);case"cta":return[r.link.href];default:return[]}}).every(r=>r===void 0||!r.startsWith("#")||o.includes(r.slice(1)))}function kn(n){if(!h(n)||!N(n.intro)||!$(n.photo)||!S(n.blocks))return!1;let e=n.hero;if(e!==null&&(!h(e)||!w(e.heading)||!T(e.subline)||!T(e.intro)||!$(e.image)||!$(e.inset)||!P(e.cta)||!P(e.secondaryCta))||!n.blocks.every(bn))return!1;let t=n,o=t.blocks.flatMap(r=>r.kind==="locations"&&r.anchor!==null?[r.anchor]:[]);return new Set(o).size!==o.length?!1:[t.hero?.cta?.href,t.hero?.secondaryCta?.href,...t.blocks.flatMap(r=>{switch(r.kind){case"campaign":case"accent_band":return[r.action?.href];case"feature_stories":return r.items.map(a=>a.action.href);case"cta":return[r.link.href];default:return[]}})].every(r=>r===void 0||!r.startsWith("#")||o.includes(r.slice(1)))}function In(n){return S(n)&&n.every(e=>h(e)&&I(e.where)&&typeof e.text=="string")}function _n(n){return n===null||h(n)&&kn(n.composition)&&typeof n.body=="string"&&In(n.proposedCopy)&&typeof n.campaign=="string"&&["shown","off","not-started","ended","none"].includes(n.campaign)}function ln(n){return n===null||h(n)&&I(n.slug)&&I(n.title)&&kn(n.composition)&&typeof n.body=="string"&&typeof n.migrated=="boolean"&&In(n.proposedCopy)&&zn(n.sections,n.warnings)}function Cn(n){return n===null||h(n)&&I(n.name)&&N(n.description)&&h(n.contact)&&N(n.contact.email)&&N(n.contact.phone)&&S(n.social)&&n.social.every(e=>h(e)&&I(e.network)&&typeof e.url=="string"&&/^https?:\/\//.test(e.url))}var X="malformed-content",b=class extends Error{code=X;documentId;problems;constructor(e,t){super(`${X}: ${e}: ${t.join("; ")}`),this.name="MalformedContentError",this.documentId=e,this.problems=t}},F=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,z=/^(?:\/(?![/\\])[^\s]*|#[a-z][a-z0-9]*(?:-[a-z0-9]+)*|mailto:[^\s@]+@[^\s@]+|tel:\+?[0-9][0-9 ()-]*|https?:\/\/[^\s/]+[^\s]*)$/,D=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/,Q=["wide","tall","round","free"],O="homePage",x="siteSettings",j=class{problems=[];proposed=[];fail(e,t){return this.problems.push(`${e} ${t}`),null}object(e,t){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:this.fail(t,"is not an object")}dense(e,t){return S(e)?!0:(this.fail(t,"contains missing entries"),!1)}optionalString(e,t){return e==null?null:typeof e=="string"?e.trim()===""?null:e:this.fail(t,"is not text")}copy(e,t){if(e==null)return null;let o=this.object(e,t);if(o===null)return null;let i=o.text,r=o.copySource;return i!==void 0&&typeof i!="string"?this.fail(`${t}.text`,"is not text"):r!==void 0&&r!=="captured"&&r!=="proposed"?this.fail(`${t}.copySource`,`is ${JSON.stringify(r)}, not captured or proposed`):typeof i!="string"||i.trim()===""?null:r==="proposed"?(this.proposed.push({where:t,text:i}),{text:i,copySource:"proposed"}):r==="captured"?{text:i,copySource:"captured"}:i}requiredCopy(e,t){let o=this.copy(e,t);return o===null&&!this.problems.some(i=>i.startsWith(t))&&this.fail(t,"is missing its words"),o}photo(e,t){return e==null?null:typeof e=="string"&&F.test(e)?e:this.fail(t,`is ${JSON.stringify(e)}, not a photo library slug`)}photos(e,t,o){return e==null?[]:Array.isArray(e)?this.dense(e,t)?(e.length>o&&this.fail(t,`holds ${String(e.length)} photos; at most ${String(o)}`),e.map((i,r)=>this.photo(i,`${t}[${String(r)}]`)).filter(i=>i!==null)):[]:(this.fail(t,"is not a list of photos"),[])}action(e,t){if(e==null)return null;let o=this.object(e,t);if(o===null)return null;let i=this.requiredCopy(o.label,`${t}.label`),r=o.href;return typeof r!="string"||!z.test(r)?this.fail(`${t}.href`,`is ${JSON.stringify(r)}, not a site path, #jump-link, mailto:, tel: or web address`):i===null?null:{label:i,href:r}}requiredAction(e,t){return e==null?this.fail(t,"is missing"):this.action(e,t)}};function K(n){return typeof n=="string"?n:n.text}function Tn(n){let e=new j,t=un(n,"body",e);if(e.problems.length>0)throw new b("body",e.problems);return t}function un(n,e,t){if(n==null)return"";if(!Array.isArray(n))return t.fail(e,"is not rich text"),"";if(!t.dense(n,e))return"";let o=[],i=!1;return n.forEach((r,a)=>{let s=`${e}[${String(a)}]`,c=t.object(r,s);if(c===null)return;if(c._type!=="block"){t.fail(s,`is a ${JSON.stringify(c._type)}; only text is supported in rich text so far`);return}let l=Jn(c,s,t),u=c.listItem,p=c.style??"normal",d;if(u==="bullet"||u==="number"){let f=typeof c.level=="number"&&c.level>1?c.level:1;d=`${" ".repeat(f-1)}${u==="bullet"?"-":"1."} ${l}`}else if(p==="h2")d=`## ${l}`;else if(p==="h3")d=`### ${l}`;else if(p==="blockquote")d=`> ${l}`;else if(p==="normal")d=l;else{t.fail(`${s}.style`,`is ${JSON.stringify(p)}, which the schema does not offer`);return}let y=u==="bullet"||u==="number";o.length>0&&o.push(y&&i?`
1
+ "use strict";var rn=Object.defineProperty;var qn=Object.getOwnPropertyDescriptor;var Mn=Object.getOwnPropertyNames;var Un=Object.prototype.hasOwnProperty;var Yn=(n,e)=>{for(var t in e)rn(n,t,{get:e[t],enumerable:!0})},Bn=(n,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Mn(e))!Un.call(n,i)&&i!==t&&rn(n,i,{get:()=>e[i],enumerable:!(o=qn(e,i))||o.enumerable});return n};var Wn=n=>Bn(rn({},"__esModule",{value:!0}),n);var oe={};Yn(oe,{CONTENT_PAGES_QUERY:()=>en,CONTENT_PAGE_BY_SLUG_QUERY:()=>tn,HEADING_LIST_LAYOUTS:()=>L,HOME_PAGE_DOCUMENT_QUERY:()=>M,MALFORMED_CONTENT:()=>X,MalformedContentError:()=>I,READER_ACTION_HREF:()=>z,READER_GALLERY_PHOTO_LIMIT:()=>B,READER_GALLERY_PHOTO_MIN:()=>Y,READER_HOME_PAGE_ID:()=>O,READER_JUMP_LINK:()=>D,READER_PHOTO_SLUG:()=>F,READER_SECTION_KINDS:()=>wn,READER_SITE_SETTINGS_ID:()=>x,READER_STORY_LAYOUTS:()=>Q,SECTION_LAYOUT_DEFAULTS:()=>R,SECTION_WARNINGS:()=>b,SITE_HERO_LAYOUTS:()=>dn,SITE_HERO_LAYOUT_WARNING:()=>fn,SITE_HERO_TAGLINES_DEFAULTED_WARNING:()=>hn,SITE_HERO_TAGLINE_DROPPED_WARNING:()=>gn,SITE_HERO_TAGLINE_MAX_LENGTH:()=>yn,SPLIT_LAYOUTS:()=>A,STAGGER_ROW_LAYOUTS:()=>H,campaignState:()=>un,contentPageQuery:()=>Ln,contentPagesQuery:()=>Hn,createSiteContentReader:()=>On,homeContentQuery:()=>xn,parseContentPage:()=>q,parseHomePage:()=>v,parseSiteHero:()=>Sn,parseSiteSettings:()=>nn,portableTextToMarkdown:()=>En,siteHeroQuery:()=>jn,siteSettingsQuery:()=>Nn,validateSiteHeroTaglines:()=>mn});module.exports=Wn(oe);function S(n){if(!Array.isArray(n))return!1;for(let e=0;e<n.length;e+=1)if(!Object.hasOwn(n,e))return!1;return!0}var Fn=/^[A-Za-z][A-Za-z0-9_]{0,63}$/,zn=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/;function Qn(n){if(!n||!Array.isArray(n.types)||n.types.length===0)throw new TypeError("CMS dependencies require document types");let e=[...n.types];for(let o of e)if(typeof o!="string"||!Fn.test(o))throw new TypeError("Invalid CMS document type");if(n.ids!==void 0&&!Array.isArray(n.ids))throw new TypeError("Invalid CMS document IDs");let t=n.ids===void 0?void 0:[...n.ids];for(let o of t??[])if(typeof o!="string"||!zn.test(o)||/^(drafts|versions)\./.test(o))throw new TypeError("Invalid CMS document ID");if(new Set(e).size+new Set(t).size>128)throw new TypeError("Too many CMS tags");return Object.freeze({types:Object.freeze(e),...t===void 0?{}:{ids:Object.freeze(t)}})}function E(n){if(!n||typeof n.name!="string"||!/^[A-Za-z][A-Za-z0-9_.-]{0,127}$/.test(n.name)||typeof n.query!="string"||n.query.trim()===""||typeof n.resolve!="function")throw new TypeError("Invalid CMS query configuration");let e=n.params;if(!e||typeof e!="object"||Object.getPrototypeOf(e)!==Object.prototype&&Object.getPrototypeOf(e)!==null)throw new TypeError("CMS params must be plain JSON scalars");let t={};for(let o of Reflect.ownKeys(e)){let i=Object.getOwnPropertyDescriptor(e,o);if(typeof o!="string"||!i||!Object.hasOwn(i,"value")||!i.enumerable)throw new TypeError("CMS params must be plain JSON scalars");let r=i.value;if(!(r===null||typeof r=="string"||typeof r=="boolean"||typeof r=="number"&&Number.isFinite(r)))throw new TypeError("CMS params must be plain JSON scalars");Object.defineProperty(t,o,{value:r,enumerable:!0})}return Object.freeze({name:n.name,query:n.query,params:Object.freeze(t),dependencies:Qn(n.dependencies),resolve:n.resolve})}var A=["media-end","media-start","media-below"],L=["beside","stacked"],H=["staggered","aligned"],R={Split:"media-end",HeadingList:"beside",StaggerRow:"staggered"},wn={featureStoriesBlock:"feature_stories",surfaceCardBlock:"cta",accentBandBlock:"accent_band",locationsBlock:"locations",textMediaBlock:"text_media",faqBlock:"faq",galleryBlock:"gallery",contactBlock:"contact"},Y=2,B=4,b={layoutDefaulted:"section.layout.defaulted",unknownType:"section.type.unknown",imageMissingAlt:"section.image.missing-alt",imageMissingAsset:"section.image.missing-asset",emptySkipped:"section.empty.skipped"};var h=n=>n!==null&&typeof n=="object"&&!Array.isArray(n),_=n=>typeof n=="string"&&n.trim()!=="",N=n=>n===null||typeof n=="string",$=n=>n===null||typeof n=="string"&&F.test(n),In=n=>typeof n=="string"&&z.test(n),w=n=>_(n)||h(n)&&_(n.text)&&(n.copySource==="captured"||n.copySource==="proposed"),C=n=>n===null||w(n),kn=n=>h(n)&&w(n.label)&&In(n.href),P=n=>n===null||kn(n),Z=n=>n===null||typeof n=="string"&&D.test(n),W=(n,e)=>n.some(t=>t===e),sn=n=>h(n)&&_(n.asset)&&_(n.alt)&&N(n.caption)&&(n.hotspot===null||h(n.hotspot)&&typeof n.hotspot.x=="number"&&typeof n.hotspot.y=="number");function _n(n){if(!h(n))return!1;switch(n.kind){case"campaign":return P(n.action)&&S(n.images)&&n.images.every(e=>typeof e=="string"&&$(e));case"locations":return(n.anchor===null||typeof n.anchor=="string"&&D.test(n.anchor))&&w(n.heading)&&C(n.tail)&&$(n.image);case"feature_stories":return w(n.heading)&&C(n.tail)&&S(n.items)&&n.items.length>0&&n.items.every(e=>h(e)&&w(e.heading)&&w(e.body)&&kn(e.action)&&$(e.image)&&Q.some(t=>t===e.shape)&&typeof e.card=="boolean");case"accent_band":return w(n.heading)&&w(n.body)&&P(n.action)&&$(n.image);case"cta":return _(n.heading)&&N(n.body)&&h(n.link)&&_(n.link.label)&&In(n.link.href);default:return!1}}function Jn(n){if(!h(n))return!1;switch(n.kind){case"campaign":return!1;case"text_media":return Z(n.anchor)&&W(A,n.layout)&&w(n.heading)&&C(n.tail)&&w(n.body)&&P(n.action)&&(n.image===null||sn(n.image));case"faq":return Z(n.anchor)&&W(L,n.layout)&&w(n.heading)&&C(n.tail)&&C(n.intro)&&S(n.items)&&n.items.length>0&&n.items.every(e=>h(e)&&w(e.question)&&w(e.answer));case"gallery":return Z(n.anchor)&&W(H,n.layout)&&C(n.heading)&&S(n.images)&&n.images.length>0&&n.images.every(sn);case"contact":return Z(n.anchor)&&W(A,n.layout)&&w(n.heading)&&C(n.body)&&typeof n.showEmail=="boolean"&&typeof n.showPhone=="boolean"&&P(n.action)&&(n.image===null||sn(n.image));default:return _n(n)}}function Kn(n,e){if(n===void 0)return e===void 0;if(!S(n)||!n.every(Jn)||!S(e)||!e.every(r=>h(r)&&W(Object.values(b),r.code)&&_(r.where)))return!1;let t=n,o=t.flatMap(r=>"anchor"in r&&r.anchor!==null?[r.anchor]:[]);return new Set(o).size!==o.length?!1:t.flatMap(r=>{switch(r.kind){case"text_media":case"contact":case"accent_band":return[r.action?.href];case"feature_stories":return r.items.map(a=>a.action.href);case"cta":return[r.link.href];default:return[]}}).every(r=>r===void 0||!r.startsWith("#")||o.includes(r.slice(1)))}function bn(n){if(!h(n)||!N(n.intro)||!$(n.photo)||!S(n.blocks))return!1;let e=n.hero;if(e!==null&&(!h(e)||!w(e.heading)||!C(e.subline)||!C(e.intro)||!$(e.image)||!$(e.inset)||!P(e.cta)||!P(e.secondaryCta))||!n.blocks.every(_n))return!1;let t=n,o=t.blocks.flatMap(r=>r.kind==="locations"&&r.anchor!==null?[r.anchor]:[]);return new Set(o).size!==o.length?!1:[t.hero?.cta?.href,t.hero?.secondaryCta?.href,...t.blocks.flatMap(r=>{switch(r.kind){case"campaign":case"accent_band":return[r.action?.href];case"feature_stories":return r.items.map(a=>a.action.href);case"cta":return[r.link.href];default:return[]}})].every(r=>r===void 0||!r.startsWith("#")||o.includes(r.slice(1)))}function Tn(n){return S(n)&&n.every(e=>h(e)&&_(e.where)&&typeof e.text=="string")}function Cn(n){return n===null||h(n)&&bn(n.composition)&&typeof n.body=="string"&&Tn(n.proposedCopy)&&typeof n.campaign=="string"&&["shown","off","not-started","ended","none"].includes(n.campaign)}function an(n){return n===null||h(n)&&_(n.slug)&&_(n.title)&&bn(n.composition)&&typeof n.body=="string"&&typeof n.migrated=="boolean"&&Tn(n.proposedCopy)&&Kn(n.sections,n.warnings)}function An(n){return n===null||h(n)&&_(n.name)&&N(n.description)&&h(n.contact)&&N(n.contact.email)&&N(n.contact.phone)&&S(n.social)&&n.social.every(e=>h(e)&&_(e.network)&&typeof e.url=="string"&&/^https?:\/\//.test(e.url))}var X="malformed-content",I=class extends Error{code=X;documentId;problems;constructor(e,t){super(`${X}: ${e}: ${t.join("; ")}`),this.name="MalformedContentError",this.documentId=e,this.problems=t}},F=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,z=/^(?:\/(?![/\\])[^\s]*|#[a-z][a-z0-9]*(?:-[a-z0-9]+)*|mailto:[^\s@]+@[^\s@]+|tel:\+?[0-9][0-9 ()-]*|https?:\/\/[^\s/]+[^\s]*)$/,D=/^[a-z][a-z0-9]*(?:-[a-z0-9]+)*$/,Q=["wide","tall","round","free"],O="homePage",x="siteSettings",j=class{problems=[];proposed=[];fail(e,t){return this.problems.push(`${e} ${t}`),null}object(e,t){return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:this.fail(t,"is not an object")}dense(e,t){return S(e)?!0:(this.fail(t,"contains missing entries"),!1)}optionalString(e,t){return e==null?null:typeof e=="string"?e.trim()===""?null:e:this.fail(t,"is not text")}copy(e,t){if(e==null)return null;let o=this.object(e,t);if(o===null)return null;let i=o.text,r=o.copySource;return i!==void 0&&typeof i!="string"?this.fail(`${t}.text`,"is not text"):r!==void 0&&r!=="captured"&&r!=="proposed"?this.fail(`${t}.copySource`,`is ${JSON.stringify(r)}, not captured or proposed`):typeof i!="string"||i.trim()===""?null:r==="proposed"?(this.proposed.push({where:t,text:i}),{text:i,copySource:"proposed"}):r==="captured"?{text:i,copySource:"captured"}:i}requiredCopy(e,t){let o=this.copy(e,t);return o===null&&!this.problems.some(i=>i.startsWith(t))&&this.fail(t,"is missing its words"),o}photo(e,t){return e==null?null:typeof e=="string"&&F.test(e)?e:this.fail(t,`is ${JSON.stringify(e)}, not a photo library slug`)}photos(e,t,o){return e==null?[]:Array.isArray(e)?this.dense(e,t)?(e.length>o&&this.fail(t,`holds ${String(e.length)} photos; at most ${String(o)}`),e.map((i,r)=>this.photo(i,`${t}[${String(r)}]`)).filter(i=>i!==null)):[]:(this.fail(t,"is not a list of photos"),[])}action(e,t){if(e==null)return null;let o=this.object(e,t);if(o===null)return null;let i=this.requiredCopy(o.label,`${t}.label`),r=o.href;return typeof r!="string"||!z.test(r)?this.fail(`${t}.href`,`is ${JSON.stringify(r)}, not a site path, #jump-link, mailto:, tel: or web address`):i===null?null:{label:i,href:r}}requiredAction(e,t){return e==null?this.fail(t,"is missing"):this.action(e,t)}};function K(n){return typeof n=="string"?n:n.text}function En(n){let e=new j,t=cn(n,"body",e);if(e.problems.length>0)throw new I("body",e.problems);return t}function cn(n,e,t){if(n==null)return"";if(!Array.isArray(n))return t.fail(e,"is not rich text"),"";if(!t.dense(n,e))return"";let o=[],i=!1;return n.forEach((r,a)=>{let s=`${e}[${String(a)}]`,u=t.object(r,s);if(u===null)return;if(u._type!=="block"){t.fail(s,`is a ${JSON.stringify(u._type)}; only text is supported in rich text so far`);return}let l=Vn(u,s,t),c=u.listItem,d=u.style??"normal",p;if(c==="bullet"||c==="number"){let f=typeof u.level=="number"&&u.level>1?u.level:1;p=`${" ".repeat(f-1)}${c==="bullet"?"-":"1."} ${l}`}else if(d==="h2")p=`## ${l}`;else if(d==="h3")p=`### ${l}`;else if(d==="blockquote")p=`> ${l}`;else if(d==="normal")p=l;else{t.fail(`${s}.style`,`is ${JSON.stringify(d)}, which the schema does not offer`);return}let y=c==="bullet"||c==="number";o.length>0&&o.push(y&&i?`
2
2
  `:`
3
3
 
4
- `),o.push(d),i=y}),o.join("")}var Qn={strong:"**",em:"*",code:"`"};function Jn(n,e,t){let o=new Map,i=Array.isArray(n.markDefs)?n.markDefs:[];if(!t.dense(i,`${e}.markDefs`))return"";for(let a of i){let s=a;s._type==="link"&&typeof s._key=="string"&&typeof s.href=="string"&&o.set(s._key,s.href)}let r=Array.isArray(n.children)?n.children:[];return t.dense(r,`${e}.children`)?r.map((a,s)=>{let c=a;if(c._type!=="span"||typeof c.text!="string")return t.fail(`${e}.children[${String(s)}]`,"is not a text span"),"";let l=c.text,u=Array.isArray(c.marks)?c.marks:[];if(!t.dense(u,`${e}.children[${String(s)}].marks`))return"";let p=null;for(let d of u){if(typeof d!="string")continue;let y=Qn[d];y!==void 0?l=`${y}${l}${y}`:o.has(d)?p=o.get(d)??null:t.fail(`${e}.children[${String(s)}].marks`,`names ${JSON.stringify(d)}, which is neither a style nor a link`)}return p===null?l:`[${l}](${p})`}).join(""):""}function pn(n,e){if(typeof n!="object"||n===null)return"none";let t=n;if(t.enabled!==!0)return"off";let o=typeof t.startsAt=="string"?Date.parse(t.startsAt):null,i=typeof t.endsAt=="string"?Date.parse(t.endsAt):null;return o!==null&&e.getTime()<o?"not-started":i!==null&&e.getTime()>=i?"ended":"shown"}function q(n,e,t){return typeof e._key=="string"?`${n}[_key=="${e._key}"]`:`${n}[${String(t)}]`}function v(n,e){let t=new j,o=t.object(n,"homePage");if(o===null)throw new b(O,t.problems);let i=typeof o._id=="string"?o._id:O;o._type!=="homePage"&&t.fail("_type",`is ${JSON.stringify(o._type)}, not homePage`);let r=null,a=o.hero===void 0?t.fail("hero","is missing"):t.object(o.hero,"hero");if(a!==null){let f=t.photos(a.photos,"hero.photos",2),g=t.requiredCopy(a.headline,"hero.headline"),m=t.copy(a.subline,"hero.subline"),C=t.copy(a.lead,"hero.lead"),k=t.action(a.primaryAction,"hero.primaryAction"),Pn=t.action(a.secondaryAction,"hero.secondaryAction");g!==null&&(r={heading:g,subline:m,intro:C,image:f[0]??null,inset:f[1]??null,cta:k,secondaryCta:Pn})}let s=[],c=[],l="",u=pn(o.campaign,e.now);if(u==="shown"){let f=t.object(o.campaign,"campaign");if(f!==null){let g=t.requiredCopy(f.title,"campaign.title"),m=t.photos(f.photos,"campaign.photos",3);m.length===0&&t.fail("campaign.photos","is empty; a shown campaign needs at least one photo");let C=un(f.body,"campaign.body",t);C===""&&t.fail("campaign.body","is empty; a shown campaign needs its text"),f.bodyCopySource==="proposed"&&t.proposed.push({where:"campaign.body",text:C});let k=t.action(f.action,"campaign.action");k!==null&&c.push({where:"campaign.action.href",href:k.href}),g!==null&&(l=`# ${K(g)}
4
+ `),o.push(p),i=y}),o.join("")}var Zn={strong:"**",em:"*",code:"`"};function Vn(n,e,t){let o=new Map,i=Array.isArray(n.markDefs)?n.markDefs:[];if(!t.dense(i,`${e}.markDefs`))return"";for(let a of i){let s=a;s._type==="link"&&typeof s._key=="string"&&typeof s.href=="string"&&o.set(s._key,s.href)}let r=Array.isArray(n.children)?n.children:[];return t.dense(r,`${e}.children`)?r.map((a,s)=>{let u=a;if(u._type!=="span"||typeof u.text!="string")return t.fail(`${e}.children[${String(s)}]`,"is not a text span"),"";let l=u.text,c=Array.isArray(u.marks)?u.marks:[];if(!t.dense(c,`${e}.children[${String(s)}].marks`))return"";let d=null;for(let p of c){if(typeof p!="string")continue;let y=Zn[p];y!==void 0?l=`${y}${l}${y}`:o.has(p)?d=o.get(p)??null:t.fail(`${e}.children[${String(s)}].marks`,`names ${JSON.stringify(p)}, which is neither a style nor a link`)}return d===null?l:`[${l}](${d})`}).join(""):""}function un(n,e){if(typeof n!="object"||n===null)return"none";let t=n;if(t.enabled!==!0)return"off";let o=typeof t.startsAt=="string"?Date.parse(t.startsAt):null,i=typeof t.endsAt=="string"?Date.parse(t.endsAt):null;return o!==null&&e.getTime()<o?"not-started":i!==null&&e.getTime()>=i?"ended":"shown"}function G(n,e,t){return typeof e._key=="string"?`${n}[_key=="${e._key}"]`:`${n}[${String(t)}]`}function v(n,e){let t=new j,o=t.object(n,"homePage");if(o===null)throw new I(O,t.problems);let i=typeof o._id=="string"?o._id:O;o._type!=="homePage"&&t.fail("_type",`is ${JSON.stringify(o._type)}, not homePage`);let r=null,a=o.hero===void 0?t.fail("hero","is missing"):t.object(o.hero,"hero");if(a!==null){let f=t.photos(a.photos,"hero.photos",2),g=t.requiredCopy(a.headline,"hero.headline"),m=t.copy(a.subline,"hero.subline"),T=t.copy(a.lead,"hero.lead"),k=t.action(a.primaryAction,"hero.primaryAction"),Gn=t.action(a.secondaryAction,"hero.secondaryAction");g!==null&&(r={heading:g,subline:m,intro:T,image:f[0]??null,inset:f[1]??null,cta:k,secondaryCta:Gn})}let s=[],u=[],l="",c=un(o.campaign,e.now);if(c==="shown"){let f=t.object(o.campaign,"campaign");if(f!==null){let g=t.requiredCopy(f.title,"campaign.title"),m=t.photos(f.photos,"campaign.photos",3);m.length===0&&t.fail("campaign.photos","is empty; a shown campaign needs at least one photo");let T=cn(f.body,"campaign.body",t);T===""&&t.fail("campaign.body","is empty; a shown campaign needs its text"),f.bodyCopySource==="proposed"&&t.proposed.push({where:"campaign.body",text:T});let k=t.action(f.action,"campaign.action");k!==null&&u.push({where:"campaign.action.href",href:k.href}),g!==null&&(l=`# ${K(g)}
5
5
 
6
- ${C}`),s.push({kind:"campaign",action:k,images:m})}}let p=[],d=o.blocks??[];Array.isArray(d)?t.dense(d,"blocks")&&d.forEach((f,g)=>{let m=t.object(f,`blocks[${String(g)}]`);if(m===null)return;let C=q("blocks",m,g),k=En(m,C,t);k!==null&&(c.push(...An(k,m,C)),k.kind==="locations"&&k.anchor!==null&&(p.includes(k.anchor)&&t.fail(`${C}.jumpLink`,`repeats "${k.anchor}", already used by another section`),p.push(k.anchor)),s.push(k))}):t.fail("blocks","is not a list");let y=[];r?.cta&&y.push({where:"hero.primaryAction.href",href:r.cta.href}),r?.secondaryCta&&y.push({where:"hero.secondaryAction.href",href:r.secondaryCta.href}),y.push(...c);for(let{where:f,href:g}of y)g.startsWith("#")&&!p.includes(g.slice(1))&&t.fail(f,`jumps to ${g}, which no section on the page is named`);if(t.problems.length>0)throw new b(i,t.problems);return{composition:{intro:null,photo:null,hero:r,blocks:s},body:l,campaign:u,proposedCopy:t.proposed}}function An(n,e,t){switch(n.kind){case"feature_stories":{let o=Array.isArray(e.stories)?e.stories:[];return n.items.map((i,r)=>({where:`${q(`${t}.stories`,o[r]??{},r)}.action.href`,href:i.action.href}))}case"accent_band":return n.action===null?[]:[{where:`${t}.action.href`,href:n.action.href}];case"cta":return[{where:`${t}.action.href`,href:n.link.href}];default:return[]}}function J(n,e,t){let o=n.jumpLink;return o==null||o===""?null:typeof o!="string"||!D.test(o)?t.fail(`${e}.jumpLink`,`is ${JSON.stringify(o)}, not lowercase words joined by hyphens`):o}function En(n,e,t){switch(n._type){case"featureStoriesBlock":{let o=t.requiredCopy(n.heading,`${e}.heading`),i=t.copy(n.tail,`${e}.tail`),r=n.stories;if(!Array.isArray(r)||r.length===0)return t.fail(`${e}.stories`,"has no stories");if(!t.dense(r,`${e}.stories`))return null;let a=[];return r.forEach((s,c)=>{let l=t.object(s,`${e}.stories[${String(c)}]`);if(l===null)return;let u=q(`${e}.stories`,l,c),p=t.requiredCopy(l.heading,`${u}.heading`),d=t.requiredCopy(l.body,`${u}.body`),y=t.requiredAction(l.action,`${u}.action`),f=t.photo(l.photo,`${u}.photo`),g=l.layout??"wide";if(!Q.includes(g)){t.fail(`${u}.layout`,`is ${JSON.stringify(g)}, not wide, tall, round or free`);return}let m=l.onCard??!1;if(typeof m!="boolean"){t.fail(`${u}.onCard`,"is not on or off");return}p===null||d===null||y===null||a.push({heading:p,body:d,action:y,image:f,shape:g,card:m})}),o===null?null:{kind:"feature_stories",heading:o,tail:i,items:a}}case"surfaceCardBlock":{let o=t.requiredCopy(n.heading,`${e}.heading`),i=t.copy(n.body,`${e}.body`),r=t.requiredAction(n.action,`${e}.action`);return o===null||r===null?null:{kind:"cta",heading:K(o),body:i===null?null:K(i),link:{label:K(r.label),href:r.href}}}case"accentBandBlock":{let o=t.requiredCopy(n.heading,`${e}.heading`),i=t.requiredCopy(n.body,`${e}.body`),r=t.action(n.action,`${e}.action`),a=t.photo(n.photo,`${e}.photo`);return o===null||i===null?null:{kind:"accent_band",heading:o,body:i,action:r,image:a}}case"locationsBlock":{let o=J(n,e,t),i=t.requiredCopy(n.heading,`${e}.heading`),r=t.copy(n.tail,`${e}.tail`),a=t.photo(n.photo,`${e}.photo`);return i===null?null:{kind:"locations",anchor:o,heading:i,tail:r,image:a}}default:return t.fail(`${e}._type`,`is ${JSON.stringify(n._type)}, not a section type this reader knows`)}}function V(n,e,t,o,i){let r=n.layout,a=t.find(s=>s===r);return a!==void 0?a:(i.push({code:_.layoutDefaulted,where:`${e}.layout`}),o)}function cn(n,e,t,o){if(n==null)return null;let i=t.object(n,e);if(i===null)return null;let r=i.asset,a=typeof r=="object"&&r!==null?r._ref:void 0;if(typeof a!="string"||a==="")return o.push({code:_.imageMissingAsset,where:`${e}.asset`}),null;let s=i.alt;if(typeof s!="string"||s.trim()==="")return o.push({code:_.imageMissingAlt,where:`${e}.alt`}),null;let c=t.optionalString(i.caption,`${e}.caption`),l=null;if(i.hotspot!==void 0&&i.hotspot!==null){let u=t.object(i.hotspot,`${e}.hotspot`),p=u?.x,d=u?.y;typeof p=="number"&&typeof d=="number"&&p>=0&&p<=1&&d>=0&&d<=1?l={x:p,y:d}:u!==null&&t.fail(`${e}.hotspot`,"is not a point inside the image")}return{asset:a,alt:s,caption:c,hotspot:l}}function Kn(n,e,t,o){switch(n._type){case"featureStoriesBlock":case"surfaceCardBlock":case"accentBandBlock":case"locationsBlock":{let i=En(n,e,t);return i===null||i.kind==="campaign"?null:i}case"textMediaBlock":{let i=J(n,e,t),r=t.requiredCopy(n.heading,`${e}.heading`),a=t.copy(n.tail,`${e}.tail`),s=t.requiredCopy(n.body,`${e}.body`),c=t.action(n.action,`${e}.action`),l=cn(n.photo,`${e}.photo`,t,o),u=V(n,e,A,R.Split,o);return r===null||s===null?null:{kind:"text_media",anchor:i,layout:u,heading:r,tail:a,body:s,action:c,image:l}}case"faqBlock":{let i=J(n,e,t),r=t.requiredCopy(n.heading,`${e}.heading`),a=t.copy(n.tail,`${e}.tail`),s=t.copy(n.intro,`${e}.intro`),c=V(n,e,L,R.HeadingList,o),l=n.items;if(!Array.isArray(l)||l.length===0)return t.fail(`${e}.items`,"has no questions");if(!t.dense(l,`${e}.items`))return null;let u=[];return l.forEach((p,d)=>{let y=t.object(p,`${e}.items[${String(d)}]`);if(y===null)return;let f=q(`${e}.items`,y,d);if(y._type!==void 0&&y._type!=="faqItem"){t.fail(`${f}._type`,`is ${JSON.stringify(y._type)}, not faqItem`);return}let g=t.requiredCopy(y.question,`${f}.question`),m=t.requiredCopy(y.answer,`${f}.answer`);g!==null&&m!==null&&u.push({question:g,answer:m})}),r===null?null:{kind:"faq",anchor:i,layout:c,heading:r,tail:a,intro:s,items:u}}case"galleryBlock":{let i=J(n,e,t),r=t.copy(n.heading,`${e}.heading`),a=V(n,e,H,R.StaggerRow,o),s=n.photos??[];if(!Array.isArray(s))return t.fail(`${e}.photos`,"is not a list of photos");if(!t.dense(s,`${e}.photos`))return null;if(s.length<Y||s.length>B)return t.fail(`${e}.photos`,`holds ${String(s.length)} photos; a gallery shows ${String(Y)} to ${String(B)}`);let c=s.flatMap((l,u)=>{let p=cn(l,q(`${e}.photos`,typeof l=="object"&&l!==null?l:{},u),t,o);return p===null?[]:[p]});return c.length===0?(o.push({code:_.emptySkipped,where:e}),null):{kind:"gallery",anchor:i,layout:a,heading:r,images:c}}case"contactBlock":{let i=J(n,e,t),r=t.requiredCopy(n.heading,`${e}.heading`),a=t.copy(n.body,`${e}.body`),s=y=>{let f=n[y]??!0;return typeof f=="boolean"?f:(t.fail(`${e}.${y}`,"is not on or off"),!1)},c=s("showEmail"),l=s("showPhone"),u=t.action(n.action,`${e}.action`),p=cn(n.photo,`${e}.photo`,t,o),d=V(n,e,A,R.Split,o);return r===null?null:!c&&!l&&a===null&&u===null?(o.push({code:_.emptySkipped,where:e}),null):{kind:"contact",anchor:i,layout:d,heading:r,body:a,showEmail:c,showPhone:l,action:u,image:p}}default:return o.push({code:_.unknownType,where:`${e}._type`}),null}}function Zn(n,e,t){switch(n.kind){case"text_media":case"contact":return n.action===null?[]:[{where:`${t}.action.href`,href:n.action.href}];case"faq":case"gallery":return[];default:return An(n,e,t)}}function Vn(n,e){let t=[],o=[];if(!Array.isArray(n))return e.fail("sections","is not a list"),{sections:t,warnings:o};if(!e.dense(n,"sections"))return{sections:t,warnings:o};let i=[],r=[];n.forEach((a,s)=>{let c=e.object(a,`sections[${String(s)}]`);if(c===null)return;let l=q("sections",c,s),u=Kn(c,l,e,o);if(u===null)return;r.push(...Zn(u,c,l));let p="anchor"in u?u.anchor:null;p!==null&&(i.includes(p)&&e.fail(`${l}.jumpLink`,`repeats "${p}", already used by another section`),i.push(p)),t.push(u)});for(let{where:a,href:s}of r)s.startsWith("#")&&!i.includes(s.slice(1))&&e.fail(a,`jumps to ${s}, which no section on the page is named`);return{sections:t,warnings:o}}function M(n){let e=new j,t=e.object(n,"page");if(t===null)throw new b("page",e.problems);let o=typeof t._id=="string"?t._id:"page";t._type!=="page"&&e.fail("_type",`is ${JSON.stringify(t._type)}, not page`);let i=e.optionalString(t.title,"title");i===null&&e.fail("title","is missing"),t.titleCopySource==="proposed"&&i!==null&&e.proposed.push({where:"title",text:i});let r=t.slug,a=typeof r?.current=="string"&&r.current!==""?r.current:null;a===null&&e.fail("slug.current","is missing");let s=e.copy(t.lead,"lead"),c=e.photo(t.photo,"photo"),l=un(t.body,"body",e);t.bodyCopySource==="proposed"&&e.proposed.push({where:"body",text:l});let u=t.sections===void 0||t.sections===null?null:Vn(t.sections,e);if(e.problems.length>0||i===null||a===null)throw new b(o,e.problems);return{slug:a,title:i,composition:{intro:s===null?null:K(s),photo:c,hero:null,blocks:[]},body:l,migrated:t.migrated===!0,proposedCopy:e.proposed,...u===null?{}:u}}function nn(n){let e=new j,t=e.object(n,"siteSettings");if(t===null)throw new b(x,e.problems);let o=e.optionalString(t.title,"title");o===null&&e.fail("title","is missing; a site needs its name");let i=e.optionalString(t.description,"description"),r=t.contact===void 0?{}:e.object(t.contact,"contact")??{},a=e.optionalString(r.email,"contact.email"),s=e.optionalString(r.phone,"contact.phone"),c=[],l=t.social??[];if(Array.isArray(l)?e.dense(l,"social")&&l.forEach((u,p)=>{let d=e.object(u,`social[${String(p)}]`);if(d===null)return;let y=e.optionalString(d.network,`social[${String(p)}].network`),f=e.optionalString(d.url,`social[${String(p)}].url`);if(y===null||f===null||!/^https?:\/\//.test(f)){e.fail(`social[${String(p)}]`,"needs a network and a web address");return}c.push({network:y,url:f})}):e.fail("social","is not a list"),e.problems.length>0||o===null)throw new b(x,e.problems);return{name:o,description:i,contact:{email:a,phone:s},social:c}}var G="*[_id == $id][0]",en='*[_type == "page" && defined(slug.current)]|order(slug.current asc)',tn='*[_type == "page" && slug.current == $slug][0]';function Rn(n){return{home:async({now:e})=>{let t=await n.query(G,{params:{id:O}});return t==null?null:v(t,{now:e})},pages:async()=>{let e=await n.query(en);if(!Array.isArray(e))throw new b("page",["the page query did not return a list"]);if(!S(e))throw new b("page",["the page query contains missing entries"]);return e.map(t=>M(t))},pageBySlug:async e=>{let t=await n.query(tn,{params:{slug:e}});return t==null?null:M(t)},siteSettings:async()=>{let e=await n.query(G,{params:{id:x}});return e==null?null:nn(e)}}}function on(n,e,t,o){if(!o(e))throw new TypeError("Invalid CMS content fallback");return n==null?{data:e,fallbackFields:["$"]}:{data:t(n),fallbackFields:[]}}function $n(n){if(!(n instanceof Date)||!Number.isFinite(n.getTime()))throw new TypeError("Invalid CMS campaign date");let e=n.getTime();return E({name:"homePage.v1",query:G,params:{id:O},dependencies:{types:["homePage"],ids:[O]},resolve:(t,o)=>on(t,o,i=>v(i,{now:new Date(e)}),_n)})}function On(n){if(typeof n!="string"||n==="")throw new TypeError("Invalid CMS page slug");return E({name:"page.v1",query:tn,params:{slug:n},dependencies:{types:["page"]},resolve:(e,t)=>on(e,t,M,ln)})}function xn(){return E({name:"pages.v1",query:en,params:{},dependencies:{types:["page"]},resolve:(n,e)=>on(n,e,t=>{if(!Array.isArray(t))throw new b("page",["the page query did not return a list"]);if(!S(t))throw new b("page",["the page query contains missing entries"]);return t.map(o=>M(o))},t=>S(t)&&t.every(o=>o!==null&&ln(o)))})}function Ln(){return E({name:"siteSettings.v1",query:G,params:{id:x},dependencies:{types:["siteSettings"],ids:[x]},resolve:(n,e)=>on(n,e,nn,Cn)})}var yn=["columns","rows"],fn=36,gn="siteHero.layout.defaulted";var U={key:"hero",documentId:"siteHero",documentType:"siteHero",fields:[{name:"heading",label:"Heading",noun:{article:"a",word:"heading"},kind:"single-line",required:!0,minLength:1,maxLength:80,noTrailingFullStop:!0},{name:"intro",label:"Introduction",noun:{article:"an",word:"introduction"},kind:"multi-line",required:!0,minLength:1,maxLength:320}],copy:{currentTitle:"On your site now",editTitle:"Edit and publish",empty:"Your site has no hero text yet. Whatever you publish below becomes its first version."}};function Xn(n,e){let{article:t,word:o}=n.noun;if(e.length===0)return n.required?`Enter ${t} ${o}.`:null;let i=[...e].length;return i<n.minLength?`Make the ${o} at least ${String(n.minLength)} characters. It is ${String(i)} now.`:i>n.maxLength?`Keep the ${o} to ${String(n.maxLength)} characters or fewer. It is ${String(i)} now.`:e.includes("\u2014")?`The ${o} contains a long dash. Use a comma, a colon or a short dash instead.`:n.kind==="single-line"&&/[\r\n]/.test(e)?`The ${o} must be a single line.`:n.noTrailingFullStop===!0&&e.endsWith(".")?`${o.charAt(0).toUpperCase()}${o.slice(1)}s on your site do not end with a full stop. Remove the last full stop.`:null}function dn(n,e){let t={},o={};for(let i of n.fields){let r=Object.hasOwn(e,i.name)?e[i.name]:void 0,a=typeof r=="string"?r.trim():"",s=Xn(i,a);Object.defineProperty(s===null?t:o,i.name,{value:s??a,enumerable:!0})}return Object.keys(o).length>0?{ok:!1,errors:o}:{ok:!0,value:t}}function rn(n){if(!Array.isArray(n))return{ok:!1,error:"Enter a list of taglines."};let e=U.fields[0];if(!e)throw new TypeError("Missing siteHero heading definition");let t={...e,name:"text",noun:{article:"a",word:"tagline"},maxLength:fn},o=[],i=new Set;for(let r of n){if(!r||typeof r!="object"||Array.isArray(r))return{ok:!1,error:"Enter a key and text for each tagline."};let a=r,s=Object.hasOwn(a,"key")?a.key:void 0;if(typeof s!="string"||!/^[a-z][a-z0-9_-]{0,31}$/.test(s))return{ok:!1,error:"Use a lowercase key of 1 to 32 letters, numbers, short dashes or underscores, starting with a letter."};if(i.has(s))return{ok:!1,error:"Use each tagline key only once."};let c=dn({...U,fields:[t]},a);if(!c.ok)return{ok:!1,error:c.errors.text??"Invalid tagline."};i.add(s),o.push({key:s,text:c.value.text??""})}return{ok:!0,value:o}}function Hn(n){return yn.some(e=>n===e)}function hn(n,e){let t=dn(U,e),o=rn(e.taglines??[]);if(!t.ok||!o.ok||e.layout!==void 0&&!Hn(e.layout))throw new TypeError("Invalid siteHero fallback");let i={heading:t.value.heading??"",intro:t.value.intro??"",layout:e.layout??"columns",taglines:o.value};if(n===null||typeof n!="object"||Array.isArray(n))return{data:i,fallbackFields:["$"]};let r=n,a=dn(U,r),s=a.ok?[]:Object.keys(a.errors);for(let p of U.fields)if(!s.includes(p.name)){let d=a.ok?a.value[p.name]:r[p.name];typeof d=="string"&&(p.name==="heading"||p.name==="intro")&&(i[p.name]=d.trim())}let c=Object.hasOwn(r,"layout")?r.layout:void 0,l=[];Hn(c)?i.layout=c:(i.layout="columns",s.push("layout"),l.push(gn));let u=rn(Object.hasOwn(r,"taglines")?r.taglines:void 0);return u.ok?i.taglines=u.value:s.push("taglines"),{data:i,fallbackFields:s.length===U.fields.length+2?["$"]:s,...l.length>0?{warnings:l}:{}}}function Nn(){return E({name:"siteHero.v1",query:'*[_id == $id && _type == "siteHero"][0]{heading,intro,layout,taglines}',params:{id:"siteHero"},dependencies:{types:["siteHero"],ids:["siteHero"]},resolve:hn})}0&&(module.exports={CONTENT_PAGES_QUERY,CONTENT_PAGE_BY_SLUG_QUERY,HEADING_LIST_LAYOUTS,HOME_PAGE_DOCUMENT_QUERY,MALFORMED_CONTENT,MalformedContentError,READER_ACTION_HREF,READER_GALLERY_PHOTO_LIMIT,READER_GALLERY_PHOTO_MIN,READER_HOME_PAGE_ID,READER_JUMP_LINK,READER_PHOTO_SLUG,READER_SECTION_KINDS,READER_SITE_SETTINGS_ID,READER_STORY_LAYOUTS,SECTION_LAYOUT_DEFAULTS,SECTION_WARNINGS,SITE_HERO_LAYOUTS,SITE_HERO_LAYOUT_WARNING,SITE_HERO_TAGLINE_MAX_LENGTH,SPLIT_LAYOUTS,STAGGER_ROW_LAYOUTS,campaignState,contentPageQuery,contentPagesQuery,createSiteContentReader,homeContentQuery,parseContentPage,parseHomePage,parseSiteHero,parseSiteSettings,portableTextToMarkdown,siteHeroQuery,siteSettingsQuery,validateSiteHeroTaglines});
6
+ ${T}`),s.push({kind:"campaign",action:k,images:m})}}let d=[],p=o.blocks??[];Array.isArray(p)?t.dense(p,"blocks")&&p.forEach((f,g)=>{let m=t.object(f,`blocks[${String(g)}]`);if(m===null)return;let T=G("blocks",m,g),k=$n(m,T,t);k!==null&&(u.push(...Rn(k,m,T)),k.kind==="locations"&&k.anchor!==null&&(d.includes(k.anchor)&&t.fail(`${T}.jumpLink`,`repeats "${k.anchor}", already used by another section`),d.push(k.anchor)),s.push(k))}):t.fail("blocks","is not a list");let y=[];r?.cta&&y.push({where:"hero.primaryAction.href",href:r.cta.href}),r?.secondaryCta&&y.push({where:"hero.secondaryAction.href",href:r.secondaryCta.href}),y.push(...u);for(let{where:f,href:g}of y)g.startsWith("#")&&!d.includes(g.slice(1))&&t.fail(f,`jumps to ${g}, which no section on the page is named`);if(t.problems.length>0)throw new I(i,t.problems);return{composition:{intro:null,photo:null,hero:r,blocks:s},body:l,campaign:c,proposedCopy:t.proposed}}function Rn(n,e,t){switch(n.kind){case"feature_stories":{let o=Array.isArray(e.stories)?e.stories:[];return n.items.map((i,r)=>({where:`${G(`${t}.stories`,o[r]??{},r)}.action.href`,href:i.action.href}))}case"accent_band":return n.action===null?[]:[{where:`${t}.action.href`,href:n.action.href}];case"cta":return[{where:`${t}.action.href`,href:n.link.href}];default:return[]}}function J(n,e,t){let o=n.jumpLink;return o==null||o===""?null:typeof o!="string"||!D.test(o)?t.fail(`${e}.jumpLink`,`is ${JSON.stringify(o)}, not lowercase words joined by hyphens`):o}function $n(n,e,t){switch(n._type){case"featureStoriesBlock":{let o=t.requiredCopy(n.heading,`${e}.heading`),i=t.copy(n.tail,`${e}.tail`),r=n.stories;if(!Array.isArray(r)||r.length===0)return t.fail(`${e}.stories`,"has no stories");if(!t.dense(r,`${e}.stories`))return null;let a=[];return r.forEach((s,u)=>{let l=t.object(s,`${e}.stories[${String(u)}]`);if(l===null)return;let c=G(`${e}.stories`,l,u),d=t.requiredCopy(l.heading,`${c}.heading`),p=t.requiredCopy(l.body,`${c}.body`),y=t.requiredAction(l.action,`${c}.action`),f=t.photo(l.photo,`${c}.photo`),g=l.layout??"wide";if(!Q.includes(g)){t.fail(`${c}.layout`,`is ${JSON.stringify(g)}, not wide, tall, round or free`);return}let m=l.onCard??!1;if(typeof m!="boolean"){t.fail(`${c}.onCard`,"is not on or off");return}d===null||p===null||y===null||a.push({heading:d,body:p,action:y,image:f,shape:g,card:m})}),o===null?null:{kind:"feature_stories",heading:o,tail:i,items:a}}case"surfaceCardBlock":{let o=t.requiredCopy(n.heading,`${e}.heading`),i=t.copy(n.body,`${e}.body`),r=t.requiredAction(n.action,`${e}.action`);return o===null||r===null?null:{kind:"cta",heading:K(o),body:i===null?null:K(i),link:{label:K(r.label),href:r.href}}}case"accentBandBlock":{let o=t.requiredCopy(n.heading,`${e}.heading`),i=t.requiredCopy(n.body,`${e}.body`),r=t.action(n.action,`${e}.action`),a=t.photo(n.photo,`${e}.photo`);return o===null||i===null?null:{kind:"accent_band",heading:o,body:i,action:r,image:a}}case"locationsBlock":{let o=J(n,e,t),i=t.requiredCopy(n.heading,`${e}.heading`),r=t.copy(n.tail,`${e}.tail`),a=t.photo(n.photo,`${e}.photo`);return i===null?null:{kind:"locations",anchor:o,heading:i,tail:r,image:a}}default:return t.fail(`${e}._type`,`is ${JSON.stringify(n._type)}, not a section type this reader knows`)}}function V(n,e,t,o,i){let r=n.layout,a=t.find(s=>s===r);return a!==void 0?a:(i.push({code:b.layoutDefaulted,where:`${e}.layout`}),o)}function ln(n,e,t,o){if(n==null)return null;let i=t.object(n,e);if(i===null)return null;let r=i.asset,a=typeof r=="object"&&r!==null?r._ref:void 0;if(typeof a!="string"||a==="")return o.push({code:b.imageMissingAsset,where:`${e}.asset`}),null;let s=i.alt;if(typeof s!="string"||s.trim()==="")return o.push({code:b.imageMissingAlt,where:`${e}.alt`}),null;let u=t.optionalString(i.caption,`${e}.caption`),l=null;if(i.hotspot!==void 0&&i.hotspot!==null){let c=t.object(i.hotspot,`${e}.hotspot`),d=c?.x,p=c?.y;typeof d=="number"&&typeof p=="number"&&d>=0&&d<=1&&p>=0&&p<=1?l={x:d,y:p}:c!==null&&t.fail(`${e}.hotspot`,"is not a point inside the image")}return{asset:a,alt:s,caption:u,hotspot:l}}function Xn(n){return typeof n=="string"?n.slice(0,64).replace(/[^A-Za-z0-9_.-]/g,"?"):"?"}function vn(n,e,t,o){switch(n._type){case"featureStoriesBlock":case"surfaceCardBlock":case"accentBandBlock":case"locationsBlock":{let i=$n(n,e,t);return i===null||i.kind==="campaign"?null:i}case"textMediaBlock":{let i=J(n,e,t),r=t.requiredCopy(n.heading,`${e}.heading`),a=t.copy(n.tail,`${e}.tail`),s=t.requiredCopy(n.body,`${e}.body`),u=t.action(n.action,`${e}.action`),l=ln(n.photo,`${e}.photo`,t,o),c=V(n,e,A,R.Split,o);return r===null||s===null?null:{kind:"text_media",anchor:i,layout:c,heading:r,tail:a,body:s,action:u,image:l}}case"faqBlock":{let i=J(n,e,t),r=t.requiredCopy(n.heading,`${e}.heading`),a=t.copy(n.tail,`${e}.tail`),s=t.copy(n.intro,`${e}.intro`),u=V(n,e,L,R.HeadingList,o),l=n.items;if(!Array.isArray(l)||l.length===0)return t.fail(`${e}.items`,"has no questions");if(!t.dense(l,`${e}.items`))return null;let c=[];return l.forEach((d,p)=>{let y=t.object(d,`${e}.items[${String(p)}]`);if(y===null)return;let f=G(`${e}.items`,y,p);if(y._type!==void 0&&y._type!=="faqItem"){t.fail(`${f}._type`,`is ${JSON.stringify(y._type)}, not faqItem`);return}let g=t.requiredCopy(y.question,`${f}.question`),m=t.requiredCopy(y.answer,`${f}.answer`);g!==null&&m!==null&&c.push({question:g,answer:m})}),r===null?null:{kind:"faq",anchor:i,layout:u,heading:r,tail:a,intro:s,items:c}}case"galleryBlock":{let i=J(n,e,t),r=t.copy(n.heading,`${e}.heading`),a=V(n,e,H,R.StaggerRow,o),s=n.photos??[];if(!Array.isArray(s))return t.fail(`${e}.photos`,"is not a list of photos");if(!t.dense(s,`${e}.photos`))return null;if(s.length<Y||s.length>B)return t.fail(`${e}.photos`,`holds ${String(s.length)} photos; a gallery shows ${String(Y)} to ${String(B)}`);let u=s.flatMap((l,c)=>{let d=ln(l,G(`${e}.photos`,typeof l=="object"&&l!==null?l:{},c),t,o);return d===null?[]:[d]});return u.length===0?(o.push({code:b.emptySkipped,where:e}),null):{kind:"gallery",anchor:i,layout:a,heading:r,images:u}}case"contactBlock":{let i=J(n,e,t),r=t.requiredCopy(n.heading,`${e}.heading`),a=t.copy(n.body,`${e}.body`),s=y=>{let f=n[y]??!0;return typeof f=="boolean"?f:(t.fail(`${e}.${y}`,"is not on or off"),!1)},u=s("showEmail"),l=s("showPhone"),c=t.action(n.action,`${e}.action`),d=ln(n.photo,`${e}.photo`,t,o),p=V(n,e,A,R.Split,o);return r===null?null:!u&&!l&&a===null&&c===null?(o.push({code:b.emptySkipped,where:e}),null):{kind:"contact",anchor:i,layout:p,heading:r,body:a,showEmail:u,showPhone:l,action:c,image:d}}default:return o.push({code:b.unknownType,where:`${e}._type`,type:Xn(n._type)}),null}}function ne(n,e,t){switch(n.kind){case"text_media":case"contact":return n.action===null?[]:[{where:`${t}.action.href`,href:n.action.href}];case"faq":case"gallery":return[];default:return Rn(n,e,t)}}function ee(n,e){let t=[],o=[];if(!Array.isArray(n))return e.fail("sections","is not a list"),{sections:t,warnings:o};if(!e.dense(n,"sections"))return{sections:t,warnings:o};let i=[],r=[];n.forEach((a,s)=>{let u=e.object(a,`sections[${String(s)}]`);if(u===null)return;let l=G("sections",u,s),c=vn(u,l,e,o);if(c===null)return;r.push(...ne(c,u,l));let d="anchor"in c?c.anchor:null;d!==null&&(i.includes(d)&&e.fail(`${l}.jumpLink`,`repeats "${d}", already used by another section`),i.push(d)),t.push(c)});for(let{where:a,href:s}of r)s.startsWith("#")&&!i.includes(s.slice(1))&&e.fail(a,`jumps to ${s}, which no section on the page is named`);return{sections:t,warnings:o}}function q(n){let e=new j,t=e.object(n,"page");if(t===null)throw new I("page",e.problems);let o=typeof t._id=="string"?t._id:"page";t._type!=="page"&&e.fail("_type",`is ${JSON.stringify(t._type)}, not page`);let i=e.optionalString(t.title,"title");i===null&&e.fail("title","is missing"),t.titleCopySource==="proposed"&&i!==null&&e.proposed.push({where:"title",text:i});let r=t.slug,a=typeof r?.current=="string"&&r.current!==""?r.current:null;a===null&&e.fail("slug.current","is missing");let s=e.copy(t.lead,"lead"),u=e.photo(t.photo,"photo"),l=cn(t.body,"body",e);t.bodyCopySource==="proposed"&&e.proposed.push({where:"body",text:l});let c=t.sections===void 0||t.sections===null?null:ee(t.sections,e);if(e.problems.length>0||i===null||a===null)throw new I(o,e.problems);return{slug:a,title:i,composition:{intro:s===null?null:K(s),photo:u,hero:null,blocks:[]},body:l,migrated:t.migrated===!0,proposedCopy:e.proposed,...c===null?{}:c}}function nn(n){let e=new j,t=e.object(n,"siteSettings");if(t===null)throw new I(x,e.problems);let o=e.optionalString(t.title,"title");o===null&&e.fail("title","is missing; a site needs its name");let i=e.optionalString(t.description,"description"),r=t.contact===void 0?{}:e.object(t.contact,"contact")??{},a=e.optionalString(r.email,"contact.email"),s=e.optionalString(r.phone,"contact.phone"),u=[],l=t.social??[];if(Array.isArray(l)?e.dense(l,"social")&&l.forEach((c,d)=>{let p=e.object(c,`social[${String(d)}]`);if(p===null)return;let y=e.optionalString(p.network,`social[${String(d)}].network`),f=e.optionalString(p.url,`social[${String(d)}].url`);if(y===null||f===null||!/^https?:\/\//.test(f)){e.fail(`social[${String(d)}]`,"needs a network and a web address");return}u.push({network:y,url:f})}):e.fail("social","is not a list"),e.problems.length>0||o===null)throw new I(x,e.problems);return{name:o,description:i,contact:{email:a,phone:s},social:u}}var M="*[_id == $id][0]",en='*[_type == "page" && defined(slug.current)]|order(slug.current asc)',tn='*[_type == "page" && slug.current == $slug][0]';function On(n){return{home:async({now:e})=>{let t=await n.query(M,{params:{id:O}});return t==null?null:v(t,{now:e})},pages:async()=>{let e=await n.query(en);if(!Array.isArray(e))throw new I("page",["the page query did not return a list"]);if(!S(e))throw new I("page",["the page query contains missing entries"]);return e.map(t=>q(t))},pageBySlug:async e=>{let t=await n.query(tn,{params:{slug:e}});return t==null?null:q(t)},siteSettings:async()=>{let e=await n.query(M,{params:{id:x}});return e==null?null:nn(e)}}}function on(n,e,t,o){if(!o(e))throw new TypeError("Invalid CMS content fallback");return n==null?{data:e,fallbackFields:["$"]}:{data:t(n),fallbackFields:[]}}function xn(n){if(!(n instanceof Date)||!Number.isFinite(n.getTime()))throw new TypeError("Invalid CMS campaign date");let e=n.getTime();return E({name:"homePage.v1",query:M,params:{id:O},dependencies:{types:["homePage"],ids:[O]},resolve:(t,o)=>on(t,o,i=>v(i,{now:new Date(e)}),Cn)})}function Ln(n){if(typeof n!="string"||n==="")throw new TypeError("Invalid CMS page slug");return E({name:"page.v1",query:tn,params:{slug:n},dependencies:{types:["page"]},resolve:(e,t)=>on(e,t,q,an)})}function Hn(){return E({name:"pages.v1",query:en,params:{},dependencies:{types:["page"]},resolve:(n,e)=>on(n,e,t=>{if(!Array.isArray(t))throw new I("page",["the page query did not return a list"]);if(!S(t))throw new I("page",["the page query contains missing entries"]);return t.map(o=>q(o))},t=>S(t)&&t.every(o=>o!==null&&an(o)))})}function Nn(){return E({name:"siteSettings.v1",query:M,params:{id:x},dependencies:{types:["siteSettings"],ids:[x]},resolve:(n,e)=>on(n,e,nn,An)})}var dn=["columns","rows"],yn=40,fn="siteHero.layout.defaulted",gn="siteHero.tagline.dropped",hn="siteHero.taglines.defaulted";var U={key:"hero",documentId:"siteHero",documentType:"siteHero",fields:[{name:"heading",label:"Heading",noun:{article:"a",word:"heading"},kind:"single-line",required:!0,minLength:1,maxLength:80,noTrailingFullStop:!0},{name:"intro",label:"Introduction",noun:{article:"an",word:"introduction"},kind:"multi-line",required:!0,minLength:1,maxLength:320}],copy:{currentTitle:"On your site now",editTitle:"Edit and publish",empty:"Your site has no hero text yet. Whatever you publish below becomes its first version."}};function te(n,e){let{article:t,word:o}=n.noun;if(e.length===0)return n.required?`Enter ${t} ${o}.`:null;let i=[...e].length;return i<n.minLength?`Make the ${o} at least ${String(n.minLength)} characters. It is ${String(i)} now.`:i>n.maxLength?`Keep the ${o} to ${String(n.maxLength)} characters or fewer. It is ${String(i)} now.`:e.includes("\u2014")?`The ${o} contains a long dash. Use a comma, a colon or a short dash instead.`:n.kind==="single-line"&&/[\r\n]/.test(e)?`The ${o} must be a single line.`:n.noTrailingFullStop===!0&&e.endsWith(".")?`${o.charAt(0).toUpperCase()}${o.slice(1)}s on your site do not end with a full stop. Remove the last full stop.`:null}function pn(n,e){let t={},o={};for(let i of n.fields){let r=Object.hasOwn(e,i.name)?e[i.name]:void 0,a=typeof r=="string"?r.trim():"",s=te(i,a);Object.defineProperty(s===null?t:o,i.name,{value:s??a,enumerable:!0})}return Object.keys(o).length>0?{ok:!1,errors:o}:{ok:!0,value:t}}function Dn(n){if(!Array.isArray(n))return{ok:!1,error:"Enter a list of taglines."};let e=U.fields[0];if(!e)throw new TypeError("Missing siteHero heading definition");let t={...e,name:"text",noun:{article:"a",word:"tagline"},maxLength:yn},o=[],i=[],r=new Set;for(let[a,s]of n.entries()){if(!s||typeof s!="object"||Array.isArray(s)){i.push({index:a,error:"Enter a key and text for each tagline."});continue}let u=s,l=Object.hasOwn(u,"key")?u.key:void 0;if(typeof l!="string"||!/^[a-z][a-z0-9_-]{0,31}$/.test(l)){i.push({index:a,error:"Use a lowercase key of 1 to 32 letters, numbers, short dashes or underscores, starting with a letter."});continue}if(r.has(l)){i.push({index:a,error:"Use each tagline key only once."});continue}let c=pn({...U,fields:[t]},u);if(!c.ok){i.push({index:a,error:c.errors.text??"Invalid tagline."});continue}let d=c.value.text??"";if((d.match(/\p{L}/gu)?.length??0)>=2&&!/\p{Ll}/u.test(d)){i.push({index:a,error:"Use sentence case for the tagline, rather than all capitals."});continue}r.add(l),o.push({key:l,text:d})}return{ok:!0,value:o,dropped:i}}function mn(n){let e=Dn(n);if(!e.ok)return e;let t=e.dropped[0];return t?{ok:!1,error:t.error}:{ok:!0,value:e.value}}function Pn(n){return dn.some(e=>n===e)}function Sn(n,e){let t=pn(U,e),o=mn(e.taglines??[]);if(!t.ok||!o.ok||e.layout!==void 0&&!Pn(e.layout))throw new TypeError("Invalid siteHero fallback");let i={heading:t.value.heading??"",intro:t.value.intro??"",layout:e.layout??"columns",taglines:o.value};if(n===null||typeof n!="object"||Array.isArray(n))return{data:i,fallbackFields:["$"]};let r=n,a=pn(U,r),s=a.ok?[]:Object.keys(a.errors);for(let p of U.fields)if(!s.includes(p.name)){let y=a.ok?a.value[p.name]:r[p.name];typeof y=="string"&&(p.name==="heading"||p.name==="intro")&&(i[p.name]=y.trim())}let u=Object.hasOwn(r,"layout")?r.layout:void 0,l=[];Pn(u)?i.layout=u:(i.layout="columns",s.push("layout"),l.push(fn));let c=Dn(Object.hasOwn(r,"taglines")?r.taglines:void 0);if(c.ok){i.taglines=c.value;for(let{index:p}of c.dropped)s.push(`taglines[${String(p)}]`);c.dropped.length>0&&l.push(gn)}else s.push("taglines"),l.push(hn);let d=[...U.fields.map(p=>p.name),"layout","taglines"].every(p=>s.includes(p));return{data:i,fallbackFields:d?["$"]:s,...l.length>0?{warnings:l}:{}}}function jn(){return E({name:"siteHero.v1",query:'*[_id == $id && _type == "siteHero"][0]{heading,intro,layout,taglines}',params:{id:"siteHero"},dependencies:{types:["siteHero"],ids:["siteHero"]},resolve:Sn})}0&&(module.exports={CONTENT_PAGES_QUERY,CONTENT_PAGE_BY_SLUG_QUERY,HEADING_LIST_LAYOUTS,HOME_PAGE_DOCUMENT_QUERY,MALFORMED_CONTENT,MalformedContentError,READER_ACTION_HREF,READER_GALLERY_PHOTO_LIMIT,READER_GALLERY_PHOTO_MIN,READER_HOME_PAGE_ID,READER_JUMP_LINK,READER_PHOTO_SLUG,READER_SECTION_KINDS,READER_SITE_SETTINGS_ID,READER_STORY_LAYOUTS,SECTION_LAYOUT_DEFAULTS,SECTION_WARNINGS,SITE_HERO_LAYOUTS,SITE_HERO_LAYOUT_WARNING,SITE_HERO_TAGLINES_DEFAULTED_WARNING,SITE_HERO_TAGLINE_DROPPED_WARNING,SITE_HERO_TAGLINE_MAX_LENGTH,SPLIT_LAYOUTS,STAGGER_ROW_LAYOUTS,campaignState,contentPageQuery,contentPagesQuery,createSiteContentReader,homeContentQuery,parseContentPage,parseHomePage,parseSiteHero,parseSiteSettings,portableTextToMarkdown,siteHeroQuery,siteSettingsQuery,validateSiteHeroTaglines});
7
7
  //# sourceMappingURL=site-content.cjs.map