@aglyn/aglyn 1.0.0-beta.143

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 (963) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +11 -0
  3. package/package.json +66 -0
  4. package/src/index.d.ts +25 -0
  5. package/src/index.js +26 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/aglyn.d.ts +31 -0
  8. package/src/lib/aglyn.js +114 -0
  9. package/src/lib/aglyn.js.map +1 -0
  10. package/src/lib/app-utils/abuse-report.d.ts +193 -0
  11. package/src/lib/app-utils/abuse-report.js +321 -0
  12. package/src/lib/app-utils/abuse-report.js.map +1 -0
  13. package/src/lib/app-utils/accept-negotiation.d.ts +129 -0
  14. package/src/lib/app-utils/accept-negotiation.js +266 -0
  15. package/src/lib/app-utils/accept-negotiation.js.map +1 -0
  16. package/src/lib/app-utils/account-emails.d.ts +263 -0
  17. package/src/lib/app-utils/account-emails.js +264 -0
  18. package/src/lib/app-utils/account-emails.js.map +1 -0
  19. package/src/lib/app-utils/actions.d.ts +717 -0
  20. package/src/lib/app-utils/actions.js +1031 -0
  21. package/src/lib/app-utils/actions.js.map +1 -0
  22. package/src/lib/app-utils/activity-presenter.d.ts +152 -0
  23. package/src/lib/app-utils/activity-presenter.js +326 -0
  24. package/src/lib/app-utils/activity-presenter.js.map +1 -0
  25. package/src/lib/app-utils/advertising-tag-mounts.d.ts +133 -0
  26. package/src/lib/app-utils/advertising-tag-mounts.js +118 -0
  27. package/src/lib/app-utils/advertising-tag-mounts.js.map +1 -0
  28. package/src/lib/app-utils/advertising-tags.d.ts +307 -0
  29. package/src/lib/app-utils/advertising-tags.js +525 -0
  30. package/src/lib/app-utils/advertising-tags.js.map +1 -0
  31. package/src/lib/app-utils/agent-api-catalog.d.ts +94 -0
  32. package/src/lib/app-utils/agent-api-catalog.js +106 -0
  33. package/src/lib/app-utils/agent-api-catalog.js.map +1 -0
  34. package/src/lib/app-utils/agent-openapi.d.ts +103 -0
  35. package/src/lib/app-utils/agent-openapi.js +1128 -0
  36. package/src/lib/app-utils/agent-openapi.js.map +1 -0
  37. package/src/lib/app-utils/analytics-beacon.d.ts +154 -0
  38. package/src/lib/app-utils/analytics-beacon.js +152 -0
  39. package/src/lib/app-utils/analytics-beacon.js.map +1 -0
  40. package/src/lib/app-utils/analytics-environment.d.ts +133 -0
  41. package/src/lib/app-utils/analytics-environment.js +152 -0
  42. package/src/lib/app-utils/analytics-environment.js.map +1 -0
  43. package/src/lib/app-utils/analytics-events.d.ts +744 -0
  44. package/src/lib/app-utils/analytics-events.js +650 -0
  45. package/src/lib/app-utils/analytics-events.js.map +1 -0
  46. package/src/lib/app-utils/analytics-link-clicks.d.ts +102 -0
  47. package/src/lib/app-utils/analytics-link-clicks.js +267 -0
  48. package/src/lib/app-utils/analytics-link-clicks.js.map +1 -0
  49. package/src/lib/app-utils/analytics-path-key.d.ts +46 -0
  50. package/src/lib/app-utils/analytics-path-key.js +46 -0
  51. package/src/lib/app-utils/analytics-path-key.js.map +1 -0
  52. package/src/lib/app-utils/api-adapter.d.ts +47 -0
  53. package/src/lib/app-utils/api-adapter.js +367 -0
  54. package/src/lib/app-utils/api-adapter.js.map +1 -0
  55. package/src/lib/app-utils/api-idempotency.d.ts +169 -0
  56. package/src/lib/app-utils/api-idempotency.js +213 -0
  57. package/src/lib/app-utils/api-idempotency.js.map +1 -0
  58. package/src/lib/app-utils/api-plugins.d.ts +210 -0
  59. package/src/lib/app-utils/api-plugins.js +221 -0
  60. package/src/lib/app-utils/api-plugins.js.map +1 -0
  61. package/src/lib/app-utils/assist-credits.d.ts +482 -0
  62. package/src/lib/app-utils/assist-credits.js +509 -0
  63. package/src/lib/app-utils/assist-credits.js.map +1 -0
  64. package/src/lib/app-utils/attribution-attribute.d.ts +34 -0
  65. package/src/lib/app-utils/attribution-attribute.js +34 -0
  66. package/src/lib/app-utils/attribution-attribute.js.map +1 -0
  67. package/src/lib/app-utils/attribution-guard.d.ts +130 -0
  68. package/src/lib/app-utils/attribution-guard.js +410 -0
  69. package/src/lib/app-utils/attribution-guard.js.map +1 -0
  70. package/src/lib/app-utils/author-css.d.ts +123 -0
  71. package/src/lib/app-utils/author-css.js +275 -0
  72. package/src/lib/app-utils/author-css.js.map +1 -0
  73. package/src/lib/app-utils/author-html-markdown.d.ts +31 -0
  74. package/src/lib/app-utils/author-html-markdown.js +497 -0
  75. package/src/lib/app-utils/author-html-markdown.js.map +1 -0
  76. package/src/lib/app-utils/author-html.d.ts +135 -0
  77. package/src/lib/app-utils/author-html.js +1037 -0
  78. package/src/lib/app-utils/author-html.js.map +1 -0
  79. package/src/lib/app-utils/automation-placeholders.d.ts +72 -0
  80. package/src/lib/app-utils/automation-placeholders.js +207 -0
  81. package/src/lib/app-utils/automation-placeholders.js.map +1 -0
  82. package/src/lib/app-utils/bandwidth-cap.d.ts +183 -0
  83. package/src/lib/app-utils/bandwidth-cap.js +193 -0
  84. package/src/lib/app-utils/bandwidth-cap.js.map +1 -0
  85. package/src/lib/app-utils/binding-token-catalog.d.ts +82 -0
  86. package/src/lib/app-utils/binding-token-catalog.js +293 -0
  87. package/src/lib/app-utils/binding-token-catalog.js.map +1 -0
  88. package/src/lib/app-utils/binding-tokens.d.ts +157 -0
  89. package/src/lib/app-utils/binding-tokens.js +251 -0
  90. package/src/lib/app-utils/binding-tokens.js.map +1 -0
  91. package/src/lib/app-utils/breadcrumb-json-ld.d.ts +57 -0
  92. package/src/lib/app-utils/breadcrumb-json-ld.js +67 -0
  93. package/src/lib/app-utils/breadcrumb-json-ld.js.map +1 -0
  94. package/src/lib/app-utils/campaign-attribution.d.ts +117 -0
  95. package/src/lib/app-utils/campaign-attribution.js +162 -0
  96. package/src/lib/app-utils/campaign-attribution.js.map +1 -0
  97. package/src/lib/app-utils/campaign-forwarding.d.ts +220 -0
  98. package/src/lib/app-utils/campaign-forwarding.js +332 -0
  99. package/src/lib/app-utils/campaign-forwarding.js.map +1 -0
  100. package/src/lib/app-utils/campaign-membership.d.ts +109 -0
  101. package/src/lib/app-utils/campaign-membership.js +176 -0
  102. package/src/lib/app-utils/campaign-membership.js.map +1 -0
  103. package/src/lib/app-utils/campaign-touch.d.ts +206 -0
  104. package/src/lib/app-utils/campaign-touch.js +326 -0
  105. package/src/lib/app-utils/campaign-touch.js.map +1 -0
  106. package/src/lib/app-utils/child-contract-compose.d.ts +28 -0
  107. package/src/lib/app-utils/child-contract-compose.js +140 -0
  108. package/src/lib/app-utils/child-contract-compose.js.map +1 -0
  109. package/src/lib/app-utils/child-contract.d.ts +129 -0
  110. package/src/lib/app-utils/child-contract.js +153 -0
  111. package/src/lib/app-utils/child-contract.js.map +1 -0
  112. package/src/lib/app-utils/collection-delete.d.ts +113 -0
  113. package/src/lib/app-utils/collection-delete.js +120 -0
  114. package/src/lib/app-utils/collection-delete.js.map +1 -0
  115. package/src/lib/app-utils/collection-entries.d.ts +833 -0
  116. package/src/lib/app-utils/collection-entries.js +1285 -0
  117. package/src/lib/app-utils/collection-entries.js.map +1 -0
  118. package/src/lib/app-utils/collection-entry-date.d.ts +129 -0
  119. package/src/lib/app-utils/collection-entry-date.js +183 -0
  120. package/src/lib/app-utils/collection-entry-date.js.map +1 -0
  121. package/src/lib/app-utils/collection-kind.d.ts +55 -0
  122. package/src/lib/app-utils/collection-kind.js +69 -0
  123. package/src/lib/app-utils/collection-kind.js.map +1 -0
  124. package/src/lib/app-utils/collection-slug.d.ts +79 -0
  125. package/src/lib/app-utils/collection-slug.js +70 -0
  126. package/src/lib/app-utils/collection-slug.js.map +1 -0
  127. package/src/lib/app-utils/compose-layout-nodes.d.ts +147 -0
  128. package/src/lib/app-utils/compose-layout-nodes.js +261 -0
  129. package/src/lib/app-utils/compose-layout-nodes.js.map +1 -0
  130. package/src/lib/app-utils/compose-layout-props.d.ts +71 -0
  131. package/src/lib/app-utils/compose-layout-props.js +61 -0
  132. package/src/lib/app-utils/compose-layout-props.js.map +1 -0
  133. package/src/lib/app-utils/compose-reusable-components.d.ts +504 -0
  134. package/src/lib/app-utils/compose-reusable-components.js +1366 -0
  135. package/src/lib/app-utils/compose-reusable-components.js.map +1 -0
  136. package/src/lib/app-utils/compress.d.ts +35 -0
  137. package/src/lib/app-utils/compress.js +38 -0
  138. package/src/lib/app-utils/compress.js.map +1 -0
  139. package/src/lib/app-utils/consent-banner-ui.d.ts +226 -0
  140. package/src/lib/app-utils/consent-banner-ui.js +583 -0
  141. package/src/lib/app-utils/consent-banner-ui.js.map +1 -0
  142. package/src/lib/app-utils/consent-groups.d.ts +189 -0
  143. package/src/lib/app-utils/consent-groups.js +219 -0
  144. package/src/lib/app-utils/consent-groups.js.map +1 -0
  145. package/src/lib/app-utils/consent-preferences-dialog.d.ts +58 -0
  146. package/src/lib/app-utils/consent-preferences-dialog.js +106 -0
  147. package/src/lib/app-utils/consent-preferences-dialog.js.map +1 -0
  148. package/src/lib/app-utils/console-record-links.d.ts +163 -0
  149. package/src/lib/app-utils/console-record-links.js +178 -0
  150. package/src/lib/app-utils/console-record-links.js.map +1 -0
  151. package/src/lib/app-utils/console-routes.d.ts +658 -0
  152. package/src/lib/app-utils/console-routes.js +489 -0
  153. package/src/lib/app-utils/console-routes.js.map +1 -0
  154. package/src/lib/app-utils/console-widget-slot-context.d.ts +46 -0
  155. package/src/lib/app-utils/console-widget-slot-context.js +23 -0
  156. package/src/lib/app-utils/console-widget-slot-context.js.map +1 -0
  157. package/src/lib/app-utils/contact-custom-fields.d.ts +191 -0
  158. package/src/lib/app-utils/contact-custom-fields.js +349 -0
  159. package/src/lib/app-utils/contact-custom-fields.js.map +1 -0
  160. package/src/lib/app-utils/contact-holder.d.ts +52 -0
  161. package/src/lib/app-utils/contact-holder.js +98 -0
  162. package/src/lib/app-utils/contact-holder.js.map +1 -0
  163. package/src/lib/app-utils/contact-merge.d.ts +136 -0
  164. package/src/lib/app-utils/contact-merge.js +379 -0
  165. package/src/lib/app-utils/contact-merge.js.map +1 -0
  166. package/src/lib/app-utils/contacts.d.ts +554 -0
  167. package/src/lib/app-utils/contacts.js +401 -0
  168. package/src/lib/app-utils/contacts.js.map +1 -0
  169. package/src/lib/app-utils/content-author-profile.d.ts +68 -0
  170. package/src/lib/app-utils/content-author-profile.js +118 -0
  171. package/src/lib/app-utils/content-author-profile.js.map +1 -0
  172. package/src/lib/app-utils/content-authors.d.ts +662 -0
  173. package/src/lib/app-utils/content-authors.js +771 -0
  174. package/src/lib/app-utils/content-authors.js.map +1 -0
  175. package/src/lib/app-utils/content-schema-type.d.ts +81 -0
  176. package/src/lib/app-utils/content-schema-type.js +87 -0
  177. package/src/lib/app-utils/content-schema-type.js.map +1 -0
  178. package/src/lib/app-utils/contexts.d.ts +35 -0
  179. package/src/lib/app-utils/contexts.js +35 -0
  180. package/src/lib/app-utils/contexts.js.map +1 -0
  181. package/src/lib/app-utils/create-resource-uid.d.ts +18 -0
  182. package/src/lib/app-utils/create-resource-uid.js +23 -0
  183. package/src/lib/app-utils/create-resource-uid.js.map +1 -0
  184. package/src/lib/app-utils/crm-booking.d.ts +75 -0
  185. package/src/lib/app-utils/crm-booking.js +133 -0
  186. package/src/lib/app-utils/crm-booking.js.map +1 -0
  187. package/src/lib/app-utils/crm-csv.d.ts +232 -0
  188. package/src/lib/app-utils/crm-csv.js +432 -0
  189. package/src/lib/app-utils/crm-csv.js.map +1 -0
  190. package/src/lib/app-utils/crm-digest.d.ts +179 -0
  191. package/src/lib/app-utils/crm-digest.js +271 -0
  192. package/src/lib/app-utils/crm-digest.js.map +1 -0
  193. package/src/lib/app-utils/crm-email-templates.d.ts +172 -0
  194. package/src/lib/app-utils/crm-email-templates.js +382 -0
  195. package/src/lib/app-utils/crm-email-templates.js.map +1 -0
  196. package/src/lib/app-utils/crm-inbound.d.ts +245 -0
  197. package/src/lib/app-utils/crm-inbound.js +407 -0
  198. package/src/lib/app-utils/crm-inbound.js.map +1 -0
  199. package/src/lib/app-utils/crm-kinds.d.ts +73 -0
  200. package/src/lib/app-utils/crm-kinds.js +92 -0
  201. package/src/lib/app-utils/crm-kinds.js.map +1 -0
  202. package/src/lib/app-utils/crm-next-activity.d.ts +107 -0
  203. package/src/lib/app-utils/crm-next-activity.js +140 -0
  204. package/src/lib/app-utils/crm-next-activity.js.map +1 -0
  205. package/src/lib/app-utils/crm-reports.d.ts +479 -0
  206. package/src/lib/app-utils/crm-reports.js +680 -0
  207. package/src/lib/app-utils/crm-reports.js.map +1 -0
  208. package/src/lib/app-utils/crm-task-reminders.d.ts +129 -0
  209. package/src/lib/app-utils/crm-task-reminders.js +139 -0
  210. package/src/lib/app-utils/crm-task-reminders.js.map +1 -0
  211. package/src/lib/app-utils/crm.d.ts +1546 -0
  212. package/src/lib/app-utils/crm.js +1814 -0
  213. package/src/lib/app-utils/crm.js.map +1 -0
  214. package/src/lib/app-utils/csp-report.d.ts +84 -0
  215. package/src/lib/app-utils/csp-report.js +177 -0
  216. package/src/lib/app-utils/csp-report.js.map +1 -0
  217. package/src/lib/app-utils/csv-import.d.ts +192 -0
  218. package/src/lib/app-utils/csv-import.js +279 -0
  219. package/src/lib/app-utils/csv-import.js.map +1 -0
  220. package/src/lib/app-utils/dataset-csv.d.ts +109 -0
  221. package/src/lib/app-utils/dataset-csv.js +235 -0
  222. package/src/lib/app-utils/dataset-csv.js.map +1 -0
  223. package/src/lib/app-utils/dataset-models.d.ts +194 -0
  224. package/src/lib/app-utils/dataset-models.js +409 -0
  225. package/src/lib/app-utils/dataset-models.js.map +1 -0
  226. package/src/lib/app-utils/dataset-query.d.ts +57 -0
  227. package/src/lib/app-utils/dataset-query.js +126 -0
  228. package/src/lib/app-utils/dataset-query.js.map +1 -0
  229. package/src/lib/app-utils/datasets.d.ts +136 -0
  230. package/src/lib/app-utils/datasets.js +177 -0
  231. package/src/lib/app-utils/datasets.js.map +1 -0
  232. package/src/lib/app-utils/decompress.d.ts +36 -0
  233. package/src/lib/app-utils/decompress.js +32 -0
  234. package/src/lib/app-utils/decompress.js.map +1 -0
  235. package/src/lib/app-utils/dedicated-sending-domain.d.ts +47 -0
  236. package/src/lib/app-utils/dedicated-sending-domain.js +114 -0
  237. package/src/lib/app-utils/dedicated-sending-domain.js.map +1 -0
  238. package/src/lib/app-utils/deferred-image.d.ts +86 -0
  239. package/src/lib/app-utils/deferred-image.js +83 -0
  240. package/src/lib/app-utils/deferred-image.js.map +1 -0
  241. package/src/lib/app-utils/definition-canvas-tree.d.ts +61 -0
  242. package/src/lib/app-utils/definition-canvas-tree.js +126 -0
  243. package/src/lib/app-utils/definition-canvas-tree.js.map +1 -0
  244. package/src/lib/app-utils/deployment-shape.d.ts +167 -0
  245. package/src/lib/app-utils/deployment-shape.js +238 -0
  246. package/src/lib/app-utils/deployment-shape.js.map +1 -0
  247. package/src/lib/app-utils/detect-template-placeholders.d.ts +30 -0
  248. package/src/lib/app-utils/detect-template-placeholders.js +53 -0
  249. package/src/lib/app-utils/detect-template-placeholders.js.map +1 -0
  250. package/src/lib/app-utils/dmca-counter-notice.d.ts +185 -0
  251. package/src/lib/app-utils/dmca-counter-notice.js +277 -0
  252. package/src/lib/app-utils/dmca-counter-notice.js.map +1 -0
  253. package/src/lib/app-utils/docs-deflection.d.ts +156 -0
  254. package/src/lib/app-utils/docs-deflection.js +547 -0
  255. package/src/lib/app-utils/docs-deflection.js.map +1 -0
  256. package/src/lib/app-utils/docs-help.d.ts +57 -0
  257. package/src/lib/app-utils/docs-help.generated.d.ts +303 -0
  258. package/src/lib/app-utils/docs-help.generated.js +867 -0
  259. package/src/lib/app-utils/docs-help.generated.js.map +1 -0
  260. package/src/lib/app-utils/docs-help.js +46 -0
  261. package/src/lib/app-utils/docs-help.js.map +1 -0
  262. package/src/lib/app-utils/docs-index.generated.d.ts +29 -0
  263. package/src/lib/app-utils/docs-index.generated.js +8388 -0
  264. package/src/lib/app-utils/docs-index.generated.js.map +1 -0
  265. package/src/lib/app-utils/docs-retrieval.d.ts +67 -0
  266. package/src/lib/app-utils/docs-retrieval.js +188 -0
  267. package/src/lib/app-utils/docs-retrieval.js.map +1 -0
  268. package/src/lib/app-utils/document-landmark.d.ts +50 -0
  269. package/src/lib/app-utils/document-landmark.js +100 -0
  270. package/src/lib/app-utils/document-landmark.js.map +1 -0
  271. package/src/lib/app-utils/duplicate-resource.d.ts +101 -0
  272. package/src/lib/app-utils/duplicate-resource.js +206 -0
  273. package/src/lib/app-utils/duplicate-resource.js.map +1 -0
  274. package/src/lib/app-utils/dynamic-list-rule.d.ts +471 -0
  275. package/src/lib/app-utils/dynamic-list-rule.js +914 -0
  276. package/src/lib/app-utils/dynamic-list-rule.js.map +1 -0
  277. package/src/lib/app-utils/element-animation.d.ts +200 -0
  278. package/src/lib/app-utils/element-animation.js +233 -0
  279. package/src/lib/app-utils/element-animation.js.map +1 -0
  280. package/src/lib/app-utils/element-hidden-style.d.ts +46 -0
  281. package/src/lib/app-utils/element-hidden-style.js +48 -0
  282. package/src/lib/app-utils/element-hidden-style.js.map +1 -0
  283. package/src/lib/app-utils/element-ui.d.ts +243 -0
  284. package/src/lib/app-utils/element-ui.js +459 -0
  285. package/src/lib/app-utils/element-ui.js.map +1 -0
  286. package/src/lib/app-utils/email-starter-policy.d.ts +160 -0
  287. package/src/lib/app-utils/email-starter-policy.js +327 -0
  288. package/src/lib/app-utils/email-starter-policy.js.map +1 -0
  289. package/src/lib/app-utils/email-topics.d.ts +310 -0
  290. package/src/lib/app-utils/email-topics.js +336 -0
  291. package/src/lib/app-utils/email-topics.js.map +1 -0
  292. package/src/lib/app-utils/enabled-plugins-context.d.ts +100 -0
  293. package/src/lib/app-utils/enabled-plugins-context.js +113 -0
  294. package/src/lib/app-utils/enabled-plugins-context.js.map +1 -0
  295. package/src/lib/app-utils/ensure-canvas-root.d.ts +38 -0
  296. package/src/lib/app-utils/ensure-canvas-root.js +61 -0
  297. package/src/lib/app-utils/ensure-canvas-root.js.map +1 -0
  298. package/src/lib/app-utils/entity-picker-context.d.ts +199 -0
  299. package/src/lib/app-utils/entity-picker-context.js +93 -0
  300. package/src/lib/app-utils/entity-picker-context.js.map +1 -0
  301. package/src/lib/app-utils/error-beacon.d.ts +107 -0
  302. package/src/lib/app-utils/error-beacon.js +296 -0
  303. package/src/lib/app-utils/error-beacon.js.map +1 -0
  304. package/src/lib/app-utils/expand-repeatables.d.ts +172 -0
  305. package/src/lib/app-utils/expand-repeatables.js +299 -0
  306. package/src/lib/app-utils/expand-repeatables.js.map +1 -0
  307. package/src/lib/app-utils/foreign-script.d.ts +82 -0
  308. package/src/lib/app-utils/foreign-script.js +102 -0
  309. package/src/lib/app-utils/foreign-script.js.map +1 -0
  310. package/src/lib/app-utils/form-abuse-ceiling.d.ts +146 -0
  311. package/src/lib/app-utils/form-abuse-ceiling.js +158 -0
  312. package/src/lib/app-utils/form-abuse-ceiling.js.map +1 -0
  313. package/src/lib/app-utils/form-contract.d.ts +198 -0
  314. package/src/lib/app-utils/form-contract.js +282 -0
  315. package/src/lib/app-utils/form-contract.js.map +1 -0
  316. package/src/lib/app-utils/form-dataset-binding.d.ts +50 -0
  317. package/src/lib/app-utils/form-dataset-binding.js +74 -0
  318. package/src/lib/app-utils/form-dataset-binding.js.map +1 -0
  319. package/src/lib/app-utils/forms.d.ts +727 -0
  320. package/src/lib/app-utils/forms.js +777 -0
  321. package/src/lib/app-utils/forms.js.map +1 -0
  322. package/src/lib/app-utils/functions.d.ts +188 -0
  323. package/src/lib/app-utils/functions.js +529 -0
  324. package/src/lib/app-utils/functions.js.map +1 -0
  325. package/src/lib/app-utils/guarded-version-save.d.ts +91 -0
  326. package/src/lib/app-utils/guarded-version-save.js +131 -0
  327. package/src/lib/app-utils/guarded-version-save.js.map +1 -0
  328. package/src/lib/app-utils/health-report.d.ts +1766 -0
  329. package/src/lib/app-utils/health-report.js +2072 -0
  330. package/src/lib/app-utils/health-report.js.map +1 -0
  331. package/src/lib/app-utils/host-naming.d.ts +135 -0
  332. package/src/lib/app-utils/host-naming.js +188 -0
  333. package/src/lib/app-utils/host-naming.js.map +1 -0
  334. package/src/lib/app-utils/host-permissions.d.ts +76 -0
  335. package/src/lib/app-utils/host-permissions.js +119 -0
  336. package/src/lib/app-utils/host-permissions.js.map +1 -0
  337. package/src/lib/app-utils/host-tokens.d.ts +228 -0
  338. package/src/lib/app-utils/host-tokens.js +304 -0
  339. package/src/lib/app-utils/host-tokens.js.map +1 -0
  340. package/src/lib/app-utils/idp-profile.d.ts +83 -0
  341. package/src/lib/app-utils/idp-profile.js +268 -0
  342. package/src/lib/app-utils/idp-profile.js.map +1 -0
  343. package/src/lib/app-utils/image-upload-types.d.ts +49 -0
  344. package/src/lib/app-utils/image-upload-types.js +86 -0
  345. package/src/lib/app-utils/image-upload-types.js.map +1 -0
  346. package/src/lib/app-utils/index.d.ts +18 -0
  347. package/src/lib/app-utils/index.js +23 -0
  348. package/src/lib/app-utils/index.js.map +1 -0
  349. package/src/lib/app-utils/internal-traffic.d.ts +197 -0
  350. package/src/lib/app-utils/internal-traffic.js +288 -0
  351. package/src/lib/app-utils/internal-traffic.js.map +1 -0
  352. package/src/lib/app-utils/lineal-order.d.ts +62 -0
  353. package/src/lib/app-utils/lineal-order.js +65 -0
  354. package/src/lib/app-utils/lineal-order.js.map +1 -0
  355. package/src/lib/app-utils/link-references.d.ts +36 -0
  356. package/src/lib/app-utils/link-references.js +89 -0
  357. package/src/lib/app-utils/link-references.js.map +1 -0
  358. package/src/lib/app-utils/link-target-search-context.d.ts +123 -0
  359. package/src/lib/app-utils/link-target-search-context.js +221 -0
  360. package/src/lib/app-utils/link-target-search-context.js.map +1 -0
  361. package/src/lib/app-utils/list-assignment-policy.d.ts +169 -0
  362. package/src/lib/app-utils/list-assignment-policy.js +170 -0
  363. package/src/lib/app-utils/list-assignment-policy.js.map +1 -0
  364. package/src/lib/app-utils/list-import.d.ts +158 -0
  365. package/src/lib/app-utils/list-import.js +332 -0
  366. package/src/lib/app-utils/list-import.js.map +1 -0
  367. package/src/lib/app-utils/llms-txt.d.ts +104 -0
  368. package/src/lib/app-utils/llms-txt.js +144 -0
  369. package/src/lib/app-utils/llms-txt.js.map +1 -0
  370. package/src/lib/app-utils/local-storage-budget.d.ts +75 -0
  371. package/src/lib/app-utils/local-storage-budget.js +153 -0
  372. package/src/lib/app-utils/local-storage-budget.js.map +1 -0
  373. package/src/lib/app-utils/lockdown.d.ts +698 -0
  374. package/src/lib/app-utils/lockdown.js +929 -0
  375. package/src/lib/app-utils/lockdown.js.map +1 -0
  376. package/src/lib/app-utils/margin-utilization.d.ts +267 -0
  377. package/src/lib/app-utils/margin-utilization.js +351 -0
  378. package/src/lib/app-utils/margin-utilization.js.map +1 -0
  379. package/src/lib/app-utils/markdown-lite.d.ts +297 -0
  380. package/src/lib/app-utils/markdown-lite.js +705 -0
  381. package/src/lib/app-utils/markdown-lite.js.map +1 -0
  382. package/src/lib/app-utils/marketing-consent.d.ts +704 -0
  383. package/src/lib/app-utils/marketing-consent.js +783 -0
  384. package/src/lib/app-utils/marketing-consent.js.map +1 -0
  385. package/src/lib/app-utils/marketplace-listing-visibility.d.ts +120 -0
  386. package/src/lib/app-utils/marketplace-listing-visibility.js +139 -0
  387. package/src/lib/app-utils/marketplace-listing-visibility.js.map +1 -0
  388. package/src/lib/app-utils/marketplace-overrides.d.ts +271 -0
  389. package/src/lib/app-utils/marketplace-overrides.js +462 -0
  390. package/src/lib/app-utils/marketplace-overrides.js.map +1 -0
  391. package/src/lib/app-utils/marketplace-provenance.d.ts +150 -0
  392. package/src/lib/app-utils/marketplace-provenance.js +136 -0
  393. package/src/lib/app-utils/marketplace-provenance.js.map +1 -0
  394. package/src/lib/app-utils/marketplace-theme.d.ts +237 -0
  395. package/src/lib/app-utils/marketplace-theme.js +525 -0
  396. package/src/lib/app-utils/marketplace-theme.js.map +1 -0
  397. package/src/lib/app-utils/marketplace-update-state.d.ts +119 -0
  398. package/src/lib/app-utils/marketplace-update-state.js +132 -0
  399. package/src/lib/app-utils/marketplace-update-state.js.map +1 -0
  400. package/src/lib/app-utils/marketplace-verification.d.ts +95 -0
  401. package/src/lib/app-utils/marketplace-verification.js +81 -0
  402. package/src/lib/app-utils/marketplace-verification.js.map +1 -0
  403. package/src/lib/app-utils/measure-node-map.d.ts +76 -0
  404. package/src/lib/app-utils/measure-node-map.js +111 -0
  405. package/src/lib/app-utils/measure-node-map.js.map +1 -0
  406. package/src/lib/app-utils/media-alt.d.ts +55 -0
  407. package/src/lib/app-utils/media-alt.js +58 -0
  408. package/src/lib/app-utils/media-alt.js.map +1 -0
  409. package/src/lib/app-utils/media-asset-facts.d.ts +125 -0
  410. package/src/lib/app-utils/media-asset-facts.js +467 -0
  411. package/src/lib/app-utils/media-asset-facts.js.map +1 -0
  412. package/src/lib/app-utils/media-cdn-scope.d.ts +65 -0
  413. package/src/lib/app-utils/media-cdn-scope.js +75 -0
  414. package/src/lib/app-utils/media-cdn-scope.js.map +1 -0
  415. package/src/lib/app-utils/media-folders.d.ts +161 -0
  416. package/src/lib/app-utils/media-folders.js +230 -0
  417. package/src/lib/app-utils/media-folders.js.map +1 -0
  418. package/src/lib/app-utils/media-metadata.d.ts +277 -0
  419. package/src/lib/app-utils/media-metadata.js +388 -0
  420. package/src/lib/app-utils/media-metadata.js.map +1 -0
  421. package/src/lib/app-utils/media-picker-context.d.ts +93 -0
  422. package/src/lib/app-utils/media-picker-context.js +26 -0
  423. package/src/lib/app-utils/media-picker-context.js.map +1 -0
  424. package/src/lib/app-utils/media-quarantine.d.ts +247 -0
  425. package/src/lib/app-utils/media-quarantine.js +323 -0
  426. package/src/lib/app-utils/media-quarantine.js.map +1 -0
  427. package/src/lib/app-utils/media-ref.d.ts +661 -0
  428. package/src/lib/app-utils/media-ref.js +1055 -0
  429. package/src/lib/app-utils/media-ref.js.map +1 -0
  430. package/src/lib/app-utils/media-takedown-reach.d.ts +126 -0
  431. package/src/lib/app-utils/media-takedown-reach.js +143 -0
  432. package/src/lib/app-utils/media-takedown-reach.js.map +1 -0
  433. package/src/lib/app-utils/member-email-aliases.d.ts +180 -0
  434. package/src/lib/app-utils/member-email-aliases.js +217 -0
  435. package/src/lib/app-utils/member-email-aliases.js.map +1 -0
  436. package/src/lib/app-utils/merge-node-sx.d.ts +47 -0
  437. package/src/lib/app-utils/merge-node-sx.js +123 -0
  438. package/src/lib/app-utils/merge-node-sx.js.map +1 -0
  439. package/src/lib/app-utils/name-match.d.ts +155 -0
  440. package/src/lib/app-utils/name-match.js +175 -0
  441. package/src/lib/app-utils/name-match.js.map +1 -0
  442. package/src/lib/app-utils/name-search.d.ts +117 -0
  443. package/src/lib/app-utils/name-search.js +145 -0
  444. package/src/lib/app-utils/name-search.js.map +1 -0
  445. package/src/lib/app-utils/node-capabilities.d.ts +85 -0
  446. package/src/lib/app-utils/node-capabilities.js +88 -0
  447. package/src/lib/app-utils/node-capabilities.js.map +1 -0
  448. package/src/lib/app-utils/node-definition-sanitizer.d.ts +164 -0
  449. package/src/lib/app-utils/node-definition-sanitizer.js +402 -0
  450. package/src/lib/app-utils/node-definition-sanitizer.js.map +1 -0
  451. package/src/lib/app-utils/node-identity.d.ts +47 -0
  452. package/src/lib/app-utils/node-identity.js +50 -0
  453. package/src/lib/app-utils/node-identity.js.map +1 -0
  454. package/src/lib/app-utils/node-interactions.d.ts +102 -0
  455. package/src/lib/app-utils/node-interactions.js +192 -0
  456. package/src/lib/app-utils/node-interactions.js.map +1 -0
  457. package/src/lib/app-utils/node-url-policy.d.ts +54 -0
  458. package/src/lib/app-utils/node-url-policy.js +72 -0
  459. package/src/lib/app-utils/node-url-policy.js.map +1 -0
  460. package/src/lib/app-utils/notifications.d.ts +71 -0
  461. package/src/lib/app-utils/notifications.js +101 -0
  462. package/src/lib/app-utils/notifications.js.map +1 -0
  463. package/src/lib/app-utils/onboarding-deep-link.d.ts +120 -0
  464. package/src/lib/app-utils/onboarding-deep-link.js +142 -0
  465. package/src/lib/app-utils/onboarding-deep-link.js.map +1 -0
  466. package/src/lib/app-utils/operator-identity.d.ts +207 -0
  467. package/src/lib/app-utils/operator-identity.js +186 -0
  468. package/src/lib/app-utils/operator-identity.js.map +1 -0
  469. package/src/lib/app-utils/org-billing-doc.d.ts +231 -0
  470. package/src/lib/app-utils/org-billing-doc.js +238 -0
  471. package/src/lib/app-utils/org-billing-doc.js.map +1 -0
  472. package/src/lib/app-utils/org-override-reason.d.ts +100 -0
  473. package/src/lib/app-utils/org-override-reason.js +116 -0
  474. package/src/lib/app-utils/org-override-reason.js.map +1 -0
  475. package/src/lib/app-utils/org-permissions.d.ts +194 -0
  476. package/src/lib/app-utils/org-permissions.js +357 -0
  477. package/src/lib/app-utils/org-permissions.js.map +1 -0
  478. package/src/lib/app-utils/org-roles.d.ts +72 -0
  479. package/src/lib/app-utils/org-roles.js +131 -0
  480. package/src/lib/app-utils/org-roles.js.map +1 -0
  481. package/src/lib/app-utils/organizations.d.ts +407 -0
  482. package/src/lib/app-utils/organizations.js +511 -0
  483. package/src/lib/app-utils/organizations.js.map +1 -0
  484. package/src/lib/app-utils/page-header-actions-context.d.ts +83 -0
  485. package/src/lib/app-utils/page-header-actions-context.js +58 -0
  486. package/src/lib/app-utils/page-header-actions-context.js.map +1 -0
  487. package/src/lib/app-utils/page-header-record-context.d.ts +80 -0
  488. package/src/lib/app-utils/page-header-record-context.js +64 -0
  489. package/src/lib/app-utils/page-header-record-context.js.map +1 -0
  490. package/src/lib/app-utils/page-markdown.d.ts +103 -0
  491. package/src/lib/app-utils/page-markdown.js +385 -0
  492. package/src/lib/app-utils/page-markdown.js.map +1 -0
  493. package/src/lib/app-utils/paid-media-source.d.ts +90 -0
  494. package/src/lib/app-utils/paid-media-source.js +184 -0
  495. package/src/lib/app-utils/paid-media-source.js.map +1 -0
  496. package/src/lib/app-utils/palette-sx.d.ts +34 -0
  497. package/src/lib/app-utils/palette-sx.js +150 -0
  498. package/src/lib/app-utils/palette-sx.js.map +1 -0
  499. package/src/lib/app-utils/password-policy.d.ts +47 -0
  500. package/src/lib/app-utils/password-policy.js +46 -0
  501. package/src/lib/app-utils/password-policy.js.map +1 -0
  502. package/src/lib/app-utils/payments-configured.d.ts +84 -0
  503. package/src/lib/app-utils/payments-configured.js +88 -0
  504. package/src/lib/app-utils/payments-configured.js.map +1 -0
  505. package/src/lib/app-utils/person-erasure.d.ts +126 -0
  506. package/src/lib/app-utils/person-erasure.js +121 -0
  507. package/src/lib/app-utils/person-erasure.js.map +1 -0
  508. package/src/lib/app-utils/person-key.d.ts +32 -0
  509. package/src/lib/app-utils/person-key.js +62 -0
  510. package/src/lib/app-utils/person-key.js.map +1 -0
  511. package/src/lib/app-utils/plan-entitlements.d.ts +2756 -0
  512. package/src/lib/app-utils/plan-entitlements.js +4085 -0
  513. package/src/lib/app-utils/plan-entitlements.js.map +1 -0
  514. package/src/lib/app-utils/platform-ad-conversions.d.ts +122 -0
  515. package/src/lib/app-utils/platform-ad-conversions.js +174 -0
  516. package/src/lib/app-utils/platform-ad-conversions.js.map +1 -0
  517. package/src/lib/app-utils/platform-advertising-tags.d.ts +139 -0
  518. package/src/lib/app-utils/platform-advertising-tags.js +203 -0
  519. package/src/lib/app-utils/platform-advertising-tags.js.map +1 -0
  520. package/src/lib/app-utils/platform-brand.d.ts +151 -0
  521. package/src/lib/app-utils/platform-brand.js +175 -0
  522. package/src/lib/app-utils/platform-brand.js.map +1 -0
  523. package/src/lib/app-utils/platform-consent-default.d.ts +142 -0
  524. package/src/lib/app-utils/platform-consent-default.js +295 -0
  525. package/src/lib/app-utils/platform-consent-default.js.map +1 -0
  526. package/src/lib/app-utils/platform-marketing-consent.d.ts +151 -0
  527. package/src/lib/app-utils/platform-marketing-consent.js +182 -0
  528. package/src/lib/app-utils/platform-marketing-consent.js.map +1 -0
  529. package/src/lib/app-utils/platform-marketing-host.d.ts +33 -0
  530. package/src/lib/app-utils/platform-marketing-host.js +97 -0
  531. package/src/lib/app-utils/platform-marketing-host.js.map +1 -0
  532. package/src/lib/app-utils/platform-visitor-consent.d.ts +252 -0
  533. package/src/lib/app-utils/platform-visitor-consent.js +533 -0
  534. package/src/lib/app-utils/platform-visitor-consent.js.map +1 -0
  535. package/src/lib/app-utils/plugin-api-cross-origin.d.ts +61 -0
  536. package/src/lib/app-utils/plugin-api-cross-origin.js +202 -0
  537. package/src/lib/app-utils/plugin-api-cross-origin.js.map +1 -0
  538. package/src/lib/app-utils/plugin-api-rate-limit.d.ts +192 -0
  539. package/src/lib/app-utils/plugin-api-rate-limit.js +270 -0
  540. package/src/lib/app-utils/plugin-api-rate-limit.js.map +1 -0
  541. package/src/lib/app-utils/plugin-artifact-path.d.ts +32 -0
  542. package/src/lib/app-utils/plugin-artifact-path.js +33 -0
  543. package/src/lib/app-utils/plugin-artifact-path.js.map +1 -0
  544. package/src/lib/app-utils/plugin-bundle-checks.d.ts +148 -0
  545. package/src/lib/app-utils/plugin-bundle-checks.js +989 -0
  546. package/src/lib/app-utils/plugin-bundle-checks.js.map +1 -0
  547. package/src/lib/app-utils/plugin-manifest.d.ts +516 -0
  548. package/src/lib/app-utils/plugin-manifest.js +687 -0
  549. package/src/lib/app-utils/plugin-manifest.js.map +1 -0
  550. package/src/lib/app-utils/published-legal-pages.d.ts +71 -0
  551. package/src/lib/app-utils/published-legal-pages.js +90 -0
  552. package/src/lib/app-utils/published-legal-pages.js.map +1 -0
  553. package/src/lib/app-utils/publisher-agreement.d.ts +254 -0
  554. package/src/lib/app-utils/publisher-agreement.js +274 -0
  555. package/src/lib/app-utils/publisher-agreement.js.map +1 -0
  556. package/src/lib/app-utils/publisher-attestation.d.ts +99 -0
  557. package/src/lib/app-utils/publisher-attestation.js +158 -0
  558. package/src/lib/app-utils/publisher-attestation.js.map +1 -0
  559. package/src/lib/app-utils/recipient-email-render.d.ts +216 -0
  560. package/src/lib/app-utils/recipient-email-render.js +221 -0
  561. package/src/lib/app-utils/recipient-email-render.js.map +1 -0
  562. package/src/lib/app-utils/redispatch-caught-error.d.ts +38 -0
  563. package/src/lib/app-utils/redispatch-caught-error.js +46 -0
  564. package/src/lib/app-utils/redispatch-caught-error.js.map +1 -0
  565. package/src/lib/app-utils/registering-plugin.d.ts +19 -0
  566. package/src/lib/app-utils/registering-plugin.js +38 -0
  567. package/src/lib/app-utils/registering-plugin.js.map +1 -0
  568. package/src/lib/app-utils/release-flags.d.ts +283 -0
  569. package/src/lib/app-utils/release-flags.js +518 -0
  570. package/src/lib/app-utils/release-flags.js.map +1 -0
  571. package/src/lib/app-utils/repair-canvas-nodes.d.ts +130 -0
  572. package/src/lib/app-utils/repair-canvas-nodes.js +298 -0
  573. package/src/lib/app-utils/repair-canvas-nodes.js.map +1 -0
  574. package/src/lib/app-utils/repeat-infringer.d.ts +166 -0
  575. package/src/lib/app-utils/repeat-infringer.js +188 -0
  576. package/src/lib/app-utils/repeat-infringer.js.map +1 -0
  577. package/src/lib/app-utils/repeat-sources.d.ts +115 -0
  578. package/src/lib/app-utils/repeat-sources.js +86 -0
  579. package/src/lib/app-utils/repeat-sources.js.map +1 -0
  580. package/src/lib/app-utils/request-geo.d.ts +114 -0
  581. package/src/lib/app-utils/request-geo.js +247 -0
  582. package/src/lib/app-utils/request-geo.js.map +1 -0
  583. package/src/lib/app-utils/request-ip.d.ts +213 -0
  584. package/src/lib/app-utils/request-ip.js +344 -0
  585. package/src/lib/app-utils/request-ip.js.map +1 -0
  586. package/src/lib/app-utils/resolve-named-tokens.d.ts +26 -0
  587. package/src/lib/app-utils/resolve-named-tokens.js +59 -0
  588. package/src/lib/app-utils/resolve-named-tokens.js.map +1 -0
  589. package/src/lib/app-utils/responsive-typography-sx.d.ts +77 -0
  590. package/src/lib/app-utils/responsive-typography-sx.js +122 -0
  591. package/src/lib/app-utils/responsive-typography-sx.js.map +1 -0
  592. package/src/lib/app-utils/reusable-component-keys.d.ts +135 -0
  593. package/src/lib/app-utils/reusable-component-keys.js +140 -0
  594. package/src/lib/app-utils/reusable-component-keys.js.map +1 -0
  595. package/src/lib/app-utils/reusable-prop-values.d.ts +199 -0
  596. package/src/lib/app-utils/reusable-prop-values.js +494 -0
  597. package/src/lib/app-utils/reusable-prop-values.js.map +1 -0
  598. package/src/lib/app-utils/safe-json-ld.d.ts +29 -0
  599. package/src/lib/app-utils/safe-json-ld.js +37 -0
  600. package/src/lib/app-utils/safe-json-ld.js.map +1 -0
  601. package/src/lib/app-utils/sanitize-svg.d.ts +55 -0
  602. package/src/lib/app-utils/sanitize-svg.js +460 -0
  603. package/src/lib/app-utils/sanitize-svg.js.map +1 -0
  604. package/src/lib/app-utils/scheme-sx.d.ts +84 -0
  605. package/src/lib/app-utils/scheme-sx.js +148 -0
  606. package/src/lib/app-utils/scheme-sx.js.map +1 -0
  607. package/src/lib/app-utils/scope-tokens.d.ts +249 -0
  608. package/src/lib/app-utils/scope-tokens.js +331 -0
  609. package/src/lib/app-utils/scope-tokens.js.map +1 -0
  610. package/src/lib/app-utils/screen-link-context-value.d.ts +57 -0
  611. package/src/lib/app-utils/screen-link-context-value.js +43 -0
  612. package/src/lib/app-utils/screen-link-context-value.js.map +1 -0
  613. package/src/lib/app-utils/screen-link-context.d.ts +185 -0
  614. package/src/lib/app-utils/screen-link-context.js +304 -0
  615. package/src/lib/app-utils/screen-link-context.js.map +1 -0
  616. package/src/lib/app-utils/screen-link-value.d.ts +269 -0
  617. package/src/lib/app-utils/screen-link-value.js +384 -0
  618. package/src/lib/app-utils/screen-link-value.js.map +1 -0
  619. package/src/lib/app-utils/screen-route.d.ts +669 -0
  620. package/src/lib/app-utils/screen-route.js +751 -0
  621. package/src/lib/app-utils/screen-route.js.map +1 -0
  622. package/src/lib/app-utils/screen-seo-fields.d.ts +37 -0
  623. package/src/lib/app-utils/screen-seo-fields.js +42 -0
  624. package/src/lib/app-utils/screen-seo-fields.js.map +1 -0
  625. package/src/lib/app-utils/search-indexing.d.ts +162 -0
  626. package/src/lib/app-utils/search-indexing.js +207 -0
  627. package/src/lib/app-utils/search-indexing.js.map +1 -0
  628. package/src/lib/app-utils/seo-listing-fields.d.ts +70 -0
  629. package/src/lib/app-utils/seo-listing-fields.js +75 -0
  630. package/src/lib/app-utils/seo-listing-fields.js.map +1 -0
  631. package/src/lib/app-utils/seo-locale.d.ts +119 -0
  632. package/src/lib/app-utils/seo-locale.js +133 -0
  633. package/src/lib/app-utils/seo-locale.js.map +1 -0
  634. package/src/lib/app-utils/seo-title-variables.d.ts +149 -0
  635. package/src/lib/app-utils/seo-title-variables.js +190 -0
  636. package/src/lib/app-utils/seo-title-variables.js.map +1 -0
  637. package/src/lib/app-utils/seo-title.d.ts +70 -0
  638. package/src/lib/app-utils/seo-title.js +117 -0
  639. package/src/lib/app-utils/seo-title.js.map +1 -0
  640. package/src/lib/app-utils/server.d.ts +174 -0
  641. package/src/lib/app-utils/server.js +314 -0
  642. package/src/lib/app-utils/server.js.map +1 -0
  643. package/src/lib/app-utils/site-context.d.ts +106 -0
  644. package/src/lib/app-utils/site-context.js +100 -0
  645. package/src/lib/app-utils/site-context.js.map +1 -0
  646. package/src/lib/app-utils/sitemap.d.ts +117 -0
  647. package/src/lib/app-utils/sitemap.js +183 -0
  648. package/src/lib/app-utils/sitemap.js.map +1 -0
  649. package/src/lib/app-utils/social-image.d.ts +112 -0
  650. package/src/lib/app-utils/social-image.js +191 -0
  651. package/src/lib/app-utils/social-image.js.map +1 -0
  652. package/src/lib/app-utils/starter-templates.d.ts +99 -0
  653. package/src/lib/app-utils/starter-templates.js +579 -0
  654. package/src/lib/app-utils/starter-templates.js.map +1 -0
  655. package/src/lib/app-utils/stored-nodes.d.ts +120 -0
  656. package/src/lib/app-utils/stored-nodes.js +174 -0
  657. package/src/lib/app-utils/stored-nodes.js.map +1 -0
  658. package/src/lib/app-utils/strip-undefined.d.ts +59 -0
  659. package/src/lib/app-utils/strip-undefined.js +95 -0
  660. package/src/lib/app-utils/strip-undefined.js.map +1 -0
  661. package/src/lib/app-utils/stripe-deployment-mode.d.ts +47 -0
  662. package/src/lib/app-utils/stripe-deployment-mode.js +70 -0
  663. package/src/lib/app-utils/stripe-deployment-mode.js.map +1 -0
  664. package/src/lib/app-utils/support-tiers.d.ts +108 -0
  665. package/src/lib/app-utils/support-tiers.js +201 -0
  666. package/src/lib/app-utils/support-tiers.js.map +1 -0
  667. package/src/lib/app-utils/timezone-geo-hint.d.ts +36 -0
  668. package/src/lib/app-utils/timezone-geo-hint.js +180 -0
  669. package/src/lib/app-utils/timezone-geo-hint.js.map +1 -0
  670. package/src/lib/app-utils/upload-cors.d.ts +155 -0
  671. package/src/lib/app-utils/upload-cors.js +254 -0
  672. package/src/lib/app-utils/upload-cors.js.map +1 -0
  673. package/src/lib/app-utils/upload-inspection.d.ts +159 -0
  674. package/src/lib/app-utils/upload-inspection.js +539 -0
  675. package/src/lib/app-utils/upload-inspection.js.map +1 -0
  676. package/src/lib/app-utils/url-slug.d.ts +40 -0
  677. package/src/lib/app-utils/url-slug.js +42 -0
  678. package/src/lib/app-utils/url-slug.js.map +1 -0
  679. package/src/lib/app-utils/usage-budget.d.ts +429 -0
  680. package/src/lib/app-utils/usage-budget.js +421 -0
  681. package/src/lib/app-utils/usage-budget.js.map +1 -0
  682. package/src/lib/app-utils/variables.d.ts +96 -0
  683. package/src/lib/app-utils/variables.js +233 -0
  684. package/src/lib/app-utils/variables.js.map +1 -0
  685. package/src/lib/app-utils/video-asset-facts.d.ts +61 -0
  686. package/src/lib/app-utils/video-asset-facts.js +70 -0
  687. package/src/lib/app-utils/video-asset-facts.js.map +1 -0
  688. package/src/lib/app-utils/video-object.d.ts +89 -0
  689. package/src/lib/app-utils/video-object.js +245 -0
  690. package/src/lib/app-utils/video-object.js.map +1 -0
  691. package/src/lib/app-utils/visitor-consent.d.ts +757 -0
  692. package/src/lib/app-utils/visitor-consent.js +981 -0
  693. package/src/lib/app-utils/visitor-consent.js.map +1 -0
  694. package/src/lib/app-utils/visitor-record-ceiling.d.ts +223 -0
  695. package/src/lib/app-utils/visitor-record-ceiling.js +215 -0
  696. package/src/lib/app-utils/visitor-record-ceiling.js.map +1 -0
  697. package/src/lib/app-utils/web-vitals-rum.d.ts +53 -0
  698. package/src/lib/app-utils/web-vitals-rum.js +278 -0
  699. package/src/lib/app-utils/web-vitals-rum.js.map +1 -0
  700. package/src/lib/app-utils/webhook-delivery.d.ts +324 -0
  701. package/src/lib/app-utils/webhook-delivery.js +413 -0
  702. package/src/lib/app-utils/webhook-delivery.js.map +1 -0
  703. package/src/lib/app-utils/where-used.d.ts +57 -0
  704. package/src/lib/app-utils/where-used.js +59 -0
  705. package/src/lib/app-utils/where-used.js.map +1 -0
  706. package/src/lib/app-utils/wistia-embed.d.ts +86 -0
  707. package/src/lib/app-utils/wistia-embed.js +119 -0
  708. package/src/lib/app-utils/wistia-embed.js.map +1 -0
  709. package/src/lib/app-utils/workflows.d.ts +136 -0
  710. package/src/lib/app-utils/workflows.js +346 -0
  711. package/src/lib/app-utils/workflows.js.map +1 -0
  712. package/src/lib/canvas-manager/canvas-manager-tree.d.ts +109 -0
  713. package/src/lib/canvas-manager/canvas-manager-tree.js +139 -0
  714. package/src/lib/canvas-manager/canvas-manager-tree.js.map +1 -0
  715. package/src/lib/canvas-manager/canvas-manager.d.ts +549 -0
  716. package/src/lib/canvas-manager/canvas-manager.js +1311 -0
  717. package/src/lib/canvas-manager/canvas-manager.js.map +1 -0
  718. package/src/lib/canvas-manager/index.d.ts +20 -0
  719. package/src/lib/canvas-manager/index.js +21 -0
  720. package/src/lib/canvas-manager/index.js.map +1 -0
  721. package/src/lib/canvas-manager/stores/index.d.ts +17 -0
  722. package/src/lib/canvas-manager/stores/index.js +18 -0
  723. package/src/lib/canvas-manager/stores/index.js.map +1 -0
  724. package/src/lib/canvas-manager/stores/node.store.d.ts +30 -0
  725. package/src/lib/canvas-manager/stores/node.store.js +45 -0
  726. package/src/lib/canvas-manager/stores/node.store.js.map +1 -0
  727. package/src/lib/components-manager/components-manager.d.ts +56 -0
  728. package/src/lib/components-manager/components-manager.js +191 -0
  729. package/src/lib/components-manager/components-manager.js.map +1 -0
  730. package/src/lib/components-manager/index.d.ts +18 -0
  731. package/src/lib/components-manager/index.js +19 -0
  732. package/src/lib/components-manager/index.js.map +1 -0
  733. package/src/lib/emit-manager/emit-manager.d.ts +56 -0
  734. package/src/lib/emit-manager/emit-manager.js +60 -0
  735. package/src/lib/emit-manager/emit-manager.js.map +1 -0
  736. package/src/lib/emit-manager/index.d.ts +18 -0
  737. package/src/lib/emit-manager/index.js +19 -0
  738. package/src/lib/emit-manager/index.js.map +1 -0
  739. package/src/lib/foundation/constants/_internal.d.ts +18 -0
  740. package/src/lib/foundation/constants/_internal.js +62 -0
  741. package/src/lib/foundation/constants/_internal.js.map +1 -0
  742. package/src/lib/foundation/constants/app.d.ts +23 -0
  743. package/src/lib/foundation/constants/app.js +25 -0
  744. package/src/lib/foundation/constants/app.js.map +1 -0
  745. package/src/lib/foundation/constants/canvas.d.ts +18 -0
  746. package/src/lib/foundation/constants/canvas.js +18 -0
  747. package/src/lib/foundation/constants/canvas.js.map +1 -0
  748. package/src/lib/foundation/constants/components.d.ts +54 -0
  749. package/src/lib/foundation/constants/components.js +61 -0
  750. package/src/lib/foundation/constants/components.js.map +1 -0
  751. package/src/lib/foundation/constants/shared.d.ts +50 -0
  752. package/src/lib/foundation/constants/shared.js +49 -0
  753. package/src/lib/foundation/constants/shared.js.map +1 -0
  754. package/src/lib/foundation/constants/symbol.d.ts +63 -0
  755. package/src/lib/foundation/constants/symbol.js +75 -0
  756. package/src/lib/foundation/constants/symbol.js.map +1 -0
  757. package/src/lib/foundation/definitions/components.types.d.ts +372 -0
  758. package/src/lib/foundation/definitions/components.types.js +180 -0
  759. package/src/lib/foundation/definitions/components.types.js.map +1 -0
  760. package/src/lib/foundation/definitions/contact.types.d.ts +73 -0
  761. package/src/lib/foundation/definitions/contact.types.js +107 -0
  762. package/src/lib/foundation/definitions/contact.types.js.map +1 -0
  763. package/src/lib/foundation/definitions/host-content-collections.d.ts +137 -0
  764. package/src/lib/foundation/definitions/host-content-collections.js +219 -0
  765. package/src/lib/foundation/definitions/host-content-collections.js.map +1 -0
  766. package/src/lib/foundation/definitions/org-billing.types.d.ts +1361 -0
  767. package/src/lib/foundation/definitions/org-billing.types.js +77 -0
  768. package/src/lib/foundation/definitions/org-billing.types.js.map +1 -0
  769. package/src/lib/foundation/definitions/organization.types.d.ts +307 -0
  770. package/src/lib/foundation/definitions/organization.types.js +42 -0
  771. package/src/lib/foundation/definitions/organization.types.js.map +1 -0
  772. package/src/lib/foundation/definitions/platform.types.d.ts +1326 -0
  773. package/src/lib/foundation/definitions/platform.types.js +124 -0
  774. package/src/lib/foundation/definitions/platform.types.js.map +1 -0
  775. package/src/lib/foundation/definitions/property-kinds.d.ts +189 -0
  776. package/src/lib/foundation/definitions/property-kinds.js +565 -0
  777. package/src/lib/foundation/definitions/property-kinds.js.map +1 -0
  778. package/src/lib/foundation/definitions/shared.d.ts +23 -0
  779. package/src/lib/foundation/definitions/shared.js +18 -0
  780. package/src/lib/foundation/definitions/shared.js.map +1 -0
  781. package/src/lib/foundation/definitions/write-deny-coverage.util.d.ts +249 -0
  782. package/src/lib/foundation/definitions/write-deny-coverage.util.js +499 -0
  783. package/src/lib/foundation/definitions/write-deny-coverage.util.js.map +1 -0
  784. package/src/lib/foundation/index.d.ts +32 -0
  785. package/src/lib/foundation/index.js +67 -0
  786. package/src/lib/foundation/index.js.map +1 -0
  787. package/src/lib/lifecycle.d.ts +24 -0
  788. package/src/lib/lifecycle.js +39 -0
  789. package/src/lib/lifecycle.js.map +1 -0
  790. package/src/lib/mst/common.d.ts +17 -0
  791. package/src/lib/mst/common.js +23 -0
  792. package/src/lib/mst/common.js.map +1 -0
  793. package/src/lib/mst/index.d.ts +19 -0
  794. package/src/lib/mst/index.js +20 -0
  795. package/src/lib/mst/index.js.map +1 -0
  796. package/src/lib/mst/json.d.ts +22 -0
  797. package/src/lib/mst/json.js +23 -0
  798. package/src/lib/mst/json.js.map +1 -0
  799. package/src/lib/mst/types.d.ts +20 -0
  800. package/src/lib/mst/types.js +18 -0
  801. package/src/lib/mst/types.js.map +1 -0
  802. package/src/lib/plugin-manager/billing-webhook-hooks.d.ts +77 -0
  803. package/src/lib/plugin-manager/billing-webhook-hooks.js +55 -0
  804. package/src/lib/plugin-manager/billing-webhook-hooks.js.map +1 -0
  805. package/src/lib/plugin-manager/commerce-zone-props.d.ts +172 -0
  806. package/src/lib/plugin-manager/commerce-zone-props.js +31 -0
  807. package/src/lib/plugin-manager/commerce-zone-props.js.map +1 -0
  808. package/src/lib/plugin-manager/custom-fields.d.ts +60 -0
  809. package/src/lib/plugin-manager/custom-fields.js +39 -0
  810. package/src/lib/plugin-manager/custom-fields.js.map +1 -0
  811. package/src/lib/plugin-manager/editor-sessions.d.ts +109 -0
  812. package/src/lib/plugin-manager/editor-sessions.js +137 -0
  813. package/src/lib/plugin-manager/editor-sessions.js.map +1 -0
  814. package/src/lib/plugin-manager/enabled-plugins.d.ts +438 -0
  815. package/src/lib/plugin-manager/enabled-plugins.js +403 -0
  816. package/src/lib/plugin-manager/enabled-plugins.js.map +1 -0
  817. package/src/lib/plugin-manager/feature-plugins.d.ts +1314 -0
  818. package/src/lib/plugin-manager/feature-plugins.js +609 -0
  819. package/src/lib/plugin-manager/feature-plugins.js.map +1 -0
  820. package/src/lib/plugin-manager/first-party-plugins.generated.d.ts +11 -0
  821. package/src/lib/plugin-manager/first-party-plugins.generated.js +149 -0
  822. package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -0
  823. package/src/lib/plugin-manager/index.d.ts +42 -0
  824. package/src/lib/plugin-manager/index.js +46 -0
  825. package/src/lib/plugin-manager/index.js.map +1 -0
  826. package/src/lib/plugin-manager/install-presets.d.ts +93 -0
  827. package/src/lib/plugin-manager/install-presets.js +86 -0
  828. package/src/lib/plugin-manager/install-presets.js.map +1 -0
  829. package/src/lib/plugin-manager/media-delivery-provider.d.ts +124 -0
  830. package/src/lib/plugin-manager/media-delivery-provider.js +53 -0
  831. package/src/lib/plugin-manager/media-delivery-provider.js.map +1 -0
  832. package/src/lib/plugin-manager/order-fulfilment.d.ts +142 -0
  833. package/src/lib/plugin-manager/order-fulfilment.js +104 -0
  834. package/src/lib/plugin-manager/order-fulfilment.js.map +1 -0
  835. package/src/lib/plugin-manager/plugin-activity-actions.d.ts +122 -0
  836. package/src/lib/plugin-manager/plugin-activity-actions.js +140 -0
  837. package/src/lib/plugin-manager/plugin-activity-actions.js.map +1 -0
  838. package/src/lib/plugin-manager/plugin-bridge.d.ts +98 -0
  839. package/src/lib/plugin-manager/plugin-bridge.js +154 -0
  840. package/src/lib/plugin-manager/plugin-bridge.js.map +1 -0
  841. package/src/lib/plugin-manager/plugin-config.d.ts +148 -0
  842. package/src/lib/plugin-manager/plugin-config.js +228 -0
  843. package/src/lib/plugin-manager/plugin-config.js.map +1 -0
  844. package/src/lib/plugin-manager/plugin-console-crons.d.ts +139 -0
  845. package/src/lib/plugin-manager/plugin-console-crons.js +177 -0
  846. package/src/lib/plugin-manager/plugin-console-crons.js.map +1 -0
  847. package/src/lib/plugin-manager/plugin-contact-capture.d.ts +220 -0
  848. package/src/lib/plugin-manager/plugin-contact-capture.js +89 -0
  849. package/src/lib/plugin-manager/plugin-contact-capture.js.map +1 -0
  850. package/src/lib/plugin-manager/plugin-contributions.d.ts +244 -0
  851. package/src/lib/plugin-manager/plugin-contributions.js +283 -0
  852. package/src/lib/plugin-manager/plugin-contributions.js.map +1 -0
  853. package/src/lib/plugin-manager/plugin-entitlement-keys.d.ts +169 -0
  854. package/src/lib/plugin-manager/plugin-entitlement-keys.js +84 -0
  855. package/src/lib/plugin-manager/plugin-entitlement-keys.js.map +1 -0
  856. package/src/lib/plugin-manager/plugin-entitlements.d.ts +181 -0
  857. package/src/lib/plugin-manager/plugin-entitlements.js +188 -0
  858. package/src/lib/plugin-manager/plugin-entitlements.js.map +1 -0
  859. package/src/lib/plugin-manager/plugin-events.d.ts +145 -0
  860. package/src/lib/plugin-manager/plugin-events.js +79 -0
  861. package/src/lib/plugin-manager/plugin-events.js.map +1 -0
  862. package/src/lib/plugin-manager/plugin-figures.d.ts +251 -0
  863. package/src/lib/plugin-manager/plugin-figures.js +252 -0
  864. package/src/lib/plugin-manager/plugin-figures.js.map +1 -0
  865. package/src/lib/plugin-manager/plugin-host-collections.d.ts +146 -0
  866. package/src/lib/plugin-manager/plugin-host-collections.js +116 -0
  867. package/src/lib/plugin-manager/plugin-host-collections.js.map +1 -0
  868. package/src/lib/plugin-manager/plugin-jobs.d.ts +130 -0
  869. package/src/lib/plugin-manager/plugin-jobs.js +182 -0
  870. package/src/lib/plugin-manager/plugin-jobs.js.map +1 -0
  871. package/src/lib/plugin-manager/plugin-loader.d.ts +86 -0
  872. package/src/lib/plugin-manager/plugin-loader.js +223 -0
  873. package/src/lib/plugin-manager/plugin-loader.js.map +1 -0
  874. package/src/lib/plugin-manager/plugin-manager.d.ts +95 -0
  875. package/src/lib/plugin-manager/plugin-manager.js +343 -0
  876. package/src/lib/plugin-manager/plugin-manager.js.map +1 -0
  877. package/src/lib/plugin-manager/plugin-metered-lines.d.ts +97 -0
  878. package/src/lib/plugin-manager/plugin-metered-lines.js +123 -0
  879. package/src/lib/plugin-manager/plugin-metered-lines.js.map +1 -0
  880. package/src/lib/plugin-manager/plugin-org-erasure.d.ts +52 -0
  881. package/src/lib/plugin-manager/plugin-org-erasure.js +100 -0
  882. package/src/lib/plugin-manager/plugin-org-erasure.js.map +1 -0
  883. package/src/lib/plugin-manager/plugin-permissions.d.ts +69 -0
  884. package/src/lib/plugin-manager/plugin-permissions.js +77 -0
  885. package/src/lib/plugin-manager/plugin-permissions.js.map +1 -0
  886. package/src/lib/plugin-manager/plugin-person-erasure.d.ts +58 -0
  887. package/src/lib/plugin-manager/plugin-person-erasure.js +109 -0
  888. package/src/lib/plugin-manager/plugin-person-erasure.js.map +1 -0
  889. package/src/lib/plugin-manager/plugin-record-cards.d.ts +99 -0
  890. package/src/lib/plugin-manager/plugin-record-cards.js +59 -0
  891. package/src/lib/plugin-manager/plugin-record-cards.js.map +1 -0
  892. package/src/lib/plugin-manager/plugin-record-facts.d.ts +111 -0
  893. package/src/lib/plugin-manager/plugin-record-facts.js +51 -0
  894. package/src/lib/plugin-manager/plugin-record-facts.js.map +1 -0
  895. package/src/lib/plugin-manager/plugin-record-routes.d.ts +129 -0
  896. package/src/lib/plugin-manager/plugin-record-routes.js +93 -0
  897. package/src/lib/plugin-manager/plugin-record-routes.js.map +1 -0
  898. package/src/lib/plugin-manager/plugin-record-timeline.d.ts +147 -0
  899. package/src/lib/plugin-manager/plugin-record-timeline.js +39 -0
  900. package/src/lib/plugin-manager/plugin-record-timeline.js.map +1 -0
  901. package/src/lib/plugin-manager/plugin-resource-drafts.d.ts +137 -0
  902. package/src/lib/plugin-manager/plugin-resource-drafts.js +51 -0
  903. package/src/lib/plugin-manager/plugin-resource-drafts.js.map +1 -0
  904. package/src/lib/plugin-manager/plugin-services.d.ts +94 -0
  905. package/src/lib/plugin-manager/plugin-services.js +153 -0
  906. package/src/lib/plugin-manager/plugin-services.js.map +1 -0
  907. package/src/lib/plugin-manager/plugin-styles-ui.d.ts +71 -0
  908. package/src/lib/plugin-manager/plugin-styles-ui.js +80 -0
  909. package/src/lib/plugin-manager/plugin-styles-ui.js.map +1 -0
  910. package/src/lib/plugin-manager/plugin-styles.d.ts +176 -0
  911. package/src/lib/plugin-manager/plugin-styles.js +186 -0
  912. package/src/lib/plugin-manager/plugin-styles.js.map +1 -0
  913. package/src/lib/plugin-manager/plugin-subprocessors.d.ts +135 -0
  914. package/src/lib/plugin-manager/plugin-subprocessors.js +129 -0
  915. package/src/lib/plugin-manager/plugin-subprocessors.js.map +1 -0
  916. package/src/lib/plugin-manager/plugin-tax-profile.d.ts +84 -0
  917. package/src/lib/plugin-manager/plugin-tax-profile.js +39 -0
  918. package/src/lib/plugin-manager/plugin-tax-profile.js.map +1 -0
  919. package/src/lib/plugin-manager/plugin-user-erasure.d.ts +53 -0
  920. package/src/lib/plugin-manager/plugin-user-erasure.js +84 -0
  921. package/src/lib/plugin-manager/plugin-user-erasure.js.map +1 -0
  922. package/src/lib/plugin-manager/plugin-zones.d.ts +121 -0
  923. package/src/lib/plugin-manager/plugin-zones.js +74 -0
  924. package/src/lib/plugin-manager/plugin-zones.js.map +1 -0
  925. package/src/lib/plugin-manager/realm-plugins.d.ts +112 -0
  926. package/src/lib/plugin-manager/realm-plugins.js +196 -0
  927. package/src/lib/plugin-manager/realm-plugins.js.map +1 -0
  928. package/src/lib/plugin-manager/realm-server.d.ts +54 -0
  929. package/src/lib/plugin-manager/realm-server.js +88 -0
  930. package/src/lib/plugin-manager/realm-server.js.map +1 -0
  931. package/src/lib/plugin-manager/record-zone-props.d.ts +126 -0
  932. package/src/lib/plugin-manager/record-zone-props.js +31 -0
  933. package/src/lib/plugin-manager/record-zone-props.js.map +1 -0
  934. package/src/lib/plugin-manager/site-page-hooks.d.ts +102 -0
  935. package/src/lib/plugin-manager/site-page-hooks.js +114 -0
  936. package/src/lib/plugin-manager/site-page-hooks.js.map +1 -0
  937. package/src/lib/plugin-manager/site-runtime.d.ts +57 -0
  938. package/src/lib/plugin-manager/site-runtime.js +25 -0
  939. package/src/lib/plugin-manager/site-runtime.js.map +1 -0
  940. package/src/lib/plugin-manager/usage-alert-contributors.d.ts +115 -0
  941. package/src/lib/plugin-manager/usage-alert-contributors.js +106 -0
  942. package/src/lib/plugin-manager/usage-alert-contributors.js.map +1 -0
  943. package/src/lib/types/ast.d.ts +199 -0
  944. package/src/lib/types/ast.js +20 -0
  945. package/src/lib/types/ast.js.map +1 -0
  946. package/src/lib/types/index.d.ts +20 -0
  947. package/src/lib/types/index.js +21 -0
  948. package/src/lib/types/index.js.map +1 -0
  949. package/src/lib/types/nodes.d.ts +608 -0
  950. package/src/lib/types/nodes.js +28 -0
  951. package/src/lib/types/nodes.js.map +1 -0
  952. package/src/lib/types/routing.d.ts +17 -0
  953. package/src/lib/types/routing.js +18 -0
  954. package/src/lib/types/routing.js.map +1 -0
  955. package/src/lib/types/screen.d.ts +23 -0
  956. package/src/lib/types/screen.js +18 -0
  957. package/src/lib/types/screen.js.map +1 -0
  958. package/src/lib/utils.d.ts +25 -0
  959. package/src/lib/utils.js +42 -0
  960. package/src/lib/utils.js.map +1 -0
  961. package/src/server.d.ts +37 -0
  962. package/src/server.js +55 -0
  963. package/src/server.js.map +1 -0
