@407dev/cms-astro 0.1.0 → 0.2.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.
Files changed (145) hide show
  1. package/README.md +4 -4
  2. package/dist/{chunk-7E3XJLKX.js → chunk-SGHAANOW.js} +30 -3
  3. package/dist/chunk-SGHAANOW.js.map +1 -0
  4. package/dist/{chunk-QYUVAKMC.js → chunk-YCQMH2T7.js} +51 -10
  5. package/dist/chunk-YCQMH2T7.js.map +1 -0
  6. package/dist/fields/collections.js +1 -1
  7. package/dist/index.d.ts +8 -1
  8. package/dist/index.js +32 -31
  9. package/dist/index.js.map +1 -1
  10. package/dist/middleware/index.js +2 -2
  11. package/package.json +5 -5
  12. package/src/client.ts +0 -1
  13. package/src/fields/attrs.ts +4 -0
  14. package/src/fields/collection.ts +8 -0
  15. package/src/fields/entryScope.test.ts +22 -1
  16. package/src/fields/index.ts +10 -1
  17. package/src/index.test.ts +117 -1
  18. package/src/integration.ts +29 -7
  19. package/src/middleware/preview.test.ts +39 -7
  20. package/src/middleware/preview.ts +18 -4
  21. package/src/preview/bridge-script.test.ts +81 -2
  22. package/src/preview/bridge-script.ts +30 -1
  23. package/dist/chunk-53OQ5RXJ.js +0 -912
  24. package/dist/chunk-53OQ5RXJ.js.map +0 -1
  25. package/dist/chunk-56OMNQLH.js +0 -1013
  26. package/dist/chunk-56OMNQLH.js.map +0 -1
  27. package/dist/chunk-5AOOMQ7K.js +0 -1031
  28. package/dist/chunk-5AOOMQ7K.js.map +0 -1
  29. package/dist/chunk-5XRUCFDC.js +0 -743
  30. package/dist/chunk-5XRUCFDC.js.map +0 -1
  31. package/dist/chunk-62ZHCOLZ.js +0 -25
  32. package/dist/chunk-62ZHCOLZ.js.map +0 -1
  33. package/dist/chunk-6AZLRSYA.js +0 -126
  34. package/dist/chunk-6AZLRSYA.js.map +0 -1
  35. package/dist/chunk-6L3ZTCFB.js +0 -14
  36. package/dist/chunk-6L3ZTCFB.js.map +0 -1
  37. package/dist/chunk-6O7ZNNDT.js +0 -697
  38. package/dist/chunk-6O7ZNNDT.js.map +0 -1
  39. package/dist/chunk-6PQIXTMK.js +0 -697
  40. package/dist/chunk-6PQIXTMK.js.map +0 -1
  41. package/dist/chunk-7AW6M7QW.js +0 -1013
  42. package/dist/chunk-7AW6M7QW.js.map +0 -1
  43. package/dist/chunk-7E3XJLKX.js.map +0 -1
  44. package/dist/chunk-7LM54OTA.js +0 -1031
  45. package/dist/chunk-7LM54OTA.js.map +0 -1
  46. package/dist/chunk-A3OGL4OX.js +0 -706
  47. package/dist/chunk-A3OGL4OX.js.map +0 -1
  48. package/dist/chunk-AO4UAWOV.js +0 -1030
  49. package/dist/chunk-AO4UAWOV.js.map +0 -1
  50. package/dist/chunk-BDFVGXM2.js +0 -697
  51. package/dist/chunk-BDFVGXM2.js.map +0 -1
  52. package/dist/chunk-CXM7NZVX.js +0 -1031
  53. package/dist/chunk-CXM7NZVX.js.map +0 -1
  54. package/dist/chunk-DXJSYGS6.js +0 -743
  55. package/dist/chunk-DXJSYGS6.js.map +0 -1
  56. package/dist/chunk-EFUSAQZM.js +0 -72
  57. package/dist/chunk-EFUSAQZM.js.map +0 -1
  58. package/dist/chunk-F7KDGPBN.js +0 -1013
  59. package/dist/chunk-F7KDGPBN.js.map +0 -1
  60. package/dist/chunk-FBSQT45X.js +0 -126
  61. package/dist/chunk-FBSQT45X.js.map +0 -1
  62. package/dist/chunk-FEPDOMVH.js +0 -697
  63. package/dist/chunk-FEPDOMVH.js.map +0 -1
  64. package/dist/chunk-FQDOL2QW.js +0 -25
  65. package/dist/chunk-FQDOL2QW.js.map +0 -1
  66. package/dist/chunk-GB3LGQJM.js +0 -109
  67. package/dist/chunk-GB3LGQJM.js.map +0 -1
  68. package/dist/chunk-HCNP6R3P.js +0 -736
  69. package/dist/chunk-HCNP6R3P.js.map +0 -1
  70. package/dist/chunk-J6WEJDRI.js +0 -743
  71. package/dist/chunk-J6WEJDRI.js.map +0 -1
  72. package/dist/chunk-JHEAPNJ2.js +0 -117
  73. package/dist/chunk-JHEAPNJ2.js.map +0 -1
  74. package/dist/chunk-JOJDJ6GW.js +0 -25
  75. package/dist/chunk-JOJDJ6GW.js.map +0 -1
  76. package/dist/chunk-KTDV6WYB.js +0 -202
  77. package/dist/chunk-KTDV6WYB.js.map +0 -1
  78. package/dist/chunk-KZWJBKPC.js +0 -734
  79. package/dist/chunk-KZWJBKPC.js.map +0 -1
  80. package/dist/chunk-LEAQBGL6.js +0 -109
  81. package/dist/chunk-LEAQBGL6.js.map +0 -1
  82. package/dist/chunk-LGZJL2Q7.js +0 -697
  83. package/dist/chunk-LGZJL2Q7.js.map +0 -1
  84. package/dist/chunk-LQPBU46R.js +0 -109
  85. package/dist/chunk-LQPBU46R.js.map +0 -1
  86. package/dist/chunk-M55NNUTY.js +0 -1013
  87. package/dist/chunk-M55NNUTY.js.map +0 -1
  88. package/dist/chunk-M6NCYCC3.js +0 -1013
  89. package/dist/chunk-M6NCYCC3.js.map +0 -1
  90. package/dist/chunk-MGN7OZAU.js +0 -109
  91. package/dist/chunk-MGN7OZAU.js.map +0 -1
  92. package/dist/chunk-MGYZOX4K.js +0 -1013
  93. package/dist/chunk-MGYZOX4K.js.map +0 -1
  94. package/dist/chunk-MY4IEKJS.js +0 -1031
  95. package/dist/chunk-MY4IEKJS.js.map +0 -1
  96. package/dist/chunk-NCQRGAB4.js +0 -705
  97. package/dist/chunk-NCQRGAB4.js.map +0 -1
  98. package/dist/chunk-NI4NHXI4.js +0 -697
  99. package/dist/chunk-NI4NHXI4.js.map +0 -1
  100. package/dist/chunk-NPI5N7AU.js +0 -14
  101. package/dist/chunk-NPI5N7AU.js.map +0 -1
  102. package/dist/chunk-QN4CPMJF.js +0 -126
  103. package/dist/chunk-QN4CPMJF.js.map +0 -1
  104. package/dist/chunk-QYUVAKMC.js.map +0 -1
  105. package/dist/chunk-RAAT6PDT.js +0 -25
  106. package/dist/chunk-RAAT6PDT.js.map +0 -1
  107. package/dist/chunk-RDPO5VPS.js +0 -1013
  108. package/dist/chunk-RDPO5VPS.js.map +0 -1
  109. package/dist/chunk-RQHIW2PF.js +0 -25
  110. package/dist/chunk-RQHIW2PF.js.map +0 -1
  111. package/dist/chunk-RREVHA52.js +0 -722
  112. package/dist/chunk-RREVHA52.js.map +0 -1
  113. package/dist/chunk-S7PT4PZN.js +0 -25
  114. package/dist/chunk-S7PT4PZN.js.map +0 -1
  115. package/dist/chunk-SUXV5M32.js +0 -109
  116. package/dist/chunk-SUXV5M32.js.map +0 -1
  117. package/dist/chunk-SZEORUY6.js +0 -696
  118. package/dist/chunk-SZEORUY6.js.map +0 -1
  119. package/dist/chunk-T7NGGWGY.js +0 -25
  120. package/dist/chunk-T7NGGWGY.js.map +0 -1
  121. package/dist/chunk-UEVWP5VE.js +0 -696
  122. package/dist/chunk-UEVWP5VE.js.map +0 -1
  123. package/dist/chunk-UJNKNP7U.js +0 -748
  124. package/dist/chunk-UJNKNP7U.js.map +0 -1
  125. package/dist/chunk-V4XVFWFI.js +0 -1013
  126. package/dist/chunk-V4XVFWFI.js.map +0 -1
  127. package/dist/chunk-VJU2CIKZ.js +0 -729
  128. package/dist/chunk-VJU2CIKZ.js.map +0 -1
  129. package/dist/chunk-VRQUP5L3.js +0 -202
  130. package/dist/chunk-VRQUP5L3.js.map +0 -1
  131. package/dist/chunk-WBJ5E7CL.js +0 -742
  132. package/dist/chunk-WBJ5E7CL.js.map +0 -1
  133. package/dist/chunk-Y3Q65C7R.js +0 -14
  134. package/dist/chunk-Y3Q65C7R.js.map +0 -1
  135. package/dist/chunk-YHEGFPTR.js +0 -1030
  136. package/dist/chunk-YHEGFPTR.js.map +0 -1
  137. package/dist/chunk-ZDLBN46C.js +0 -697
  138. package/dist/chunk-ZDLBN46C.js.map +0 -1
  139. package/dist/preview-BEkLMD6N.d.ts +0 -23
  140. package/dist/preview-DJEA4fj7.d.ts +0 -23
  141. package/dist/preview-DeD1Jn7U.d.ts +0 -23
  142. package/dist/types-15jfCQKb.d.ts +0 -141
  143. package/dist/types-BREdL9Gx.d.ts +0 -140
  144. package/dist/types-C6sUZNa2.d.ts +0 -104
  145. package/dist/types-DpeHpobR.d.ts +0 -104
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/richtext/render.ts","../src/fields/attrs.ts","../src/fields/helpers.ts","../src/fields/entryScope.ts","../src/fields/group.ts","../src/fields/scope.ts","../src/fields/index.ts","../src/head.ts","../src/image.ts","../src/toolbar/icon.ts","../src/integration.ts","../src/preview.ts","../src/siteFiles.ts"],"names":["path","DEFAULT_TAGS","getFieldType","createComponent","renderTemplate","spreadAttributes","markHTMLString","listFieldTypes"],"mappings":"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","file":"index.js","sourcesContent":["import { isValidLinkHref } from '@407dev/field-types';\n\nexport interface RichTextRenderOptions {\n components?: Record<string, unknown>;\n maxDepth?: number;\n}\n\nexport function escapeHtml(str: string): string {\n if (typeof str !== 'string') return '';\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\nexport const KNOWN_NODES = new Set([\n 'doc',\n 'paragraph',\n 'heading',\n 'bulletList',\n 'orderedList',\n 'listItem',\n 'blockquote',\n 'codeBlock',\n 'hardBreak',\n 'horizontalRule',\n 'text',\n 'image',\n]);\n\nconst KNOWN_MARKS = new Set(['bold', 'italic', 'underline', 'strike', 'code', 'link']);\n\nexport interface RichTextNodeShape {\n type?: string;\n text?: string;\n attrs?: Record<string, unknown>;\n marks?: Array<{ type: string; attrs?: Record<string, unknown> }>;\n content?: unknown[];\n}\n\nexport interface LinkMarkAttrs {\n href: string;\n target?: string;\n rel?: string;\n title?: string;\n}\n\n/** Parses a richtext value (doc object or JSON string) into a doc root, or null if invalid/empty. */\nexport function parseRichTextDoc(value: unknown): { type?: string; content?: unknown[] } | null {\n if (!value) return null;\n let parsed: unknown = value;\n if (typeof value === 'string') {\n try {\n parsed = JSON.parse(value);\n } catch {\n return null;\n }\n }\n if (typeof parsed !== 'object' || parsed === null) return null;\n const root = parsed as { type?: string; content?: unknown[] };\n if (root.type !== 'doc' && !Array.isArray(root.content)) return null;\n return root;\n}\n\n/** Applies non-link marks to escaped text; `link` is resolved separately via getLinkMarkAttrs so callers can swap in a component. */\nexport function renderMarksOnly(\n text: string,\n marks: Array<{ type: string; attrs?: Record<string, unknown> }> | undefined,\n): string {\n let out = escapeHtml(text || '');\n if (!Array.isArray(marks)) return out;\n for (const mark of marks) {\n if (!mark || typeof mark !== 'object' || mark.type === 'link' || !KNOWN_MARKS.has(mark.type)) {\n continue;\n }\n if (mark.type === 'bold') out = `<strong>${out}</strong>`;\n else if (mark.type === 'italic') out = `<em>${out}</em>`;\n else if (mark.type === 'underline') out = `<u>${out}</u>`;\n else if (mark.type === 'strike') out = `<s>${out}</s>`;\n else if (mark.type === 'code') out = `<code>${out}</code>`;\n }\n return out;\n}\n\nexport function getLinkMarkAttrs(\n marks: Array<{ type: string; attrs?: Record<string, unknown> }> | undefined,\n): LinkMarkAttrs | null {\n if (!Array.isArray(marks)) return null;\n const linkMark = marks.find((m) => m && typeof m === 'object' && m.type === 'link');\n if (!linkMark) return null;\n\n const rawHref = linkMark.attrs?.href;\n if (typeof rawHref !== 'string' || !isValidLinkHref(rawHref)) return null;\n\n const target = typeof linkMark.attrs?.target === 'string' ? linkMark.attrs.target : undefined;\n const rel =\n typeof linkMark.attrs?.rel === 'string'\n ? linkMark.attrs.rel\n : target === '_blank'\n ? 'noopener noreferrer'\n : undefined;\n const title = typeof linkMark.attrs?.title === 'string' ? linkMark.attrs.title : undefined;\n\n return { href: rawHref, target, rel, title };\n}\n\nexport function renderRichTextHtml(doc: unknown, options: RichTextRenderOptions = {}): string {\n if (!doc) return '';\n\n let parsedDoc: unknown = doc;\n if (typeof doc === 'string') {\n try {\n parsedDoc = JSON.parse(doc);\n } catch {\n return `<p>${escapeHtml(doc)}</p>`;\n }\n }\n\n if (typeof parsedDoc !== 'object' || parsedDoc === null) {\n return '';\n }\n\n const root = parsedDoc as { type?: string; content?: unknown[] };\n if (root.type !== 'doc' && !Array.isArray(root.content)) {\n return '';\n }\n\n const isDev = typeof process !== 'undefined' && process.env?.NODE_ENV === 'development';\n const maxDepth = options.maxDepth ?? 50;\n\n function renderNode(node: unknown, depth = 0): string {\n if (depth > maxDepth) return '';\n if (!node || typeof node !== 'object') return '';\n\n const n = node as {\n type?: string;\n text?: string;\n attrs?: Record<string, unknown>;\n marks?: Array<{ type: string; attrs?: Record<string, unknown> }>;\n content?: unknown[];\n };\n\n const nodeType = n.type || '';\n if (!KNOWN_NODES.has(nodeType)) {\n if (isDev) {\n console.warn(`[RichText] Skipped unknown node type: \"${nodeType}\"`);\n }\n return '';\n }\n\n if (nodeType === 'text') {\n let text = escapeHtml(n.text || '');\n if (Array.isArray(n.marks)) {\n for (const mark of n.marks) {\n if (!mark || typeof mark !== 'object') continue;\n const markType = mark.type;\n if (!KNOWN_MARKS.has(markType)) {\n if (isDev) {\n console.warn(`[RichText] Skipped unknown mark type: \"${markType}\"`);\n }\n continue;\n }\n\n if (markType === 'bold') {\n text = `<strong>${text}</strong>`;\n } else if (markType === 'italic') {\n text = `<em>${text}</em>`;\n } else if (markType === 'underline') {\n text = `<u>${text}</u>`;\n } else if (markType === 'strike') {\n text = `<s>${text}</s>`;\n } else if (markType === 'code') {\n text = `<code>${text}</code>`;\n } else if (markType === 'link') {\n const rawHref = mark.attrs?.href;\n if (typeof rawHref === 'string' && isValidLinkHref(rawHref)) {\n const href = escapeHtml(rawHref);\n const target =\n typeof mark.attrs?.target === 'string'\n ? ` target=\"${escapeHtml(mark.attrs.target)}\"`\n : '';\n const rel =\n typeof mark.attrs?.rel === 'string'\n ? ` rel=\"${escapeHtml(mark.attrs.rel)}\"`\n : target.includes('_blank')\n ? ' rel=\"noopener noreferrer\"'\n : '';\n text = `<a href=\"${href}\"${target}${rel}>${text}</a>`;\n }\n }\n }\n }\n return text;\n }\n\n const children = Array.isArray(n.content)\n ? n.content.map((c) => renderNode(c, depth + 1)).join('')\n : '';\n\n switch (nodeType) {\n case 'doc':\n return children;\n case 'paragraph':\n return `<p>${children}</p>`;\n case 'heading': {\n const rawLevel = n.attrs?.level;\n const level = typeof rawLevel === 'number' && rawLevel >= 1 && rawLevel <= 6 ? rawLevel : 2;\n return `<h${level}>${children}</h${level}>`;\n }\n case 'bulletList':\n return `<ul>${children}</ul>`;\n case 'orderedList': {\n const start = n.attrs?.start || n.attrs?.order;\n const startAttr = typeof start === 'number' && start !== 1 ? ` start=\"${start}\"` : '';\n return `<ol${startAttr}>${children}</ol>`;\n }\n case 'listItem':\n return `<li>${children}</li>`;\n case 'blockquote':\n return `<blockquote>${children}</blockquote>`;\n case 'codeBlock': {\n const lang =\n typeof n.attrs?.language === 'string'\n ? ` data-language=\"${escapeHtml(n.attrs.language)}\"`\n : '';\n return `<pre><code${lang}>${children}</code></pre>`;\n }\n case 'hardBreak':\n return '<br />';\n case 'horizontalRule':\n return '<hr />';\n case 'image': {\n if (options.components?.image) {\n const src = typeof n.attrs?.src === 'string' ? escapeHtml(n.attrs.src) : '';\n const alt = typeof n.attrs?.alt === 'string' ? escapeHtml(n.attrs.alt) : '';\n return `<img src=\"${src}\" alt=\"${alt}\" />`;\n }\n return '';\n }\n default:\n return children;\n }\n }\n\n return renderNode(root);\n}\n","export function cmsFieldAttr(key: string): { 'data-cms-field': string } {\n return { 'data-cms-field': key };\n}\n\nexport function cmsGroupAttr(groupName: string, prefix: string): { 'data-cms-group': string } {\n return { 'data-cms-group': `${groupName}:${prefix}` };\n}\n\nexport function cmsEntryAttr(\n collectionKey: string,\n slug?: string,\n): { 'data-cms-collection': string; 'data-cms-entry'?: string } {\n if (slug) {\n return {\n 'data-cms-collection': collectionKey,\n 'data-cms-entry': slug,\n };\n }\n return { 'data-cms-collection': collectionKey };\n}\n\nexport function cmsEntryFieldAttr(path: string): { 'data-cms-entry-field': string } {\n return { 'data-cms-entry-field': path };\n}\n","import { getFieldType, listFieldTypes } from '@407dev/field-types';\nimport {\n createComponent,\n markHTMLString,\n renderTemplate,\n spreadAttributes,\n} from 'astro/runtime/server/index.js';\nimport { renderRichTextHtml } from '../richtext/render';\nimport { getActiveBundle, recordMissingField } from '../runtime/store';\nimport type {\n DualCallableHelper,\n FieldComponentProps,\n FieldHelpersMap,\n FieldReadOptions,\n} from './types';\n\nconst DEFAULT_TAGS: Record<string, string> = {\n text: 'span',\n number: 'span',\n toggle: 'span',\n select: 'span',\n image: 'img',\n img: 'img',\n video: 'video',\n vid: 'video',\n richtext: 'div',\n richText: 'div',\n};\n\nexport function getPlaceholderForType(typeId: string, fullKey: string): unknown {\n const isDev = typeof process !== 'undefined' && process.env?.NODE_ENV === 'development';\n if (isDev) {\n return `[${fullKey}]`;\n }\n const typeDef = getFieldType(typeId);\n if (typeDef && typeDef.defaultValue !== undefined) {\n return typeDef.defaultValue;\n }\n switch (typeId) {\n case 'number':\n return 0;\n case 'toggle':\n return false;\n case 'image':\n case 'video':\n return null;\n case 'richtext':\n return null;\n default:\n return '';\n }\n}\n\nexport function createDualCallableHelper<TValue = unknown, TDefault = TValue>(\n typeId: string,\n publicName: string,\n prefix = '',\n defaultKey = '',\n): DualCallableHelper<TValue, TDefault> {\n const typeDef = getFieldType(typeId) || getFieldType(publicName);\n const defaultTag =\n DEFAULT_TAGS[typeId] || DEFAULT_TAGS[publicName] || typeDef?.renderHint?.tag || 'span';\n\n // biome-ignore lint/suspicious/noExplicitAny: Astro runtime internal component factory\n const componentFactory = createComponent(async ($$result: any, $$props: any, _slots: any) => {\n const rawKey = ($$props?.k ?? $$props?.key ?? defaultKey) as string;\n const fullKey = prefix ? (rawKey ? `${prefix}.${rawKey}` : prefix) : rawKey;\n const tag = ($$props?.as || $$props?.tag || defaultTag) as string;\n const defaultValue = $$props?.defaultValue as TDefault | undefined;\n\n const bundle = getActiveBundle();\n const rawVal = fullKey ? bundle?.fields?.[fullKey] : undefined;\n\n let displayVal: unknown = rawVal;\n if (displayVal === undefined || displayVal === null) {\n if (defaultValue !== undefined) {\n displayVal = defaultValue;\n } else {\n if (fullKey) {\n recordMissingField(fullKey);\n }\n displayVal = getPlaceholderForType(typeId, fullKey);\n }\n }\n\n const {\n k: _k,\n key: _key,\n defaultValue: _def,\n as: _as,\n tag: _tag,\n components: _comp,\n ...htmlProps\n } = ($$props || {}) as FieldComponentProps<TDefault>;\n\n const attrs: Record<string, unknown> = {\n ...htmlProps,\n };\n if (fullKey) {\n attrs['data-cms-field'] = fullKey;\n }\n if (!attrs['data-cms-kind']) {\n attrs['data-cms-kind'] = typeId;\n }\n\n if (typeId === 'image' || publicName === 'img') {\n if (displayVal && typeof displayVal === 'object') {\n const asset = displayVal as { url?: string; alt?: string; width?: number; height?: number };\n if (asset.url && !attrs.src) attrs.src = asset.url;\n if (asset.alt && !attrs.alt) attrs.alt = asset.alt;\n if (asset.width && !attrs.width) attrs.width = asset.width;\n if (asset.height && !attrs.height) attrs.height = asset.height;\n } else if (typeof displayVal === 'string' && displayVal) {\n if (!attrs.src) attrs.src = displayVal;\n }\n\n return renderTemplate`<img${spreadAttributes(attrs)}>`;\n }\n\n if (typeId === 'video' || publicName === 'vid') {\n if (displayVal && typeof displayVal === 'object') {\n const asset = displayVal as {\n url?: string;\n poster?: string;\n width?: number;\n height?: number;\n };\n if (asset.url && !attrs.src) attrs.src = asset.url;\n if (asset.poster && !attrs.poster) attrs.poster = asset.poster;\n if (asset.width && !attrs.width) attrs.width = asset.width;\n if (asset.height && !attrs.height) attrs.height = asset.height;\n } else if (typeof displayVal === 'string' && displayVal) {\n if (!attrs.src) attrs.src = displayVal;\n }\n if (attrs.controls === undefined) attrs.controls = true;\n\n return renderTemplate`<video${spreadAttributes(attrs)}></video>`;\n }\n\n if (typeId === 'richtext' || publicName === 'richText') {\n const html = renderRichTextHtml(displayVal, { components: $$props?.components });\n return renderTemplate`<${tag}${spreadAttributes(attrs)}>${markHTMLString(html)}</${tag}>`;\n }\n\n return renderTemplate`<${tag}${spreadAttributes(attrs)}>${displayVal !== null && displayVal !== undefined ? String(displayVal) : ''}</${tag}>`;\n });\n\n const fn = (arg0?: unknown, ...rest: unknown[]): unknown => {\n const isComponentCall =\n arg0 &&\n typeof arg0 === 'object' &&\n 'styles' in (arg0 as Record<string, unknown>) &&\n 'scripts' in (arg0 as Record<string, unknown>);\n\n if (!isComponentCall) {\n // Synchronous read call: f.text('key', opts) or hero.heading(opts)\n let rawKey = defaultKey;\n let options: FieldReadOptions<TDefault> = {};\n\n if (typeof arg0 === 'string') {\n rawKey = arg0;\n options = (rest[0] || {}) as FieldReadOptions<TDefault>;\n } else if (arg0 && typeof arg0 === 'object') {\n options = arg0 as FieldReadOptions<TDefault>;\n }\n\n const fullKey = prefix ? (rawKey ? `${prefix}.${rawKey}` : prefix) : rawKey;\n const bundle = getActiveBundle();\n const val = fullKey ? bundle?.fields?.[fullKey] : undefined;\n\n if (val !== undefined && val !== null) {\n return val as TValue;\n }\n if (options.defaultValue !== undefined) {\n return options.defaultValue as unknown as TValue;\n }\n if (fullKey) {\n recordMissingField(fullKey);\n }\n return getPlaceholderForType(typeId, fullKey) as TValue;\n }\n\n // Astro component execution: ($$result, $$props, $$slots)\n return componentFactory(arg0, rest[0], rest[1]);\n };\n\n Object.assign(fn, {\n isAstroComponentFactory: true,\n typeId,\n publicName,\n prefix,\n defaultKey,\n });\n\n return fn as unknown as DualCallableHelper<TValue, TDefault>;\n}\n\nexport function generateAllFieldHelpers(prefix = ''): FieldHelpersMap {\n const helpers: Record<string, DualCallableHelper<unknown, unknown>> = {};\n const types = listFieldTypes();\n\n for (const def of types) {\n helpers[def.id] = createDualCallableHelper(def.id, def.id, prefix);\n if (def.aliases) {\n for (const alias of def.aliases) {\n helpers[alias] = createDualCallableHelper(def.id, alias, prefix);\n }\n }\n }\n\n return helpers as unknown as FieldHelpersMap;\n}\n\nexport const createFieldHelpersMap = generateAllFieldHelpers;\n","import type { z } from '@407dev/blocks';\nimport { getFieldType, listFieldTypes } from '@407dev/field-types';\nimport {\n createComponent,\n markHTMLString,\n renderTemplate,\n spreadAttributes,\n} from 'astro/runtime/server/index.js';\nimport { renderRichTextHtml } from '../richtext/render';\nimport { getActiveBundle } from '../runtime/store';\nimport { cmsEntryAttr } from './attrs';\nimport { getPlaceholderForType } from './helpers';\nimport type {\n CollectionHandle,\n DualCallableHelper,\n FieldComponentProps,\n FieldReadOptions,\n} from './types';\n\nconst DEFAULT_TAGS: Record<string, string> = {\n text: 'span',\n number: 'span',\n toggle: 'span',\n select: 'span',\n image: 'img',\n img: 'img',\n video: 'video',\n vid: 'video',\n richtext: 'div',\n richText: 'div',\n};\n\nfunction getNestedValue(obj: unknown, path: string): unknown {\n if (!obj || typeof obj !== 'object' || !path) return undefined;\n if (path in (obj as Record<string, unknown>)) {\n return (obj as Record<string, unknown>)[path];\n }\n const parts = path.split('.');\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nexport function createEntryDualCallableHelper<TValue = unknown, TDefault = TValue>(\n typeId: string,\n publicName: string,\n collectionKey: string,\n slug: string,\n defaultPath = '',\n): DualCallableHelper<TValue, TDefault> {\n const typeDef = getFieldType(typeId) || getFieldType(publicName);\n const defaultTag =\n DEFAULT_TAGS[typeId] || DEFAULT_TAGS[publicName] || typeDef?.renderHint?.tag || 'span';\n\n // biome-ignore lint/suspicious/noExplicitAny: Astro runtime internal component factory\n const componentFactory = createComponent(async ($$result: any, $$props: any, _slots: any) => {\n const rawPath = ($$props?.k ?? $$props?.key ?? defaultPath) as string;\n const tag = ($$props?.as || $$props?.tag || defaultTag) as string;\n const defaultValue = $$props?.defaultValue as TDefault | undefined;\n\n const bundle = getActiveBundle();\n const entries = bundle?.entries?.[collectionKey] || [];\n const entry = entries.find((e) => e.slug === slug);\n const rawVal = entry?.content ? getNestedValue(entry.content, rawPath) : undefined;\n\n let displayVal: unknown = rawVal;\n if (displayVal === undefined || displayVal === null) {\n if (defaultValue !== undefined) {\n displayVal = defaultValue;\n } else {\n displayVal = getPlaceholderForType(typeId, rawPath);\n }\n }\n\n const {\n k: _k,\n key: _key,\n defaultValue: _def,\n as: _as,\n tag: _tag,\n components: _comp,\n ...htmlProps\n } = ($$props || {}) as FieldComponentProps<TDefault>;\n\n const attrs: Record<string, unknown> = {\n ...htmlProps,\n };\n if (rawPath) {\n attrs['data-cms-entry-field'] = rawPath;\n }\n if (!attrs['data-cms-kind']) {\n attrs['data-cms-kind'] = typeId;\n }\n\n if (typeId === 'image' || publicName === 'img') {\n if (displayVal && typeof displayVal === 'object') {\n const asset = displayVal as {\n url?: string;\n alt?: string;\n width?: number;\n height?: number;\n };\n if (asset.url && !attrs.src) attrs.src = asset.url;\n if (asset.alt && !attrs.alt) attrs.alt = asset.alt;\n if (asset.width && !attrs.width) attrs.width = asset.width;\n if (asset.height && !attrs.height) attrs.height = asset.height;\n } else if (typeof displayVal === 'string' && displayVal) {\n if (!attrs.src) attrs.src = displayVal;\n }\n\n return renderTemplate`<img${spreadAttributes(attrs)}>`;\n }\n\n if (typeId === 'video' || publicName === 'vid') {\n if (displayVal && typeof displayVal === 'object') {\n const asset = displayVal as {\n url?: string;\n poster?: string;\n width?: number;\n height?: number;\n };\n if (asset.url && !attrs.src) attrs.src = asset.url;\n if (asset.poster && !attrs.poster) attrs.poster = asset.poster;\n if (asset.width && !attrs.width) attrs.width = asset.width;\n if (asset.height && !attrs.height) attrs.height = asset.height;\n } else if (typeof displayVal === 'string' && displayVal) {\n if (!attrs.src) attrs.src = displayVal;\n }\n if (attrs.controls === undefined) attrs.controls = true;\n\n return renderTemplate`<video${spreadAttributes(attrs)}></video>`;\n }\n\n if (typeId === 'richtext' || publicName === 'richText') {\n const html = renderRichTextHtml(displayVal, { components: $$props?.components });\n return renderTemplate`<${tag}${spreadAttributes(attrs)}>${markHTMLString(html)}</${tag}>`;\n }\n\n return renderTemplate`<${tag}${spreadAttributes(attrs)}>${\n displayVal !== null && displayVal !== undefined ? String(displayVal) : ''\n }</${tag}>`;\n });\n\n const fn = (arg0?: unknown, ...rest: unknown[]): unknown => {\n const isComponentCall =\n arg0 &&\n typeof arg0 === 'object' &&\n 'styles' in (arg0 as Record<string, unknown>) &&\n 'scripts' in (arg0 as Record<string, unknown>);\n\n if (!isComponentCall) {\n let rawPath = defaultPath;\n let options: FieldReadOptions<TDefault> = {};\n\n if (typeof arg0 === 'string') {\n rawPath = arg0;\n options = (rest[0] || {}) as FieldReadOptions<TDefault>;\n } else if (arg0 && typeof arg0 === 'object') {\n options = arg0 as FieldReadOptions<TDefault>;\n }\n\n const bundle = getActiveBundle();\n const entries = bundle?.entries?.[collectionKey] || [];\n const entry = entries.find((e) => e.slug === slug);\n const val = entry?.content ? getNestedValue(entry.content, rawPath) : undefined;\n\n if (val !== undefined && val !== null) {\n return val as TValue;\n }\n if (options.defaultValue !== undefined) {\n return options.defaultValue as unknown as TValue;\n }\n return getPlaceholderForType(typeId, rawPath) as TValue;\n }\n\n return componentFactory(arg0, rest[0], rest[1]);\n };\n\n Object.assign(fn, {\n isAstroComponentFactory: true,\n typeId,\n publicName,\n collectionKey,\n slug,\n defaultPath,\n });\n\n return fn as unknown as DualCallableHelper<TValue, TDefault>;\n}\n\nexport type EntryScopeAccessor = {\n attrs(): { 'data-cms-collection': string; 'data-cms-entry'?: string };\n collectionKey: string;\n slug: string;\n text: DualCallableHelper<string>;\n number: DualCallableHelper<number>;\n toggle: DualCallableHelper<boolean>;\n select: DualCallableHelper<string>;\n img: DualCallableHelper<unknown>;\n image: DualCallableHelper<unknown>;\n richText: DualCallableHelper<unknown>;\n richtext: DualCallableHelper<unknown>;\n // biome-ignore lint/suspicious/noExplicitAny: generic index signature for arbitrary entry helpers\n [key: string]: any;\n};\n\nexport function createEntryScope(\n handleOrKey: CollectionHandle<z.ZodTypeAny> | string,\n slug: string,\n): EntryScopeAccessor {\n const collectionKey = typeof handleOrKey === 'string' ? handleOrKey : handleOrKey.key;\n\n const boundHelpers: Record<string, DualCallableHelper<unknown, unknown>> = {};\n const types = listFieldTypes();\n\n for (const def of types) {\n boundHelpers[def.id] = createEntryDualCallableHelper(def.id, def.id, collectionKey, slug);\n if (def.aliases) {\n for (const alias of def.aliases) {\n boundHelpers[alias] = createEntryDualCallableHelper(def.id, alias, collectionKey, slug);\n }\n }\n }\n\n const accessor = {\n ...boundHelpers,\n attrs: () => cmsEntryAttr(collectionKey, slug),\n collectionKey,\n slug,\n };\n\n return accessor as EntryScopeAccessor;\n}\n\nexport const entryScope = createEntryScope;\n","import { cmsGroupAttr } from './attrs';\nimport { createDualCallableHelper } from './helpers';\nimport type { BoundGroupAccessor, DualCallableHelper, GroupDefinition } from './types';\n\nexport function defineGroup<TShape extends Record<string, unknown>>(\n nameOrShape: string | TShape,\n shapeOrUndefined?: TShape,\n): GroupDefinition<TShape> {\n const groupName = typeof nameOrShape === 'string' ? nameOrShape : 'Group';\n const shape = (typeof nameOrShape === 'string' ? shapeOrUndefined || {} : nameOrShape) as TShape;\n\n const groupDef = (scopeKey: string): BoundGroupAccessor<TShape> => {\n const accessorFn = (key: string): string => {\n return scopeKey ? `${scopeKey}.${key}` : key;\n };\n\n const boundHelpers: Record<string, DualCallableHelper<unknown, unknown>> = {};\n\n for (const [key, helperDef] of Object.entries(shape)) {\n const helperObj = helperDef as Record<string, unknown> | undefined;\n const typeId = (helperObj?.typeId as string) || (helperObj?.publicName as string);\n\n if (!typeId) {\n throw new Error(\n `f.group('${groupName}', ...) field '${key}' must reference a field helper (e.g. f.text, f.img), got ${typeof helperDef}`,\n );\n }\n\n const publicName = (helperObj?.publicName as string) || typeId;\n boundHelpers[key] = createDualCallableHelper(typeId, publicName, scopeKey, key);\n }\n\n Object.assign(accessorFn, boundHelpers, {\n attrs: (): { 'data-cms-group': string } => cmsGroupAttr(groupName, scopeKey),\n key: (key: string): string => (scopeKey ? `${scopeKey}.${key}` : key),\n groupName,\n prefix: scopeKey,\n });\n\n return accessorFn as BoundGroupAccessor<TShape>;\n };\n\n Object.assign(groupDef, {\n groupName,\n shape,\n });\n\n return groupDef as unknown as GroupDefinition<TShape>;\n}\n\nexport const group = defineGroup;\n","import { generateAllFieldHelpers } from './helpers';\nimport type { FieldScope } from './types';\n\nexport function createScope(prefix = ''): FieldScope {\n const helpers = generateAllFieldHelpers(prefix);\n\n const scopeFn = (key: string): string => {\n return prefix ? `${prefix}.${key}` : key;\n };\n\n Object.assign(scopeFn, helpers, {\n key: (key: string): string => (prefix ? `${prefix}.${key}` : key),\n scope: (subPrefix: string): FieldScope => {\n const nextPrefix = prefix ? `${prefix}.${subPrefix}` : subPrefix;\n return createScope(nextPrefix);\n },\n prefix,\n });\n\n return scopeFn as unknown as FieldScope;\n}\n","import { collectionPaths, defineCollection, getEntries, getEntry } from './collection';\nimport { createEntryScope, entryScope } from './entryScope';\nimport { defineGroup } from './group';\nimport { createFieldHelpersMap } from './helpers';\nimport { createScope } from './scope';\nimport type { FieldHelpersMap } from './types';\n\nconst baseHelpers = createFieldHelpersMap('');\n\nexport type CmsF = FieldHelpersMap & {\n scope: typeof createScope;\n entryScope: typeof createEntryScope;\n group: typeof defineGroup;\n entries: typeof getEntries;\n entry: typeof getEntry;\n defineCollection: typeof defineCollection;\n collectionPaths: typeof collectionPaths;\n};\n\nexport const f: CmsF = {\n ...baseHelpers,\n scope: createScope,\n entryScope: createEntryScope,\n group: defineGroup,\n entries: getEntries,\n entry: getEntry,\n defineCollection,\n collectionPaths,\n};\n\nexport {\n defineCollection,\n collectionPaths,\n getEntries,\n getEntry,\n defineGroup,\n createScope,\n createEntryScope,\n entryScope,\n};\n\nexport { z } from '@407dev/blocks';\n\nexport * from './attrs';\nexport * from './entryScope';\nexport * from './types';\n","import type { CmsAsset } from '@407dev/blocks';\nimport type { CmsSiteConfig, RouteSeo } from './types';\n\nexport interface HeadTag {\n tag: 'title' | 'meta' | 'link';\n attrs?: Record<string, string>;\n content?: string;\n}\n\nexport interface BuildHeadTagsOptions {\n siteUrl?: string;\n}\n\nexport interface HeadRouteInput {\n path?: string;\n pattern?: string;\n title?: string;\n seo?: RouteSeo;\n [key: string]: unknown;\n}\n\n/**\n * Pure function building an array of head tag descriptors from route and site config.\n * Merges site_settings.default_seo underneath routes.seo overrides.\n */\nexport function buildHeadTags(\n route?: HeadRouteInput | null,\n siteConfig?: CmsSiteConfig | null,\n options?: BuildHeadTagsOptions,\n): HeadTag[] {\n const tags: HeadTag[] = [];\n const defaultSeo: RouteSeo = siteConfig?.default_seo || {};\n const routeSeo: RouteSeo = (route?.seo || {}) as RouteSeo;\n\n // Title\n const title = routeSeo.title || defaultSeo.title || route?.title || '';\n if (title) {\n tags.push({ tag: 'title', content: title });\n }\n\n // Description\n const description = routeSeo.description || defaultSeo.description;\n if (description) {\n tags.push({\n tag: 'meta',\n attrs: { name: 'description', content: description },\n });\n }\n\n // Canonical URL\n const siteUrl = options?.siteUrl ? options.siteUrl.replace(/\\/+$/, '') : '';\n let canonical = routeSeo.canonical || defaultSeo.canonical;\n if (!canonical && siteUrl && route?.path) {\n const normPath =\n route.path === '/' ? '' : route.path.startsWith('/') ? route.path : `/${route.path}`;\n canonical = `${siteUrl}${normPath}`;\n }\n if (canonical) {\n tags.push({\n tag: 'link',\n attrs: { rel: 'canonical', href: canonical },\n });\n }\n\n // Robots Noindex\n if (routeSeo.noindex || defaultSeo.noindex) {\n tags.push({\n tag: 'meta',\n attrs: { name: 'robots', content: 'noindex, nofollow' },\n });\n }\n\n // Open Graph\n const ogTitle =\n routeSeo.og_title || routeSeo.title || defaultSeo.og_title || defaultSeo.title || route?.title;\n if (ogTitle) {\n tags.push({\n tag: 'meta',\n attrs: { property: 'og:title', content: ogTitle },\n });\n }\n\n const ogDescription =\n routeSeo.og_description ||\n routeSeo.description ||\n defaultSeo.og_description ||\n defaultSeo.description;\n if (ogDescription) {\n tags.push({\n tag: 'meta',\n attrs: { property: 'og:description', content: ogDescription },\n });\n }\n\n const rawOgImage = routeSeo.og_image || defaultSeo.og_image;\n const ogImageUrl =\n typeof rawOgImage === 'object' && rawOgImage !== null && 'url' in rawOgImage\n ? (rawOgImage as CmsAsset).url\n : (rawOgImage as string | undefined);\n\n if (ogImageUrl) {\n tags.push({\n tag: 'meta',\n attrs: { property: 'og:image', content: ogImageUrl },\n });\n }\n\n if (canonical) {\n tags.push({\n tag: 'meta',\n attrs: { property: 'og:url', content: canonical },\n });\n }\n\n // Twitter\n const twitterCard = routeSeo.twitter_card || defaultSeo.twitter_card || 'summary_large_image';\n tags.push({\n tag: 'meta',\n attrs: { name: 'twitter:card', content: twitterCard },\n });\n\n return tags;\n}\n","export interface ImageTransformOptions {\n width?: number;\n height?: number;\n format?: string;\n fit?: 'scale-down' | 'contain' | 'cover' | 'crop' | 'pad' | string;\n quality?: number;\n}\n\n/**\n * Determines whether a URL is hosted on a zone domain eligible for /cdn-cgi/image transforms.\n * Non-zone URLs (*.r2.dev, localhost, relative paths, data/blob URLs) return false.\n */\nexport function isCdnTransformableUrl(url: string): boolean {\n if (!url || typeof url !== 'string') return false;\n if (url.startsWith('data:') || url.startsWith('blob:')) return false;\n if (url.includes('localhost') || url.includes('127.0.0.1') || url.includes('.r2.dev')) {\n return false;\n }\n return url.startsWith('http://') || url.startsWith('https://');\n}\n\n/**\n * Builds a Cloudflare /cdn-cgi/image/... transform URL.\n * Automatically degrades to the raw source URL for non-transformable hostnames.\n */\nexport function buildCdnImageUrl(url: string, options: ImageTransformOptions = {}): string {\n if (!isCdnTransformableUrl(url)) {\n return url;\n }\n\n const params: string[] = [];\n if (options.width !== undefined && options.width !== null) {\n params.push(`width=${options.width}`);\n }\n if (options.height !== undefined && options.height !== null) {\n params.push(`height=${options.height}`);\n }\n\n params.push(`format=${options.format || 'auto'}`);\n\n if (options.fit) {\n params.push(`fit=${options.fit}`);\n }\n if (options.quality !== undefined && options.quality !== null) {\n params.push(`quality=${options.quality}`);\n }\n\n const optionString = params.join(',');\n return `/cdn-cgi/image/${optionString}/${url}`;\n}\n\n/**\n * Generates an HTML srcset string with Cloudflare /cdn-cgi/image transforms for specified widths.\n */\nexport function buildSrcSet(\n url: string,\n widths: number[] = [400, 800, 1200, 1600],\n options: Omit<ImageTransformOptions, 'width'> = {},\n): string {\n if (!url) return '';\n if (!isCdnTransformableUrl(url)) return '';\n\n return widths.map((w) => `${buildCdnImageUrl(url, { ...options, width: w })} ${w}w`).join(', ');\n}\n","export const CMS_TOOLBAR_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"/>\n <path d=\"M4 10h16\"/>\n <path d=\"M10 4v16\"/>\n</svg>`;\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { AstroIntegration } from 'astro';\nimport { getClient, initCmsClient } from './client';\nimport { mintDevPreviewToken } from './dev/preview-token';\nimport { buildBridgeScript } from './preview/bridge-script';\nimport { markBundleReady } from './runtime/bundle';\nimport { clearMissingFieldWarnings, getMissingFieldWarnings } from './runtime/store';\nimport { CMS_TOOLBAR_ICON } from './toolbar/icon';\nimport type { CmsAstroOptions } from './types';\n\nfunction deriveRouteFromComponent(componentPath: string): string {\n let route = componentPath\n .replace(/\\\\/g, '/')\n .replace(/^.*src\\/pages\\/?/, '/')\n .replace(/\\.(astro|mdx|md|ts|js|jsx|tsx)$/, '')\n .replace(/\\/index$/, '');\n if (!route.startsWith('/')) {\n route = `/${route}`;\n }\n return route === '' ? '/' : route;\n}\n\nexport function cmsAstro(options: CmsAstroOptions = {}): AstroIntegration {\n return {\n name: '@407dev/cms-astro',\n hooks: {\n 'astro:config:setup': async ({\n updateConfig,\n command,\n injectScript,\n addMiddleware,\n addDevToolbarApp,\n logger,\n }) => {\n // Register preview middleware\n addMiddleware({\n entrypoint: '@407dev/cms-astro/middleware',\n order: 'pre',\n });\n\n // Initialize client singleton\n if (options.client) {\n initCmsClient({ client: options.client });\n } else {\n initCmsClient({\n siteId: options.siteId,\n contentUrl: options.contentUrl,\n previewSecret: options.previewSecret,\n });\n }\n\n // Register environment variables\n const effectiveSiteId = options.siteId || process.env.CMS_SITE_ID || '';\n const effectiveContentUrl = options.contentUrl || process.env.CMS_CONTENT_URL || '';\n const effectivePreviewSecret =\n options.previewSecret || process.env.CMS_PREVIEW_SECRET || '';\n\n if (command !== 'dev' && (options.previewSecret || process.env.CMS_PREVIEW_SECRET)) {\n logger.warn(\n 'previewSecret and CMS_PREVIEW_SECRET are deprecated and ignored outside astro dev. Site hosts no longer verify preview tokens.',\n );\n }\n\n if (effectiveContentUrl || effectiveSiteId) {\n updateConfig({\n vite: {\n define: {\n 'import.meta.env.CMS_CONTENT_URL': JSON.stringify(effectiveContentUrl),\n 'import.meta.env.CMS_SITE_ID': JSON.stringify(effectiveSiteId),\n },\n },\n });\n }\n\n // In dev, inject full bridge script and dev toolbar\n if (command === 'dev') {\n injectScript(\n 'page',\n buildBridgeScript({\n editorOrigins: options.editorOrigins,\n }),\n );\n\n const devModulePath = './dev/index.js';\n const { resolveDevConfig, createVerifier, cmsDevApiPlugin } = await import(\n /* @vite-ignore */ devModulePath\n );\n\n const devConfig = await resolveDevConfig({\n siteId: options.siteId,\n apiUrl: options.apiUrl,\n siteDir: process.cwd(),\n });\n\n if (devConfig.status === 'refused') {\n logger.error(`CMS dev routes disabled: ${devConfig.reason}`);\n }\n if (devConfig.status === 'read-only') {\n logger.warn(\n `CMS dev toolbar is READ-ONLY: ${devConfig.mismatch?.source} (${devConfig.mismatch?.actual}) ≠ site rendered (${devConfig.mismatch?.expected})`,\n );\n }\n\n const verifier = await createVerifier({\n siteDir: process.cwd(),\n siteId: devConfig.siteId,\n });\n\n addDevToolbarApp({\n id: 'cms-content',\n name: 'CMS Content',\n icon: CMS_TOOLBAR_ICON,\n entrypoint: fileURLToPath(new URL('./toolbar/app.js', import.meta.url)),\n });\n\n updateConfig({\n vite: {\n plugins: [\n cmsDevApiPlugin({\n devConfig,\n client: getClient(),\n verifier,\n previewSecret: effectivePreviewSecret,\n editorOrigins: options.editorOrigins,\n }),\n ],\n },\n });\n }\n\n // Fetch bundle once on setup/build and write to .cms/bundle.json\n const activeClient = getClient();\n if (activeClient) {\n try {\n // Dev serves draft content; self-mint a preview token from the shared secret\n // since the content-worker's draft endpoint still requires one (token rules unchanged).\n const devPreviewToken =\n command === 'dev'\n ? await mintDevPreviewToken(activeClient.siteId, effectivePreviewSecret)\n : null;\n\n const bundle = await activeClient.getBundle(\n devPreviewToken ? { previewToken: devPreviewToken } : undefined,\n );\n markBundleReady(bundle);\n\n const cmsDir = path.resolve(process.cwd(), '.cms');\n if (!fs.existsSync(cmsDir)) {\n fs.mkdirSync(cmsDir, { recursive: true });\n }\n fs.writeFileSync(\n path.join(cmsDir, 'bundle.json'),\n JSON.stringify(bundle, null, 2),\n 'utf-8',\n );\n } catch {\n // Fail gracefully if fetch fails\n }\n }\n },\n\n 'astro:routes:resolved': async ({ routes }) => {\n try {\n const cmsDir = path.resolve(process.cwd(), '.cms');\n if (!fs.existsSync(cmsDir)) {\n fs.mkdirSync(cmsDir, { recursive: true });\n }\n\n const serializedRoutes = routes.map(\n (r: {\n route?: string;\n pathname?: string;\n component?: string;\n entrypoint?: string;\n type?: string;\n params?: string[];\n }) => {\n const comp = r.component || r.entrypoint || '';\n let routePattern = r.route || r.pathname || '';\n if (!routePattern && comp) {\n routePattern = deriveRouteFromComponent(comp);\n }\n return {\n route: routePattern,\n component: comp,\n type: r.type || 'page',\n params: r.params || [],\n };\n },\n );\n\n fs.writeFileSync(\n path.join(cmsDir, 'routes.json'),\n JSON.stringify(serializedRoutes, null, 2),\n 'utf-8',\n );\n } catch {\n // Ignore if .cms directory write fails\n }\n },\n\n 'astro:build:done': async ({ logger }) => {\n // Report missing field warnings recorded during SSG\n const missing = getMissingFieldWarnings();\n if (missing.length > 0) {\n logger.warn(\n `CMS Build Warning: ${missing.length} field(s) were rendered with empty/missing values: ${missing.join(', ')}`,\n );\n clearMissingFieldWarnings();\n }\n },\n },\n };\n}\n\nexport const cms = cmsAstro;\n","import type { CmsClient, ContentBundle } from './types';\n\nexport * from './preview/origins';\n\nexport interface GetPreviewDataOptions {\n previewToken?: string | null;\n client: CmsClient;\n /** @deprecated Site hosts no longer verify preview tokens locally. */\n previewSecret?: string;\n siteId?: string;\n}\n\nexport interface PreviewBundleResult {\n ok: boolean;\n status: number;\n bundle?: ContentBundle;\n error?: string;\n}\n\n/**\n * Retrieves draft content bundle using preview token (verified by content-worker).\n */\nexport async function getPreviewData(options: GetPreviewDataOptions): Promise<PreviewBundleResult> {\n const { previewToken, client } = options;\n\n if (!previewToken) {\n return {\n ok: false,\n status: 404,\n error: 'Preview token is required',\n };\n }\n\n // Fetch draft content bundle from CMS client (verified by content-worker)\n try {\n const bundle = await client.getBundle({ previewToken });\n return {\n ok: true,\n status: 200,\n bundle,\n };\n } catch (_err) {\n return {\n ok: false,\n status: 404,\n error: 'Preview token is not valid for this site',\n };\n }\n}\n","import type { CmsRedirect, CmsSiteConfig } from './types';\n\n/**\n * Renders Cloudflare Pages _redirects file content from redirect definitions.\n */\nexport function renderRedirectsFile(redirects: CmsRedirect[] = []): string {\n const lines = redirects\n .filter((r) => r.enabled !== false && r.from_path && r.to_path)\n .map((r) => `${r.from_path} ${r.to_path} ${r.status_code || 301}`);\n\n return lines.length > 0 ? `${lines.join('\\n')}\\n` : '';\n}\n\nexport interface RenderRobotsOptions {\n siteUrl?: string;\n}\n\n/**\n * Renders robots.txt content from site settings.\n */\nexport function renderRobotsTxt(\n config?: CmsSiteConfig | null,\n options?: RenderRobotsOptions,\n): string {\n if (config?.robots?.raw) {\n return `${config.robots.raw.trim()}\\n`;\n }\n\n const lines: string[] = [];\n const rules = config?.robots?.rules || [{ user_agent: '*', allow: ['/'] }];\n\n for (const rule of rules) {\n lines.push(`User-agent: ${rule.user_agent || '*'}`);\n if (rule.allow && rule.allow.length > 0) {\n for (const path of rule.allow) {\n lines.push(`Allow: ${path}`);\n }\n }\n if (rule.disallow && rule.disallow.length > 0) {\n for (const path of rule.disallow) {\n lines.push(`Disallow: ${path}`);\n }\n }\n lines.push('');\n }\n\n const siteUrl = options?.siteUrl ? options.siteUrl.replace(/\\/+$/, '') : '';\n if (siteUrl && config?.robots?.sitemap !== false) {\n lines.push(`Sitemap: ${siteUrl}/sitemap.xml`);\n }\n\n return `${lines.join('\\n').trim()}\\n`;\n}\n\nexport interface RenderSitemapOptions {\n siteUrl: string;\n siteConfig?: CmsSiteConfig | null;\n}\n\nexport interface SitemapRouteItem {\n id?: string;\n path?: string;\n pattern?: string;\n published_at?: string;\n updated_at?: string;\n seo?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/**\n * Renders sitemap.xml content from routes and site config.\n * Excludes noindex routes and the 404 route.\n */\nexport function renderSitemapXml(\n routes: SitemapRouteItem[],\n options: RenderSitemapOptions,\n): string {\n const siteUrl = options.siteUrl.replace(/\\/+$/, '');\n const config = options.siteConfig;\n const excludes = new Set(config?.sitemap?.exclude || []);\n\n if (config?.not_found_path) {\n excludes.add(config.not_found_path);\n }\n\n const filtered = routes.filter((r) => {\n if ((r.path && excludes.has(r.path)) || (r.id && excludes.has(r.id))) {\n return false;\n }\n if ('seo' in r && r.seo && typeof r.seo === 'object') {\n const seoObj = r.seo as { noindex?: boolean };\n if (seoObj.noindex) {\n return false;\n }\n }\n return true;\n });\n\n const urlEntries = filtered.map((r) => {\n const rawPath = r.path || '/';\n const normPath = rawPath.startsWith('/') ? rawPath : `/${rawPath}`;\n const loc = `${siteUrl}${normPath}`;\n const dateStr =\n ('published_at' in r && r.published_at) || r.updated_at || new Date().toISOString();\n const lastmod = dateStr.split('T')[0];\n\n return ` <url>\\n <loc>${loc}</loc>\\n <lastmod>${lastmod}</lastmod>\\n </url>`;\n });\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n${urlEntries.join('\\n')}\\n</urlset>\\n`;\n}\n"]}
1
+ {"version":3,"sources":["../src/richtext/render.ts","../src/fields/helpers.ts","../src/fields/entryScope.ts","../src/fields/group.ts","../src/fields/scope.ts","../src/fields/index.ts","../src/head.ts","../src/image.ts","../src/toolbar/icon.ts","../src/integration.ts","../src/preview.ts","../src/siteFiles.ts"],"names":["DEFAULT_TAGS","path","getFieldType","createComponent","renderTemplate","spreadAttributes","markHTMLString","listFieldTypes"],"mappings":"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","file":"index.js","sourcesContent":["import { isValidLinkHref } from '@407dev/field-types';\n\nexport interface RichTextRenderOptions {\n components?: Record<string, unknown>;\n maxDepth?: number;\n}\n\nexport function escapeHtml(str: string): string {\n if (typeof str !== 'string') return '';\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;');\n}\n\nexport const KNOWN_NODES = new Set([\n 'doc',\n 'paragraph',\n 'heading',\n 'bulletList',\n 'orderedList',\n 'listItem',\n 'blockquote',\n 'codeBlock',\n 'hardBreak',\n 'horizontalRule',\n 'text',\n 'image',\n]);\n\nconst KNOWN_MARKS = new Set(['bold', 'italic', 'underline', 'strike', 'code', 'link']);\n\nexport interface RichTextNodeShape {\n type?: string;\n text?: string;\n attrs?: Record<string, unknown>;\n marks?: Array<{ type: string; attrs?: Record<string, unknown> }>;\n content?: unknown[];\n}\n\nexport interface LinkMarkAttrs {\n href: string;\n target?: string;\n rel?: string;\n title?: string;\n}\n\n/** Parses a richtext value (doc object or JSON string) into a doc root, or null if invalid/empty. */\nexport function parseRichTextDoc(value: unknown): { type?: string; content?: unknown[] } | null {\n if (!value) return null;\n let parsed: unknown = value;\n if (typeof value === 'string') {\n try {\n parsed = JSON.parse(value);\n } catch {\n return null;\n }\n }\n if (typeof parsed !== 'object' || parsed === null) return null;\n const root = parsed as { type?: string; content?: unknown[] };\n if (root.type !== 'doc' && !Array.isArray(root.content)) return null;\n return root;\n}\n\n/** Applies non-link marks to escaped text; `link` is resolved separately via getLinkMarkAttrs so callers can swap in a component. */\nexport function renderMarksOnly(\n text: string,\n marks: Array<{ type: string; attrs?: Record<string, unknown> }> | undefined,\n): string {\n let out = escapeHtml(text || '');\n if (!Array.isArray(marks)) return out;\n for (const mark of marks) {\n if (!mark || typeof mark !== 'object' || mark.type === 'link' || !KNOWN_MARKS.has(mark.type)) {\n continue;\n }\n if (mark.type === 'bold') out = `<strong>${out}</strong>`;\n else if (mark.type === 'italic') out = `<em>${out}</em>`;\n else if (mark.type === 'underline') out = `<u>${out}</u>`;\n else if (mark.type === 'strike') out = `<s>${out}</s>`;\n else if (mark.type === 'code') out = `<code>${out}</code>`;\n }\n return out;\n}\n\nexport function getLinkMarkAttrs(\n marks: Array<{ type: string; attrs?: Record<string, unknown> }> | undefined,\n): LinkMarkAttrs | null {\n if (!Array.isArray(marks)) return null;\n const linkMark = marks.find((m) => m && typeof m === 'object' && m.type === 'link');\n if (!linkMark) return null;\n\n const rawHref = linkMark.attrs?.href;\n if (typeof rawHref !== 'string' || !isValidLinkHref(rawHref)) return null;\n\n const target = typeof linkMark.attrs?.target === 'string' ? linkMark.attrs.target : undefined;\n const rel =\n typeof linkMark.attrs?.rel === 'string'\n ? linkMark.attrs.rel\n : target === '_blank'\n ? 'noopener noreferrer'\n : undefined;\n const title = typeof linkMark.attrs?.title === 'string' ? linkMark.attrs.title : undefined;\n\n return { href: rawHref, target, rel, title };\n}\n\nexport function renderRichTextHtml(doc: unknown, options: RichTextRenderOptions = {}): string {\n if (!doc) return '';\n\n let parsedDoc: unknown = doc;\n if (typeof doc === 'string') {\n try {\n parsedDoc = JSON.parse(doc);\n } catch {\n return `<p>${escapeHtml(doc)}</p>`;\n }\n }\n\n if (typeof parsedDoc !== 'object' || parsedDoc === null) {\n return '';\n }\n\n const root = parsedDoc as { type?: string; content?: unknown[] };\n if (root.type !== 'doc' && !Array.isArray(root.content)) {\n return '';\n }\n\n const isDev = typeof process !== 'undefined' && process.env?.NODE_ENV === 'development';\n const maxDepth = options.maxDepth ?? 50;\n\n function renderNode(node: unknown, depth = 0): string {\n if (depth > maxDepth) return '';\n if (!node || typeof node !== 'object') return '';\n\n const n = node as {\n type?: string;\n text?: string;\n attrs?: Record<string, unknown>;\n marks?: Array<{ type: string; attrs?: Record<string, unknown> }>;\n content?: unknown[];\n };\n\n const nodeType = n.type || '';\n if (!KNOWN_NODES.has(nodeType)) {\n if (isDev) {\n console.warn(`[RichText] Skipped unknown node type: \"${nodeType}\"`);\n }\n return '';\n }\n\n if (nodeType === 'text') {\n let text = escapeHtml(n.text || '');\n if (Array.isArray(n.marks)) {\n for (const mark of n.marks) {\n if (!mark || typeof mark !== 'object') continue;\n const markType = mark.type;\n if (!KNOWN_MARKS.has(markType)) {\n if (isDev) {\n console.warn(`[RichText] Skipped unknown mark type: \"${markType}\"`);\n }\n continue;\n }\n\n if (markType === 'bold') {\n text = `<strong>${text}</strong>`;\n } else if (markType === 'italic') {\n text = `<em>${text}</em>`;\n } else if (markType === 'underline') {\n text = `<u>${text}</u>`;\n } else if (markType === 'strike') {\n text = `<s>${text}</s>`;\n } else if (markType === 'code') {\n text = `<code>${text}</code>`;\n } else if (markType === 'link') {\n const rawHref = mark.attrs?.href;\n if (typeof rawHref === 'string' && isValidLinkHref(rawHref)) {\n const href = escapeHtml(rawHref);\n const target =\n typeof mark.attrs?.target === 'string'\n ? ` target=\"${escapeHtml(mark.attrs.target)}\"`\n : '';\n const rel =\n typeof mark.attrs?.rel === 'string'\n ? ` rel=\"${escapeHtml(mark.attrs.rel)}\"`\n : target.includes('_blank')\n ? ' rel=\"noopener noreferrer\"'\n : '';\n text = `<a href=\"${href}\"${target}${rel}>${text}</a>`;\n }\n }\n }\n }\n return text;\n }\n\n const children = Array.isArray(n.content)\n ? n.content.map((c) => renderNode(c, depth + 1)).join('')\n : '';\n\n switch (nodeType) {\n case 'doc':\n return children;\n case 'paragraph':\n return `<p>${children}</p>`;\n case 'heading': {\n const rawLevel = n.attrs?.level;\n const level = typeof rawLevel === 'number' && rawLevel >= 1 && rawLevel <= 6 ? rawLevel : 2;\n return `<h${level}>${children}</h${level}>`;\n }\n case 'bulletList':\n return `<ul>${children}</ul>`;\n case 'orderedList': {\n const start = n.attrs?.start || n.attrs?.order;\n const startAttr = typeof start === 'number' && start !== 1 ? ` start=\"${start}\"` : '';\n return `<ol${startAttr}>${children}</ol>`;\n }\n case 'listItem':\n return `<li>${children}</li>`;\n case 'blockquote':\n return `<blockquote>${children}</blockquote>`;\n case 'codeBlock': {\n const lang =\n typeof n.attrs?.language === 'string'\n ? ` data-language=\"${escapeHtml(n.attrs.language)}\"`\n : '';\n return `<pre><code${lang}>${children}</code></pre>`;\n }\n case 'hardBreak':\n return '<br />';\n case 'horizontalRule':\n return '<hr />';\n case 'image': {\n if (options.components?.image) {\n const src = typeof n.attrs?.src === 'string' ? escapeHtml(n.attrs.src) : '';\n const alt = typeof n.attrs?.alt === 'string' ? escapeHtml(n.attrs.alt) : '';\n return `<img src=\"${src}\" alt=\"${alt}\" />`;\n }\n return '';\n }\n default:\n return children;\n }\n }\n\n return renderNode(root);\n}\n","import { getFieldType, listFieldTypes } from '@407dev/field-types';\nimport {\n createComponent,\n markHTMLString,\n renderTemplate,\n spreadAttributes,\n} from 'astro/runtime/server/index.js';\nimport { renderRichTextHtml } from '../richtext/render';\nimport { getActiveBundle, recordMissingField } from '../runtime/store';\nimport type {\n DualCallableHelper,\n FieldComponentProps,\n FieldHelpersMap,\n FieldReadOptions,\n} from './types';\n\nconst DEFAULT_TAGS: Record<string, string> = {\n text: 'span',\n number: 'span',\n toggle: 'span',\n select: 'span',\n image: 'img',\n img: 'img',\n video: 'video',\n vid: 'video',\n richtext: 'div',\n richText: 'div',\n};\n\nexport function getPlaceholderForType(typeId: string, fullKey: string): unknown {\n const isDev = typeof process !== 'undefined' && process.env?.NODE_ENV === 'development';\n if (isDev) {\n return `[${fullKey}]`;\n }\n const typeDef = getFieldType(typeId);\n if (typeDef && typeDef.defaultValue !== undefined) {\n return typeDef.defaultValue;\n }\n switch (typeId) {\n case 'number':\n return 0;\n case 'toggle':\n return false;\n case 'image':\n case 'video':\n return null;\n case 'richtext':\n return null;\n default:\n return '';\n }\n}\n\nexport function createDualCallableHelper<TValue = unknown, TDefault = TValue>(\n typeId: string,\n publicName: string,\n prefix = '',\n defaultKey = '',\n): DualCallableHelper<TValue, TDefault> {\n const typeDef = getFieldType(typeId) || getFieldType(publicName);\n const defaultTag =\n DEFAULT_TAGS[typeId] || DEFAULT_TAGS[publicName] || typeDef?.renderHint?.tag || 'span';\n\n // biome-ignore lint/suspicious/noExplicitAny: Astro runtime internal component factory\n const componentFactory = createComponent(async ($$result: any, $$props: any, _slots: any) => {\n const rawKey = ($$props?.k ?? $$props?.key ?? defaultKey) as string;\n const fullKey = prefix ? (rawKey ? `${prefix}.${rawKey}` : prefix) : rawKey;\n const tag = ($$props?.as || $$props?.tag || defaultTag) as string;\n const defaultValue = $$props?.defaultValue as TDefault | undefined;\n\n const bundle = getActiveBundle();\n const rawVal = fullKey ? bundle?.fields?.[fullKey] : undefined;\n\n let displayVal: unknown = rawVal;\n if (displayVal === undefined || displayVal === null) {\n if (defaultValue !== undefined) {\n displayVal = defaultValue;\n } else {\n if (fullKey) {\n recordMissingField(fullKey);\n }\n displayVal = getPlaceholderForType(typeId, fullKey);\n }\n }\n\n const {\n k: _k,\n key: _key,\n defaultValue: _def,\n as: _as,\n tag: _tag,\n components: _comp,\n ...htmlProps\n } = ($$props || {}) as FieldComponentProps<TDefault>;\n\n const attrs: Record<string, unknown> = {\n ...htmlProps,\n };\n if (fullKey) {\n attrs['data-cms-field'] = fullKey;\n }\n if (!attrs['data-cms-kind']) {\n attrs['data-cms-kind'] = typeId;\n }\n\n if (typeId === 'image' || publicName === 'img') {\n if (displayVal && typeof displayVal === 'object') {\n const asset = displayVal as { url?: string; alt?: string; width?: number; height?: number };\n if (asset.url && !attrs.src) attrs.src = asset.url;\n if (asset.alt && !attrs.alt) attrs.alt = asset.alt;\n if (asset.width && !attrs.width) attrs.width = asset.width;\n if (asset.height && !attrs.height) attrs.height = asset.height;\n } else if (typeof displayVal === 'string' && displayVal) {\n if (!attrs.src) attrs.src = displayVal;\n }\n\n return renderTemplate`<img${spreadAttributes(attrs)}>`;\n }\n\n if (typeId === 'video' || publicName === 'vid') {\n if (displayVal && typeof displayVal === 'object') {\n const asset = displayVal as {\n url?: string;\n poster?: string;\n width?: number;\n height?: number;\n };\n if (asset.url && !attrs.src) attrs.src = asset.url;\n if (asset.poster && !attrs.poster) attrs.poster = asset.poster;\n if (asset.width && !attrs.width) attrs.width = asset.width;\n if (asset.height && !attrs.height) attrs.height = asset.height;\n } else if (typeof displayVal === 'string' && displayVal) {\n if (!attrs.src) attrs.src = displayVal;\n }\n if (attrs.controls === undefined) attrs.controls = true;\n\n return renderTemplate`<video${spreadAttributes(attrs)}></video>`;\n }\n\n if (typeId === 'richtext' || publicName === 'richText') {\n const html = renderRichTextHtml(displayVal, { components: $$props?.components });\n return renderTemplate`<${tag}${spreadAttributes(attrs)}>${markHTMLString(html)}</${tag}>`;\n }\n\n return renderTemplate`<${tag}${spreadAttributes(attrs)}>${displayVal !== null && displayVal !== undefined ? String(displayVal) : ''}</${tag}>`;\n });\n\n const fn = (arg0?: unknown, ...rest: unknown[]): unknown => {\n const isComponentCall =\n arg0 &&\n typeof arg0 === 'object' &&\n 'styles' in (arg0 as Record<string, unknown>) &&\n 'scripts' in (arg0 as Record<string, unknown>);\n\n if (!isComponentCall) {\n // Synchronous read call: f.text('key', opts) or hero.heading(opts)\n let rawKey = defaultKey;\n let options: FieldReadOptions<TDefault> = {};\n\n if (typeof arg0 === 'string') {\n rawKey = arg0;\n options = (rest[0] || {}) as FieldReadOptions<TDefault>;\n } else if (arg0 && typeof arg0 === 'object') {\n options = arg0 as FieldReadOptions<TDefault>;\n }\n\n const fullKey = prefix ? (rawKey ? `${prefix}.${rawKey}` : prefix) : rawKey;\n const bundle = getActiveBundle();\n const val = fullKey ? bundle?.fields?.[fullKey] : undefined;\n\n if (val !== undefined && val !== null) {\n return val as TValue;\n }\n if (options.defaultValue !== undefined) {\n return options.defaultValue as unknown as TValue;\n }\n if (fullKey) {\n recordMissingField(fullKey);\n }\n return getPlaceholderForType(typeId, fullKey) as TValue;\n }\n\n // Astro component execution: ($$result, $$props, $$slots)\n return componentFactory(arg0, rest[0], rest[1]);\n };\n\n Object.assign(fn, {\n isAstroComponentFactory: true,\n typeId,\n publicName,\n prefix,\n defaultKey,\n });\n\n return fn as unknown as DualCallableHelper<TValue, TDefault>;\n}\n\nexport function generateAllFieldHelpers(prefix = ''): FieldHelpersMap {\n const helpers: Record<string, DualCallableHelper<unknown, unknown>> = {};\n const types = listFieldTypes();\n\n for (const def of types) {\n helpers[def.id] = createDualCallableHelper(def.id, def.id, prefix);\n if (def.aliases) {\n for (const alias of def.aliases) {\n helpers[alias] = createDualCallableHelper(def.id, alias, prefix);\n }\n }\n }\n\n return helpers as unknown as FieldHelpersMap;\n}\n\nexport const createFieldHelpersMap = generateAllFieldHelpers;\n","import type { z } from '@407dev/blocks';\nimport { getFieldType, listFieldTypes } from '@407dev/field-types';\nimport {\n createComponent,\n markHTMLString,\n renderTemplate,\n spreadAttributes,\n} from 'astro/runtime/server/index.js';\nimport { renderRichTextHtml } from '../richtext/render';\nimport { getActiveBundle } from '../runtime/store';\nimport { cmsEntryAttr } from './attrs';\nimport { getPlaceholderForType } from './helpers';\nimport type {\n CollectionHandle,\n DualCallableHelper,\n FieldComponentProps,\n FieldReadOptions,\n} from './types';\n\nconst DEFAULT_TAGS: Record<string, string> = {\n text: 'span',\n number: 'span',\n toggle: 'span',\n select: 'span',\n image: 'img',\n img: 'img',\n video: 'video',\n vid: 'video',\n richtext: 'div',\n richText: 'div',\n};\n\nfunction getNestedValue(obj: unknown, path: string): unknown {\n if (!obj || typeof obj !== 'object' || !path) return undefined;\n if (path in (obj as Record<string, unknown>)) {\n return (obj as Record<string, unknown>)[path];\n }\n const parts = path.split('.');\n let current: unknown = obj;\n for (const part of parts) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return undefined;\n }\n current = (current as Record<string, unknown>)[part];\n }\n return current;\n}\n\nexport function createEntryDualCallableHelper<TValue = unknown, TDefault = TValue>(\n typeId: string,\n publicName: string,\n collectionKey: string,\n slug: string,\n defaultPath = '',\n): DualCallableHelper<TValue, TDefault> {\n const typeDef = getFieldType(typeId) || getFieldType(publicName);\n const defaultTag =\n DEFAULT_TAGS[typeId] || DEFAULT_TAGS[publicName] || typeDef?.renderHint?.tag || 'span';\n\n // biome-ignore lint/suspicious/noExplicitAny: Astro runtime internal component factory\n const componentFactory = createComponent(async ($$result: any, $$props: any, _slots: any) => {\n const rawPath = ($$props?.k ?? $$props?.key ?? defaultPath) as string;\n const tag = ($$props?.as || $$props?.tag || defaultTag) as string;\n const defaultValue = $$props?.defaultValue as TDefault | undefined;\n\n const bundle = getActiveBundle();\n const entries = bundle?.entries?.[collectionKey] || [];\n const entry = entries.find((e) => e.slug === slug);\n const rawVal = entry?.content ? getNestedValue(entry.content, rawPath) : undefined;\n\n let displayVal: unknown = rawVal;\n if (displayVal === undefined || displayVal === null) {\n if (defaultValue !== undefined) {\n displayVal = defaultValue;\n } else {\n displayVal = getPlaceholderForType(typeId, rawPath);\n }\n }\n\n const {\n k: _k,\n key: _key,\n defaultValue: _def,\n as: _as,\n tag: _tag,\n components: _comp,\n ...htmlProps\n } = ($$props || {}) as FieldComponentProps<TDefault>;\n\n const attrs: Record<string, unknown> = {\n ...htmlProps,\n };\n if (rawPath) {\n attrs['data-cms-entry-field'] = rawPath;\n }\n if (!attrs['data-cms-kind']) {\n attrs['data-cms-kind'] = typeId;\n }\n\n if (typeId === 'image' || publicName === 'img') {\n if (displayVal && typeof displayVal === 'object') {\n const asset = displayVal as {\n url?: string;\n alt?: string;\n width?: number;\n height?: number;\n };\n if (asset.url && !attrs.src) attrs.src = asset.url;\n if (asset.alt && !attrs.alt) attrs.alt = asset.alt;\n if (asset.width && !attrs.width) attrs.width = asset.width;\n if (asset.height && !attrs.height) attrs.height = asset.height;\n } else if (typeof displayVal === 'string' && displayVal) {\n if (!attrs.src) attrs.src = displayVal;\n }\n\n return renderTemplate`<img${spreadAttributes(attrs)}>`;\n }\n\n if (typeId === 'video' || publicName === 'vid') {\n if (displayVal && typeof displayVal === 'object') {\n const asset = displayVal as {\n url?: string;\n poster?: string;\n width?: number;\n height?: number;\n };\n if (asset.url && !attrs.src) attrs.src = asset.url;\n if (asset.poster && !attrs.poster) attrs.poster = asset.poster;\n if (asset.width && !attrs.width) attrs.width = asset.width;\n if (asset.height && !attrs.height) attrs.height = asset.height;\n } else if (typeof displayVal === 'string' && displayVal) {\n if (!attrs.src) attrs.src = displayVal;\n }\n if (attrs.controls === undefined) attrs.controls = true;\n\n return renderTemplate`<video${spreadAttributes(attrs)}></video>`;\n }\n\n if (typeId === 'richtext' || publicName === 'richText') {\n const html = renderRichTextHtml(displayVal, { components: $$props?.components });\n return renderTemplate`<${tag}${spreadAttributes(attrs)}>${markHTMLString(html)}</${tag}>`;\n }\n\n return renderTemplate`<${tag}${spreadAttributes(attrs)}>${\n displayVal !== null && displayVal !== undefined ? String(displayVal) : ''\n }</${tag}>`;\n });\n\n const fn = (arg0?: unknown, ...rest: unknown[]): unknown => {\n const isComponentCall =\n arg0 &&\n typeof arg0 === 'object' &&\n 'styles' in (arg0 as Record<string, unknown>) &&\n 'scripts' in (arg0 as Record<string, unknown>);\n\n if (!isComponentCall) {\n let rawPath = defaultPath;\n let options: FieldReadOptions<TDefault> = {};\n\n if (typeof arg0 === 'string') {\n rawPath = arg0;\n options = (rest[0] || {}) as FieldReadOptions<TDefault>;\n } else if (arg0 && typeof arg0 === 'object') {\n options = arg0 as FieldReadOptions<TDefault>;\n }\n\n const bundle = getActiveBundle();\n const entries = bundle?.entries?.[collectionKey] || [];\n const entry = entries.find((e) => e.slug === slug);\n const val = entry?.content ? getNestedValue(entry.content, rawPath) : undefined;\n\n if (val !== undefined && val !== null) {\n return val as TValue;\n }\n if (options.defaultValue !== undefined) {\n return options.defaultValue as unknown as TValue;\n }\n return getPlaceholderForType(typeId, rawPath) as TValue;\n }\n\n return componentFactory(arg0, rest[0], rest[1]);\n };\n\n Object.assign(fn, {\n isAstroComponentFactory: true,\n typeId,\n publicName,\n collectionKey,\n slug,\n defaultPath,\n });\n\n return fn as unknown as DualCallableHelper<TValue, TDefault>;\n}\n\nexport type EntryScopeAccessor = {\n attrs(): { 'data-cms-collection': string; 'data-cms-entry'?: string };\n collectionKey: string;\n slug: string;\n text: DualCallableHelper<string>;\n number: DualCallableHelper<number>;\n toggle: DualCallableHelper<boolean>;\n select: DualCallableHelper<string>;\n img: DualCallableHelper<unknown>;\n image: DualCallableHelper<unknown>;\n richText: DualCallableHelper<unknown>;\n richtext: DualCallableHelper<unknown>;\n // biome-ignore lint/suspicious/noExplicitAny: generic index signature for arbitrary entry helpers\n [key: string]: any;\n};\n\nexport function createEntryScope(\n handleOrKey: CollectionHandle<z.ZodTypeAny> | string,\n slug: string,\n): EntryScopeAccessor {\n const collectionKey = typeof handleOrKey === 'string' ? handleOrKey : handleOrKey.key;\n\n const boundHelpers: Record<string, DualCallableHelper<unknown, unknown>> = {};\n const types = listFieldTypes();\n\n for (const def of types) {\n boundHelpers[def.id] = createEntryDualCallableHelper(def.id, def.id, collectionKey, slug);\n if (def.aliases) {\n for (const alias of def.aliases) {\n boundHelpers[alias] = createEntryDualCallableHelper(def.id, alias, collectionKey, slug);\n }\n }\n }\n\n const accessor = {\n ...boundHelpers,\n attrs: () => cmsEntryAttr(collectionKey, slug),\n collectionKey,\n slug,\n };\n\n return accessor as EntryScopeAccessor;\n}\n\nexport const entryScope = createEntryScope;\n","import { cmsGroupAttr } from './attrs';\nimport { createDualCallableHelper } from './helpers';\nimport type { BoundGroupAccessor, DualCallableHelper, GroupDefinition } from './types';\n\nexport function defineGroup<TShape extends Record<string, unknown>>(\n nameOrShape: string | TShape,\n shapeOrUndefined?: TShape,\n): GroupDefinition<TShape> {\n const groupName = typeof nameOrShape === 'string' ? nameOrShape : 'Group';\n const shape = (typeof nameOrShape === 'string' ? shapeOrUndefined || {} : nameOrShape) as TShape;\n\n const groupDef = (scopeKey: string): BoundGroupAccessor<TShape> => {\n const accessorFn = (key: string): string => {\n return scopeKey ? `${scopeKey}.${key}` : key;\n };\n\n const boundHelpers: Record<string, DualCallableHelper<unknown, unknown>> = {};\n\n for (const [key, helperDef] of Object.entries(shape)) {\n const helperObj = helperDef as Record<string, unknown> | undefined;\n const typeId = (helperObj?.typeId as string) || (helperObj?.publicName as string);\n\n if (!typeId) {\n throw new Error(\n `f.group('${groupName}', ...) field '${key}' must reference a field helper (e.g. f.text, f.img), got ${typeof helperDef}`,\n );\n }\n\n const publicName = (helperObj?.publicName as string) || typeId;\n boundHelpers[key] = createDualCallableHelper(typeId, publicName, scopeKey, key);\n }\n\n Object.assign(accessorFn, boundHelpers, {\n attrs: (): { 'data-cms-group': string } => cmsGroupAttr(groupName, scopeKey),\n key: (key: string): string => (scopeKey ? `${scopeKey}.${key}` : key),\n groupName,\n prefix: scopeKey,\n });\n\n return accessorFn as BoundGroupAccessor<TShape>;\n };\n\n Object.assign(groupDef, {\n groupName,\n shape,\n });\n\n return groupDef as unknown as GroupDefinition<TShape>;\n}\n\nexport const group = defineGroup;\n","import { generateAllFieldHelpers } from './helpers';\nimport type { FieldScope } from './types';\n\nexport function createScope(prefix = ''): FieldScope {\n const helpers = generateAllFieldHelpers(prefix);\n\n const scopeFn = (key: string): string => {\n return prefix ? `${prefix}.${key}` : key;\n };\n\n Object.assign(scopeFn, helpers, {\n key: (key: string): string => (prefix ? `${prefix}.${key}` : key),\n scope: (subPrefix: string): FieldScope => {\n const nextPrefix = prefix ? `${prefix}.${subPrefix}` : subPrefix;\n return createScope(nextPrefix);\n },\n prefix,\n });\n\n return scopeFn as unknown as FieldScope;\n}\n","import {\n collectionAttrs,\n collectionPaths,\n defineCollection,\n getEntries,\n getEntry,\n} from './collection';\nimport { createEntryScope, entryScope } from './entryScope';\nimport { defineGroup } from './group';\nimport { createFieldHelpersMap } from './helpers';\nimport { createScope } from './scope';\nimport type { FieldHelpersMap } from './types';\n\nconst baseHelpers = createFieldHelpersMap('');\n\nexport type CmsF = FieldHelpersMap & {\n scope: typeof createScope;\n entryScope: typeof createEntryScope;\n group: typeof defineGroup;\n entries: typeof getEntries;\n entry: typeof getEntry;\n defineCollection: typeof defineCollection;\n collectionPaths: typeof collectionPaths;\n collectionAttrs: typeof collectionAttrs;\n};\n\nexport const f: CmsF = {\n ...baseHelpers,\n scope: createScope,\n entryScope: createEntryScope,\n group: defineGroup,\n entries: getEntries,\n entry: getEntry,\n defineCollection,\n collectionPaths,\n collectionAttrs,\n};\n\nexport {\n defineCollection,\n collectionPaths,\n collectionAttrs,\n getEntries,\n getEntry,\n defineGroup,\n createScope,\n createEntryScope,\n entryScope,\n};\n\nexport { z } from '@407dev/blocks';\n\nexport * from './attrs';\nexport * from './entryScope';\nexport * from './types';\n","import type { CmsAsset } from '@407dev/blocks';\nimport type { CmsSiteConfig, RouteSeo } from './types';\n\nexport interface HeadTag {\n tag: 'title' | 'meta' | 'link';\n attrs?: Record<string, string>;\n content?: string;\n}\n\nexport interface BuildHeadTagsOptions {\n siteUrl?: string;\n}\n\nexport interface HeadRouteInput {\n path?: string;\n pattern?: string;\n title?: string;\n seo?: RouteSeo;\n [key: string]: unknown;\n}\n\n/**\n * Pure function building an array of head tag descriptors from route and site config.\n * Merges site_settings.default_seo underneath routes.seo overrides.\n */\nexport function buildHeadTags(\n route?: HeadRouteInput | null,\n siteConfig?: CmsSiteConfig | null,\n options?: BuildHeadTagsOptions,\n): HeadTag[] {\n const tags: HeadTag[] = [];\n const defaultSeo: RouteSeo = siteConfig?.default_seo || {};\n const routeSeo: RouteSeo = (route?.seo || {}) as RouteSeo;\n\n // Title\n const title = routeSeo.title || defaultSeo.title || route?.title || '';\n if (title) {\n tags.push({ tag: 'title', content: title });\n }\n\n // Description\n const description = routeSeo.description || defaultSeo.description;\n if (description) {\n tags.push({\n tag: 'meta',\n attrs: { name: 'description', content: description },\n });\n }\n\n // Canonical URL\n const siteUrl = options?.siteUrl ? options.siteUrl.replace(/\\/+$/, '') : '';\n let canonical = routeSeo.canonical || defaultSeo.canonical;\n if (!canonical && siteUrl && route?.path) {\n const normPath =\n route.path === '/' ? '' : route.path.startsWith('/') ? route.path : `/${route.path}`;\n canonical = `${siteUrl}${normPath}`;\n }\n if (canonical) {\n tags.push({\n tag: 'link',\n attrs: { rel: 'canonical', href: canonical },\n });\n }\n\n // Robots Noindex\n if (routeSeo.noindex || defaultSeo.noindex) {\n tags.push({\n tag: 'meta',\n attrs: { name: 'robots', content: 'noindex, nofollow' },\n });\n }\n\n // Open Graph\n const ogTitle =\n routeSeo.og_title || routeSeo.title || defaultSeo.og_title || defaultSeo.title || route?.title;\n if (ogTitle) {\n tags.push({\n tag: 'meta',\n attrs: { property: 'og:title', content: ogTitle },\n });\n }\n\n const ogDescription =\n routeSeo.og_description ||\n routeSeo.description ||\n defaultSeo.og_description ||\n defaultSeo.description;\n if (ogDescription) {\n tags.push({\n tag: 'meta',\n attrs: { property: 'og:description', content: ogDescription },\n });\n }\n\n const rawOgImage = routeSeo.og_image || defaultSeo.og_image;\n const ogImageUrl =\n typeof rawOgImage === 'object' && rawOgImage !== null && 'url' in rawOgImage\n ? (rawOgImage as CmsAsset).url\n : (rawOgImage as string | undefined);\n\n if (ogImageUrl) {\n tags.push({\n tag: 'meta',\n attrs: { property: 'og:image', content: ogImageUrl },\n });\n }\n\n if (canonical) {\n tags.push({\n tag: 'meta',\n attrs: { property: 'og:url', content: canonical },\n });\n }\n\n // Twitter\n const twitterCard = routeSeo.twitter_card || defaultSeo.twitter_card || 'summary_large_image';\n tags.push({\n tag: 'meta',\n attrs: { name: 'twitter:card', content: twitterCard },\n });\n\n return tags;\n}\n","export interface ImageTransformOptions {\n width?: number;\n height?: number;\n format?: string;\n fit?: 'scale-down' | 'contain' | 'cover' | 'crop' | 'pad' | string;\n quality?: number;\n}\n\n/**\n * Determines whether a URL is hosted on a zone domain eligible for /cdn-cgi/image transforms.\n * Non-zone URLs (*.r2.dev, localhost, relative paths, data/blob URLs) return false.\n */\nexport function isCdnTransformableUrl(url: string): boolean {\n if (!url || typeof url !== 'string') return false;\n if (url.startsWith('data:') || url.startsWith('blob:')) return false;\n if (url.includes('localhost') || url.includes('127.0.0.1') || url.includes('.r2.dev')) {\n return false;\n }\n return url.startsWith('http://') || url.startsWith('https://');\n}\n\n/**\n * Builds a Cloudflare /cdn-cgi/image/... transform URL.\n * Automatically degrades to the raw source URL for non-transformable hostnames.\n */\nexport function buildCdnImageUrl(url: string, options: ImageTransformOptions = {}): string {\n if (!isCdnTransformableUrl(url)) {\n return url;\n }\n\n const params: string[] = [];\n if (options.width !== undefined && options.width !== null) {\n params.push(`width=${options.width}`);\n }\n if (options.height !== undefined && options.height !== null) {\n params.push(`height=${options.height}`);\n }\n\n params.push(`format=${options.format || 'auto'}`);\n\n if (options.fit) {\n params.push(`fit=${options.fit}`);\n }\n if (options.quality !== undefined && options.quality !== null) {\n params.push(`quality=${options.quality}`);\n }\n\n const optionString = params.join(',');\n return `/cdn-cgi/image/${optionString}/${url}`;\n}\n\n/**\n * Generates an HTML srcset string with Cloudflare /cdn-cgi/image transforms for specified widths.\n */\nexport function buildSrcSet(\n url: string,\n widths: number[] = [400, 800, 1200, 1600],\n options: Omit<ImageTransformOptions, 'width'> = {},\n): string {\n if (!url) return '';\n if (!isCdnTransformableUrl(url)) return '';\n\n return widths.map((w) => `${buildCdnImageUrl(url, { ...options, width: w })} ${w}w`).join(', ');\n}\n","export const CMS_TOOLBAR_ICON = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z\"/>\n <path d=\"M4 10h16\"/>\n <path d=\"M10 4v16\"/>\n</svg>`;\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { AstroIntegration } from 'astro';\nimport { getClient, initCmsClient } from './client';\nimport { mintDevPreviewToken } from './dev/preview-token';\nimport { buildBridgeScript } from './preview/bridge-script';\nimport { markBundleReady } from './runtime/bundle';\nimport { clearMissingFieldWarnings, getMissingFieldWarnings } from './runtime/store';\nimport { CMS_TOOLBAR_ICON } from './toolbar/icon';\nimport type { CmsAstroOptions, ContentBundle } from './types';\n\nfunction deriveRouteFromComponent(componentPath: string): string {\n let route = componentPath\n .replace(/\\\\/g, '/')\n .replace(/^.*src\\/pages\\/?/, '/')\n .replace(/\\.(astro|mdx|md|ts|js|jsx|tsx)$/, '')\n .replace(/\\/index$/, '');\n if (!route.startsWith('/')) {\n route = `/${route}`;\n }\n return route === '' ? '/' : route;\n}\n\nexport function cmsAstro(options: CmsAstroOptions = {}): AstroIntegration {\n return {\n name: '@407dev/cms-astro',\n hooks: {\n 'astro:config:setup': async ({\n updateConfig,\n command,\n injectScript,\n addMiddleware,\n addDevToolbarApp,\n logger,\n }) => {\n // Register preview middleware\n addMiddleware({\n entrypoint: '@407dev/cms-astro/middleware',\n order: 'pre',\n });\n\n // Initialize client singleton\n if (options.client) {\n initCmsClient({ client: options.client });\n } else {\n initCmsClient({\n siteId: options.siteId,\n contentUrl: options.contentUrl,\n previewSecret: options.previewSecret,\n });\n }\n\n // Register environment variables\n const effectiveSiteId = options.siteId || process.env.CMS_SITE_ID || '';\n const effectiveContentUrl = options.contentUrl || process.env.CMS_CONTENT_URL || '';\n const effectivePreviewSecret =\n options.previewSecret || process.env.CMS_PREVIEW_SECRET || '';\n\n if (command !== 'dev' && (options.previewSecret || process.env.CMS_PREVIEW_SECRET)) {\n logger.warn(\n 'previewSecret and CMS_PREVIEW_SECRET are deprecated and ignored outside astro dev. Site hosts no longer verify preview tokens.',\n );\n }\n\n if (effectiveContentUrl || effectiveSiteId) {\n updateConfig({\n vite: {\n define: {\n 'import.meta.env.CMS_CONTENT_URL': JSON.stringify(effectiveContentUrl),\n 'import.meta.env.CMS_SITE_ID': JSON.stringify(effectiveSiteId),\n },\n },\n });\n }\n\n // In dev, inject full bridge script and dev toolbar\n if (command === 'dev') {\n injectScript(\n 'page',\n buildBridgeScript({\n editorOrigins: options.editorOrigins,\n }),\n );\n\n const devModulePath = './dev/index.js';\n const { resolveDevConfig, createVerifier, cmsDevApiPlugin } = await import(\n /* @vite-ignore */ devModulePath\n );\n\n const devConfig = await resolveDevConfig({\n siteId: options.siteId,\n apiUrl: options.apiUrl,\n siteDir: process.cwd(),\n });\n\n if (devConfig.status === 'refused') {\n logger.error(`CMS dev routes disabled: ${devConfig.reason}`);\n }\n if (devConfig.status === 'read-only') {\n logger.warn(\n `CMS dev toolbar is READ-ONLY: ${devConfig.mismatch?.source} (${devConfig.mismatch?.actual}) ≠ site rendered (${devConfig.mismatch?.expected})`,\n );\n }\n\n const verifier = await createVerifier({\n siteDir: process.cwd(),\n siteId: devConfig.siteId,\n });\n\n addDevToolbarApp({\n id: 'cms-content',\n name: 'CMS Content',\n icon: CMS_TOOLBAR_ICON,\n entrypoint: fileURLToPath(new URL('./toolbar/app.js', import.meta.url)),\n });\n\n updateConfig({\n vite: {\n plugins: [\n cmsDevApiPlugin({\n devConfig,\n client: getClient(),\n verifier,\n previewSecret: effectivePreviewSecret,\n editorOrigins: options.editorOrigins,\n }),\n ],\n },\n });\n }\n\n // Fetch bundle once on setup/build and write to .cms/bundle.json\n const activeClient = getClient();\n if (activeClient) {\n let bundle: ContentBundle | undefined;\n try {\n // Dev serves draft content; self-mint a preview token from the shared secret\n // since the content-worker's draft endpoint still requires one (token rules unchanged).\n const devPreviewToken =\n command === 'dev'\n ? await mintDevPreviewToken(activeClient.siteId, effectivePreviewSecret)\n : null;\n\n bundle = await activeClient.getBundle(\n devPreviewToken ? { previewToken: devPreviewToken } : undefined,\n );\n } catch (err) {\n if (command === 'build') {\n const status = (err as { status?: number })?.status;\n // 404 = nothing published yet; the first build/preview-twin build must still succeed.\n if (status === 404) {\n logger.warn(\n 'CMS bundle not found (no published version yet); building without it.',\n );\n } else if (status !== undefined) {\n throw err;\n } else {\n const url = `${activeClient.contentUrl.replace(/\\/+$/, '')}/content/${activeClient.siteId}/bundle`;\n const message = err instanceof Error ? err.message : String(err);\n throw new Error(\n `Failed to fetch CMS bundle from ${url} (unreachable): ${message}`,\n {\n cause: err,\n },\n );\n }\n }\n // Fail gracefully if fetch fails in dev\n }\n\n if (bundle) {\n markBundleReady(bundle);\n\n const cmsDir = path.resolve(process.cwd(), '.cms');\n fs.mkdirSync(cmsDir, { recursive: true });\n fs.writeFileSync(\n path.join(cmsDir, 'bundle.json'),\n JSON.stringify(bundle, null, 2),\n 'utf-8',\n );\n }\n }\n },\n\n 'astro:routes:resolved': async ({ routes }) => {\n try {\n const cmsDir = path.resolve(process.cwd(), '.cms');\n if (!fs.existsSync(cmsDir)) {\n fs.mkdirSync(cmsDir, { recursive: true });\n }\n\n const serializedRoutes = routes.map(\n (r: {\n route?: string;\n pathname?: string;\n component?: string;\n entrypoint?: string;\n type?: string;\n params?: string[];\n }) => {\n const comp = r.component || r.entrypoint || '';\n let routePattern = r.route || r.pathname || '';\n if (!routePattern && comp) {\n routePattern = deriveRouteFromComponent(comp);\n }\n return {\n route: routePattern,\n component: comp,\n type: r.type || 'page',\n params: r.params || [],\n };\n },\n );\n\n fs.writeFileSync(\n path.join(cmsDir, 'routes.json'),\n JSON.stringify(serializedRoutes, null, 2),\n 'utf-8',\n );\n } catch {\n // Ignore if .cms directory write fails\n }\n },\n\n 'astro:build:done': async ({ logger }) => {\n // Report missing field warnings recorded during SSG\n const missing = getMissingFieldWarnings();\n if (missing.length > 0) {\n logger.warn(\n `CMS Build Warning: ${missing.length} field(s) were rendered with empty/missing values: ${missing.join(', ')}`,\n );\n clearMissingFieldWarnings();\n }\n },\n },\n };\n}\n\nexport const cms = cmsAstro;\n","import type { CmsClient, ContentBundle } from './types';\n\nexport * from './preview/origins';\n\nexport interface GetPreviewDataOptions {\n previewToken?: string | null;\n client: CmsClient;\n /** @deprecated Site hosts no longer verify preview tokens locally. */\n previewSecret?: string;\n siteId?: string;\n}\n\nexport interface PreviewBundleResult {\n ok: boolean;\n status: number;\n bundle?: ContentBundle;\n error?: string;\n}\n\n/**\n * Retrieves draft content bundle using preview token (verified by content-worker).\n */\nexport async function getPreviewData(options: GetPreviewDataOptions): Promise<PreviewBundleResult> {\n const { previewToken, client } = options;\n\n if (!previewToken) {\n return {\n ok: false,\n status: 404,\n error: 'Preview token is required',\n };\n }\n\n // Fetch draft content bundle from CMS client (verified by content-worker)\n try {\n const bundle = await client.getBundle({ previewToken });\n return {\n ok: true,\n status: 200,\n bundle,\n };\n } catch (_err) {\n return {\n ok: false,\n status: 404,\n error: 'Preview token is not valid for this site',\n };\n }\n}\n","import type { CmsRedirect, CmsSiteConfig } from './types';\n\n/**\n * Renders Cloudflare Pages _redirects file content from redirect definitions.\n */\nexport function renderRedirectsFile(redirects: CmsRedirect[] = []): string {\n const lines = redirects\n .filter((r) => r.enabled !== false && r.from_path && r.to_path)\n .map((r) => `${r.from_path} ${r.to_path} ${r.status_code || 301}`);\n\n return lines.length > 0 ? `${lines.join('\\n')}\\n` : '';\n}\n\nexport interface RenderRobotsOptions {\n siteUrl?: string;\n}\n\n/**\n * Renders robots.txt content from site settings.\n */\nexport function renderRobotsTxt(\n config?: CmsSiteConfig | null,\n options?: RenderRobotsOptions,\n): string {\n if (config?.robots?.raw) {\n return `${config.robots.raw.trim()}\\n`;\n }\n\n const lines: string[] = [];\n const rules = config?.robots?.rules || [{ user_agent: '*', allow: ['/'] }];\n\n for (const rule of rules) {\n lines.push(`User-agent: ${rule.user_agent || '*'}`);\n if (rule.allow && rule.allow.length > 0) {\n for (const path of rule.allow) {\n lines.push(`Allow: ${path}`);\n }\n }\n if (rule.disallow && rule.disallow.length > 0) {\n for (const path of rule.disallow) {\n lines.push(`Disallow: ${path}`);\n }\n }\n lines.push('');\n }\n\n const siteUrl = options?.siteUrl ? options.siteUrl.replace(/\\/+$/, '') : '';\n if (siteUrl && config?.robots?.sitemap !== false) {\n lines.push(`Sitemap: ${siteUrl}/sitemap.xml`);\n }\n\n return `${lines.join('\\n').trim()}\\n`;\n}\n\nexport interface RenderSitemapOptions {\n siteUrl: string;\n siteConfig?: CmsSiteConfig | null;\n}\n\nexport interface SitemapRouteItem {\n id?: string;\n path?: string;\n pattern?: string;\n published_at?: string;\n updated_at?: string;\n seo?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\n/**\n * Renders sitemap.xml content from routes and site config.\n * Excludes noindex routes and the 404 route.\n */\nexport function renderSitemapXml(\n routes: SitemapRouteItem[],\n options: RenderSitemapOptions,\n): string {\n const siteUrl = options.siteUrl.replace(/\\/+$/, '');\n const config = options.siteConfig;\n const excludes = new Set(config?.sitemap?.exclude || []);\n\n if (config?.not_found_path) {\n excludes.add(config.not_found_path);\n }\n\n const filtered = routes.filter((r) => {\n if ((r.path && excludes.has(r.path)) || (r.id && excludes.has(r.id))) {\n return false;\n }\n if ('seo' in r && r.seo && typeof r.seo === 'object') {\n const seoObj = r.seo as { noindex?: boolean };\n if (seoObj.noindex) {\n return false;\n }\n }\n return true;\n });\n\n const urlEntries = filtered.map((r) => {\n const rawPath = r.path || '/';\n const normPath = rawPath.startsWith('/') ? rawPath : `/${rawPath}`;\n const loc = `${siteUrl}${normPath}`;\n const dateStr =\n ('published_at' in r && r.published_at) || r.updated_at || new Date().toISOString();\n const lastmod = dateStr.split('T')[0];\n\n return ` <url>\\n <loc>${loc}</loc>\\n <lastmod>${lastmod}</lastmod>\\n </url>`;\n });\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\\n${urlEntries.join('\\n')}\\n</urlset>\\n`;\n}\n"]}
@@ -1,5 +1,5 @@
1
- import { createPreviewMiddleware } from '../chunk-QYUVAKMC.js';
2
- export { createPreviewMiddleware } from '../chunk-QYUVAKMC.js';
1
+ import { createPreviewMiddleware } from '../chunk-YCQMH2T7.js';
2
+ export { createPreviewMiddleware } from '../chunk-YCQMH2T7.js';
3
3
  import '../chunk-B4YYLS7Y.js';
4
4
  import '../chunk-DMLOBKYE.js';
5
5
  import '../chunk-2TKIQIOE.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@407dev/cms-astro",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -58,7 +58,7 @@
58
58
  },
59
59
  "peerDependencies": {
60
60
  "astro": "^5.0.0",
61
- "@407dev/cli": "0.1.0"
61
+ "@407dev/cli": "0.1.1"
62
62
  },
63
63
  "peerDependenciesMeta": {
64
64
  "@407dev/cli": {
@@ -76,9 +76,9 @@
76
76
  "vite": "^6.1.0",
77
77
  "vitest": "3.0.7",
78
78
  "@407dev/api-client": "0.0.1",
79
- "@407dev/cli": "0.1.0",
80
- "@407dev/config": "0.0.1",
81
- "@407dev/design-tokens": "0.0.1"
79
+ "@407dev/cli": "0.1.1",
80
+ "@407dev/design-tokens": "0.0.1",
81
+ "@407dev/config": "0.0.1"
82
82
  },
83
83
  "scripts": {
84
84
  "build": "tsup",
package/src/client.ts CHANGED
@@ -41,7 +41,6 @@ export function createCmsClient(config: CmsClientConfig): CmsClient {
41
41
 
42
42
  const res = await fetchFn(url, {
43
43
  headers,
44
- cache: 'no-store',
45
44
  });
46
45
  if (!res.ok) {
47
46
  const error = new Error(
@@ -19,6 +19,10 @@ export function cmsEntryAttr(
19
19
  return { 'data-cms-collection': collectionKey };
20
20
  }
21
21
 
22
+ export function cmsCollectionAttr(collectionKey: string): { 'data-cms-collection': string } {
23
+ return cmsEntryAttr(collectionKey) as { 'data-cms-collection': string };
24
+ }
25
+
22
26
  export function cmsEntryFieldAttr(path: string): { 'data-cms-entry-field': string } {
23
27
  return { 'data-cms-entry-field': path };
24
28
  }
@@ -1,6 +1,7 @@
1
1
  import { type z, zodToJsonSchema } from '@407dev/blocks';
2
2
  import { bundleReady } from '../runtime/bundle';
3
3
  import { getActiveBundle, isDraftMode } from '../runtime/store';
4
+ import { cmsCollectionAttr } from './attrs';
4
5
  import type {
5
6
  CollectionEntry,
6
7
  CollectionHandle,
@@ -70,3 +71,10 @@ export async function collectionPaths<T extends CollectionHandle<z.ZodTypeAny> |
70
71
  },
71
72
  }));
72
73
  }
74
+
75
+ export function collectionAttrs<T extends CollectionHandle<z.ZodTypeAny> | string>(
76
+ handleOrKey: T,
77
+ ): { 'data-cms-collection': string } {
78
+ const collectionKey = typeof handleOrKey === 'string' ? handleOrKey : handleOrKey.key;
79
+ return cmsCollectionAttr(collectionKey);
80
+ }
@@ -1,8 +1,10 @@
1
1
  import { describe, expect, it } from 'vitest';
2
+ import { z } from 'zod';
2
3
  import { runWithDraftBundle } from '../runtime/store';
3
4
  import type { ContentBundle } from '../types';
4
- import { cmsEntryAttr, cmsEntryFieldAttr } from './attrs';
5
+ import { cmsCollectionAttr, cmsEntryAttr, cmsEntryFieldAttr } from './attrs';
5
6
  import { createEntryScope } from './entryScope';
7
+ import { f } from './index';
6
8
 
7
9
  const mockBundle: ContentBundle = {
8
10
  bundleVersion: 1,
@@ -59,4 +61,23 @@ describe('entryScope', () => {
59
61
  expect(scope.text('nonexistent', { defaultValue: 'Fallback' })).toBe('Fallback');
60
62
  });
61
63
  });
64
+
65
+ it('provides cmsCollectionAttr and f.collectionAttrs', () => {
66
+ expect(cmsCollectionAttr('blog')).toEqual({
67
+ 'data-cms-collection': 'blog',
68
+ });
69
+ expect(f.collectionAttrs('blog')).toEqual({
70
+ 'data-cms-collection': 'blog',
71
+ });
72
+ expect(
73
+ f.collectionAttrs({
74
+ key: 'blog',
75
+ schema: z.object({}),
76
+ jsonSchema: {},
77
+ schemaVersion: 1,
78
+ }),
79
+ ).toEqual({
80
+ 'data-cms-collection': 'blog',
81
+ });
82
+ });
62
83
  });
