@407dev/cms-astro 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/README.md +69 -0
  2. package/dist/chunk-2TKIQIOE.js +118 -0
  3. package/dist/chunk-2TKIQIOE.js.map +1 -0
  4. package/dist/chunk-53OQ5RXJ.js +912 -0
  5. package/dist/chunk-53OQ5RXJ.js.map +1 -0
  6. package/dist/chunk-56OMNQLH.js +1013 -0
  7. package/dist/chunk-56OMNQLH.js.map +1 -0
  8. package/dist/chunk-5AOOMQ7K.js +1031 -0
  9. package/dist/chunk-5AOOMQ7K.js.map +1 -0
  10. package/dist/chunk-5XRUCFDC.js +743 -0
  11. package/dist/chunk-5XRUCFDC.js.map +1 -0
  12. package/dist/chunk-62ZHCOLZ.js +25 -0
  13. package/dist/chunk-62ZHCOLZ.js.map +1 -0
  14. package/dist/chunk-6AZLRSYA.js +126 -0
  15. package/dist/chunk-6AZLRSYA.js.map +1 -0
  16. package/dist/chunk-6L3ZTCFB.js +14 -0
  17. package/dist/chunk-6L3ZTCFB.js.map +1 -0
  18. package/dist/chunk-6O7ZNNDT.js +697 -0
  19. package/dist/chunk-6O7ZNNDT.js.map +1 -0
  20. package/dist/chunk-6PQIXTMK.js +697 -0
  21. package/dist/chunk-6PQIXTMK.js.map +1 -0
  22. package/dist/chunk-7AW6M7QW.js +1013 -0
  23. package/dist/chunk-7AW6M7QW.js.map +1 -0
  24. package/dist/chunk-7E3XJLKX.js +73 -0
  25. package/dist/chunk-7E3XJLKX.js.map +1 -0
  26. package/dist/chunk-7LM54OTA.js +1031 -0
  27. package/dist/chunk-7LM54OTA.js.map +1 -0
  28. package/dist/chunk-7LMUFCWX.js +126 -0
  29. package/dist/chunk-7LMUFCWX.js.map +1 -0
  30. package/dist/chunk-A3OGL4OX.js +706 -0
  31. package/dist/chunk-A3OGL4OX.js.map +1 -0
  32. package/dist/chunk-AO4UAWOV.js +1030 -0
  33. package/dist/chunk-AO4UAWOV.js.map +1 -0
  34. package/dist/chunk-B4YYLS7Y.js +14 -0
  35. package/dist/chunk-B4YYLS7Y.js.map +1 -0
  36. package/dist/chunk-BDFVGXM2.js +697 -0
  37. package/dist/chunk-BDFVGXM2.js.map +1 -0
  38. package/dist/chunk-CXM7NZVX.js +1031 -0
  39. package/dist/chunk-CXM7NZVX.js.map +1 -0
  40. package/dist/chunk-DMLOBKYE.js +96 -0
  41. package/dist/chunk-DMLOBKYE.js.map +1 -0
  42. package/dist/chunk-DXJSYGS6.js +743 -0
  43. package/dist/chunk-DXJSYGS6.js.map +1 -0
  44. package/dist/chunk-EFUSAQZM.js +72 -0
  45. package/dist/chunk-EFUSAQZM.js.map +1 -0
  46. package/dist/chunk-F7KDGPBN.js +1013 -0
  47. package/dist/chunk-F7KDGPBN.js.map +1 -0
  48. package/dist/chunk-FBSQT45X.js +126 -0
  49. package/dist/chunk-FBSQT45X.js.map +1 -0
  50. package/dist/chunk-FEPDOMVH.js +697 -0
  51. package/dist/chunk-FEPDOMVH.js.map +1 -0
  52. package/dist/chunk-FQDOL2QW.js +25 -0
  53. package/dist/chunk-FQDOL2QW.js.map +1 -0
  54. package/dist/chunk-GB3LGQJM.js +109 -0
  55. package/dist/chunk-GB3LGQJM.js.map +1 -0
  56. package/dist/chunk-HCNP6R3P.js +736 -0
  57. package/dist/chunk-HCNP6R3P.js.map +1 -0
  58. package/dist/chunk-J6WEJDRI.js +743 -0
  59. package/dist/chunk-J6WEJDRI.js.map +1 -0
  60. package/dist/chunk-JHEAPNJ2.js +117 -0
  61. package/dist/chunk-JHEAPNJ2.js.map +1 -0
  62. package/dist/chunk-JOJDJ6GW.js +25 -0
  63. package/dist/chunk-JOJDJ6GW.js.map +1 -0
  64. package/dist/chunk-KTDV6WYB.js +202 -0
  65. package/dist/chunk-KTDV6WYB.js.map +1 -0
  66. package/dist/chunk-KZWJBKPC.js +734 -0
  67. package/dist/chunk-KZWJBKPC.js.map +1 -0
  68. package/dist/chunk-LEAQBGL6.js +109 -0
  69. package/dist/chunk-LEAQBGL6.js.map +1 -0
  70. package/dist/chunk-LGZJL2Q7.js +697 -0
  71. package/dist/chunk-LGZJL2Q7.js.map +1 -0
  72. package/dist/chunk-LQPBU46R.js +109 -0
  73. package/dist/chunk-LQPBU46R.js.map +1 -0
  74. package/dist/chunk-M55NNUTY.js +1013 -0
  75. package/dist/chunk-M55NNUTY.js.map +1 -0
  76. package/dist/chunk-M6NCYCC3.js +1013 -0
  77. package/dist/chunk-M6NCYCC3.js.map +1 -0
  78. package/dist/chunk-MGN7OZAU.js +109 -0
  79. package/dist/chunk-MGN7OZAU.js.map +1 -0
  80. package/dist/chunk-MGYZOX4K.js +1013 -0
  81. package/dist/chunk-MGYZOX4K.js.map +1 -0
  82. package/dist/chunk-MY4IEKJS.js +1031 -0
  83. package/dist/chunk-MY4IEKJS.js.map +1 -0
  84. package/dist/chunk-NCQRGAB4.js +705 -0
  85. package/dist/chunk-NCQRGAB4.js.map +1 -0
  86. package/dist/chunk-NI4NHXI4.js +697 -0
  87. package/dist/chunk-NI4NHXI4.js.map +1 -0
  88. package/dist/chunk-NPI5N7AU.js +14 -0
  89. package/dist/chunk-NPI5N7AU.js.map +1 -0
  90. package/dist/chunk-QN4CPMJF.js +126 -0
  91. package/dist/chunk-QN4CPMJF.js.map +1 -0
  92. package/dist/chunk-QYUVAKMC.js +1013 -0
  93. package/dist/chunk-QYUVAKMC.js.map +1 -0
  94. package/dist/chunk-RAAT6PDT.js +25 -0
  95. package/dist/chunk-RAAT6PDT.js.map +1 -0
  96. package/dist/chunk-RDPO5VPS.js +1013 -0
  97. package/dist/chunk-RDPO5VPS.js.map +1 -0
  98. package/dist/chunk-RQHIW2PF.js +25 -0
  99. package/dist/chunk-RQHIW2PF.js.map +1 -0
  100. package/dist/chunk-RREVHA52.js +722 -0
  101. package/dist/chunk-RREVHA52.js.map +1 -0
  102. package/dist/chunk-S7PT4PZN.js +25 -0
  103. package/dist/chunk-S7PT4PZN.js.map +1 -0
  104. package/dist/chunk-SUXV5M32.js +109 -0
  105. package/dist/chunk-SUXV5M32.js.map +1 -0
  106. package/dist/chunk-SZEORUY6.js +696 -0
  107. package/dist/chunk-SZEORUY6.js.map +1 -0
  108. package/dist/chunk-T7NGGWGY.js +25 -0
  109. package/dist/chunk-T7NGGWGY.js.map +1 -0
  110. package/dist/chunk-UEVWP5VE.js +696 -0
  111. package/dist/chunk-UEVWP5VE.js.map +1 -0
  112. package/dist/chunk-UJNKNP7U.js +748 -0
  113. package/dist/chunk-UJNKNP7U.js.map +1 -0
  114. package/dist/chunk-V4XVFWFI.js +1013 -0
  115. package/dist/chunk-V4XVFWFI.js.map +1 -0
  116. package/dist/chunk-VJU2CIKZ.js +729 -0
  117. package/dist/chunk-VJU2CIKZ.js.map +1 -0
  118. package/dist/chunk-VRQUP5L3.js +202 -0
  119. package/dist/chunk-VRQUP5L3.js.map +1 -0
  120. package/dist/chunk-WBJ5E7CL.js +742 -0
  121. package/dist/chunk-WBJ5E7CL.js.map +1 -0
  122. package/dist/chunk-XJPVYMZM.js +24 -0
  123. package/dist/chunk-XJPVYMZM.js.map +1 -0
  124. package/dist/chunk-Y3Q65C7R.js +14 -0
  125. package/dist/chunk-Y3Q65C7R.js.map +1 -0
  126. package/dist/chunk-YHEGFPTR.js +1030 -0
  127. package/dist/chunk-YHEGFPTR.js.map +1 -0
  128. package/dist/chunk-ZDLBN46C.js +697 -0
  129. package/dist/chunk-ZDLBN46C.js.map +1 -0
  130. package/dist/dev/index.d.ts +122 -0
  131. package/dist/dev/index.js +662 -0
  132. package/dist/dev/index.js.map +1 -0
  133. package/dist/fields/collections.d.ts +18 -0
  134. package/dist/fields/collections.js +37 -0
  135. package/dist/fields/collections.js.map +1 -0
  136. package/dist/index.d.ts +235 -0
  137. package/dist/index.js +956 -0
  138. package/dist/index.js.map +1 -0
  139. package/dist/middleware/index.d.ts +8 -0
  140. package/dist/middleware/index.js +13 -0
  141. package/dist/middleware/index.js.map +1 -0
  142. package/dist/preview-BEkLMD6N.d.ts +23 -0
  143. package/dist/preview-D9yewK8x.d.ts +24 -0
  144. package/dist/preview-DJEA4fj7.d.ts +23 -0
  145. package/dist/preview-DeD1Jn7U.d.ts +23 -0
  146. package/dist/toolbar/app.d.ts +28 -0
  147. package/dist/toolbar/app.js +1176 -0
  148. package/dist/toolbar/app.js.map +1 -0
  149. package/dist/types-15jfCQKb.d.ts +141 -0
  150. package/dist/types-BREdL9Gx.d.ts +140 -0
  151. package/dist/types-C6sUZNa2.d.ts +104 -0
  152. package/dist/types-CEYS5Fzc.d.ts +112 -0
  153. package/dist/types-DpeHpobR.d.ts +104 -0
  154. package/dist/types-NaKJe6Pg.d.ts +140 -0
  155. package/package.json +90 -0
  156. package/src/CmsHead.astro +25 -0
  157. package/src/CmsImage.astro +62 -0
  158. package/src/CmsVideo.astro +185 -0
  159. package/src/RichText.astro +32 -0
  160. package/src/client.test.ts +227 -0
  161. package/src/client.ts +164 -0
  162. package/src/dev/config.test.ts +258 -0
  163. package/src/dev/config.ts +319 -0
  164. package/src/dev/index.ts +5 -0
  165. package/src/dev/preview-token.ts +39 -0
  166. package/src/dev/routes.test.ts +354 -0
  167. package/src/dev/routes.ts +245 -0
  168. package/src/dev/token.test.ts +280 -0
  169. package/src/dev/token.ts +201 -0
  170. package/src/dev/verifier.test.ts +63 -0
  171. package/src/dev/verifier.ts +161 -0
  172. package/src/fields/attrs.ts +24 -0
  173. package/src/fields/collection.ts +72 -0
  174. package/src/fields/collections.ts +35 -0
  175. package/src/fields/entryScope.test.ts +62 -0
  176. package/src/fields/entryScope.ts +240 -0
  177. package/src/fields/group.ts +51 -0
  178. package/src/fields/helpers.test.ts +51 -0
  179. package/src/fields/helpers.ts +214 -0
  180. package/src/fields/index.ts +46 -0
  181. package/src/fields/scope.ts +21 -0
  182. package/src/fields/types.ts +119 -0
  183. package/src/head.test.ts +74 -0
  184. package/src/head.ts +123 -0
  185. package/src/image.test.ts +42 -0
  186. package/src/image.ts +64 -0
  187. package/src/index.test.ts +76 -0
  188. package/src/index.ts +13 -0
  189. package/src/integration.ts +218 -0
  190. package/src/jwt.ts +131 -0
  191. package/src/middleware/index.ts +4 -0
  192. package/src/middleware/preview.test.ts +184 -0
  193. package/src/middleware/preview.ts +206 -0
  194. package/src/preview/bridge-script.test.ts +683 -0
  195. package/src/preview/bridge-script.ts +763 -0
  196. package/src/preview/origins.ts +29 -0
  197. package/src/preview.ts +49 -0
  198. package/src/richtext/RichTextNode.astro +130 -0
  199. package/src/richtext/render.ts +248 -0
  200. package/src/richtext.test.ts +139 -0
  201. package/src/runtime/bundle.ts +28 -0
  202. package/src/runtime/store.ts +130 -0
  203. package/src/siteFiles.test.ts +93 -0
  204. package/src/siteFiles.ts +111 -0
  205. package/src/toolbar/app.test.ts +191 -0
  206. package/src/toolbar/app.ts +1091 -0
  207. package/src/toolbar/icon.ts +5 -0
  208. package/src/toolbar/widgets.test.ts +153 -0
  209. package/src/toolbar/widgets.ts +365 -0
  210. package/src/types.test.ts +154 -0
  211. package/src/types.ts +163 -0
  212. package/src/version.ts +3 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/dev/token.ts","../../src/dev/config.ts","../../src/dev/routes.ts","../../src/dev/verifier.ts"],"names":["path"],"mappings":"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","file":"index.js","sourcesContent":["import crypto from 'node:crypto';\n\nexport interface DevTokenIdentity {\n sub: string;\n email?: string;\n exp?: number;\n workspaceRole?: string;\n}\n\nexport type ValidateDevTokenResult =\n | { ok: true; identity: DevTokenIdentity }\n | { ok: false; reason: string };\n\n// Matches is_workspace_admin_or_dev()'s RLS bypass roles (owner | editor); CMS_DEV_TOKEN must not carry them.\nconst WORKSPACE_ELEVATED_ROLES = new Set(['owner', 'editor']);\n\n// Reads both claim shapes RLS accepts: the flat single-workspace shortcut (app_metadata.workspace_id + app_metadata.role) and the per-workspace map (app_metadata.workspaces[id].role).\nfunction collectWorkspaceRoles(payload: Record<string, unknown>): string[] {\n const appMetadata = payload.app_metadata as Record<string, unknown> | undefined;\n if (!appMetadata || typeof appMetadata !== 'object') return [];\n\n const roles: string[] = [];\n\n if (typeof appMetadata.workspace_id === 'string' && typeof appMetadata.role === 'string') {\n roles.push(appMetadata.role);\n }\n\n const workspaces = appMetadata.workspaces;\n if (workspaces && typeof workspaces === 'object') {\n for (const entry of Object.values(workspaces as Record<string, unknown>)) {\n const role = (entry as Record<string, unknown> | null)?.role;\n if (typeof role === 'string') roles.push(role);\n }\n }\n\n return roles;\n}\n\nfunction base64UrlDecode(str: string): string {\n let base64 = str.replace(/-/g, '+').replace(/_/g, '/');\n while (base64.length % 4 !== 0) {\n base64 += '=';\n }\n return Buffer.from(base64, 'base64').toString('utf-8');\n}\n\nexport interface ValidateDevTokenOptions {\n allowElevated?: boolean;\n}\n\n/**\n * Decodes and validates a developer user JWT for the dev toolbar.\n * Rejects non-JWTs, service-role keys, anon keys, and expired tokens.\n */\nexport function validateDevToken(\n token: string | null | undefined,\n options?: ValidateDevTokenOptions | boolean,\n): ValidateDevTokenResult {\n const allowElevated = typeof options === 'boolean' ? options : Boolean(options?.allowElevated);\n\n if (!token || typeof token !== 'string' || !token.trim()) {\n return { ok: false, reason: 'CMS_DEV_TOKEN is missing or empty' };\n }\n\n const parts = token.trim().split('.');\n if (parts.length !== 3) {\n return { ok: false, reason: 'CMS_DEV_TOKEN is not a valid 3-part JWT' };\n }\n\n let payload: Record<string, unknown>;\n try {\n const decoded = base64UrlDecode(parts[1]);\n payload = JSON.parse(decoded);\n if (!payload || typeof payload !== 'object') {\n return { ok: false, reason: 'CMS_DEV_TOKEN payload is not a valid JSON object' };\n }\n } catch {\n return { ok: false, reason: 'CMS_DEV_TOKEN payload is not decodable' };\n }\n\n // 1. Refuse service_role\n if (payload.role === 'service_role') {\n return {\n ok: false,\n reason: 'CMS_DEV_TOKEN must not be a service_role key; authenticated user JWT required',\n };\n }\n\n // 2. Refuse non-authenticated (e.g. anon / publishable)\n if (payload.role !== 'authenticated') {\n return {\n ok: false,\n reason: `CMS_DEV_TOKEN has invalid role '${String(payload.role || 'none')}'; expected 'authenticated'`,\n };\n }\n\n // 3. Refuse expired\n if (typeof payload.exp === 'number' && payload.exp * 1000 <= Date.now()) {\n return { ok: false, reason: 'CMS_DEV_TOKEN has expired' };\n }\n\n // 4. Refuse workspace scope above 'viewer'/'member' unless explicitly allowed (e.g. CLI session)\n const workspaceRoles = collectWorkspaceRoles(payload);\n if (!allowElevated) {\n const elevatedRole = workspaceRoles.find((role) => WORKSPACE_ELEVATED_ROLES.has(role));\n if (elevatedRole) {\n return {\n ok: false,\n reason: `CMS_DEV_TOKEN grants workspace '${elevatedRole}' scope; only workspace-member tokens are permitted`,\n };\n }\n }\n\n const sub = typeof payload.sub === 'string' ? payload.sub : '';\n if (!sub) {\n return { ok: false, reason: 'CMS_DEV_TOKEN is missing sub claim' };\n }\n\n const email =\n typeof payload.email === 'string'\n ? payload.email\n : typeof (payload.user_metadata as Record<string, unknown> | undefined)?.email === 'string'\n ? ((payload.user_metadata as Record<string, unknown>).email as string)\n : undefined;\n\n const exp = typeof payload.exp === 'number' ? payload.exp : undefined;\n\n const workspaceRole = workspaceRoles[0];\n\n return {\n ok: true,\n identity: {\n sub,\n email,\n exp,\n workspaceRole,\n },\n };\n}\n\nexport interface SignDevTokenOptions {\n siteId?: string;\n workspaceId?: string;\n userId?: string;\n}\n\n/**\n * Signs a developer user JWT (with workspace viewer & site editor roles) for local development against local Supabase/CMS API.\n */\nexport function signDevToken(\n secret: string,\n siteIdOrOptions?: string | SignDevTokenOptions,\n workspaceIdParam?: string,\n userIdParam?: string,\n): string {\n let siteId = '00000000-0000-0000-0000-000000000002';\n let workspaceId = '00000000-0000-0000-0000-000000000001';\n let userId = '00000000-0000-0000-0000-000000000003';\n\n if (typeof siteIdOrOptions === 'object' && siteIdOrOptions !== null) {\n if (siteIdOrOptions.siteId) siteId = siteIdOrOptions.siteId;\n if (siteIdOrOptions.workspaceId) workspaceId = siteIdOrOptions.workspaceId;\n if (siteIdOrOptions.userId) userId = siteIdOrOptions.userId;\n } else {\n if (typeof siteIdOrOptions === 'string') siteId = siteIdOrOptions;\n if (typeof workspaceIdParam === 'string') workspaceId = workspaceIdParam;\n if (typeof userIdParam === 'string') userId = userIdParam;\n }\n\n const header = { alg: 'HS256', typ: 'JWT' };\n const payload = {\n aud: 'authenticated',\n role: 'authenticated',\n sub: userId,\n email: 'dev@example.com',\n app_metadata: {\n workspace_id: workspaceId,\n site_id: siteId,\n role: 'viewer',\n workspaces: {\n [workspaceId]: { role: 'viewer' },\n },\n sites: {\n [siteId]: { role: 'editor', workspace_id: workspaceId },\n },\n site_roles: {\n [siteId]: 'editor',\n },\n },\n user_metadata: { role: 'viewer' },\n iat: Math.floor(Date.now() / 1000),\n exp: Math.floor(Date.now() / 1000) + 3600 * 24 * 365,\n };\n\n const encodedHeader = Buffer.from(JSON.stringify(header)).toString('base64url');\n const encodedPayload = Buffer.from(JSON.stringify(payload)).toString('base64url');\n const data = `${encodedHeader}.${encodedPayload}`;\n const signature = crypto.createHmac('sha256', secret).update(data).digest('base64url');\n\n return `${data}.${signature}`;\n}\n","import fs from 'node:fs';\nimport path from 'node:path';\nimport { DEFAULT_DEV_API_URL } from '@407dev/config';\nimport { type DevTokenIdentity, signDevToken, validateDevToken } from './token';\n\nexport type DevConfigStatus = 'ok' | 'read-only' | 'refused' | 'unconfigured';\nexport type DevTokenSource = 'env' | 'cli' | 'local-mint';\nexport type LoadCredentialFn = (apiUrl: string) => Promise<string | null> | string | null;\n\nexport interface DevSiteMismatch {\n source: string;\n expected: string;\n actual: string;\n}\n\nexport interface DevConfigResult {\n status: DevConfigStatus;\n siteId: string;\n devSiteId?: string;\n apiUrl: string;\n devToken?: string;\n identity?: DevTokenIdentity | null;\n mismatch?: DevSiteMismatch | null;\n reason?: string;\n tokenSource?: DevTokenSource;\n}\n\nexport interface ResolveDevConfigOptions {\n siteId?: string;\n apiUrl?: string;\n siteDir?: string;\n fetchFn?: typeof fetch;\n loadCredential?: LoadCredentialFn;\n}\n\nasync function defaultLoadCredential(\n apiUrl: string,\n fetchFn?: typeof fetch,\n): Promise<string | null> {\n try {\n const cliPkg = '@407dev/cli';\n const cliModule = await import(/* @vite-ignore */ cliPkg);\n if (!cliModule?.getStoredCredentials || !cliModule?.refreshCredentialsIfNeeded) {\n return null;\n }\n const creds = cliModule.getStoredCredentials(apiUrl);\n if (!creds) {\n return null;\n }\n const refreshed = await cliModule.refreshCredentialsIfNeeded(apiUrl, creds, undefined, fetchFn);\n return refreshed?.access_token || null;\n } catch {\n return null;\n }\n}\n\nexport interface RefreshDevConfigTokenOptions {\n loadCredential?: LoadCredentialFn;\n fetchFn?: typeof fetch;\n}\n\n// resolveDevConfig runs once at startup, so the CLI rung's ~1h access_token needs refreshing on later requests; mutates devConfig in place since callers hold onto the single startup instance.\nexport async function refreshDevConfigToken(\n devConfig: DevConfigResult,\n options: RefreshDevConfigTokenOptions = {},\n): Promise<DevConfigResult> {\n if (devConfig.tokenSource !== 'cli') {\n return devConfig;\n }\n\n const exp = devConfig.identity?.exp;\n if (typeof exp === 'number' && exp - Math.floor(Date.now() / 1000) > 60) {\n return devConfig;\n }\n\n const loadCredential =\n options.loadCredential ?? ((url: string) => defaultLoadCredential(url, options.fetchFn));\n\n try {\n const refreshedToken = await loadCredential(devConfig.apiUrl);\n if (!refreshedToken?.trim()) {\n return devConfig;\n }\n\n const validation = validateDevToken(refreshedToken, { allowElevated: true });\n if (!validation.ok) {\n return devConfig;\n }\n\n devConfig.devToken = refreshedToken.trim();\n devConfig.identity = validation.identity;\n } catch {\n // Keep the existing (possibly stale) token; the proxied upstream call surfaces the failure.\n }\n\n return devConfig;\n}\n\n/**\n * Resolves dev environment configuration, validates the user dev JWT, probes\n * the write API for site accessibility, and verifies site identity consistency.\n */\nexport async function resolveDevConfig(\n options: ResolveDevConfigOptions = {},\n): Promise<DevConfigResult> {\n const siteDir = options.siteDir ? path.resolve(options.siteDir) : process.cwd();\n const fetchClient = options.fetchFn || fetch;\n\n // Load environment variables via Vite's loadEnv to match .env files\n let env: Record<string, string> = {};\n try {\n const vitePkg = 'vite';\n const vite = await import(/* @vite-ignore */ vitePkg);\n if (typeof vite.loadEnv === 'function') {\n env = vite.loadEnv('development', siteDir, '');\n }\n } catch {\n // Fall back to process.env\n }\n\n let devToken = env.CMS_DEV_TOKEN || process.env.CMS_DEV_TOKEN || '';\n let tokenSource: DevTokenSource | undefined = devToken ? 'env' : undefined;\n const devSiteId = env.CMS_DEV_SITE || process.env.CMS_DEV_SITE || '';\n const apiUrl = (\n options.apiUrl ||\n env.CMS_API_URL ||\n process.env.CMS_API_URL ||\n DEFAULT_DEV_API_URL\n ).replace(/\\/$/, '');\n const siteId = options.siteId || env.CMS_SITE_ID || process.env.CMS_SITE_ID || '';\n\n // 2nd rung: CLI session (stored credentials)\n if (!devToken) {\n const loadCredential =\n options.loadCredential ?? ((url) => defaultLoadCredential(url, fetchClient));\n try {\n const cliToken = await loadCredential(apiUrl);\n if (cliToken?.trim()) {\n devToken = cliToken.trim();\n tokenSource = 'cli';\n }\n } catch {\n // Swallow failure and fall through\n }\n }\n\n // 3rd rung: Auto-mint development JWT if running against local API and token is not explicitly configured\n if (!devToken && (apiUrl.includes('127.0.0.1') || apiUrl.includes('localhost'))) {\n const jwtSecret =\n env.SUPABASE_JWT_SECRET ||\n process.env.SUPABASE_JWT_SECRET ||\n 'super-secret-jwt-token-with-at-least-32-characters-long';\n try {\n devToken = signDevToken(jwtSecret, siteId || devSiteId || undefined);\n tokenSource = 'local-mint';\n } catch {\n // Fall through to unconfigured check\n }\n }\n\n // 1. Unconfigured check\n if (!devToken || !devToken.trim()) {\n return {\n status: 'unconfigured',\n siteId,\n devSiteId: devSiteId || undefined,\n apiUrl,\n mismatch: null,\n reason: 'Not logged in. Run `cms login` to enable dev-time editing.',\n };\n }\n\n // 2. Token format and scope validation (CLI rung allows elevated roles)\n const tokenValidation = validateDevToken(devToken, {\n allowElevated: tokenSource === 'cli',\n });\n if (!tokenValidation.ok) {\n return {\n status: 'refused',\n siteId,\n devSiteId: devSiteId || undefined,\n apiUrl,\n mismatch: null,\n reason: tokenValidation.reason,\n tokenSource,\n };\n }\n\n const identity = tokenValidation.identity;\n\n // 3. Probe site accessibility on API via GET /sites/:id with token\n const effectiveSiteId = siteId || devSiteId;\n if (!effectiveSiteId) {\n return {\n status: 'refused',\n siteId,\n devSiteId: devSiteId || undefined,\n apiUrl,\n identity,\n mismatch: null,\n reason: 'No site ID provided (set CMS_SITE_ID or siteId option)',\n tokenSource,\n };\n }\n\n try {\n const probeRes = await fetchClient(`${apiUrl}/sites/${encodeURIComponent(effectiveSiteId)}`, {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${devToken}`,\n },\n });\n\n if (!probeRes.ok) {\n let errorDetail = '';\n try {\n const body = (await probeRes.json()) as { error?: string };\n errorDetail = body.error || '';\n } catch {\n errorDetail = probeRes.statusText || String(probeRes.status);\n }\n return {\n status: 'refused',\n siteId: effectiveSiteId,\n devSiteId: devSiteId || undefined,\n apiUrl,\n identity,\n mismatch: null,\n reason: `Site '${effectiveSiteId}' inaccessible with dev token (HTTP ${probeRes.status}: ${errorDetail})`,\n tokenSource,\n };\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return {\n status: 'refused',\n siteId: effectiveSiteId,\n devSiteId: devSiteId || undefined,\n apiUrl,\n identity,\n mismatch: null,\n reason: `Failed to connect to CMS API at ${apiUrl}: ${msg}`,\n tokenSource,\n };\n }\n\n // 4. Site identity comparison (Wrong-site guard)\n // Check against CMS_DEV_SITE, .cms/bundle.json, and .cms/state.json\n let mismatch: DevSiteMismatch | null = null;\n\n if (devSiteId && siteId && devSiteId !== siteId) {\n mismatch = {\n source: 'CMS_DEV_SITE',\n expected: siteId,\n actual: devSiteId,\n };\n }\n\n if (!mismatch) {\n const bundlePath = path.join(siteDir, '.cms', 'bundle.json');\n if (fs.existsSync(bundlePath)) {\n try {\n const bundleContent = JSON.parse(fs.readFileSync(bundlePath, 'utf-8'));\n if (bundleContent?.site_id && siteId && bundleContent.site_id !== siteId) {\n mismatch = {\n source: '.cms/bundle.json',\n expected: siteId,\n actual: bundleContent.site_id,\n };\n }\n } catch {\n // Ignore unreadable bundle.json\n }\n }\n }\n\n if (!mismatch) {\n const statePath = path.join(siteDir, '.cms', 'state.json');\n if (fs.existsSync(statePath)) {\n try {\n const stateContent = JSON.parse(fs.readFileSync(statePath, 'utf-8'));\n const stateSiteKeys = stateContent?.sites ? Object.keys(stateContent.sites) : [];\n if (stateSiteKeys.length > 0 && siteId && !stateSiteKeys.includes(siteId)) {\n mismatch = {\n source: '.cms/state.json',\n expected: siteId,\n actual: stateSiteKeys.join(', '),\n };\n }\n } catch {\n // Ignore unreadable state.json\n }\n }\n }\n\n if (mismatch) {\n return {\n status: 'read-only',\n siteId: effectiveSiteId,\n devSiteId: devSiteId || undefined,\n apiUrl,\n devToken,\n identity,\n mismatch,\n tokenSource,\n };\n }\n\n return {\n status: 'ok',\n siteId: effectiveSiteId,\n devSiteId: devSiteId || effectiveSiteId,\n apiUrl,\n devToken,\n identity,\n mismatch: null,\n tokenSource,\n };\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http';\nimport type { Plugin, ViteDevServer } from 'vite';\nimport { resolveEditorOrigins } from '../preview/origins';\nimport { updateBundleFieldValue } from '../runtime/store';\nimport type { CmsClient, ContentBundle } from '../types';\nimport { type DevConfigResult, type LoadCredentialFn, refreshDevConfigToken } from './config';\nimport { mintDevPreviewToken } from './preview-token';\nimport type { VerifierInstance } from './verifier';\n\nexport interface CmsDevApiPluginOptions {\n devConfig: DevConfigResult;\n client?: CmsClient | null;\n verifier?: VerifierInstance;\n previewSecret?: string;\n editorOrigins?: string[];\n fetchFn?: typeof fetch;\n loadCredential?: LoadCredentialFn;\n}\n\nexport function isLoopbackAddress(remoteAddress?: string | null): boolean {\n if (!remoteAddress) return false;\n const cleaned = remoteAddress.trim();\n if (\n cleaned === '127.0.0.1' ||\n cleaned === '::1' ||\n cleaned === '::ffff:127.0.0.1' ||\n cleaned === 'localhost'\n ) {\n return true;\n }\n // IPv6 loopback variants or IPv4 mapped loopback\n if (cleaned.startsWith('::ffff:127.') || cleaned === '0:0:0:0:0:0:0:1') {\n return true;\n }\n return false;\n}\n\nfunction sendJson(res: ServerResponse, statusCode: number, data: unknown) {\n res.statusCode = statusCode;\n res.setHeader('Content-Type', 'application/json');\n res.end(JSON.stringify(data));\n}\n\nasync function readJsonBody<T = unknown>(req: IncomingMessage): Promise<T> {\n return new Promise((resolve, reject) => {\n let body = '';\n req.on('data', (chunk) => {\n body += chunk;\n });\n req.on('end', () => {\n try {\n resolve(body ? (JSON.parse(body) as T) : ({} as T));\n } catch (err) {\n reject(err);\n }\n });\n req.on('error', reject);\n });\n}\n\nexport function createDevApiMiddleware(options: CmsDevApiPluginOptions) {\n const {\n devConfig,\n client,\n verifier,\n previewSecret,\n editorOrigins,\n fetchFn = fetch,\n loadCredential,\n } = options;\n\n return async function devApiMiddleware(\n req: IncomingMessage,\n res: ServerResponse,\n next: () => void,\n ) {\n const rawUrl = req.url || '';\n const [pathname] = rawUrl.split('?');\n\n if (!pathname.startsWith('/_cms/dev')) {\n return next();\n }\n\n // 1. Loopback-only security gate\n const remoteAddress = req.socket?.remoteAddress;\n if (!isLoopbackAddress(remoteAddress)) {\n return sendJson(res, 403, {\n error: 'Forbidden: CMS dev routes accept loopback callers only',\n });\n }\n\n await refreshDevConfigToken(devConfig, { loadCredential, fetchFn });\n\n // 2. Refused or unconfigured gate\n if (devConfig.status === 'refused' || devConfig.status === 'unconfigured') {\n return sendJson(res, 503, {\n error: devConfig.reason || 'CMS dev routes unconfigured',\n status: devConfig.status,\n });\n }\n\n // 3. Dispatch routes\n if (pathname === '/_cms/dev/status' && req.method === 'GET') {\n const diag = verifier\n ? await verifier.getDiagnostics()\n : {\n available: false,\n errors: [],\n warnings: [],\n localHash: null,\n pushedHash: null,\n fresh: true,\n };\n\n return sendJson(res, 200, {\n status: devConfig.status,\n siteId: devConfig.siteId,\n devSiteId: devConfig.devSiteId,\n apiUrl: devConfig.apiUrl,\n env: { CMS_API_URL: devConfig.apiUrl },\n identity: devConfig.identity || null,\n mismatch: devConfig.mismatch || null,\n manifest: {\n fresh: diag.fresh,\n localHash: diag.localHash,\n pushedHash: diag.pushedHash,\n },\n verifier: {\n available: diag.available,\n errors: diag.errors,\n warnings: diag.warnings,\n },\n editorOrigins: resolveEditorOrigins(editorOrigins),\n });\n }\n\n if (pathname === '/_cms/dev/bundle' && req.method === 'GET') {\n try {\n let bundle: ContentBundle | null = null;\n if (client) {\n try {\n const previewToken = await mintDevPreviewToken(\n devConfig.siteId,\n previewSecret || client.previewSecret,\n );\n bundle = await client.getBundle(previewToken ? { previewToken } : undefined);\n } catch {\n bundle = null;\n }\n }\n\n // Fetch fields from write API\n let fields: unknown[] = [];\n try {\n const fieldsRes = await fetchFn(\n `${devConfig.apiUrl}/sites/${encodeURIComponent(devConfig.siteId)}/fields?include_orphaned=1`,\n {\n method: 'GET',\n headers: {\n Authorization: `Bearer ${devConfig.devToken}`,\n },\n },\n );\n if (fieldsRes.ok) {\n const fieldsJson = (await fieldsRes.json()) as { ok?: boolean; data?: unknown[] };\n fields = Array.isArray(fieldsJson.data) ? fieldsJson.data : [];\n }\n } catch {\n // Keep empty fields on failure\n }\n\n return sendJson(res, 200, {\n bundle,\n fields,\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return sendJson(res, 500, { error: `Failed to load bundle: ${msg}` });\n }\n }\n\n if (pathname === '/_cms/dev/value' && req.method === 'PATCH') {\n if (devConfig.status === 'read-only') {\n return sendJson(res, 403, {\n error: 'Toolbar is in read-only mode due to site ID mismatch',\n mismatch: devConfig.mismatch,\n });\n }\n\n let body: { key?: string; value?: unknown };\n try {\n body = await readJsonBody<{ key?: string; value?: unknown }>(req);\n } catch {\n return sendJson(res, 400, { error: 'Invalid JSON request body' });\n }\n\n if (!body.key || typeof body.key !== 'string') {\n return sendJson(res, 400, { error: 'Field key is required' });\n }\n\n try {\n const upstreamRes = await fetchFn(\n `${devConfig.apiUrl}/sites/${encodeURIComponent(devConfig.siteId)}/fields/${encodeURIComponent(body.key)}`,\n {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${devConfig.devToken}`,\n },\n body: JSON.stringify({ value: body.value }),\n },\n );\n\n const upstreamBodyText = await upstreamRes.text();\n if (upstreamRes.ok) {\n updateBundleFieldValue(body.key, body.value);\n }\n res.statusCode = upstreamRes.status;\n res.setHeader('Content-Type', 'application/json');\n res.end(upstreamBodyText);\n return;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n return sendJson(res, 502, { error: `Upstream API request failed: ${msg}` });\n }\n }\n\n // Unmatched /_cms/dev path\n return sendJson(res, 404, { error: 'Not Found' });\n };\n}\n\nexport function cmsDevApiPlugin(options: CmsDevApiPluginOptions): Plugin {\n return {\n name: 'cms-dev-api',\n apply: 'serve',\n enforce: 'pre',\n configureServer(server: ViteDevServer) {\n if (options.verifier) {\n options.verifier.attachServer(server);\n }\n server.middlewares.use(createDevApiMiddleware(options));\n },\n };\n}\n","import path from 'node:path';\nimport { hashSchema } from '@407dev/blocks';\nimport type { ViteDevServer } from 'vite';\n\nexport interface VerifierDiagnostic {\n type: 'error' | 'warning';\n message: string;\n file?: string;\n line?: number;\n column?: number;\n code?: string;\n}\n\nexport interface VerifierState {\n available: boolean;\n errors: VerifierDiagnostic[];\n warnings: VerifierDiagnostic[];\n localHash: string | null;\n pushedHash: string | null;\n fresh: boolean;\n}\n\nexport interface VerifierInstance {\n getDiagnostics: () => Promise<VerifierState>;\n run: () => Promise<VerifierState>;\n attachServer: (server: ViteDevServer) => void;\n}\n\nexport interface CreateVerifierOptions {\n siteDir: string;\n siteId: string;\n}\n\n/**\n * Creates a diagnostics verifier that extracts AST diagnostics from templates via @407dev/cli,\n * tracks manifest freshness against .cms/state.json, and streams updates via Vite HMR.\n */\nexport async function createVerifier(options: CreateVerifierOptions): Promise<VerifierInstance> {\n const { siteDir, siteId } = options;\n\n let cliModule: typeof import('@407dev/cli') | null = null;\n try {\n const cliPkg = '@407dev/cli';\n cliModule = await import(/* @vite-ignore */ cliPkg);\n } catch {\n cliModule = null;\n }\n\n let cachedState: VerifierState = {\n available: Boolean(cliModule),\n errors: [],\n warnings: [],\n localHash: null,\n pushedHash: null,\n fresh: true,\n };\n\n let activeServer: ViteDevServer | null = null;\n let debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\n async function run(): Promise<VerifierState> {\n if (!cliModule) {\n cachedState = {\n available: false,\n errors: [],\n warnings: [],\n localHash: null,\n pushedHash: null,\n fresh: true,\n };\n return cachedState;\n }\n\n try {\n const extractResult = await cliModule.extractProject(siteDir, { noSync: true });\n const localHash = hashSchema(extractResult.manifest);\n\n const stateStorePath = path.join(siteDir, '.cms', 'state.json');\n const store = new cliModule.StateStore(stateStorePath);\n const pushedHash = store.getSiteManifestHash(siteId);\n\n const fresh = Boolean(localHash && pushedHash && localHash === pushedHash);\n\n const errors: VerifierDiagnostic[] = (extractResult.errors || []).map((e) => ({\n type: 'error',\n message: e.message,\n file: e.file,\n line: e.line,\n column: e.column,\n code: e.code,\n }));\n\n const warnings: VerifierDiagnostic[] = (extractResult.warnings || []).map((w) => ({\n type: 'warning',\n message: w.message,\n file: w.file,\n line: w.line,\n column: w.column,\n code: w.code,\n }));\n\n // A run replaces the cache, ensuring warnings clear on fix\n cachedState = {\n available: true,\n errors,\n warnings,\n localHash,\n pushedHash,\n fresh,\n };\n\n if (activeServer?.hot) {\n activeServer.hot.send({\n type: 'custom',\n event: 'cms:diagnostics',\n data: cachedState,\n });\n }\n\n return cachedState;\n } catch (_err) {\n return cachedState;\n }\n }\n\n function handleFileEvent(filePath: string) {\n const normalized = filePath.replace(/\\\\/g, '/');\n if (\n normalized.includes('/src/') &&\n /\\.(astro|ts|tsx|js|mjs)$/.test(normalized) &&\n !normalized.endsWith('.d.ts')\n ) {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n debounceTimer = setTimeout(() => {\n debounceTimer = null;\n run();\n }, 300);\n }\n }\n\n function attachServer(server: ViteDevServer) {\n activeServer = server;\n\n server.watcher.on('change', handleFileEvent);\n server.watcher.on('add', handleFileEvent);\n server.watcher.on('unlink', handleFileEvent);\n }\n\n // Initial execution\n if (cliModule) {\n await run();\n }\n\n return {\n getDiagnostics: async () => cachedState,\n run,\n attachServer,\n };\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import { C as CollectionHandle } from '../types-CEYS5Fzc.js';
