canopycms 0.0.67-int.90 → 0.0.67

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 (539) hide show
  1. package/README.md +30 -3
  2. package/dist/ai/generate.js +1 -27
  3. package/dist/ai/handler.d.ts +0 -4
  4. package/dist/ai/handler.js +0 -11
  5. package/dist/ai/index.d.ts +1 -8
  6. package/dist/ai/index.js +1 -8
  7. package/dist/ai/json-to-markdown.js +15 -58
  8. package/dist/ai/resolve-branch.d.ts +2 -7
  9. package/dist/ai/resolve-branch.js +2 -8
  10. package/dist/ai/strip-mdx.d.ts +5 -13
  11. package/dist/ai/strip-mdx.js +5 -17
  12. package/dist/ai/to-plain-text.d.ts +10 -28
  13. package/dist/ai/to-plain-text.js +10 -28
  14. package/dist/ai/transform-components.d.ts +2 -4
  15. package/dist/ai/transform-components.js +8 -19
  16. package/dist/ai/types.d.ts +5 -10
  17. package/dist/api/admin-branch-health.d.ts +4 -12
  18. package/dist/api/admin-branch-health.js +26 -66
  19. package/dist/api/admin.d.ts +4 -12
  20. package/dist/api/admin.js +10 -26
  21. package/dist/api/assets.d.ts +0 -25
  22. package/dist/api/assets.js +50 -91
  23. package/dist/api/branch-merge.d.ts +1 -1
  24. package/dist/api/branch-merge.js +0 -2
  25. package/dist/api/branch-review.d.ts +0 -8
  26. package/dist/api/branch-review.js +0 -13
  27. package/dist/api/branch-status.d.ts +0 -3
  28. package/dist/api/branch-status.js +8 -33
  29. package/dist/api/branch-withdraw.d.ts +0 -1
  30. package/dist/api/branch-withdraw.js +6 -9
  31. package/dist/api/branch.d.ts +7 -12
  32. package/dist/api/branch.js +7 -44
  33. package/dist/api/client.d.ts +71 -224
  34. package/dist/api/client.js +82 -233
  35. package/dist/api/comments.d.ts +2 -4
  36. package/dist/api/comments.js +0 -17
  37. package/dist/api/content.d.ts +0 -6
  38. package/dist/api/content.js +66 -142
  39. package/dist/api/entries-constants.d.ts +5 -9
  40. package/dist/api/entries-constants.js +5 -9
  41. package/dist/api/entries.d.ts +8 -13
  42. package/dist/api/entries.js +20 -51
  43. package/dist/api/github-sync.d.ts +2 -4
  44. package/dist/api/github-sync.js +4 -8
  45. package/dist/api/groups.d.ts +3 -0
  46. package/dist/api/groups.js +8 -21
  47. package/dist/api/guards.d.ts +4 -16
  48. package/dist/api/guards.js +3 -22
  49. package/dist/api/index.d.ts +4 -4
  50. package/dist/api/permissions.d.ts +2 -0
  51. package/dist/api/permissions.js +18 -40
  52. package/dist/api/reference-options.d.ts +0 -1
  53. package/dist/api/reference-options.js +3 -11
  54. package/dist/api/request-body-hash.d.ts +12 -23
  55. package/dist/api/request-body-hash.js +12 -23
  56. package/dist/api/resolve-references.d.ts +0 -1
  57. package/dist/api/resolve-references.js +13 -28
  58. package/dist/api/route-builder.d.ts +3 -7
  59. package/dist/api/route-builder.js +1 -1
  60. package/dist/api/routes.d.ts +12 -0
  61. package/dist/api/routes.js +47 -0
  62. package/dist/api/schema.d.ts +23 -33
  63. package/dist/api/schema.js +20 -74
  64. package/dist/api/settings-helpers.js +4 -5
  65. package/dist/api/types.d.ts +0 -5
  66. package/dist/api/user.js +0 -5
  67. package/dist/api/validators.d.ts +14 -52
  68. package/dist/api/validators.js +14 -52
  69. package/dist/assets/asset-prefixes.d.ts +4 -8
  70. package/dist/assets/asset-prefixes.js +4 -8
  71. package/dist/assets/asset-src.d.ts +5 -22
  72. package/dist/assets/asset-src.js +5 -21
  73. package/dist/assets/factory.d.ts +1 -2
  74. package/dist/assets/factory.js +1 -2
  75. package/dist/assets/finalize.d.ts +3 -1
  76. package/dist/assets/finalize.js +3 -1
  77. package/dist/assets/index.d.ts +3 -3
  78. package/dist/assets/index.js +1 -1
  79. package/dist/assets/keys.d.ts +5 -3
  80. package/dist/assets/keys.js +6 -3
  81. package/dist/assets/pipeline.d.ts +3 -2
  82. package/dist/assets/pipeline.js +22 -56
  83. package/dist/assets/sharp-loader.d.ts +2 -10
  84. package/dist/assets/sharp-loader.js +2 -10
  85. package/dist/assets/store-local.d.ts +1 -2
  86. package/dist/assets/store-local.js +1 -2
  87. package/dist/assets/store-s3.d.ts +3 -4
  88. package/dist/assets/svg-sanitizer.d.ts +6 -14
  89. package/dist/assets/svg-sanitizer.js +6 -14
  90. package/dist/assets/transform-directives.d.ts +3 -4
  91. package/dist/assets/transform-directives.js +1 -1
  92. package/dist/assets/transform.d.ts +19 -30
  93. package/dist/assets/transform.js +18 -31
  94. package/dist/auth/cache.d.ts +2 -3
  95. package/dist/auth/cache.js +2 -3
  96. package/dist/auth/caching-auth-plugin.d.ts +11 -22
  97. package/dist/auth/caching-auth-plugin.js +12 -14
  98. package/dist/auth/context-helpers.d.ts +6 -20
  99. package/dist/auth/context-helpers.js +5 -17
  100. package/dist/auth/file-based-auth-cache.d.ts +10 -21
  101. package/dist/auth/file-based-auth-cache.js +23 -51
  102. package/dist/auth/plugin.d.ts +29 -61
  103. package/dist/auth/plugin.js +9 -13
  104. package/dist/auth/types.d.ts +11 -20
  105. package/dist/authorization/branch.d.ts +30 -49
  106. package/dist/authorization/branch.js +16 -42
  107. package/dist/authorization/content.d.ts +11 -40
  108. package/dist/authorization/content.js +13 -45
  109. package/dist/authorization/groups/index.d.ts +0 -3
  110. package/dist/authorization/groups/index.js +0 -3
  111. package/dist/authorization/groups/loader.d.ts +14 -28
  112. package/dist/authorization/groups/loader.js +14 -38
  113. package/dist/authorization/groups/schema.d.ts +0 -6
  114. package/dist/authorization/groups/schema.js +4 -7
  115. package/dist/authorization/helpers.d.ts +9 -28
  116. package/dist/authorization/helpers.js +9 -28
  117. package/dist/authorization/index.d.ts +3 -25
  118. package/dist/authorization/index.js +3 -35
  119. package/dist/authorization/path.d.ts +6 -13
  120. package/dist/authorization/path.js +8 -25
  121. package/dist/authorization/permissions/index.d.ts +0 -3
  122. package/dist/authorization/permissions/index.js +0 -3
  123. package/dist/authorization/permissions/loader.d.ts +14 -27
  124. package/dist/authorization/permissions/loader.js +14 -32
  125. package/dist/authorization/permissions/schema.d.ts +1 -6
  126. package/dist/authorization/permissions/schema.js +6 -13
  127. package/dist/authorization/protected-branch.d.ts +36 -65
  128. package/dist/authorization/protected-branch.js +29 -41
  129. package/dist/authorization/settings-file-store.d.ts +38 -81
  130. package/dist/authorization/settings-file-store.js +38 -79
  131. package/dist/authorization/types.d.ts +4 -26
  132. package/dist/authorization/types.js +0 -6
  133. package/dist/authorization/validation.d.ts +1 -23
  134. package/dist/authorization/validation.js +1 -24
  135. package/dist/branch-health.d.ts +39 -67
  136. package/dist/branch-health.js +27 -43
  137. package/dist/branch-metadata-file.d.ts +16 -32
  138. package/dist/branch-metadata-file.js +13 -26
  139. package/dist/branch-metadata.d.ts +49 -80
  140. package/dist/branch-metadata.js +57 -87
  141. package/dist/branch-registry.d.ts +26 -64
  142. package/dist/branch-registry.js +44 -93
  143. package/dist/branch-schema-cache.d.ts +34 -124
  144. package/dist/branch-schema-cache.js +49 -155
  145. package/dist/branch-workspace.d.ts +4 -4
  146. package/dist/branch-workspace.js +15 -19
  147. package/dist/build/generate-ai-content.d.ts +1 -0
  148. package/dist/build/generate-ai-content.js +12 -25
  149. package/dist/build-canopy.d.ts +17 -27
  150. package/dist/build-canopy.js +16 -23
  151. package/dist/build-mode.d.ts +25 -27
  152. package/dist/build-mode.js +25 -29
  153. package/dist/cli/cli.d.ts +15 -26
  154. package/dist/cli/cli.js +601 -978
  155. package/dist/cli/generate-ai-content.js +351 -628
  156. package/dist/cli/github-app-manifest.d.ts +84 -0
  157. package/dist/cli/github-app-manifest.js +161 -0
  158. package/dist/cli/init-github-app.d.ts +110 -444
  159. package/dist/cli/init-github-app.js +236 -773
  160. package/dist/cli/init.js +39 -80
  161. package/dist/cli/migrate.d.ts +13 -10
  162. package/dist/cli/migrate.js +22 -30
  163. package/dist/cli/project-detect.d.ts +17 -31
  164. package/dist/cli/project-detect.js +31 -42
  165. package/dist/cli/project-root.d.ts +4 -11
  166. package/dist/cli/project-root.js +4 -11
  167. package/dist/cli/prompt.d.ts +10 -0
  168. package/dist/cli/prompt.js +67 -0
  169. package/dist/cli/sync.d.ts +0 -8
  170. package/dist/cli/sync.js +8 -28
  171. package/dist/cli/template-files/middleware.ts.template +15 -29
  172. package/dist/cli/templates.d.ts +2 -12
  173. package/dist/cli/templates.js +4 -4
  174. package/dist/client.d.ts +1 -1
  175. package/dist/comment-store.d.ts +32 -53
  176. package/dist/comment-store.js +32 -52
  177. package/dist/config/flatten.d.ts +0 -3
  178. package/dist/config/flatten.js +2 -12
  179. package/dist/config/helpers.js +2 -2
  180. package/dist/config/index.d.ts +2 -2
  181. package/dist/config/index.js +1 -4
  182. package/dist/config/schemas/collection.d.ts +0 -8
  183. package/dist/config/schemas/collection.js +0 -10
  184. package/dist/config/schemas/config.d.ts +6 -78
  185. package/dist/config/schemas/config.js +38 -54
  186. package/dist/config/schemas/field.d.ts +2 -242
  187. package/dist/config/schemas/field.js +9 -20
  188. package/dist/config/schemas/media.js +1 -1
  189. package/dist/config/schemas/permissions.js +0 -2
  190. package/dist/config/schemas/url.d.ts +5 -6
  191. package/dist/config/schemas/url.js +5 -6
  192. package/dist/config/types.d.ts +45 -33
  193. package/dist/config/types.js +0 -1
  194. package/dist/config.d.ts +1 -8
  195. package/dist/config.js +1 -9
  196. package/dist/content-id-index.d.ts +76 -188
  197. package/dist/content-id-index.js +79 -230
  198. package/dist/content-index-generation.d.ts +27 -48
  199. package/dist/content-index-generation.js +35 -84
  200. package/dist/content-index-registry.d.ts +15 -24
  201. package/dist/content-index-registry.js +5 -9
  202. package/dist/content-listing.d.ts +64 -107
  203. package/dist/content-listing.js +68 -118
  204. package/dist/content-reader.d.ts +20 -29
  205. package/dist/content-reader.js +10 -18
  206. package/dist/content-store.d.ts +210 -336
  207. package/dist/content-store.js +413 -657
  208. package/dist/content-tree.d.ts +44 -86
  209. package/dist/content-tree.js +26 -54
  210. package/dist/context.d.ts +67 -94
  211. package/dist/context.js +53 -72
  212. package/dist/dev-content-watcher.d.ts +18 -18
  213. package/dist/dev-content-watcher.js +41 -44
  214. package/dist/editor/BranchManager.d.ts +3 -6
  215. package/dist/editor/BranchManager.js +24 -44
  216. package/dist/editor/CanopyEditor.js +5 -2
  217. package/dist/editor/CommentsPanel.js +0 -2
  218. package/dist/editor/Editor.js +19 -76
  219. package/dist/editor/EditorAuthGate.d.ts +27 -0
  220. package/dist/editor/EditorAuthGate.js +140 -0
  221. package/dist/editor/EntryNavigator.js +0 -20
  222. package/dist/editor/FormRenderer.d.ts +1 -2
  223. package/dist/editor/FormRenderer.js +8 -23
  224. package/dist/editor/admin/SystemHealthPanel.js +20 -37
  225. package/dist/editor/admin/useSystemHealth.d.ts +2 -3
  226. package/dist/editor/admin/useSystemHealth.js +10 -12
  227. package/dist/editor/client-reference-resolver.d.ts +2 -5
  228. package/dist/editor/client-reference-resolver.js +2 -19
  229. package/dist/editor/comments/BranchComments.js +0 -4
  230. package/dist/editor/comments/EntryComments.js +0 -4
  231. package/dist/editor/comments/FieldWrapper.js +0 -4
  232. package/dist/editor/comments/InlineCommentThread.js +0 -2
  233. package/dist/editor/comments/ThreadCarousel.d.ts +0 -58
  234. package/dist/editor/comments/ThreadCarousel.js +0 -12
  235. package/dist/editor/components/EditorFooter.d.ts +0 -8
  236. package/dist/editor/components/EditorFooter.js +0 -5
  237. package/dist/editor/components/EditorHeader.d.ts +0 -31
  238. package/dist/editor/components/EditorHeader.js +21 -71
  239. package/dist/editor/components/EditorSidebar.d.ts +0 -19
  240. package/dist/editor/components/EditorSidebar.js +0 -16
  241. package/dist/editor/components/EntryCreateModal.d.ts +4 -4
  242. package/dist/editor/components/EntryCreateModal.js +7 -22
  243. package/dist/editor/components/RenameEntryModal.js +0 -4
  244. package/dist/editor/components/UserBadge.js +0 -10
  245. package/dist/editor/components/index.js +0 -2
  246. package/dist/editor/context/ApiClientContext.d.ts +8 -7
  247. package/dist/editor/context/ApiClientContext.js +39 -11
  248. package/dist/editor/context/AssetContext.d.ts +7 -17
  249. package/dist/editor/context/AssetContext.js +7 -17
  250. package/dist/editor/context/EditorIdentityContext.d.ts +13 -0
  251. package/dist/editor/context/EditorIdentityContext.js +7 -0
  252. package/dist/editor/context/EditorStateContext.d.ts +10 -41
  253. package/dist/editor/context/EditorStateContext.js +7 -23
  254. package/dist/editor/context/SWRProvider.d.ts +3 -6
  255. package/dist/editor/context/index.d.ts +1 -20
  256. package/dist/editor/context/index.js +1 -20
  257. package/dist/editor/editor-utils.d.ts +8 -47
  258. package/dist/editor/editor-utils.js +19 -72
  259. package/dist/editor/fields/BlockField.d.ts +2 -2
  260. package/dist/editor/fields/BlockField.js +1 -2
  261. package/dist/editor/fields/CodeField.d.ts +0 -1
  262. package/dist/editor/fields/CodeField.js +0 -1
  263. package/dist/editor/fields/DateTimeField.d.ts +15 -22
  264. package/dist/editor/fields/DateTimeField.js +17 -26
  265. package/dist/editor/fields/ImageField.d.ts +2 -2
  266. package/dist/editor/fields/ImageField.js +8 -14
  267. package/dist/editor/fields/InlineGroupField.d.ts +0 -1
  268. package/dist/editor/fields/InlineGroupField.js +0 -1
  269. package/dist/editor/fields/MarkdownField.d.ts +0 -1
  270. package/dist/editor/fields/MarkdownField.js +6 -11
  271. package/dist/editor/fields/MdxImageDialog.d.ts +1 -1
  272. package/dist/editor/fields/MdxImageDialog.js +0 -1
  273. package/dist/editor/fields/NumberField.d.ts +9 -19
  274. package/dist/editor/fields/NumberField.js +11 -22
  275. package/dist/editor/fields/NumberListField.d.ts +7 -10
  276. package/dist/editor/fields/NumberListField.js +7 -10
  277. package/dist/editor/fields/ObjectField.d.ts +5 -8
  278. package/dist/editor/fields/ObjectField.js +0 -1
  279. package/dist/editor/fields/ReferenceField.d.ts +1 -1
  280. package/dist/editor/fields/ReferenceField.js +11 -16
  281. package/dist/editor/fields/SelectField.d.ts +2 -2
  282. package/dist/editor/fields/SelectField.js +0 -1
  283. package/dist/editor/fields/StringListField.d.ts +0 -4
  284. package/dist/editor/fields/StringListField.js +4 -9
  285. package/dist/editor/fields/TextField.d.ts +0 -1
  286. package/dist/editor/fields/TextField.js +0 -1
  287. package/dist/editor/fields/ToggleField.d.ts +0 -1
  288. package/dist/editor/fields/ToggleField.js +0 -1
  289. package/dist/editor/fields/entry-link/EntryLinkContext.js +2 -4
  290. package/dist/editor/fields/entry-link/InsertEntryLink.d.ts +0 -3
  291. package/dist/editor/fields/entry-link/InsertEntryLink.js +0 -4
  292. package/dist/editor/group-manager/ExternalGroupsTab.d.ts +0 -3
  293. package/dist/editor/group-manager/ExternalGroupsTab.js +0 -1
  294. package/dist/editor/group-manager/GroupCard.d.ts +0 -3
  295. package/dist/editor/group-manager/GroupForm.d.ts +0 -3
  296. package/dist/editor/group-manager/InternalGroupsTab.d.ts +0 -3
  297. package/dist/editor/group-manager/InternalGroupsTab.js +0 -2
  298. package/dist/editor/group-manager/MemberList.d.ts +0 -3
  299. package/dist/editor/group-manager/hooks/useExternalGroupSearch.d.ts +0 -3
  300. package/dist/editor/group-manager/hooks/useExternalGroupSearch.js +0 -3
  301. package/dist/editor/group-manager/hooks/useGroupState.d.ts +0 -3
  302. package/dist/editor/group-manager/hooks/useGroupState.js +0 -5
  303. package/dist/editor/group-manager/hooks/useUserSearch.d.ts +0 -3
  304. package/dist/editor/group-manager/hooks/useUserSearch.js +0 -3
  305. package/dist/editor/group-manager/index.d.ts +0 -6
  306. package/dist/editor/group-manager/index.js +0 -10
  307. package/dist/editor/group-manager/types.d.ts +2 -5
  308. package/dist/editor/group-manager/types.js +0 -3
  309. package/dist/editor/hooks/index.d.ts +6 -11
  310. package/dist/editor/hooks/index.js +6 -12
  311. package/dist/editor/hooks/useBranchActions.d.ts +0 -14
  312. package/dist/editor/hooks/useBranchActions.js +0 -22
  313. package/dist/editor/hooks/useBranchManager.d.ts +2 -48
  314. package/dist/editor/hooks/useBranchManager.js +4 -64
  315. package/dist/editor/hooks/useBranchesData.d.ts +7 -6
  316. package/dist/editor/hooks/useBranchesData.js +7 -6
  317. package/dist/editor/hooks/useCommentSystem.d.ts +0 -49
  318. package/dist/editor/hooks/useCommentSystem.js +1 -36
  319. package/dist/editor/hooks/useDraftManager.d.ts +2 -35
  320. package/dist/editor/hooks/useDraftManager.js +23 -64
  321. package/dist/editor/hooks/useEditorLayout.d.ts +0 -20
  322. package/dist/editor/hooks/useEditorLayout.js +0 -23
  323. package/dist/editor/hooks/useEntriesData.d.ts +1 -0
  324. package/dist/editor/hooks/useEntriesData.js +2 -3
  325. package/dist/editor/hooks/useEntryLinkResolution.d.ts +2 -2
  326. package/dist/editor/hooks/useEntryLinkResolution.js +2 -2
  327. package/dist/editor/hooks/useEntryManager.d.ts +2 -27
  328. package/dist/editor/hooks/useEntryManager.js +29 -78
  329. package/dist/editor/hooks/useGroupManager.d.ts +0 -21
  330. package/dist/editor/hooks/useGroupManager.js +0 -21
  331. package/dist/editor/hooks/usePermissionManager.d.ts +0 -20
  332. package/dist/editor/hooks/usePermissionManager.js +0 -20
  333. package/dist/editor/hooks/useReferenceResolution.d.ts +2 -33
  334. package/dist/editor/hooks/useReferenceResolution.js +1 -48
  335. package/dist/editor/hooks/useSchemaManager.d.ts +8 -27
  336. package/dist/editor/hooks/useSchemaManager.js +0 -19
  337. package/dist/editor/hooks/useUserContext.d.ts +2 -9
  338. package/dist/editor/hooks/useUserContext.js +10 -10
  339. package/dist/editor/hooks/useUserMetadata.d.ts +0 -2
  340. package/dist/editor/hooks/useUserMetadata.js +0 -3
  341. package/dist/editor/media/AssetCard.d.ts +0 -1
  342. package/dist/editor/media/AssetCard.js +1 -2
  343. package/dist/editor/media/CropStep.d.ts +0 -1
  344. package/dist/editor/media/CropStep.js +0 -1
  345. package/dist/editor/media/MediaLibrary.d.ts +1 -2
  346. package/dist/editor/media/MediaLibrary.js +1 -2
  347. package/dist/editor/media/MediaLibraryBody.d.ts +0 -1
  348. package/dist/editor/media/MediaLibraryBody.js +0 -1
  349. package/dist/editor/media/crop-math.d.ts +1 -1
  350. package/dist/editor/media/crop-math.js +1 -1
  351. package/dist/editor/permission-manager/GroupSelector.d.ts +0 -3
  352. package/dist/editor/permission-manager/PermissionEditor.d.ts +0 -4
  353. package/dist/editor/permission-manager/PermissionEditor.js +0 -1
  354. package/dist/editor/permission-manager/PermissionLevelBadge.d.ts +0 -7
  355. package/dist/editor/permission-manager/PermissionLevelBadge.js +0 -4
  356. package/dist/editor/permission-manager/PermissionTree.d.ts +0 -4
  357. package/dist/editor/permission-manager/UserSelector.d.ts +0 -3
  358. package/dist/editor/permission-manager/constants.d.ts +0 -3
  359. package/dist/editor/permission-manager/hooks/useGroupsAndUsers.d.ts +0 -3
  360. package/dist/editor/permission-manager/hooks/useGroupsAndUsers.js +0 -10
  361. package/dist/editor/permission-manager/hooks/usePermissionTree.d.ts +0 -14
  362. package/dist/editor/permission-manager/hooks/usePermissionTree.js +0 -11
  363. package/dist/editor/permission-manager/index.d.ts +0 -7
  364. package/dist/editor/permission-manager/index.js +0 -16
  365. package/dist/editor/permission-manager/types.d.ts +2 -12
  366. package/dist/editor/permission-manager/types.js +0 -3
  367. package/dist/editor/permission-manager/utils.d.ts +0 -28
  368. package/dist/editor/permission-manager/utils.js +9 -23
  369. package/dist/editor/preview-bridge.d.ts +5 -1
  370. package/dist/editor/preview-bridge.js +4 -4
  371. package/dist/editor/schema-editor/CollectionEditor.d.ts +0 -5
  372. package/dist/editor/schema-editor/CollectionEditor.js +9 -31
  373. package/dist/editor/schema-editor/EntryTypeEditor.d.ts +0 -6
  374. package/dist/editor/schema-editor/EntryTypeEditor.js +3 -24
  375. package/dist/editor/schema-editor/index.d.ts +0 -7
  376. package/dist/editor/schema-editor/index.js +0 -7
  377. package/dist/editor/utils/env.d.ts +3 -18
  378. package/dist/editor/utils/env.js +6 -25
  379. package/dist/entry-link-resolver.d.ts +13 -35
  380. package/dist/entry-link-resolver.js +20 -53
  381. package/dist/entry-schema-registry.d.ts +20 -60
  382. package/dist/entry-schema-registry.js +20 -69
  383. package/dist/entry-schema.d.ts +118 -223
  384. package/dist/entry-schema.js +46 -91
  385. package/dist/git-manager.d.ts +101 -200
  386. package/dist/git-manager.js +211 -384
  387. package/dist/github-service.d.ts +34 -75
  388. package/dist/github-service.js +37 -91
  389. package/dist/http/handler.d.ts +6 -37
  390. package/dist/http/handler.js +65 -120
  391. package/dist/http/router.d.ts +15 -32
  392. package/dist/http/router.js +34 -99
  393. package/dist/http/types.d.ts +15 -40
  394. package/dist/http/types.js +3 -7
  395. package/dist/id.d.ts +4 -10
  396. package/dist/id.js +4 -10
  397. package/dist/index.js +6 -9
  398. package/dist/operating-mode/client-safe-strategy.d.ts +7 -14
  399. package/dist/operating-mode/client-safe-strategy.js +8 -28
  400. package/dist/operating-mode/client-unsafe-strategy.d.ts +6 -16
  401. package/dist/operating-mode/client-unsafe-strategy.js +9 -34
  402. package/dist/operating-mode/client.d.ts +3 -10
  403. package/dist/operating-mode/client.js +3 -8
  404. package/dist/operating-mode/deployment-name-fixtures.d.ts +14 -18
  405. package/dist/operating-mode/deployment-name-fixtures.js +14 -18
  406. package/dist/operating-mode/deployment-name.d.ts +19 -29
  407. package/dist/operating-mode/deployment-name.js +29 -47
  408. package/dist/operating-mode/index.d.ts +4 -25
  409. package/dist/operating-mode/index.js +9 -31
  410. package/dist/operating-mode/mode-env.d.ts +32 -54
  411. package/dist/operating-mode/mode-env.js +36 -58
  412. package/dist/operating-mode/types.d.ts +24 -72
  413. package/dist/operating-mode/types.js +1 -7
  414. package/dist/paths/branch-name.d.ts +30 -40
  415. package/dist/paths/branch-name.js +30 -40
  416. package/dist/paths/branch.d.ts +4 -18
  417. package/dist/paths/branch.js +6 -22
  418. package/dist/paths/index.d.ts +2 -13
  419. package/dist/paths/index.js +3 -23
  420. package/dist/paths/normalize-server.d.ts +3 -15
  421. package/dist/paths/normalize-server.js +3 -15
  422. package/dist/paths/normalize.d.ts +13 -33
  423. package/dist/paths/normalize.js +13 -33
  424. package/dist/paths/resolve.d.ts +4 -17
  425. package/dist/paths/resolve.js +4 -22
  426. package/dist/paths/types.d.ts +12 -34
  427. package/dist/paths/types.js +5 -7
  428. package/dist/paths/validation.d.ts +22 -119
  429. package/dist/paths/validation.js +30 -148
  430. package/dist/reference-resolver.d.ts +0 -13
  431. package/dist/reference-resolver.js +0 -18
  432. package/dist/resolve-canopy-user.d.ts +16 -18
  433. package/dist/resolve-canopy-user.js +17 -26
  434. package/dist/resource-generation.d.ts +16 -25
  435. package/dist/resource-generation.js +34 -97
  436. package/dist/schema/meta-loader.d.ts +2 -14
  437. package/dist/schema/meta-loader.js +15 -64
  438. package/dist/schema/resolver.d.ts +1 -4
  439. package/dist/schema/resolver.js +1 -6
  440. package/dist/schema/schema-store-types.d.ts +0 -12
  441. package/dist/schema/schema-store.d.ts +61 -138
  442. package/dist/schema/schema-store.js +85 -282
  443. package/dist/schema/types.d.ts +0 -4
  444. package/dist/server.d.ts +62 -93
  445. package/dist/server.js +63 -94
  446. package/dist/services.d.ts +23 -47
  447. package/dist/services.js +55 -98
  448. package/dist/settings-workspace.d.ts +17 -30
  449. package/dist/settings-workspace.js +51 -81
  450. package/dist/static/index.d.ts +26 -52
  451. package/dist/static/index.js +33 -67
  452. package/dist/{worker/task-queue.d.ts → task-queue/cms-task-queue.d.ts} +7 -9
  453. package/dist/task-queue/cms-task-queue.js +13 -0
  454. package/dist/task-queue/task-queue-config.d.ts +3 -0
  455. package/dist/{worker → task-queue}/task-queue-config.js +1 -6
  456. package/dist/task-queue/task-queue.d.ts +16 -22
  457. package/dist/task-queue/task-queue.js +20 -44
  458. package/dist/task-queue/types.d.ts +0 -1
  459. package/dist/task-queue/worker-status.d.ts +35 -0
  460. package/dist/task-queue/worker-status.js +40 -0
  461. package/dist/types.d.ts +40 -51
  462. package/dist/url-collision.d.ts +26 -40
  463. package/dist/url-collision.js +47 -63
  464. package/dist/url-exclusivity-fixtures.d.ts +15 -20
  465. package/dist/url-exclusivity-fixtures.js +14 -19
  466. package/dist/url-path-resolver.d.ts +8 -16
  467. package/dist/url-path-resolver.js +19 -29
  468. package/dist/user.d.ts +8 -21
  469. package/dist/user.js +10 -19
  470. package/dist/utils/async-mutex.js +4 -6
  471. package/dist/utils/atomic-write.d.ts +2 -11
  472. package/dist/utils/atomic-write.js +2 -11
  473. package/dist/utils/body-field.d.ts +8 -15
  474. package/dist/utils/body-field.js +8 -15
  475. package/dist/utils/content-serialize.d.ts +18 -24
  476. package/dist/utils/content-serialize.js +109 -160
  477. package/dist/utils/content-write-lock.d.ts +51 -106
  478. package/dist/utils/content-write-lock.js +66 -111
  479. package/dist/utils/debug.d.ts +7 -23
  480. package/dist/utils/debug.js +7 -23
  481. package/dist/utils/entry-url.d.ts +11 -23
  482. package/dist/utils/entry-url.js +11 -26
  483. package/dist/utils/error.d.ts +25 -90
  484. package/dist/utils/error.js +60 -147
  485. package/dist/utils/flatten-group-fields.d.ts +5 -7
  486. package/dist/utils/flatten-group-fields.js +5 -7
  487. package/dist/utils/format.d.ts +1 -5
  488. package/dist/utils/format.js +1 -5
  489. package/dist/utils/fs.d.ts +3 -4
  490. package/dist/utils/fs.js +3 -4
  491. package/dist/utils/git.d.ts +52 -83
  492. package/dist/utils/git.js +79 -125
  493. package/dist/utils/logger.d.ts +35 -50
  494. package/dist/utils/logger.js +35 -52
  495. package/dist/utils/provisioning-lock.d.ts +23 -35
  496. package/dist/utils/provisioning-lock.js +49 -69
  497. package/dist/utils/sanitize-href.d.ts +5 -10
  498. package/dist/utils/sanitize-href.js +8 -18
  499. package/dist/utils/title-field.d.ts +17 -20
  500. package/dist/utils/title-field.js +18 -27
  501. package/dist/utils/typed-filename.d.ts +20 -48
  502. package/dist/utils/typed-filename.js +25 -61
  503. package/dist/utils/url-prefix.d.ts +3 -3
  504. package/dist/utils/url-prefix.js +3 -3
  505. package/dist/validation/block-structural-keys.d.ts +16 -31
  506. package/dist/validation/block-structural-keys.js +19 -29
  507. package/dist/validation/deletion-checker.d.ts +0 -34
  508. package/dist/validation/deletion-checker.js +1 -43
  509. package/dist/validation/entry-link-validator.d.ts +6 -13
  510. package/dist/validation/entry-link-validator.js +4 -13
  511. package/dist/validation/entry-type-reference-validator.d.ts +13 -18
  512. package/dist/validation/entry-type-reference-validator.js +13 -18
  513. package/dist/validation/entry-validator.d.ts +13 -25
  514. package/dist/validation/entry-validator.js +15 -32
  515. package/dist/validation/field-traversal.d.ts +3 -30
  516. package/dist/validation/field-traversal.js +1 -32
  517. package/dist/validation/reference-validator.d.ts +5 -24
  518. package/dist/validation/reference-validator.js +5 -30
  519. package/dist/worker/cms-worker.d.ts +172 -232
  520. package/dist/worker/cms-worker.js +241 -333
  521. package/dist/worker/git-sync.d.ts +32 -133
  522. package/dist/worker/git-sync.js +129 -191
  523. package/dist/worker/github-auth.d.ts +13 -19
  524. package/dist/worker/github-auth.js +13 -19
  525. package/dist/worker/history-rewrite.d.ts +53 -66
  526. package/dist/worker/history-rewrite.js +54 -60
  527. package/dist/worker/log.d.ts +24 -41
  528. package/dist/worker/log.js +25 -42
  529. package/dist/worker/rebase.d.ts +20 -110
  530. package/dist/worker/rebase.js +279 -354
  531. package/dist/worker/task-runner.d.ts +32 -66
  532. package/dist/worker/task-runner.js +126 -162
  533. package/dist/worker/worker-context.d.ts +41 -81
  534. package/package.json +4 -4
  535. package/dist/cli/template-files/middleware-clerk.ts.template +0 -37
  536. package/dist/worker/task-queue-config.d.ts +0 -8
  537. package/dist/worker/task-queue.js +0 -19
  538. package/dist/worker/worker-status.d.ts +0 -47
  539. package/dist/worker/worker-status.js +0 -52