@@ -1,4 +1,10 @@
1
- import { collectionPaths, defineCollection, getEntries, getEntry } from './collection';
1
+ import {
2
+ collectionAttrs,
3
+ collectionPaths,
4
+ defineCollection,
5
+ getEntries,
6
+ getEntry,
7
+ } from './collection';
2
8
  import { createEntryScope, entryScope } from './entryScope';
3
9
  import { defineGroup } from './group';
4
10
  import { createFieldHelpersMap } from './helpers';
@@ -15,6 +21,7 @@ export type CmsF = FieldHelpersMap & {
15
21
  entry: typeof getEntry;
16
22
  defineCollection: typeof defineCollection;
17
23
  collectionPaths: typeof collectionPaths;
24
+ collectionAttrs: typeof collectionAttrs;
18
25
  };
19
26
 
20
27
  export const f: CmsF = {
@@ -26,11 +33,13 @@ export const f: CmsF = {
26
33
  entry: getEntry,
27
34
  defineCollection,
28
35
  collectionPaths,
36
+ collectionAttrs,
29
37
  };
30
38
 
31
39
  export {
32
40
  defineCollection,
33
41
  collectionPaths,
42
+ collectionAttrs,
34
43
  getEntries,
35
44
  getEntry,
36
45
  defineGroup,