2
+ import { z } from '@407dev/blocks';
3
+
4
+ declare function defineEmailCampaignCollection(): CollectionHandle<z.ZodObject<{
5
+ subject: z.ZodString;
6
+ preheader: z.ZodOptional<z.ZodString>;
7
+ body: z.ZodAny;
8
+ cta: z.ZodOptional<z.ZodObject<{
9
+ text: z.ZodString;
10
+ url: z.ZodString;
11
+ }, z.core.$strip>>;
12
+ }, z.core.$strip>>;
13
+ declare function defineSmsCampaignCollection(): CollectionHandle<z.ZodObject<{
14
+ name: z.ZodString;
15
+ body: z.ZodString;
16
+ }, z.core.$strip>>;
17
+
18
+ export { defineEmailCampaignCollection, defineSmsCampaignCollection };
@@ -0,0 +1,37 @@
1
+ import { defineCollection } from '../chunk-7E3XJLKX.js';
2
+ import '../chunk-DMLOBKYE.js';
3
+ import { z } from '@407dev/blocks';
4
+
5
+ function defineEmailCampaignCollection() {
6
+ return defineCollection({
7
+ key: "email.campaign",
8
+ presentation: "form",
9
+ titleField: "subject",
10
+ listColumns: ["preheader"],
11
+ bodyField: "body",
12
+ schema: z.object({
13
+ subject: z.string(),
14
+ preheader: z.string().optional(),
15
+ body: z.any(),
16
+ cta: z.object({
17
+ text: z.string(),
18
+ url: z.string()
19
+ }).optional()
20
+ })
21
+ });
22
+ }
23
+ function defineSmsCampaignCollection() {
24
+ return defineCollection({
25
+ key: "sms.campaign",
26
+ presentation: "form",
27
+ titleField: "name",
28
+ schema: z.object({
29
+ name: z.string(),
30
+ body: z.string()
31
+ })
32
+ });
33
+ }
34
+
35
+ export { defineEmailCampaignCollection, defineSmsCampaignCollection };
36
+ //# sourceMappingURL=collections.js.map
37
+ //# sourceMappingURL=collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/fields/collections.ts"],"names":[],"mappings":";;;;AAGO,SAAS,6BAAA,GAAgC;AAC9C,EAAA,OAAO,gBAAA,CAAiB;AAAA,IACtB,GAAA,EAAK,gBAAA;AAAA,IACL,YAAA,EAAc,MAAA;AAAA,IACd,UAAA,EAAY,SAAA;AAAA,IACZ,WAAA,EAAa,CAAC,WAAW,CAAA;AAAA,IACzB,SAAA,EAAW,MAAA;AAAA,IACX,MAAA,EAAQ,EAAE,MAAA,CAAO;AAAA,MACf,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,MAClB,SAAA,EAAW,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,MAC/B,IAAA,EAAM,EAAE,GAAA,EAAI;AAAA,MACZ,GAAA,EAAK,EACF,MAAA,CAAO;AAAA,QACN,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,QACf,GAAA,EAAK,EAAE,MAAA;AAAO,OACf,EACA,QAAA;AAAS,KACb;AAAA,GACF,CAAA;AACH;AAEO,SAAS,2BAAA,GAA8B;AAC5C,EAAA,OAAO,gBAAA,CAAiB;AAAA,IACtB,GAAA,EAAK,cAAA;AAAA,IACL,YAAA,EAAc,MAAA;AAAA,IACd,UAAA,EAAY,MAAA;AAAA,IACZ,MAAA,EAAQ,EAAE,MAAA,CAAO;AAAA,MACf,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,MACf,IAAA,EAAM,EAAE,MAAA;AAAO,KAChB;AAAA,GACF,CAAA;AACH","file":"collections.js","sourcesContent":["import { z } from '@407dev/blocks';\nimport { defineCollection } from './collection';\n\nexport function defineEmailCampaignCollection() {\n return defineCollection({\n key: 'email.campaign',\n presentation: 'form',\n titleField: 'subject',\n listColumns: ['preheader'],\n bodyField: 'body',\n schema: z.object({\n subject: z.string(),\n preheader: z.string().optional(),\n body: z.any(),\n cta: z\n .object({\n text: z.string(),\n url: z.string(),\n })\n .optional(),\n }),\n });\n}\n\nexport function defineSmsCampaignCollection() {\n return defineCollection({\n key: 'sms.campaign',\n presentation: 'form',\n titleField: 'name',\n schema: z.object({\n name: z.string(),\n body: z.string(),\n }),\n });\n}\n"]}
@@ -0,0 +1,235 @@
1
+ import { a as CmsClientConfig, C as CmsClient, R as RouteSeo, b as CmsSiteConfig, c as CmsAstroOptions, V as VerifyTokenResult, d as ContentBundle, e as CmsRedirect } from './types-NaKJe6Pg.js';
2
+ export { f as CmsIntegrationOptions, G as GetBundleOptions, P as PreviewTokenPayload } from './types-NaKJe6Pg.js';
3
+ import { z } from '@407dev/blocks';
4
+ export { CmsAsset, z } from '@407dev/blocks';
5
+ import { C as CollectionHandle, a as CollectionEntry, I as InferEntryContent, D as DefineCollectionOptions, b as CollectionStaticPath, c as DualCallableHelper, G as GroupDefinition, F as FieldScope, d as FieldHelpersMap } from './types-CEYS5Fzc.js';
6
+ export { B as BoundGroupAccessor, e as FieldComponentProps, f as FieldReadOptions, g as GroupAccessor } from './types-CEYS5Fzc.js';
7
+ import { AstroIntegration } from 'astro';
8
+ export { P as PreviewMiddlewareContext, a as PreviewMiddlewareOptions, c as createPreviewMiddleware } from './preview-D9yewK8x.js';
9
+
10
+ declare function createCmsClient(config: CmsClientConfig): CmsClient;
11
+ declare function initCmsClient(options: {
12
+ siteId?: string;
13
+ contentUrl?: string;
14
+ previewSecret?: string;
15
+ client?: CmsClient;
16
+ }): CmsClient;
17
+ declare function getClient(): CmsClient | null;
18
+ declare function setClient(client: CmsClient | null): void;
19
+
20
+ declare function defineCollection<TSchema extends z.ZodTypeAny>(options: DefineCollectionOptions<TSchema>): CollectionHandle<TSchema>;
21
+ declare function getEntries<T extends CollectionHandle<z.ZodTypeAny> | string>(handleOrKey: T): Array<CollectionEntry<InferEntryContent<T>>>;
22
+ declare function getEntry<T extends CollectionHandle<z.ZodTypeAny> | string>(handleOrKey: T, slug: string): CollectionEntry<InferEntryContent<T>> | null;
23
+ declare function collectionPaths<T extends CollectionHandle<z.ZodTypeAny> | string>(handleOrKey: T): Promise<Array<CollectionStaticPath<InferEntryContent<T>>>>;
24
+
25
+ declare function createEntryDualCallableHelper<TValue = unknown, TDefault = TValue>(typeId: string, publicName: string, collectionKey: string, slug: string, defaultPath?: string): DualCallableHelper<TValue, TDefault>;
26
+ type EntryScopeAccessor = {
27
+ attrs(): {
28
+ 'data-cms-collection': string;
29
+ 'data-cms-entry'?: string;
30
+ };
31
+ collectionKey: string;
32
+ slug: string;
33
+ text: DualCallableHelper<string>;
34
+ number: DualCallableHelper<number>;
35
+ toggle: DualCallableHelper<boolean>;
36
+ select: DualCallableHelper<string>;
37
+ img: DualCallableHelper<unknown>;
38
+ image: DualCallableHelper<unknown>;
39
+ richText: DualCallableHelper<unknown>;
40
+ richtext: DualCallableHelper<unknown>;
41
+ [key: string]: any;
42
+ };
43
+ declare function createEntryScope(handleOrKey: CollectionHandle<z.ZodTypeAny> | string, slug: string): EntryScopeAccessor;
44
+ declare const entryScope: typeof createEntryScope;
45
+
46
+ declare function defineGroup<TShape extends Record<string, unknown>>(nameOrShape: string | TShape, shapeOrUndefined?: TShape): GroupDefinition<TShape>;
47
+
48
+ declare function createScope(prefix?: string): FieldScope;
49
+
50
+ declare function cmsFieldAttr(key: string): {
51
+ 'data-cms-field': string;
52
+ };
53
+ declare function cmsGroupAttr(groupName: string, prefix: string): {
54
+ 'data-cms-group': string;
55
+ };
56
+ declare function cmsEntryAttr(collectionKey: string, slug?: string): {
57
+ 'data-cms-collection': string;
58
+ 'data-cms-entry'?: string;
59
+ };
60
+ declare function cmsEntryFieldAttr(path: string): {
61
+ 'data-cms-entry-field': string;
62
+ };
63
+
64
+ type CmsF = FieldHelpersMap & {
65
+ scope: typeof createScope;
66
+ entryScope: typeof createEntryScope;
67
+ group: typeof defineGroup;
68
+ entries: typeof getEntries;
69
+ entry: typeof getEntry;
70
+ defineCollection: typeof defineCollection;
71
+ collectionPaths: typeof collectionPaths;
72
+ };
73
+ declare const f: CmsF;
74
+
75
+ interface HeadTag {
76
+ tag: 'title' | 'meta' | 'link';
77
+ attrs?: Record<string, string>;
78
+ content?: string;
79
+ }
80
+ interface BuildHeadTagsOptions {
81
+ siteUrl?: string;
82
+ }
83
+ interface HeadRouteInput {
84
+ path?: string;
85
+ pattern?: string;
86
+ title?: string;
87
+ seo?: RouteSeo;
88
+ [key: string]: unknown;
89
+ }
90
+ /**
91
+ * Pure function building an array of head tag descriptors from route and site config.
92
+ * Merges site_settings.default_seo underneath routes.seo overrides.
93
+ */
94
+ declare function buildHeadTags(route?: HeadRouteInput | null, siteConfig?: CmsSiteConfig | null, options?: BuildHeadTagsOptions): HeadTag[];
95
+
96
+ interface ImageTransformOptions {
97
+ width?: number;
98
+ height?: number;
99
+ format?: string;
100
+ fit?: 'scale-down' | 'contain' | 'cover' | 'crop' | 'pad' | string;
101
+ quality?: number;
102
+ }
103
+ /**
104
+ * Determines whether a URL is hosted on a zone domain eligible for /cdn-cgi/image transforms.
105
+ * Non-zone URLs (*.r2.dev, localhost, relative paths, data/blob URLs) return false.
106
+ */
107
+ declare function isCdnTransformableUrl(url: string): boolean;
108
+ /**
109
+ * Builds a Cloudflare /cdn-cgi/image/... transform URL.
110
+ * Automatically degrades to the raw source URL for non-transformable hostnames.
111
+ */
112
+ declare function buildCdnImageUrl(url: string, options?: ImageTransformOptions): string;
113
+ /**
114
+ * Generates an HTML srcset string with Cloudflare /cdn-cgi/image transforms for specified widths.
115
+ */
116
+ declare function buildSrcSet(url: string, widths?: number[], options?: Omit<ImageTransformOptions, 'width'>): string;
117
+
118
+ declare function cmsAstro(options?: CmsAstroOptions): AstroIntegration;
119
+ declare const cms: typeof cmsAstro;
120
+
121
+ /**
122
+ * Signs a payload with HS256 using standard Web Crypto API.
123
+ */
124
+ declare function signPreviewToken(payload: Record<string, unknown>, secret: string): Promise<string>;
125
+ /**
126
+ * Locally verifies a signed JWT token against a shared secret using standard Web Crypto API.
127
+ * Never performs network requests.
128
+ */
129
+ declare function verifyPreviewToken(token: string | null | undefined, secret: string | undefined, expectedSiteId?: string): Promise<VerifyTokenResult>;
130
+
131
+ declare const DEFAULT_EDITOR_ORIGINS: string[];
132
+ declare function resolveEditorOrigins(explicit?: string[] | string): string[];
133
+
134
+ interface GetPreviewDataOptions {
135
+ previewToken?: string | null;
136
+ client: CmsClient;
137
+ /** @deprecated Site hosts no longer verify preview tokens locally. */
138
+ previewSecret?: string;
139
+ siteId?: string;
140
+ }
141
+ interface PreviewBundleResult {
142
+ ok: boolean;
143
+ status: number;
144
+ bundle?: ContentBundle;
145
+ error?: string;
146
+ }
147
+ /**
148
+ * Retrieves draft content bundle using preview token (verified by content-worker).
149
+ */
150
+ declare function getPreviewData(options: GetPreviewDataOptions): Promise<PreviewBundleResult>;
151
+
152
+ interface RichTextRenderOptions {
153
+ components?: Record<string, unknown>;
154
+ maxDepth?: number;
155
+ }
156
+ declare function escapeHtml(str: string): string;
157
+ declare const KNOWN_NODES: Set<string>;
158
+ interface RichTextNodeShape {
159
+ type?: string;
160
+ text?: string;
161
+ attrs?: Record<string, unknown>;
162
+ marks?: Array<{
163
+ type: string;
164
+ attrs?: Record<string, unknown>;
165
+ }>;
166
+ content?: unknown[];
167
+ }
168
+ interface LinkMarkAttrs {
169
+ href: string;
170
+ target?: string;
171
+ rel?: string;
172
+ title?: string;
173
+ }
174
+ /** Parses a richtext value (doc object or JSON string) into a doc root, or null if invalid/empty. */
175
+ declare function parseRichTextDoc(value: unknown): {
176
+ type?: string;
177
+ content?: unknown[];
178
+ } | null;
179
+ /** Applies non-link marks to escaped text; `link` is resolved separately via getLinkMarkAttrs so callers can swap in a component. */
180
+ declare function renderMarksOnly(text: string, marks: Array<{
181
+ type: string;
182
+ attrs?: Record<string, unknown>;
183
+ }> | undefined): string;
184
+ declare function getLinkMarkAttrs(marks: Array<{
185
+ type: string;
186
+ attrs?: Record<string, unknown>;
187
+ }> | undefined): LinkMarkAttrs | null;
188
+ declare function renderRichTextHtml(doc: unknown, options?: RichTextRenderOptions): string;
189
+
190
+ declare const bundleReady: Promise<ContentBundle>;
191
+ declare function markBundleReady(bundle: ContentBundle): void;
192
+ declare function isBundleReady(): boolean;
193
+
194
+ declare function setActiveDraftBundle(bundle: ContentBundle | null): void;
195
+ declare function setBuildBundle(bundle: ContentBundle | null): void;
196
+ declare function getBuildBundle(): ContentBundle | null;
197
+ declare function getActiveBundle(): ContentBundle | null;
198
+ declare function isDraftMode(): boolean;
199
+ declare function runWithDraftBundle<T>(bundle: ContentBundle, fn: () => T): T;
200
+ declare function recordMissingField(key: string): void;
201
+ declare function getMissingFieldWarnings(): string[];
202
+ declare function clearMissingFieldWarnings(): void;
203
+ declare function updateBundleFieldValue(key: string, value: unknown): void;
204
+
205
+ /**
206
+ * Renders Cloudflare Pages _redirects file content from redirect definitions.
207
+ */
208
+ declare function renderRedirectsFile(redirects?: CmsRedirect[]): string;
209
+ interface RenderRobotsOptions {
210
+ siteUrl?: string;
211
+ }
212
+ /**
213
+ * Renders robots.txt content from site settings.
214
+ */
215
+ declare function renderRobotsTxt(config?: CmsSiteConfig | null, options?: RenderRobotsOptions): string;
216
+ interface RenderSitemapOptions {
217
+ siteUrl: string;
218
+ siteConfig?: CmsSiteConfig | null;
219
+ }
220
+ interface SitemapRouteItem {
221
+ id?: string;
222
+ path?: string;
223
+ pattern?: string;
224
+ published_at?: string;
225
+ updated_at?: string;
226
+ seo?: Record<string, unknown>;
227
+ [key: string]: unknown;
228
+ }
229
+ /**
230
+ * Renders sitemap.xml content from routes and site config.
231
+ * Excludes noindex routes and the 404 route.
232
+ */
233
+ declare function renderSitemapXml(routes: SitemapRouteItem[], options: RenderSitemapOptions): string;
234
+
235
+ export { type BuildHeadTagsOptions, CmsAstroOptions, CmsClient, CmsClientConfig, type CmsF, CmsRedirect, CmsSiteConfig, CollectionEntry, CollectionHandle, CollectionStaticPath, ContentBundle, DEFAULT_EDITOR_ORIGINS, DefineCollectionOptions, DualCallableHelper, type EntryScopeAccessor, FieldHelpersMap, FieldScope, type GetPreviewDataOptions, GroupDefinition, type HeadRouteInput, type HeadTag, type ImageTransformOptions, InferEntryContent, KNOWN_NODES, type LinkMarkAttrs, type PreviewBundleResult, type RenderRobotsOptions, type RenderSitemapOptions, type RichTextNodeShape, type RichTextRenderOptions, RouteSeo, type SitemapRouteItem, VerifyTokenResult, buildCdnImageUrl, buildHeadTags, buildSrcSet, bundleReady, clearMissingFieldWarnings, cms, cmsAstro, cmsEntryAttr, cmsEntryFieldAttr, cmsFieldAttr, cmsGroupAttr, collectionPaths, createCmsClient, createEntryDualCallableHelper, createEntryScope, createScope, defineCollection, defineGroup, entryScope, escapeHtml, f, getActiveBundle, getBuildBundle, getClient, getEntries, getEntry, getLinkMarkAttrs, getMissingFieldWarnings, getPreviewData, initCmsClient, isBundleReady, isCdnTransformableUrl, isDraftMode, markBundleReady, parseRichTextDoc, recordMissingField, renderMarksOnly, renderRedirectsFile, renderRichTextHtml, renderRobotsTxt, renderSitemapXml, resolveEditorOrigins, runWithDraftBundle, setActiveDraftBundle, setBuildBundle, setClient, signPreviewToken, updateBundleFieldValue, verifyPreviewToken };