@vuu-ui/vuu-utils 0.13.9 → 0.13.11

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 (317) hide show
  1. package/cjs/node_modules/@dnd-kit/abstract/index.js +625 -0
  2. package/cjs/node_modules/@dnd-kit/abstract/index.js.map +1 -0
  3. package/cjs/node_modules/@dnd-kit/abstract/modifiers.js +85 -0
  4. package/cjs/node_modules/@dnd-kit/abstract/modifiers.js.map +1 -0
  5. package/cjs/node_modules/@dnd-kit/collision/dist/index.js +91 -0
  6. package/cjs/node_modules/@dnd-kit/collision/dist/index.js.map +1 -0
  7. package/cjs/node_modules/@dnd-kit/dom/index.js +1649 -0
  8. package/cjs/node_modules/@dnd-kit/dom/index.js.map +1 -0
  9. package/cjs/node_modules/@dnd-kit/dom/sortable.js +833 -0
  10. package/cjs/node_modules/@dnd-kit/dom/sortable.js.map +1 -0
  11. package/cjs/node_modules/@dnd-kit/dom/utilities.js +1389 -0
  12. package/cjs/node_modules/@dnd-kit/dom/utilities.js.map +1 -0
  13. package/cjs/node_modules/@dnd-kit/geometry/dist/index.js +310 -0
  14. package/cjs/node_modules/@dnd-kit/geometry/dist/index.js.map +1 -0
  15. package/cjs/node_modules/@dnd-kit/react/hooks.js +86 -0
  16. package/cjs/node_modules/@dnd-kit/react/hooks.js.map +1 -0
  17. package/cjs/node_modules/@dnd-kit/react/sortable.js +177 -0
  18. package/cjs/node_modules/@dnd-kit/react/sortable.js.map +1 -0
  19. package/cjs/node_modules/@dnd-kit/react/utilities.js +19 -0
  20. package/cjs/node_modules/@dnd-kit/react/utilities.js.map +1 -0
  21. package/cjs/node_modules/@dnd-kit/state/dist/index.js +272 -0
  22. package/cjs/node_modules/@dnd-kit/state/dist/index.js.map +1 -0
  23. package/cjs/node_modules/@preact/signals-core/dist/signals-core.js +11 -0
  24. package/cjs/node_modules/@preact/signals-core/dist/signals-core.js.map +1 -0
  25. package/cjs/packages/vuu-utils/src/DataWindow.js +76 -0
  26. package/cjs/packages/vuu-utils/src/DataWindow.js.map +1 -0
  27. package/cjs/packages/vuu-utils/src/ShellContext.js +13 -0
  28. package/cjs/packages/vuu-utils/src/ShellContext.js.map +1 -0
  29. package/cjs/packages/vuu-utils/src/ThemeProvider.js +85 -0
  30. package/cjs/packages/vuu-utils/src/ThemeProvider.js.map +1 -0
  31. package/cjs/packages/vuu-utils/src/array-utils.js +87 -0
  32. package/cjs/packages/vuu-utils/src/array-utils.js.map +1 -0
  33. package/cjs/packages/vuu-utils/src/box-utils.js +53 -0
  34. package/cjs/packages/vuu-utils/src/box-utils.js.map +1 -0
  35. package/cjs/packages/vuu-utils/src/column-utils.js +891 -0
  36. package/cjs/packages/vuu-utils/src/column-utils.js.map +1 -0
  37. package/cjs/packages/vuu-utils/src/common-types.js +15 -0
  38. package/cjs/packages/vuu-utils/src/common-types.js.map +1 -0
  39. package/cjs/packages/vuu-utils/src/component-registry.js +140 -0
  40. package/cjs/packages/vuu-utils/src/component-registry.js.map +1 -0
  41. package/cjs/packages/vuu-utils/src/context-definitions/DataContext.js +20 -0
  42. package/cjs/packages/vuu-utils/src/context-definitions/DataContext.js.map +1 -0
  43. package/cjs/packages/vuu-utils/src/context-definitions/DataProvider.js +24 -0
  44. package/cjs/packages/vuu-utils/src/context-definitions/DataProvider.js.map +1 -0
  45. package/cjs/packages/vuu-utils/src/context-definitions/DataSourceProvider.js +33 -0
  46. package/cjs/packages/vuu-utils/src/context-definitions/DataSourceProvider.js.map +1 -0
  47. package/cjs/packages/vuu-utils/src/context-definitions/WorkspaceContext.js +20 -0
  48. package/cjs/packages/vuu-utils/src/context-definitions/WorkspaceContext.js.map +1 -0
  49. package/cjs/packages/vuu-utils/src/cookie-utils.js +10 -0
  50. package/cjs/packages/vuu-utils/src/cookie-utils.js.map +1 -0
  51. package/cjs/packages/vuu-utils/src/css-utils.js +9 -0
  52. package/cjs/packages/vuu-utils/src/css-utils.js.map +1 -0
  53. package/cjs/packages/vuu-utils/src/data-utils.js +81 -0
  54. package/cjs/packages/vuu-utils/src/data-utils.js.map +1 -0
  55. package/cjs/packages/vuu-utils/src/datasource/BaseDataSource.js +248 -0
  56. package/cjs/packages/vuu-utils/src/datasource/BaseDataSource.js.map +1 -0
  57. package/cjs/packages/vuu-utils/src/datasource/datasource-action-utils.js +14 -0
  58. package/cjs/packages/vuu-utils/src/datasource/datasource-action-utils.js.map +1 -0
  59. package/cjs/packages/vuu-utils/src/datasource/datasource-filter-utils.js +23 -0
  60. package/cjs/packages/vuu-utils/src/datasource/datasource-filter-utils.js.map +1 -0
  61. package/cjs/packages/vuu-utils/src/datasource/datasource-utils.js +207 -0
  62. package/cjs/packages/vuu-utils/src/datasource/datasource-utils.js.map +1 -0
  63. package/cjs/packages/vuu-utils/src/date/date-utils.js +10 -0
  64. package/cjs/packages/vuu-utils/src/date/date-utils.js.map +1 -0
  65. package/cjs/packages/vuu-utils/src/date/dateTimePattern.js +25 -0
  66. package/cjs/packages/vuu-utils/src/date/dateTimePattern.js.map +1 -0
  67. package/cjs/packages/vuu-utils/src/date/formatter.js +66 -0
  68. package/cjs/packages/vuu-utils/src/date/formatter.js.map +1 -0
  69. package/cjs/packages/vuu-utils/src/date/types.js +27 -0
  70. package/cjs/packages/vuu-utils/src/date/types.js.map +1 -0
  71. package/cjs/packages/vuu-utils/src/debug-utils.js +34 -0
  72. package/cjs/packages/vuu-utils/src/debug-utils.js.map +1 -0
  73. package/cjs/packages/vuu-utils/src/event-emitter.js +113 -0
  74. package/cjs/packages/vuu-utils/src/event-emitter.js.map +1 -0
  75. package/cjs/packages/vuu-utils/src/feature-utils.js +139 -0
  76. package/cjs/packages/vuu-utils/src/feature-utils.js.map +1 -0
  77. package/cjs/packages/vuu-utils/src/filters/filter-utils.js +136 -0
  78. package/cjs/packages/vuu-utils/src/filters/filter-utils.js.map +1 -0
  79. package/cjs/packages/vuu-utils/src/filters/filterAsQuery.js +76 -0
  80. package/cjs/packages/vuu-utils/src/filters/filterAsQuery.js.map +1 -0
  81. package/cjs/packages/vuu-utils/src/form-utils.js +48 -0
  82. package/cjs/packages/vuu-utils/src/form-utils.js.map +1 -0
  83. package/cjs/packages/vuu-utils/src/formatting-utils.js +68 -0
  84. package/cjs/packages/vuu-utils/src/formatting-utils.js.map +1 -0
  85. package/cjs/packages/vuu-utils/src/getUniqueId.js +6 -0
  86. package/cjs/packages/vuu-utils/src/getUniqueId.js.map +1 -0
  87. package/cjs/packages/vuu-utils/src/group-utils.js +27 -0
  88. package/cjs/packages/vuu-utils/src/group-utils.js.map +1 -0
  89. package/cjs/packages/vuu-utils/src/html-utils.js +162 -0
  90. package/cjs/packages/vuu-utils/src/html-utils.js.map +1 -0
  91. package/cjs/packages/vuu-utils/src/index.js +414 -0
  92. package/cjs/packages/vuu-utils/src/index.js.map +1 -0
  93. package/cjs/packages/vuu-utils/src/input-utils.js +10 -0
  94. package/cjs/packages/vuu-utils/src/input-utils.js.map +1 -0
  95. package/cjs/packages/vuu-utils/src/invariant.js +13 -0
  96. package/cjs/packages/vuu-utils/src/invariant.js.map +1 -0
  97. package/cjs/packages/vuu-utils/src/itemToString.js +23 -0
  98. package/cjs/packages/vuu-utils/src/itemToString.js.map +1 -0
  99. package/cjs/packages/vuu-utils/src/json-utils.js +103 -0
  100. package/cjs/packages/vuu-utils/src/json-utils.js.map +1 -0
  101. package/cjs/packages/vuu-utils/src/keyboard-utils.js +30 -0
  102. package/cjs/packages/vuu-utils/src/keyboard-utils.js.map +1 -0
  103. package/cjs/packages/vuu-utils/src/keyset.js +72 -0
  104. package/cjs/packages/vuu-utils/src/keyset.js.map +1 -0
  105. package/cjs/packages/vuu-utils/src/list-utils.js +11 -0
  106. package/cjs/packages/vuu-utils/src/list-utils.js.map +1 -0
  107. package/cjs/packages/vuu-utils/src/local-storage-utils.js +20 -0
  108. package/cjs/packages/vuu-utils/src/local-storage-utils.js.map +1 -0
  109. package/cjs/packages/vuu-utils/src/logging-utils.js +65 -0
  110. package/cjs/packages/vuu-utils/src/logging-utils.js.map +1 -0
  111. package/cjs/packages/vuu-utils/src/menu-utils.js +10 -0
  112. package/cjs/packages/vuu-utils/src/menu-utils.js.map +1 -0
  113. package/cjs/packages/vuu-utils/src/module-utils.js +6 -0
  114. package/cjs/packages/vuu-utils/src/module-utils.js.map +1 -0
  115. package/cjs/packages/vuu-utils/src/moving-window.js +103 -0
  116. package/cjs/packages/vuu-utils/src/moving-window.js.map +1 -0
  117. package/cjs/packages/vuu-utils/src/nanoid/index.js +22 -0
  118. package/cjs/packages/vuu-utils/src/nanoid/index.js.map +1 -0
  119. package/cjs/packages/vuu-utils/src/perf-utils.js +35 -0
  120. package/cjs/packages/vuu-utils/src/perf-utils.js.map +1 -0
  121. package/cjs/packages/vuu-utils/src/promise-utils.js +42 -0
  122. package/cjs/packages/vuu-utils/src/promise-utils.js.map +1 -0
  123. package/cjs/packages/vuu-utils/src/protocol-message-utils.js +86 -0
  124. package/cjs/packages/vuu-utils/src/protocol-message-utils.js.map +1 -0
  125. package/cjs/packages/vuu-utils/src/range-utils.js +152 -0
  126. package/cjs/packages/vuu-utils/src/range-utils.js.map +1 -0
  127. package/cjs/packages/vuu-utils/src/react-utils.js +36 -0
  128. package/cjs/packages/vuu-utils/src/react-utils.js.map +1 -0
  129. package/cjs/packages/vuu-utils/src/round-decimal.js +86 -0
  130. package/cjs/packages/vuu-utils/src/round-decimal.js.map +1 -0
  131. package/cjs/packages/vuu-utils/src/row-utils.js +44 -0
  132. package/cjs/packages/vuu-utils/src/row-utils.js.map +1 -0
  133. package/cjs/packages/vuu-utils/src/selection-utils.js +246 -0
  134. package/cjs/packages/vuu-utils/src/selection-utils.js.map +1 -0
  135. package/cjs/packages/vuu-utils/src/shell-layout-types.js +13 -0
  136. package/cjs/packages/vuu-utils/src/shell-layout-types.js.map +1 -0
  137. package/cjs/packages/vuu-utils/src/sort-utils.js +78 -0
  138. package/cjs/packages/vuu-utils/src/sort-utils.js.map +1 -0
  139. package/cjs/packages/vuu-utils/src/table-schema-utils.js +13 -0
  140. package/cjs/packages/vuu-utils/src/table-schema-utils.js.map +1 -0
  141. package/cjs/packages/vuu-utils/src/text-utils.js +21 -0
  142. package/cjs/packages/vuu-utils/src/text-utils.js.map +1 -0
  143. package/cjs/packages/vuu-utils/src/tree-utils.js +106 -0
  144. package/cjs/packages/vuu-utils/src/tree-utils.js.map +1 -0
  145. package/cjs/packages/vuu-utils/src/ts-utils.js +12 -0
  146. package/cjs/packages/vuu-utils/src/ts-utils.js.map +1 -0
  147. package/cjs/packages/vuu-utils/src/typeahead-utils.js +6 -0
  148. package/cjs/packages/vuu-utils/src/typeahead-utils.js.map +1 -0
  149. package/cjs/packages/vuu-utils/src/url-utils.js +21 -0
  150. package/cjs/packages/vuu-utils/src/url-utils.js.map +1 -0
  151. package/cjs/packages/vuu-utils/src/useId.js +9 -0
  152. package/cjs/packages/vuu-utils/src/useId.js.map +1 -0
  153. package/cjs/packages/vuu-utils/src/useLayoutEffectSkipFirst.js +17 -0
  154. package/cjs/packages/vuu-utils/src/useLayoutEffectSkipFirst.js.map +1 -0
  155. package/cjs/packages/vuu-utils/src/useStateRef.js +23 -0
  156. package/cjs/packages/vuu-utils/src/useStateRef.js.map +1 -0
  157. package/esm/node_modules/@dnd-kit/abstract/index.js +612 -0
  158. package/esm/node_modules/@dnd-kit/abstract/index.js.map +1 -0
  159. package/esm/node_modules/@dnd-kit/abstract/modifiers.js +82 -0
  160. package/esm/node_modules/@dnd-kit/abstract/modifiers.js.map +1 -0
  161. package/esm/node_modules/@dnd-kit/collision/dist/index.js +86 -0
  162. package/esm/node_modules/@dnd-kit/collision/dist/index.js.map +1 -0
  163. package/esm/node_modules/@dnd-kit/dom/index.js +1642 -0
  164. package/esm/node_modules/@dnd-kit/dom/index.js.map +1 -0
  165. package/esm/node_modules/@dnd-kit/dom/sortable.js +827 -0
  166. package/esm/node_modules/@dnd-kit/dom/sortable.js.map +1 -0
  167. package/esm/node_modules/@dnd-kit/dom/utilities.js +1344 -0
  168. package/esm/node_modules/@dnd-kit/dom/utilities.js.map +1 -0
  169. package/esm/node_modules/@dnd-kit/geometry/dist/index.js +303 -0
  170. package/esm/node_modules/@dnd-kit/geometry/dist/index.js.map +1 -0
  171. package/esm/node_modules/@dnd-kit/react/hooks.js +80 -0
  172. package/esm/node_modules/@dnd-kit/react/hooks.js.map +1 -0
  173. package/esm/node_modules/@dnd-kit/react/sortable.js +175 -0
  174. package/esm/node_modules/@dnd-kit/react/sortable.js.map +1 -0
  175. package/esm/node_modules/@dnd-kit/react/utilities.js +17 -0
  176. package/esm/node_modules/@dnd-kit/react/utilities.js.map +1 -0
  177. package/esm/node_modules/@dnd-kit/state/dist/index.js +259 -0
  178. package/esm/node_modules/@dnd-kit/state/dist/index.js.map +1 -0
  179. package/esm/node_modules/@preact/signals-core/dist/signals-core.js +4 -0
  180. package/esm/node_modules/@preact/signals-core/dist/signals-core.js.map +1 -0
  181. package/esm/packages/vuu-utils/src/DataWindow.js +74 -0
  182. package/esm/packages/vuu-utils/src/DataWindow.js.map +1 -0
  183. package/esm/packages/vuu-utils/src/ShellContext.js +10 -0
  184. package/esm/packages/vuu-utils/src/ShellContext.js.map +1 -0
  185. package/esm/packages/vuu-utils/src/ThemeProvider.js +78 -0
  186. package/esm/packages/vuu-utils/src/ThemeProvider.js.map +1 -0
  187. package/esm/packages/vuu-utils/src/array-utils.js +79 -0
  188. package/esm/packages/vuu-utils/src/array-utils.js.map +1 -0
  189. package/esm/packages/vuu-utils/src/box-utils.js +47 -0
  190. package/esm/packages/vuu-utils/src/box-utils.js.map +1 -0
  191. package/esm/packages/vuu-utils/src/column-utils.js +815 -0
  192. package/esm/packages/vuu-utils/src/column-utils.js.map +1 -0
  193. package/esm/packages/vuu-utils/src/common-types.js +13 -0
  194. package/esm/packages/vuu-utils/src/common-types.js.map +1 -0
  195. package/esm/packages/vuu-utils/src/component-registry.js +124 -0
  196. package/esm/packages/vuu-utils/src/component-registry.js.map +1 -0
  197. package/esm/packages/vuu-utils/src/context-definitions/DataContext.js +18 -0
  198. package/esm/packages/vuu-utils/src/context-definitions/DataContext.js.map +1 -0
  199. package/esm/packages/vuu-utils/src/context-definitions/DataProvider.js +20 -0
  200. package/esm/packages/vuu-utils/src/context-definitions/DataProvider.js.map +1 -0
  201. package/esm/packages/vuu-utils/src/context-definitions/DataSourceProvider.js +29 -0
  202. package/esm/packages/vuu-utils/src/context-definitions/DataSourceProvider.js.map +1 -0
  203. package/esm/packages/vuu-utils/src/context-definitions/WorkspaceContext.js +17 -0
  204. package/esm/packages/vuu-utils/src/context-definitions/WorkspaceContext.js.map +1 -0
  205. package/esm/packages/vuu-utils/src/cookie-utils.js +8 -0
  206. package/esm/packages/vuu-utils/src/cookie-utils.js.map +1 -0
  207. package/esm/packages/vuu-utils/src/css-utils.js +7 -0
  208. package/esm/packages/vuu-utils/src/css-utils.js.map +1 -0
  209. package/esm/packages/vuu-utils/src/data-utils.js +68 -0
  210. package/esm/packages/vuu-utils/src/data-utils.js.map +1 -0
  211. package/esm/packages/vuu-utils/src/datasource/BaseDataSource.js +246 -0
  212. package/esm/packages/vuu-utils/src/datasource/BaseDataSource.js.map +1 -0
  213. package/esm/packages/vuu-utils/src/datasource/datasource-action-utils.js +8 -0
  214. package/esm/packages/vuu-utils/src/datasource/datasource-action-utils.js.map +1 -0
  215. package/esm/packages/vuu-utils/src/datasource/datasource-filter-utils.js +21 -0
  216. package/esm/packages/vuu-utils/src/datasource/datasource-filter-utils.js.map +1 -0
  217. package/esm/packages/vuu-utils/src/datasource/datasource-utils.js +184 -0
  218. package/esm/packages/vuu-utils/src/datasource/datasource-utils.js.map +1 -0
  219. package/esm/packages/vuu-utils/src/date/date-utils.js +8 -0
  220. package/esm/packages/vuu-utils/src/date/date-utils.js.map +1 -0
  221. package/esm/packages/vuu-utils/src/date/dateTimePattern.js +21 -0
  222. package/esm/packages/vuu-utils/src/date/dateTimePattern.js.map +1 -0
  223. package/esm/packages/vuu-utils/src/date/formatter.js +63 -0
  224. package/esm/packages/vuu-utils/src/date/formatter.js.map +1 -0
  225. package/esm/packages/vuu-utils/src/date/types.js +21 -0
  226. package/esm/packages/vuu-utils/src/date/types.js.map +1 -0
  227. package/esm/packages/vuu-utils/src/debug-utils.js +32 -0
  228. package/esm/packages/vuu-utils/src/debug-utils.js.map +1 -0
  229. package/esm/packages/vuu-utils/src/event-emitter.js +111 -0
  230. package/esm/packages/vuu-utils/src/event-emitter.js.map +1 -0
  231. package/esm/packages/vuu-utils/src/feature-utils.js +125 -0
  232. package/esm/packages/vuu-utils/src/feature-utils.js.map +1 -0
  233. package/esm/packages/vuu-utils/src/filters/filter-utils.js +120 -0
  234. package/esm/packages/vuu-utils/src/filters/filter-utils.js.map +1 -0
  235. package/esm/packages/vuu-utils/src/filters/filterAsQuery.js +72 -0
  236. package/esm/packages/vuu-utils/src/filters/filterAsQuery.js.map +1 -0
  237. package/esm/packages/vuu-utils/src/form-utils.js +44 -0
  238. package/esm/packages/vuu-utils/src/form-utils.js.map +1 -0
  239. package/esm/packages/vuu-utils/src/formatting-utils.js +63 -0
  240. package/esm/packages/vuu-utils/src/formatting-utils.js.map +1 -0
  241. package/esm/packages/vuu-utils/src/getUniqueId.js +4 -0
  242. package/esm/packages/vuu-utils/src/getUniqueId.js.map +1 -0
  243. package/esm/packages/vuu-utils/src/group-utils.js +23 -0
  244. package/esm/packages/vuu-utils/src/group-utils.js.map +1 -0
  245. package/esm/packages/vuu-utils/src/html-utils.js +145 -0
  246. package/esm/packages/vuu-utils/src/html-utils.js.map +1 -0
  247. package/esm/packages/vuu-utils/src/index.js +70 -0
  248. package/esm/packages/vuu-utils/src/index.js.map +1 -0
  249. package/esm/packages/vuu-utils/src/input-utils.js +7 -0
  250. package/esm/packages/vuu-utils/src/input-utils.js.map +1 -0
  251. package/esm/packages/vuu-utils/src/invariant.js +11 -0
  252. package/esm/packages/vuu-utils/src/invariant.js.map +1 -0
  253. package/esm/packages/vuu-utils/src/itemToString.js +21 -0
  254. package/esm/packages/vuu-utils/src/itemToString.js.map +1 -0
  255. package/esm/packages/vuu-utils/src/json-utils.js +101 -0
  256. package/esm/packages/vuu-utils/src/json-utils.js.map +1 -0
  257. package/esm/packages/vuu-utils/src/keyboard-utils.js +16 -0
  258. package/esm/packages/vuu-utils/src/keyboard-utils.js.map +1 -0
  259. package/esm/packages/vuu-utils/src/keyset.js +70 -0
  260. package/esm/packages/vuu-utils/src/keyset.js.map +1 -0
  261. package/esm/packages/vuu-utils/src/list-utils.js +9 -0
  262. package/esm/packages/vuu-utils/src/list-utils.js.map +1 -0
  263. package/esm/packages/vuu-utils/src/local-storage-utils.js +16 -0
  264. package/esm/packages/vuu-utils/src/local-storage-utils.js.map +1 -0
  265. package/esm/packages/vuu-utils/src/logging-utils.js +61 -0
  266. package/esm/packages/vuu-utils/src/logging-utils.js.map +1 -0
  267. package/esm/packages/vuu-utils/src/menu-utils.js +6 -0
  268. package/esm/packages/vuu-utils/src/menu-utils.js.map +1 -0
  269. package/esm/packages/vuu-utils/src/module-utils.js +4 -0
  270. package/esm/packages/vuu-utils/src/module-utils.js.map +1 -0
  271. package/esm/packages/vuu-utils/src/moving-window.js +101 -0
  272. package/esm/packages/vuu-utils/src/moving-window.js.map +1 -0
  273. package/esm/packages/vuu-utils/src/nanoid/index.js +20 -0
  274. package/esm/packages/vuu-utils/src/nanoid/index.js.map +1 -0
  275. package/esm/packages/vuu-utils/src/perf-utils.js +32 -0
  276. package/esm/packages/vuu-utils/src/perf-utils.js.map +1 -0
  277. package/esm/packages/vuu-utils/src/promise-utils.js +40 -0
  278. package/esm/packages/vuu-utils/src/promise-utils.js.map +1 -0
  279. package/esm/packages/vuu-utils/src/protocol-message-utils.js +71 -0
  280. package/esm/packages/vuu-utils/src/protocol-message-utils.js.map +1 -0
  281. package/esm/packages/vuu-utils/src/range-utils.js +145 -0
  282. package/esm/packages/vuu-utils/src/range-utils.js.map +1 -0
  283. package/esm/packages/vuu-utils/src/react-utils.js +32 -0
  284. package/esm/packages/vuu-utils/src/react-utils.js.map +1 -0
  285. package/esm/packages/vuu-utils/src/round-decimal.js +84 -0
  286. package/esm/packages/vuu-utils/src/round-decimal.js.map +1 -0
  287. package/esm/packages/vuu-utils/src/row-utils.js +40 -0
  288. package/esm/packages/vuu-utils/src/row-utils.js.map +1 -0
  289. package/esm/packages/vuu-utils/src/selection-utils.js +236 -0
  290. package/esm/packages/vuu-utils/src/selection-utils.js.map +1 -0
  291. package/esm/packages/vuu-utils/src/shell-layout-types.js +11 -0
  292. package/esm/packages/vuu-utils/src/shell-layout-types.js.map +1 -0
  293. package/esm/packages/vuu-utils/src/sort-utils.js +73 -0
  294. package/esm/packages/vuu-utils/src/sort-utils.js.map +1 -0
  295. package/esm/packages/vuu-utils/src/table-schema-utils.js +11 -0
  296. package/esm/packages/vuu-utils/src/table-schema-utils.js.map +1 -0
  297. package/esm/packages/vuu-utils/src/text-utils.js +18 -0
  298. package/esm/packages/vuu-utils/src/text-utils.js.map +1 -0
  299. package/esm/packages/vuu-utils/src/tree-utils.js +100 -0
  300. package/esm/packages/vuu-utils/src/tree-utils.js.map +1 -0
  301. package/esm/packages/vuu-utils/src/ts-utils.js +8 -0
  302. package/esm/packages/vuu-utils/src/ts-utils.js.map +1 -0
  303. package/esm/packages/vuu-utils/src/typeahead-utils.js +4 -0
  304. package/esm/packages/vuu-utils/src/typeahead-utils.js.map +1 -0
  305. package/esm/packages/vuu-utils/src/url-utils.js +18 -0
  306. package/esm/packages/vuu-utils/src/url-utils.js.map +1 -0
  307. package/esm/packages/vuu-utils/src/useId.js +7 -0
  308. package/esm/packages/vuu-utils/src/useId.js.map +1 -0
  309. package/esm/packages/vuu-utils/src/useLayoutEffectSkipFirst.js +15 -0
  310. package/esm/packages/vuu-utils/src/useLayoutEffectSkipFirst.js.map +1 -0
  311. package/esm/packages/vuu-utils/src/useStateRef.js +21 -0
  312. package/esm/packages/vuu-utils/src/useStateRef.js.map +1 -0
  313. package/package.json +11 -8
  314. package/cjs/index.js +0 -9622
  315. package/cjs/index.js.map +0 -1
  316. package/esm/index.js +0 -9283
  317. package/esm/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sources":["../../../../../src/date/formatter.ts"],"sourcesContent":["import { DateFormatter } from \"@internationalized/date\";\nimport { isNotNullOrUndefined } from \"../ts-utils\";\nimport { DatePattern, DateTimePattern, TimePattern } from \"./types\";\n\ntype DateTimeFormatConfig = {\n locale: string;\n options: Intl.DateTimeFormatOptions;\n};\n\n// Time format config\nconst baseTimeFormatOptions: Intl.DateTimeFormatOptions = {\n hour: \"2-digit\",\n minute: \"2-digit\",\n second: \"2-digit\",\n};\nconst formatConfigByTimePatterns: Record<TimePattern, DateTimeFormatConfig> = {\n \"hh:mm:ss\": {\n locale: \"en-GB\",\n options: { ...baseTimeFormatOptions, hour12: false },\n },\n \"hh:mm:ss a\": {\n locale: \"en-GB\",\n options: { ...baseTimeFormatOptions, hour12: true },\n },\n};\n\n// Date format config\nconst baseDateFormatOptions: Intl.DateTimeFormatOptions = {\n day: \"2-digit\",\n month: \"2-digit\",\n year: \"numeric\",\n};\nconst formatConfigByDatePatterns: Record<DatePattern, DateTimeFormatConfig> = {\n \"dd.mm.yyyy\": {\n locale: \"de-De\",\n options: { ...baseDateFormatOptions },\n },\n \"dd/mm/yyyy\": { locale: \"en-GB\", options: { ...baseDateFormatOptions } },\n \"dd MMM yyyy\": {\n locale: \"en-GB\",\n options: { ...baseDateFormatOptions, month: \"short\" },\n },\n \"dd MMMM yyyy\": {\n locale: \"en-GB\",\n options: { ...baseDateFormatOptions, month: \"long\" },\n },\n \"mm/dd/yyyy\": { locale: \"en-US\", options: { ...baseDateFormatOptions } },\n \"MMM dd, yyyy\": {\n locale: \"en-US\",\n options: { ...baseDateFormatOptions, month: \"short\" },\n },\n \"MMMM dd, yyyy\": {\n locale: \"en-US\",\n options: { ...baseDateFormatOptions, month: \"long\" },\n },\n};\n\nfunction getFormatConfigs(pattern: DateTimePattern) {\n return [\n pattern.date ? formatConfigByDatePatterns[pattern.date] : null,\n pattern.time ? formatConfigByTimePatterns[pattern.time] : null,\n ];\n}\n\nexport function formatDate(pattern: DateTimePattern): (d: Date) => string {\n const formatters = getFormatConfigs(pattern)\n .filter(isNotNullOrUndefined)\n .map((c) => getDateFormatter(c.locale, c.options));\n\n return (d) => formatters.map((f) => f.format(d)).join(\" \");\n}\n\nexport function getDateFormatter(\n locale: string,\n options?: Intl.DateTimeFormatOptions\n) {\n return new DateFormatter(locale, options);\n}\n"],"names":[],"mappings":";;;AAUA,MAAM,qBAAoD,GAAA;AAAA,EACxD,IAAM,EAAA,SAAA;AAAA,EACN,MAAQ,EAAA,SAAA;AAAA,EACR,MAAQ,EAAA;AACV,CAAA;AACA,MAAM,0BAAwE,GAAA;AAAA,EAC5E,UAAY,EAAA;AAAA,IACV,MAAQ,EAAA,OAAA;AAAA,IACR,OAAS,EAAA,EAAE,GAAG,qBAAA,EAAuB,QAAQ,KAAM;AAAA,GACrD;AAAA,EACA,YAAc,EAAA;AAAA,IACZ,MAAQ,EAAA,OAAA;AAAA,IACR,OAAS,EAAA,EAAE,GAAG,qBAAA,EAAuB,QAAQ,IAAK;AAAA;AAEtD,CAAA;AAGA,MAAM,qBAAoD,GAAA;AAAA,EACxD,GAAK,EAAA,SAAA;AAAA,EACL,KAAO,EAAA,SAAA;AAAA,EACP,IAAM,EAAA;AACR,CAAA;AACA,MAAM,0BAAwE,GAAA;AAAA,EAC5E,YAAc,EAAA;AAAA,IACZ,MAAQ,EAAA,OAAA;AAAA,IACR,OAAA,EAAS,EAAE,GAAG,qBAAsB;AAAA,GACtC;AAAA,EACA,YAAA,EAAc,EAAE,MAAQ,EAAA,OAAA,EAAS,SAAS,EAAE,GAAG,uBAAwB,EAAA;AAAA,EACvE,aAAe,EAAA;AAAA,IACb,MAAQ,EAAA,OAAA;AAAA,IACR,OAAS,EAAA,EAAE,GAAG,qBAAA,EAAuB,OAAO,OAAQ;AAAA,GACtD;AAAA,EACA,cAAgB,EAAA;AAAA,IACd,MAAQ,EAAA,OAAA;AAAA,IACR,OAAS,EAAA,EAAE,GAAG,qBAAA,EAAuB,OAAO,MAAO;AAAA,GACrD;AAAA,EACA,YAAA,EAAc,EAAE,MAAQ,EAAA,OAAA,EAAS,SAAS,EAAE,GAAG,uBAAwB,EAAA;AAAA,EACvE,cAAgB,EAAA;AAAA,IACd,MAAQ,EAAA,OAAA;AAAA,IACR,OAAS,EAAA,EAAE,GAAG,qBAAA,EAAuB,OAAO,OAAQ;AAAA,GACtD;AAAA,EACA,eAAiB,EAAA;AAAA,IACf,MAAQ,EAAA,OAAA;AAAA,IACR,OAAS,EAAA,EAAE,GAAG,qBAAA,EAAuB,OAAO,MAAO;AAAA;AAEvD,CAAA;AAEA,SAAS,iBAAiB,OAA0B,EAAA;AAClD,EAAO,OAAA;AAAA,IACL,OAAQ,CAAA,IAAA,GAAO,0BAA2B,CAAA,OAAA,CAAQ,IAAI,CAAI,GAAA,IAAA;AAAA,IAC1D,OAAQ,CAAA,IAAA,GAAO,0BAA2B,CAAA,OAAA,CAAQ,IAAI,CAAI,GAAA;AAAA,GAC5D;AACF;AAEO,SAAS,WAAW,OAA+C,EAAA;AACxE,EAAA,MAAM,UAAa,GAAA,gBAAA,CAAiB,OAAO,CAAA,CACxC,OAAO,oBAAoB,CAAA,CAC3B,GAAI,CAAA,CAAC,MAAM,gBAAiB,CAAA,CAAA,CAAE,MAAQ,EAAA,CAAA,CAAE,OAAO,CAAC,CAAA;AAEnD,EAAA,OAAO,CAAC,CAAA,KAAM,UAAW,CAAA,GAAA,CAAI,CAAC,CAAA,KAAM,CAAE,CAAA,MAAA,CAAO,CAAC,CAAC,CAAE,CAAA,IAAA,CAAK,GAAG,CAAA;AAC3D;AAEgB,SAAA,gBAAA,CACd,QACA,OACA,EAAA;AACA,EAAO,OAAA,IAAI,aAAc,CAAA,MAAA,EAAQ,OAAO,CAAA;AAC1C;;;;"}
