@407dev/cms-astro 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/{chunk-B4YYLS7Y.js → chunk-4KOHZWCL.js} +2 -2
- package/dist/chunk-4KOHZWCL.js.map +1 -0
- package/dist/{chunk-WUUT3RCU.js → chunk-4PBDIQNL.js} +5 -5
- package/dist/{chunk-WUUT3RCU.js.map → chunk-4PBDIQNL.js.map} +1 -1
- package/dist/{chunk-2TKIQIOE.js → chunk-AIUAT7FF.js} +12 -2
- package/dist/chunk-AIUAT7FF.js.map +1 -0
- package/dist/{chunk-7LMUFCWX.js → chunk-AUGWPP5U.js} +3 -3
- package/dist/{chunk-7LMUFCWX.js.map → chunk-AUGWPP5U.js.map} +1 -1
- package/dist/dev/index.js +3 -3
- package/dist/index.d.ts +17 -2
- package/dist/index.js +46 -14
- package/dist/index.js.map +1 -1
- package/dist/middleware/index.js +4 -4
- package/dist/toolbar/app.js +1 -1
- package/package.json +4 -4
- package/src/index.test.ts +2 -1
- package/src/richtext/RichTextNode.astro +7 -4
- package/src/richtext/render.ts +69 -7
- package/src/richtext.test.ts +75 -1
- package/dist/chunk-2TKIQIOE.js.map +0 -1
- package/dist/chunk-B4YYLS7Y.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
export { ALLOWED_IMAGE_FITS, ALLOWED_IMAGE_QUALITIES, CDN_IMAGE_WIDTHS, buildCdnImageUrl, buildSrcSet, isCdnTransformableUrl, snapToAllowedQuality, snapToAllowedWidth } from './chunk-6FH3C4FF.js';
|
|
2
|
-
import { mintDevPreviewToken } from './chunk-
|
|
3
|
-
export { signPreviewToken, verifyPreviewToken } from './chunk-
|
|
2
|
+
import { mintDevPreviewToken } from './chunk-AUGWPP5U.js';
|
|
3
|
+
export { signPreviewToken, verifyPreviewToken } from './chunk-AUGWPP5U.js';
|
|
4
4
|
import { collectionAttrs, collectionPaths, defineCollection, getEntry, getEntries, markBundleReady, cmsEntryAttr, cmsGroupAttr } from './chunk-SGHAANOW.js';
|
|
5
5
|
export { bundleReady, cmsCollectionAttr, cmsEntryAttr, cmsEntryFieldAttr, cmsFieldAttr, cmsGroupAttr, collectionAttrs, collectionPaths, defineCollection, getEntries, getEntry, isBundleReady, markBundleReady } from './chunk-SGHAANOW.js';
|
|
6
|
-
import { initCmsClient, buildBridgeScript, getClient } from './chunk-
|
|
7
|
-
export { createCmsClient, createPreviewMiddleware, getClient, initCmsClient, setClient } from './chunk-
|
|
8
|
-
import './chunk-
|
|
6
|
+
import { initCmsClient, buildBridgeScript, getClient } from './chunk-4PBDIQNL.js';
|
|
7
|
+
export { createCmsClient, createPreviewMiddleware, getClient, initCmsClient, setClient } from './chunk-4PBDIQNL.js';
|
|
8
|
+
import './chunk-4KOHZWCL.js';
|
|
9
9
|
import { getActiveBundle, recordMissingField, getMissingFieldWarnings, clearMissingFieldWarnings } from './chunk-DMLOBKYE.js';
|
|
10
10
|
export { clearMissingFieldWarnings, getActiveBundle, getBuildBundle, getMissingFieldWarnings, isDraftMode, recordMissingField, runWithDraftBundle, setActiveDraftBundle, setBuildBundle, updateBundleFieldValue } from './chunk-DMLOBKYE.js';
|
|
11
|
-
import './chunk-
|
|
11
|
+
import './chunk-AIUAT7FF.js';
|
|
12
12
|
export { DEFAULT_EDITOR_ORIGINS, resolveEditorOrigins } from './chunk-XJPVYMZM.js';
|
|
13
|
-
import { listFieldTypes, getFieldType, isValidLinkHref } from '@407dev/field-types';
|
|
13
|
+
import { listFieldTypes, getFieldType, isValidLinkHref, stripUrlControlChars, isAssetUuid, isSafeMediaSrc } from '@407dev/field-types';
|
|
14
14
|
import { createComponent, spreadAttributes, renderTemplate, markHTMLString } from 'astro/runtime/server/index.js';
|
|
15
15
|
export { z } from '@407dev/blocks';
|
|
16
16
|
import fs from 'fs';
|
|
@@ -36,6 +36,38 @@ var KNOWN_NODES = /* @__PURE__ */ new Set([
|
|
|
36
36
|
"image"
|
|
37
37
|
]);
|
|
38
38
|
var KNOWN_MARKS = /* @__PURE__ */ new Set(["bold", "italic", "underline", "strike", "code", "link"]);
|
|
39
|
+
function toImageUrl(raw) {
|
|
40
|
+
if (typeof raw !== "string") return null;
|
|
41
|
+
const cleaned = stripUrlControlChars(raw);
|
|
42
|
+
if (isAssetUuid(cleaned) || cleaned.startsWith("#")) return null;
|
|
43
|
+
return isSafeMediaSrc(cleaned) ? cleaned : null;
|
|
44
|
+
}
|
|
45
|
+
function isImageAsset(obj) {
|
|
46
|
+
if (typeof obj.id !== "string" || typeof obj.url !== "string") return false;
|
|
47
|
+
if (typeof obj.kind === "string") return obj.kind === "image";
|
|
48
|
+
return typeof obj.mime_type === "string" && obj.mime_type.startsWith("image/");
|
|
49
|
+
}
|
|
50
|
+
function getImageNodeProps(attrs) {
|
|
51
|
+
let rawSrc = attrs?.src;
|
|
52
|
+
let asset;
|
|
53
|
+
if (rawSrc && typeof rawSrc === "object" && !Array.isArray(rawSrc)) {
|
|
54
|
+
const obj = rawSrc;
|
|
55
|
+
if (obj.kind === "url") rawSrc = obj.src;
|
|
56
|
+
else if (obj.kind === "asset") return null;
|
|
57
|
+
else {
|
|
58
|
+
if (!isImageAsset(obj)) return null;
|
|
59
|
+
asset = rawSrc;
|
|
60
|
+
rawSrc = asset.url;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const src = toImageUrl(rawSrc);
|
|
64
|
+
if (!src) return null;
|
|
65
|
+
const alt = typeof attrs?.alt === "string" && attrs.alt ? attrs.alt : asset?.alt ?? "";
|
|
66
|
+
const title = typeof attrs?.title === "string" && attrs.title ? attrs.title : void 0;
|
|
67
|
+
const width = typeof attrs?.width === "number" ? attrs.width : asset?.width ?? void 0;
|
|
68
|
+
const height = typeof attrs?.height === "number" ? attrs.height : asset?.height ?? void 0;
|
|
69
|
+
return { src, alt, title, width, height, asset };
|
|
70
|
+
}
|
|
39
71
|
function parseRichTextDoc(value) {
|
|
40
72
|
if (!value) return null;
|
|
41
73
|
let parsed = value;
|
|
@@ -173,12 +205,12 @@ function renderRichTextHtml(doc, options = {}) {
|
|
|
173
205
|
case "horizontalRule":
|
|
174
206
|
return "<hr />";
|
|
175
207
|
case "image": {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
}
|
|
181
|
-
return ""
|
|
208
|
+
const img = getImageNodeProps(n.attrs);
|
|
209
|
+
if (!img) return "";
|
|
210
|
+
const title = img.title ? ` title="${escapeHtml(img.title)}"` : "";
|
|
211
|
+
const width = img.width ? ` width="${img.width}"` : "";
|
|
212
|
+
const height = img.height ? ` height="${img.height}"` : "";
|
|
213
|
+
return `<img src="${escapeHtml(img.src)}" alt="${escapeHtml(img.alt)}"${title}${width}${height} loading="lazy" />`;
|
|
182
214
|
}
|
|
183
215
|
default:
|
|
184
216
|
return children;
|
|
@@ -917,6 +949,6 @@ ${urlEntries.join("\n")}
|
|
|
917
949
|
`;
|
|
918
950
|
}
|
|
919
951
|
|
|
920
|
-
export { KNOWN_NODES, buildHeadTags, cms, cmsAstro, createEntryDualCallableHelper, createEntryScope, createScope, defineGroup, entryScope, escapeHtml, f, getLinkMarkAttrs, getPreviewData, parseRichTextDoc, renderMarksOnly, renderRedirectsFile, renderRichTextHtml, renderRobotsTxt, renderSitemapXml };
|
|
952
|
+
export { KNOWN_NODES, buildHeadTags, cms, cmsAstro, createEntryDualCallableHelper, createEntryScope, createScope, defineGroup, entryScope, escapeHtml, f, getImageNodeProps, getLinkMarkAttrs, getPreviewData, parseRichTextDoc, renderMarksOnly, renderRedirectsFile, renderRichTextHtml, renderRobotsTxt, renderSitemapXml };
|
|
921
953
|
//# sourceMappingURL=index.js.map
|
|
922
954
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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/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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\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 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
|
+
{"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/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 type { CmsAsset } from '@407dev/blocks';\nimport {\n isAssetUuid,\n isSafeMediaSrc,\n isValidLinkHref,\n stripUrlControlChars,\n} 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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\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/**\n * Props for an image node. `src` is always a renderable URL string; `asset` is set when the stored\n * asset UUID was resolved into a CmsAsset (published snapshots and draft previews), so components\n * can use focal point and dimensions, e.g. `<CmsImage src={asset ?? src} alt={alt} />`.\n */\nexport interface RichTextImageProps {\n src: string;\n alt: string;\n title?: string;\n width?: number;\n height?: number;\n asset?: CmsAsset;\n}\n\nfunction toImageUrl(raw: unknown): string | null {\n if (typeof raw !== 'string') return null;\n const cleaned = stripUrlControlChars(raw);\n // A bare UUID here was never resolved (e.g. the asset was deleted), so there is nothing to load.\n if (isAssetUuid(cleaned) || cleaned.startsWith('#')) return null;\n return isSafeMediaSrc(cleaned) ? cleaned : null;\n}\n\nfunction isImageAsset(obj: Record<string, unknown>): boolean {\n if (typeof obj.id !== 'string' || typeof obj.url !== 'string') return false;\n if (typeof obj.kind === 'string') return obj.kind === 'image';\n return typeof obj.mime_type === 'string' && obj.mime_type.startsWith('image/');\n}\n\n/** Normalizes an image node's `src` (URL string or resolved CmsAsset), or null if it has no safe URL. */\nexport function getImageNodeProps(\n attrs: Record<string, unknown> | undefined,\n): RichTextImageProps | null {\n let rawSrc = attrs?.src;\n let asset: CmsAsset | undefined;\n if (rawSrc && typeof rawSrc === 'object' && !Array.isArray(rawSrc)) {\n const obj = rawSrc as Record<string, unknown>;\n // Unresolved wire shapes: `{ kind: 'url', src }` carries a URL; `{ kind: 'asset', id }` has none.\n if (obj.kind === 'url') rawSrc = obj.src;\n else if (obj.kind === 'asset') return null;\n else {\n if (!isImageAsset(obj)) return null;\n asset = rawSrc as CmsAsset;\n rawSrc = asset.url;\n }\n }\n const src = toImageUrl(rawSrc);\n if (!src) return null;\n\n const alt = typeof attrs?.alt === 'string' && attrs.alt ? attrs.alt : (asset?.alt ?? '');\n const title = typeof attrs?.title === 'string' && attrs.title ? attrs.title : undefined;\n const width = typeof attrs?.width === 'number' ? attrs.width : (asset?.width ?? undefined);\n const height = typeof attrs?.height === 'number' ? attrs.height : (asset?.height ?? undefined);\n\n return { src, alt, title, width, height, asset };\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 const img = getImageNodeProps(n.attrs);\n if (!img) return '';\n const title = img.title ? ` title=\"${escapeHtml(img.title)}\"` : '';\n const width = img.width ? ` width=\"${img.width}\"` : '';\n const height = img.height ? ` height=\"${img.height}\"` : '';\n return `<img src=\"${escapeHtml(img.src)}\" alt=\"${escapeHtml(img.alt)}\"${title}${width}${height} loading=\"lazy\" />`;\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 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"]}
|
package/dist/middleware/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { createPreviewMiddleware } from '../chunk-
|
|
2
|
-
export { createPreviewMiddleware } from '../chunk-
|
|
3
|
-
import '../chunk-
|
|
1
|
+
import { createPreviewMiddleware } from '../chunk-4PBDIQNL.js';
|
|
2
|
+
export { createPreviewMiddleware } from '../chunk-4PBDIQNL.js';
|
|
3
|
+
import '../chunk-4KOHZWCL.js';
|
|
4
4
|
import '../chunk-DMLOBKYE.js';
|
|
5
|
-
import '../chunk-
|
|
5
|
+
import '../chunk-AIUAT7FF.js';
|
|
6
6
|
import '../chunk-XJPVYMZM.js';
|
|
7
7
|
|
|
8
8
|
// src/middleware/index.ts
|
package/dist/toolbar/app.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@407dev/cms-astro",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -60,11 +60,11 @@
|
|
|
60
60
|
"dependencies": {
|
|
61
61
|
"zod": "^4.4.3",
|
|
62
62
|
"@407dev/blocks": "0.1.0",
|
|
63
|
-
"@407dev/field-types": "0.
|
|
63
|
+
"@407dev/field-types": "0.3.0"
|
|
64
64
|
},
|
|
65
65
|
"peerDependencies": {
|
|
66
66
|
"astro": "^5.0.0",
|
|
67
|
-
"@407dev/cli": "0.2.
|
|
67
|
+
"@407dev/cli": "0.2.2"
|
|
68
68
|
},
|
|
69
69
|
"peerDependenciesMeta": {
|
|
70
70
|
"@407dev/cli": {
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
"vite": "^6.1.0",
|
|
83
83
|
"vitest": "3.0.7",
|
|
84
84
|
"@407dev/api-client": "0.0.1",
|
|
85
|
-
"@407dev/cli": "0.2.
|
|
85
|
+
"@407dev/cli": "0.2.2",
|
|
86
86
|
"@407dev/config": "0.0.1",
|
|
87
87
|
"@407dev/design-tokens": "0.0.1"
|
|
88
88
|
},
|
package/src/index.test.ts
CHANGED
|
@@ -167,6 +167,7 @@ describe('cms-astro package entrypoint', () => {
|
|
|
167
167
|
}
|
|
168
168
|
});
|
|
169
169
|
|
|
170
|
+
// Dev mode cold-imports vite and @407dev/cli, which exceeds the 5s default on CI runners.
|
|
170
171
|
it('fails gracefully on bundle fetch failure in dev mode', async () => {
|
|
171
172
|
const fetchSpy = vi.spyOn(globalThis, 'fetch').mockRejectedValue(new Error('Network error'));
|
|
172
173
|
try {
|
|
@@ -188,5 +189,5 @@ describe('cms-astro package entrypoint', () => {
|
|
|
188
189
|
} finally {
|
|
189
190
|
fetchSpy.mockRestore();
|
|
190
191
|
}
|
|
191
|
-
});
|
|
192
|
+
}, 20_000);
|
|
192
193
|
});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
import { KNOWN_NODES, getLinkMarkAttrs, renderMarksOnly } from './render';
|
|
2
|
+
import { KNOWN_NODES, getImageNodeProps, getLinkMarkAttrs, renderMarksOnly } from './render';
|
|
3
3
|
import type { RichTextNodeShape } from './render';
|
|
4
4
|
|
|
5
5
|
export interface RichTextComponents {
|
|
@@ -49,8 +49,7 @@ const ListItemComponent = components?.listItem;
|
|
|
49
49
|
const BlockquoteComponent = components?.blockquote;
|
|
50
50
|
|
|
51
51
|
const ImageComponent = components?.image;
|
|
52
|
-
const
|
|
53
|
-
const imageAlt = typeof n.attrs?.alt === 'string' ? n.attrs.alt : '';
|
|
52
|
+
const image = nodeType === 'image' ? getImageNodeProps(n.attrs) : null;
|
|
54
53
|
|
|
55
54
|
const LinkComponent = components?.link;
|
|
56
55
|
const linkAttrs = nodeType === 'text' ? getLinkMarkAttrs(n.marks) : null;
|
|
@@ -116,7 +115,11 @@ const codeLang = typeof n.attrs?.language === 'string' ? n.attrs.language : unde
|
|
|
116
115
|
) : nodeType === 'horizontalRule' ? (
|
|
117
116
|
<hr />
|
|
118
117
|
) : nodeType === 'image' ? (
|
|
119
|
-
|
|
118
|
+
!image ? null : ImageComponent ? (
|
|
119
|
+
<ImageComponent {...image} />
|
|
120
|
+
) : (
|
|
121
|
+
<img src={image.src} alt={image.alt} title={image.title} width={image.width} height={image.height} loading="lazy" />
|
|
122
|
+
)
|
|
120
123
|
) : nodeType === 'text' ? (
|
|
121
124
|
linkAttrs && LinkComponent ? (
|
|
122
125
|
<LinkComponent href={linkAttrs.href} title={linkAttrs.title} target={linkAttrs.target} rel={linkAttrs.rel}>
|