@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,75 @@
1
+ import { _ as _extends } from "@swc/helpers/_/_extends";
2
+ /**
3
+ * @license
4
+ * Copyright 2026 Aglyn LLC
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */ /**
18
+ * The media CDN's scope grammar and the verdict it reaches under it
19
+ * (AGL-1043), as pure functions.
20
+ *
21
+ * `serveMediaCdn` enforces them and re-exports them, so the handler remains
22
+ * the authority. They live here, in a module with no server dependency,
23
+ * because two other readers have to reach the verdict the handler reaches
24
+ * before it serves a file:
25
+ *
26
+ * - the tenant composition, which lays a placed asset's current facts over its
27
+ * node only when the page's own URL would be served
28
+ * (`libs/tenant/runtime/src/lib/get-media-asset-facts.ts`);
29
+ * - the besigner canvas and Preview, which read the same document in the
30
+ * browser so an author is shown what a visitor gets.
31
+ *
32
+ * Both reach it through `mediaAssetFactsFromDocument` in
33
+ * `media-asset-facts.ts`. A copy in either would be a second rule, free to
34
+ * disagree with the one that refuses the bytes.
35
+ *
36
+ * Out of every barrel: the handler, the composition and the editor import it
37
+ * by path, and nothing here has a reason to reach a published page's bundle.
38
+ */ import { isOrgWideScope, visibleToHost } from "./scope-tokens.js";
39
+ /** One CDN path segment: a host id, an org id, a media id or a content hash. */ export const MEDIA_CDN_SEGMENT = /^[A-Za-z0-9_-]{1,64}$/;
40
+ export function parseMediaCdnScope(scopeSegment) {
41
+ if (!scopeSegment.startsWith('org:')) {
42
+ return MEDIA_CDN_SEGMENT.test(scopeSegment) ? {
43
+ isOrg: false,
44
+ scopeId: scopeSegment
45
+ } : null;
46
+ }
47
+ const parts = scopeSegment.slice('org:'.length).split(':');
48
+ if (parts.length > 2) return null;
49
+ const [scopeId, contextHostId] = parts;
50
+ if (!MEDIA_CDN_SEGMENT.test(scopeId != null ? scopeId : '')) return null;
51
+ if (contextHostId !== undefined && !MEDIA_CDN_SEGMENT.test(contextHostId)) {
52
+ return null;
53
+ }
54
+ return _extends({
55
+ isOrg: true,
56
+ scopeId
57
+ }, contextHostId ? {
58
+ contextHostId
59
+ } : {});
60
+ }
61
+ /** Why the asset is refused under this URL; `null` when it is not. */ export function mediaCdnScopeRefusal(scope, visibleTo) {
62
+ // Host-library assets are private by construction and carry no
63
+ // `visibleTo`, so only the org branch is scoped at all.
64
+ if (!scope.isOrg) return null;
65
+ if (!Array.isArray(visibleTo)) return 'unscoped';
66
+ if (!visibleTo.length) return 'no-sites';
67
+ const scoped = visibleTo;
68
+ const allowed = scope.contextHostId ? visibleToHost(scoped, scope.contextHostId) : isOrgWideScope(scoped);
69
+ return allowed ? null : 'restricted';
70
+ }
71
+ /** Whether the asset may be served under this URL. */ export function mediaCdnAllows(scope, visibleTo) {
72
+ return mediaCdnScopeRefusal(scope, visibleTo) === null;
73
+ }
74
+
75
+ //# sourceMappingURL=media-cdn-scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/media-cdn-scope.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The media CDN's scope grammar and the verdict it reaches under it\n * (AGL-1043), as pure functions.\n *\n * `serveMediaCdn` enforces them and re-exports them, so the handler remains\n * the authority. They live here, in a module with no server dependency,\n * because two other readers have to reach the verdict the handler reaches\n * before it serves a file:\n *\n * - the tenant composition, which lays a placed asset's current facts over its\n * node only when the page's own URL would be served\n * (`libs/tenant/runtime/src/lib/get-media-asset-facts.ts`);\n * - the besigner canvas and Preview, which read the same document in the\n * browser so an author is shown what a visitor gets.\n *\n * Both reach it through `mediaAssetFactsFromDocument` in\n * `media-asset-facts.ts`. A copy in either would be a second rule, free to\n * disagree with the one that refuses the bytes.\n *\n * Out of every barrel: the handler, the composition and the editor import it\n * by path, and nothing here has a reason to reach a published page's bundle.\n */\n\nimport { isOrgWideScope, visibleToHost } from './scope-tokens'\n\n/** One CDN path segment: a host id, an org id, a media id or a content hash. */\nexport const MEDIA_CDN_SEGMENT = /^[A-Za-z0-9_-]{1,64}$/\n\n/**\n * The parsed CDN scope segment (AGL-1043). Shapes:\n *\n * - `{hostId}` — that host's own library\n * - `org:{orgId}` — the org library, ORG-WIDE assets only\n * - `org:{orgId}:{hostId}` — an org asset in one site's context\n *\n * The host is in the URL rather than sniffed from the `Host` header on\n * purpose. A header is the requester's CHOICE: anyone holding a restricted\n * asset's id could fetch it through a domain that IS permitted and get the\n * bytes, so header-based enforcement stops accidents while looking like a\n * boundary. Here the decision is a pure function of (URL, doc), and since\n * the cache key IS the URL, one host's answer can never reach another.\n */\nexport interface MediaCdnScope {\n isOrg: boolean\n scopeId: string\n /** Only on the `org:{orgId}:{hostId}` form. */\n contextHostId?: string\n}\n\nexport function parseMediaCdnScope(\n scopeSegment: string,\n): MediaCdnScope | null {\n if (!scopeSegment.startsWith('org:')) {\n return MEDIA_CDN_SEGMENT.test(scopeSegment)\n ? { isOrg: false, scopeId: scopeSegment }\n : null\n }\n const parts = scopeSegment.slice('org:'.length).split(':')\n if (parts.length > 2) return null\n const [scopeId, contextHostId] = parts\n if (!MEDIA_CDN_SEGMENT.test(scopeId ?? '')) return null\n if (contextHostId !== undefined && !MEDIA_CDN_SEGMENT.test(contextHostId)) {\n return null\n }\n return {\n isOrg: true,\n scopeId,\n ...(contextHostId ? { contextHostId } : {}),\n }\n}\n\n/**\n * The three ways an org asset can be refused under a CDN URL.\n *\n * They are one 404 on the wire — whether a restricted asset exists is not\n * something an anonymous caller has standing to learn — and three different\n * faults to whoever is looking at the broken page:\n *\n * - `restricted` — the asset carries a scope and this URL is not in it. The\n * URL is what is wrong: a restricted asset has to be requested through the\n * form that names the site (`hostQualifiedCdnPath`), and the same asset\n * serves normally from the site it is shared with.\n * - `unscoped` — no `visibleTo` at all, so the asset is undeliverable under\n * EVERY URL form there is. The document is what is wrong, and it means a\n * creation path wrote it without a scope: `newResourceScopeFields` is what\n * stops that at compile time, and the scope backfill is what repairs the\n * documents already written (`docs/SCOPE_DRIFT.md`).\n * - `no-sites` — a stored empty array: somebody chose nobody. Equally\n * undeliverable, and NOT repairable by the backfill, which leaves an empty\n * array alone rather than widening a resource nobody asked to widen — so\n * this one needs a person either way.\n */\nexport type MediaCdnScopeRefusal = 'restricted' | 'unscoped' | 'no-sites'\n\n/** Why the asset is refused under this URL; `null` when it is not. */\nexport function mediaCdnScopeRefusal(\n scope: MediaCdnScope,\n visibleTo: unknown,\n): MediaCdnScopeRefusal | null {\n // Host-library assets are private by construction and carry no\n // `visibleTo`, so only the org branch is scoped at all.\n if (!scope.isOrg) return null\n if (!Array.isArray(visibleTo)) return 'unscoped'\n if (!visibleTo.length) return 'no-sites'\n const scoped = visibleTo as string[]\n const allowed = scope.contextHostId\n ? visibleToHost(scoped, scope.contextHostId)\n : isOrgWideScope(scoped)\n return allowed ? null : 'restricted'\n}\n\n/** Whether the asset may be served under this URL. */\nexport function mediaCdnAllows(\n scope: MediaCdnScope,\n visibleTo: unknown,\n): boolean {\n return mediaCdnScopeRefusal(scope, visibleTo) === null\n}\n"],"names":["isOrgWideScope","visibleToHost","MEDIA_CDN_SEGMENT","parseMediaCdnScope","scopeSegment","startsWith","test","isOrg","scopeId","parts","slice","length","split","contextHostId","undefined","mediaCdnScopeRefusal","scope","visibleTo","Array","isArray","scoped","allowed","mediaCdnAllows"],"mappings":";AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;CAqBC,GAED,SAASA,cAAc,EAAEC,aAAa,QAAQ,oBAAgB;AAE9D,8EAA8E,GAC9E,OAAO,MAAMC,oBAAoB,wBAAuB;AAuBxD,OAAO,SAASC,mBACdC,YAAoB;IAEpB,IAAI,CAACA,aAAaC,UAAU,CAAC,SAAS;QACpC,OAAOH,kBAAkBI,IAAI,CAACF,gBAC1B;YAAEG,OAAO;YAAOC,SAASJ;QAAa,IACtC;IACN;IACA,MAAMK,QAAQL,aAAaM,KAAK,CAAC,OAAOC,MAAM,EAAEC,KAAK,CAAC;IACtD,IAAIH,MAAME,MAAM,GAAG,GAAG,OAAO;IAC7B,MAAM,CAACH,SAASK,cAAc,GAAGJ;IACjC,IAAI,CAACP,kBAAkBI,IAAI,CAACE,kBAAAA,UAAW,KAAK,OAAO;IACnD,IAAIK,kBAAkBC,aAAa,CAACZ,kBAAkBI,IAAI,CAACO,gBAAgB;QACzE,OAAO;IACT;IACA,OAAO;QACLN,OAAO;QACPC;OACIK,gBAAgB;QAAEA;IAAc,IAAI,CAAC;AAE7C;AAyBA,oEAAoE,GACpE,OAAO,SAASE,qBACdC,KAAoB,EACpBC,SAAkB;IAElB,+DAA+D;IAC/D,wDAAwD;IACxD,IAAI,CAACD,MAAMT,KAAK,EAAE,OAAO;IACzB,IAAI,CAACW,MAAMC,OAAO,CAACF,YAAY,OAAO;IACtC,IAAI,CAACA,UAAUN,MAAM,EAAE,OAAO;IAC9B,MAAMS,SAASH;IACf,MAAMI,UAAUL,MAAMH,aAAa,GAC/BZ,cAAcmB,QAAQJ,MAAMH,aAAa,IACzCb,eAAeoB;IACnB,OAAOC,UAAU,OAAO;AAC1B;AAEA,oDAAoD,GACpD,OAAO,SAASC,eACdN,KAAoB,EACpBC,SAAkB;IAElB,OAAOF,qBAAqBC,OAAOC,eAAe;AACpD"}
@@ -0,0 +1,161 @@
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
+ */
17
+ /**
18
+ * Media folder hierarchy (AGL-171): first-class folders at
19
+ * `hosts/{hostId}/mediaFolders/{folderId}` replacing the AGL-124 free-text
20
+ * `folder` string on media docs. Console UI and any future API share these
21
+ * helpers so depth/cycle/name rules can't disagree.
22
+ *
23
+ * Delete policy (documented per the issue): deleting a folder re-parents
24
+ * its child folders and assets to the deleted folder's parent — nothing is
25
+ * ever orphaned and no delete is blocked.
26
+ */
27
+ import type { ScopeToken } from './scope-tokens';
28
+ export interface AglynMediaFolder {
29
+ name: string;
30
+ /** Parent folder id; null/undefined = root. */
31
+ parentId?: string | null;
32
+ /** Sibling sort position. */
33
+ order?: number;
34
+ }
35
+ export interface NewMediaFolderInput {
36
+ name: string;
37
+ parentId: string | null;
38
+ /**
39
+ * `serverTimestamp()` from whichever SDK the caller holds — this module
40
+ * stays free of both the client and admin Firestore packages.
41
+ */
42
+ createdAt: unknown;
43
+ /**
44
+ * Who may see the folder (AGL-1037). **Required**, with no default: the
45
+ * whole of AGL-1466 was two call sites that each built the document
46
+ * inline and each forgot the field, so the type is what stops a third.
47
+ *
48
+ * `null` means a SITE library — `hosts/{hostId}/mediaFolders` is private
49
+ * by construction and stores no scope, the same rule the site-export
50
+ * import path follows and the reason `scopedToHost` refuses a host ref.
51
+ */
52
+ visibleTo: readonly ScopeToken[] | null;
53
+ }
54
+ /**
55
+ * The document a media folder is created with (AGL-1466).
56
+ *
57
+ * Every `mediaFolders` create goes through here. Before it, the console
58
+ * wrote `{ name, parentId, createdAt }` from the NEW FOLDER button and from
59
+ * the legacy-string migration, so a folder in an ORG library landed with no
60
+ * `visibleTo` — and both enforcement layers fail closed on a missing field
61
+ * (`array-contains-any` matches nothing, the rules' `hasAny` errors). The
62
+ * result was a library that looked right on the org page and collapsed into
63
+ * "No folder" the moment it was opened for a site, because the folders were
64
+ * gone and only their files remained.
65
+ */
66
+ export declare function newMediaFolderDoc(input: NewMediaFolderInput): Record<string, unknown>;
67
+ /** What separates the segments of a folder path in a picker row. */
68
+ export declare const MEDIA_FOLDER_PATH_SEPARATOR = " / ";
69
+ /** One row of a folder picker (AGL-1470). */
70
+ export interface MediaFolderChoice {
71
+ $id: string;
72
+ /** The folder's own name, for a caller that indents instead. */
73
+ name: string;
74
+ /** Ancestors then self: `['Blog', 'Covers']`. */
75
+ path: string[];
76
+ /** `Blog / Covers` — what a picker row must show. */
77
+ label: string;
78
+ /** 0 for a root folder; an indent level. */
79
+ depth: number;
80
+ }
81
+ /**
82
+ * The folder list a PICKER may show (AGL-1470).
83
+ *
84
+ * A picker that shows bare names is not merely terse. Duplicate names across
85
+ * parents are normal — `Covers`, `Images`, `Archive`, `2026` — and with
86
+ * `Blog/Covers` and `Press/Covers` both present, MOVE TO FOLDER… drew two
87
+ * rows reading exactly `Covers`. Choosing the wrong one is **silent**: a move
88
+ * is copy-then-delete, so the object is rewritten under a different prefix,
89
+ * and because every reference to it is by id, nothing breaks. No error, no
90
+ * missing image — the file is simply filed where nobody will look for it, and
91
+ * the mistake is undetectable from the site.
92
+ *
93
+ * So the label carries the whole path, and the order is the sidebar's:
94
+ * depth-first, each child directly under its parent, siblings by `order` then
95
+ * name. The rail computed that hierarchy correctly the whole time; the
96
+ * pickers beside it threw it away.
97
+ *
98
+ * Two robustness rules, both chosen to keep a destination REACHABLE rather
99
+ * than tidy:
100
+ *
101
+ * - **A folder whose parent is missing is kept, at the root.** A scoped
102
+ * collaborator's read set can admit a child and refuse its parent
103
+ * (AGL-1466), and dropping the child would remove a real destination from
104
+ * the menu — a worse failure than an unindented row.
105
+ * - **A cycle terminates.** This runs on every render of an open picker.
106
+ */
107
+ export declare function mediaFolderChoices(folders: ReadonlyArray<AglynMediaFolder & {
108
+ $id: string;
109
+ }>): MediaFolderChoice[];
110
+ /** Nesting cap, enforced in UI and validation (root children = depth 1). */
111
+ export declare const MEDIA_FOLDER_MAX_DEPTH = 5;
112
+ export declare const MEDIA_FOLDER_NAME_MAX_LENGTH = 60;
113
+ /**
114
+ * Trims and collapses whitespace; null when empty or over the length cap
115
+ * so callers reject rather than store junk.
116
+ */
117
+ export declare function normalizeFolderName(input: string): string | null;
118
+ /**
119
+ * Depth of a folder (root children = 1). Broken parent links and cycles
120
+ * both terminate: unknown parents count as root, and a revisited id stops
121
+ * the walk (treated as max depth so validation refuses to make it worse).
122
+ */
123
+ export declare function folderDepth(folderId: string, foldersById: Record<string, AglynMediaFolder>): number;
124
+ /**
125
+ * True when re-parenting `folderId` under `newParentId` would create a
126
+ * cycle — i.e. the new parent is the folder itself or one of its
127
+ * descendants (the parent chain from `newParentId` reaches `folderId`).
128
+ */
129
+ export declare function wouldCreateCycle(folderId: string, newParentId: string | null | undefined, foldersById: Record<string, AglynMediaFolder>): boolean;
130
+ /**
131
+ * Case-insensitive sibling-name uniqueness per parent. `excludeId` skips
132
+ * the folder being renamed/moved itself.
133
+ */
134
+ export declare function isSiblingNameTaken(name: string, parentId: string | null | undefined, folders: Array<AglynMediaFolder & {
135
+ $id: string;
136
+ }>, excludeId?: string): boolean;
137
+ export interface LegacyFolderMigrationPlan {
138
+ /** Root-level folder names that must be created (deduped, ordered). */
139
+ foldersToCreate: string[];
140
+ /**
141
+ * Media doc id → legacy folder name (lower-cased key match against
142
+ * created/existing root folders happens at execution time).
143
+ */
144
+ assignments: Array<{
145
+ mediaId: string;
146
+ folderName: string;
147
+ }>;
148
+ }
149
+ /**
150
+ * Migration plan from flat AGL-124 `folder` strings: one root folder per
151
+ * distinct legacy string (case-insensitive; existing root folders with a
152
+ * matching name are reused, not duplicated), and a `folderId` stamp for
153
+ * every media doc that still carries a legacy string but no `folderId`.
154
+ */
155
+ export declare function planLegacyFolderMigration(mediaDocs: Array<{
156
+ $id: string;
157
+ folder?: string;
158
+ folderId?: string | null;
159
+ }>, existingFolders: Array<AglynMediaFolder & {
160
+ $id: string;
161
+ }>): LegacyFolderMigrationPlan;
@@ -0,0 +1,230 @@
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
+ */ /**
17
+ * Media folder hierarchy (AGL-171): first-class folders at
18
+ * `hosts/{hostId}/mediaFolders/{folderId}` replacing the AGL-124 free-text
19
+ * `folder` string on media docs. Console UI and any future API share these
20
+ * helpers so depth/cycle/name rules can't disagree.
21
+ *
22
+ * Delete policy (documented per the issue): deleting a folder re-parents
23
+ * its child folders and assets to the deleted folder's parent — nothing is
24
+ * ever orphaned and no delete is blocked.
25
+ */ import { _ as _extends } from "@swc/helpers/_/_extends";
26
+ /**
27
+ * The document a media folder is created with (AGL-1466).
28
+ *
29
+ * Every `mediaFolders` create goes through here. Before it, the console
30
+ * wrote `{ name, parentId, createdAt }` from the NEW FOLDER button and from
31
+ * the legacy-string migration, so a folder in an ORG library landed with no
32
+ * `visibleTo` — and both enforcement layers fail closed on a missing field
33
+ * (`array-contains-any` matches nothing, the rules' `hasAny` errors). The
34
+ * result was a library that looked right on the org page and collapsed into
35
+ * "No folder" the moment it was opened for a site, because the folders were
36
+ * gone and only their files remained.
37
+ */ export function newMediaFolderDoc(input) {
38
+ const { name, parentId, createdAt, visibleTo } = input;
39
+ // An EMPTY array is the one value that must never be stored. Unlike a
40
+ // missing field it is a written "visible to nobody" — the backfill leaves
41
+ // it alone by design and no read path treats it as legacy — so it is
42
+ // permanent rather than repairable. Getting here means a caller computed
43
+ // a scope and came back with nothing, which is a bug worth a stack trace
44
+ // rather than a folder nobody will ever see again.
45
+ if (visibleTo && !visibleTo.length) {
46
+ throw new Error('A media folder cannot be created with an empty scope');
47
+ }
48
+ return _extends({
49
+ name,
50
+ parentId,
51
+ createdAt
52
+ }, visibleTo ? {
53
+ visibleTo: [
54
+ ...visibleTo
55
+ ]
56
+ } : {});
57
+ }
58
+ /** What separates the segments of a folder path in a picker row. */ export const MEDIA_FOLDER_PATH_SEPARATOR = ' / ';
59
+ /**
60
+ * The folder list a PICKER may show (AGL-1470).
61
+ *
62
+ * A picker that shows bare names is not merely terse. Duplicate names across
63
+ * parents are normal — `Covers`, `Images`, `Archive`, `2026` — and with
64
+ * `Blog/Covers` and `Press/Covers` both present, MOVE TO FOLDER… drew two
65
+ * rows reading exactly `Covers`. Choosing the wrong one is **silent**: a move
66
+ * is copy-then-delete, so the object is rewritten under a different prefix,
67
+ * and because every reference to it is by id, nothing breaks. No error, no
68
+ * missing image — the file is simply filed where nobody will look for it, and
69
+ * the mistake is undetectable from the site.
70
+ *
71
+ * So the label carries the whole path, and the order is the sidebar's:
72
+ * depth-first, each child directly under its parent, siblings by `order` then
73
+ * name. The rail computed that hierarchy correctly the whole time; the
74
+ * pickers beside it threw it away.
75
+ *
76
+ * Two robustness rules, both chosen to keep a destination REACHABLE rather
77
+ * than tidy:
78
+ *
79
+ * - **A folder whose parent is missing is kept, at the root.** A scoped
80
+ * collaborator's read set can admit a child and refuse its parent
81
+ * (AGL-1466), and dropping the child would remove a real destination from
82
+ * the menu — a worse failure than an unindented row.
83
+ * - **A cycle terminates.** This runs on every render of an open picker.
84
+ */ export function mediaFolderChoices(folders) {
85
+ const byId = new Map(folders.map((folder)=>[
86
+ folder.$id,
87
+ folder
88
+ ]));
89
+ /** True when the parent link leads somewhere real and does not loop back. */ const hasUsableParent = (folder)=>{
90
+ var _folder_parentId;
91
+ const seen = new Set([
92
+ folder.$id
93
+ ]);
94
+ let cursor = (_folder_parentId = folder.parentId) != null ? _folder_parentId : null;
95
+ while(cursor){
96
+ var _parent_parentId;
97
+ if (seen.has(cursor)) return false;
98
+ const parent = byId.get(cursor);
99
+ if (!parent) return false;
100
+ seen.add(cursor);
101
+ cursor = (_parent_parentId = parent.parentId) != null ? _parent_parentId : null;
102
+ }
103
+ return Boolean(folder.parentId);
104
+ };
105
+ const childrenOf = new Map();
106
+ for (const folder of folders){
107
+ var _childrenOf_get;
108
+ // Same normalisation the rail applies: anything without a resolvable
109
+ // parent chain is drawn as a root rather than dropped.
110
+ const parent = hasUsableParent(folder) ? folder.parentId : null;
111
+ childrenOf.set(parent, [
112
+ ...(_childrenOf_get = childrenOf.get(parent)) != null ? _childrenOf_get : [],
113
+ folder
114
+ ]);
115
+ }
116
+ for (const siblings of childrenOf.values()){
117
+ siblings.sort((a, b)=>{
118
+ var _a_order, _b_order;
119
+ return ((_a_order = a.order) != null ? _a_order : 0) - ((_b_order = b.order) != null ? _b_order : 0) || String(a.name).localeCompare(String(b.name));
120
+ });
121
+ }
122
+ const choices = [];
123
+ const walk = (parentId, path)=>{
124
+ var _childrenOf_get;
125
+ for (const folder of (_childrenOf_get = childrenOf.get(parentId)) != null ? _childrenOf_get : []){
126
+ const nextPath = [
127
+ ...path,
128
+ folder.name
129
+ ];
130
+ choices.push({
131
+ $id: folder.$id,
132
+ name: folder.name,
133
+ path: nextPath,
134
+ label: nextPath.join(MEDIA_FOLDER_PATH_SEPARATOR),
135
+ depth: nextPath.length - 1
136
+ });
137
+ walk(folder.$id, nextPath);
138
+ }
139
+ };
140
+ walk(null, []);
141
+ return choices;
142
+ }
143
+ /** Nesting cap, enforced in UI and validation (root children = depth 1). */ export const MEDIA_FOLDER_MAX_DEPTH = 5;
144
+ export const MEDIA_FOLDER_NAME_MAX_LENGTH = 60;
145
+ /**
146
+ * Trims and collapses whitespace; null when empty or over the length cap
147
+ * so callers reject rather than store junk.
148
+ */ export function normalizeFolderName(input) {
149
+ const name = String(input != null ? input : '').replace(/\s+/g, ' ').trim();
150
+ if (!name || name.length > MEDIA_FOLDER_NAME_MAX_LENGTH) return null;
151
+ return name;
152
+ }
153
+ /**
154
+ * Depth of a folder (root children = 1). Broken parent links and cycles
155
+ * both terminate: unknown parents count as root, and a revisited id stops
156
+ * the walk (treated as max depth so validation refuses to make it worse).
157
+ */ export function folderDepth(folderId, foldersById) {
158
+ let depth = 0;
159
+ const seen = new Set();
160
+ let current = folderId;
161
+ while(current && foldersById[current]){
162
+ if (seen.has(current)) return MEDIA_FOLDER_MAX_DEPTH;
163
+ seen.add(current);
164
+ depth += 1;
165
+ current = foldersById[current].parentId;
166
+ }
167
+ return depth;
168
+ }
169
+ /**
170
+ * True when re-parenting `folderId` under `newParentId` would create a
171
+ * cycle — i.e. the new parent is the folder itself or one of its
172
+ * descendants (the parent chain from `newParentId` reaches `folderId`).
173
+ */ export function wouldCreateCycle(folderId, newParentId, foldersById) {
174
+ const seen = new Set();
175
+ let current = newParentId;
176
+ while(current){
177
+ var _foldersById_current;
178
+ if (current === folderId) return true;
179
+ if (seen.has(current)) return true;
180
+ seen.add(current);
181
+ current = (_foldersById_current = foldersById[current]) == null ? void 0 : _foldersById_current.parentId;
182
+ }
183
+ return false;
184
+ }
185
+ /**
186
+ * Case-insensitive sibling-name uniqueness per parent. `excludeId` skips
187
+ * the folder being renamed/moved itself.
188
+ */ export function isSiblingNameTaken(name, parentId, folders, excludeId) {
189
+ const target = name.trim().toLowerCase();
190
+ const parent = parentId != null ? parentId : null;
191
+ return folders.some((folder)=>{
192
+ var _folder_parentId;
193
+ return folder.$id !== excludeId && ((_folder_parentId = folder.parentId) != null ? _folder_parentId : null) === parent && folder.name.trim().toLowerCase() === target;
194
+ });
195
+ }
196
+ /**
197
+ * Migration plan from flat AGL-124 `folder` strings: one root folder per
198
+ * distinct legacy string (case-insensitive; existing root folders with a
199
+ * matching name are reused, not duplicated), and a `folderId` stamp for
200
+ * every media doc that still carries a legacy string but no `folderId`.
201
+ */ export function planLegacyFolderMigration(mediaDocs, existingFolders) {
202
+ const existingRootNames = new Set(existingFolders.filter((folder)=>{
203
+ var _folder_parentId;
204
+ return ((_folder_parentId = folder.parentId) != null ? _folder_parentId : null) === null;
205
+ }).map((folder)=>folder.name.trim().toLowerCase()));
206
+ const toCreate = new Map();
207
+ const assignments = [];
208
+ for (const media of mediaDocs){
209
+ var _media_folder;
210
+ if (media.folderId) continue;
211
+ const name = normalizeFolderName((_media_folder = media.folder) != null ? _media_folder : '');
212
+ if (!name) continue;
213
+ const key = name.toLowerCase();
214
+ if (!existingRootNames.has(key) && !toCreate.has(key)) {
215
+ toCreate.set(key, name);
216
+ }
217
+ assignments.push({
218
+ mediaId: media.$id,
219
+ folderName: name
220
+ });
221
+ }
222
+ return {
223
+ foldersToCreate: [
224
+ ...toCreate.values()
225
+ ].sort(),
226
+ assignments
227
+ };
228
+ }
229
+
230
+ //# sourceMappingURL=media-folders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/media-folders.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Media folder hierarchy (AGL-171): first-class folders at\n * `hosts/{hostId}/mediaFolders/{folderId}` replacing the AGL-124 free-text\n * `folder` string on media docs. Console UI and any future API share these\n * helpers so depth/cycle/name rules can't disagree.\n *\n * Delete policy (documented per the issue): deleting a folder re-parents\n * its child folders and assets to the deleted folder's parent — nothing is\n * ever orphaned and no delete is blocked.\n */\n\nimport type { ScopeToken } from './scope-tokens'\n\nexport interface AglynMediaFolder {\n name: string\n /** Parent folder id; null/undefined = root. */\n parentId?: string | null\n /** Sibling sort position. */\n order?: number\n}\n\nexport interface NewMediaFolderInput {\n name: string\n parentId: string | null\n /**\n * `serverTimestamp()` from whichever SDK the caller holds — this module\n * stays free of both the client and admin Firestore packages.\n */\n createdAt: unknown\n /**\n * Who may see the folder (AGL-1037). **Required**, with no default: the\n * whole of AGL-1466 was two call sites that each built the document\n * inline and each forgot the field, so the type is what stops a third.\n *\n * `null` means a SITE library — `hosts/{hostId}/mediaFolders` is private\n * by construction and stores no scope, the same rule the site-export\n * import path follows and the reason `scopedToHost` refuses a host ref.\n */\n visibleTo: readonly ScopeToken[] | null\n}\n\n/**\n * The document a media folder is created with (AGL-1466).\n *\n * Every `mediaFolders` create goes through here. Before it, the console\n * wrote `{ name, parentId, createdAt }` from the NEW FOLDER button and from\n * the legacy-string migration, so a folder in an ORG library landed with no\n * `visibleTo` — and both enforcement layers fail closed on a missing field\n * (`array-contains-any` matches nothing, the rules' `hasAny` errors). The\n * result was a library that looked right on the org page and collapsed into\n * \"No folder\" the moment it was opened for a site, because the folders were\n * gone and only their files remained.\n */\nexport function newMediaFolderDoc(\n input: NewMediaFolderInput,\n): Record<string, unknown> {\n const { name, parentId, createdAt, visibleTo } = input\n // An EMPTY array is the one value that must never be stored. Unlike a\n // missing field it is a written \"visible to nobody\" — the backfill leaves\n // it alone by design and no read path treats it as legacy — so it is\n // permanent rather than repairable. Getting here means a caller computed\n // a scope and came back with nothing, which is a bug worth a stack trace\n // rather than a folder nobody will ever see again.\n if (visibleTo && !visibleTo.length) {\n throw new Error('A media folder cannot be created with an empty scope')\n }\n return {\n name,\n parentId,\n createdAt,\n ...(visibleTo ? { visibleTo: [...visibleTo] } : {}),\n }\n}\n\n/** What separates the segments of a folder path in a picker row. */\nexport const MEDIA_FOLDER_PATH_SEPARATOR = ' / '\n\n/** One row of a folder picker (AGL-1470). */\nexport interface MediaFolderChoice {\n $id: string\n /** The folder's own name, for a caller that indents instead. */\n name: string\n /** Ancestors then self: `['Blog', 'Covers']`. */\n path: string[]\n /** `Blog / Covers` — what a picker row must show. */\n label: string\n /** 0 for a root folder; an indent level. */\n depth: number\n}\n\n/**\n * The folder list a PICKER may show (AGL-1470).\n *\n * A picker that shows bare names is not merely terse. Duplicate names across\n * parents are normal — `Covers`, `Images`, `Archive`, `2026` — and with\n * `Blog/Covers` and `Press/Covers` both present, MOVE TO FOLDER… drew two\n * rows reading exactly `Covers`. Choosing the wrong one is **silent**: a move\n * is copy-then-delete, so the object is rewritten under a different prefix,\n * and because every reference to it is by id, nothing breaks. No error, no\n * missing image — the file is simply filed where nobody will look for it, and\n * the mistake is undetectable from the site.\n *\n * So the label carries the whole path, and the order is the sidebar's:\n * depth-first, each child directly under its parent, siblings by `order` then\n * name. The rail computed that hierarchy correctly the whole time; the\n * pickers beside it threw it away.\n *\n * Two robustness rules, both chosen to keep a destination REACHABLE rather\n * than tidy:\n *\n * - **A folder whose parent is missing is kept, at the root.** A scoped\n * collaborator's read set can admit a child and refuse its parent\n * (AGL-1466), and dropping the child would remove a real destination from\n * the menu — a worse failure than an unindented row.\n * - **A cycle terminates.** This runs on every render of an open picker.\n */\nexport function mediaFolderChoices(\n folders: ReadonlyArray<AglynMediaFolder & { $id: string }>,\n): MediaFolderChoice[] {\n const byId = new Map(folders.map((folder) => [folder.$id, folder]))\n /** True when the parent link leads somewhere real and does not loop back. */\n const hasUsableParent = (folder: AglynMediaFolder & { $id: string }) => {\n const seen = new Set<string>([folder.$id])\n let cursor = folder.parentId ?? null\n while (cursor) {\n if (seen.has(cursor)) return false\n const parent = byId.get(cursor)\n if (!parent) return false\n seen.add(cursor)\n cursor = parent.parentId ?? null\n }\n return Boolean(folder.parentId)\n }\n const childrenOf = new Map<string | null, Array<AglynMediaFolder & { $id: string }>>()\n for (const folder of folders) {\n // Same normalisation the rail applies: anything without a resolvable\n // parent chain is drawn as a root rather than dropped.\n const parent = hasUsableParent(folder) ? (folder.parentId as string) : null\n childrenOf.set(parent, [...(childrenOf.get(parent) ?? []), folder])\n }\n for (const siblings of childrenOf.values()) {\n siblings.sort(\n (a, b) =>\n (a.order ?? 0) - (b.order ?? 0) ||\n String(a.name).localeCompare(String(b.name)),\n )\n }\n const choices: MediaFolderChoice[] = []\n const walk = (parentId: string | null, path: string[]) => {\n for (const folder of childrenOf.get(parentId) ?? []) {\n const nextPath = [...path, folder.name]\n choices.push({\n $id: folder.$id,\n name: folder.name,\n path: nextPath,\n label: nextPath.join(MEDIA_FOLDER_PATH_SEPARATOR),\n depth: nextPath.length - 1,\n })\n walk(folder.$id, nextPath)\n }\n }\n walk(null, [])\n return choices\n}\n\n/** Nesting cap, enforced in UI and validation (root children = depth 1). */\nexport const MEDIA_FOLDER_MAX_DEPTH = 5\n\nexport const MEDIA_FOLDER_NAME_MAX_LENGTH = 60\n\n/**\n * Trims and collapses whitespace; null when empty or over the length cap\n * so callers reject rather than store junk.\n */\nexport function normalizeFolderName(input: string): string | null {\n const name = String(input ?? '')\n .replace(/\\s+/g, ' ')\n .trim()\n if (!name || name.length > MEDIA_FOLDER_NAME_MAX_LENGTH) return null\n return name\n}\n\n/**\n * Depth of a folder (root children = 1). Broken parent links and cycles\n * both terminate: unknown parents count as root, and a revisited id stops\n * the walk (treated as max depth so validation refuses to make it worse).\n */\nexport function folderDepth(\n folderId: string,\n foldersById: Record<string, AglynMediaFolder>,\n): number {\n let depth = 0\n const seen = new Set<string>()\n let current: string | null | undefined = folderId\n while (current && foldersById[current]) {\n if (seen.has(current)) return MEDIA_FOLDER_MAX_DEPTH\n seen.add(current)\n depth += 1\n current = foldersById[current].parentId\n }\n return depth\n}\n\n/**\n * True when re-parenting `folderId` under `newParentId` would create a\n * cycle — i.e. the new parent is the folder itself or one of its\n * descendants (the parent chain from `newParentId` reaches `folderId`).\n */\nexport function wouldCreateCycle(\n folderId: string,\n newParentId: string | null | undefined,\n foldersById: Record<string, AglynMediaFolder>,\n): boolean {\n const seen = new Set<string>()\n let current: string | null | undefined = newParentId\n while (current) {\n if (current === folderId) return true\n if (seen.has(current)) return true\n seen.add(current)\n current = foldersById[current]?.parentId\n }\n return false\n}\n\n/**\n * Case-insensitive sibling-name uniqueness per parent. `excludeId` skips\n * the folder being renamed/moved itself.\n */\nexport function isSiblingNameTaken(\n name: string,\n parentId: string | null | undefined,\n folders: Array<AglynMediaFolder & { $id: string }>,\n excludeId?: string,\n): boolean {\n const target = name.trim().toLowerCase()\n const parent = parentId ?? null\n return folders.some(\n (folder) =>\n folder.$id !== excludeId &&\n (folder.parentId ?? null) === parent &&\n folder.name.trim().toLowerCase() === target,\n )\n}\n\nexport interface LegacyFolderMigrationPlan {\n /** Root-level folder names that must be created (deduped, ordered). */\n foldersToCreate: string[]\n /**\n * Media doc id → legacy folder name (lower-cased key match against\n * created/existing root folders happens at execution time).\n */\n assignments: Array<{ mediaId: string; folderName: string }>\n}\n\n/**\n * Migration plan from flat AGL-124 `folder` strings: one root folder per\n * distinct legacy string (case-insensitive; existing root folders with a\n * matching name are reused, not duplicated), and a `folderId` stamp for\n * every media doc that still carries a legacy string but no `folderId`.\n */\nexport function planLegacyFolderMigration(\n mediaDocs: Array<{ $id: string; folder?: string; folderId?: string | null }>,\n existingFolders: Array<AglynMediaFolder & { $id: string }>,\n): LegacyFolderMigrationPlan {\n const existingRootNames = new Set(\n existingFolders\n .filter((folder) => (folder.parentId ?? null) === null)\n .map((folder) => folder.name.trim().toLowerCase()),\n )\n const toCreate = new Map<string, string>()\n const assignments: LegacyFolderMigrationPlan['assignments'] = []\n for (const media of mediaDocs) {\n if (media.folderId) continue\n const name = normalizeFolderName(media.folder ?? '')\n if (!name) continue\n const key = name.toLowerCase()\n if (!existingRootNames.has(key) && !toCreate.has(key)) {\n toCreate.set(key, name)\n }\n assignments.push({ mediaId: media.$id, folderName: name })\n }\n return {\n foldersToCreate: [...toCreate.values()].sort(),\n assignments,\n }\n}\n"],"names":["newMediaFolderDoc","input","name","parentId","createdAt","visibleTo","length","Error","MEDIA_FOLDER_PATH_SEPARATOR","mediaFolderChoices","folders","byId","Map","map","folder","$id","hasUsableParent","seen","Set","cursor","parent","has","get","add","Boolean","childrenOf","set","siblings","values","sort","a","b","order","String","localeCompare","choices","walk","path","nextPath","push","label","join","depth","MEDIA_FOLDER_MAX_DEPTH","MEDIA_FOLDER_NAME_MAX_LENGTH","normalizeFolderName","replace","trim","folderDepth","folderId","foldersById","current","wouldCreateCycle","newParentId","isSiblingNameTaken","excludeId","target","toLowerCase","some","planLegacyFolderMigration","mediaDocs","existingFolders","existingRootNames","filter","toCreate","assignments","media","key","mediaId","folderName","foldersToCreate"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;CASC;AAgCD;;;;;;;;;;;CAWC,GACD,OAAO,SAASA,kBACdC,KAA0B;IAE1B,MAAM,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,SAAS,EAAEC,SAAS,EAAE,GAAGJ;IACjD,sEAAsE;IACtE,0EAA0E;IAC1E,qEAAqE;IACrE,yEAAyE;IACzE,yEAAyE;IACzE,mDAAmD;IACnD,IAAII,aAAa,CAACA,UAAUC,MAAM,EAAE;QAClC,MAAM,IAAIC,MAAM;IAClB;IACA,OAAO;QACLL;QACAC;QACAC;OACIC,YAAY;QAAEA,WAAW;eAAIA;SAAU;IAAC,IAAI,CAAC;AAErD;AAEA,kEAAkE,GAClE,OAAO,MAAMG,8BAA8B,MAAK;AAehD;;;;;;;;;;;;;;;;;;;;;;;;;CAyBC,GACD,OAAO,SAASC,mBACdC,OAA0D;IAE1D,MAAMC,OAAO,IAAIC,IAAIF,QAAQG,GAAG,CAAC,CAACC,SAAW;YAACA,OAAOC,GAAG;YAAED;SAAO;IACjE,2EAA2E,GAC3E,MAAME,kBAAkB,CAACF;YAEVA;QADb,MAAMG,OAAO,IAAIC,IAAY;YAACJ,OAAOC,GAAG;SAAC;QACzC,IAAII,UAASL,mBAAAA,OAAOX,QAAQ,YAAfW,mBAAmB;QAChC,MAAOK,OAAQ;gBAKJC;YAJT,IAAIH,KAAKI,GAAG,CAACF,SAAS,OAAO;YAC7B,MAAMC,SAAST,KAAKW,GAAG,CAACH;YACxB,IAAI,CAACC,QAAQ,OAAO;YACpBH,KAAKM,GAAG,CAACJ;YACTA,UAASC,mBAAAA,OAAOjB,QAAQ,YAAfiB,mBAAmB;QAC9B;QACA,OAAOI,QAAQV,OAAOX,QAAQ;IAChC;IACA,MAAMsB,aAAa,IAAIb;IACvB,KAAK,MAAME,UAAUJ,QAAS;YAIAe;QAH5B,qEAAqE;QACrE,uDAAuD;QACvD,MAAML,SAASJ,gBAAgBF,UAAWA,OAAOX,QAAQ,GAAc;QACvEsB,WAAWC,GAAG,CAACN,QAAQ;gBAAKK,kBAAAA,WAAWH,GAAG,CAACF,mBAAfK,kBAA0B,EAAE;YAAGX;SAAO;IACpE;IACA,KAAK,MAAMa,YAAYF,WAAWG,MAAM,GAAI;QAC1CD,SAASE,IAAI,CACX,CAACC,GAAGC;gBACDD,UAAiBC;mBAAlB,EAACD,WAAAA,EAAEE,KAAK,YAAPF,WAAW,OAAMC,WAAAA,EAAEC,KAAK,YAAPD,WAAW,MAC7BE,OAAOH,EAAE5B,IAAI,EAAEgC,aAAa,CAACD,OAAOF,EAAE7B,IAAI;;IAEhD;IACA,MAAMiC,UAA+B,EAAE;IACvC,MAAMC,OAAO,CAACjC,UAAyBkC;YAChBZ;QAArB,KAAK,MAAMX,WAAUW,kBAAAA,WAAWH,GAAG,CAACnB,qBAAfsB,kBAA4B,EAAE,CAAE;YACnD,MAAMa,WAAW;mBAAID;gBAAMvB,OAAOZ,IAAI;aAAC;YACvCiC,QAAQI,IAAI,CAAC;gBACXxB,KAAKD,OAAOC,GAAG;gBACfb,MAAMY,OAAOZ,IAAI;gBACjBmC,MAAMC;gBACNE,OAAOF,SAASG,IAAI,CAACjC;gBACrBkC,OAAOJ,SAAShC,MAAM,GAAG;YAC3B;YACA8B,KAAKtB,OAAOC,GAAG,EAAEuB;QACnB;IACF;IACAF,KAAK,MAAM,EAAE;IACb,OAAOD;AACT;AAEA,0EAA0E,GAC1E,OAAO,MAAMQ,yBAAyB,EAAC;AAEvC,OAAO,MAAMC,+BAA+B,GAAE;AAE9C;;;CAGC,GACD,OAAO,SAASC,oBAAoB5C,KAAa;IAC/C,MAAMC,OAAO+B,OAAOhC,gBAAAA,QAAS,IAC1B6C,OAAO,CAAC,QAAQ,KAChBC,IAAI;IACP,IAAI,CAAC7C,QAAQA,KAAKI,MAAM,GAAGsC,8BAA8B,OAAO;IAChE,OAAO1C;AACT;AAEA;;;;CAIC,GACD,OAAO,SAAS8C,YACdC,QAAgB,EAChBC,WAA6C;IAE7C,IAAIR,QAAQ;IACZ,MAAMzB,OAAO,IAAIC;IACjB,IAAIiC,UAAqCF;IACzC,MAAOE,WAAWD,WAAW,CAACC,QAAQ,CAAE;QACtC,IAAIlC,KAAKI,GAAG,CAAC8B,UAAU,OAAOR;QAC9B1B,KAAKM,GAAG,CAAC4B;QACTT,SAAS;QACTS,UAAUD,WAAW,CAACC,QAAQ,CAAChD,QAAQ;IACzC;IACA,OAAOuC;AACT;AAEA;;;;CAIC,GACD,OAAO,SAASU,iBACdH,QAAgB,EAChBI,WAAsC,EACtCH,WAA6C;IAE7C,MAAMjC,OAAO,IAAIC;IACjB,IAAIiC,UAAqCE;IACzC,MAAOF,QAAS;YAIJD;QAHV,IAAIC,YAAYF,UAAU,OAAO;QACjC,IAAIhC,KAAKI,GAAG,CAAC8B,UAAU,OAAO;QAC9BlC,KAAKM,GAAG,CAAC4B;QACTA,WAAUD,uBAAAA,WAAW,CAACC,QAAQ,qBAApBD,qBAAsB/C,QAAQ;IAC1C;IACA,OAAO;AACT;AAEA;;;CAGC,GACD,OAAO,SAASmD,mBACdpD,IAAY,EACZC,QAAmC,EACnCO,OAAkD,EAClD6C,SAAkB;IAElB,MAAMC,SAAStD,KAAK6C,IAAI,GAAGU,WAAW;IACtC,MAAMrC,SAASjB,mBAAAA,WAAY;IAC3B,OAAOO,QAAQgD,IAAI,CACjB,CAAC5C;YAEEA;eADDA,OAAOC,GAAG,KAAKwC,aACf,EAACzC,mBAAAA,OAAOX,QAAQ,YAAfW,mBAAmB,UAAUM,UAC9BN,OAAOZ,IAAI,CAAC6C,IAAI,GAAGU,WAAW,OAAOD;;AAE3C;AAYA;;;;;CAKC,GACD,OAAO,SAASG,0BACdC,SAA4E,EAC5EC,eAA0D;IAE1D,MAAMC,oBAAoB,IAAI5C,IAC5B2C,gBACGE,MAAM,CAAC,CAACjD;YAAYA;eAAD,EAACA,mBAAAA,OAAOX,QAAQ,YAAfW,mBAAmB,UAAU;OACjDD,GAAG,CAAC,CAACC,SAAWA,OAAOZ,IAAI,CAAC6C,IAAI,GAAGU,WAAW;IAEnD,MAAMO,WAAW,IAAIpD;IACrB,MAAMqD,cAAwD,EAAE;IAChE,KAAK,MAAMC,SAASN,UAAW;YAEIM;QADjC,IAAIA,MAAMjB,QAAQ,EAAE;QACpB,MAAM/C,OAAO2C,qBAAoBqB,gBAAAA,MAAMpD,MAAM,YAAZoD,gBAAgB;QACjD,IAAI,CAAChE,MAAM;QACX,MAAMiE,MAAMjE,KAAKuD,WAAW;QAC5B,IAAI,CAACK,kBAAkBzC,GAAG,CAAC8C,QAAQ,CAACH,SAAS3C,GAAG,CAAC8C,MAAM;YACrDH,SAAStC,GAAG,CAACyC,KAAKjE;QACpB;QACA+D,YAAY1B,IAAI,CAAC;YAAE6B,SAASF,MAAMnD,GAAG;YAAEsD,YAAYnE;QAAK;IAC1D;IACA,OAAO;QACLoE,iBAAiB;eAAIN,SAASpC,MAAM;SAAG,CAACC,IAAI;QAC5CoC;IACF;AACF"}