@@ -0,0 +1,21 @@
1
+ const supportedDatePatterns = [
2
+ "dd.mm.yyyy",
3
+ "dd/mm/yyyy",
4
+ "dd MMM yyyy",
5
+ "dd MMMM yyyy",
6
+ "mm/dd/yyyy",
7
+ "MMM dd, yyyy",
8
+ "MMMM dd, yyyy"
9
+ ];
10
+ const supportedTimePatterns = ["hh:mm:ss", "hh:mm:ss a"];
11
+ const supportedDateTimePatterns = {
12
+ date: supportedDatePatterns,
13
+ time: supportedTimePatterns
14
+ };
15
+ const dateTimeLabelByType = { date: "Date", time: "Time" };
16
+ const isDatePattern = (pattern) => supportedDatePatterns.includes(pattern);
17
+ const isTimePattern = (pattern) => supportedTimePatterns.includes(pattern);
18
+ const isDateTimePattern = (pattern) => isDatePattern(pattern?.date) || isTimePattern(pattern?.time);
19
+
20
+ export { dateTimeLabelByType, isDatePattern, isDateTimePattern, isTimePattern, supportedDateTimePatterns };
21
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sources":["../../../../../src/date/types.ts"],"sourcesContent":["import { ColumnTypeFormatting } from \"@vuu-ui/vuu-table-types\";\n\nconst supportedDatePatterns = [\n \"dd.mm.yyyy\",\n \"dd/mm/yyyy\",\n \"dd MMM yyyy\",\n \"dd MMMM yyyy\",\n \"mm/dd/yyyy\",\n \"MMM dd, yyyy\",\n \"MMMM dd, yyyy\",\n] as const;\n\nconst supportedTimePatterns = [\"hh:mm:ss\", \"hh:mm:ss a\"] as const;\n\nexport const supportedDateTimePatterns = {\n date: supportedDatePatterns,\n time: supportedTimePatterns,\n};\nexport const dateTimeLabelByType = { date: \"Date\", time: \"Time\" } as const;\n\nexport type DatePattern = (typeof supportedDatePatterns)[number];\nexport type TimePattern = (typeof supportedTimePatterns)[number];\n\nexport type DateTimePattern =\n | { date?: DatePattern; time: TimePattern }\n | { date: DatePattern; time?: TimePattern };\n\nexport const isDatePattern = (pattern?: string): pattern is DatePattern =>\n supportedDatePatterns.includes(pattern as DatePattern);\n\nexport const isTimePattern = (pattern?: string): pattern is TimePattern =>\n supportedTimePatterns.includes(pattern as TimePattern);\n\nexport const isDateTimePattern = (\n pattern?: ColumnTypeFormatting[\"pattern\"],\n): pattern is DateTimePattern =>\n isDatePattern(pattern?.date) || isTimePattern(pattern?.time);\n"],"names":[],"mappings":"AAEA,MAAM,qBAAwB,GAAA;AAAA,EAC5B,YAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA;AAEA,MAAM,qBAAA,GAAwB,CAAC,UAAA,EAAY,YAAY,CAAA;AAEhD,MAAM,yBAA4B,GAAA;AAAA,EACvC,IAAM,EAAA,qBAAA;AAAA,EACN,IAAM,EAAA;AACR;AACO,MAAM,mBAAsB,GAAA,EAAE,IAAM,EAAA,MAAA,EAAQ,MAAM,MAAO;AASzD,MAAM,aAAgB,GAAA,CAAC,OAC5B,KAAA,qBAAA,CAAsB,SAAS,OAAsB;AAEhD,MAAM,aAAgB,GAAA,CAAC,OAC5B,KAAA,qBAAA,CAAsB,SAAS,OAAsB;AAE1C,MAAA,iBAAA,GAAoB,CAC/B,OAEA,KAAA,aAAA,CAAc,SAAS,IAAI,CAAA,IAAK,aAAc,CAAA,OAAA,EAAS,IAAI;;;;"}
@@ -0,0 +1,32 @@
1
+ import { logger } from './logging-utils.js';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
5
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
6
+ const { debug, debugEnabled } = logger("range-monitor");
7
+ class RangeMonitor {
8
+ constructor(source) {
9
+ this.source = source;
10
+ __publicField(this, "range", { from: 0, to: 0 });
11
+ __publicField(this, "timestamp", 0);
12
+ }
13
+ isSet() {
14
+ return this.timestamp !== 0;
15
+ }
16
+ set({ from, to }) {
17
+ const { timestamp } = this;
18
+ this.range.from = from;
19
+ this.range.to = to;
20
+ this.timestamp = performance.now();
21
+ if (timestamp) {
22
+ debugEnabled && debug(
23
+ `<${this.source}> [${from}-${to}], ${(this.timestamp - timestamp).toFixed(0)} ms elapsed`
24
+ );
25
+ } else {
26
+ return 0;
27
+ }
28
+ }
29
+ }
30
+
31
+ export { RangeMonitor };
32
+ //# sourceMappingURL=debug-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-utils.js","sources":["../../../../src/debug-utils.ts"],"sourcesContent":["import { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { logger } from \"./logging-utils\";\n\nconst { debug, debugEnabled } = logger(\"range-monitor\");\n\nexport class RangeMonitor {\n public range: VuuRange = { from: 0, to: 0 };\n public timestamp = 0;\n\n constructor(private source: string) {}\n\n isSet() {\n return this.timestamp !== 0;\n }\n set({ from, to }: VuuRange) {\n const { timestamp } = this;\n this.range.from = from;\n this.range.to = to;\n this.timestamp = performance.now();\n if (timestamp) {\n debugEnabled &&\n debug(\n `<${this.source}> [${from}-${to}], ${(\n this.timestamp - timestamp\n ).toFixed(0)} ms elapsed`,\n );\n } else {\n return 0;\n }\n }\n}\n"],"names":[],"mappings":";;;;;AAGA,MAAM,EAAE,KAAA,EAAO,YAAa,EAAA,GAAI,OAAO,eAAe,CAAA;AAE/C,MAAM,YAAa,CAAA;AAAA,EAIxB,YAAoB,MAAgB,EAAA;AAAhB,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAHpB,IAAA,aAAA,CAAA,IAAA,EAAO,OAAkB,EAAA,EAAE,IAAM,EAAA,CAAA,EAAG,IAAI,CAAE,EAAA,CAAA;AAC1C,IAAA,aAAA,CAAA,IAAA,EAAO,WAAY,EAAA,CAAA,CAAA;AAAA;AAEkB,EAErC,KAAQ,GAAA;AACN,IAAA,OAAO,KAAK,SAAc,KAAA,CAAA;AAAA;AAC5B,EACA,GAAI,CAAA,EAAE,IAAM,EAAA,EAAA,EAAgB,EAAA;AAC1B,IAAM,MAAA,EAAE,WAAc,GAAA,IAAA;AACtB,IAAA,IAAA,CAAK,MAAM,IAAO,GAAA,IAAA;AAClB,IAAA,IAAA,CAAK,MAAM,EAAK,GAAA,EAAA;AAChB,IAAK,IAAA,CAAA,SAAA,GAAY,YAAY,GAAI,EAAA;AACjC,IAAA,IAAI,SAAW,EAAA;AACb,MACE,YAAA,IAAA,KAAA;AAAA,QACE,CAAI,CAAA,EAAA,IAAA,CAAK,MAAM,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAA,CAC7B,IAAK,CAAA,SAAA,GAAY,SACjB,EAAA,OAAA,CAAQ,CAAC,CAAC,CAAA,WAAA;AAAA,OACd;AAAA,KACG,MAAA;AACL,MAAO,OAAA,CAAA;AAAA;AACT;AAEJ;;;;"}
@@ -0,0 +1,111 @@
1
+ var __typeError = (msg) => {
2
+ throw TypeError(msg);
3
+ };
4
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
5
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
6
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
7
+ var _events;
8
+ function isArrayOfListeners(listeners) {
9
+ return Array.isArray(listeners);
10
+ }
11
+ function isOnlyListener(listeners) {
12
+ return !Array.isArray(listeners);
13
+ }
14
+ class EventEmitter {
15
+ constructor() {
16
+ __privateAdd(this, _events, /* @__PURE__ */ new Map());
17
+ }
18
+ addListener(event, listener) {
19
+ const listeners = __privateGet(this, _events).get(event);
20
+ if (!listeners) {
21
+ __privateGet(this, _events).set(event, listener);
22
+ } else if (isArrayOfListeners(listeners)) {
23
+ listeners.push(listener);
24
+ } else if (isOnlyListener(listeners)) {
25
+ __privateGet(this, _events).set(event, [listeners, listener]);
26
+ }
27
+ }
28
+ removeListener(event, listener) {
29
+ if (!__privateGet(this, _events).has(event)) {
30
+ return;
31
+ }
32
+ const listenerOrListeners = __privateGet(this, _events).get(event);
33
+ let position = -1;
34
+ if (listenerOrListeners === listener) {
35
+ __privateGet(this, _events).delete(event);
36
+ } else if (Array.isArray(listenerOrListeners)) {
37
+ for (let i = listenerOrListeners.length; i-- > 0; ) {
38
+ if (listenerOrListeners[i] === listener) {
39
+ position = i;
40
+ break;
41
+ }
42
+ }
43
+ if (position < 0) {
44
+ return;
45
+ }
46
+ if (listenerOrListeners.length === 1) {
47
+ listenerOrListeners.length = 0;
48
+ __privateGet(this, _events).delete(event);
49
+ } else {
50
+ listenerOrListeners.splice(position, 1);
51
+ }
52
+ }
53
+ }
54
+ removeAllListeners(event) {
55
+ if (event && __privateGet(this, _events).has(event)) {
56
+ __privateGet(this, _events).delete(event);
57
+ } else if (event === void 0) {
58
+ __privateGet(this, _events).clear();
59
+ }
60
+ }
61
+ emit(event, ...args) {
62
+ if (__privateGet(this, _events)) {
63
+ const handler = __privateGet(this, _events).get(event);
64
+ if (handler) {
65
+ this.invokeHandler(handler, args);
66
+ }
67
+ }
68
+ }
69
+ once(event, listener) {
70
+ const handler = (...args) => {
71
+ this.removeListener(event, handler);
72
+ listener(...args);
73
+ };
74
+ this.on(event, handler);
75
+ }
76
+ on(event, listener) {
77
+ this.addListener(event, listener);
78
+ }
79
+ hasListener(event, listener) {
80
+ const listeners = __privateGet(this, _events).get(event);
81
+ if (Array.isArray(listeners)) {
82
+ return listeners.includes(listener);
83
+ } else {
84
+ return listeners === listener;
85
+ }
86
+ }
87
+ invokeHandler(handler, args) {
88
+ if (isArrayOfListeners(handler)) {
89
+ handler.slice().forEach((listener) => this.invokeHandler(listener, args));
90
+ } else {
91
+ switch (args.length) {
92
+ case 0:
93
+ handler();
94
+ break;
95
+ case 1:
96
+ handler(args[0]);
97
+ break;
98
+ case 2:
99
+ handler(args[0], args[1]);
100
+ break;
101
+ // slower
102
+ default:
103
+ handler.call(null, ...args);
104
+ }
105
+ }
106
+ }
107
+ }
108
+ _events = new WeakMap();
109
+
110
+ export { EventEmitter };
111
+ //# sourceMappingURL=event-emitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-emitter.js","sources":["../../../../src/event-emitter.ts"],"sourcesContent":["type Listener = (...args: any[]) => void;\nexport type EmittedEvents = Record<string, Listener>;\n\nfunction isArrayOfListeners(\n listeners: EventListener | EventListener[],\n): listeners is EventListener[] {\n return Array.isArray(listeners);\n}\n\nfunction isOnlyListener(\n listeners: EventListener | EventListener[],\n): listeners is EventListener {\n return !Array.isArray(listeners);\n}\n\nexport interface IEventEmitter<Events extends EmittedEvents> {\n addListener<E extends keyof Events>(event: E, listener: Events[E]): void;\n emit<E extends keyof Events>(event: E, ...args: Parameters<Events[E]>): void;\n on<E extends keyof Events>(event: E, listener: Events[E]): void;\n removeListener<E extends keyof Events>(event: E, listener: Events[E]): void;\n removeAllListeners<E extends keyof Events>(event?: E): void;\n}\n\nexport class EventEmitter<Events extends EmittedEvents>\n implements IEventEmitter<Events>\n{\n #events: Map<keyof Events, Listener | Listener[]> = new Map();\n\n addListener<E extends keyof Events>(event: E, listener: Events[E]) {\n const listeners = this.#events.get(event);\n\n if (!listeners) {\n this.#events.set(event, listener);\n } else if (isArrayOfListeners(listeners)) {\n listeners.push(listener);\n } else if (isOnlyListener(listeners)) {\n this.#events.set(event, [listeners, listener]);\n }\n }\n\n removeListener<E extends keyof Events>(event: E, listener: Events[E]) {\n if (!this.#events.has(event)) {\n return;\n }\n\n const listenerOrListeners = this.#events.get(event);\n let position = -1;\n\n if (listenerOrListeners === listener) {\n this.#events.delete(event);\n } else if (Array.isArray(listenerOrListeners)) {\n for (let i = listenerOrListeners.length; i-- > 0; ) {\n if (listenerOrListeners[i] === listener) {\n position = i;\n break;\n }\n }\n\n if (position < 0) {\n return;\n }\n\n if (listenerOrListeners.length === 1) {\n listenerOrListeners.length = 0;\n this.#events.delete(event);\n } else {\n listenerOrListeners.splice(position, 1);\n }\n }\n }\n\n removeAllListeners<E extends keyof Events>(event?: E) {\n if (event && this.#events.has(event)) {\n this.#events.delete(event);\n } else if (event === undefined) {\n this.#events.clear();\n }\n }\n\n emit<E extends keyof Events>(event: E, ...args: Parameters<Events[E]>) {\n if (this.#events) {\n const handler = this.#events.get(event);\n if (handler) {\n this.invokeHandler(handler, args);\n }\n }\n }\n\n once<E extends keyof Events>(event: E, listener: Events[E]) {\n const handler = ((...args) => {\n this.removeListener(event, handler);\n listener(...args);\n }) as Events[E];\n\n this.on(event, handler);\n }\n\n on<E extends keyof Events>(event: E, listener: Events[E]) {\n this.addListener(event, listener);\n }\n\n hasListener<E extends keyof Events>(event: E, listener: Events[E]) {\n const listeners = this.#events.get(event);\n if (Array.isArray(listeners)) {\n return listeners.includes(listener);\n } else {\n return listeners === listener;\n }\n }\n\n private invokeHandler(handler: Listener | Array<Listener>, args: unknown[]) {\n if (isArrayOfListeners(handler)) {\n handler.slice().forEach((listener) => this.invokeHandler(listener, args));\n } else {\n switch (args.length) {\n case 0:\n handler();\n break;\n case 1:\n handler(args[0]);\n break;\n case 2:\n handler(args[0], args[1]);\n break;\n // slower\n default:\n handler.call(null, ...args);\n }\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ import { partition } from './array-utils.js';
2
+ import { wordify } from './text-utils.js';
3
+ import React from 'react';
4
+ import { getLayoutComponent } from './component-registry.js';
5
+
6
+ const env = process.env.NODE_ENV;
7
+ const isStaticFeature = (feature) => feature !== null && typeof feature === "object" && "type" in feature;
8
+ const isStaticFeatures = (features) => Array.isArray(features) && features.every(isStaticFeature);
9
+ function featureFromJson({ type }) {
10
+ const componentType = type.match(/^[a-z]/) ? type : getLayoutComponent(type);
11
+ if (componentType === void 0) {
12
+ throw Error(
13
+ `layoutUtils unable to create feature component from JSON, unknown type ${type}`
14
+ );
15
+ }
16
+ return React.createElement(componentType);
17
+ }
18
+ const isCustomFeature = (feature) => feature.leftNavLocation === "vuu-features";
19
+ const isWildcardSchema = (vuuTables) => vuuTables === "*";
20
+ const isVuuTables = (vuuTables) => Array.isArray(vuuTables);
21
+ const hasFilterTableFeatureProps = (props) => typeof props.ComponentProps === "object" && props.ComponentProps !== null && "tableSchema" in props.ComponentProps;
22
+ const isSameTable = (t1, t2) => {
23
+ t1.module === t2.module && t1.table == t2.table;
24
+ };
25
+ const byModule = (schema1, schema2) => {
26
+ const m1 = schema1.table.module.toLowerCase();
27
+ const m2 = schema2.table.module.toLowerCase();
28
+ if (m1 < m2) {
29
+ return -1;
30
+ } else if (m1 > m2) {
31
+ return 1;
32
+ } else if (schema1.table.table < schema2.table.table) {
33
+ return -1;
34
+ } else if (schema1.table.table > schema2.table.table) {
35
+ return 1;
36
+ } else {
37
+ return 0;
38
+ }
39
+ };
40
+ const getFilterTableFeatures = (schemas, getFeaturePath) => schemas.sort(byModule).map((schema) => ({
41
+ ...getFeaturePath({ env, fileName: "FilterTable" }),
42
+ ComponentProps: {
43
+ tableSchema: schema
44
+ },
45
+ ViewProps: {
46
+ allowRename: true
47
+ },
48
+ title: `${schema.table.module} ${schema.table.table}`
49
+ }));
50
+ const assertComponentRegistered = (componentName, component) => {
51
+ if (typeof component !== "function") {
52
+ console.warn(
53
+ `${componentName} module not loaded, will be unabale to deserialize from layout JSON`
54
+ );
55
+ }
56
+ };
57
+ const assertComponentsRegistered = (componentList) => {
58
+ for (const { componentName, component } of componentList) {
59
+ assertComponentRegistered(componentName, component);
60
+ }
61
+ };
62
+ const getCustomAndTableFeatures = (dynamicFeatures, tableSchemas) => {
63
+ const [customFeatureConfig, tableFeaturesConfig] = partition(
64
+ dynamicFeatures,
65
+ isCustomFeature
66
+ );
67
+ const customFeatures = [];
68
+ const tableFeatures = [];
69
+ for (const {
70
+ featureProps = {},
71
+ viewProps,
72
+ ...feature
73
+ } of tableFeaturesConfig) {
74
+ const { vuuTables } = featureProps;
75
+ if (isWildcardSchema(vuuTables)) {
76
+ if (tableSchemas) {
77
+ for (const tableSchema of tableSchemas) {
78
+ tableFeatures.push({
79
+ ...feature,
80
+ ComponentProps: {
81
+ tableSchema
82
+ },
83
+ title: `${tableSchema.table.module} ${wordify(
84
+ tableSchema.table.table
85
+ )}`,
86
+ ViewProps: {
87
+ ...viewProps,
88
+ allowRename: true
89
+ }
90
+ });
91
+ }
92
+ }
93
+ }
94
+ }
95
+ for (const {
96
+ featureProps = {},
97
+ viewProps,
98
+ ...feature
99
+ } of customFeatureConfig) {
100
+ const { vuuTables } = featureProps;
101
+ if (isVuuTables(vuuTables)) {
102
+ if (tableSchemas) {
103
+ customFeatures.push({
104
+ ...feature,
105
+ ComponentProps: vuuTables.reduce(
106
+ (map, vuuTable) => {
107
+ map[`${vuuTable.table}Schema`] = tableSchemas.find(
108
+ (tableSchema) => isSameTable(vuuTable, tableSchema.table)
109
+ );
110
+ return map;
111
+ },
112
+ {}
113
+ ),
114
+ ViewProps: viewProps
115
+ });
116
+ }
117
+ } else {
118
+ customFeatures.push(feature);
119
+ }
120
+ }
121
+ return { dynamicFeatures: customFeatures, tableFeatures };
122
+ };
123
+
124
+ export { assertComponentRegistered, assertComponentsRegistered, byModule, env, featureFromJson, getCustomAndTableFeatures, getFilterTableFeatures, hasFilterTableFeatureProps, isCustomFeature, isSameTable, isStaticFeatures, isVuuTables, isWildcardSchema };
125
+ //# sourceMappingURL=feature-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-utils.js","sources":["../../../../src/feature-utils.ts"],"sourcesContent":["import type { TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { ListOption } from \"@vuu-ui/vuu-table-types\";\nimport { partition } from \"./array-utils\";\nimport { wordify } from \"./text-utils\";\nimport React, { ReactElement } from \"react\";\nimport { getLayoutComponent } from \"./component-registry\";\n\nexport type PathMap = {\n [key: string]: Pick<DynamicFeatureDescriptor, \"css\" | \"url\">;\n};\nexport type Environment = \"development\" | \"production\";\nexport const env = process.env.NODE_ENV as Environment;\n\nexport type LookupTableProvider = (table: VuuTable) => ListOption[];\n\nexport interface ViewConfig {\n allowRename?: boolean;\n closeable?: boolean;\n header?: boolean;\n}\n\nexport interface DynamicFeatureProps<P extends object | undefined = object> {\n /**\n props that will be passed to the lazily loaded component.\n */\n ComponentProps?: P;\n ViewProps?: ViewConfig;\n css?: string;\n height?: number;\n title?: string;\n /** \n The url of javascript bundle to lazily load. Bundle must provide a default export\n and that export must be a React component.\n */\n url: string;\n width?: number;\n}\n\ndeclare global {\n const vuuConfig: Promise<VuuConfig>;\n}\n\nexport interface DynamicFeatureDescriptor {\n name: string;\n title: string;\n url: string;\n css?: string;\n leftNavLocation: \"vuu-features\" | \"vuu-tables\";\n featureProps?: {\n vuuTables?: \"*\" | VuuTable[];\n };\n viewProps?: ViewConfig;\n}\n\nexport interface StaticFeatureDescriptor {\n group?: string;\n label: string;\n type: string;\n}\n\nconst isStaticFeature = (\n feature: unknown,\n): feature is StaticFeatureDescriptor =>\n feature !== null && typeof feature === \"object\" && \"type\" in feature;\n\nexport const isStaticFeatures = (\n features: unknown,\n): features is StaticFeatureDescriptor[] =>\n Array.isArray(features) && features.every(isStaticFeature);\n\nexport interface FilterTableFeatureProps {\n tableSchema: TableSchema;\n}\n\nexport type DynamicFeatures = {\n [key: string]: DynamicFeatureDescriptor;\n};\n\nexport function featureFromJson({ type }: { type: string }): ReactElement {\n const componentType = type.match(/^[a-z]/) ? type : getLayoutComponent(type);\n if (componentType === undefined) {\n throw Error(\n `layoutUtils unable to create feature component from JSON, unknown type ${type}`,\n );\n }\n return React.createElement(componentType);\n}\n\nexport interface VuuConfig {\n features: DynamicFeatures;\n authUrl?: string;\n websocketUrl: string;\n ssl: boolean;\n}\n\n/**\n * We currently categorize 'features' simply by the leftNavLocation\n * @param feature\n * @returns\n */\nexport const isCustomFeature = (feature: DynamicFeatureDescriptor) =>\n feature.leftNavLocation === \"vuu-features\";\n\nexport const isWildcardSchema = (\n vuuTables?: \"*\" | VuuTable[],\n): vuuTables is \"*\" => vuuTables === \"*\";\nexport const isVuuTables = (\n vuuTables?: \"*\" | VuuTable[],\n): vuuTables is VuuTable[] => Array.isArray(vuuTables);\n\nexport interface FeaturePropsWithFilterTableFeature\n extends Omit<DynamicFeatureProps, \"ComponentProps\"> {\n ComponentProps: FilterTableFeatureProps;\n}\n\nexport const hasFilterTableFeatureProps = (\n props: DynamicFeatureProps,\n): props is FeaturePropsWithFilterTableFeature =>\n typeof props.ComponentProps === \"object\" &&\n props.ComponentProps !== null &&\n \"tableSchema\" in props.ComponentProps;\n\nexport const isSameTable = (t1: VuuTable, t2: VuuTable) => {\n t1.module === t2.module && t1.table == t2.table;\n};\n\n// Sort TableScheas by module\nexport const byModule = (schema1: TableSchema, schema2: TableSchema) => {\n const m1 = schema1.table.module.toLowerCase();\n const m2 = schema2.table.module.toLowerCase();\n if (m1 < m2) {\n return -1;\n } else if (m1 > m2) {\n return 1;\n } else if (schema1.table.table < schema2.table.table) {\n return -1;\n } else if (schema1.table.table > schema2.table.table) {\n return 1;\n } else {\n return 0;\n }\n};\n\nexport type GetFeaturePaths = (params: {\n env: Environment;\n fileName: string;\n withCss?: boolean;\n}) => DynamicFeatureProps;\n\nexport const getFilterTableFeatures = (\n schemas: TableSchema[],\n getFeaturePath: GetFeaturePaths,\n) =>\n schemas\n .sort(byModule)\n .map<DynamicFeatureProps<FilterTableFeatureProps>>((schema) => ({\n ...getFeaturePath({ env, fileName: \"FilterTable\" }),\n ComponentProps: {\n tableSchema: schema,\n },\n ViewProps: {\n allowRename: true,\n },\n title: `${schema.table.module} ${schema.table.table}`,\n }));\n\nexport type Component = {\n componentName: string;\n component: unknown;\n};\n\nexport const assertComponentRegistered = (\n componentName: string,\n component: unknown,\n) => {\n if (typeof component !== \"function\") {\n console.warn(\n `${componentName} module not loaded, will be unabale to deserialize from layout JSON`,\n );\n }\n};\n\nexport const assertComponentsRegistered = (componentList: Component[]) => {\n for (const { componentName, component } of componentList) {\n assertComponentRegistered(componentName, component);\n }\n};\n/**\n * Process the DynamicFeature descriptors. Identify\n * the vuu tables required and inject the appropriate TableSchemas\n *\n * @param dynamicFeatures\n * @param tableSchemas\n * @returns\n */\nexport const getCustomAndTableFeatures = (\n dynamicFeatures: DynamicFeatureDescriptor[],\n tableSchemas: TableSchema[],\n): {\n dynamicFeatures: DynamicFeatureProps[];\n tableFeatures: DynamicFeatureProps<FilterTableFeatureProps>[];\n} => {\n // Split features into simple tables and 'custom' features\n const [customFeatureConfig, tableFeaturesConfig] = partition(\n dynamicFeatures,\n isCustomFeature,\n );\n\n const customFeatures: DynamicFeatureProps[] = [];\n const tableFeatures: DynamicFeatureProps<FilterTableFeatureProps>[] = [];\n\n for (const {\n featureProps = {},\n viewProps,\n ...feature\n } of tableFeaturesConfig) {\n const { vuuTables } = featureProps;\n // Currently FilterTable is the only 'tableFeature' and it uses the wildcard\n if (isWildcardSchema(vuuTables)) {\n if (tableSchemas) {\n for (const tableSchema of tableSchemas) {\n tableFeatures.push({\n ...feature,\n ComponentProps: {\n tableSchema,\n },\n title: `${tableSchema.table.module} ${wordify(\n tableSchema.table.table,\n )}`,\n ViewProps: {\n ...viewProps,\n allowRename: true,\n },\n });\n }\n }\n } /*else if (isVuuTables(vuuTables) && tableSchemas) {\n const tableSchema = tableSchemas.find((tableSchema) =>\n isSameTable(vuuTable, tableSchema.table),\n );\n if (tableSchema) {\n tableFeatures.push({\n ...feature,\n ComponentProps: {\n tableSchema,\n },\n ViewProps: viewProps,\n });\n }\n }*/\n }\n\n for (const {\n featureProps = {},\n viewProps,\n ...feature\n } of customFeatureConfig) {\n const { vuuTables } = featureProps;\n if (isVuuTables(vuuTables)) {\n if (tableSchemas) {\n customFeatures.push({\n ...feature,\n ComponentProps: vuuTables.reduce<Record<string, TableSchema>>(\n (map, vuuTable) => {\n map[`${vuuTable.table}Schema`] = tableSchemas.find(\n (tableSchema) => isSameTable(vuuTable, tableSchema.table),\n ) as TableSchema;\n return map;\n },\n {},\n ),\n ViewProps: viewProps,\n });\n }\n } else {\n customFeatures.push(feature);\n }\n }\n return { dynamicFeatures: customFeatures, tableFeatures: tableFeatures };\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ import { EventEmitter } from '../event-emitter.js';
2
+ import { getTypedValue } from '../form-utils.js';
3
+
4
+ var __typeError = (msg) => {
5
+ throw TypeError(msg);
6
+ };
7
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
8
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
9
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
10
+ var _columns, _filters;
11
+ const singleValueFilterOps = /* @__PURE__ */ new Set([
12
+ "=",
13
+ "!=",
14
+ ">",
15
+ ">=",
16
+ "<",
17
+ "<=",
18
+ "contains",
19
+ "starts",
20
+ "ends"
21
+ ]);
22
+ const isValidFilterClauseOp = (op) => op === "in" || singleValueFilterOps.has(op);
23
+ const isNamedFilter = (f) => f !== void 0 && f.name !== void 0;
24
+ const isSingleValueFilter = (f) => f !== void 0 && singleValueFilterOps.has(f.op);
25
+ const isFilterClause = (f) => f !== void 0 && (isSingleValueFilter(f) || isMultiValueFilter(f));
26
+ const isMultiValueFilter = (f) => f !== void 0 && f.op === "in";
27
+ const isInFilter = (f) => f.op === "in";
28
+ const isAndFilter = (f) => f.op === "and";
29
+ const isOrFilter = (f) => f.op === "or";
30
+ const isCompleteFilter = (filter) => isSingleValueFilter(filter) && filter.column !== void 0 && filter.op !== void 0 && filter.value !== void 0;
31
+ function isMultiClauseFilter(f) {
32
+ return f !== void 0 && (f.op === "and" || f.op === "or");
33
+ }
34
+ const applyFilterToColumns = (columns, { filterStruct }) => columns.map((column) => {
35
+ const filter = extractFilterForColumn(filterStruct, column.name);
36
+ if (filter !== void 0) {
37
+ return {
38
+ ...column,
39
+ filter
40
+ };
41
+ } else if (column.filter) {
42
+ return {
43
+ ...column,
44
+ filter: void 0
45
+ };
46
+ } else {
47
+ return column;
48
+ }
49
+ });
50
+ const isFilteredColumn = (column) => column.filter !== void 0;
51
+ const stripFilterFromColumns = (columns) => columns.map((col) => {
52
+ const { filter, ...rest } = col;
53
+ return filter ? rest : col;
54
+ });
55
+ const extractFilterForColumn = (filter, columnName) => {
56
+ if (isMultiClauseFilter(filter)) {
57
+ return collectFiltersForColumn(filter, columnName);
58
+ }
59
+ if (isFilterClause(filter)) {
60
+ return filter.column === columnName ? filter : void 0;
61
+ }
62
+ return void 0;
63
+ };
64
+ const collectFiltersForColumn = (filter, columnName) => {
65
+ const { filters, op } = filter;
66
+ const results = [];
67
+ filters.forEach((filter2) => {
68
+ const ffc = extractFilterForColumn(filter2, columnName);
69
+ if (ffc) {
70
+ results.push(ffc);
71
+ }
72
+ });
73
+ if (results.length === 0) {
74
+ return void 0;
75
+ } else if (results.length === 1) {
76
+ return results[0];
77
+ }
78
+ return {
79
+ op,
80
+ filters: results
81
+ };
82
+ };
83
+ const createFilterClause = (column, value) => typeof value === "string" ? `${column} contains "${value}"` : `${column} = ${value}`;
84
+ class FilterAggregator extends EventEmitter {
85
+ constructor() {
86
+ super(...arguments);
87
+ __privateAdd(this, _columns, /* @__PURE__ */ new Map());
88
+ __privateAdd(this, _filters, /* @__PURE__ */ new Map());
89
+ }
90
+ addFilter(column, value) {
91
+ __privateGet(this, _columns).set(column.name, column);
92
+ const { serverDataType = "string" } = column;
93
+ const typedValue = getTypedValue(value.toString(), serverDataType, true);
94
+ __privateGet(this, _filters).set(column.name, typedValue);
95
+ }
96
+ removeFilter(column) {
97
+ if (__privateGet(this, _columns).has(column.name)) {
98
+ __privateGet(this, _columns).delete(column.name);
99
+ __privateGet(this, _filters).delete(column.name);
100
+ return true;
101
+ } else {
102
+ return false;
103
+ }
104
+ }
105
+ get filter() {
106
+ const { size } = __privateGet(this, _filters);
107
+ if (size === 0) {
108
+ return { filter: "" };
109
+ } else {
110
+ return {
111
+ filter: Array.from(__privateGet(this, _filters).entries()).map((args) => createFilterClause(...args)).join(" and ")
112
+ };
113
+ }
114
+ }
115
+ }
116
+ _columns = new WeakMap();
117
+ _filters = new WeakMap();
118
+
119
+ export { FilterAggregator, applyFilterToColumns, extractFilterForColumn, isAndFilter, isCompleteFilter, isFilterClause, isFilteredColumn, isInFilter, isMultiClauseFilter, isMultiValueFilter, isNamedFilter, isOrFilter, isSingleValueFilter, isValidFilterClauseOp, stripFilterFromColumns };
120
+ //# sourceMappingURL=filter-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filter-utils.js","sources":["../../../../../src/filters/filter-utils.ts"],"sourcesContent":["import type { DataSourceFilter } from \"@vuu-ui/vuu-data-types\";\nimport {\n AndFilter,\n Filter,\n FilterClauseOp,\n FilterWithPartialClause,\n MultiClauseFilter,\n MultiValueFilterClause,\n OrFilter,\n SingleValueFilterClause,\n SingleValueFilterClauseOp,\n} from \"@vuu-ui/vuu-filter-types\";\nimport {\n ColumnDescriptor,\n RuntimeColumnDescriptor,\n} from \"@vuu-ui/vuu-table-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { VuuFilter, VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { getTypedValue } from \"../form-utils\";\n\nconst singleValueFilterOps = new Set<SingleValueFilterClauseOp>([\n \"=\",\n \"!=\",\n \">\",\n \">=\",\n \"<\",\n \"<=\",\n \"contains\",\n \"starts\",\n \"ends\",\n]);\n\nexport const isValidFilterClauseOp = (op?: string): op is FilterClauseOp =>\n op === \"in\" || singleValueFilterOps.has(op as SingleValueFilterClauseOp);\n\nexport const isNamedFilter = (f?: Filter) =>\n f !== undefined && f.name !== undefined;\n\n// ... with type constraints\nexport const isSingleValueFilter = (\n f?: Partial<Filter>,\n): f is SingleValueFilterClause =>\n f !== undefined &&\n singleValueFilterOps.has(f.op as SingleValueFilterClauseOp);\n\nexport const isFilterClause = (\n f?: Partial<Filter>,\n): f is SingleValueFilterClause | MultiValueFilterClause =>\n f !== undefined && (isSingleValueFilter(f) || isMultiValueFilter(f));\n\nexport const isMultiValueFilter = (\n f?: Partial<Filter>,\n): f is MultiValueFilterClause => f !== undefined && f.op === \"in\";\n\nexport const isInFilter = (f: Partial<Filter>): f is MultiValueFilterClause =>\n f.op === \"in\";\nexport const isAndFilter = (f: Partial<Filter>): f is AndFilter =>\n f.op === \"and\";\nexport const isOrFilter = (f: Partial<Filter>): f is OrFilter => f.op === \"or\";\n\nexport const isCompleteFilter = (filter: Partial<Filter>): filter is Filter =>\n isSingleValueFilter(filter) &&\n filter.column !== undefined &&\n filter.op !== undefined &&\n filter.value !== undefined;\n\nexport function isMultiClauseFilter(\n f?: Partial<Filter> | FilterWithPartialClause,\n): f is MultiClauseFilter {\n return f !== undefined && (f.op === \"and\" || f.op === \"or\");\n}\n\nexport const applyFilterToColumns = (\n columns: RuntimeColumnDescriptor[],\n { filterStruct }: DataSourceFilter,\n) =>\n columns.map((column) => {\n // TODO this gives us a dependency on vuu-filters\n const filter = extractFilterForColumn(filterStruct, column.name);\n if (filter !== undefined) {\n return {\n ...column,\n filter,\n };\n } else if (column.filter) {\n return {\n ...column,\n filter: undefined,\n };\n } else {\n return column;\n }\n });\n\nexport const isFilteredColumn = (column: RuntimeColumnDescriptor) =>\n column.filter !== undefined;\n\nexport const stripFilterFromColumns = (columns: RuntimeColumnDescriptor[]) =>\n columns.map((col) => {\n const { filter, ...rest } = col;\n return filter ? rest : col;\n });\n\nexport const extractFilterForColumn = (\n filter: Filter | undefined,\n columnName: string,\n) => {\n if (isMultiClauseFilter(filter)) {\n return collectFiltersForColumn(filter, columnName);\n }\n if (isFilterClause(filter)) {\n return filter.column === columnName ? filter : undefined;\n }\n return undefined;\n};\n\nconst collectFiltersForColumn = (\n filter: MultiClauseFilter,\n columnName: string,\n) => {\n const { filters, op } = filter;\n const results: Filter[] = [];\n filters.forEach((filter) => {\n const ffc = extractFilterForColumn(filter, columnName);\n if (ffc) {\n results.push(ffc);\n }\n });\n if (results.length === 0) {\n return undefined;\n } else if (results.length === 1) {\n return results[0];\n }\n return {\n op,\n filters: results,\n };\n};\n\nexport type FilterEvents = {\n filter: (vuuFilter: VuuFilter) => void;\n};\n\nconst createFilterClause = (column: string, value: VuuRowDataItemType) =>\n typeof value === \"string\"\n ? `${column} contains \"${value}\"`\n : `${column} = ${value}`;\n\nexport class FilterAggregator extends EventEmitter<FilterEvents> {\n #columns = new Map<string, ColumnDescriptor>();\n #filters = new Map<string, VuuRowDataItemType>();\n\n addFilter(column: ColumnDescriptor, value: string | number) {\n this.#columns.set(column.name, column);\n const { serverDataType = \"string\" } = column;\n const typedValue = getTypedValue(value.toString(), serverDataType, true);\n\n this.#filters.set(column.name, typedValue);\n // this.emit(\"filter\", this.filter);\n }\n\n removeFilter(column: ColumnDescriptor) {\n if (this.#columns.has(column.name)) {\n this.#columns.delete(column.name);\n this.#filters.delete(column.name);\n return true;\n } else {\n return false;\n }\n }\n\n get filter(): VuuFilter {\n const { size } = this.#filters;\n if (size === 0) {\n return { filter: \"\" };\n } else {\n return {\n filter: Array.from(this.#filters.entries())\n .map((args) => createFilterClause(...args))\n .join(\" and \"),\n };\n }\n }\n}\n"],"names":["filter"],"mappings":";;;;;;;;;AAAA,IAAA,QAAA,EAAA,QAAA;AAoBA,MAAM,oBAAA,uBAA2B,GAA+B,CAAA;AAAA,EAC9D,GAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAA;AAAA,EACA,IAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAC,CAAA;AAEM,MAAM,wBAAwB,CAAC,EAAA,KACpC,OAAO,IAAQ,IAAA,oBAAA,CAAqB,IAAI,EAA+B;AAElE,MAAM,gBAAgB,CAAC,CAAA,KAC5B,CAAM,KAAA,KAAA,CAAA,IAAa,EAAE,IAAS,KAAA,KAAA;AAGnB,MAAA,mBAAA,GAAsB,CACjC,CAEA,KAAA,CAAA,KAAM,UACN,oBAAqB,CAAA,GAAA,CAAI,EAAE,EAA+B;AAE/C,MAAA,cAAA,GAAiB,CAC5B,CAEA,KAAA,CAAA,KAAM,WAAc,mBAAoB,CAAA,CAAC,CAAK,IAAA,kBAAA,CAAmB,CAAC,CAAA;AAE7D,MAAM,qBAAqB,CAChC,CAAA,KACgC,CAAM,KAAA,KAAA,CAAA,IAAa,EAAE,EAAO,KAAA;AAEvD,MAAM,UAAa,GAAA,CAAC,CACzB,KAAA,CAAA,CAAE,EAAO,KAAA;AACJ,MAAM,WAAc,GAAA,CAAC,CAC1B,KAAA,CAAA,CAAE,EAAO,KAAA;AACJ,MAAM,UAAa,GAAA,CAAC,CAAsC,KAAA,CAAA,CAAE,EAAO,KAAA;AAEnE,MAAM,gBAAmB,GAAA,CAAC,MAC/B,KAAA,mBAAA,CAAoB,MAAM,CAAA,IAC1B,MAAO,CAAA,MAAA,KAAW,KAClB,CAAA,IAAA,MAAA,CAAO,EAAO,KAAA,KAAA,CAAA,IACd,OAAO,KAAU,KAAA,KAAA;AAEZ,SAAS,oBACd,CACwB,EAAA;AACxB,EAAA,OAAO,MAAM,KAAc,CAAA,KAAA,CAAA,CAAE,EAAO,KAAA,KAAA,IAAS,EAAE,EAAO,KAAA,IAAA,CAAA;AACxD;AAEa,MAAA,oBAAA,GAAuB,CAClC,OACA,EAAA,EAAE,cAEF,KAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,MAAW,KAAA;AAEtB,EAAA,MAAM,MAAS,GAAA,sBAAA,CAAuB,YAAc,EAAA,MAAA,CAAO,IAAI,CAAA;AAC/D,EAAA,IAAI,WAAW,KAAW,CAAA,EAAA;AACxB,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH;AAAA,KACF;AAAA,GACF,MAAA,IAAW,OAAO,MAAQ,EAAA;AACxB,IAAO,OAAA;AAAA,MACL,GAAG,MAAA;AAAA,MACH,MAAQ,EAAA,KAAA;AAAA,KACV;AAAA,GACK,MAAA;AACL,IAAO,OAAA,MAAA;AAAA;AAEX,CAAC;AAEI,MAAM,gBAAmB,GAAA,CAAC,MAC/B,KAAA,MAAA,CAAO,MAAW,KAAA,KAAA;AAEb,MAAM,yBAAyB,CAAC,OAAA,KACrC,OAAQ,CAAA,GAAA,CAAI,CAAC,GAAQ,KAAA;AACnB,EAAA,MAAM,EAAE,MAAA,EAAQ,GAAG,IAAA,EAAS,GAAA,GAAA;AAC5B,EAAA,OAAO,SAAS,IAAO,GAAA,GAAA;AACzB,CAAC;AAEU,MAAA,sBAAA,GAAyB,CACpC,MAAA,EACA,UACG,KAAA;AACH,EAAI,IAAA,mBAAA,CAAoB,MAAM,CAAG,EAAA;AAC/B,IAAO,OAAA,uBAAA,CAAwB,QAAQ,UAAU,CAAA;AAAA;AAEnD,EAAI,IAAA,cAAA,CAAe,MAAM,CAAG,EAAA;AAC1B,IAAO,OAAA,MAAA,CAAO,MAAW,KAAA,UAAA,GAAa,MAAS,GAAA,KAAA,CAAA;AAAA;AAEjD,EAAO,OAAA,KAAA,CAAA;AACT;AAEA,MAAM,uBAAA,GAA0B,CAC9B,MAAA,EACA,UACG,KAAA;AACH,EAAM,MAAA,EAAE,OAAS,EAAA,EAAA,EAAO,GAAA,MAAA;AACxB,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAQ,OAAA,CAAA,OAAA,CAAQ,CAACA,OAAW,KAAA;AAC1B,IAAM,MAAA,GAAA,GAAM,sBAAuBA,CAAAA,OAAAA,EAAQ,UAAU,CAAA;AACrD,IAAA,IAAI,GAAK,EAAA;AACP,MAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAAA;AAClB,GACD,CAAA;AACD,EAAI,IAAA,OAAA,CAAQ,WAAW,CAAG,EAAA;AACxB,IAAO,OAAA,KAAA,CAAA;AAAA,GACT,MAAA,IAAW,OAAQ,CAAA,MAAA,KAAW,CAAG,EAAA;AAC/B,IAAA,OAAO,QAAQ,CAAC,CAAA;AAAA;AAElB,EAAO,OAAA;AAAA,IACL,EAAA;AAAA,IACA,OAAS,EAAA;AAAA,GACX;AACF,CAAA;AAMA,MAAM,kBAAqB,GAAA,CAAC,MAAgB,EAAA,KAAA,KAC1C,OAAO,KAAU,KAAA,QAAA,GACb,CAAG,EAAA,MAAM,cAAc,KAAK,CAAA,CAAA,CAAA,GAC5B,CAAG,EAAA,MAAM,MAAM,KAAK,CAAA,CAAA;AAEnB,MAAM,yBAAyB,YAA2B,CAAA;AAAA,EAA1D,WAAA,GAAA;AAAA,IAAA,KAAA,CAAA,GAAA,SAAA,CAAA;AACL,IAAA,YAAA,CAAA,IAAA,EAAA,QAAA,sBAAe,GAA8B,EAAA,CAAA;AAC7C,IAAA,YAAA,CAAA,IAAA,EAAA,QAAA,sBAAe,GAAgC,EAAA,CAAA;AAAA;AAAA,EAE/C,SAAA,CAAU,QAA0B,KAAwB,EAAA;AAC1D,IAAA,YAAA,CAAA,IAAA,EAAK,QAAS,CAAA,CAAA,GAAA,CAAI,MAAO,CAAA,IAAA,EAAM,MAAM,CAAA;AACrC,IAAM,MAAA,EAAE,cAAiB,GAAA,QAAA,EAAa,GAAA,MAAA;AACtC,IAAA,MAAM,aAAa,aAAc,CAAA,KAAA,CAAM,QAAS,EAAA,EAAG,gBAAgB,IAAI,CAAA;AAEvE,IAAA,YAAA,CAAA,IAAA,EAAK,QAAS,CAAA,CAAA,GAAA,CAAI,MAAO,CAAA,IAAA,EAAM,UAAU,CAAA;AAAA;AAE3C,EAEA,aAAa,MAA0B,EAAA;AACrC,IAAA,IAAI,YAAK,CAAA,IAAA,EAAA,QAAA,CAAA,CAAS,GAAI,CAAA,MAAA,CAAO,IAAI,CAAG,EAAA;AAClC,MAAK,YAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAS,MAAO,CAAA,MAAA,CAAO,IAAI,CAAA;AAChC,MAAK,YAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAS,MAAO,CAAA,MAAA,CAAO,IAAI,CAAA;AAChC,MAAO,OAAA,IAAA;AAAA,KACF,MAAA;AACL,MAAO,OAAA,KAAA;AAAA;AACT;AACF,EAEA,IAAI,MAAoB,GAAA;AACtB,IAAM,MAAA,EAAE,IAAK,EAAA,GAAI,YAAK,CAAA,IAAA,EAAA,QAAA,CAAA;AACtB,IAAA,IAAI,SAAS,CAAG,EAAA;AACd,MAAO,OAAA,EAAE,QAAQ,EAAG,EAAA;AAAA,KACf,MAAA;AACL,MAAO,OAAA;AAAA,QACL,QAAQ,KAAM,CAAA,IAAA,CAAK,YAAK,CAAA,IAAA,EAAA,QAAA,CAAA,CAAS,SAAS,CAAA,CACvC,GAAI,CAAA,CAAC,SAAS,kBAAmB,CAAA,GAAG,IAAI,CAAC,CAAA,CACzC,KAAK,OAAO;AAAA,OACjB;AAAA;AACF;AAEJ;AAlCE,QAAA,GAAA,IAAA,OAAA,EAAA;AACA,QAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
@@ -0,0 +1,72 @@
1
+ import { isDateTimeDataValue } from '../column-utils.js';
2
+ import { isMultiClauseFilter, isMultiValueFilter } from './filter-utils.js';
3
+
4
+ const filterValue = (value) => typeof value === "string" ? `"${value}"` : value;
5
+ const quotedStrings = (value) => typeof value === "string" ? `"${value}"` : value;
6
+ const removeOuterMostParentheses = (s) => s.replace(/^\((.*)\)$/, "$1");
7
+ const filterAsQuery = (f, opts) => {
8
+ return removeOuterMostParentheses(filterAsQueryCore(f, opts));
9
+ };
10
+ const filterAsQueryCore = (f, opts) => {
11
+ if (isMultiClauseFilter(f)) {
12
+ const multiClauseFilter = f.filters.map((filter) => filterAsQueryCore(filter, opts)).join(` ${f.op} `);
13
+ return `(${multiClauseFilter})`;
14
+ } else if (isMultiValueFilter(f)) {
15
+ return `${f.column} ${f.op} [${f.values.map(quotedStrings).join(",")}]`;
16
+ } else {
17
+ return singleValueFilterAsQuery(f, opts);
18
+ }
19
+ };
20
+ function singleValueFilterAsQuery(f, opts) {
21
+ const column = opts?.columnsByName?.[f.column];
22
+ if (column && isDateTimeDataValue(column)) {
23
+ return dateFilterAsQuery(f);
24
+ } else {
25
+ return defaultSingleValueFilterAsQuery(f);
26
+ }
27
+ }
28
+ const ONE_DAY_IN_MILIS = 1e3 * 60 * 60 * 24;
29
+ function dateFilterAsQuery(f) {
30
+ switch (f.op) {
31
+ case "=": {
32
+ const filters = [
33
+ { op: ">=", column: f.column, value: f.value },
34
+ {
35
+ op: "<",
36
+ column: f.column,
37
+ value: f.value + ONE_DAY_IN_MILIS
38
+ }
39
+ ];
40
+ return filterAsQueryCore({ op: "and", filters });
41
+ }
42
+ case "!=": {
43
+ const filters = [
44
+ { op: "<", column: f.column, value: f.value },
45
+ {
46
+ op: ">=",
47
+ column: f.column,
48
+ value: f.value + ONE_DAY_IN_MILIS
49
+ }
50
+ ];
51
+ return filterAsQueryCore({ op: "or", filters });
52
+ }
53
+ default:
54
+ return defaultSingleValueFilterAsQuery(f);
55
+ }
56
+ }
57
+ const defaultSingleValueFilterAsQuery = (f) => `${f.column} ${f.op} ${filterValue(f.value)}`;
58
+ const removeColumnFromFilter = (column, filter) => {
59
+ if (isMultiClauseFilter(filter)) {
60
+ const [clause1, clause2] = filter.filters;
61
+ if (clause1.column === column.name) {
62
+ return [clause2, filterAsQuery(clause2)];
63
+ }
64
+ if (clause2.column === column.name) {
65
+ return [clause1, filterAsQuery(clause1)];
66
+ }
67
+ }
68
+ return [void 0, ""];
69
+ };
70
+
71
+ export { dateFilterAsQuery, filterAsQuery, removeColumnFromFilter };
72
+ //# sourceMappingURL=filterAsQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filterAsQuery.js","sources":["../../../../../src/filters/filterAsQuery.ts"],"sourcesContent":["import {\n ColumnDescriptorsByName,\n Filter,\n SingleValueFilterClause,\n} from \"@vuu-ui/vuu-filter-types\";\nimport type { RuntimeColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport { isDateTimeDataValue } from \"../column-utils\";\nimport { isMultiClauseFilter, isMultiValueFilter } from \"./filter-utils\";\n\nconst filterValue = (value: string | number | boolean) =>\n typeof value === \"string\" ? `\"${value}\"` : value;\n\nconst quotedStrings = (value: string | number | boolean) =>\n typeof value === \"string\" ? `\"${value}\"` : value;\n\nconst removeOuterMostParentheses = (s: string) => s.replace(/^\\((.*)\\)$/, \"$1\");\n\nexport const filterAsQuery = (\n f: Filter,\n opts?: { columnsByName?: ColumnDescriptorsByName },\n): string => {\n return removeOuterMostParentheses(filterAsQueryCore(f, opts));\n};\n\nconst filterAsQueryCore = (\n f: Filter,\n opts?: { columnsByName?: ColumnDescriptorsByName },\n): string => {\n if (isMultiClauseFilter(f)) {\n const multiClauseFilter = f.filters\n .map((filter) => filterAsQueryCore(filter, opts))\n .join(` ${f.op} `);\n return `(${multiClauseFilter})`;\n } else if (isMultiValueFilter(f)) {\n return `${f.column} ${f.op} [${f.values.map(quotedStrings).join(\",\")}]`;\n } else {\n return singleValueFilterAsQuery(f, opts);\n }\n};\n\nfunction singleValueFilterAsQuery(\n f: SingleValueFilterClause,\n opts?: { columnsByName?: ColumnDescriptorsByName },\n): string {\n const column = opts?.columnsByName?.[f.column];\n if (column && isDateTimeDataValue(column)) {\n return dateFilterAsQuery(f as SingleValueFilterClause<number>);\n } else {\n return defaultSingleValueFilterAsQuery(f);\n }\n}\n\nconst ONE_DAY_IN_MILIS = 1000 * 60 * 60 * 24;\nexport function dateFilterAsQuery(f: SingleValueFilterClause<number>): string {\n switch (f.op) {\n case \"=\": {\n const filters: Array<Filter> = [\n { op: \">=\", column: f.column, value: f.value },\n {\n op: \"<\",\n column: f.column,\n value: f.value + ONE_DAY_IN_MILIS,\n },\n ];\n return filterAsQueryCore({ op: \"and\", filters });\n }\n case \"!=\": {\n const filters: Array<Filter> = [\n { op: \"<\", column: f.column, value: f.value },\n {\n op: \">=\",\n column: f.column,\n value: f.value + ONE_DAY_IN_MILIS,\n },\n ];\n return filterAsQueryCore({ op: \"or\", filters });\n }\n default:\n return defaultSingleValueFilterAsQuery(f);\n }\n}\n\nconst defaultSingleValueFilterAsQuery = (f: SingleValueFilterClause) =>\n `${f.column} ${f.op} ${filterValue(f.value)}`;\n\nexport const removeColumnFromFilter = (\n column: RuntimeColumnDescriptor,\n filter: Filter,\n): [Filter | undefined, string] => {\n if (isMultiClauseFilter(filter)) {\n const [clause1, clause2] = filter.filters;\n if (clause1.column === column.name) {\n return [clause2, filterAsQuery(clause2)];\n }\n if (clause2.column === column.name) {\n return [clause1, filterAsQuery(clause1)];\n }\n }\n return [undefined, \"\"];\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { queryClosest } from './html-utils.js';
2
+ import { stringIsValidDecimal, stringIsValidInt } from './data-utils.js';
3
+
4
+ const getFieldName = (target) => {
5
+ const saltFormField = queryClosest(target, "[data-field]");
6
+ const fieldName = saltFormField?.dataset.field;
7
+ if (fieldName) {
8
+ return fieldName;
9
+ } else {
10
+ throw Error("named form field not found");
11
+ }
12
+ };
13
+ const isNumber = (type, value) => type === "number";
14
+ function getTypedValue(value, type, throwIfInvalid = false) {
15
+ switch (type) {
16
+ case "int":
17
+ case "long": {
18
+ if (stringIsValidInt(value)) {
19
+ return parseInt(value, 10);
20
+ } else if (throwIfInvalid) {
21
+ throw Error(`value ${value} is not a valid ${type}`);
22
+ } else {
23
+ return void 0;
24
+ }
25
+ }
26
+ case "double":
27
+ case "number": {
28
+ if (stringIsValidDecimal(value)) {
29
+ return parseFloat(value);
30
+ } else if (throwIfInvalid) {
31
+ throw Error(`value ${value} is not a valid ${type}`);
32
+ } else {
33
+ return void 0;
34
+ }
35
+ }
36
+ case "boolean":
37
+ return value === "true" ? true : false;
38
+ default:
39
+ return value;
40
+ }
41
+ }
42
+
43
+ export { getFieldName, getTypedValue, isNumber };
44
+ //# sourceMappingURL=form-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-utils.js","sources":["../../../../src/form-utils.ts"],"sourcesContent":["import {\n VuuColumnDataType,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { KeyboardEvent, SyntheticEvent } from \"react\";\nimport { queryClosest } from \"./html-utils\";\nimport { stringIsValidDecimal, stringIsValidInt } from \"./data-utils\";\n\n/**\n * Use with the following convention:\n *\n * <FormField data-field=\"my-field-name\">\n */\nexport const getFieldName = (target: EventTarget | HTMLElement): string => {\n const saltFormField = queryClosest(target, \"[data-field]\") as HTMLElement;\n const fieldName = saltFormField?.dataset.field;\n if (fieldName) {\n return fieldName;\n } else {\n throw Error(\"named form field not found\");\n }\n};\n\nexport type InputSource = \"typeahead-suggestion\" | \"text-input\";\n\nexport const isNumber = (\n type: string,\n value: VuuRowDataItemType,\n): value is number => type === \"number\";\n\nexport type CommitHandler<\n E extends HTMLElement = HTMLInputElement,\n T extends VuuRowDataItemType = VuuRowDataItemType,\n> = (\n evt: SyntheticEvent<E> | KeyboardEvent<E>,\n value: T,\n source?: InputSource,\n) => void;\n\n/**\n * Convert a string value to the type appropriate for the associated\n * column or form field. Can be used when processing a string value\n * from an input used for user editing.\n *\n * @param value\n * @param type\n * @param throwIfInvalid\n */\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType | \"number\",\n throwIfInvalid?: false,\n): VuuRowDataItemType | undefined;\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType | \"number\",\n throwIfInvalid: true,\n): VuuRowDataItemType;\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType | \"number\",\n throwIfInvalid = false,\n): VuuRowDataItemType | undefined {\n switch (type) {\n case \"int\":\n case \"long\": {\n if (stringIsValidInt(value)) {\n return parseInt(value, 10);\n } else if (throwIfInvalid) {\n throw Error(`value ${value} is not a valid ${type}`);\n } else {\n return undefined;\n }\n }\n\n case \"double\":\n case \"number\": {\n if (stringIsValidDecimal(value)) {\n return parseFloat(value);\n } else if (throwIfInvalid) {\n throw Error(`value ${value} is not a valid ${type}`);\n } else {\n return undefined;\n }\n }\n\n case \"boolean\":\n return value === \"true\" ? true : false;\n default:\n return value;\n }\n}\n"],"names":[],"mappings":";;;AAaa,MAAA,YAAA,GAAe,CAAC,MAA8C,KAAA;AACzE,EAAM,MAAA,aAAA,GAAgB,YAAa,CAAA,MAAA,EAAQ,cAAc,CAAA;AACzD,EAAM,MAAA,SAAA,GAAY,eAAe,OAAQ,CAAA,KAAA;AACzC,EAAA,IAAI,SAAW,EAAA;AACb,IAAO,OAAA,SAAA;AAAA,GACF,MAAA;AACL,IAAA,MAAM,MAAM,4BAA4B,CAAA;AAAA;AAE5C;AAIO,MAAM,QAAW,GAAA,CACtB,IACA,EAAA,KAAA,KACoB,IAAS,KAAA;AA8BxB,SAAS,aACd,CAAA,KAAA,EACA,IACA,EAAA,cAAA,GAAiB,KACe,EAAA;AAChC,EAAA,QAAQ,IAAM;AAAA,IACZ,KAAK,KAAA;AAAA,IACL,KAAK,MAAQ,EAAA;AACX,MAAI,IAAA,gBAAA,CAAiB,KAAK,CAAG,EAAA;AAC3B,QAAO,OAAA,QAAA,CAAS,OAAO,EAAE,CAAA;AAAA,iBAChB,cAAgB,EAAA;AACzB,QAAA,MAAM,KAAM,CAAA,CAAA,MAAA,EAAS,KAAK,CAAA,gBAAA,EAAmB,IAAI,CAAE,CAAA,CAAA;AAAA,OAC9C,MAAA;AACL,QAAO,OAAA,KAAA,CAAA;AAAA;AACT;AACF,IAEA,KAAK,QAAA;AAAA,IACL,KAAK,QAAU,EAAA;AACb,MAAI,IAAA,oBAAA,CAAqB,KAAK,CAAG,EAAA;AAC/B,QAAA,OAAO,WAAW,KAAK,CAAA;AAAA,iBACd,cAAgB,EAAA;AACzB,QAAA,MAAM,KAAM,CAAA,CAAA,MAAA,EAAS,KAAK,CAAA,gBAAA,EAAmB,IAAI,CAAE,CAAA,CAAA;AAAA,OAC9C,MAAA;AACL,QAAO,OAAA,KAAA,CAAA;AAAA;AACT;AACF,IAEA,KAAK,SAAA;AACH,MAAO,OAAA,KAAA,KAAU,SAAS,IAAO,GAAA,KAAA;AAAA,IACnC;AACE,MAAO,OAAA,KAAA;AAAA;AAEb;;;;"}