@@ -1,22 +1,15 @@
1
1
  /**
2
2
  * The entry-schema authoring API — the surface ADOPTERS write against.
3
- *
4
3
  * `defineEntrySchema`, `defineInlineFieldGroup`, `defineNestedFieldGroup` and
5
- * `defineSeoFieldGroup` are how a host app declares its content model in
6
- * TypeScript, with the field list inferring the entry's data type. Changing a
7
- * signature here is an adopter-facing breaking change, not an internal one.
8
- *
9
- * This is the type-level half of the schema story. The runtime half — loading
10
- * `.collection.json`, resolving it, and validating content against it — lives in
11
- * `schema/` and `validation/`.
4
+ * `defineSeoFieldGroup` declare a host app's content model in TypeScript, with the
5
+ * field list inferring the entry's data type, so changing a signature here is an
6
+ * adopter-facing breaking change, not an internal one.
12
7
  *
8
+ * Type-level half only: loading `.collection.json`, resolving it and validating
9
+ * content against it live in `schema/` and `validation/`.
13
10
  * `RESOLVED_REFERENCE_KEYS`/`buildResolvedReference` define the shape a resolved
14
- * reference takes; `validation/entry-validator.ts`'s `normalizeReferenceValues`
15
- * is the inverse, and the two must agree.
16
- *
17
- * `DEFAULT_SEO_FIELD_NAMES` is imported from `static/seo.ts` rather than
18
- * redeclared, so the schema this module emits and the fields that module reads
19
- * cannot drift apart.
11
+ * reference takes and must agree with `validation/entry-validator.ts`'s inverse
12
+ * `normalizeReferenceValues`.
20
13
  *
21
14
  * Module map: ./AGENTS.md.
22
15
  */
