@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 @@
1
+ {"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/dataset-models.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\nimport { validateCustomFieldValue } from '../plugin-manager/custom-fields'\nimport { type DatasetFieldEntry, humanizeDatasetFieldId } from './datasets'\n\n/**\n * Dataset models (AGL-177): the runtime promotion of the type-level\n * blueprint in `libs/shared/data/types/src/lib/dod.ts` (kept as the\n * referenced design doc — this module is the single runtime source of\n * truth). A model lives on the dataset doc\n * (`orgs/{orgId}/datasets/{id}.model`) and drives the typed editor, import\n * and site-restore validation, and the console and `/v1` record writes\n * through the shared `validateDocument`/`coerceDocumentValues` pair so they\n * can't disagree. Form submissions and automation steps write through\n * `buildDatasetRecordValues` instead, which stores each value as text and\n * validates nothing.\n *\n * Storage conventions (Firestore-safe): timestamps as epoch millis\n * numbers, coordinates as `{ latitude, longitude }`, `sorted` as arrays,\n * `map` as plain objects, references as target-document id strings.\n */\n\n/** dod.ts `FT.Tag` vocabulary plus `reference` (AGL-180 builds on it). */\nexport type DatasetFieldType =\n | 'bool'\n | 'bytes'\n | 'timestamp'\n | 'float'\n | 'int32'\n | 'int64'\n | 'nil'\n | 'text'\n | 'coordinates'\n | 'map'\n | 'sorted'\n | 'reference'\n\nexport const DATASET_FIELD_TYPES: DatasetFieldType[] = [\n 'text',\n 'bool',\n 'int32',\n 'int64',\n 'float',\n 'timestamp',\n 'coordinates',\n 'map',\n 'sorted',\n 'bytes',\n 'nil',\n 'reference',\n]\n\n/** Display names, mirroring dod.ts `lbl`. */\nexport const DATASET_FIELD_TYPE_LABELS: Record<DatasetFieldType, string> = {\n text: 'Text',\n bool: 'Boolean',\n int32: 'Integer',\n int64: 'Big integer',\n float: 'Number',\n timestamp: 'Date & time',\n coordinates: 'Coordinates',\n map: 'Map',\n sorted: 'List',\n bytes: 'Bytes',\n nil: 'Null',\n reference: 'Reference',\n}\n\n/**\n * Plain-JSON validation vocabulary (the dod.ts `Eval` shape, extended\n * with min/max and options, serialized flat instead of enum-keyed).\n */\nexport interface DatasetFieldValidation {\n required?: boolean\n /** Source of a RegExp applied to text values. */\n regex?: string\n /** Numbers/timestamps: value bound. Text: length bound. */\n min?: number\n max?: number\n /** Enum: value must be one of these (text fields). */\n options?: string[]\n}\n\nexport interface DatasetFieldDefinition {\n /**\n * Human-facing display label only. The stable reference id is the KEY in\n * `DatasetModel.fields` (and `order`), NOT this name — bindings resolve\n * `{{item.<fieldId>}}` against that key. The default id is derived from\n * this name once at creation but is user-overridable (AGL-578); renaming\n * the label afterwards never changes the id.\n */\n name: string\n type: DatasetFieldType\n /**\n * Plugin-declared custom type riding this base type (AGL-434) — see\n * plugin-manager/custom-fields. Unknown names degrade to the base type.\n */\n customType?: string\n description?: string\n required?: boolean\n /** Default applied by editors when creating documents; never coerced. */\n default?: unknown\n validation?: DatasetFieldValidation\n /**\n * Reference fields (AGL-180): target collection + display field id.\n * `multiple` stores a `sorted` array of FKeys (small-cardinality\n * many-to-many per the dod.ts guidance); `onDelete` is the referenced-\n * document delete policy (default `setNull` — never cascade in v2).\n */\n reference?: {\n datasetId: string\n displayFieldId?: string\n multiple?: boolean\n onDelete?: 'restrict' | 'setNull'\n }\n}\n\nexport interface DatasetModel {\n fields: Record<string, DatasetFieldDefinition>\n /** Field ids in display order. */\n order: string[]\n}\n\n/**\n * Migration shim (v1 → v2): datasets created before models carry flat\n * `fields: string[]` — derive a model where every column is an optional\n * text field whose id is the column name, so the editor and AGL-103\n * bindings keep working on unmigrated docs during rollout.\n */\nexport function deriveModelFromFields(fields: string[]): DatasetModel {\n const model: DatasetModel = { fields: {}, order: [] }\n for (const name of fields) {\n // Raw snake_case ids read as titles in table headers and pickers;\n // the id stays the stable key (AGL-558).\n model.fields[name] = { name: humanizeDatasetFieldId(name), type: 'text' }\n model.order.push(name)\n }\n return model\n}\n\n/**\n * Model from quick-creator entries (AGL-558): stable slug ids with the\n * human display names preserved — \"Roast preference\" → id\n * `roast_preference`, name \"Roast preference\".\n */\nexport function modelFromFieldEntries(\n entries: readonly DatasetFieldEntry[],\n): DatasetModel {\n const model: DatasetModel = { fields: {}, order: [] }\n for (const entry of entries) {\n model.fields[entry.id] = { name: entry.name, type: 'text' }\n model.order.push(entry.id)\n }\n return model\n}\n\n/** The dataset's model, deriving one from v1 `fields` when absent. */\nexport function effectiveDatasetModel(dataset: {\n model?: DatasetModel\n fields?: string[]\n}): DatasetModel {\n if (dataset.model?.fields && dataset.model.order?.length) {\n return dataset.model\n }\n return deriveModelFromFields(dataset.fields ?? [])\n}\n\nconst isFiniteNumber = (value: unknown): value is number =>\n typeof value === 'number' && Number.isFinite(value)\n\n/**\n * Validates a document's values against a model, returning fieldId →\n * human-readable error (empty object = valid). Values are expected in\n * storage form (see the module doc); use `coerceDocumentValues` first\n * when starting from user input strings.\n */\nexport function validateDocument(\n model: DatasetModel,\n values: Record<string, unknown>,\n): Record<string, string> {\n const errors: Record<string, string> = {}\n for (const fieldId of model.order) {\n const field = model.fields[fieldId]\n if (!field) continue\n const value = values[fieldId]\n const required = field.required || field.validation?.required\n if (value == null || value === '') {\n if (required) errors[fieldId] = `${field.name} is required`\n continue\n }\n const rules = field.validation ?? {}\n switch (field.type) {\n case 'text': {\n if (typeof value !== 'string') {\n errors[fieldId] = `${field.name} must be text`\n break\n }\n if (rules.min != null && value.length < rules.min) {\n errors[fieldId] = `${field.name} must be at least ${rules.min} characters`\n } else if (rules.max != null && value.length > rules.max) {\n errors[fieldId] = `${field.name} must be at most ${rules.max} characters`\n } else if (rules.regex) {\n try {\n if (!new RegExp(rules.regex).test(value)) {\n errors[fieldId] = `${field.name} has an invalid format`\n }\n } catch {\n // Broken pattern in the model never blocks writes.\n }\n }\n if (\n !errors[fieldId] &&\n rules.options?.length &&\n !rules.options.includes(value)\n ) {\n errors[fieldId] = `${field.name} must be one of: ${rules.options.join(', ')}`\n }\n break\n }\n case 'bool':\n if (typeof value !== 'boolean') {\n errors[fieldId] = `${field.name} must be true or false`\n }\n break\n case 'int32':\n case 'int64':\n if (!isFiniteNumber(value) || !Number.isInteger(value)) {\n errors[fieldId] = `${field.name} must be a whole number`\n break\n }\n if (rules.min != null && value < rules.min) {\n errors[fieldId] = `${field.name} must be ≥ ${rules.min}`\n } else if (rules.max != null && value > rules.max) {\n errors[fieldId] = `${field.name} must be ≤ ${rules.max}`\n }\n break\n case 'float':\n case 'timestamp':\n if (!isFiniteNumber(value)) {\n errors[fieldId] =\n field.type === 'timestamp'\n ? `${field.name} must be a date`\n : `${field.name} must be a number`\n break\n }\n if (rules.min != null && value < rules.min) {\n errors[fieldId] = `${field.name} must be ≥ ${rules.min}`\n } else if (rules.max != null && value > rules.max) {\n errors[fieldId] = `${field.name} must be ≤ ${rules.max}`\n }\n break\n case 'coordinates': {\n const coordinates = value as { latitude?: unknown; longitude?: unknown }\n if (\n !isFiniteNumber(coordinates?.latitude) ||\n !isFiniteNumber(coordinates?.longitude) ||\n Math.abs(coordinates.latitude) > 90 ||\n Math.abs(coordinates.longitude) > 180\n ) {\n errors[fieldId] = `${field.name} must be valid coordinates`\n }\n break\n }\n case 'sorted':\n if (!Array.isArray(value)) {\n errors[fieldId] = `${field.name} must be a list`\n }\n break\n case 'map':\n if (typeof value !== 'object' || Array.isArray(value)) {\n errors[fieldId] = `${field.name} must be a map`\n }\n break\n case 'reference':\n if (field.reference?.multiple) {\n if (\n !Array.isArray(value) ||\n value.some((entry) => typeof entry !== 'string' || !entry)\n ) {\n errors[fieldId] = `${field.name} must reference documents`\n }\n } else if (typeof value !== 'string' || !value) {\n errors[fieldId] = `${field.name} must reference a document`\n }\n break\n case 'bytes':\n case 'nil':\n break\n }\n }\n // Custom field types (AGL-434): plugin validators run after the base\n // checks, only on fields that passed them.\n for (const fieldId of model.order) {\n const field = model.fields[fieldId]\n if (!field?.customType || errors[fieldId]) continue\n const customError = validateCustomFieldValue(\n field.customType,\n values[fieldId],\n )\n if (customError) errors[fieldId] = `${field.name}: ${customError}`\n }\n return errors\n}\n\n/** Storage value → grid display string (AGL-179). */\nexport function formatDatasetValue(\n field: DatasetFieldDefinition,\n value: unknown,\n): string {\n if (value == null || value === '') return ''\n switch (field.type) {\n case 'bool':\n return value === true ? '✓' : value === false ? '—' : String(value)\n case 'timestamp':\n return isFiniteNumber(value)\n ? new Date(value).toISOString().slice(0, 16).replace('T', ' ')\n : String(value)\n case 'coordinates': {\n const coordinates = value as { latitude?: number; longitude?: number }\n return isFiniteNumber(coordinates?.latitude) &&\n isFiniteNumber(coordinates?.longitude)\n ? `${coordinates.latitude}, ${coordinates.longitude}`\n : String(value)\n }\n case 'sorted':\n return Array.isArray(value) ? value.join(', ') : String(value)\n case 'map':\n try {\n return JSON.stringify(value)\n } catch {\n return String(value)\n }\n default:\n return String(value)\n }\n}\n\n/**\n * Storage value → form-input string (AGL-179): the inverse of\n * `coerceDocumentValues` for populating type-appropriate inputs\n * (timestamps as `datetime-local` values, coordinates as \"lat, lon\").\n */\nexport function datasetValueToInput(\n field: DatasetFieldDefinition,\n value: unknown,\n): string {\n if (value == null) return ''\n if (field.type === 'timestamp' && isFiniteNumber(value)) {\n return new Date(value).toISOString().slice(0, 16)\n }\n if (field.type === 'bool') {\n return value === true ? 'true' : value === false ? 'false' : String(value)\n }\n if (field.type === 'coordinates' || field.type === 'sorted') {\n return formatDatasetValue(field, value)\n }\n if (field.type === 'map') return formatDatasetValue(field, value)\n return String(value)\n}\n\n/**\n * Coerces user-input strings (form fields, CSV cells) into storage form\n * per the field type. Unparseable input is passed through untouched so\n * `validateDocument` reports it instead of silently mangling it.\n */\nexport function coerceDocumentValues(\n model: DatasetModel,\n input: Record<string, unknown>,\n): Record<string, unknown> {\n const values: Record<string, unknown> = {}\n for (const fieldId of model.order) {\n const field = model.fields[fieldId]\n const raw = input[fieldId]\n if (!field || raw == null || raw === '') continue\n if (typeof raw !== 'string') {\n values[fieldId] = raw\n continue\n }\n switch (field.type) {\n case 'bool':\n values[fieldId] =\n raw === 'true' ? true : raw === 'false' ? false : raw\n break\n case 'int32':\n case 'int64': {\n const parsed = Number(raw)\n values[fieldId] = Number.isInteger(parsed) ? parsed : raw\n break\n }\n case 'float': {\n const parsed = Number(raw)\n values[fieldId] = Number.isFinite(parsed) ? parsed : raw\n break\n }\n case 'timestamp': {\n const millis = Date.parse(raw)\n values[fieldId] = Number.isFinite(millis) ? millis : raw\n break\n }\n case 'coordinates': {\n const [latitude, longitude] = raw.split(',').map((part) => Number(part.trim()))\n values[fieldId] =\n Number.isFinite(latitude) && Number.isFinite(longitude)\n ? { latitude, longitude }\n : raw\n break\n }\n case 'sorted':\n values[fieldId] = raw\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean)\n break\n case 'map':\n try {\n values[fieldId] = JSON.parse(raw)\n } catch {\n values[fieldId] = raw\n }\n break\n case 'reference':\n values[fieldId] = field.reference?.multiple\n ? raw\n .split(',')\n .map((part) => part.trim())\n .filter(Boolean)\n : raw\n break\n default:\n values[fieldId] = raw\n }\n }\n return values\n}\n\n/**\n * Every reference id a record holds, flattened out of its `reference` fields\n * into one de-duplicated list.\n *\n * A reference field stores either a single target id or — when\n * `reference.multiple` is set — an array of them, and a model may declare\n * several. Both shapes flatten into the same list because the question asked\n * of it is never \"which field\", it is \"does this record still point at that\n * document\".\n *\n * Fields are read from `order` UNIONED with the keys of `fields`. Every other\n * pass over a model walks `order` alone, which is right for anything the user\n * sees — but a reference declared without a display slot still holds a real\n * FKey, and an integrity index that skipped it would under-report.\n */\nexport function datasetReferencedIds(\n model: DatasetModel,\n values: Record<string, unknown> | undefined,\n): string[] {\n const ids = new Set<string>()\n const fieldIds = new Set([\n ...(model.order ?? []),\n ...Object.keys(model.fields ?? {}),\n ])\n for (const fieldId of fieldIds) {\n if (model.fields?.[fieldId]?.type !== 'reference') continue\n const stored = values?.[fieldId]\n for (const entry of Array.isArray(stored) ? stored : [stored]) {\n const id = typeof entry === 'string' ? entry.trim() : ''\n if (id) ids.add(id)\n }\n }\n return [...ids]\n}\n\n/**\n * The integrity index a record write carries, so referential integrity can be\n * decided by a QUERY rather than by the rows a listener happened to fetch.\n *\n * Deleting a record has to answer \"is anything still pointing at this?\", and\n * `restrict` refuses the delete on a yes while `setNull` strips the FKey. That\n * question cannot be asked where the answer is stored: dataset fields are\n * user-defined, so `records.values` carries a deliberate index exemption in\n * `cloud/firebase-firestore.indexes.json` — auto-indexing an unbounded map\n * blows Firestore's per-document index-entry limit — and\n * `where('values.<fieldId>', '==', id)` is therefore FAILED_PRECONDITION.\n * Reading a page of records and filtering them in the browser answers only for\n * the rows in that page, which is a browse window standing in for a\n * correctness check: a reference held outside it reads as no reference at all,\n * the delete proceeds, and `restrict` silently fails to restrict.\n *\n * `referencedIds` is that same reference, denormalized to a top-level array\n * Firestore will index, so one `array-contains` reaches every record.\n *\n * ⚠️ OMITTED when a record references nothing, rather than written as `[]`.\n * `isNotEmpty` is served as `!= null` and an empty array is not null, so a\n * record stamped `[]` answers \"holds a reference\" for a dataset that holds\n * none.\n *\n * ⚠️ Spread this at EVERY write that sets a record's `values`. A write that\n * sets values without it leaves the index describing the PREVIOUS values, and\n * a stale integrity index is the exact failure it exists to prevent — with the\n * UI reporting the record as safe to delete. On a merging write use\n * `datasetIntegrityUpdate` instead: omission leaves a stale array in place\n * where clearing the last reference has to remove the field.\n */\nexport function datasetIntegrityFields(\n model: DatasetModel,\n values: Record<string, unknown> | undefined,\n): { referencedIds?: string[] } {\n const referencedIds = datasetReferencedIds(model, values)\n return referencedIds.length ? { referencedIds } : {}\n}\n\n/**\n * `datasetIntegrityFields` for a MERGING write (`update`, `set` with `merge`\n * or `mergeFields`), where leaving the field out preserves what is stored\n * rather than clearing it.\n *\n * A record whose last reference is cleared has to have the field REMOVED, or\n * it goes on answering the `array-contains` for a document it no longer points\n * at — a `restrict` that refuses a delete nothing is holding. `clear` is the\n * caller's delete sentinel: `deleteField()` in the web SDK,\n * `FieldValue.delete()` in the Admin SDK. It is passed in rather than imported\n * because this module is shared by both and must stay SDK-free.\n */\nexport function datasetIntegrityUpdate<TClear>(\n model: DatasetModel,\n values: Record<string, unknown> | undefined,\n clear: TClear,\n): { referencedIds: string[] | TClear } {\n const referencedIds = datasetReferencedIds(model, values)\n return { referencedIds: referencedIds.length ? referencedIds : clear }\n}\n"],"names":["validateCustomFieldValue","humanizeDatasetFieldId","DATASET_FIELD_TYPES","DATASET_FIELD_TYPE_LABELS","text","bool","int32","int64","float","timestamp","coordinates","map","sorted","bytes","nil","reference","deriveModelFromFields","fields","model","order","name","type","push","modelFromFieldEntries","entries","entry","id","effectiveDatasetModel","dataset","length","isFiniteNumber","value","Number","isFinite","validateDocument","values","errors","fieldId","field","required","validation","rules","min","max","regex","RegExp","test","options","includes","join","isInteger","latitude","longitude","Math","abs","Array","isArray","multiple","some","customType","customError","formatDatasetValue","String","Date","toISOString","slice","replace","JSON","stringify","datasetValueToInput","coerceDocumentValues","input","raw","parsed","millis","parse","split","part","trim","filter","Boolean","datasetReferencedIds","ids","Set","fieldIds","Object","keys","stored","add","datasetIntegrityFields","referencedIds","datasetIntegrityUpdate","clear"],"mappings":"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"}
@@ -0,0 +1,57 @@
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
+ * Dataset query layer (AGL-181): filter/sort/limit over typed documents,
19
+ * shared by the console editor and the tenant renderer's repeatable
20
+ * expansion. Deliberately evaluated IN MEMORY over the already-bounded
21
+ * reads (editor page / `REPEAT_MAX_RECORDS`) — the Firestore reality
22
+ * check from the issue: this sidesteps inequality-filter and composite-
23
+ * index constraints entirely, at the documented cost that documents
24
+ * beyond the fetch bound are never considered. The bound is explicit,
25
+ * never silently unbounded.
26
+ */
27
+ import type { DatasetModel } from './dataset-models';
28
+ export type DatasetQueryOp = '==' | '!=' | '>' | '>=' | '<' | '<=' | 'contains';
29
+ export declare const DATASET_QUERY_OPS: DatasetQueryOp[];
30
+ export interface DatasetQueryWhere {
31
+ fieldId: string;
32
+ op: DatasetQueryOp;
33
+ /** Literal, compared with type-aware coercion against stored values. */
34
+ value: string;
35
+ }
36
+ export interface DatasetQuery {
37
+ where?: DatasetQueryWhere[];
38
+ orderBy?: {
39
+ fieldId: string;
40
+ direction?: 'asc' | 'desc';
41
+ };
42
+ limit?: number;
43
+ }
44
+ /**
45
+ * Parses the authoring shorthand `field op value` (e.g. `price <= 20`,
46
+ * `tier == plus`, `tags contains red`). Null for unparseable input so
47
+ * callers fail open (no filter) rather than filtering wrongly.
48
+ */
49
+ export declare function parseDatasetFilter(input: string): DatasetQueryWhere | null;
50
+ /** Parses `field` or `field desc` into an orderBy config. */
51
+ export declare function parseDatasetSort(input: string): DatasetQuery['orderBy'] | null;
52
+ /**
53
+ * Applies where/orderBy/limit to in-memory rows. Where-clauses on fields
54
+ * absent from the model still run (stored-value comparison) so v1
55
+ * datasets work; timestamps compare numerically (epoch millis storage).
56
+ */
57
+ export declare function applyDatasetQuery<Row extends Record<string, unknown>>(model: DatasetModel | undefined, rows: Row[], query: DatasetQuery): Row[];
@@ -0,0 +1,126 @@
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
+ * Dataset query layer (AGL-181): filter/sort/limit over typed documents,
18
+ * shared by the console editor and the tenant renderer's repeatable
19
+ * expansion. Deliberately evaluated IN MEMORY over the already-bounded
20
+ * reads (editor page / `REPEAT_MAX_RECORDS`) — the Firestore reality
21
+ * check from the issue: this sidesteps inequality-filter and composite-
22
+ * index constraints entirely, at the documented cost that documents
23
+ * beyond the fetch bound are never considered. The bound is explicit,
24
+ * never silently unbounded.
25
+ */ export const DATASET_QUERY_OPS = [
26
+ '==',
27
+ '!=',
28
+ '>',
29
+ '>=',
30
+ '<',
31
+ '<=',
32
+ 'contains'
33
+ ];
34
+ /**
35
+ * Parses the authoring shorthand `field op value` (e.g. `price <= 20`,
36
+ * `tier == plus`, `tags contains red`). Null for unparseable input so
37
+ * callers fail open (no filter) rather than filtering wrongly.
38
+ */ export function parseDatasetFilter(input) {
39
+ const match = String(input != null ? input : '').trim().match(/^([A-Za-z][A-Za-z0-9_]*)\s*(==|!=|>=|<=|>|<|contains)\s+(.+)$/);
40
+ if (!match) return null;
41
+ return {
42
+ fieldId: match[1],
43
+ op: match[2],
44
+ value: match[3].trim()
45
+ };
46
+ }
47
+ /** Parses `field` or `field desc` into an orderBy config. */ export function parseDatasetSort(input) {
48
+ var _match_;
49
+ const match = String(input != null ? input : '').trim().match(/^([A-Za-z][A-Za-z0-9_]*)(?:\s+(asc|desc))?$/i);
50
+ if (!match) return null;
51
+ return {
52
+ fieldId: match[1],
53
+ direction: ((_match_ = match[2]) == null ? void 0 : _match_.toLowerCase()) === 'desc' ? 'desc' : 'asc'
54
+ };
55
+ }
56
+ const comparable = (value)=>{
57
+ if (typeof value === 'number') return value;
58
+ if (typeof value === 'boolean') return value ? 1 : 0;
59
+ if (typeof value === 'string') {
60
+ const numeric = Number(value);
61
+ return Number.isFinite(numeric) && value.trim() !== '' ? numeric : value;
62
+ }
63
+ return null;
64
+ };
65
+ function matches(stored, where) {
66
+ const { op, value } = where;
67
+ if (op === 'contains') {
68
+ if (Array.isArray(stored)) {
69
+ return stored.some((entry)=>String(entry).toLowerCase() === value.toLowerCase());
70
+ }
71
+ return String(stored != null ? stored : '').toLowerCase().includes(value.toLowerCase());
72
+ }
73
+ if (op === '==' || op === '!=') {
74
+ const equal = typeof stored === 'boolean' ? String(stored) === value.toLowerCase() : String(stored != null ? stored : '') === value;
75
+ return op === '==' ? equal : !equal;
76
+ }
77
+ const left = comparable(stored);
78
+ const right = comparable(value);
79
+ if (left == null || right == null || typeof left !== typeof right) {
80
+ return false;
81
+ }
82
+ switch(op){
83
+ case '>':
84
+ return left > right;
85
+ case '>=':
86
+ return left >= right;
87
+ case '<':
88
+ return left < right;
89
+ case '<=':
90
+ return left <= right;
91
+ }
92
+ return false;
93
+ }
94
+ /**
95
+ * Applies where/orderBy/limit to in-memory rows. Where-clauses on fields
96
+ * absent from the model still run (stored-value comparison) so v1
97
+ * datasets work; timestamps compare numerically (epoch millis storage).
98
+ */ export function applyDatasetQuery(model, rows, query) {
99
+ var _query_where;
100
+ let result = rows;
101
+ for (const where of (_query_where = query.where) != null ? _query_where : []){
102
+ result = result.filter((row)=>matches(row[where.fieldId], where));
103
+ }
104
+ if (query.orderBy) {
105
+ const { fieldId, direction } = query.orderBy;
106
+ const sign = direction === 'desc' ? -1 : 1;
107
+ result = [
108
+ ...result
109
+ ].sort((a, b)=>{
110
+ const left = comparable(a[fieldId]);
111
+ const right = comparable(b[fieldId]);
112
+ if (left == null) return 1;
113
+ if (right == null) return -1;
114
+ if (typeof left === 'number' && typeof right === 'number') {
115
+ return (left - right) * sign;
116
+ }
117
+ return String(left).localeCompare(String(right)) * sign;
118
+ });
119
+ }
120
+ if (query.limit != null && query.limit > 0) {
121
+ result = result.slice(0, query.limit);
122
+ }
123
+ return result;
124
+ }
125
+
126
+ //# sourceMappingURL=dataset-query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/dataset-query.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 * Dataset query layer (AGL-181): filter/sort/limit over typed documents,\n * shared by the console editor and the tenant renderer's repeatable\n * expansion. Deliberately evaluated IN MEMORY over the already-bounded\n * reads (editor page / `REPEAT_MAX_RECORDS`) — the Firestore reality\n * check from the issue: this sidesteps inequality-filter and composite-\n * index constraints entirely, at the documented cost that documents\n * beyond the fetch bound are never considered. The bound is explicit,\n * never silently unbounded.\n */\n\nimport type { DatasetModel } from './dataset-models'\n\nexport type DatasetQueryOp =\n | '=='\n | '!='\n | '>'\n | '>='\n | '<'\n | '<='\n | 'contains'\n\nexport const DATASET_QUERY_OPS: DatasetQueryOp[] = [\n '==',\n '!=',\n '>',\n '>=',\n '<',\n '<=',\n 'contains',\n]\n\nexport interface DatasetQueryWhere {\n fieldId: string\n op: DatasetQueryOp\n /** Literal, compared with type-aware coercion against stored values. */\n value: string\n}\n\nexport interface DatasetQuery {\n where?: DatasetQueryWhere[]\n orderBy?: { fieldId: string; direction?: 'asc' | 'desc' }\n limit?: number\n}\n\n/**\n * Parses the authoring shorthand `field op value` (e.g. `price <= 20`,\n * `tier == plus`, `tags contains red`). Null for unparseable input so\n * callers fail open (no filter) rather than filtering wrongly.\n */\nexport function parseDatasetFilter(input: string): DatasetQueryWhere | null {\n const match = String(input ?? '')\n .trim()\n .match(/^([A-Za-z][A-Za-z0-9_]*)\\s*(==|!=|>=|<=|>|<|contains)\\s+(.+)$/)\n if (!match) return null\n return {\n fieldId: match[1],\n op: match[2] as DatasetQueryOp,\n value: match[3].trim(),\n }\n}\n\n/** Parses `field` or `field desc` into an orderBy config. */\nexport function parseDatasetSort(\n input: string,\n): DatasetQuery['orderBy'] | null {\n const match = String(input ?? '')\n .trim()\n .match(/^([A-Za-z][A-Za-z0-9_]*)(?:\\s+(asc|desc))?$/i)\n if (!match) return null\n return {\n fieldId: match[1],\n direction: match[2]?.toLowerCase() === 'desc' ? 'desc' : 'asc',\n }\n}\n\nconst comparable = (value: unknown): number | string | null => {\n if (typeof value === 'number') return value\n if (typeof value === 'boolean') return value ? 1 : 0\n if (typeof value === 'string') {\n const numeric = Number(value)\n return Number.isFinite(numeric) && value.trim() !== '' ? numeric : value\n }\n return null\n}\n\nfunction matches(stored: unknown, where: DatasetQueryWhere): boolean {\n const { op, value } = where\n if (op === 'contains') {\n if (Array.isArray(stored)) {\n return stored.some(\n (entry) => String(entry).toLowerCase() === value.toLowerCase(),\n )\n }\n return String(stored ?? '')\n .toLowerCase()\n .includes(value.toLowerCase())\n }\n if (op === '==' || op === '!=') {\n const equal =\n typeof stored === 'boolean'\n ? String(stored) === value.toLowerCase()\n : String(stored ?? '') === value\n return op === '==' ? equal : !equal\n }\n const left = comparable(stored)\n const right = comparable(value)\n if (left == null || right == null || typeof left !== typeof right) {\n return false\n }\n switch (op) {\n case '>':\n return left > right\n case '>=':\n return left >= right\n case '<':\n return left < right\n case '<=':\n return left <= right\n }\n return false\n}\n\n/**\n * Applies where/orderBy/limit to in-memory rows. Where-clauses on fields\n * absent from the model still run (stored-value comparison) so v1\n * datasets work; timestamps compare numerically (epoch millis storage).\n */\nexport function applyDatasetQuery<Row extends Record<string, unknown>>(\n model: DatasetModel | undefined,\n rows: Row[],\n query: DatasetQuery,\n): Row[] {\n let result = rows\n for (const where of query.where ?? []) {\n result = result.filter((row) => matches(row[where.fieldId], where))\n }\n if (query.orderBy) {\n const { fieldId, direction } = query.orderBy\n const sign = direction === 'desc' ? -1 : 1\n result = [...result].sort((a, b) => {\n const left = comparable(a[fieldId])\n const right = comparable(b[fieldId])\n if (left == null) return 1\n if (right == null) return -1\n if (typeof left === 'number' && typeof right === 'number') {\n return (left - right) * sign\n }\n return String(left).localeCompare(String(right)) * sign\n })\n }\n if (query.limit != null && query.limit > 0) {\n result = result.slice(0, query.limit)\n }\n return result\n}\n"],"names":["DATASET_QUERY_OPS","parseDatasetFilter","input","match","String","trim","fieldId","op","value","parseDatasetSort","direction","toLowerCase","comparable","numeric","Number","isFinite","matches","stored","where","Array","isArray","some","entry","includes","equal","left","right","applyDatasetQuery","model","rows","query","result","filter","row","orderBy","sign","sort","a","b","localeCompare","limit","slice"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;CASC,GAaD,OAAO,MAAMA,oBAAsC;IACjD;IACA;IACA;IACA;IACA;IACA;IACA;CACD,CAAA;AAeD;;;;CAIC,GACD,OAAO,SAASC,mBAAmBC,KAAa;IAC9C,MAAMC,QAAQC,OAAOF,gBAAAA,QAAS,IAC3BG,IAAI,GACJF,KAAK,CAAC;IACT,IAAI,CAACA,OAAO,OAAO;IACnB,OAAO;QACLG,SAASH,KAAK,CAAC,EAAE;QACjBI,IAAIJ,KAAK,CAAC,EAAE;QACZK,OAAOL,KAAK,CAAC,EAAE,CAACE,IAAI;IACtB;AACF;AAEA,2DAA2D,GAC3D,OAAO,SAASI,iBACdP,KAAa;QAQAC;IANb,MAAMA,QAAQC,OAAOF,gBAAAA,QAAS,IAC3BG,IAAI,GACJF,KAAK,CAAC;IACT,IAAI,CAACA,OAAO,OAAO;IACnB,OAAO;QACLG,SAASH,KAAK,CAAC,EAAE;QACjBO,WAAWP,EAAAA,UAAAA,KAAK,CAAC,EAAE,qBAARA,QAAUQ,WAAW,QAAO,SAAS,SAAS;IAC3D;AACF;AAEA,MAAMC,aAAa,CAACJ;IAClB,IAAI,OAAOA,UAAU,UAAU,OAAOA;IACtC,IAAI,OAAOA,UAAU,WAAW,OAAOA,QAAQ,IAAI;IACnD,IAAI,OAAOA,UAAU,UAAU;QAC7B,MAAMK,UAAUC,OAAON;QACvB,OAAOM,OAAOC,QAAQ,CAACF,YAAYL,MAAMH,IAAI,OAAO,KAAKQ,UAAUL;IACrE;IACA,OAAO;AACT;AAEA,SAASQ,QAAQC,MAAe,EAAEC,KAAwB;IACxD,MAAM,EAAEX,EAAE,EAAEC,KAAK,EAAE,GAAGU;IACtB,IAAIX,OAAO,YAAY;QACrB,IAAIY,MAAMC,OAAO,CAACH,SAAS;YACzB,OAAOA,OAAOI,IAAI,CAChB,CAACC,QAAUlB,OAAOkB,OAAOX,WAAW,OAAOH,MAAMG,WAAW;QAEhE;QACA,OAAOP,OAAOa,iBAAAA,SAAU,IACrBN,WAAW,GACXY,QAAQ,CAACf,MAAMG,WAAW;IAC/B;IACA,IAAIJ,OAAO,QAAQA,OAAO,MAAM;QAC9B,MAAMiB,QACJ,OAAOP,WAAW,YACdb,OAAOa,YAAYT,MAAMG,WAAW,KACpCP,OAAOa,iBAAAA,SAAU,QAAQT;QAC/B,OAAOD,OAAO,OAAOiB,QAAQ,CAACA;IAChC;IACA,MAAMC,OAAOb,WAAWK;IACxB,MAAMS,QAAQd,WAAWJ;IACzB,IAAIiB,QAAQ,QAAQC,SAAS,QAAQ,OAAOD,SAAS,OAAOC,OAAO;QACjE,OAAO;IACT;IACA,OAAQnB;QACN,KAAK;YACH,OAAOkB,OAAOC;QAChB,KAAK;YACH,OAAOD,QAAQC;QACjB,KAAK;YACH,OAAOD,OAAOC;QAChB,KAAK;YACH,OAAOD,QAAQC;IACnB;IACA,OAAO;AACT;AAEA;;;;CAIC,GACD,OAAO,SAASC,kBACdC,KAA+B,EAC/BC,IAAW,EACXC,KAAmB;QAGCA;IADpB,IAAIC,SAASF;IACb,KAAK,MAAMX,UAASY,eAAAA,MAAMZ,KAAK,YAAXY,eAAe,EAAE,CAAE;QACrCC,SAASA,OAAOC,MAAM,CAAC,CAACC,MAAQjB,QAAQiB,GAAG,CAACf,MAAMZ,OAAO,CAAC,EAAEY;IAC9D;IACA,IAAIY,MAAMI,OAAO,EAAE;QACjB,MAAM,EAAE5B,OAAO,EAAEI,SAAS,EAAE,GAAGoB,MAAMI,OAAO;QAC5C,MAAMC,OAAOzB,cAAc,SAAS,CAAC,IAAI;QACzCqB,SAAS;eAAIA;SAAO,CAACK,IAAI,CAAC,CAACC,GAAGC;YAC5B,MAAMb,OAAOb,WAAWyB,CAAC,CAAC/B,QAAQ;YAClC,MAAMoB,QAAQd,WAAW0B,CAAC,CAAChC,QAAQ;YACnC,IAAImB,QAAQ,MAAM,OAAO;YACzB,IAAIC,SAAS,MAAM,OAAO,CAAC;YAC3B,IAAI,OAAOD,SAAS,YAAY,OAAOC,UAAU,UAAU;gBACzD,OAAO,AAACD,CAAAA,OAAOC,KAAI,IAAKS;YAC1B;YACA,OAAO/B,OAAOqB,MAAMc,aAAa,CAACnC,OAAOsB,UAAUS;QACrD;IACF;IACA,IAAIL,MAAMU,KAAK,IAAI,QAAQV,MAAMU,KAAK,GAAG,GAAG;QAC1CT,SAASA,OAAOU,KAAK,CAAC,GAAGX,MAAMU,KAAK;IACtC;IACA,OAAOT;AACT"}
@@ -0,0 +1,136 @@
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
+ * Datasets (AGL-102): tabular data at `orgs/{orgId}/datasets/{id}` with a
19
+ * `records` subcollection, edited in the console Data card and consumed by
20
+ * repeatable components (AGL-103) via `{{item.field}}` bindings.
21
+ */
22
+ import { type DatasetModel } from './dataset-models';
23
+ /** Dataset field name: starts with a letter; letters/digits/underscores. */
24
+ export declare const DATASET_FIELD_PATTERN: RegExp;
25
+ export interface HostDataset {
26
+ $id?: string;
27
+ displayName?: string;
28
+ /** Column names, in display order (v1; superseded by `model`). */
29
+ fields?: string[];
30
+ /** Typed model (AGL-177); when absent, derive from `fields`. */
31
+ model?: import('./dataset-models').DatasetModel;
32
+ /** dod.ts Schema.Name shape (AGL-178). */
33
+ names?: {
34
+ singular?: string;
35
+ plural?: string;
36
+ };
37
+ /**
38
+ * Which sites may see this dataset (AGL-1037). Absent = org-wide, until
39
+ * the AGL-1040 backfill stamps it. See `app-utils/scope-tokens`.
40
+ */
41
+ visibleTo?: import('../foundation').ScopeToken[];
42
+ }
43
+ export interface HostDatasetRecord {
44
+ $id?: string;
45
+ /** Field → display value. */
46
+ values?: Record<string, string>;
47
+ /** Row position in the editor and in repeated output. */
48
+ order?: number;
49
+ }
50
+ /**
51
+ * A human field entry from the quick creator: the stable id plus the
52
+ * display name shown in table headers and bindings pickers (AGL-558).
53
+ */
54
+ export interface DatasetFieldEntry {
55
+ id: string;
56
+ name: string;
57
+ }
58
+ /**
59
+ * Stable field id from a human name: "Roast preference" → "roast_preference".
60
+ * Mirrors DATASET_FIELD_PATTERN; returns '' when nothing salvageable.
61
+ */
62
+ export declare function slugifyDatasetFieldId(name: string): string;
63
+ /**
64
+ * Default reference id for a new field (AGL-578): the `slugifyDatasetFieldId`
65
+ * slug, suffixed (`_2`, `_3`, …) to stay unique within the dataset. `taken`
66
+ * holds the ids already in use (compared case-insensitively). Returns '' when
67
+ * the name yields nothing valid. The user can override the result.
68
+ */
69
+ export declare function defaultDatasetFieldId(name: string, taken: ReadonlySet<string>): string;
70
+ /**
71
+ * Validate a user-entered reference id (AGL-578): non-empty, matches
72
+ * `DATASET_FIELD_PATTERN`, and unique within the dataset (`taken` = ids already
73
+ * used, compared case-insensitively). Returns an error message, or null when
74
+ * the id is usable.
75
+ */
76
+ export declare function validateDatasetFieldId(id: string, taken: ReadonlySet<string>): string | null;
77
+ /** Display fallback for raw ids: "roast_preference" → "Roast preference". */
78
+ export declare function humanizeDatasetFieldId(id: string): string;
79
+ /**
80
+ * Parses a comma/newline separated list of HUMAN field names into
81
+ * {id, name} entries — "Roast preference" keeps its pretty name and gets
82
+ * the stable id `roast_preference` (AGL-558). Plain snake_case keys
83
+ * still work and pick up a humanized display name. Duplicate ids and
84
+ * unsalvageable entries are dropped rather than failing the set.
85
+ */
86
+ export declare function parseDatasetFieldEntries(input: string): DatasetFieldEntry[];
87
+ /**
88
+ * Parses a comma/newline separated field list into valid unique names;
89
+ * invalid entries are dropped rather than failing the whole set.
90
+ */
91
+ export declare function parseDatasetFields(input: string): string[];
92
+ /** Record values restricted to the dataset's declared fields. */
93
+ export declare function sanitizeRecordValues(fields: string[], input: Record<string, unknown> | null | undefined): Record<string, string>;
94
+ /**
95
+ * Record values for a dataset write (AGL-556). With a `fieldMap`
96
+ * (submitted key → stable model fieldId), mapped values are stored under
97
+ * the mapped fieldId — so renamed schema fields keep receiving data — and
98
+ * entries whose fieldId isn't in the model are dropped (the map is
99
+ * client-supplied and never trusted). Submitted keys without a mapping
100
+ * (and calls without a map) fall back to the legacy name-intersection
101
+ * against the model's field ids, matching `sanitizeRecordValues`.
102
+ */
103
+ export declare function buildDatasetRecordValues(dataset: {
104
+ model?: DatasetModel;
105
+ fields?: string[];
106
+ }, input: Record<string, unknown> | null | undefined, fieldMap?: Record<string, string> | null): Record<string, string>;
107
+ /**
108
+ * The name a dataset is shown under: `displayName`, which is what every create
109
+ * path writes (AGL-536), then the pre-migration `name`. Blank when the document
110
+ * carries neither.
111
+ */
112
+ export declare function datasetDisplayName(dataset: {
113
+ displayName?: unknown;
114
+ name?: unknown;
115
+ } | null | undefined): string;
116
+ /** One entry in a dataset select: stored by id, shown by name. */
117
+ export interface DatasetPickerOption {
118
+ id: string;
119
+ name: string;
120
+ }
121
+ /**
122
+ * The options a dataset select offers, sorted by the label shown.
123
+ *
124
+ * Deleted datasets are left out. Each is labeled by
125
+ * {@link datasetDisplayName}; one whose document carries no name at all is
126
+ * offered under its id, because a select that hides it leaves a dataset that
127
+ * cannot be picked.
128
+ */
129
+ export declare function datasetPickerOptions(docs: ReadonlyArray<{
130
+ $id?: string;
131
+ deletedAt?: unknown;
132
+ displayName?: unknown;
133
+ name?: unknown;
134
+ }> | null | undefined): DatasetPickerOption[];
135
+ /** Records sorted by their editor order (then id for stability). */
136
+ export declare function sortDatasetRecords<T extends HostDatasetRecord>(records: T[]): T[];
@@ -0,0 +1,177 @@
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
+ * Datasets (AGL-102): tabular data at `orgs/{orgId}/datasets/{id}` with a
18
+ * `records` subcollection, edited in the console Data card and consumed by
19
+ * repeatable components (AGL-103) via `{{item.field}}` bindings.
20
+ */ import { effectiveDatasetModel } from "./dataset-models.js";
21
+ /** Dataset field name: starts with a letter; letters/digits/underscores. */ export const DATASET_FIELD_PATTERN = /^[A-Za-z][A-Za-z0-9_]*$/;
22
+ /**
23
+ * Stable field id from a human name: "Roast preference" → "roast_preference".
24
+ * Mirrors DATASET_FIELD_PATTERN; returns '' when nothing salvageable.
25
+ */ export function slugifyDatasetFieldId(name) {
26
+ const slug = name.trim().toLowerCase().replace(/[\s-]+/g, '_').replace(/[^a-z0-9_]/g, '').replace(/^[0-9_]+/, '').replace(/_+$/, '');
27
+ return DATASET_FIELD_PATTERN.test(slug) ? slug : '';
28
+ }
29
+ /**
30
+ * Default reference id for a new field (AGL-578): the `slugifyDatasetFieldId`
31
+ * slug, suffixed (`_2`, `_3`, …) to stay unique within the dataset. `taken`
32
+ * holds the ids already in use (compared case-insensitively). Returns '' when
33
+ * the name yields nothing valid. The user can override the result.
34
+ */ export function defaultDatasetFieldId(name, taken) {
35
+ const base = slugifyDatasetFieldId(name);
36
+ if (!base) return '';
37
+ const used = new Set([
38
+ ...taken
39
+ ].map((id)=>id.toLowerCase()));
40
+ let candidate = base;
41
+ let suffix = 2;
42
+ while(used.has(candidate.toLowerCase()))candidate = `${base}_${suffix++}`;
43
+ return candidate;
44
+ }
45
+ /**
46
+ * Validate a user-entered reference id (AGL-578): non-empty, matches
47
+ * `DATASET_FIELD_PATTERN`, and unique within the dataset (`taken` = ids already
48
+ * used, compared case-insensitively). Returns an error message, or null when
49
+ * the id is usable.
50
+ */ export function validateDatasetFieldId(id, taken) {
51
+ const trimmed = id.trim();
52
+ if (!trimmed) return 'A reference ID is required';
53
+ if (!DATASET_FIELD_PATTERN.test(trimmed)) return 'Start with a letter; use only letters, numbers, and underscores';
54
+ const used = new Set([
55
+ ...taken
56
+ ].map((existing)=>existing.toLowerCase()));
57
+ if (used.has(trimmed.toLowerCase())) return 'Another field already uses this reference ID';
58
+ return null;
59
+ }
60
+ /** Display fallback for raw ids: "roast_preference" → "Roast preference". */ export function humanizeDatasetFieldId(id) {
61
+ const words = id.replace(/_/g, ' ').trim();
62
+ return words ? words.charAt(0).toUpperCase() + words.slice(1) : id;
63
+ }
64
+ /**
65
+ * Parses a comma/newline separated list of HUMAN field names into
66
+ * {id, name} entries — "Roast preference" keeps its pretty name and gets
67
+ * the stable id `roast_preference` (AGL-558). Plain snake_case keys
68
+ * still work and pick up a humanized display name. Duplicate ids and
69
+ * unsalvageable entries are dropped rather than failing the set.
70
+ */ export function parseDatasetFieldEntries(input) {
71
+ const seen = new Set();
72
+ const entries = [];
73
+ for (const raw of input.split(/[,\n]/)){
74
+ const trimmed = raw.trim();
75
+ if (!trimmed) continue;
76
+ const id = slugifyDatasetFieldId(trimmed);
77
+ if (!id || seen.has(id)) continue;
78
+ seen.add(id);
79
+ entries.push({
80
+ id,
81
+ name: DATASET_FIELD_PATTERN.test(trimmed) ? humanizeDatasetFieldId(trimmed) : trimmed
82
+ });
83
+ }
84
+ return entries;
85
+ }
86
+ /**
87
+ * Parses a comma/newline separated field list into valid unique names;
88
+ * invalid entries are dropped rather than failing the whole set.
89
+ */ export function parseDatasetFields(input) {
90
+ const seen = new Set();
91
+ const fields = [];
92
+ for (const raw of input.split(/[,\n]/)){
93
+ const name = raw.trim();
94
+ if (!DATASET_FIELD_PATTERN.test(name)) continue;
95
+ const key = name.toLowerCase();
96
+ if (seen.has(key)) continue;
97
+ seen.add(key);
98
+ fields.push(name);
99
+ }
100
+ return fields;
101
+ }
102
+ /** Record values restricted to the dataset's declared fields. */ export function sanitizeRecordValues(fields, input) {
103
+ const values = {};
104
+ for (const field of fields){
105
+ const value = input == null ? void 0 : input[field];
106
+ if (value == null) continue;
107
+ values[field] = String(value);
108
+ }
109
+ return values;
110
+ }
111
+ /**
112
+ * Record values for a dataset write (AGL-556). With a `fieldMap`
113
+ * (submitted key → stable model fieldId), mapped values are stored under
114
+ * the mapped fieldId — so renamed schema fields keep receiving data — and
115
+ * entries whose fieldId isn't in the model are dropped (the map is
116
+ * client-supplied and never trusted). Submitted keys without a mapping
117
+ * (and calls without a map) fall back to the legacy name-intersection
118
+ * against the model's field ids, matching `sanitizeRecordValues`.
119
+ */ export function buildDatasetRecordValues(dataset, input, fieldMap) {
120
+ const model = effectiveDatasetModel(dataset);
121
+ const map = fieldMap != null ? fieldMap : {};
122
+ const values = {};
123
+ for (const fieldId of model.order){
124
+ if (!model.fields[fieldId]) continue;
125
+ // A submitted key with an explicit mapping never doubles as a
126
+ // name-match — the mapping decides where it lands.
127
+ if (fieldId in map) continue;
128
+ const value = input == null ? void 0 : input[fieldId];
129
+ if (value == null) continue;
130
+ values[fieldId] = String(value);
131
+ }
132
+ for (const [submittedKey, fieldId] of Object.entries(map)){
133
+ if (typeof fieldId !== 'string' || !model.fields[fieldId]) continue;
134
+ const value = input == null ? void 0 : input[submittedKey];
135
+ if (value == null) continue;
136
+ values[fieldId] = String(value);
137
+ }
138
+ return values;
139
+ }
140
+ /**
141
+ * The name a dataset is shown under: `displayName`, which is what every create
142
+ * path writes (AGL-536), then the pre-migration `name`. Blank when the document
143
+ * carries neither.
144
+ */ export function datasetDisplayName(dataset) {
145
+ for (const candidate of [
146
+ dataset == null ? void 0 : dataset.displayName,
147
+ dataset == null ? void 0 : dataset.name
148
+ ]){
149
+ if (typeof candidate === 'string' && candidate.trim()) {
150
+ return candidate.trim();
151
+ }
152
+ }
153
+ return '';
154
+ }
155
+ /**
156
+ * The options a dataset select offers, sorted by the label shown.
157
+ *
158
+ * Deleted datasets are left out. Each is labeled by
159
+ * {@link datasetDisplayName}; one whose document carries no name at all is
160
+ * offered under its id, because a select that hides it leaves a dataset that
161
+ * cannot be picked.
162
+ */ export function datasetPickerOptions(docs) {
163
+ return (docs != null ? docs : []).filter((dataset)=>!dataset.deletedAt && dataset.$id).map((dataset)=>({
164
+ id: dataset.$id,
165
+ name: datasetDisplayName(dataset) || dataset.$id
166
+ })).sort((a, b)=>a.name.localeCompare(b.name));
167
+ }
168
+ /** Records sorted by their editor order (then id for stability). */ export function sortDatasetRecords(records) {
169
+ return [
170
+ ...records
171
+ ].sort((a, b)=>{
172
+ var _a_order, _b_order, _a_$id, _b_$id;
173
+ return ((_a_order = a.order) != null ? _a_order : Number.MAX_SAFE_INTEGER) - ((_b_order = b.order) != null ? _b_order : Number.MAX_SAFE_INTEGER) || String((_a_$id = a.$id) != null ? _a_$id : '').localeCompare(String((_b_$id = b.$id) != null ? _b_$id : ''));
174
+ });
175
+ }
176
+
177
+ //# sourceMappingURL=datasets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/datasets.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 * Datasets (AGL-102): tabular data at `orgs/{orgId}/datasets/{id}` with a\n * `records` subcollection, edited in the console Data card and consumed by\n * repeatable components (AGL-103) via `{{item.field}}` bindings.\n */\n\nimport {\n type DatasetModel,\n effectiveDatasetModel,\n} from './dataset-models'\n\n/** Dataset field name: starts with a letter; letters/digits/underscores. */\nexport const DATASET_FIELD_PATTERN = /^[A-Za-z][A-Za-z0-9_]*$/\n\nexport interface HostDataset {\n $id?: string\n displayName?: string\n /** Column names, in display order (v1; superseded by `model`). */\n fields?: string[]\n /** Typed model (AGL-177); when absent, derive from `fields`. */\n model?: import('./dataset-models').DatasetModel\n /** dod.ts Schema.Name shape (AGL-178). */\n names?: { singular?: string; plural?: string }\n /**\n * Which sites may see this dataset (AGL-1037). Absent = org-wide, until\n * the AGL-1040 backfill stamps it. See `app-utils/scope-tokens`.\n */\n visibleTo?: import('../foundation').ScopeToken[]\n}\n\nexport interface HostDatasetRecord {\n $id?: string\n /** Field → display value. */\n values?: Record<string, string>\n /** Row position in the editor and in repeated output. */\n order?: number\n}\n\n/**\n * A human field entry from the quick creator: the stable id plus the\n * display name shown in table headers and bindings pickers (AGL-558).\n */\nexport interface DatasetFieldEntry {\n id: string\n name: string\n}\n\n/**\n * Stable field id from a human name: \"Roast preference\" → \"roast_preference\".\n * Mirrors DATASET_FIELD_PATTERN; returns '' when nothing salvageable.\n */\nexport function slugifyDatasetFieldId(name: string): string {\n const slug = name\n .trim()\n .toLowerCase()\n .replace(/[\\s-]+/g, '_')\n .replace(/[^a-z0-9_]/g, '')\n .replace(/^[0-9_]+/, '')\n .replace(/_+$/, '')\n return DATASET_FIELD_PATTERN.test(slug) ? slug : ''\n}\n\n/**\n * Default reference id for a new field (AGL-578): the `slugifyDatasetFieldId`\n * slug, suffixed (`_2`, `_3`, …) to stay unique within the dataset. `taken`\n * holds the ids already in use (compared case-insensitively). Returns '' when\n * the name yields nothing valid. The user can override the result.\n */\nexport function defaultDatasetFieldId(\n name: string,\n taken: ReadonlySet<string>,\n): string {\n const base = slugifyDatasetFieldId(name)\n if (!base) return ''\n const used = new Set([...taken].map((id) => id.toLowerCase()))\n let candidate = base\n let suffix = 2\n while (used.has(candidate.toLowerCase())) candidate = `${base}_${suffix++}`\n return candidate\n}\n\n/**\n * Validate a user-entered reference id (AGL-578): non-empty, matches\n * `DATASET_FIELD_PATTERN`, and unique within the dataset (`taken` = ids already\n * used, compared case-insensitively). Returns an error message, or null when\n * the id is usable.\n */\nexport function validateDatasetFieldId(\n id: string,\n taken: ReadonlySet<string>,\n): string | null {\n const trimmed = id.trim()\n if (!trimmed) return 'A reference ID is required'\n if (!DATASET_FIELD_PATTERN.test(trimmed))\n return 'Start with a letter; use only letters, numbers, and underscores'\n const used = new Set([...taken].map((existing) => existing.toLowerCase()))\n if (used.has(trimmed.toLowerCase()))\n return 'Another field already uses this reference ID'\n return null\n}\n\n/** Display fallback for raw ids: \"roast_preference\" → \"Roast preference\". */\nexport function humanizeDatasetFieldId(id: string): string {\n const words = id.replace(/_/g, ' ').trim()\n return words ? words.charAt(0).toUpperCase() + words.slice(1) : id\n}\n\n/**\n * Parses a comma/newline separated list of HUMAN field names into\n * {id, name} entries — \"Roast preference\" keeps its pretty name and gets\n * the stable id `roast_preference` (AGL-558). Plain snake_case keys\n * still work and pick up a humanized display name. Duplicate ids and\n * unsalvageable entries are dropped rather than failing the set.\n */\nexport function parseDatasetFieldEntries(input: string): DatasetFieldEntry[] {\n const seen = new Set<string>()\n const entries: DatasetFieldEntry[] = []\n for (const raw of input.split(/[,\\n]/)) {\n const trimmed = raw.trim()\n if (!trimmed) continue\n const id = slugifyDatasetFieldId(trimmed)\n if (!id || seen.has(id)) continue\n seen.add(id)\n entries.push({\n id,\n name: DATASET_FIELD_PATTERN.test(trimmed)\n ? humanizeDatasetFieldId(trimmed)\n : trimmed,\n })\n }\n return entries\n}\n\n/**\n * Parses a comma/newline separated field list into valid unique names;\n * invalid entries are dropped rather than failing the whole set.\n */\nexport function parseDatasetFields(input: string): string[] {\n const seen = new Set<string>()\n const fields: string[] = []\n for (const raw of input.split(/[,\\n]/)) {\n const name = raw.trim()\n if (!DATASET_FIELD_PATTERN.test(name)) continue\n const key = name.toLowerCase()\n if (seen.has(key)) continue\n seen.add(key)\n fields.push(name)\n }\n return fields\n}\n\n/** Record values restricted to the dataset's declared fields. */\nexport function sanitizeRecordValues(\n fields: string[],\n input: Record<string, unknown> | null | undefined,\n): Record<string, string> {\n const values: Record<string, string> = {}\n for (const field of fields) {\n const value = input?.[field]\n if (value == null) continue\n values[field] = String(value)\n }\n return values\n}\n\n/**\n * Record values for a dataset write (AGL-556). With a `fieldMap`\n * (submitted key → stable model fieldId), mapped values are stored under\n * the mapped fieldId — so renamed schema fields keep receiving data — and\n * entries whose fieldId isn't in the model are dropped (the map is\n * client-supplied and never trusted). Submitted keys without a mapping\n * (and calls without a map) fall back to the legacy name-intersection\n * against the model's field ids, matching `sanitizeRecordValues`.\n */\nexport function buildDatasetRecordValues(\n dataset: { model?: DatasetModel; fields?: string[] },\n input: Record<string, unknown> | null | undefined,\n fieldMap?: Record<string, string> | null,\n): Record<string, string> {\n const model = effectiveDatasetModel(dataset)\n const map = fieldMap ?? {}\n const values: Record<string, string> = {}\n for (const fieldId of model.order) {\n if (!model.fields[fieldId]) continue\n // A submitted key with an explicit mapping never doubles as a\n // name-match — the mapping decides where it lands.\n if (fieldId in map) continue\n const value = input?.[fieldId]\n if (value == null) continue\n values[fieldId] = String(value)\n }\n for (const [submittedKey, fieldId] of Object.entries(map)) {\n if (typeof fieldId !== 'string' || !model.fields[fieldId]) continue\n const value = input?.[submittedKey]\n if (value == null) continue\n values[fieldId] = String(value)\n }\n return values\n}\n\n/**\n * The name a dataset is shown under: `displayName`, which is what every create\n * path writes (AGL-536), then the pre-migration `name`. Blank when the document\n * carries neither.\n */\nexport function datasetDisplayName(\n dataset: { displayName?: unknown; name?: unknown } | null | undefined,\n): string {\n for (const candidate of [dataset?.displayName, dataset?.name]) {\n if (typeof candidate === 'string' && candidate.trim()) {\n return candidate.trim()\n }\n }\n return ''\n}\n\n/** One entry in a dataset select: stored by id, shown by name. */\nexport interface DatasetPickerOption {\n id: string\n name: string\n}\n\n/**\n * The options a dataset select offers, sorted by the label shown.\n *\n * Deleted datasets are left out. Each is labeled by\n * {@link datasetDisplayName}; one whose document carries no name at all is\n * offered under its id, because a select that hides it leaves a dataset that\n * cannot be picked.\n */\nexport function datasetPickerOptions(\n docs:\n | ReadonlyArray<{\n $id?: string\n deletedAt?: unknown\n displayName?: unknown\n name?: unknown\n }>\n | null\n | undefined,\n): DatasetPickerOption[] {\n return (docs ?? [])\n .filter((dataset) => !dataset.deletedAt && dataset.$id)\n .map((dataset) => ({\n id: dataset.$id as string,\n name: datasetDisplayName(dataset) || (dataset.$id as string),\n }))\n .sort((a, b) => a.name.localeCompare(b.name))\n}\n\n/** Records sorted by their editor order (then id for stability). */\nexport function sortDatasetRecords<T extends HostDatasetRecord>(\n records: T[],\n): T[] {\n return [...records].sort(\n (a, b) =>\n (a.order ?? Number.MAX_SAFE_INTEGER) -\n (b.order ?? Number.MAX_SAFE_INTEGER) ||\n String(a.$id ?? '').localeCompare(String(b.$id ?? '')),\n )\n}\n"],"names":["effectiveDatasetModel","DATASET_FIELD_PATTERN","slugifyDatasetFieldId","name","slug","trim","toLowerCase","replace","test","defaultDatasetFieldId","taken","base","used","Set","map","id","candidate","suffix","has","validateDatasetFieldId","trimmed","existing","humanizeDatasetFieldId","words","charAt","toUpperCase","slice","parseDatasetFieldEntries","input","seen","entries","raw","split","add","push","parseDatasetFields","fields","key","sanitizeRecordValues","values","field","value","String","buildDatasetRecordValues","dataset","fieldMap","model","fieldId","order","submittedKey","Object","datasetDisplayName","displayName","datasetPickerOptions","docs","filter","deletedAt","$id","sort","a","b","localeCompare","sortDatasetRecords","records","Number","MAX_SAFE_INTEGER"],"mappings":"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"}