@aglyn/aglyn 1.0.0-beta.221 → 1.0.0-beta.222

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 (346) hide show
  1. package/package.json +15 -11
  2. package/src/lib/app-utils/agent-openapi.js +1 -1
  3. package/src/lib/app-utils/agent-openapi.js.map +1 -1
  4. package/src/lib/app-utils/analytics-events.d.ts +3 -2
  5. package/src/lib/app-utils/analytics-events.js +3 -2
  6. package/src/lib/app-utils/analytics-events.js.map +1 -1
  7. package/src/lib/app-utils/api-plugins.d.ts +30 -0
  8. package/src/lib/app-utils/api-plugins.js +24 -1
  9. package/src/lib/app-utils/api-plugins.js.map +1 -1
  10. package/src/lib/app-utils/author-html.d.ts +1 -1
  11. package/src/lib/app-utils/author-html.js.map +1 -1
  12. package/src/lib/app-utils/bandwidth-cap.d.ts +12 -1
  13. package/src/lib/app-utils/bandwidth-cap.js +17 -1
  14. package/src/lib/app-utils/bandwidth-cap.js.map +1 -1
  15. package/src/lib/app-utils/compose-reusable-components.d.ts +19 -0
  16. package/src/lib/app-utils/compose-reusable-components.js +116 -26
  17. package/src/lib/app-utils/compose-reusable-components.js.map +1 -1
  18. package/src/lib/app-utils/console-routes.d.ts +4 -0
  19. package/src/lib/app-utils/console-routes.js +3 -0
  20. package/src/lib/app-utils/console-routes.js.map +1 -1
  21. package/src/lib/app-utils/contacts.d.ts +71 -0
  22. package/src/lib/app-utils/contacts.js +55 -0
  23. package/src/lib/app-utils/contacts.js.map +1 -1
  24. package/src/lib/app-utils/contexts.d.ts +1 -0
  25. package/src/lib/app-utils/contexts.js +1 -0
  26. package/src/lib/app-utils/contexts.js.map +1 -1
  27. package/src/lib/app-utils/crm-email-templates.js +21 -4
  28. package/src/lib/app-utils/crm-email-templates.js.map +1 -1
  29. package/src/lib/app-utils/crm-kinds.d.ts +2 -0
  30. package/src/lib/app-utils/crm-kinds.js +1 -0
  31. package/src/lib/app-utils/crm-kinds.js.map +1 -1
  32. package/src/lib/app-utils/crm.d.ts +1199 -67
  33. package/src/lib/app-utils/crm.js +1951 -310
  34. package/src/lib/app-utils/crm.js.map +1 -1
  35. package/src/lib/app-utils/csv-import.d.ts +10 -38
  36. package/src/lib/app-utils/csv-import.js +17 -42
  37. package/src/lib/app-utils/csv-import.js.map +1 -1
  38. package/src/lib/app-utils/csv.d.ts +32 -11
  39. package/src/lib/app-utils/csv.js +43 -5
  40. package/src/lib/app-utils/csv.js.map +1 -1
  41. package/src/lib/app-utils/default-site.d.ts +116 -0
  42. package/src/lib/app-utils/default-site.js +1024 -0
  43. package/src/lib/app-utils/default-site.js.map +1 -0
  44. package/src/lib/app-utils/docs-help.generated.d.ts +22 -22
  45. package/src/lib/app-utils/docs-help.generated.js +44 -10
  46. package/src/lib/app-utils/docs-help.generated.js.map +1 -1
  47. package/src/lib/app-utils/docs-index.generated.js +738 -150
  48. package/src/lib/app-utils/docs-index.generated.js.map +1 -1
  49. package/src/lib/app-utils/draft-placeholders.d.ts +76 -0
  50. package/src/lib/app-utils/draft-placeholders.js +115 -0
  51. package/src/lib/app-utils/draft-placeholders.js.map +1 -0
  52. package/src/lib/app-utils/entity-picker-context.d.ts +19 -15
  53. package/src/lib/app-utils/entity-picker-context.js +4 -4
  54. package/src/lib/app-utils/entity-picker-context.js.map +1 -1
  55. package/src/lib/app-utils/expand-repeatables.d.ts +66 -10
  56. package/src/lib/app-utils/expand-repeatables.js +88 -14
  57. package/src/lib/app-utils/expand-repeatables.js.map +1 -1
  58. package/src/lib/app-utils/forms.d.ts +33 -22
  59. package/src/lib/app-utils/forms.js +47 -28
  60. package/src/lib/app-utils/forms.js.map +1 -1
  61. package/src/lib/app-utils/full-use-cost.d.ts +277 -0
  62. package/src/lib/app-utils/full-use-cost.js +421 -0
  63. package/src/lib/app-utils/full-use-cost.js.map +1 -0
  64. package/src/lib/app-utils/health-report.js +11 -0
  65. package/src/lib/app-utils/health-report.js.map +1 -1
  66. package/src/lib/app-utils/llms-txt.d.ts +20 -0
  67. package/src/lib/app-utils/llms-txt.js +7 -1
  68. package/src/lib/app-utils/llms-txt.js.map +1 -1
  69. package/src/lib/app-utils/media-asset-facts.d.ts +16 -1
  70. package/src/lib/app-utils/media-asset-facts.js +40 -13
  71. package/src/lib/app-utils/media-asset-facts.js.map +1 -1
  72. package/src/lib/app-utils/media-bandwidth.d.ts +52 -0
  73. package/src/lib/app-utils/media-bandwidth.js +94 -0
  74. package/src/lib/app-utils/media-bandwidth.js.map +1 -0
  75. package/src/lib/app-utils/media-ref.d.ts +241 -33
  76. package/src/lib/app-utils/media-ref.js +324 -43
  77. package/src/lib/app-utils/media-ref.js.map +1 -1
  78. package/src/lib/app-utils/media-src.d.ts +8 -8
  79. package/src/lib/app-utils/media-src.js +27 -11
  80. package/src/lib/app-utils/media-src.js.map +1 -1
  81. package/src/lib/app-utils/media-takedown-reach.d.ts +4 -1
  82. package/src/lib/app-utils/media-takedown-reach.js +6 -3
  83. package/src/lib/app-utils/media-takedown-reach.js.map +1 -1
  84. package/src/lib/app-utils/notifications.d.ts +1 -1
  85. package/src/lib/app-utils/notifications.js +2 -0
  86. package/src/lib/app-utils/notifications.js.map +1 -1
  87. package/src/lib/app-utils/organizations.d.ts +51 -2
  88. package/src/lib/app-utils/organizations.js +56 -3
  89. package/src/lib/app-utils/organizations.js.map +1 -1
  90. package/src/lib/app-utils/page-record-sources.d.ts +87 -0
  91. package/src/lib/app-utils/page-record-sources.js +53 -0
  92. package/src/lib/app-utils/page-record-sources.js.map +1 -0
  93. package/src/lib/app-utils/paid-media-source.d.ts +3 -7
  94. package/src/lib/app-utils/paid-media-source.js +5 -19
  95. package/src/lib/app-utils/paid-media-source.js.map +1 -1
  96. package/src/lib/app-utils/person-erasure.d.ts +5 -2
  97. package/src/lib/app-utils/person-erasure.js.map +1 -1
  98. package/src/lib/app-utils/picklists.d.ts +187 -0
  99. package/src/lib/app-utils/picklists.js +320 -0
  100. package/src/lib/app-utils/picklists.js.map +1 -0
  101. package/src/lib/app-utils/plan-entitlements.d.ts +220 -50
  102. package/src/lib/app-utils/plan-entitlements.js +309 -115
  103. package/src/lib/app-utils/plan-entitlements.js.map +1 -1
  104. package/src/lib/app-utils/realm-host-surface.generated.js +2 -0
  105. package/src/lib/app-utils/realm-host-surface.generated.js.map +1 -1
  106. package/src/lib/app-utils/release-flags.d.ts +1 -1
  107. package/src/lib/app-utils/release-flags.js +11 -0
  108. package/src/lib/app-utils/release-flags.js.map +1 -1
  109. package/src/lib/app-utils/rendered-widths.d.ts +121 -0
  110. package/src/lib/app-utils/rendered-widths.js +211 -0
  111. package/src/lib/app-utils/rendered-widths.js.map +1 -0
  112. package/src/lib/app-utils/repeat-sources.d.ts +2 -1
  113. package/src/lib/app-utils/repeat-sources.js.map +1 -1
  114. package/src/lib/app-utils/screen-route.d.ts +154 -36
  115. package/src/lib/app-utils/screen-route.js +185 -40
  116. package/src/lib/app-utils/screen-route.js.map +1 -1
  117. package/src/lib/app-utils/seo-audit.d.ts +11 -1
  118. package/src/lib/app-utils/seo-audit.js +33 -13
  119. package/src/lib/app-utils/seo-audit.js.map +1 -1
  120. package/src/lib/app-utils/seo-keywords.d.ts +11 -0
  121. package/src/lib/app-utils/seo-keywords.js +19 -5
  122. package/src/lib/app-utils/seo-keywords.js.map +1 -1
  123. package/src/lib/app-utils/seo-page-facts.d.ts +47 -4
  124. package/src/lib/app-utils/seo-page-facts.js +136 -31
  125. package/src/lib/app-utils/seo-page-facts.js.map +1 -1
  126. package/src/lib/app-utils/seo-site-scan.d.ts +42 -4
  127. package/src/lib/app-utils/seo-site-scan.js +113 -12
  128. package/src/lib/app-utils/seo-site-scan.js.map +1 -1
  129. package/src/lib/app-utils/server.d.ts +5 -4
  130. package/src/lib/app-utils/server.js +14 -5
  131. package/src/lib/app-utils/server.js.map +1 -1
  132. package/src/lib/app-utils/site-icon-set.d.ts +195 -0
  133. package/src/lib/app-utils/site-icon-set.js +351 -0
  134. package/src/lib/app-utils/site-icon-set.js.map +1 -0
  135. package/src/lib/app-utils/site-interactions.d.ts +101 -4
  136. package/src/lib/app-utils/site-interactions.js +120 -4
  137. package/src/lib/app-utils/site-interactions.js.map +1 -1
  138. package/src/lib/app-utils/starter-template-nodes.d.ts +7 -0
  139. package/src/lib/app-utils/starter-template-nodes.js +3 -0
  140. package/src/lib/app-utils/starter-template-nodes.js.map +1 -1
  141. package/src/lib/app-utils/starter-templates.d.ts +5 -19
  142. package/src/lib/app-utils/starter-templates.js +5 -49
  143. package/src/lib/app-utils/starter-templates.js.map +1 -1
  144. package/src/lib/app-utils/transfer-launcher-context.d.ts +136 -0
  145. package/src/lib/app-utils/transfer-launcher-context.js +23 -0
  146. package/src/lib/app-utils/transfer-launcher-context.js.map +1 -0
  147. package/src/lib/app-utils/transfer-resume-import.d.ts +39 -0
  148. package/src/lib/app-utils/transfer-resume-import.js +128 -0
  149. package/src/lib/app-utils/transfer-resume-import.js.map +1 -0
  150. package/src/lib/app-utils/upgrade-proposal.d.ts +66 -0
  151. package/src/lib/app-utils/upgrade-proposal.js +95 -0
  152. package/src/lib/app-utils/upgrade-proposal.js.map +1 -0
  153. package/src/lib/app-utils/utc-month.d.ts +33 -0
  154. package/src/lib/app-utils/utc-month.js +35 -0
  155. package/src/lib/app-utils/utc-month.js.map +1 -0
  156. package/src/lib/app-utils/visitor-record-ceiling.d.ts +4 -4
  157. package/src/lib/app-utils/visitor-record-ceiling.js +4 -4
  158. package/src/lib/app-utils/visitor-record-ceiling.js.map +1 -1
  159. package/src/lib/app-utils/wire-nodes.d.ts +39 -19
  160. package/src/lib/app-utils/wire-nodes.js +120 -34
  161. package/src/lib/app-utils/wire-nodes.js.map +1 -1
  162. package/src/lib/data-transfer/access.d.ts +74 -0
  163. package/src/lib/data-transfer/access.js +93 -0
  164. package/src/lib/data-transfer/access.js.map +1 -0
  165. package/src/lib/data-transfer/derive.d.ts +246 -0
  166. package/src/lib/data-transfer/derive.js +1007 -0
  167. package/src/lib/data-transfer/derive.js.map +1 -0
  168. package/src/lib/data-transfer/export-file.d.ts +46 -0
  169. package/src/lib/data-transfer/export-file.js +146 -0
  170. package/src/lib/data-transfer/export-file.js.map +1 -0
  171. package/src/lib/data-transfer/field-catalog.d.ts +134 -0
  172. package/src/lib/data-transfer/field-catalog.js +278 -0
  173. package/src/lib/data-transfer/field-catalog.js.map +1 -0
  174. package/src/lib/data-transfer/header-match.d.ts +129 -0
  175. package/src/lib/data-transfer/header-match.js +367 -0
  176. package/src/lib/data-transfer/header-match.js.map +1 -0
  177. package/src/lib/data-transfer/index.d.ts +34 -0
  178. package/src/lib/data-transfer/index.js +40 -0
  179. package/src/lib/data-transfer/index.js.map +1 -0
  180. package/src/lib/data-transfer/job.d.ts +190 -0
  181. package/src/lib/data-transfer/job.js +229 -0
  182. package/src/lib/data-transfer/job.js.map +1 -0
  183. package/src/lib/data-transfer/lookup.d.ts +45 -0
  184. package/src/lib/data-transfer/lookup.js +71 -0
  185. package/src/lib/data-transfer/lookup.js.map +1 -0
  186. package/src/lib/data-transfer/match.d.ts +99 -0
  187. package/src/lib/data-transfer/match.js +244 -0
  188. package/src/lib/data-transfer/match.js.map +1 -0
  189. package/src/lib/data-transfer/package-plan.d.ts +205 -0
  190. package/src/lib/data-transfer/package-plan.js +475 -0
  191. package/src/lib/data-transfer/package-plan.js.map +1 -0
  192. package/src/lib/data-transfer/package.d.ts +181 -0
  193. package/src/lib/data-transfer/package.js +426 -0
  194. package/src/lib/data-transfer/package.js.map +1 -0
  195. package/src/lib/data-transfer/picklist-map.d.ts +139 -0
  196. package/src/lib/data-transfer/picklist-map.js +271 -0
  197. package/src/lib/data-transfer/picklist-map.js.map +1 -0
  198. package/src/lib/data-transfer/plan.d.ts +176 -0
  199. package/src/lib/data-transfer/plan.js +451 -0
  200. package/src/lib/data-transfer/plan.js.map +1 -0
  201. package/src/lib/data-transfer/policy.d.ts +170 -0
  202. package/src/lib/data-transfer/policy.js +378 -0
  203. package/src/lib/data-transfer/policy.js.map +1 -0
  204. package/src/lib/data-transfer/resource.d.ts +211 -0
  205. package/src/lib/data-transfer/resource.js +241 -0
  206. package/src/lib/data-transfer/resource.js.map +1 -0
  207. package/src/lib/data-transfer/review.d.ts +70 -0
  208. package/src/lib/data-transfer/review.js +233 -0
  209. package/src/lib/data-transfer/review.js.map +1 -0
  210. package/src/lib/data-transfer/similarity.d.ts +40 -0
  211. package/src/lib/data-transfer/similarity.js +106 -0
  212. package/src/lib/data-transfer/similarity.js.map +1 -0
  213. package/src/lib/data-transfer/site-package.d.ts +365 -0
  214. package/src/lib/data-transfer/site-package.js +1077 -0
  215. package/src/lib/data-transfer/site-package.js.map +1 -0
  216. package/src/lib/data-transfer/source.d.ts +74 -0
  217. package/src/lib/data-transfer/source.js +293 -0
  218. package/src/lib/data-transfer/source.js.map +1 -0
  219. package/src/lib/data-transfer/transfer-api.d.ts +898 -0
  220. package/src/lib/data-transfer/transfer-api.js +107 -0
  221. package/src/lib/data-transfer/transfer-api.js.map +1 -0
  222. package/src/lib/foundation/definitions/org-billing.types.d.ts +31 -0
  223. package/src/lib/foundation/definitions/org-billing.types.js.map +1 -1
  224. package/src/lib/foundation/definitions/organization.types.d.ts +42 -1
  225. package/src/lib/foundation/definitions/organization.types.js.map +1 -1
  226. package/src/lib/foundation/definitions/platform.types.d.ts +6 -4
  227. package/src/lib/foundation/definitions/platform.types.js.map +1 -1
  228. package/src/lib/foundation/index.d.ts +1 -1
  229. package/src/lib/foundation/index.js.map +1 -1
  230. package/src/lib/plugin-manager/feature-plugins.d.ts +91 -2
  231. package/src/lib/plugin-manager/feature-plugins.js +48 -3
  232. package/src/lib/plugin-manager/feature-plugins.js.map +1 -1
  233. package/src/lib/plugin-manager/first-party-plugins.generated.d.ts +50 -0
  234. package/src/lib/plugin-manager/first-party-plugins.generated.js +1129 -28
  235. package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -1
  236. package/src/lib/plugin-manager/index.d.ts +0 -1
  237. package/src/lib/plugin-manager/index.js +0 -1
  238. package/src/lib/plugin-manager/index.js.map +1 -1
  239. package/src/lib/plugin-manager/interaction-recipes.d.ts +142 -0
  240. package/src/lib/plugin-manager/interaction-recipes.js +104 -0
  241. package/src/lib/plugin-manager/interaction-recipes.js.map +1 -0
  242. package/src/lib/plugin-manager/interaction-step-checks.d.ts +66 -0
  243. package/src/lib/plugin-manager/interaction-step-checks.js +86 -0
  244. package/src/lib/plugin-manager/interaction-step-checks.js.map +1 -0
  245. package/src/lib/plugin-manager/plugin-artifact-types.d.ts +235 -0
  246. package/src/lib/plugin-manager/plugin-artifact-types.js +99 -0
  247. package/src/lib/plugin-manager/plugin-artifact-types.js.map +1 -0
  248. package/src/lib/plugin-manager/plugin-contact-capture.d.ts +8 -0
  249. package/src/lib/plugin-manager/plugin-contact-capture.js.map +1 -1
  250. package/src/lib/plugin-manager/plugin-conversion-credit.d.ts +216 -0
  251. package/src/lib/plugin-manager/plugin-conversion-credit.js +91 -0
  252. package/src/lib/plugin-manager/plugin-conversion-credit.js.map +1 -0
  253. package/src/lib/plugin-manager/plugin-entity-pickers.d.ts +83 -0
  254. package/src/lib/plugin-manager/plugin-entity-pickers.js +87 -0
  255. package/src/lib/plugin-manager/plugin-entity-pickers.js.map +1 -0
  256. package/src/lib/plugin-manager/plugin-host-resources.d.ts +6 -0
  257. package/src/lib/plugin-manager/plugin-host-resources.js +6 -1
  258. package/src/lib/plugin-manager/plugin-host-resources.js.map +1 -1
  259. package/src/lib/plugin-manager/plugin-intake-gates.d.ts +75 -0
  260. package/src/lib/plugin-manager/plugin-intake-gates.js +49 -0
  261. package/src/lib/plugin-manager/plugin-intake-gates.js.map +1 -0
  262. package/src/lib/plugin-manager/plugin-jobs.d.ts +5 -5
  263. package/src/lib/plugin-manager/plugin-jobs.js +7 -7
  264. package/src/lib/plugin-manager/plugin-jobs.js.map +1 -1
  265. package/src/lib/plugin-manager/plugin-live-paths.d.ts +70 -0
  266. package/src/lib/plugin-manager/plugin-live-paths.js +66 -0
  267. package/src/lib/plugin-manager/plugin-live-paths.js.map +1 -0
  268. package/src/lib/plugin-manager/plugin-org-erasure.d.ts +3 -2
  269. package/src/lib/plugin-manager/plugin-org-erasure.js +30 -5
  270. package/src/lib/plugin-manager/plugin-org-erasure.js.map +1 -1
  271. package/src/lib/plugin-manager/plugin-person-erasure.d.ts +68 -9
  272. package/src/lib/plugin-manager/plugin-person-erasure.js +196 -51
  273. package/src/lib/plugin-manager/plugin-person-erasure.js.map +1 -1
  274. package/src/lib/plugin-manager/plugin-person-records.d.ts +275 -0
  275. package/src/lib/plugin-manager/plugin-person-records.js +107 -0
  276. package/src/lib/plugin-manager/plugin-person-records.js.map +1 -0
  277. package/src/lib/plugin-manager/plugin-record-counts.d.ts +76 -0
  278. package/src/lib/plugin-manager/plugin-record-counts.js +49 -0
  279. package/src/lib/plugin-manager/plugin-record-counts.js.map +1 -0
  280. package/src/lib/plugin-manager/plugin-record-email-state.d.ts +26 -0
  281. package/src/lib/plugin-manager/plugin-record-email-state.js +16 -0
  282. package/src/lib/plugin-manager/plugin-record-email-state.js.map +1 -1
  283. package/src/lib/plugin-manager/plugin-record-index.d.ts +10 -0
  284. package/src/lib/plugin-manager/plugin-record-index.js.map +1 -1
  285. package/src/lib/plugin-manager/plugin-record-lists.d.ts +86 -6
  286. package/src/lib/plugin-manager/plugin-record-lists.js +42 -5
  287. package/src/lib/plugin-manager/plugin-record-lists.js.map +1 -1
  288. package/src/lib/plugin-manager/plugin-record-origin.d.ts +79 -0
  289. package/src/lib/plugin-manager/plugin-record-origin.js +46 -0
  290. package/src/lib/plugin-manager/plugin-record-origin.js.map +1 -0
  291. package/src/lib/plugin-manager/plugin-record-pages.d.ts +37 -0
  292. package/src/lib/plugin-manager/plugin-record-pages.js +52 -0
  293. package/src/lib/plugin-manager/plugin-record-pages.js.map +1 -0
  294. package/src/lib/plugin-manager/plugin-record-timeline.d.ts +60 -0
  295. package/src/lib/plugin-manager/plugin-record-timeline.js +16 -0
  296. package/src/lib/plugin-manager/plugin-record-timeline.js.map +1 -1
  297. package/src/lib/plugin-manager/plugin-resource-drafts.d.ts +5 -5
  298. package/src/lib/plugin-manager/plugin-resource-drafts.js.map +1 -1
  299. package/src/lib/plugin-manager/plugin-revocations.d.ts +64 -0
  300. package/src/lib/plugin-manager/plugin-revocations.js +47 -0
  301. package/src/lib/plugin-manager/plugin-revocations.js.map +1 -0
  302. package/src/lib/plugin-manager/plugin-send-tallies.d.ts +69 -0
  303. package/src/lib/plugin-manager/plugin-send-tallies.js +45 -0
  304. package/src/lib/plugin-manager/plugin-send-tallies.js.map +1 -0
  305. package/src/lib/plugin-manager/plugin-site-bundle.d.ts +40 -0
  306. package/src/lib/plugin-manager/plugin-site-bundle.js +4 -0
  307. package/src/lib/plugin-manager/plugin-site-bundle.js.map +1 -1
  308. package/src/lib/plugin-manager/plugin-site-export.d.ts +57 -1
  309. package/src/lib/plugin-manager/plugin-site-export.js +23 -10
  310. package/src/lib/plugin-manager/plugin-site-export.js.map +1 -1
  311. package/src/lib/plugin-manager/plugin-sitemap-readers.d.ts +146 -0
  312. package/src/lib/plugin-manager/plugin-sitemap-readers.js +110 -0
  313. package/src/lib/plugin-manager/plugin-sitemap-readers.js.map +1 -0
  314. package/src/lib/plugin-manager/plugin-transfer-resources.d.ts +714 -0
  315. package/src/lib/plugin-manager/plugin-transfer-resources.js +443 -0
  316. package/src/lib/plugin-manager/plugin-transfer-resources.js.map +1 -0
  317. package/src/lib/plugin-manager/plugin-usage-axes.d.ts +54 -5
  318. package/src/lib/plugin-manager/plugin-usage-axes.js +11 -3
  319. package/src/lib/plugin-manager/plugin-usage-axes.js.map +1 -1
  320. package/src/lib/plugin-manager/plugin-user-erasure.js +9 -1
  321. package/src/lib/plugin-manager/plugin-user-erasure.js.map +1 -1
  322. package/src/lib/plugin-manager/plugin-visitor-doors.d.ts +104 -0
  323. package/src/lib/plugin-manager/plugin-visitor-doors.js +108 -0
  324. package/src/lib/plugin-manager/plugin-visitor-doors.js.map +1 -0
  325. package/src/lib/plugin-manager/realm-host-aglyn.generated.js +2 -0
  326. package/src/lib/plugin-manager/realm-host-aglyn.generated.js.map +1 -1
  327. package/src/lib/plugin-manager/repeat-rows.d.ts +5 -6
  328. package/src/lib/plugin-manager/repeat-rows.js.map +1 -1
  329. package/src/lib/app-utils/actions.d.ts +0 -310
  330. package/src/lib/app-utils/actions.js +0 -506
  331. package/src/lib/app-utils/actions.js.map +0 -1
  332. package/src/lib/app-utils/automation-placeholders.d.ts +0 -72
  333. package/src/lib/app-utils/automation-placeholders.js +0 -207
  334. package/src/lib/app-utils/automation-placeholders.js.map +0 -1
  335. package/src/lib/app-utils/dataset-models.d.ts +0 -339
  336. package/src/lib/app-utils/dataset-models.js +0 -722
  337. package/src/lib/app-utils/dataset-models.js.map +0 -1
  338. package/src/lib/app-utils/datasets.d.ts +0 -171
  339. package/src/lib/app-utils/datasets.js +0 -227
  340. package/src/lib/app-utils/datasets.js.map +0 -1
  341. package/src/lib/app-utils/form-abuse-ceiling.d.ts +0 -146
  342. package/src/lib/app-utils/form-abuse-ceiling.js +0 -158
  343. package/src/lib/app-utils/form-abuse-ceiling.js.map +0 -1
  344. package/src/lib/plugin-manager/order-fulfilment.d.ts +0 -142
  345. package/src/lib/plugin-manager/order-fulfilment.js +0 -104
  346. package/src/lib/plugin-manager/order-fulfilment.js.map +0 -1