@@ -38,16 +31,12 @@ type InferableField = {
38
31
  * For select fields: the option list. Inferring the literal union of these values is
39
32
  * what makes a select field's type its own options rather than a bare `string`.
40
33
  *
41
- * MUST stay `readonly` even though `SelectFieldConfig.options` (config/types.ts) is a
42
- * mutable `SelectOption[]` — but NOT for the reason you might assume. A mutable
43
- * constraint does not defeat `const` inference here: verified against this repo's tsc,
44
- * `<const T>` still infers `['a', 'b']` with the literals intact under a mutable
45
- * constraint, so the union would survive. The real failure is louder. An adopter who
46
- * declares the option list separately and shares it across schemas writes
47
- * `as const`, producing a `readonly` tuple — and a `readonly` array is not assignable
48
- * to a mutable one (TS4104), so every such schema would stop compiling at the
49
- * definition site. `readonly` here accepts both the inline literal and the shared
50
- * `as const` array.
34
+ * MUST stay `readonly`, though `SelectFieldConfig.options` (config/types.ts) is a mutable
35
+ * `SelectOption[]`: an adopter who declares the option list separately and shares it
36
+ * across schemas writes `as const`, and a `readonly` array is not assignable to a mutable
37
+ * one (TS4104), so every such schema would stop compiling at its definition site.
38
+ * `readonly` accepts both the inline literal and the shared `as const` array. (A mutable
39
+ * constraint would not by itself defeat `const` inference — that is not the reason.)
51
40
  */
52
41
  options?: readonly (string | {
53
42
  label: string;
@@ -66,12 +55,6 @@ type InferableField = {
66
55
  * The fields reference resolution adds to a target's own data, on top of whatever
67
56
  * `resolvedSchema` declares.
68
57
  *
69
- * These have always been returned at runtime (`resolveSingleReferenceOnce` in
70
- * content-store.ts) but were missing from the inferred type, so a resolved reference typed
71
- * narrower than it actually is — which is why reading `ref.id` needed a cast, and one source
72
- * of the library-internal type error `adopter-migration.md` records under
73
- * `exactOptionalPropertyTypes` + `skipLibCheck: false`.
74
- *
75
58
  * `urlPath` is what makes a resolved reference linkable without a second lookup; it follows
76
59
  * the same collection+slug rule `listEntries` publishes as `item.urlPath`, so an index entry
77
60
  * collapses to its parent path.
@@ -99,27 +82,23 @@ export interface ResolvedReferenceMeta {
99
82
  * embed it, then the reserved metadata.
100
83
  *
101
84
  * Exists so the two places that construct one — the server resolver in content-store.ts and
102
- * the editor's live-preview endpoint in api/resolve-references.ts — cannot drift. They already
103
- * had: the preview endpoint kept the old `{ id, ...data }` order and carried none of the other
104
- * three keys, so a component rendering `<a href={ref.urlPath}>` showed `undefined` while
105
- * previewing and a real URL once published.
106
- *
107
- * The ordering is the contract, not a detail. Metadata last means a target that models `id` as
108
- * a content field cannot shadow the real content ID — which matters because the write boundary
109
- * recovers a reference's id from `value.id` (`referenceValueId`), so shadowing it made a
110
- * re-save persist the wrong value and silently repoint the reference. Body before metadata
111
- * closes the same hole for a body field named `id`; that schema is also rejected outright by
112
- * the entry schema registry, so this ordering is the guarantee and that check is the loud
113
- * error rather than a silent drop.
85
+ * the editor's live-preview endpoint in api/resolve-references.ts — cannot drift.
86
+ *
87
+ * The ordering is the contract, not a detail. Metadata LAST means a target that models `id` as
88
+ * a content field cannot shadow the real content ID, which the write boundary recovers from
89
+ * `value.id` (`referenceValueId`) — a shadowed id makes a re-save persist the wrong value and
90
+ * silently repoint the reference. Body before metadata closes the same hole for a body field
91
+ * named `id`; the entry schema registry also rejects that schema outright, so this ordering is
92
+ * the guarantee and that check is the loud error rather than a silent drop.
114
93
  */
115
94
  export declare function buildResolvedReference(data: Record<string, unknown>, meta: ResolvedReferenceMeta, body?: {
116
95
  fieldName: string;
117
96
  value: string | undefined;
118
97
  }): Record<string, unknown>;
119
98
  /**
120
- * Recursively flatten inline groups (type: 'group') out of a field tuple so that
121
- * InferContentShape sees only data-carrying fields. Inline groups contribute no
122
- * key to the content shape — their children are merged into the parent level.
99
+ * Recursively flatten inline groups (type: 'group') out of a field tuple: they contribute
100
+ * no key to the content shape, so their children merge into the parent level and
101
+ * InferContentShape sees only data-carrying fields.
123
102
  */
124
103
  type FlattenInlineGroups<Fields extends readonly InferableField[]> = Fields extends readonly [
125
104
  infer Head,
@@ -129,11 +108,10 @@ type FlattenInlineGroups<Fields extends readonly InferableField[]> = Fields exte
129
108
  fields: infer GFields extends readonly InferableField[];
130
109
  } ? [...FlattenInlineGroups<GFields>, ...FlattenInlineGroups<Rest>] : [Head, ...FlattenInlineGroups<Rest>] : [];
131
110
  /**
132
- * Collapse an intersection of mapped types into one object type, preserving the `?`
133
- * modifier (the mapped type is homomorphic over `keyof T`, so optionality survives).
134
- * Without it, InferContentShape would surface as `{ a: string } & { b?: string }` —
135
- * structurally equivalent, but it reads badly in editor tooltips and is not accepted
136
- * by strict type-equality assertions.
111
+ * Collapse an intersection of mapped types into one object type, preserving the `?` modifier
112
+ * (homomorphic over `keyof T`, so optionality survives). Without it InferContentShape surfaces
113
+ * as `{ a: string } & { b?: string }` — structurally equivalent, but it reads badly in editor
114
+ * tooltips and fails strict type-equality assertions.
137
115
  */
138
116
  type Simplify<T> = {
139
117
  [K in keyof T]: T[K];
@@ -144,38 +122,30 @@ type Simplify<T> = {
144
122
  */
145
123
  type ScalarValue<F extends InferableField, V> = F['list'] extends true ? V[] : V;
146
124
  /**
147
- * The value one `select` option contributes to the field's value union. A bare string
148
- * option contributes itself; a `{ label, value }` option contributes its `value`, not
149
- * the whole object. Mixed arrays of both forms work because this distributes.
150
- *
151
- * Falls back to `string` for an option whose literal type is gone — an options array
152
- * annotated as `SelectOption[]` rather than inferred by `defineEntrySchema` widens to
153
- * `string | { label: string; value: string }`, and both arms then land on `string`.
125
+ * The value one `select` option contributes to the field's value union: a bare string option
126
+ * contributes itself, a `{ label, value }` option its `value`. Mixed arrays work because this
127
+ * distributes. Falls back to `string` for an option whose literal type is gone — an array
128
+ * annotated `SelectOption[]` rather than inferred by `defineEntrySchema` widens to
129
+ * `string | { label: string; value: string }`, and both arms land on `string`.
154
130
  */
155
131
  type SelectOptionValue<O> = O extends {
156
132
  value: infer V extends string;
157
133
  } ? V : O extends string ? O : string;
158
134
  /**
159
- * The value type of a `select` field: the literal union of its OWN `options`.
160
- *
161
- * A select value is always a string — `SelectOption` (config/types.ts) carries
162
- * `value: string` in both arms, `normalizeOptions` (editor/FormRenderer.tsx) emits
163
- * strings, and `validateEntryData` (validation/entry-validator.ts) rejects anything
164
- * that is not one. This type says WHICH strings.
165
- *
166
- * Like the rest of InferContentShape, this models the SCHEMA'S declared shape, not
167
- * every byte the validator will tolerate on disk — the same stance that types a field
168
- * omitting `required` as a required property. Notably the validator also accepts `''`
169
- * as "not filled in" for any field that is not explicitly `required: true`, and `''` is
170
- * deliberately NOT in this union.
171
- *
172
- * Degrades to `string` when there is nothing to infer: no `options` key at all, or an
173
- * empty one. Both are schema mistakes that `ensureSelectFieldsHaveOptions`
174
- * (config/validation.ts) rejects — but note it runs from `createEntrySchemaRegistry`,
175
- * NOT from `validateCanopyConfig`, so a schema that is only ever fed to
176
- * `TypeFromEntrySchema` and never registered gets no runtime rejection at all.
177
- * Returning `never` here would type such a field as unsatisfiable, which is a worse
178
- * error than the bare `string` this falls back to.
135
+ * The value type of a `select` field: the literal union of its OWN `options`. A select value is
136
+ * always a string — `SelectOption` (config/types.ts) carries `value: string` in both arms,
137
+ * `normalizeOptions` (editor/FormRenderer.tsx) emits strings, and `validateEntryData`
138
+ * (validation/entry-validator.ts) rejects anything else — so this says WHICH strings.
139
+ *
140
+ * Like the rest of InferContentShape, it models the SCHEMA'S declared shape, not every byte the
141
+ * validator tolerates on disk: the validator also accepts `''` as "not filled in" for any field
142
+ * that is not explicitly `required: true`, and `''` is deliberately NOT in this union.
143
+ *
144
+ * Degrades to `string` when there is nothing to infer (no `options` key, or an empty one). Both
145
+ * are schema mistakes `ensureSelectFieldsHaveOptions` (config/validation.ts) rejects — but it
146
+ * runs from `createEntrySchemaRegistry`, so a schema only ever fed to `TypeFromEntrySchema` and
147
+ * never registered gets no runtime rejection. `never` here would type such a field as
148
+ * unsatisfiable, a worse error than this bare `string`.
179
149
  */
180
150
  type SelectValue<F extends InferableField> = F extends {
181
151
  options: infer O extends readonly unknown[];
@@ -184,12 +154,9 @@ type ObjectValue<F extends InferableField & {
184
154
  fields: readonly InferableField[];
185
155
  }> = F['list'] extends true ? Array<InferContentShape<F['fields']>> : InferContentShape<F['fields']>;
186
156
  /**
187
- * Distributes over each member of a block templates union to produce a discriminated union.
188
- *
189
- * Uses a bare type parameter `T` so that the conditional type distributes:
190
- * given `T = { name: 'hero'; fields: [...] } | { name: 'cta'; fields: [...] }`,
191
- * produces `{ template: 'hero'; value: { ... } } | { template: 'cta'; value: { ... } }`
192
- * rather than collapsing into a single merged object.
157
+ * Distributes over each member of a block-templates union to produce a discriminated union. The
158
+ * bare type parameter `T` is what makes the conditional distribute: `{ name: 'hero'; ... } |
159
+ * { name: 'cta'; ... }` yields two `{ template; value }` members rather than one merged object.
193
160
  */
194
161
  type DistributeBlockTemplate<T> = T extends {
195
162
  name: infer N;
@@ -205,9 +172,8 @@ type BlockValue<F extends InferableField & {
205
172
  }>;
206
173
  }> = Array<DistributeBlockTemplate<F['templates'][number]>>;
207
174
  /**
208
- * Structural mirror of `ImageFieldValue` (config/types.ts). Kept inline
209
- * rather than imported so this module stays free of a FieldConfig import
210
- * (see the module doc comment: "importing FieldConfig is not required").
175
+ * Structural mirror of `ImageFieldValue` (config/types.ts), inline rather than imported so this
176
+ * module stays free of a FieldConfig import.
211
177
  */
212
178
  type ImageValue = {
213
179
  src: string;
@@ -251,19 +217,15 @@ type FieldValue<F extends InferableField> = F extends {
251
217
  type: 'date';
252
218
  } ? ScalarValue<F, string> : ScalarValue<F, string>;
253
219
  /**
254
- * Infer a TypeScript data shape from a CanopyCMS FieldConfig-like array.
255
- * - Objects become nested objects
256
- * - Blocks become arrays of tagged templates with their value shapes
257
- * - Lists become arrays of the scalar/object type
258
- * - A field with an explicit `required: false` becomes an OPTIONAL property
259
- * (`subheading?: string`), so a literal may omit it entirely rather than spelling it
260
- * out as `undefined`. Reading it still yields `string | undefined`.
261
- * - A field that OMITS `required` stays a REQUIRED property. `F['required']` infers as
262
- * `boolean | undefined` there, which does not extend `false`. This three-way
263
- * distinction (`true` / `false` / absent) is deliberate and pinned by tests — only an
264
- * explicit `required: false` opts a key into `?:`.
265
- * - Inline groups (type: 'group') are flattened — their fields contribute directly
266
- * to the parent shape with no intermediate key.
220
+ * Infer a TypeScript data shape from a CanopyCMS FieldConfig-like array: objects nest, blocks
221
+ * become arrays of tagged templates, lists become arrays of the scalar/object type, and inline
222
+ * groups (type: 'group') flatten into the parent shape with no intermediate key.
223
+ *
224
+ * Optionality is three-way (`true` / `false` / absent), deliberate and pinned by tests: only an
225
+ * explicit `required: false` opts a key into `?:` (`subheading?: string`, so a literal may omit
226
+ * it rather than spell out `undefined`; reading it still yields `string | undefined`). A field
227
+ * that OMITS `required` stays REQUIRED, because `F['required']` infers there as
228
+ * `boolean | undefined`, which does not extend `false`.
267
229
  *
268
230
  * Works with any structurally compatible array; importing FieldConfig is not required.
269
231
  */
@@ -272,13 +234,9 @@ type InferContentShape<Fields extends readonly InferableField[]> = Simplify<{
272
234
  } & {
273
235
  [F in FlattenInlineGroups<Fields>[number] as F['required'] extends false ? F['name'] : never]?: FieldValue<F>;
274
236
  }>;
275
- /**
276
- * Helper to define entry schema field arrays with literal inference without sprinkling `as const`.
277
- */
237
+ /** Define an entry schema's field array with literal inference, without sprinkling `as const`. */
278
238
  export declare const defineEntrySchema: <const T extends readonly InferableField[]>(fields: T) => T;
279
- /**
280
- * Convenience alias to derive the content shape from a `defineEntrySchema` result.
281
- */
239
+ /** Content shape derived from a `defineEntrySchema` result. */
282
240
  export type TypeFromEntrySchema<T extends readonly InferableField[]> = InferContentShape<T>;
283
241
  /**
284
242
  * Derive a map of entry-type-name → content-shape from an `entrySchemaRegistry`.
@@ -290,50 +248,32 @@ export type TypeFromEntrySchema<T extends readonly InferableField[]> = InferCont
290
248
  *
291
249
  * @example
292
250
  * ```ts
293
- * export const entrySchemaRegistry = createEntrySchemaRegistry({
294
- * partner: partnerSchema,
295
- * doc: docSchema,
296
- * home: homeSchema,
297
- * })
298
- *
299
251
  * export type EntryTypes = EntryTypesFromRegistry<typeof entrySchemaRegistry>
300
- *
301
- * // Then per-schema aliases stay one line each, anchored to the registry:
252
+ * // Per-schema aliases stay one line each, anchored to the registry:
302
253
  * export type PartnerContent = EntryTypes['partner']
303
254
  *
304
- * // And the tree-builder narrows on entryType:
305
- * await canopy.buildContentTree<NavFields, EntryTypes>({
306
- * extract: (data, meta) => {
307
- * if (meta.kind === 'collection' && meta.indexEntry?.entryType === 'partner') {
308
- * // meta.indexEntry.data is typed PartnerContent
309
- * }
310
- * },
311
- * })
255
+ * // And the tree-builder narrows on entryType: inside this extract,
256
+ * // meta.indexEntry.data is typed PartnerContent once meta.indexEntry?.entryType
257
+ * // has been checked against 'partner'.
258
+ * await canopy.buildContentTree<NavFields, EntryTypes>({ extract: (data, meta) => { … } })
312
259
  * ```
313
260
  */
314
261
  export type EntryTypesFromRegistry<T extends Record<string, readonly InferableField[]>> = {
315
262
  [K in keyof T]: TypeFromEntrySchema<T[K]>;
316
263
  };
317
264
  /**
318
- * Define a reusable inline field group — a visual container in the editor that groups
319
- * related fields together without creating a nested data key. The group's fields are
320
- * stored flat alongside the other fields in the content file.
321
- *
322
- * Use this when you want consistent visual organization across schemas without
323
- * changing your content file structure.
324
- *
325
- * For data-nested grouping (fields stored under a named key), use defineNestedFieldGroup().
265
+ * Define a reusable inline field group — a visual container in the editor that groups related
266
+ * fields without creating a nested data key, so they are stored FLAT alongside the other fields.
267
+ * Use it for consistent visual organization across schemas without changing the content file
268
+ * structure; for data-nested grouping, use defineNestedFieldGroup().
326
269
  *
327
270
  * @example
328
271
  * const seoGroup = defineInlineFieldGroup({
329
272
  * name: 'seo',
330
273
  * label: 'SEO',
331
- * fields: [
332
- * { name: 'metaTitle', type: 'string', label: 'Meta Title' },
333
- * { name: 'metaDescription', type: 'string', label: 'Meta Description' },
334
- * ],
274
+ * fields: [{ name: 'metaTitle', type: 'string', label: 'Meta Title' }],
335
275
  * })
336
- * // TypeFromEntrySchema: { ..., metaTitle: string, metaDescription: string }
276
+ * // TypeFromEntrySchema: { ..., metaTitle: string }
337
277
  */
338
278
  export declare const defineInlineFieldGroup: <const T extends {
339
279
  name: string;
@@ -346,30 +286,24 @@ export declare const defineInlineFieldGroup: <const T extends {
346
286
  /**
347
287
  * The recommended SEO field group, ready to drop into any entry schema.
348
288
  *
349
- * Emits the seven fields `extractSeoFields()` reads by default (`metaTitle`,
350
- * `metaDescription`, `ogImage`, `ogType`, `canonical`, `noindex`, `twitterCard`), so schema and
351
- * read side agree with no configuration. Every field is `required: false` — SEO metadata is
352
- * always optional, and an unset field must fall back rather than fail validation.
289
+ * Emits the seven fields `extractSeoFields()` reads by default (`metaTitle`, `metaDescription`,
290
+ * `ogImage`, `ogType`, `canonical`, `noindex`, `twitterCard`), so schema and read side agree with
291
+ * no configuration. Every field is `required: false`: SEO metadata is always optional, and an
292
+ * unset field must fall back rather than fail validation.
353
293
  *
354
- * **Flat by default.** The fields are stored flat in the content file (an inline group: a
355
- * visual container in the editor that adds no data key). Pass `group: 'seo'` for the nested
356
- * convention, which stores them under that key — and then pass the same `{ group: 'seo' }` to
357
- * `extractSeoFields` / `entryToMetadata`.
294
+ * **Flat by default** — an inline group, stored at the top level of the content file with no data
295
+ * key of its own. `group: 'seo'` nests them under that key instead, and the same
296
+ * `{ group: 'seo' }` must then be passed to `extractSeoFields` / `entryToMetadata`.
358
297
  *
359
298
  * @example
360
299
  * // Flat (recommended): frontmatter carries `metaTitle:` at the top level.
361
- * const pageSchema = defineEntrySchema([
362
- * { name: 'title', type: 'string' },
363
- * defineSeoFieldGroup(),
364
- * ])
365
- * // TypeFromEntrySchema: { title: string; metaTitle?: string; metaDescription?: string; ... }
300
+ * defineEntrySchema([{ name: 'title', type: 'string' }, defineSeoFieldGroup()])
301
+ * // TypeFromEntrySchema: { title: string; metaTitle?: string; ... }
366
302
  *
367
303
  * @example
368
- * // Nested: frontmatter carries `seo: { metaTitle: … }`.
369
- * const pageSchema = defineEntrySchema([defineSeoFieldGroup({ group: 'seo' })])
304
+ * // Nested: frontmatter carries `seo: { metaTitle: … }`, and the `seo` key is itself optional.
305
+ * defineEntrySchema([defineSeoFieldGroup({ group: 'seo' })])
370
306
  * const metadata = entryToMetadata(data, { group: 'seo' })
371
- * // TypeFromEntrySchema: { seo?: { metaTitle?: string; ... } } — the wrapper key itself is
372
- * // optional too, so an entry that sets no SEO fields at all can omit `seo` entirely.
373
307
  */
374
308
  declare const SEO_GROUP_FIELDS: readonly [{
375
309
  readonly name: "metaTitle";
@@ -438,9 +372,8 @@ export type NestedSeoFieldGroup<G extends string> = {
438
372
  fields: SeoGroupFields;
439
373
  type: 'object';
440
374
  /**
441
- * The wrapper object itself is optional — an entry that sets no SEO fields at all omits the
442
- * `seo` key entirely, matching the runtime validator (`entry-validator.ts`), which only
443
- * enforces fields with `required: true`.
375
+ * The wrapper object itself is optional: an entry that sets no SEO fields omits the key
376
+ * entirely, matching `entry-validator.ts`, which enforces only `required: true` fields.
444
377
  */
445
378
  required: false;
446
379
  };
@@ -455,24 +388,18 @@ export declare function defineSeoFieldGroup<const G extends string>(opts: SeoFie
455
388
  group: G;
456
389
  }): NestedSeoFieldGroup<G>;
457
390
  /**
458
- * Define a reusable nested field group — a visual container in the editor that groups
459
- * related fields under a named key in the content file.
460
- *
461
- * Use this when the fields logically belong together as a sub-object (e.g., seo.metaTitle)
462
- * and you want that structure reflected in your content files.
463
- *
464
- * For visual-only grouping without data nesting, use defineInlineFieldGroup().
391
+ * Define a reusable nested field group — a visual container in the editor whose fields are
392
+ * stored under a named key in the content file (e.g. seo.metaTitle). Use it when the fields
393
+ * belong together as a sub-object and that structure should be reflected on disk; for
394
+ * visual-only grouping without data nesting, use defineInlineFieldGroup().
465
395
  *
466
396
  * @example
467
397
  * const seoGroup = defineNestedFieldGroup({
468
398
  * name: 'seo',
469
399
  * label: 'SEO',
470
- * fields: [
471
- * { name: 'metaTitle', type: 'string', label: 'Meta Title' },
472
- * { name: 'metaDescription', type: 'string', label: 'Meta Description' },
473
- * ],
400
+ * fields: [{ name: 'metaTitle', type: 'string', label: 'Meta Title' }],
474
401
  * })
475
- * // TypeFromEntrySchema: { ..., seo: { metaTitle: string, metaDescription: string } }
402
+ * // TypeFromEntrySchema: { ..., seo: { metaTitle: string } }
476
403
  */
477
404
  export declare const defineNestedFieldGroup: <const T extends Omit<InferableField, "type"> & {
478
405
  fields: readonly InferableField[];
@@ -482,11 +409,10 @@ export declare const defineNestedFieldGroup: <const T extends Omit<InferableFiel
482
409
  /**
483
410
  * Define a reusable block template once and embed it in multiple entry schemas' `block` fields.
484
411
  *
485
- * A `block` field holds an ordered, repeatable list of heterogeneous section blocks discriminated by
486
- * a `template` key (the "flexible content" / "page blocks" pattern). Defining each template inline in
487
- * every schema's `templates` array duplicates the field definitions; this const-inference identity
488
- * helper (like defineEntrySchema) lets you define a template once and reuse it across schemas while
489
- * still deriving the correct discriminated-union type via TypeFromEntrySchema.
412
+ * A `block` field holds an ordered, repeatable list of heterogeneous section blocks discriminated
413
+ * by a `template` key (the "flexible content" / "page blocks" pattern). This const-inference
414
+ * identity helper (like defineEntrySchema) keeps a template's field definitions in one place
415
+ * across schemas while TypeFromEntrySchema still derives the discriminated union.
490
416
  *
491
417
  * @example
492
418
  * const heroBlock = defineBlockTemplate({
@@ -501,10 +427,7 @@ export declare const defineNestedFieldGroup: <const T extends Omit<InferableFiel
501
427
  * name: 'cta',
502
428
  * fields: [{ name: 'label', type: 'string' }, { name: 'href', type: 'string' }],
503
429
  * })
504
- *
505
- * // Reuse the same templates across multiple page schemas:
506
430
  * const pageSchema = defineEntrySchema([
507
- * { name: 'title', type: 'string' },
508
431
  * { name: 'sections', type: 'block', templates: [heroBlock, ctaBlock] },
509
432
  * ])
510
433
  * // TypeFromEntrySchema<typeof pageSchema>['sections'] narrows to:
@@ -518,20 +441,11 @@ export declare const defineBlockTemplate: <const T extends {
518
441
  fields: readonly InferableField[];
519
442
  }>(template: T) => T;
520
443
  /**
521
- * Extract one template's value shape out of a block field's discriminated union.
522
- *
523
- * `Blocks` is the union itself — e.g. `Page['sections'][number]`, the element type of
524
- * a `block` field as derived by `TypeFromEntrySchema` — not the surrounding array.
525
- * `N` is one of that union's `template` literals.
444
+ * Extract one template's value shape out of a block field's discriminated union. `Blocks` is the
445
+ * union itself — e.g. `Page['sections'][number]`, the element type of a `block` field as derived
446
+ * by `TypeFromEntrySchema` — not the surrounding array; `N` is one of its `template` literals.
526
447
  *
527
448
  * @example
528
- * const heroBlock = defineBlockTemplate({
529
- * name: 'hero',
530
- * fields: [{ name: 'headline', type: 'string' }],
531
- * })
532
- * const pageSchema = defineEntrySchema([
533
- * { name: 'sections', type: 'block', templates: [heroBlock] },
534
- * ])
535
449
  * type Sections = TypeFromEntrySchema<typeof pageSchema>['sections'][number]
536
450
  * type HeroValue = BlockValueOf<Sections, 'hero'> // { headline: string }
537
451
  */
@@ -542,27 +456,18 @@ export type BlockValueOf<Blocks extends {
542
456
  template: N;
543
457
  }>['value'];
544
458
  /**
545
- * A mapped type over a block field's template names, requiring exactly one component
546
- * per template — no more, no fewer. This makes a block → component registry exhaustive
547
- * *by construction*: adding a template to the schema without adding its component is a
548
- * compile error, and a stray/renamed key in the registry is a compile error too. That is
549
- * strictly stronger than a runtime "did I handle every template?" guard, since it fails
550
- * the build instead of failing silently at render time.
459
+ * A mapped type over a block field's template names requiring exactly one component per template
460
+ * — no more, no fewer. That makes a block → component registry exhaustive *by construction*: a
461
+ * template added to the schema without its component, or a stray/renamed registry key, is a
462
+ * compile error rather than a silent gap at render time.
551
463
  *
552
- * Deliberately a type, not a `renderBlocks()` helper — the type says nothing about key
553
- * strategy, unknown-template handling, or how extra props reach each component, so it
554
- * imposes no rendering shape. Adopters write their own small loop (see the README's
555
- * "Block Component Registries" section for the recipe) and get exhaustiveness for free.
464
+ * Deliberately a type, not a `renderBlocks()` helper — it says nothing about key strategy,
465
+ * unknown-template handling or how extra props reach each component, so it imposes no rendering
466
+ * shape. Adopters write their own small loop (README, "Block Component Registries").
556
467
  *
557
468
  * @example
558
- * const registry: BlockComponentRegistry<Sections> = {
559
- * hero: ({ data }) => <HeroSection {...data} />,
560
- * // TS error here if 'hero' is missing, or if a key doesn't match a template name.
561
- * }
562
- *
563
- * // With extra props threaded to every block component:
564
- * type Props = { index: number }
565
- * const registryWithProps: BlockComponentRegistry<Sections, Props> = {
469
+ * // Extra props are threaded to every block component through the second parameter:
470
+ * const registry: BlockComponentRegistry<Sections, { index: number }> = {
566
471
  * hero: ({ data, index }) => <HeroSection {...data} position={index} />,
567
472
  * }
568
473
  */
@@ -575,33 +480,23 @@ export type BlockComponentRegistry<Blocks extends {
575
480
  } & ExtraProps>;
576
481
  };
577
482
  /**
578
- * Const-inference identity helper for a reusable field fragment — a plain array of field
579
- * configs (not a group, not a template) that you spread into multiple schemas' `fields`.
580
- * Exists purely for discoverability: `defineEntrySchema` and `defineBlockTemplate` already
581
- * infer literal types from a `const fields = [...] as const` array, so spreading it works
582
- * without this helper too. Wrapping the definition site in `defineFieldFragment(...)` just
583
- * makes the pattern easy to find (and to grep for) alongside `defineInlineFieldGroup` and
483
+ * Const-inference identity helper for a reusable field fragment — a plain array of field configs
484
+ * (not a group, not a template) spread into several schemas' `fields`. Purely for
485
+ * discoverability: `defineEntrySchema` and `defineBlockTemplate` already infer literal types from
486
+ * a `const fields = [...] as const` array, so spreading works without this helper; wrapping the
487
+ * definition site just makes the pattern easy to find alongside `defineInlineFieldGroup` and
584
488
  * `defineNestedFieldGroup`.
585
489
  *
586
- * Use this over a field group when you don't want the fields visually boxed together in
587
- * the editor, or when different schemas need to override one field (e.g. a different
588
- * `label` or `required`) — spread the fragment, then follow it with an object that
589
- * overrides just the field(s) that differ for that schema.
490
+ * Use it over a field group when the fields should not be visually boxed together in the editor,
491
+ * or when schemas need to override one field (a different `label` or `required`) — spread the
492
+ * fragment, then follow it with an object overriding just the fields that differ.
590
493
  *
591
494
  * @example
592
495
  * const ctaFields = defineFieldFragment([
593
496
  * { name: 'ctaLabel', type: 'string', label: 'Button Label' },
594
497
  * { name: 'ctaHref', type: 'string', label: 'Button Link' },
595
498
  * ])
596
- *
597
- * const heroSchema = defineEntrySchema([
598
- * { name: 'headline', type: 'string' },
599
- * ...ctaFields,
600
- * ])
601
- * const bannerSchema = defineEntrySchema([
602
- * { name: 'message', type: 'string' },
603
- * ...ctaFields,
604
- * ])
499
+ * const heroSchema = defineEntrySchema([{ name: 'headline', type: 'string' }, ...ctaFields])
605
500
  */
606
501
  export declare const defineFieldFragment: <const T extends readonly InferableField[]>(fields: T) => T;
607
502
  export {};