@@ -0,0 +1,1285 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ import { _ as _extends } from "@swc/helpers/_/_extends";
17
+ import { COLLECTION_ENTRY_DATE_FORMAT_DEFAULT, collectionEntryPublishedAtIso, formatCollectionEntryDate, normalizeCollectionEntryDateFormat } from "./collection-entry-date.js";
18
+ import { contentAuthorPageUrl, normalizeContentAuthorLinks } from "./content-authors.js";
19
+ import { resolveNamedTokens } from "./resolve-named-tokens.js";
20
+ export * from "./collection-entry-date.js";
21
+ /**
22
+ * Persisted component id of the "Collection entries" repeater block
23
+ * (plugins-mui). Like `layoutSlot`, the id lives here so the tenant compose
24
+ * pipeline can find the block without importing the component bundle.
25
+ */ export const COLLECTION_ENTRIES_COMPONENT_ID = 'collectionEntries';
26
+ /** Persisted component id of the markdown "Entry body" block (plugins-mui). */ export const COLLECTION_ENTRY_BODY_COMPONENT_ID = 'collectionEntryBody';
27
+ /**
28
+ * Persisted component id of the "Related posts" block (plugins-mui,
29
+ * AGL-582). The compose pipeline stamps the related entries onto the node,
30
+ * so the id lives here like the entries/body blocks.
31
+ */ export const COLLECTION_RELATED_COMPONENT_ID = 'collectionRelated';
32
+ /** Persisted component id of the share-bar block (plugins-mui, AGL-582). */ export const COLLECTION_SHARE_COMPONENT_ID = 'collectionShare';
33
+ /** Persisted component id of the entry-meta block (plugins-mui, AGL-582). */ export const COLLECTION_ENTRY_META_COMPONENT_ID = 'collectionEntryMeta';
34
+ /**
35
+ * Persisted component id of the author card that closes an article
36
+ * (plugins-mui, AGL-2486).
37
+ *
38
+ * Entry Meta prints the byline — a NAME, on one line, beside the date. The
39
+ * author record it now resolves against carries a portrait, a bio, a job
40
+ * title and a url, and none of those have anywhere to render: a template that
41
+ * wanted the card the article frame draws had to type the name and the blurb
42
+ * as literal text, which then said "The Aglyn Team" under a post somebody
43
+ * else wrote and went stale the moment the author record was edited. The id
44
+ * lives here, with the other collection blocks, so the compose pipeline can
45
+ * fill the card without importing the bundle.
46
+ */ export const COLLECTION_ENTRY_AUTHOR_COMPONENT_ID = 'collectionEntryAuthor';
47
+ /**
48
+ * Persisted component id of the "Category Pills" block (plugins-mui,
49
+ * AGL-1321). Like the entries repeater, the id lives here so the tenant
50
+ * compose pipeline can stamp the block's links without importing the bundle.
51
+ */ export const COLLECTION_CATEGORIES_COMPONENT_ID = 'collectionCategories';
52
+ /**
53
+ * Persisted component id of the standalone "Collection Search" block
54
+ * (plugins-mui, AGL-1516).
55
+ *
56
+ * The Collection Entries block grew its own search box first, and it renders
57
+ * INSIDE that block — first child of the block's own stack. Figma 494:1220
58
+ * puts the field in the listing's toolbar row instead, beside the RSS button
59
+ * with the category pills opposite it, and no amount of authoring can lift a
60
+ * block's own child out of it. The pills cannot move the other way either:
61
+ * every child of an entries block is cloned once per entry.
62
+ *
63
+ * So the field became a block an author can put where the frame draws it.
64
+ * Suggestion-panel only, by construction rather than by omission — a
65
+ * standalone box has no clones to hide, so `filter` is a thing it genuinely
66
+ * cannot do, and the one behaviour it does have is the toolbar behaviour the
67
+ * frame asks for.
68
+ */ export const COLLECTION_SEARCH_COMPONENT_ID = 'collectionSearch';
69
+ /**
70
+ * Reserved list sub-paths (AGL-620 `page`, AGL-1321 `category`). Both are
71
+ * only reserved as the HEAD of a longer path, so an entry legitimately
72
+ * slugged `page` or `category` keeps serving at `/{collection}/{entry}`.
73
+ */ export const COLLECTION_PAGE_ROUTE_SEGMENT = 'page';
74
+ export const COLLECTION_CATEGORY_ROUTE_SEGMENT = 'category';
75
+ /** Namespaces cloned template ids per container/entry (cf. `rep__`). */ export const COLLECTION_ENTRIES_NODE_ID_PREFIX = 'centry__';
76
+ /** Hard bound on entries a single block renders, before `entriesLimit`. */ export const COLLECTION_ENTRIES_MAX = 100;
77
+ /**
78
+ * Hard bound on the entries one READ of a collection returns (AGL-1516) — the
79
+ * `.limit()` the tenant's live-entries query carries.
80
+ *
81
+ * Named here, beside the render bound it has always silently matched, because
82
+ * a search index has to know the difference. The render bound is a choice
83
+ * about a block; this one is a choice about the DATA, and a set that reaches
84
+ * it is a set nobody has seen all of. Two 100s that happened to agree meant
85
+ * `entries.length === 100` could be read either as "this collection has 100
86
+ * entries" or "this read stopped at 100", and the honest empty state turns on
87
+ * exactly that distinction.
88
+ */ export const COLLECTION_SOURCE_MAX = 100;
89
+ /**
90
+ * Whether a collection source is a COMPLETE read or a bounded one
91
+ * (AGL-1516) — true when the read came back holding its own limit, which is
92
+ * the only signal a limited query without a count leaves behind.
93
+ *
94
+ * Deliberately errs toward "bounded": a collection of exactly
95
+ * {@link COLLECTION_SOURCE_MAX} entries answers true and gets described one
96
+ * notch more cautiously than it needed. Overstating what a search covered is
97
+ * the failure that renders as a confident "nothing matched".
98
+ */ export function collectionSourceReachedBound(entries) {
99
+ var _ref;
100
+ return ((_ref = entries == null ? void 0 : entries.length) != null ? _ref : 0) >= COLLECTION_SOURCE_MAX;
101
+ }
102
+ /**
103
+ * Whether the read behind a collection source was a bounded one (AGL-1516),
104
+ * asking the READER first and only then falling back to counting.
105
+ *
106
+ * The count is a proxy, and it under-reports in two ways that both landed
107
+ * after `collectionSourceReachedBound` was written:
108
+ *
109
+ * 1. The query takes `status in ['published', 'scheduled']` and the loader
110
+ * then drops what is not live yet — a future `publishAt`, or since AGL-471
111
+ * a due schedule the plan does not carry. A read that came back holding
112
+ * its full 100 docs can therefore hand over 96 entries, and 96 does not
113
+ * look like a ceiling. A blog with a scheduling queue is exactly the site
114
+ * that hits this.
115
+ * 2. A category route filters `entries` before compose ever sees them, so the
116
+ * "raw set" the entries block is careful to measure is already narrowed.
117
+ *
118
+ * Both make the flag read FALSE on a read that really did stop at its bound,
119
+ * and false is the direction that produces the confident "nothing matched"
120
+ * this signal exists to prevent. So `reachedBound` is threaded down from the
121
+ * query that owns the fact, and the count survives only as the fallback for a
122
+ * source that predates it — a payload cached before this shipped, or a caller
123
+ * that assembles a source by hand.
124
+ */ export function collectionSourceIsBounded(source) {
125
+ if (source == null ? void 0 : source.reachedBound) return true;
126
+ return collectionSourceReachedBound(source == null ? void 0 : source.entries);
127
+ }
128
+ /** Default entries per page for a paginated collection list (AGL-620). */ export const COLLECTION_LIST_PAGE_SIZE = 10;
129
+ /**
130
+ * Total pages for `total` entries at `perPage` per page — at least 1 so an
131
+ * empty collection still has a page 1 (AGL-620).
132
+ */ export function collectionTotalPages(total, perPage) {
133
+ if (perPage <= 0) return 1;
134
+ return Math.max(1, Math.ceil(total / perPage));
135
+ }
136
+ /** Default/most related posts a Related posts block renders (AGL-582). */ export const COLLECTION_RELATED_DEFAULT_LIMIT = 3;
137
+ export const COLLECTION_RELATED_MAX = 12;
138
+ /** Most categories a collection's taxonomy holds (AGL-582). */ export const COLLECTION_CATEGORIES_MAX = 50;
139
+ /**
140
+ * How many LIVE entries one content collection may hold (AGL-2266).
141
+ *
142
+ * `hosts/{hostId}/collections/{cid}/entries/{eid}` had a DEDICATED rules block
143
+ * re-granting `create` to any editor, client-direct — deliberately, because the
144
+ * name-based exclusions on the host catch-all must not reach entries — so it
145
+ * was the one quota-governed shape under a host with no quota at all. A free
146
+ * org could mint unbounded Firestore documents from the browser.
147
+ *
148
+ * This is a flat PLATFORM cap, not a plan dimension. AGL-1387 declined
149
+ * `collectionsPerHost` and this does not re-open it: nothing here is priced,
150
+ * no `OrgEntitlements` key is added, and every plan gets the same number. It is
151
+ * the `WEBHOOK_MAX_PER_HOST` (AGL-1360) / `NON_PAGE_SCREEN_MAX_PER_HOST`
152
+ * (AGL-1399) shape, which both issues invented for exactly this: uncapped
153
+ * infrastructure behind a $0 subscription.
154
+ *
155
+ * ## Per COLLECTION, paired with {@link COLLECTIONS_MAX_PER_HOST}
156
+ *
157
+ * A per-HOST entry cap would need a count across every collection the host
158
+ * holds, which is a collection-group read the entry documents carry no `hostId`
159
+ * to scope. Per collection is one `count()` on the collection the create is
160
+ * addressed to — the same read every other cap on `/api/hosts/resources`
161
+ * already pays — and the host is bounded by the PRODUCT of the two numbers,
162
+ * which is why the sibling cap had to land in the same change. One of the two
163
+ * alone bounds nothing: unbounded collections each holding 10,000 entries is
164
+ * the same unbounded store, spelled differently.
165
+ *
166
+ * ## Why 10,000
167
+ *
168
+ * A blog publishing daily reaches it after twenty-seven years; the largest
169
+ * content collection in production holds double digits. The failure mode of a
170
+ * flat cap set too low is blocking real authoring with an error the price list
171
+ * cannot explain, so it is sized to the heaviest plausible library rather than
172
+ * to today's data. It also bounds the cost of the console's own listing, which
173
+ * reads entries with `limit(200)` and would otherwise page through a store with
174
+ * no ceiling.
175
+ */ export const ENTRIES_MAX_PER_COLLECTION = 10000;
176
+ /**
177
+ * How many LIVE content collections one host may hold (AGL-2266).
178
+ *
179
+ * The other half of the entry bound above, and the reason it means anything.
180
+ * Collection creation was already server-owned — the rules deny client `create`
181
+ * and `/api/hosts/collections` claims the slug transactionally (AGL-978) — so
182
+ * the collection had a WRITER with authority and simply no number to enforce.
183
+ *
184
+ * Again a platform cap and not `collectionsPerHost`: AGL-1387 decided
185
+ * collections are not a thing customers are charged for, and that decision is
186
+ * untouched. 100 is far past any real site's taxonomy — production's busiest
187
+ * host has a handful — and short enough that the entries ceiling above
188
+ * multiplies out to a bounded store rather than an unbounded one.
189
+ */ export const COLLECTIONS_MAX_PER_HOST = 100;
190
+ /**
191
+ * Display name of an entry's category (AGL-582): the `categoryId` lookup
192
+ * into the collection's taxonomy wins; the legacy free-typed
193
+ * `entry.category` string is the fallback so existing data keeps
194
+ * rendering. An ID referencing a deleted category resolves to nothing —
195
+ * by design the entry simply shows no category.
196
+ */ export function resolveEntryCategoryName(entry, // `readonly` because this only reads (AGL-1321): the route helpers hold
197
+ // the taxonomy as readonly and would otherwise have to copy it to ask.
198
+ categories) {
199
+ var _entry_categoryId, _entry_category;
200
+ const categoryId = ((_entry_categoryId = entry.categoryId) != null ? _entry_categoryId : '').trim();
201
+ if (categoryId) {
202
+ const match = (categories != null ? categories : []).find((category)=>category.id === categoryId);
203
+ if (match == null ? void 0 : match.name) return match.name;
204
+ }
205
+ const legacy = ((_entry_category = entry.category) != null ? _entry_category : '').trim();
206
+ return legacy || undefined;
207
+ }
208
+ /* ── Published-date formats (AGL-1459) ──────────────────────────────────── */ /**
209
+ * The values an Entry Meta block shows, in the exact spellings the
210
+ * `{{entry.date}}` / `{{entry.author}}` / `{{entry.category}}` /
211
+ * `{{entry.tags}}` tokens produce (AGL-1385, author added AGL-1459).
212
+ *
213
+ * Extracted so the token map and {@link expandCollectionEntryMeta} cannot
214
+ * drift: the same entry has to read the same way whether the author bound the
215
+ * tokens by hand or let the server fill the block in.
216
+ */ export function collectionEntryMetaValues(entry, categories, dateFormat) {
217
+ var _resolveEntryCategoryName, _entry_tags;
218
+ var _entry_author;
219
+ return {
220
+ date: formatCollectionEntryDate(entry.publishedAt, dateFormat),
221
+ // The per-entry byline the editor already collects (AGL-686). It was
222
+ // reachable in the entry's JSON-LD and nowhere on the page, which is what
223
+ // made the frame's byline unauthorable (AGL-1459).
224
+ //
225
+ // The resolved RECORD first, then the legacy string (AGL-2486) — the
226
+ // precedence `resolveEntryAuthor` applies, spelled the same way here. The
227
+ // tenant denormalizes the record's name onto `authorName` before this
228
+ // runs, so on a live render the two agree; reading the record directly is
229
+ // what makes that a convenience rather than the only thing holding the
230
+ // byline up.
231
+ author: (((_entry_author = entry.author) == null ? void 0 : _entry_author.name) || entry.authorName || '').trim(),
232
+ // Entry model v2 (AGL-582): category resolves by stable ID against the
233
+ // collection's taxonomy, falling back to the legacy free-typed string.
234
+ category: (_resolveEntryCategoryName = resolveEntryCategoryName(entry, categories)) != null ? _resolveEntryCategoryName : '',
235
+ tags: ((_entry_tags = entry.tags) != null ? _entry_tags : []).join(', ')
236
+ };
237
+ }
238
+ /**
239
+ * The values an Entry Author card shows (AGL-2486) — the fields of the
240
+ * resolved author RECORD, in the spellings the `{{entry.author*}}` tokens
241
+ * produce.
242
+ *
243
+ * Extracted for the reason {@link collectionEntryMetaValues} was: the card,
244
+ * the token map and {@link expandCollectionEntryAuthor} have to agree, and
245
+ * three copies of "name, falling back to the legacy string" would not.
246
+ *
247
+ * `image` stays RAW — a `media:` reference or a plain url, whichever the
248
+ * author saved — because the resolver that turns one into a fetchable src
249
+ * needs the rendering host and this function has no host (`resolveMediaSrc`,
250
+ * AGL-1215). Every other consumer of an image field in this file does the
251
+ * same.
252
+ */ export function collectionEntryAuthorValues(entry) {
253
+ var _ref, _ref1, _ref2, _ref3, _ref4;
254
+ const author = entry.author;
255
+ return {
256
+ // Their page on THIS site (AGL-2518/2519) — a different destination from
257
+ // `url`, which is their own. Empty when nothing addresses them, so the
258
+ // byline renders as plain text rather than as a link to `/author/`.
259
+ pageUrl: contentAuthorPageUrl(_extends({}, author ? {
260
+ author
261
+ } : {}, entry.authorId ? {
262
+ authorId: entry.authorId
263
+ } : {}, entry.authorName ? {
264
+ authorName: entry.authorName
265
+ } : {})),
266
+ // The rows the card PRINTS (AGL-2516). Normalized here rather than
267
+ // trusted, because this is the boundary a stored document crosses to
268
+ // become props: the renderer guards the href too, but only one of the two
269
+ // sits on the path a hand-written document would take.
270
+ links: normalizeContentAuthorLinks(author == null ? void 0 : author.links),
271
+ // The record wins, then the legacy free-typed byline (AGL-686), which is
272
+ // the same precedence `resolveEntryAuthor` applies — an entry written
273
+ // before custom authors still fills a card, with the one field it has.
274
+ name: ((_ref = (_ref1 = author == null ? void 0 : author.name) != null ? _ref1 : entry.authorName) != null ? _ref : '').trim(),
275
+ bio: ((_ref2 = author == null ? void 0 : author.bio) != null ? _ref2 : '').trim(),
276
+ image: ((_ref3 = author == null ? void 0 : author.image) != null ? _ref3 : '').trim(),
277
+ url: ((_ref4 = author == null ? void 0 : author.url) != null ? _ref4 : '').trim()
278
+ };
279
+ }
280
+ /**
281
+ * The `{{entry.*}}` token map for one entry (AGL-105/551): substituted
282
+ * globally on entry-template screens and per-clone inside the Collection
283
+ * entries block. `entry.url` resolves to the entry's auto-route so links
284
+ * (`Read more`, titles) work without hardcoding the collection slug.
285
+ */ export function collectionEntryTokens(entry, collectionSlug, categories) {
286
+ var _entry_collectionSlug, _entry_title, _entry_excerpt, _entry_body, _entry_coverImage, _entry_coverVideo, _entry_slug, _entry_slug1, _entry_collectionName;
287
+ const meta = collectionEntryMetaValues(entry, categories);
288
+ const author = collectionEntryAuthorValues(entry);
289
+ // The entry's OWN collection wins over the routed one (AGL-2518) — see
290
+ // `CollectionEntryRecord.collectionSlug`. Unset on every single-collection
291
+ // listing, which is why this changes nothing for them.
292
+ const slug = ((_entry_collectionSlug = entry.collectionSlug) != null ? _entry_collectionSlug : '').trim() || collectionSlug;
293
+ return {
294
+ 'entry.title': (_entry_title = entry.title) != null ? _entry_title : '',
295
+ 'entry.excerpt': (_entry_excerpt = entry.excerpt) != null ? _entry_excerpt : '',
296
+ 'entry.body': (_entry_body = entry.body) != null ? _entry_body : '',
297
+ 'entry.coverImage': (_entry_coverImage = entry.coverImage) != null ? _entry_coverImage : '',
298
+ // The featured video (AGL-2956), raw like the cover: a template binds it
299
+ // into a Video element's source, and the element resolves a reference
300
+ // against the site rendering it.
301
+ 'entry.coverVideo': (_entry_coverVideo = entry.coverVideo) != null ? _entry_coverVideo : '',
302
+ 'entry.slug': (_entry_slug = entry.slug) != null ? _entry_slug : '',
303
+ 'entry.url': `/${slug}/${(_entry_slug1 = entry.slug) != null ? _entry_slug1 : ''}`,
304
+ // Which section this entry belongs to (AGL-2518). Worth binding only on a
305
+ // listing that MIXES collections — the author page — where a card
306
+ // otherwise gives a reader no way to tell a release note from an essay.
307
+ 'entry.collection': ((_entry_collectionName = entry.collectionName) != null ? _entry_collectionName : '').trim(),
308
+ 'entry.collectionSlug': slug,
309
+ 'entry.collectionUrl': slug ? `/${slug}` : '',
310
+ 'entry.date': meta.date,
311
+ // The same instant for a parser (AGL-2956). `entry.date` is written for a
312
+ // reader, so a Video element's publication date bound to it publishes an
313
+ // `uploadDate` no crawler can read; this one is an ISO date-time.
314
+ 'entry.publishedAt': collectionEntryPublishedAtIso(entry.publishedAt),
315
+ // The byline (AGL-1459). Bindable by hand for the same reason every other
316
+ // field is: a template that wants it somewhere Entry Meta does not reach.
317
+ 'entry.author': meta.author,
318
+ // The rest of the author RECORD (AGL-2486). Bindable by hand for the
319
+ // same reason `entry.author` is: a card laid out by the designer rather
320
+ // than dropped as the Entry Author block still has to say who wrote the
321
+ // piece, and typing the blurb in as literal text is how a byline starts
322
+ // naming the wrong person.
323
+ 'entry.authorBio': author.bio,
324
+ 'entry.authorImage': author.image,
325
+ 'entry.authorUrl': author.url,
326
+ /**
327
+ * This author's page on this site (AGL-2518) — "more from the person who
328
+ * wrote this".
329
+ *
330
+ * A separate token from `entry.authorUrl`, which is the author's own site,
331
+ * because they are different destinations and a template should be able to
332
+ * offer either or both. Empty when there is nothing addressable, so a
333
+ * binding renders no link rather than one pointing at `/author/`.
334
+ */ 'entry.authorPageUrl': contentAuthorPageUrl(_extends({}, entry.author ? {
335
+ author: entry.author
336
+ } : {}, entry.authorId ? {
337
+ authorId: entry.authorId
338
+ } : {}, entry.authorName ? {
339
+ authorName: entry.authorName
340
+ } : {})),
341
+ // Entry model v2 (AGL-582): taxonomy + SEO tokens. The SEO pair falls
342
+ // back to title/excerpt so templates can bind them unconditionally.
343
+ 'entry.category': meta.category,
344
+ 'entry.tags': meta.tags,
345
+ 'entry.seoTitle': entry.seoTitle || entry.title || '',
346
+ 'entry.seoDescription': entry.seoDescription || entry.excerpt || ''
347
+ };
348
+ }
349
+ /**
350
+ * Category/tag membership check (AGL-582), shared by the Collection entries
351
+ * filter props and the query-less list surfaces. Matching is trimmed and
352
+ * case-insensitive — editors type these by hand. A category filter matches
353
+ * either the entry's stable `categoryId` or its RESOLVED display name (id
354
+ * lookup first, legacy string fallback), so filters written against either
355
+ * spelling keep working across the taxonomy migration.
356
+ */ export function entryMatchesFilter(entry, filter, categories) {
357
+ const normalize = (value)=>value.trim().toLowerCase();
358
+ if (filter.category) {
359
+ var _entry_categoryId, _entry_categoryId1, _resolveEntryCategoryName;
360
+ const wanted = normalize(filter.category);
361
+ const matchesId = Boolean(((_entry_categoryId = entry.categoryId) != null ? _entry_categoryId : '').trim()) && normalize((_entry_categoryId1 = entry.categoryId) != null ? _entry_categoryId1 : '') === wanted;
362
+ const matchesName = normalize((_resolveEntryCategoryName = resolveEntryCategoryName(entry, categories)) != null ? _resolveEntryCategoryName : '') === wanted;
363
+ if (!matchesId && !matchesName) return false;
364
+ }
365
+ if (filter.tag) {
366
+ var _entry_tags;
367
+ const wanted = normalize(filter.tag);
368
+ if (!((_entry_tags = entry.tags) != null ? _entry_tags : []).some((tag)=>normalize(tag) === wanted)) {
369
+ return false;
370
+ }
371
+ }
372
+ return true;
373
+ }
374
+ /* ── Category routes (AGL-1321) ─────────────────────────────────────────── */ /**
375
+ * URL form of a category id or display name (AGL-1321): lowercase, runs of
376
+ * non-alphanumerics collapsed to a single `-`, no leading/trailing dash.
377
+ *
378
+ * Deliberately lossy and idempotent, so the same category addresses the same
379
+ * URL whether the author typed the taxonomy id, the display name, or the URL
380
+ * segment itself. `Open source` → `open-source` → `open-source`.
381
+ */ export function collectionCategorySlug(value) {
382
+ return String(value != null ? value : '').trim().toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
383
+ }
384
+ /**
385
+ * The taxonomy category a URL segment addresses (AGL-1321), matched on the
386
+ * stable `id` OR the slugified display name — an author linking
387
+ * `/blog/category/open-source` should not have to know which of the two the
388
+ * data happens to store, and an `id` that survives a rename is exactly why
389
+ * the taxonomy has one. `undefined` = the segment names no known category;
390
+ * the caller renders an empty listing rather than crashing.
391
+ */ export function resolveCollectionCategoryBySlug(categories, slug) {
392
+ const wanted = collectionCategorySlug(slug);
393
+ if (!wanted) return undefined;
394
+ return (categories != null ? categories : []).find((category)=>collectionCategorySlug(category.id) === wanted || collectionCategorySlug(category.name) === wanted);
395
+ }
396
+ /**
397
+ * The canonical URL of a collection listing (AGL-1321). ONE builder, because
398
+ * the pills, the pager, the `<link rel="canonical">`, the JSON-LD and the
399
+ * sitemap must all agree on the shape or the filter quietly becomes a
400
+ * duplicate-content generator.
401
+ *
402
+ * The unfiltered page-1 listing is the bare `/{collection}` — there is no
403
+ * `/{collection}/category/all` and no `?category=all`, so "All" cannot become
404
+ * a second address for the page that already exists.
405
+ */ export function collectionListUrl(options) {
406
+ const scoped = options.categorySlug ? `/${options.collectionSlug}/${COLLECTION_CATEGORY_ROUTE_SEGMENT}/` + collectionCategorySlug(options.categorySlug) : `/${options.collectionSlug}`;
407
+ const page = Number(options.page);
408
+ return Number.isFinite(page) && page > 1 ? `${scoped}/${COLLECTION_PAGE_ROUTE_SEGMENT}/${Math.floor(page)}` : scoped;
409
+ }
410
+ /**
411
+ * Everything a pager needs for one listing (AGL-1386): which page it is on,
412
+ * how many there are, and where prev/next go — through
413
+ * {@link collectionListUrl}, so both links stay inside the category they are
414
+ * paging rather than dumping the reader back onto the unfiltered list.
415
+ *
416
+ * **The edges resolve to the empty string, never to a URL.** No previous page
417
+ * means `prevUrl` is `''`; no next page means `nextUrl` is `''`. That is what
418
+ * lets an authored template bind these unconditionally: one static list screen
419
+ * serves the bare listing, every `/page/{n}`, and every
420
+ * `/category/{slug}` — and there is no runtime conditional to hide a link
421
+ * with. A link whose href resolves to `''` renders as an inert placeholder of
422
+ * the same element (AGL-1268/1357), which is the correct pager on page 1 of 1.
423
+ *
424
+ * ONE computation, because it has two consumers that must agree: the built-in
425
+ * fallback pager's nodes and the `{{pagination.*}}` tokens an authored
426
+ * template binds. A second derivation is how a fallback and a template start
427
+ * disagreeing about which page they are on.
428
+ */ export function collectionPaginationLinks(options) {
429
+ const positive = (value)=>{
430
+ const parsed = Math.floor(Number(value));
431
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 1;
432
+ };
433
+ const page = positive(options.page);
434
+ const totalPages = positive(options.totalPages);
435
+ const href = (n)=>collectionListUrl(_extends({
436
+ collectionSlug: options.collectionSlug
437
+ }, options.categorySlug ? {
438
+ categorySlug: options.categorySlug
439
+ } : {}, {
440
+ page: n
441
+ }));
442
+ return {
443
+ page,
444
+ totalPages,
445
+ prevUrl: page > 1 ? href(page - 1) : '',
446
+ nextUrl: page < totalPages ? href(page + 1) : ''
447
+ };
448
+ }
449
+ const POSITIVE_INTEGER = /^[1-9]\d*$/;
450
+ /**
451
+ * Parses a non-screen path against the content-collection route shapes
452
+ * (AGL-81/620/1321), or `null` when it is none of them and the caller should
453
+ * fall through to the 404 chain:
454
+ *
455
+ * ```
456
+ * /{collection} list, page 1, all categories
457
+ * /{collection}/{entry} one entry
458
+ * /{collection}/page/{n} list page n
459
+ * /{collection}/category/{slug} filtered list, page 1
460
+ * /{collection}/category/{slug}/page/{n} filtered list, page n
461
+ * ```
462
+ *
463
+ * Pure, and shared by the tenant loader and its tests, because the route
464
+ * table IS the ISR cache key here: the tenant catch-all caches by PATH, so a
465
+ * listing variant that lives in the path gets its own cache entry for free,
466
+ * while one that lived in a query string would share `/blog`'s entry and
467
+ * serve one category's HTML for another.
468
+ */ export function parseCollectionRoute(segments) {
469
+ const [collectionSlug, ...rest] = segments;
470
+ if (!collectionSlug) return null;
471
+ if (!rest.length) return {
472
+ collectionSlug,
473
+ page: 1
474
+ };
475
+ if (rest.length === 1) return {
476
+ collectionSlug,
477
+ entrySlug: rest[0],
478
+ page: 1
479
+ };
480
+ if (rest.length === 2 && rest[0] === COLLECTION_PAGE_ROUTE_SEGMENT) {
481
+ return POSITIVE_INTEGER.test(rest[1]) ? {
482
+ collectionSlug,
483
+ page: Number(rest[1])
484
+ } : null;
485
+ }
486
+ if (rest.length === 2 && rest[0] === COLLECTION_CATEGORY_ROUTE_SEGMENT) {
487
+ const categorySlug = collectionCategorySlug(rest[1]);
488
+ return categorySlug ? {
489
+ collectionSlug,
490
+ categorySlug,
491
+ page: 1
492
+ } : null;
493
+ }
494
+ if (rest.length === 4 && rest[0] === COLLECTION_CATEGORY_ROUTE_SEGMENT && rest[2] === COLLECTION_PAGE_ROUTE_SEGMENT && POSITIVE_INTEGER.test(rest[3])) {
495
+ const categorySlug = collectionCategorySlug(rest[1]);
496
+ return categorySlug ? {
497
+ collectionSlug,
498
+ categorySlug,
499
+ page: Number(rest[3])
500
+ } : null;
501
+ }
502
+ return null;
503
+ }
504
+ /**
505
+ * Does this entry belong to the category a URL segment addresses (AGL-1321)?
506
+ *
507
+ * Every spelling the route could plausibly mean is slugified into one set and
508
+ * checked against both of the entry's own spellings — the stable `categoryId`
509
+ * and the RESOLVED display name. So `/blog/category/open-source` answers for
510
+ * a taxonomy whose id is `opensource`, for one whose id is opaque but whose
511
+ * name is "Open source", and for a legacy free-typed entry that predates the
512
+ * taxonomy entirely. `entryMatchesFilter` cannot stand in: it compares raw
513
+ * trimmed strings, so it would miss every multi-word category name.
514
+ */ export function entryMatchesCategoryRoute(entry, route, categories) {
515
+ var _route_category, _route_category1;
516
+ const wanted = new Set([
517
+ route.slug,
518
+ (_route_category = route.category) == null ? void 0 : _route_category.id,
519
+ (_route_category1 = route.category) == null ? void 0 : _route_category1.name
520
+ ].map((value)=>collectionCategorySlug(value)).filter(Boolean));
521
+ if (!wanted.size) return false;
522
+ const entryId = collectionCategorySlug(entry.categoryId);
523
+ if (entryId && wanted.has(entryId)) return true;
524
+ const entryName = collectionCategorySlug(resolveEntryCategoryName(entry, categories));
525
+ return Boolean(entryName) && wanted.has(entryName);
526
+ }
527
+ /** Label the unfiltered pill carries when the author never named one. */ export const COLLECTION_ALL_PILL_DEFAULT = 'All';
528
+ /**
529
+ * The value that persists "no All pill" (AGL-1336).
530
+ *
531
+ * The attribute documented "clear it to omit that pill" and could not do it:
532
+ * the attributes form strips an emptied text field's KEY (ddf maps an
533
+ * emptied field to its `clearedValue`, final-form's default parse turns
534
+ * `''` into `undefined`, and `updateNodeProps` replaces the props object),
535
+ * so the absent key took {@link COLLECTION_ALL_PILL_DEFAULT} and the pill
536
+ * came straight back. `''` is therefore not a value this field can hold —
537
+ * the same AGL-1191 trap that made the App Bar's "Default" unpersistable.
538
+ *
539
+ * So the field carries this as its `clearedValue`: clearing the box writes
540
+ * the word `none`, which survives the round trip and is honoured here.
541
+ * Deliberately a readable word rather than a magic character — an author who
542
+ * reopens the panel sees `none` in the All-label box and can read what it
543
+ * did. Removing the prop entirely (the ✕ affordance) still means "unset",
544
+ * and restores the default.
545
+ */ export const COLLECTION_ALL_PILL_NONE = 'none';
546
+ /**
547
+ * What the unfiltered pill should be labelled, or `''` to omit it — the ONE
548
+ * place the {@link COLLECTION_ALL_PILL_NONE} sentinel is interpreted
549
+ * (AGL-1336). Matched case-insensitively on the trimmed value, because the
550
+ * sentinel is typed by a human only when they are re-entering it by hand.
551
+ *
552
+ * `undefined` is UNSET and takes the default. `null` is CLEARED and omits —
553
+ * it reaches here only from a hand-edited or imported document, but the two
554
+ * are different questions and must not collapse into one answer.
555
+ */ export function resolveCollectionAllLabel(value) {
556
+ if (value === undefined) return COLLECTION_ALL_PILL_DEFAULT;
557
+ if (value === null) return '';
558
+ const text = `${value}`.trim();
559
+ if (!text) return '';
560
+ return text.toLowerCase() === COLLECTION_ALL_PILL_NONE ? '' : text;
561
+ }
562
+ /**
563
+ * The pill row for a collection (AGL-1321): "All" pointing at the canonical
564
+ * unfiltered listing, then one pill per taxonomy category.
565
+ *
566
+ * Each pill addresses its category by the STABLE id where there is one, so a
567
+ * rename moves the label without breaking the link. Active state is decided
568
+ * through the same resolver the route used, not by string equality, because
569
+ * the URL may legitimately have named the category by either spelling.
570
+ */ export function buildCollectionCategoryLinks(options) {
571
+ var _options_categories;
572
+ const { collectionSlug } = options;
573
+ const active = collectionCategorySlug(options.activeCategorySlug);
574
+ const links = [];
575
+ for (const category of (_options_categories = options.categories) != null ? _options_categories : []){
576
+ const idSlug = collectionCategorySlug(category.id);
577
+ const nameSlug = collectionCategorySlug(category.name);
578
+ const slug = idSlug || nameSlug;
579
+ if (!slug) continue;
580
+ links.push({
581
+ label: category.name,
582
+ href: collectionListUrl({
583
+ collectionSlug,
584
+ categorySlug: slug
585
+ }),
586
+ active: Boolean(active) && (idSlug === active || nameSlug === active)
587
+ });
588
+ }
589
+ // A lone "All" pill is not a filter, it is decoration — a collection with
590
+ // no taxonomy gets no row at all.
591
+ if (!links.length) return [];
592
+ const allLabel = resolveCollectionAllLabel(options.allLabel);
593
+ return allLabel ? [
594
+ {
595
+ label: allLabel,
596
+ href: collectionListUrl({
597
+ collectionSlug
598
+ }),
599
+ active: !active
600
+ },
601
+ ...links
602
+ ] : links;
603
+ }
604
+ /**
605
+ * The matchable text a search box holds for a set of entries (AGL-1516),
606
+ * built ONCE for both blocks that carry one — the entries block's in-place
607
+ * filter and the standalone toolbar box (AGL-1516, Figma 494:1220).
608
+ *
609
+ * Shared rather than copied for the same reason
610
+ * {@link COLLECTION_SEARCH_FUSE_OPTIONS} is: the two boxes can sit on the
611
+ * same page, over the same collection, and a reader who sees a suggestion in
612
+ * one and a miss in the other has been told the site is broken. Two builders
613
+ * is how the row's date, chip and link drift apart.
614
+ *
615
+ * The row's link, date and category are resolved HERE, where the entry still
616
+ * exists — a component only holds rendered markup by the time it runs, and
617
+ * the suggestion panel draws its rows from this index rather than from the
618
+ * clones. Through the same three resolvers Related posts uses (AGL-1926 for
619
+ * the date especially): a suggestion for a post is the same post as the card
620
+ * below it and must not be able to disagree with it about its date.
621
+ */ export function buildCollectionSearchIndex(entries, collectionSlug, categories) {
622
+ return entries.map((entry)=>{
623
+ var _entry_title, _entry_excerpt, _entry_collectionSlug;
624
+ var _entry_publishedAt;
625
+ const categoryName = resolveEntryCategoryName(entry, categories);
626
+ return _extends({
627
+ title: (_entry_title = entry.title) != null ? _entry_title : '',
628
+ excerpt: (_entry_excerpt = entry.excerpt) != null ? _entry_excerpt : ''
629
+ }, entry.slug ? {
630
+ url: `/${((_entry_collectionSlug = entry.collectionSlug) != null ? _entry_collectionSlug : '').trim() || collectionSlug}/${entry.slug}`
631
+ } : {}, ((_entry_publishedAt = entry.publishedAt) == null ? void 0 : _entry_publishedAt.seconds) ? {
632
+ date: formatCollectionEntryDate(entry.publishedAt)
633
+ } : {}, categoryName ? {
634
+ category: categoryName
635
+ } : {});
636
+ });
637
+ }
638
+ /**
639
+ * The collection blocks that can be BOUND to a collection by name, rather
640
+ * than inheriting the routed one.
641
+ *
642
+ * The same three `scanCollectionBlocks` resolves a source for, and the same
643
+ * three that can therefore put a collection's entries on a page that is not
644
+ * one of the collection's own routes — a "Latest posts" rail on the home
645
+ * page, a category pill strip in a layout's chrome, a search box in a header.
646
+ *
647
+ * Related posts is deliberately absent. It resolves against the routed
648
+ * collection and renders nothing without a current entry in context, so it
649
+ * only ever appears on an entry page, which the entry's own address already
650
+ * covers.
651
+ */ const COLLECTION_BOUND_COMPONENT_IDS = [
652
+ COLLECTION_ENTRIES_COMPONENT_ID,
653
+ COLLECTION_CATEGORIES_COMPONENT_ID,
654
+ COLLECTION_SEARCH_COMPONENT_ID
655
+ ];
656
+ /**
657
+ * Does this tree render the collection `collectionSlug` away from the
658
+ * collection's own routes?
659
+ *
660
+ * The content twin of {@link nodesPlaceForm}, and it exists for the same
661
+ * reason: an entry edit changes every page that renders the collection, and
662
+ * those pages are found by SEARCHING node trees rather than by matching a
663
+ * pointer. A collection's own addresses are derivable from its slug; a rail
664
+ * on the home page is not derivable from anything.
665
+ *
666
+ * Matches only an EXPLICIT `collectionSlug`. A block that names none inherits
667
+ * the routed collection — which means it renders nothing at all off-route
668
+ * (`scanCollectionBlocks` adds no slug, so the block is left untouched) and
669
+ * renders the routed collection on-route, where the collection's own list and
670
+ * entry addresses already reach it. Treating an unbound block as a dependent
671
+ * of every collection on the site would make every entry save drop every page
672
+ * that carries one.
673
+ *
674
+ * The comparison is against the slug rather than the document id because that
675
+ * is what the binding stores, and what `scanCollectionBlocks` resolves. A
676
+ * collection whose slug was just changed is a different question, and one the
677
+ * slug change itself has to answer.
678
+ */ export function nodesRenderCollection(nodes, collectionSlug) {
679
+ const wanted = String(collectionSlug != null ? collectionSlug : '').trim();
680
+ if (!wanted) return false;
681
+ for (const node of Object.values(nodes != null ? nodes : {})){
682
+ var _node_props;
683
+ if (!node) continue;
684
+ if (!COLLECTION_BOUND_COMPONENT_IDS.includes(String(node.componentId))) {
685
+ continue;
686
+ }
687
+ const bound = (_node_props = node.props) == null ? void 0 : _node_props['collectionSlug'];
688
+ if (typeof bound === 'string' && bound.trim() === wanted) return true;
689
+ }
690
+ return false;
691
+ }
692
+ /**
693
+ * Collection entries blocks (AGL-551): a `collectionEntries` container
694
+ * treats its children as the item template and renders them once per
695
+ * published entry, with `{{entry.*}}` tokens in cloned string props replaced
696
+ * per entry — the content-collection sibling of {@link expandRepeatables}.
697
+ *
698
+ * - The block's collection resolves from its `collectionSlug` prop, falling
699
+ * back to `defaultSlug` (the routed collection on list-template screens).
700
+ * - Clone ids are namespaced `centry__{containerId}__{index}__…` so repeats
701
+ * never collide; run AFTER grafting and BEFORE binding resolution.
702
+ * - Rows are bounded by `props.entriesLimit` and
703
+ * {@link COLLECTION_ENTRIES_MAX}.
704
+ * - `props.firstPageOnly` renders zero rows past page 1 of the ROUTED
705
+ * listing (AGL-1871), so a lead card does not repeat down the pagination.
706
+ * - An UNKNOWN collection leaves the node untouched (fail-open: a renamed
707
+ * collection must never take a screen down). A known collection with no
708
+ * matching entries renders zero rows — never the unsubstituted template.
709
+ * - Inputs are never mutated; template nodes stay in the map unreferenced.
710
+ */ export function expandCollectionEntries(nodes, sourcesBySlug, defaultSlug) {
711
+ const containers = Object.entries(nodes).filter(([, node])=>(node == null ? void 0 : node.componentId) === COLLECTION_ENTRIES_COMPONENT_ID);
712
+ if (!containers.length) return nodes;
713
+ const next = _extends({}, nodes);
714
+ for (const [containerId, container] of containers){
715
+ var _ref, _ref1, _ref2;
716
+ var _container_props, _container_props1, _container_props2, _container_props3, _container_props4, _container_props5, _container_props6, _container_props7;
717
+ const slug = String((_ref = (_container_props = container.props) == null ? void 0 : _container_props.collectionSlug) != null ? _ref : '').trim() || defaultSlug;
718
+ const source = slug ? sourcesBySlug[slug] : undefined;
719
+ // An UNKNOWN collection leaves the node untouched — fail-open, so a
720
+ // renamed collection never takes a published screen down.
721
+ //
722
+ // A KNOWN collection with nothing to show is a different question, and
723
+ // used to get the same answer (AGL-1321). Leaving the template in place
724
+ // renders it once, with its `{{entry.title}}` / `{{entry.url}}` tokens
725
+ // never substituted, so the page shipped a ghost row of literal braces.
726
+ // That was rare while the only way to empty a list was to publish an
727
+ // empty collection; a category filter makes it reachable from any pill
728
+ // whose category has no posts yet. Zero entries now means zero rows.
729
+ if (!source) continue;
730
+ const limitRaw = Number((_container_props1 = container.props) == null ? void 0 : _container_props1.entriesLimit);
731
+ const limit = Number.isFinite(limitRaw) && limitRaw > 0 ? Math.min(limitRaw, COLLECTION_ENTRIES_MAX) : COLLECTION_ENTRIES_MAX;
732
+ // Pagination (AGL-620): when `perPage` is set the block renders one page
733
+ // window `[(page-1)*perPage, page*perPage)`; without it, the legacy
734
+ // `entriesLimit` slice from the top applies unchanged.
735
+ const perPageRaw = Number((_container_props2 = container.props) == null ? void 0 : _container_props2.perPage);
736
+ const perPage = Number.isFinite(perPageRaw) && perPageRaw > 0 ? Math.min(Math.floor(perPageRaw), COLLECTION_ENTRIES_MAX) : undefined;
737
+ // The block's own `page` wins; otherwise the ROUTE's page applies, so
738
+ // `/blog/page/2` and `/blog/category/guides/page/2` render page 2 of a
739
+ // template listing instead of silently re-serving page 1 at a second URL
740
+ // (AGL-1321). Only ever the routed collection: `source.page` is set
741
+ // nowhere else.
742
+ const pageRaw = Number((_container_props3 = container.props) == null ? void 0 : _container_props3.page);
743
+ const routedPage = Number(source.page);
744
+ const page = Number.isFinite(pageRaw) && pageRaw >= 1 ? Math.floor(pageRaw) : Number.isFinite(routedPage) && routedPage >= 1 ? Math.floor(routedPage) : 1;
745
+ // "Only on page 1" (AGL-1871): a LEAD block takes the top of the set and
746
+ // has no page window of its own, so on `/blog/page/2` it repeats exactly
747
+ // what page 1 led with — same cover, same title, same excerpt — above a
748
+ // page of different posts, under an eyebrow that reads "Latest". True on
749
+ // page 1, false everywhere after it.
750
+ //
751
+ // Opt-in and default off. The alternative reading — "a block with no
752
+ // `perPage` on a paginated route is a lead block" — is wrong: a "popular
753
+ // posts" rail is the same shape and belongs on every page of the listing.
754
+ // Only the author knows which one they built, so the author says so.
755
+ //
756
+ // Gated on the ROUTE's page, never on the block's own pinned `page`. A
757
+ // block that names its own page is a deliberately fixed window ("the
758
+ // entries page 3 would show, here"), which says nothing about which page
759
+ // of the listing the reader is on; and off a routed listing entirely
760
+ // (a blog rail on the homepage) `source.page` is unset, so the switch
761
+ // correctly hides nothing.
762
+ const firstPageOnly = Boolean((_container_props4 = container.props) == null ? void 0 : _container_props4.firstPageOnly);
763
+ const suppressedBeyondFirstPage = firstPageOnly && Number.isFinite(routedPage) && routedPage > 1;
764
+ const templateIds = Array.isArray(container.nodes) ? container.nodes : [];
765
+ if (!templateIds.length) continue;
766
+ // Category/tag filter props (AGL-582): the block-level answer to
767
+ // /blog?tag=x — query params never reach the ISR-cached loader, so
768
+ // filtered lists are designed as filtered BLOCKS instead.
769
+ const filterCategory = String((_ref1 = (_container_props5 = container.props) == null ? void 0 : _container_props5.filterCategory) != null ? _ref1 : '').trim();
770
+ const filterTag = String((_ref2 = (_container_props6 = container.props) == null ? void 0 : _container_props6.filterTag) != null ? _ref2 : '').trim();
771
+ const filtered = filterCategory || filterTag ? source.entries.filter((entry)=>entryMatchesFilter(entry, {
772
+ category: filterCategory || undefined,
773
+ tag: filterTag || undefined
774
+ }, source.categories)) : source.entries;
775
+ // Whether the READ behind `source.entries` reached its own bound
776
+ // (AGL-1516). Taken off the raw set, never off `filtered`: a block-level
777
+ // category filter legitimately narrows a complete read, and a narrowed
778
+ // set is not a bounded one. The source's own `reachedBound` wins over
779
+ // counting it, because the count cannot see a read that came back full
780
+ // and was then thinned by the liveness gate.
781
+ const sourceCapped = collectionSourceIsBounded(source);
782
+ const windowed = suppressedBeyondFirstPage ? [] : perPage ? filtered.slice((page - 1) * perPage, (page - 1) * perPage + perPage) : filtered.slice(0, limit);
783
+ const childIds = [];
784
+ windowed.forEach((entry, index)=>{
785
+ const prefix = `${COLLECTION_ENTRIES_NODE_ID_PREFIX}${containerId}__${index}__`;
786
+ const prefixId = (id)=>`${prefix}${id}`;
787
+ const cloned = {};
788
+ const cloneSubtree = (id, parentId)=>{
789
+ const node = nodes[id];
790
+ if (!node) return;
791
+ const clonedChildren = Array.isArray(node.nodes) ? node.nodes : undefined;
792
+ cloned[prefixId(id)] = _extends({}, node, {
793
+ $id: prefixId(id),
794
+ parentId
795
+ }, clonedChildren && {
796
+ nodes: clonedChildren.map((childId)=>prefixId(childId))
797
+ });
798
+ clonedChildren == null ? void 0 : clonedChildren.forEach((childId)=>cloneSubtree(childId, prefixId(id)));
799
+ };
800
+ for (const templateId of templateIds){
801
+ cloneSubtree(templateId, containerId);
802
+ childIds.push(prefixId(templateId));
803
+ }
804
+ // Fill the entry blocks in THIS card from THIS card's entry (AGL-2486).
805
+ //
806
+ // The routed-entry passes (`expandCollectionEntryMeta`,
807
+ // `expandCollectionEntryAuthor`) skip clones deliberately: stamping the
808
+ // routed entry into a listing would date every card the same. That left
809
+ // a cloned block with only its `{{entry.*}}` bindings, and a binding
810
+ // carries no FORMAT — so an Entry Meta inside a card rendered the locale
811
+ // default whatever its Date format said, while the identical block on
812
+ // the article above it obeyed the picker. A field that cannot move the
813
+ // thing it names is worse than a missing one.
814
+ //
815
+ // The fill runs against each clone's own entry, so every card dates
816
+ // itself, and it runs BEFORE substitution so a filled value is already
817
+ // a literal by the time the tokens resolve. The precedence is the
818
+ // shared one: an authored value wins, except the `{{entry.date}}`
819
+ // binding under a chosen format, which is the case this exists for.
820
+ for (const [cloneId, cloneNode] of Object.entries(cloned)){
821
+ var _cloneNode_props;
822
+ const fill = (cloneNode == null ? void 0 : cloneNode.componentId) === COLLECTION_ENTRY_META_COMPONENT_ID ? entryMetaFill(cloneNode, entry, source.categories) : (cloneNode == null ? void 0 : cloneNode.componentId) === COLLECTION_ENTRY_AUTHOR_COMPONENT_ID ? entryAuthorFill(cloneNode, entry) : undefined;
823
+ if (!fill || !Object.keys(fill).length) continue;
824
+ cloned[cloneId] = _extends({}, cloneNode, {
825
+ props: _extends({}, (_cloneNode_props = cloneNode.props) != null ? _cloneNode_props : {}, fill)
826
+ });
827
+ }
828
+ Object.assign(next, resolveNamedTokens(cloned, collectionEntryTokens(entry, source.slug, source.categories)));
829
+ });
830
+ // Search (AGL-1516): the block's search box filters CLIENT-SIDE over the
831
+ // entries this expansion just rendered — the ISR-cached page is the whole
832
+ // data set, so no query ever goes back to Firestore. The component only
833
+ // holds cloned markup by render time, so the matchable text is stamped
834
+ // here, where the entries still exist, index-aligned with the clone
835
+ // groups. Stamped ONLY when the author enabled it: an untouched block's
836
+ // node — and its serialized payload — stays byte-identical.
837
+ const searchEnabled = Boolean((_container_props7 = container.props) == null ? void 0 : _container_props7.search);
838
+ next[containerId] = searchEnabled ? _extends({}, container, {
839
+ props: _extends({}, container.props, {
840
+ searchIndex: buildCollectionSearchIndex(windowed, source.slug, source.categories),
841
+ // How many entries the window above was drawn FROM (AGL-1516).
842
+ //
843
+ // The component has to tell the reader whether a miss means "not
844
+ // here" or "not anywhere", and it cannot work that out for
845
+ // itself: it sees `perPage`, but `perPage` is only one of three
846
+ // ways this block gets truncated. `entriesLimit` slices too, and
847
+ // so does COLLECTION_ENTRIES_MAX at 100. A block set to "latest 6
848
+ // posts" indexes 6 of 40 and, keyed off `perPage` alone, told the
849
+ // reader flatly that their post does not exist.
850
+ //
851
+ // Stamped as the COUNT rather than as a `truncated` verdict, so
852
+ // the component decides the wording and this stays a fact. It is
853
+ // the post-filter total — a category-filtered block searches its
854
+ // category, and "the rest of the collection" means the rest of
855
+ // what this block would otherwise show.
856
+ searchTotal: filtered.length
857
+ }, sourceCapped ? {
858
+ searchCapped: true
859
+ } : {}),
860
+ nodes: childIds
861
+ }) : _extends({}, container, {
862
+ nodes: childIds
863
+ });
864
+ }
865
+ return next;
866
+ }
867
+ /**
868
+ * Category Pills blocks (AGL-1321): stamps each `collectionCategories` node
869
+ * with its collection's pill row as a serializable `items` prop the component
870
+ * renders as real anchors — the same server-stamped shape Related posts uses,
871
+ * and for the same reason: the block owns its markup, so there is no template
872
+ * to clone.
873
+ *
874
+ * `activeCategorySlug` marks a pill only on the ROUTED collection. A pills
875
+ * block pointing at some other collection is not what this URL filters, so
876
+ * marking one of its pills current would be a lie in the HTML.
877
+ *
878
+ * A collection with no taxonomy leaves its block untouched, so the component's
879
+ * besigner affordance / empty site render applies. Inputs are never mutated.
880
+ */ export function expandCollectionCategories(nodes, sourcesBySlug, defaultSlug, activeCategorySlug) {
881
+ const containers = Object.entries(nodes).filter(([, node])=>(node == null ? void 0 : node.componentId) === COLLECTION_CATEGORIES_COMPONENT_ID);
882
+ if (!containers.length) return nodes;
883
+ const next = _extends({}, nodes);
884
+ for (const [containerId, container] of containers){
885
+ var _ref;
886
+ var _container_props, _container_props1;
887
+ const slug = String((_ref = (_container_props = container.props) == null ? void 0 : _container_props.collectionSlug) != null ? _ref : '').trim() || defaultSlug;
888
+ const source = slug ? sourcesBySlug[slug] : undefined;
889
+ if (!source) continue;
890
+ const allLabel = (_container_props1 = container.props) == null ? void 0 : _container_props1.allLabel;
891
+ const items = buildCollectionCategoryLinks(_extends({
892
+ collectionSlug: source.slug,
893
+ categories: source.categories
894
+ }, slug === defaultSlug ? {
895
+ activeCategorySlug
896
+ } : {}, allLabel === undefined ? {} : {
897
+ allLabel: allLabel === null ? null : String(allLabel)
898
+ }));
899
+ if (!items.length) continue;
900
+ next[containerId] = _extends({}, container, {
901
+ props: _extends({}, container.props, {
902
+ items
903
+ })
904
+ });
905
+ }
906
+ return next;
907
+ }
908
+ /**
909
+ * Collection Search blocks (AGL-1516): stamps each `collectionSearch` node
910
+ * with its collection's search index, the size of the set that index was
911
+ * drawn from, and whether that set was a bounded read — the same
912
+ * server-stamped shape Category Pills and Related posts use, and for the same
913
+ * reason: the block owns its markup, so there is no template to clone.
914
+ *
915
+ * Indexes the WHOLE source rather than a page window. The entries block's box
916
+ * searches the entries that block rendered because it filters them in place;
917
+ * a toolbar box filters nothing and suggests, so scoping it to one page of a
918
+ * listing would be an arbitrary cut nobody asked for. What it can honestly
919
+ * cover is the set the page's listing is drawn from — which on a category
920
+ * route is that category, because `source.entries` arrives filtered.
921
+ *
922
+ * Clones are SKIPPED by their `centry__` prefix: a search box inside an entry
923
+ * template would otherwise be stamped once per card. Nodes are never mutated,
924
+ * and a collection with no entries leaves its block untouched, so the
925
+ * component's besigner affordance and its empty site render both stand.
926
+ */ export function expandCollectionSearch(nodes, sourcesBySlug, defaultSlug) {
927
+ const containers = Object.entries(nodes).filter(([id, node])=>(node == null ? void 0 : node.componentId) === COLLECTION_SEARCH_COMPONENT_ID && !id.startsWith(COLLECTION_ENTRIES_NODE_ID_PREFIX));
928
+ if (!containers.length) return nodes;
929
+ const next = _extends({}, nodes);
930
+ for (const [containerId, container] of containers){
931
+ var _ref;
932
+ var _container_props;
933
+ const slug = String((_ref = (_container_props = container.props) == null ? void 0 : _container_props.collectionSlug) != null ? _ref : '').trim() || defaultSlug;
934
+ const source = slug ? sourcesBySlug[slug] : undefined;
935
+ // An unknown collection leaves the node untouched — fail-open, exactly as
936
+ // the entries and pills blocks do, so a rename never takes a screen down.
937
+ if (!source) continue;
938
+ // A collection with nothing published gets no box. A search field over an
939
+ // empty index can only ever answer "no matches", which reads as a fact
940
+ // about the reader's query rather than about the empty collection it
941
+ // really describes.
942
+ if (!source.entries.length) continue;
943
+ next[containerId] = _extends({}, container, {
944
+ props: _extends({}, container.props, {
945
+ searchIndex: buildCollectionSearchIndex(source.entries, source.slug, source.categories),
946
+ searchTotal: source.entries.length
947
+ }, collectionSourceIsBounded(source) ? {
948
+ searchCapped: true
949
+ } : {})
950
+ });
951
+ }
952
+ return next;
953
+ }
954
+ /**
955
+ * Entry Meta blocks (AGL-1385): stamps each `collectionEntryMeta` node with
956
+ * the routed entry's date, category and tags — the same server-stamped shape
957
+ * Category Pills and Related posts already use.
958
+ *
959
+ * MEASURED on the live marketing blog, which is what this fixes. The block was
960
+ * on `blogEntryTmpl` carrying props `{showDate: true, showCategory: true,
961
+ * showTags: true}` and NOTHING else, and rendered as an empty `<div>` at height
962
+ * 0 — while the very same entry's `<pubDate>` and `Guides` category appeared in
963
+ * its feed item, its JSON-LD, and a heading two nodes above it. So the data was
964
+ * never missing; the block simply had nothing bound to it.
965
+ *
966
+ * The design is what made that reachable. Every other collection block sources
967
+ * itself; this one required the author to type `{{entry.date}}` into a text
968
+ * field. Only the PRESET seeds those tokens — drag the bare component out of
969
+ * the palette and you get three switches labelled "Show date / Show category /
970
+ * Show tags", all defaulting to on, gating values that can never exist. That is
971
+ * an affordance promising something the component cannot deliver, so this is a
972
+ * defect in the block and not in anyone's content, and it hits every collection
973
+ * that uses it, not just blog.
974
+ *
975
+ * Deliberately narrow:
976
+ *
977
+ * - An AUTHORED value always wins. Only an absent or blank prop is filled, so
978
+ * a hand-typed byline, a pinned string, or a `{{entry.*}}` token still
979
+ * awaiting substitution is never overwritten. (Blank counts as unset
980
+ * because a cleared text field cannot persist `''` anyway — AGL-1336. The
981
+ * way to hide a value is the switch that exists for it.)
982
+ * - Nodes cloned per entry by {@link expandCollectionEntries} are SKIPPED by
983
+ * their `centry__` id prefix. Their tokens resolve per clone; stamping the
984
+ * routed entry into them would date every card in a listing the same.
985
+ * - Without a routed entry — a list route, a plain screen — nothing is
986
+ * stamped, so the besigner affordance and the empty site render stand.
987
+ *
988
+ * `dateFormat` (AGL-1459) is answered here, where the timestamp still exists,
989
+ * and is the ONE exception to "an authored value always wins" — narrowly, and
990
+ * only for the literal `{{entry.date}}` binding. That binding is what the
991
+ * block's own preset seeds, so a format that filled blanks only would do
992
+ * nothing on the exact surface it was built for. The token is not a hand-typed
993
+ * override; it NAMES the value being reformatted. A literal string an author
994
+ * typed still wins, unchanged.
995
+ *
996
+ * Inputs are never mutated.
997
+ */ export function expandCollectionEntryMeta(nodes, entry, categories) {
998
+ if (!entry) return nodes;
999
+ const containers = Object.entries(nodes).filter(([id, node])=>(node == null ? void 0 : node.componentId) === COLLECTION_ENTRY_META_COMPONENT_ID && !id.startsWith(COLLECTION_ENTRIES_NODE_ID_PREFIX));
1000
+ if (!containers.length) return nodes;
1001
+ const next = _extends({}, nodes);
1002
+ for (const [containerId, container] of containers){
1003
+ var _container_props;
1004
+ const filled = entryMetaFill(container, entry, categories);
1005
+ if (!Object.keys(filled).length) continue;
1006
+ next[containerId] = _extends({}, container, {
1007
+ props: _extends({}, (_container_props = container.props) != null ? _container_props : {}, filled)
1008
+ });
1009
+ }
1010
+ return next;
1011
+ }
1012
+ /**
1013
+ * The values ONE Entry Meta node takes from ONE entry (AGL-2486).
1014
+ *
1015
+ * Extracted so a node inside a listing's card can be filled from the entry
1016
+ * that card is for, which is a different entry per clone and therefore
1017
+ * cannot come from the routed-entry pass above. Both callers apply the same
1018
+ * precedence, because the same block cannot mean two things depending on
1019
+ * where an author dropped it.
1020
+ *
1021
+ * Returns only the keys that change; an empty object means "leave this node
1022
+ * exactly as authored".
1023
+ */ function entryMetaFill(container, entry, categories) {
1024
+ {
1025
+ var _container_props, _ref, _props_author;
1026
+ var _entry_author;
1027
+ const props = (_container_props = container.props) != null ? _container_props : {};
1028
+ // Per node: the format is a prop, so two blocks on one template can read
1029
+ // their dates differently.
1030
+ const dateFormat = normalizeCollectionEntryDateFormat(props['dateFormat']);
1031
+ const values = collectionEntryMetaValues(entry, categories, dateFormat);
1032
+ const filled = {};
1033
+ for (const key of [
1034
+ 'date',
1035
+ 'author',
1036
+ 'category',
1037
+ 'tags'
1038
+ ]){
1039
+ var _props_key;
1040
+ const authored = String((_props_key = props[key]) != null ? _props_key : '').trim();
1041
+ if (authored && !reformattableEntryDate(key, authored, dateFormat)) {
1042
+ continue;
1043
+ }
1044
+ if (!values[key]) continue;
1045
+ filled[key] = values[key];
1046
+ }
1047
+ // The byline avatar follows the BYLINE, and is the second narrow
1048
+ // exception to "an authored value always wins" (after `dateFormat`).
1049
+ //
1050
+ // `avatarImage` was introduced as a block-level pick because entries then
1051
+ // carried a byline STRING and no portrait anywhere, so the site's brand
1052
+ // mark chosen once on the template was the only answer available. Custom
1053
+ // authors changed that: an entry resolves to a record, and a record has
1054
+ // an `image`. Keeping the authored mark in front of it would print the
1055
+ // company logo beside a named person — the wrong face, on every post that
1056
+ // person wrote, which is worse than the generic mark it was standing in
1057
+ // for.
1058
+ //
1059
+ // Deliberately narrow, so nothing else moves: only a resolved author
1060
+ // RECORD that actually carries an image displaces the authored value. A
1061
+ // legacy string byline, an author with no portrait, and an entry with no
1062
+ // author at all all leave the template's mark exactly where it was.
1063
+ //
1064
+ // And only where a byline is actually PRINTED. This block is also the
1065
+ // product's tag row — the article frame ends on one with `Show author`,
1066
+ // `Show date` and `Show category` off and nothing but chips left — so a
1067
+ // portrait filled in unconditionally lands beside the tags, halfway down
1068
+ // the page from the byline it belongs to. The avatar is `alt=""` on the
1069
+ // grounds that "the byline names the author in text right beside it",
1070
+ // which is exactly the thing a chips-only block does not have.
1071
+ const authorImage = String((_ref = (_entry_author = entry.author) == null ? void 0 : _entry_author.image) != null ? _ref : '').trim();
1072
+ const bylineShown = props['showAuthor'] !== false && Boolean(filled['author'] || String((_props_author = props['author']) != null ? _props_author : '').trim());
1073
+ if (authorImage && bylineShown && props['showAvatar'] !== false) {
1074
+ filled['avatarImage'] = authorImage;
1075
+ }
1076
+ /*
1077
+ Where the byline GOES (AGL-2519).
1078
+
1079
+ Filled on the same terms as the avatar and for the same reason: it
1080
+ belongs to the byline, so it is only filled where a byline is actually
1081
+ printed. This block doubles as the product's tag row — the article frame
1082
+ ends on one with the author, date and category all switched off — and a
1083
+ link stamped there would have nothing to attach to.
1084
+
1085
+ An authored value still wins, which is what `Link author` off leaves
1086
+ behind once the switch has written an explicit `false`: the switch is
1087
+ read by the renderer, and this only supplies the destination.
1088
+ */ if (bylineShown) {
1089
+ var _props_authorPageUrl;
1090
+ const pageUrl = collectionEntryAuthorValues(entry).pageUrl;
1091
+ if (pageUrl && !String((_props_authorPageUrl = props['authorPageUrl']) != null ? _props_authorPageUrl : '').trim()) {
1092
+ filled['authorPageUrl'] = pageUrl;
1093
+ }
1094
+ }
1095
+ return filled;
1096
+ }
1097
+ }
1098
+ /**
1099
+ * Fill Entry Author cards from the routed entry's author record (AGL-2486),
1100
+ * on the same terms {@link expandCollectionEntryMeta} fills the byline:
1101
+ *
1102
+ * - an authored value always wins, and a blank one is a blank, not a
1103
+ * request for the default — the way to hide a field is its Show switch;
1104
+ * - per-entry clones (`centry__`) are skipped, so a listing's cards keep
1105
+ * resolving their own tokens rather than every card naming the routed
1106
+ * entry's author;
1107
+ * - without a routed entry nothing is stamped, which leaves the besigner's
1108
+ * placeholder card visible on the canvas.
1109
+ *
1110
+ * Inputs are never mutated.
1111
+ */ export function expandCollectionEntryAuthor(nodes, entry) {
1112
+ if (!entry) return nodes;
1113
+ const containers = Object.entries(nodes).filter(([id, node])=>(node == null ? void 0 : node.componentId) === COLLECTION_ENTRY_AUTHOR_COMPONENT_ID && !id.startsWith(COLLECTION_ENTRIES_NODE_ID_PREFIX));
1114
+ if (!containers.length) return nodes;
1115
+ const next = _extends({}, nodes);
1116
+ for (const [containerId, container] of containers){
1117
+ var _container_props;
1118
+ const filled = entryAuthorFill(container, entry);
1119
+ if (!Object.keys(filled).length) continue;
1120
+ next[containerId] = _extends({}, container, {
1121
+ props: _extends({}, (_container_props = container.props) != null ? _container_props : {}, filled)
1122
+ });
1123
+ }
1124
+ return next;
1125
+ }
1126
+ /**
1127
+ * The values ONE Entry Author node takes from ONE entry (AGL-2486) — the
1128
+ * companion to {@link entryMetaFill}, extracted for the same reason: a card
1129
+ * inside a listing is filled from the entry that card is for.
1130
+ */ function entryAuthorFill(container, entry) {
1131
+ var _container_props;
1132
+ const values = collectionEntryAuthorValues(entry);
1133
+ const props = (_container_props = container.props) != null ? _container_props : {};
1134
+ const filled = {};
1135
+ for (const key of [
1136
+ 'name',
1137
+ 'bio',
1138
+ 'image',
1139
+ 'url',
1140
+ 'pageUrl'
1141
+ ]){
1142
+ var _props_key;
1143
+ if (String((_props_key = props[key]) != null ? _props_key : '').trim()) continue;
1144
+ if (!values[key]) continue;
1145
+ filled[key] = values[key];
1146
+ }
1147
+ // `links` is not authorable as text — a row carries a platform or a picked
1148
+ // icon, and the console's author editor is where those are chosen — so
1149
+ // there is no authored value to defer to. The record's rows are the only
1150
+ // ones there are; `Show links` is the template's control over them.
1151
+ if (values.links.length) filled['links'] = values.links;
1152
+ return filled;
1153
+ }
1154
+ /** The one binding a chosen date format may replace (AGL-1459). */ const ENTRY_DATE_BINDING = '{{entry.date}}';
1155
+ /**
1156
+ * Is this authored value the `{{entry.date}}` binding under a chosen format
1157
+ * (AGL-1459)? Anything else — a literal string, another token, the default
1158
+ * format — answers no, and the authored value stands.
1159
+ */ function reformattableEntryDate(key, authored, dateFormat) {
1160
+ return key === 'date' && authored === ENTRY_DATE_BINDING && dateFormat !== COLLECTION_ENTRY_DATE_FORMAT_DEFAULT;
1161
+ }
1162
+ /**
1163
+ * The ONE matcher configuration behind every entry search in the product
1164
+ * (AGL-1516/AGL-1525) — the block's toolbar box, its suggestion panel, and
1165
+ * the site-wide results page the panel links to.
1166
+ *
1167
+ * Shared rather than copied because the two halves are joined by a link the
1168
+ * reader clicks: the panel's "View all results" hands its query to /search,
1169
+ * and if the results page matched more strictly it would answer a visible
1170
+ * suggestion with "no results". A typo the panel forgave — "platfrom" — is
1171
+ * exactly the query most likely to make that trip.
1172
+ *
1173
+ * The shape is the icon picker's (use-mdi-icons-fuzzy), tuned once for prose
1174
+ * and MEASURED before shipping: the title names the post and the excerpt
1175
+ * merely describes it, so they are weighted 0.7/0.3; the default location
1176
+ * scoring buries a legitimate mid-sentence hit in a sentence-long excerpt,
1177
+ * and the default 0.6 threshold matches "media" against every post on letter
1178
+ * soup, so location is ignored and the threshold tightened to 0.3.
1179
+ *
1180
+ * A plain object, not a Fuse instance: `libs/aglyn` is dependency-light by
1181
+ * design, and each consumer already imports Fuse from the vendor bundle.
1182
+ */ export const COLLECTION_SEARCH_FUSE_OPTIONS = {
1183
+ keys: [
1184
+ {
1185
+ name: 'title',
1186
+ weight: 0.7
1187
+ },
1188
+ {
1189
+ name: 'excerpt',
1190
+ weight: 0.3
1191
+ }
1192
+ ],
1193
+ includeScore: true,
1194
+ shouldSort: true,
1195
+ ignoreLocation: true,
1196
+ threshold: 0.3
1197
+ };
1198
+ /**
1199
+ * Related-post selection (AGL-582): other entries of the same collection
1200
+ * that share the current entry's category or at least one tag, newest
1201
+ * first. Pure so the compose stage and tests share one implementation. An
1202
+ * entry with no category and no tags relates to nothing — the caller
1203
+ * renders nothing rather than guessing.
1204
+ *
1205
+ * Two entries share a category when their stable `categoryId`s are equal
1206
+ * (survives renames AND deletions) or their RESOLVED display names match
1207
+ * case-insensitively — so a legacy free-typed entry still relates to a
1208
+ * migrated `categoryId` entry whose taxonomy name spells the same.
1209
+ */ export function selectRelatedEntries(entries, current, limit = COLLECTION_RELATED_DEFAULT_LIMIT, categories) {
1210
+ var _current_categoryId, _resolveEntryCategoryName, _current_tags;
1211
+ const categoryId = ((_current_categoryId = current.categoryId) != null ? _current_categoryId : '').trim();
1212
+ const categoryName = ((_resolveEntryCategoryName = resolveEntryCategoryName(current, categories)) != null ? _resolveEntryCategoryName : '').toLowerCase();
1213
+ const tags = ((_current_tags = current.tags) != null ? _current_tags : []).map((tag)=>tag.trim()).filter(Boolean);
1214
+ if (!categoryId && !categoryName && !tags.length) return [];
1215
+ const bounded = Math.min(Math.max(limit, 0) || COLLECTION_RELATED_DEFAULT_LIMIT, COLLECTION_RELATED_MAX);
1216
+ return entries.filter((entry)=>{
1217
+ var _entry_categoryId, _resolveEntryCategoryName;
1218
+ if (entry.$id && entry.$id === current.$id || entry.slug && entry.slug === current.slug) {
1219
+ return false;
1220
+ }
1221
+ if (categoryId && ((_entry_categoryId = entry.categoryId) != null ? _entry_categoryId : '').trim() === categoryId) {
1222
+ return true;
1223
+ }
1224
+ if (categoryName && ((_resolveEntryCategoryName = resolveEntryCategoryName(entry, categories)) != null ? _resolveEntryCategoryName : '').trim().toLowerCase() === categoryName) {
1225
+ return true;
1226
+ }
1227
+ return tags.some((tag)=>entryMatchesFilter(entry, {
1228
+ tag
1229
+ }));
1230
+ }).sort((a, b)=>{
1231
+ var _ref, _ref1;
1232
+ var _b_publishedAt, _a_publishedAt;
1233
+ return ((_ref = (_b_publishedAt = b.publishedAt) == null ? void 0 : _b_publishedAt.seconds) != null ? _ref : 0) - ((_ref1 = (_a_publishedAt = a.publishedAt) == null ? void 0 : _a_publishedAt.seconds) != null ? _ref1 : 0);
1234
+ }).slice(0, bounded);
1235
+ }
1236
+ /**
1237
+ * Related posts blocks (AGL-582): stamps each `collectionRelated` node with
1238
+ * the current entry's related posts as a serializable `entries` prop the
1239
+ * component renders directly (no template cloning — the block owns its
1240
+ * markup). Runs only on entry renders; without an entry context the nodes
1241
+ * stay untouched, so the component's sample cards (editing surfaces) or its
1242
+ * empty site render apply. Inputs are never mutated.
1243
+ */ export function expandCollectionRelated(nodes, source, currentEntry) {
1244
+ if (!source || !currentEntry) return nodes;
1245
+ const containers = Object.entries(nodes).filter(([, node])=>(node == null ? void 0 : node.componentId) === COLLECTION_RELATED_COMPONENT_ID);
1246
+ if (!containers.length) return nodes;
1247
+ const next = _extends({}, nodes);
1248
+ for (const [containerId, container] of containers){
1249
+ var _source_entries;
1250
+ var _container_props, _container_props1;
1251
+ const limitRaw = Number((_container_props = container.props) == null ? void 0 : _container_props.limit);
1252
+ // Per node, exactly as the byline reads it (AGL-1459): the format is a
1253
+ // prop, so two rails on one template can date their cards differently.
1254
+ const dateFormat = normalizeCollectionEntryDateFormat((_container_props1 = container.props) == null ? void 0 : _container_props1.dateFormat);
1255
+ const related = selectRelatedEntries((_source_entries = source.entries) != null ? _source_entries : [], currentEntry, Number.isFinite(limitRaw) && limitRaw > 0 ? limitRaw : COLLECTION_RELATED_DEFAULT_LIMIT, source.categories);
1256
+ const items = related.map((entry)=>{
1257
+ var _entry_title, _entry_slug;
1258
+ var _entry_publishedAt;
1259
+ const categoryName = resolveEntryCategoryName(entry, source.categories);
1260
+ return _extends({
1261
+ title: (_entry_title = entry.title) != null ? _entry_title : '',
1262
+ url: `/${source.slug}/${(_entry_slug = entry.slug) != null ? _entry_slug : ''}`
1263
+ }, ((_entry_publishedAt = entry.publishedAt) == null ? void 0 : _entry_publishedAt.seconds) ? {
1264
+ date: formatCollectionEntryDate(entry.publishedAt, dateFormat)
1265
+ } : {}, entry.excerpt ? {
1266
+ excerpt: entry.excerpt
1267
+ } : {}, entry.coverImage ? {
1268
+ coverImage: entry.coverImage
1269
+ } : {}, entry.coverImage && entry.coverImageAlt ? {
1270
+ coverImageAlt: entry.coverImageAlt
1271
+ } : {}, categoryName ? {
1272
+ category: categoryName
1273
+ } : {});
1274
+ });
1275
+ next[containerId] = _extends({}, container, {
1276
+ props: _extends({}, container.props, {
1277
+ entries: items
1278
+ })
1279
+ });
1280
+ }
1281
+ return next;
1282
+ }
1283
+ export default expandCollectionEntries;
1284
+
1285
+ //# sourceMappingURL=collection-entries.js.map