@@ -1,722 +0,0 @@
1
- import { _ as _extends } from "@swc/helpers/_/_extends";
2
- /**
3
- * @license
4
- * Copyright 2026 Aglyn LLC
5
- *
6
- * Licensed under the Apache License, Version 2.0 (the "License");
7
- * you may not use this file except in compliance with the License.
8
- * You may obtain a copy of the License at
9
- *
10
- * http://www.apache.org/licenses/LICENSE-2.0
11
- *
12
- * Unless required by applicable law or agreed to in writing, software
13
- * distributed under the License is distributed on an "AS IS" BASIS,
14
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
- * See the License for the specific language governing permissions and
16
- * limitations under the License.
17
- */ import { validateCustomFieldValue } from "../plugin-manager/custom-fields.js";
18
- import { humanizeDatasetFieldId } from "./datasets.js";
19
- export const DATASET_FIELD_TYPES = [
20
- 'text',
21
- 'bool',
22
- 'int32',
23
- 'int64',
24
- 'float',
25
- 'timestamp',
26
- 'coordinates',
27
- 'map',
28
- 'sorted',
29
- 'bytes',
30
- 'nil',
31
- 'reference'
32
- ];
33
- /** Display names, mirroring dod.ts `lbl`. */ export const DATASET_FIELD_TYPE_LABELS = {
34
- text: 'Text',
35
- bool: 'Boolean',
36
- int32: 'Integer',
37
- int64: 'Big integer',
38
- float: 'Number',
39
- timestamp: 'Date & time',
40
- coordinates: 'Coordinates',
41
- map: 'Map',
42
- sorted: 'List',
43
- bytes: 'Bytes',
44
- nil: 'Null',
45
- reference: 'Reference'
46
- };
47
- /**
48
- * Migration shim (v1 → v2): datasets created before models carry flat
49
- * `fields: string[]` — derive a model where every column is an optional
50
- * text field whose id is the column name, so the editor and AGL-103
51
- * bindings keep working on unmigrated docs during rollout.
52
- */ export function deriveModelFromFields(fields) {
53
- const model = {
54
- fields: {},
55
- order: []
56
- };
57
- for (const name of fields){
58
- // Raw snake_case ids read as titles in table headers and pickers;
59
- // the id stays the stable key (AGL-558).
60
- model.fields[name] = {
61
- name: humanizeDatasetFieldId(name),
62
- type: 'text'
63
- };
64
- model.order.push(name);
65
- }
66
- return model;
67
- }
68
- /**
69
- * Model from quick-creator entries (AGL-558): stable slug ids with the
70
- * human display names preserved — "Roast preference" → id
71
- * `roast_preference`, name "Roast preference".
72
- */ export function modelFromFieldEntries(entries) {
73
- const model = {
74
- fields: {},
75
- order: []
76
- };
77
- for (const entry of entries){
78
- model.fields[entry.id] = {
79
- name: entry.name,
80
- type: 'text'
81
- };
82
- model.order.push(entry.id);
83
- }
84
- return model;
85
- }
86
- /** The dataset's model, deriving one from v1 `fields` when absent. */ export function effectiveDatasetModel(dataset) {
87
- var _dataset_fields;
88
- var _dataset_model, _dataset_model_order;
89
- if (((_dataset_model = dataset.model) == null ? void 0 : _dataset_model.fields) && ((_dataset_model_order = dataset.model.order) == null ? void 0 : _dataset_model_order.length)) {
90
- return dataset.model;
91
- }
92
- return deriveModelFromFields((_dataset_fields = dataset.fields) != null ? _dataset_fields : []);
93
- }
94
- const isFiniteNumber = (value)=>typeof value === 'number' && Number.isFinite(value);
95
- /**
96
- * Validates a document's values against a model, returning fieldId →
97
- * human-readable error (empty object = valid). Values are expected in
98
- * storage form (see the module doc); use `coerceDocumentValues` first
99
- * when starting from user input strings.
100
- */ export function validateDocument(model, values) {
101
- const errors = {};
102
- for (const fieldId of model.order){
103
- var _field_validation;
104
- var _field_validation1;
105
- const field = model.fields[fieldId];
106
- if (!field) continue;
107
- const value = values[fieldId];
108
- const required = field.required || ((_field_validation1 = field.validation) == null ? void 0 : _field_validation1.required);
109
- if (value == null || value === '') {
110
- if (required) errors[fieldId] = `${field.name} is required`;
111
- continue;
112
- }
113
- const rules = (_field_validation = field.validation) != null ? _field_validation : {};
114
- switch(field.type){
115
- case 'text':
116
- {
117
- var _rules_options;
118
- if (typeof value !== 'string') {
119
- errors[fieldId] = `${field.name} must be text`;
120
- break;
121
- }
122
- if (rules.min != null && value.length < rules.min) {
123
- errors[fieldId] = `${field.name} must be at least ${rules.min} characters`;
124
- } else if (rules.max != null && value.length > rules.max) {
125
- errors[fieldId] = `${field.name} must be at most ${rules.max} characters`;
126
- } else if (rules.regex) {
127
- try {
128
- if (!new RegExp(rules.regex).test(value)) {
129
- errors[fieldId] = `${field.name} has an invalid format`;
130
- }
131
- } catch (unused) {
132
- // Broken pattern in the model never blocks writes.
133
- }
134
- }
135
- if (!errors[fieldId] && ((_rules_options = rules.options) == null ? void 0 : _rules_options.length) && !rules.options.includes(value)) {
136
- errors[fieldId] = `${field.name} must be one of: ${rules.options.join(', ')}`;
137
- }
138
- break;
139
- }
140
- case 'bool':
141
- if (typeof value !== 'boolean') {
142
- errors[fieldId] = `${field.name} must be true or false`;
143
- }
144
- break;
145
- case 'int32':
146
- case 'int64':
147
- if (!isFiniteNumber(value) || !Number.isInteger(value)) {
148
- errors[fieldId] = `${field.name} must be a whole number`;
149
- break;
150
- }
151
- if (rules.min != null && value < rules.min) {
152
- errors[fieldId] = `${field.name} must be ≥ ${rules.min}`;
153
- } else if (rules.max != null && value > rules.max) {
154
- errors[fieldId] = `${field.name} must be ≤ ${rules.max}`;
155
- }
156
- break;
157
- case 'float':
158
- case 'timestamp':
159
- if (!isFiniteNumber(value)) {
160
- errors[fieldId] = field.type === 'timestamp' ? `${field.name} must be a date` : `${field.name} must be a number`;
161
- break;
162
- }
163
- if (rules.min != null && value < rules.min) {
164
- errors[fieldId] = `${field.name} must be ≥ ${rules.min}`;
165
- } else if (rules.max != null && value > rules.max) {
166
- errors[fieldId] = `${field.name} must be ≤ ${rules.max}`;
167
- }
168
- break;
169
- case 'coordinates':
170
- {
171
- const coordinates = value;
172
- if (!isFiniteNumber(coordinates == null ? void 0 : coordinates.latitude) || !isFiniteNumber(coordinates == null ? void 0 : coordinates.longitude) || Math.abs(coordinates.latitude) > 90 || Math.abs(coordinates.longitude) > 180) {
173
- errors[fieldId] = `${field.name} must be valid coordinates`;
174
- }
175
- break;
176
- }
177
- case 'sorted':
178
- if (!Array.isArray(value)) {
179
- errors[fieldId] = `${field.name} must be a list`;
180
- }
181
- break;
182
- case 'map':
183
- if (typeof value !== 'object' || Array.isArray(value)) {
184
- errors[fieldId] = `${field.name} must be a map`;
185
- }
186
- break;
187
- case 'reference':
188
- var _field_reference;
189
- if ((_field_reference = field.reference) == null ? void 0 : _field_reference.multiple) {
190
- if (!Array.isArray(value) || value.some((entry)=>typeof entry !== 'string' || !entry)) {
191
- errors[fieldId] = `${field.name} must reference documents`;
192
- }
193
- } else if (typeof value !== 'string' || !value) {
194
- errors[fieldId] = `${field.name} must reference a document`;
195
- }
196
- break;
197
- case 'bytes':
198
- case 'nil':
199
- break;
200
- }
201
- }
202
- // Custom field types (AGL-434): plugin validators run after the base
203
- // checks, only on fields that passed them.
204
- for (const fieldId of model.order){
205
- const field = model.fields[fieldId];
206
- if (!(field == null ? void 0 : field.customType) || errors[fieldId]) continue;
207
- const customError = validateCustomFieldValue(field.customType, values[fieldId]);
208
- if (customError) errors[fieldId] = `${field.name}: ${customError}`;
209
- }
210
- return errors;
211
- }
212
- /** Storage value → grid display string (AGL-179). */ export function formatDatasetValue(field, value) {
213
- if (value == null || value === '') return '';
214
- switch(field.type){
215
- case 'bool':
216
- return value === true ? '✓' : value === false ? '—' : String(value);
217
- case 'timestamp':
218
- return isFiniteNumber(value) ? new Date(value).toISOString().slice(0, 16).replace('T', ' ') : String(value);
219
- case 'coordinates':
220
- {
221
- const coordinates = value;
222
- return isFiniteNumber(coordinates == null ? void 0 : coordinates.latitude) && isFiniteNumber(coordinates == null ? void 0 : coordinates.longitude) ? `${coordinates.latitude}, ${coordinates.longitude}` : String(value);
223
- }
224
- case 'sorted':
225
- return Array.isArray(value) ? value.join(', ') : String(value);
226
- case 'map':
227
- try {
228
- return JSON.stringify(value);
229
- } catch (unused) {
230
- return String(value);
231
- }
232
- default:
233
- return String(value);
234
- }
235
- }
236
- /**
237
- * Storage value → form-input string (AGL-179): the inverse of
238
- * `coerceDocumentValues` for populating type-appropriate inputs
239
- * (timestamps as `datetime-local` values, coordinates as "lat, lon").
240
- */ export function datasetValueToInput(field, value) {
241
- if (value == null) return '';
242
- if (field.type === 'timestamp' && isFiniteNumber(value)) {
243
- return new Date(value).toISOString().slice(0, 16);
244
- }
245
- if (field.type === 'bool') {
246
- return value === true ? 'true' : value === false ? 'false' : String(value);
247
- }
248
- if (field.type === 'coordinates' || field.type === 'sorted') {
249
- return formatDatasetValue(field, value);
250
- }
251
- if (field.type === 'map') return formatDatasetValue(field, value);
252
- return String(value);
253
- }
254
- const BOOL_TRUE_WORDS = new Set([
255
- 'true',
256
- 'yes',
257
- 'on',
258
- '1'
259
- ]);
260
- const BOOL_FALSE_WORDS = new Set([
261
- 'false',
262
- 'no',
263
- 'off',
264
- '0'
265
- ]);
266
- /**
267
- * Coerces user-input strings (form fields, CSV cells) into storage form
268
- * per the field type. Unparseable input is passed through untouched so
269
- * `validateDocument` reports it instead of silently mangling it.
270
- */ export function coerceDocumentValues(model, input) {
271
- const values = {};
272
- for (const fieldId of model.order){
273
- const field = model.fields[fieldId];
274
- const raw = input[fieldId];
275
- if (!field || raw == null || raw === '') continue;
276
- if (typeof raw !== 'string') {
277
- values[fieldId] = raw;
278
- continue;
279
- }
280
- switch(field.type){
281
- case 'bool':
282
- {
283
- // The words a form control or a CSV cell says yes and no with: a
284
- // lone checkbox posts `on`, a spreadsheet exports `TRUE` or `1`.
285
- const word = raw.trim().toLowerCase();
286
- values[fieldId] = BOOL_TRUE_WORDS.has(word) ? true : BOOL_FALSE_WORDS.has(word) ? false : raw;
287
- break;
288
- }
289
- case 'int32':
290
- case 'int64':
291
- {
292
- const parsed = Number(raw);
293
- values[fieldId] = Number.isInteger(parsed) ? parsed : raw;
294
- break;
295
- }
296
- case 'float':
297
- {
298
- const parsed = Number(raw);
299
- values[fieldId] = Number.isFinite(parsed) ? parsed : raw;
300
- break;
301
- }
302
- case 'timestamp':
303
- {
304
- const millis = Date.parse(raw);
305
- values[fieldId] = Number.isFinite(millis) ? millis : raw;
306
- break;
307
- }
308
- case 'coordinates':
309
- {
310
- const [latitude, longitude] = raw.split(',').map((part)=>Number(part.trim()));
311
- values[fieldId] = Number.isFinite(latitude) && Number.isFinite(longitude) ? {
312
- latitude,
313
- longitude
314
- } : raw;
315
- break;
316
- }
317
- case 'sorted':
318
- values[fieldId] = raw.split(',').map((part)=>part.trim()).filter(Boolean);
319
- break;
320
- case 'map':
321
- try {
322
- values[fieldId] = JSON.parse(raw);
323
- } catch (unused) {
324
- values[fieldId] = raw;
325
- }
326
- break;
327
- case 'reference':
328
- var _field_reference;
329
- values[fieldId] = ((_field_reference = field.reference) == null ? void 0 : _field_reference.multiple) ? raw.split(',').map((part)=>part.trim()).filter(Boolean) : raw;
330
- break;
331
- default:
332
- values[fieldId] = raw;
333
- }
334
- }
335
- return values;
336
- }
337
- /**
338
- * Every reference id a record holds, flattened out of its `reference` fields
339
- * into one de-duplicated list.
340
- *
341
- * A reference field stores either a single target id or — when
342
- * `reference.multiple` is set — an array of them, and a model may declare
343
- * several. Both shapes flatten into the same list because the question asked
344
- * of it is never "which field", it is "does this record still point at that
345
- * document".
346
- *
347
- * Fields are read from `order` UNIONED with the keys of `fields`. Every other
348
- * pass over a model walks `order` alone, which is right for anything the user
349
- * sees — but a reference declared without a display slot still holds a real
350
- * FKey, and an integrity index that skipped it would under-report.
351
- */ export function datasetReferencedIds(model, values) {
352
- var _model_order, _model_fields;
353
- const ids = new Set();
354
- const fieldIds = new Set([
355
- ...(_model_order = model.order) != null ? _model_order : [],
356
- ...Object.keys((_model_fields = model.fields) != null ? _model_fields : {})
357
- ]);
358
- for (const fieldId of fieldIds){
359
- var _model_fields_fieldId, _model_fields1;
360
- if (((_model_fields1 = model.fields) == null ? void 0 : (_model_fields_fieldId = _model_fields1[fieldId]) == null ? void 0 : _model_fields_fieldId.type) !== 'reference') continue;
361
- const stored = values == null ? void 0 : values[fieldId];
362
- for (const entry of Array.isArray(stored) ? stored : [
363
- stored
364
- ]){
365
- const id = typeof entry === 'string' ? entry.trim() : '';
366
- if (id) ids.add(id);
367
- }
368
- }
369
- return [
370
- ...ids
371
- ];
372
- }
373
- /**
374
- * The integrity index a record write carries, so referential integrity can be
375
- * decided by a QUERY rather than by the rows a listener happened to fetch.
376
- *
377
- * Deleting a record has to answer "is anything still pointing at this?", and
378
- * `restrict` refuses the delete on a yes while `setNull` strips the FKey. That
379
- * question cannot be asked where the answer is stored: dataset fields are
380
- * user-defined, so `records.values` carries a deliberate index exemption in
381
- * `cloud/firebase-firestore.indexes.json` — auto-indexing an unbounded map
382
- * blows Firestore's per-document index-entry limit — and
383
- * `where('values.<fieldId>', '==', id)` is therefore FAILED_PRECONDITION.
384
- * Reading a page of records and filtering them in the browser answers only for
385
- * the rows in that page, which is a browse window standing in for a
386
- * correctness check: a reference held outside it reads as no reference at all,
387
- * the delete proceeds, and `restrict` silently fails to restrict.
388
- *
389
- * `referencedIds` is that same reference, denormalized to a top-level array
390
- * Firestore will index, so one `array-contains` reaches every record.
391
- *
392
- * ⚠️ OMITTED when a record references nothing, rather than written as `[]`.
393
- * `isNotEmpty` is served as `!= null` and an empty array is not null, so a
394
- * record stamped `[]` answers "holds a reference" for a dataset that holds
395
- * none.
396
- *
397
- * ⚠️ Spread this at EVERY write that sets a record's `values`. A write that
398
- * sets values without it leaves the index describing the PREVIOUS values, and
399
- * a stale integrity index is the exact failure it exists to prevent — with the
400
- * UI reporting the record as safe to delete. On a merging write use
401
- * `datasetIntegrityUpdate` instead: omission leaves a stale array in place
402
- * where clearing the last reference has to remove the field.
403
- */ export function datasetIntegrityFields(model, values) {
404
- const referencedIds = datasetReferencedIds(model, values);
405
- // The records table's filter fields (`datasetFilterKeys`,
406
- // `datasetFilterValues`) travel on the same writes for the same reason: a
407
- // record written without them is invisible to every filter the query
408
- // serves. Omitted when empty, like `referencedIds`.
409
- const filterKeys = datasetFilterKeys(model, values);
410
- const filterValues = datasetFilterValues(model, values);
411
- return _extends({}, referencedIds.length ? {
412
- referencedIds
413
- } : {}, filterKeys.length ? {
414
- filterKeys
415
- } : {}, Object.keys(filterValues).length ? {
416
- filterValues
417
- } : {});
418
- }
419
- /**
420
- * `datasetIntegrityFields` for a MERGING write (`update`, `set` with
421
- * `mergeFields`), where leaving the field out preserves what is stored
422
- * rather than clearing it.
423
- *
424
- * A record whose last reference is cleared has to have the field REMOVED, or
425
- * it goes on answering the `array-contains` for a document it no longer points
426
- * at — a `restrict` that refuses a delete nothing is holding. `clear` is the
427
- * caller's delete sentinel: `deleteField()` in the web SDK,
428
- * `FieldValue.delete()` in the Admin SDK. It is passed in rather than imported
429
- * because this module is shared by both and must stay SDK-free. The filter
430
- * fields are cleared the same way, so a record emptied of every filterable
431
- * value stops answering the filters its old values did.
432
- *
433
- * ⚠️ `filterValues` is a MAP, and it is written WHOLE: `update` and
434
- * `mergeFields` replace a field outright, so a value cleared since the last
435
- * write leaves the map with it. `set(…, { merge: true })` does NOT — it merges
436
- * maps key by key and would keep the cleared value answering its old
437
- * equality — so a record write never uses it; list the fields in
438
- * `mergeFields` instead.
439
- */ export function datasetIntegrityUpdate(model, values, clear) {
440
- const referencedIds = datasetReferencedIds(model, values);
441
- const filterKeys = datasetFilterKeys(model, values);
442
- const filterValues = datasetFilterValues(model, values);
443
- return {
444
- referencedIds: referencedIds.length ? referencedIds : clear,
445
- filterKeys: filterKeys.length ? filterKeys : clear,
446
- filterValues: Object.keys(filterValues).length ? filterValues : clear
447
- };
448
- }
449
- /**
450
- * A dataset record's FILTER TOKENS: every word-level question the records
451
- * table can ask of a record, flattened into one array of strings Firestore
452
- * indexes on its own. Its twin, {@link datasetFilterValues}, holds the
453
- * equalities.
454
- *
455
- * ## Why these fields, and not the values
456
- *
457
- * A record's fields live under `values`, a user-defined, unbounded map that
458
- * the index configuration exempts from indexing — auto-indexing it can exceed
459
- * Firestore's per-document index-entry limit — so `where('values.<field>', …)`
460
- * is refused. A composite index per dataset would need an admin call per
461
- * dataset, runs into the project's composite-index cap, and is deleted by the
462
- * next `firestore:indexes` deploy of a file that does not list it.
463
- *
464
- * `filterKeys` and `filterValues` need none of that. Firestore's AUTOMATIC
465
- * single-field indexes serve `where('filterKeys', 'array-contains', token)`
466
- * and `where('filterValues.<field>', '==', value)`, and every automatic index
467
- * ends in the document name — so any number of those equalities and ONE
468
- * `array-contains`, under `orderBy(documentId())`, compose by index merging,
469
- * with no composite index and no index deploy, on any dataset of any project
470
- * (AGL-3321).
471
- *
472
- * ## The token grammar
473
- *
474
- * `f:<fieldId>=<value>` a field equals a value. Enum (a text field with
475
- * `validation.options`) values are kept exactly;
476
- * plain text is lower-cased, trimmed and clipped to
477
- * {@link DATASET_FILTER_VALUE_MAX} characters;
478
- * booleans are `true`/`false`; numbers are
479
- * `String(number)`; a `sorted` list contributes one
480
- * token per member.
481
- * `f:<fieldId>^<prefix>` a word of a plain text field starts with this.
482
- * `s:<prefix>` a word of ANY text value (enums and list members
483
- * included) starts with this — the quick search.
484
- *
485
- * Timestamps, references, maps, bytes, coordinates and nil fields carry no
486
- * field tokens: a timestamp is asked in ranges, which one token cannot serve,
487
- * and the rest are not asked about by value.
488
- *
489
- * The array is sorted, de-duplicated and capped at
490
- * {@link DATASET_FILTER_KEYS_MAX}. Past the cap, the `=` tokens are kept
491
- * first, then the per-field word prefixes, then the search prefixes, so a
492
- * very long record loses search reach before it loses exact matches.
493
- */ export const DATASET_FILTER_KEYS_MAX = 500;
494
- /** Plain text values are clipped to this many characters in an `=` token. */ export const DATASET_FILTER_VALUE_MAX = 64;
495
- /** Word prefixes run from 1 to this many characters. */ export const DATASET_FILTER_PREFIX_MAX = 12;
496
- /** Only the first this-many words of a value contribute prefixes. */ export const DATASET_FILTER_WORDS_MAX = 40;
497
- /**
498
- * The words of a text value: split on anything that is not a letter or a
499
- * digit, lower-cased, at most {@link DATASET_FILTER_WORDS_MAX} of them.
500
- */ export function datasetFilterWords(text) {
501
- return String(text).toLowerCase().split(RegExp("[^\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376-\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0620-\\u064A\\u066E-\\u066F\\u0671-\\u06D3\\u06D5\\u06E5-\\u06E6\\u06EE-\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4-\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u0870-\\u0887\\u0889-\\u088F\\u08A0-\\u08C9\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971-\\u0980\\u0985-\\u098C\\u098F-\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC-\\u09DD\\u09DF-\\u09E1\\u09F0-\\u09F1\\u09FC\\u0A05-\\u0A0A\\u0A0F-\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32-\\u0A33\\u0A35-\\u0A36\\u0A38-\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2-\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0-\\u0AE1\\u0AF9\\u0B05-\\u0B0C\\u0B0F-\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32-\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C-\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99-\\u0B9A\\u0B9C\\u0B9E-\\u0B9F\\u0BA3-\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C5C-\\u0C5D\\u0C60-\\u0C61\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDC-\\u0CDE\\u0CE0-\\u0CE1\\u0CF1-\\u0CF2\\u0D04-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D5F-\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32-\\u0E33\\u0E40-\\u0E46\\u0E81-\\u0E82\\u0E84\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB0\\u0EB2-\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC-\\u0EDF\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065-\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16F1-\\u16F8\\u1700-\\u1711\\u171F-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1878\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4C\\u1B83-\\u1BA0\\u1BAE-\\u1BAF\\u1BBA-\\u1BE5\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1C80-\\u1C8A\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5-\\u1CF6\\u1CFA\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183-\\u2184\\u2C00-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2-\\u2CF3\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3006\\u3031-\\u3035\\u303B-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312F\\u3131-\\u318E\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3400-\\u4DBF\\u4E00-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A-\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6E5\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7DC\\uA7F1-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA8F2-\\uA8F7\\uA8FB\\uA8FD-\\uA8FE\\uA90A-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF\\uA9E0-\\uA9E4\\uA9E6-\\uA9EF\\uA9FA-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5-\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB69\\uAB70-\\uABE2\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40-\\uFB41\\uFB43-\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC\\u{10000}-\\u{1000B}\\u{1000D}-\\u{10026}\\u{10028}-\\u{1003A}\\u{1003C}-\\u{1003D}\\u{1003F}-\\u{1004D}\\u{10050}-\\u{1005D}\\u{10080}-\\u{100FA}\\u{10280}-\\u{1029C}\\u{102A0}-\\u{102D0}\\u{10300}-\\u{1031F}\\u{1032D}-\\u{10340}\\u{10342}-\\u{10349}\\u{10350}-\\u{10375}\\u{10380}-\\u{1039D}\\u{103A0}-\\u{103C3}\\u{103C8}-\\u{103CF}\\u{10400}-\\u{1049D}\\u{104B0}-\\u{104D3}\\u{104D8}-\\u{104FB}\\u{10500}-\\u{10527}\\u{10530}-\\u{10563}\\u{10570}-\\u{1057A}\\u{1057C}-\\u{1058A}\\u{1058C}-\\u{10592}\\u{10594}-\\u{10595}\\u{10597}-\\u{105A1}\\u{105A3}-\\u{105B1}\\u{105B3}-\\u{105B9}\\u{105BB}-\\u{105BC}\\u{105C0}-\\u{105F3}\\u{10600}-\\u{10736}\\u{10740}-\\u{10755}\\u{10760}-\\u{10767}\\u{10780}-\\u{10785}\\u{10787}-\\u{107B0}\\u{107B2}-\\u{107BA}\\u{10800}-\\u{10805}\\u{10808}\\u{1080A}-\\u{10835}\\u{10837}-\\u{10838}\\u{1083C}\\u{1083F}-\\u{10855}\\u{10860}-\\u{10876}\\u{10880}-\\u{1089E}\\u{108E0}-\\u{108F2}\\u{108F4}-\\u{108F5}\\u{10900}-\\u{10915}\\u{10920}-\\u{10939}\\u{10940}-\\u{10959}\\u{10980}-\\u{109B7}\\u{109BE}-\\u{109BF}\\u{10A00}\\u{10A10}-\\u{10A13}\\u{10A15}-\\u{10A17}\\u{10A19}-\\u{10A35}\\u{10A60}-\\u{10A7C}\\u{10A80}-\\u{10A9C}\\u{10AC0}-\\u{10AC7}\\u{10AC9}-\\u{10AE4}\\u{10B00}-\\u{10B35}\\u{10B40}-\\u{10B55}\\u{10B60}-\\u{10B72}\\u{10B80}-\\u{10B91}\\u{10C00}-\\u{10C48}\\u{10C80}-\\u{10CB2}\\u{10CC0}-\\u{10CF2}\\u{10D00}-\\u{10D23}\\u{10D4A}-\\u{10D65}\\u{10D6F}-\\u{10D85}\\u{10E80}-\\u{10EA9}\\u{10EB0}-\\u{10EB1}\\u{10EC2}-\\u{10EC7}\\u{10F00}-\\u{10F1C}\\u{10F27}\\u{10F30}-\\u{10F45}\\u{10F70}-\\u{10F81}\\u{10FB0}-\\u{10FC4}\\u{10FE0}-\\u{10FF6}\\u{11003}-\\u{11037}\\u{11071}-\\u{11072}\\u{11075}\\u{11083}-\\u{110AF}\\u{110D0}-\\u{110E8}\\u{11103}-\\u{11126}\\u{11144}\\u{11147}\\u{11150}-\\u{11172}\\u{11176}\\u{11183}-\\u{111B2}\\u{111C1}-\\u{111C4}\\u{111DA}\\u{111DC}\\u{11200}-\\u{11211}\\u{11213}-\\u{1122B}\\u{1123F}-\\u{11240}\\u{11280}-\\u{11286}\\u{11288}\\u{1128A}-\\u{1128D}\\u{1128F}-\\u{1129D}\\u{1129F}-\\u{112A8}\\u{112B0}-\\u{112DE}\\u{11305}-\\u{1130C}\\u{1130F}-\\u{11310}\\u{11313}-\\u{11328}\\u{1132A}-\\u{11330}\\u{11332}-\\u{11333}\\u{11335}-\\u{11339}\\u{1133D}\\u{11350}\\u{1135D}-\\u{11361}\\u{11380}-\\u{11389}\\u{1138B}\\u{1138E}\\u{11390}-\\u{113B5}\\u{113B7}\\u{113D1}\\u{113D3}\\u{11400}-\\u{11434}\\u{11447}-\\u{1144A}\\u{1145F}-\\u{11461}\\u{11480}-\\u{114AF}\\u{114C4}-\\u{114C5}\\u{114C7}\\u{11580}-\\u{115AE}\\u{115D8}-\\u{115DB}\\u{11600}-\\u{1162F}\\u{11644}\\u{11680}-\\u{116AA}\\u{116B8}\\u{11700}-\\u{1171A}\\u{11740}-\\u{11746}\\u{11800}-\\u{1182B}\\u{118A0}-\\u{118DF}\\u{118FF}-\\u{11906}\\u{11909}\\u{1190C}-\\u{11913}\\u{11915}-\\u{11916}\\u{11918}-\\u{1192F}\\u{1193F}\\u{11941}\\u{119A0}-\\u{119A7}\\u{119AA}-\\u{119D0}\\u{119E1}\\u{119E3}\\u{11A00}\\u{11A0B}-\\u{11A32}\\u{11A3A}\\u{11A50}\\u{11A5C}-\\u{11A89}\\u{11A9D}\\u{11AB0}-\\u{11AF8}\\u{11BC0}-\\u{11BE0}\\u{11C00}-\\u{11C08}\\u{11C0A}-\\u{11C2E}\\u{11C40}\\u{11C72}-\\u{11C8F}\\u{11D00}-\\u{11D06}\\u{11D08}-\\u{11D09}\\u{11D0B}-\\u{11D30}\\u{11D46}\\u{11D60}-\\u{11D65}\\u{11D67}-\\u{11D68}\\u{11D6A}-\\u{11D89}\\u{11D98}\\u{11DB0}-\\u{11DDB}\\u{11EE0}-\\u{11EF2}\\u{11F02}\\u{11F04}-\\u{11F10}\\u{11F12}-\\u{11F33}\\u{11FB0}\\u{12000}-\\u{12399}\\u{12480}-\\u{12543}\\u{12F90}-\\u{12FF0}\\u{13000}-\\u{1342F}\\u{13441}-\\u{13446}\\u{13460}-\\u{143FA}\\u{14400}-\\u{14646}\\u{16100}-\\u{1611D}\\u{16800}-\\u{16A38}\\u{16A40}-\\u{16A5E}\\u{16A70}-\\u{16ABE}\\u{16AD0}-\\u{16AED}\\u{16B00}-\\u{16B2F}\\u{16B40}-\\u{16B43}\\u{16B63}-\\u{16B77}\\u{16B7D}-\\u{16B8F}\\u{16D40}-\\u{16D6C}\\u{16E40}-\\u{16E7F}\\u{16EA0}-\\u{16EB8}\\u{16EBB}-\\u{16ED3}\\u{16F00}-\\u{16F4A}\\u{16F50}\\u{16F93}-\\u{16F9F}\\u{16FE0}-\\u{16FE1}\\u{16FE3}\\u{16FF2}-\\u{16FF3}\\u{17000}-\\u{18CD5}\\u{18CFF}-\\u{18D1E}\\u{18D80}-\\u{18DF2}\\u{1AFF0}-\\u{1AFF3}\\u{1AFF5}-\\u{1AFFB}\\u{1AFFD}-\\u{1AFFE}\\u{1B000}-\\u{1B122}\\u{1B132}\\u{1B150}-\\u{1B152}\\u{1B155}\\u{1B164}-\\u{1B167}\\u{1B170}-\\u{1B2FB}\\u{1BC00}-\\u{1BC6A}\\u{1BC70}-\\u{1BC7C}\\u{1BC80}-\\u{1BC88}\\u{1BC90}-\\u{1BC99}\\u{1D400}-\\u{1D454}\\u{1D456}-\\u{1D49C}\\u{1D49E}-\\u{1D49F}\\u{1D4A2}\\u{1D4A5}-\\u{1D4A6}\\u{1D4A9}-\\u{1D4AC}\\u{1D4AE}-\\u{1D4B9}\\u{1D4BB}\\u{1D4BD}-\\u{1D4C3}\\u{1D4C5}-\\u{1D505}\\u{1D507}-\\u{1D50A}\\u{1D50D}-\\u{1D514}\\u{1D516}-\\u{1D51C}\\u{1D51E}-\\u{1D539}\\u{1D53B}-\\u{1D53E}\\u{1D540}-\\u{1D544}\\u{1D546}\\u{1D54A}-\\u{1D550}\\u{1D552}-\\u{1D6A5}\\u{1D6A8}-\\u{1D6C0}\\u{1D6C2}-\\u{1D6DA}\\u{1D6DC}-\\u{1D6FA}\\u{1D6FC}-\\u{1D714}\\u{1D716}-\\u{1D734}\\u{1D736}-\\u{1D74E}\\u{1D750}-\\u{1D76E}\\u{1D770}-\\u{1D788}\\u{1D78A}-\\u{1D7A8}\\u{1D7AA}-\\u{1D7C2}\\u{1D7C4}-\\u{1D7CB}\\u{1DF00}-\\u{1DF1E}\\u{1DF25}-\\u{1DF2A}\\u{1E030}-\\u{1E06D}\\u{1E100}-\\u{1E12C}\\u{1E137}-\\u{1E13D}\\u{1E14E}\\u{1E290}-\\u{1E2AD}\\u{1E2C0}-\\u{1E2EB}\\u{1E4D0}-\\u{1E4EB}\\u{1E5D0}-\\u{1E5ED}\\u{1E5F0}\\u{1E6C0}-\\u{1E6DE}\\u{1E6E0}-\\u{1E6E2}\\u{1E6E4}-\\u{1E6E5}\\u{1E6E7}-\\u{1E6ED}\\u{1E6F0}-\\u{1E6F4}\\u{1E6FE}-\\u{1E6FF}\\u{1E7E0}-\\u{1E7E6}\\u{1E7E8}-\\u{1E7EB}\\u{1E7ED}-\\u{1E7EE}\\u{1E7F0}-\\u{1E7FE}\\u{1E800}-\\u{1E8C4}\\u{1E900}-\\u{1E943}\\u{1E94B}\\u{1EE00}-\\u{1EE03}\\u{1EE05}-\\u{1EE1F}\\u{1EE21}-\\u{1EE22}\\u{1EE24}\\u{1EE27}\\u{1EE29}-\\u{1EE32}\\u{1EE34}-\\u{1EE37}\\u{1EE39}\\u{1EE3B}\\u{1EE42}\\u{1EE47}\\u{1EE49}\\u{1EE4B}\\u{1EE4D}-\\u{1EE4F}\\u{1EE51}-\\u{1EE52}\\u{1EE54}\\u{1EE57}\\u{1EE59}\\u{1EE5B}\\u{1EE5D}\\u{1EE5F}\\u{1EE61}-\\u{1EE62}\\u{1EE64}\\u{1EE67}-\\u{1EE6A}\\u{1EE6C}-\\u{1EE72}\\u{1EE74}-\\u{1EE77}\\u{1EE79}-\\u{1EE7C}\\u{1EE7E}\\u{1EE80}-\\u{1EE89}\\u{1EE8B}-\\u{1EE9B}\\u{1EEA1}-\\u{1EEA3}\\u{1EEA5}-\\u{1EEA9}\\u{1EEAB}-\\u{1EEBB}\\u{20000}-\\u{2A6DF}\\u{2A700}-\\u{2B81D}\\u{2B820}-\\u{2CEAD}\\u{2CEB0}-\\u{2EBE0}\\u{2EBF0}-\\u{2EE5D}\\u{2F800}-\\u{2FA1D}\\u{30000}-\\u{3134A}\\u{31350}-\\u{33479}\\u0030-\\u0039\\u00B2-\\u00B3\\u00B9\\u00BC-\\u00BE\\u0660-\\u0669\\u06F0-\\u06F9\\u07C0-\\u07C9\\u0966-\\u096F\\u09E6-\\u09EF\\u09F4-\\u09F9\\u0A66-\\u0A6F\\u0AE6-\\u0AEF\\u0B66-\\u0B6F\\u0B72-\\u0B77\\u0BE6-\\u0BF2\\u0C66-\\u0C6F\\u0C78-\\u0C7E\\u0CE6-\\u0CEF\\u0D58-\\u0D5E\\u0D66-\\u0D78\\u0DE6-\\u0DEF\\u0E50-\\u0E59\\u0ED0-\\u0ED9\\u0F20-\\u0F33\\u1040-\\u1049\\u1090-\\u1099\\u1369-\\u137C\\u16EE-\\u16F0\\u17E0-\\u17E9\\u17F0-\\u17F9\\u1810-\\u1819\\u1946-\\u194F\\u19D0-\\u19DA\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1B50-\\u1B59\\u1BB0-\\u1BB9\\u1C40-\\u1C49\\u1C50-\\u1C59\\u2070\\u2074-\\u2079\\u2080-\\u2089\\u2150-\\u2182\\u2185-\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2CFD\\u3007\\u3021-\\u3029\\u3038-\\u303A\\u3192-\\u3195\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\uA620-\\uA629\\uA6E6-\\uA6EF\\uA830-\\uA835\\uA8D0-\\uA8D9\\uA900-\\uA909\\uA9D0-\\uA9D9\\uA9F0-\\uA9F9\\uAA50-\\uAA59\\uABF0-\\uABF9\\uFF10-\\uFF19\\u{10107}-\\u{10133}\\u{10140}-\\u{10178}\\u{1018A}-\\u{1018B}\\u{102E1}-\\u{102FB}\\u{10320}-\\u{10323}\\u{10341}\\u{1034A}\\u{103D1}-\\u{103D5}\\u{104A0}-\\u{104A9}\\u{10858}-\\u{1085F}\\u{10879}-\\u{1087F}\\u{108A7}-\\u{108AF}\\u{108FB}-\\u{108FF}\\u{10916}-\\u{1091B}\\u{109BC}-\\u{109BD}\\u{109C0}-\\u{109CF}\\u{109D2}-\\u{109FF}\\u{10A40}-\\u{10A48}\\u{10A7D}-\\u{10A7E}\\u{10A9D}-\\u{10A9F}\\u{10AEB}-\\u{10AEF}\\u{10B58}-\\u{10B5F}\\u{10B78}-\\u{10B7F}\\u{10BA9}-\\u{10BAF}\\u{10CFA}-\\u{10CFF}\\u{10D30}-\\u{10D39}\\u{10D40}-\\u{10D49}\\u{10E60}-\\u{10E7E}\\u{10F1D}-\\u{10F26}\\u{10F51}-\\u{10F54}\\u{10FC5}-\\u{10FCB}\\u{11052}-\\u{1106F}\\u{110F0}-\\u{110F9}\\u{11136}-\\u{1113F}\\u{111D0}-\\u{111D9}\\u{111E1}-\\u{111F4}\\u{112F0}-\\u{112F9}\\u{11450}-\\u{11459}\\u{114D0}-\\u{114D9}\\u{11650}-\\u{11659}\\u{116C0}-\\u{116C9}\\u{116D0}-\\u{116E3}\\u{11730}-\\u{1173B}\\u{118E0}-\\u{118F2}\\u{11950}-\\u{11959}\\u{11BF0}-\\u{11BF9}\\u{11C50}-\\u{11C6C}\\u{11D50}-\\u{11D59}\\u{11DA0}-\\u{11DA9}\\u{11DE0}-\\u{11DE9}\\u{11F50}-\\u{11F59}\\u{11FC0}-\\u{11FD4}\\u{12400}-\\u{1246E}\\u{16130}-\\u{16139}\\u{16A60}-\\u{16A69}\\u{16AC0}-\\u{16AC9}\\u{16B50}-\\u{16B59}\\u{16B5B}-\\u{16B61}\\u{16D70}-\\u{16D79}\\u{16E80}-\\u{16E96}\\u{16FF4}-\\u{16FF6}\\u{1CCF0}-\\u{1CCF9}\\u{1D2C0}-\\u{1D2D3}\\u{1D2E0}-\\u{1D2F3}\\u{1D360}-\\u{1D378}\\u{1D7CE}-\\u{1D7FF}\\u{1E140}-\\u{1E149}\\u{1E2F0}-\\u{1E2F9}\\u{1E4F0}-\\u{1E4F9}\\u{1E5F1}-\\u{1E5FA}\\u{1E8C7}-\\u{1E8CF}\\u{1E950}-\\u{1E959}\\u{1EC71}-\\u{1ECAB}\\u{1ECAD}-\\u{1ECAF}\\u{1ECB1}-\\u{1ECB4}\\u{1ED01}-\\u{1ED2D}\\u{1ED2F}-\\u{1ED3D}\\u{1F100}-\\u{1F10C}\\u{1FBF0}-\\u{1FBF9}]+", "u")).filter(Boolean).slice(0, DATASET_FILTER_WORDS_MAX);
502
- }
503
- /** A word's prefixes, 1 to {@link DATASET_FILTER_PREFIX_MAX} characters. */ function prefixes(word) {
504
- const chars = Array.from(word).slice(0, DATASET_FILTER_PREFIX_MAX);
505
- return chars.map((_char, at)=>chars.slice(0, at + 1).join(''));
506
- }
507
- /** A word clipped the way its stored prefixes are. */ function clipWord(word) {
508
- return Array.from(word).slice(0, DATASET_FILTER_PREFIX_MAX).join('');
509
- }
510
- const isEnum = (field)=>{
511
- var _ref;
512
- var _field_validation_options, _field_validation;
513
- return field.type === 'text' && ((_ref = (_field_validation = field.validation) == null ? void 0 : (_field_validation_options = _field_validation.options) == null ? void 0 : _field_validation_options.length) != null ? _ref : 0) > 0;
514
- };
515
- const isNumeric = (field)=>field.type === 'int32' || field.type === 'int64' || field.type === 'float';
516
- /**
517
- * A stored value as text, or null. Numbers are accepted because a form or an
518
- * automation stores every value as text and an import may do the reverse.
519
- */ function asText(value) {
520
- if (typeof value === 'string') return value;
521
- if (typeof value === 'number' && Number.isFinite(value)) return String(value);
522
- return null;
523
- }
524
- /**
525
- * Plain text as its stored key — its `=` token's value and its
526
- * `filterValues` entry: lower-cased, trimmed, clipped to
527
- * {@link DATASET_FILTER_VALUE_MAX} characters. What the records table asks a
528
- * typed value to equal.
529
- */ export function datasetFilterTextKey(value) {
530
- return Array.from(value.trim().toLowerCase()).slice(0, DATASET_FILTER_VALUE_MAX).join('');
531
- }
532
- const textKey = datasetFilterTextKey;
533
- /** A stored number (or its text form) as its `=` token's value. */ function numberKey(value) {
534
- const number = typeof value === 'number' ? value : typeof value === 'string' && value.trim() !== '' ? Number(value) : Number.NaN;
535
- return Number.isFinite(number) ? String(number) : null;
536
- }
537
- /** A stored boolean (or its text form) as its `=` token's value. */ function boolKey(value) {
538
- if (typeof value === 'boolean') return String(value);
539
- if (value === 'true' || value === 'false') return value;
540
- return null;
541
- }
542
- /** Every field a model declares, in display order and then the rest. */ function modelFieldIds(model) {
543
- var _model_order, _model_fields;
544
- return [
545
- ...new Set([
546
- ...(_model_order = model.order) != null ? _model_order : [],
547
- ...Object.keys((_model_fields = model.fields) != null ? _model_fields : {})
548
- ])
549
- ];
550
- }
551
- /** The tokens described in {@link DATASET_FILTER_KEYS_MAX}'s comment. */ export function datasetFilterKeys(model, values) {
552
- const exact = [];
553
- const fieldWords = [];
554
- const search = [];
555
- const searchable = (text)=>{
556
- for (const word of datasetFilterWords(text)){
557
- for (const prefix of prefixes(word))search.push(`s:${prefix}`);
558
- }
559
- };
560
- for (const fieldId of modelFieldIds(model)){
561
- var _model_fields;
562
- const field = (_model_fields = model.fields) == null ? void 0 : _model_fields[fieldId];
563
- const stored = values == null ? void 0 : values[fieldId];
564
- if (!field || stored == null) continue;
565
- if (field.type === 'text') {
566
- const text = asText(stored);
567
- if (text == null || !text.trim()) continue;
568
- if (isEnum(field)) {
569
- exact.push(`f:${fieldId}=${text}`);
570
- } else {
571
- exact.push(`f:${fieldId}=${textKey(text)}`);
572
- for (const word of datasetFilterWords(text)){
573
- for (const prefix of prefixes(word)){
574
- fieldWords.push(`f:${fieldId}^${prefix}`);
575
- }
576
- }
577
- }
578
- searchable(text);
579
- } else if (field.type === 'bool') {
580
- const key = boolKey(stored);
581
- if (key) exact.push(`f:${fieldId}=${key}`);
582
- } else if (isNumeric(field)) {
583
- const key = numberKey(stored);
584
- if (key) exact.push(`f:${fieldId}=${key}`);
585
- } else if (field.type === 'sorted') {
586
- for (const member of Array.isArray(stored) ? stored : [
587
- stored
588
- ]){
589
- var _asText;
590
- const text = (_asText = asText(member)) == null ? void 0 : _asText.trim();
591
- if (!text) continue;
592
- exact.push(`f:${fieldId}=${text}`);
593
- searchable(text);
594
- }
595
- }
596
- }
597
- const kept = [
598
- ...new Set([
599
- ...exact,
600
- ...fieldWords,
601
- ...search
602
- ])
603
- ].slice(0, DATASET_FILTER_KEYS_MAX);
604
- return kept.sort();
605
- }
606
- /**
607
- * Field ids a query can name as `filterValues.<id>`. A path string splits on
608
- * `.`, and the SDKs refuse `~ * / [ ]` in one; the model editor allows only
609
- * letters, digits and underscores, but a v1 dataset's column names were
610
- * never checked. Backticks are refused too, as the escape a path would need.
611
- */ const FILTER_VALUE_ID = /^[^.~*/[\]`]+$/;
612
- /**
613
- * The query path of a field's `filterValues` entry, or null for a field id
614
- * no path can name — such a field is stamped no entry, and the records table
615
- * offers it no equality (its `contains`, served by `filterKeys`, stands).
616
- */ export function datasetFilterValuePath(fieldId) {
617
- return FILTER_VALUE_ID.test(fieldId) && !/^__.*__$/.test(fieldId) ? `filterValues.${fieldId}` : null;
618
- }
619
- /**
620
- * A dataset record's FILTER VALUES: `{ [fieldId]: value }`, one scalar per
621
- * field an equality can be asked of, so the records table puts every
622
- * equality on its query (AGL-3321).
623
- *
624
- * enum text (`validation.options`) the value exactly, as its `=` token;
625
- * plain text {@link datasetFilterTextKey};
626
- * bool a boolean;
627
- * int32 / int64 / float a number.
628
- *
629
- * A form or an automation stores every value as text, so `'19.50'` is the
630
- * number 19.5 and `'true'` the boolean, as in {@link datasetFilterKeys}.
631
- * Fields with no value, and timestamps, lists, references, maps, bytes,
632
- * coordinates and nil fields, carry no entry: a list is asked by member
633
- * (`f:<id>=<member>` in `filterKeys`), and the rest are not asked about by
634
- * value.
635
- *
636
- * ## What it costs
637
- *
638
- * Unlike `values`, this map is NOT exempt from indexing — that is its whole
639
- * point. Each entry is a scalar and costs two automatic index entries
640
- * (ascending, descending), so a record costs at most two per model field —
641
- * bounded by the model's field count (the `/v1` API caps a model at 100
642
- * fields), far inside Firestore's 40,000 entries per document, where
643
- * `values` was unbounded because a `map` or `sorted` value may hold anything.
644
- */ export function datasetFilterValues(model, values) {
645
- const out = {};
646
- for (const fieldId of modelFieldIds(model)){
647
- var _model_fields;
648
- const field = (_model_fields = model.fields) == null ? void 0 : _model_fields[fieldId];
649
- const stored = values == null ? void 0 : values[fieldId];
650
- if (!field || stored == null || !datasetFilterValuePath(fieldId)) continue;
651
- if (field.type === 'text') {
652
- const text = asText(stored);
653
- if (text == null || !text.trim()) continue;
654
- out[fieldId] = isEnum(field) ? text : textKey(text);
655
- } else if (field.type === 'bool') {
656
- const key = boolKey(stored);
657
- if (key) out[fieldId] = key === 'true';
658
- } else if (isNumeric(field)) {
659
- const key = numberKey(stored);
660
- if (key) out[fieldId] = Number(key);
661
- }
662
- }
663
- return out;
664
- }
665
- /**
666
- * The `filterKeys` token a word-level clause asks for, or null when it is
667
- * not one:
668
- *
669
- * - plain text `contains` → the `^` token of the value's FIRST word, so a
670
- * `contains` is a word-prefix match, not a mid-string one, and one word
671
- * of several is asked (the records table says so);
672
- * - list `contains` (and `equals`) → the member's `=` token;
673
- * - enum, boolean, number and plain text `equals` → the `=` token of the
674
- * value. The records table asks these of `filterValues` instead, which
675
- * composes with a `contains`; the token remains what the quick search and
676
- * older readers match.
677
- * - everything else — ranges, dates, `isEmpty`, `isAnyOf`, negations — null.
678
- *
679
- * `clause.field` is the field id. The operator names are the grid's: a
680
- * select's `equals`, a number's `=`, a boolean's `is`, a list's `contains`.
681
- */ export function datasetFilterToken(model, clause) {
682
- var _clause_value;
683
- var _model_fields;
684
- const field = (_model_fields = model.fields) == null ? void 0 : _model_fields[clause.field];
685
- if (!field) return null;
686
- const { op } = clause;
687
- const value = String((_clause_value = clause.value) != null ? _clause_value : '');
688
- if (!value.trim()) return null;
689
- const equals = op === 'equals' || op === '=' || op === 'is';
690
- if (field.type === 'text') {
691
- if (isEnum(field)) return equals ? `f:${clause.field}=${value}` : null;
692
- if (equals) return `f:${clause.field}=${textKey(value)}`;
693
- if (op === 'contains') {
694
- const [first] = datasetFilterWords(value);
695
- return first ? `f:${clause.field}^${clipWord(first)}` : null;
696
- }
697
- return null;
698
- }
699
- if (field.type === 'bool') {
700
- const key = boolKey(value.trim());
701
- return equals && key ? `f:${clause.field}=${key}` : null;
702
- }
703
- if (isNumeric(field)) {
704
- const key = numberKey(value);
705
- return equals && key ? `f:${clause.field}=${key}` : null;
706
- }
707
- if (field.type === 'sorted') {
708
- return equals || op === 'contains' ? `f:${clause.field}=${value.trim()}` : null;
709
- }
710
- return null;
711
- }
712
- /**
713
- * The quick-search token for one typed word, or null for a word with no
714
- * letters or digits. A word with punctuation inside it is asked by its first
715
- * run — split the search text with {@link datasetFilterWords} to ask for
716
- * every run.
717
- */ export function datasetSearchToken(word) {
718
- const [first] = datasetFilterWords(word);
719
- return first ? `s:${clipWord(first)}` : null;
720
- }
721
-
722
- //# sourceMappingURL=dataset-models.js.map