@hexclave/shared 1.0.41 → 1.0.43

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 (1067) hide show
  1. package/dist/admin-interface-Bv8rBJo-.d.ts +379 -0
  2. package/dist/admin-interface-Bv8rBJo-.d.ts.map +1 -0
  3. package/dist/admin-metrics-DyW8_G82.d.ts +807 -0
  4. package/dist/admin-metrics-DyW8_G82.d.ts.map +1 -0
  5. package/dist/ai/image-limits.d.ts.map +1 -1
  6. package/dist/ai/image-limits.js +6 -7
  7. package/dist/ai/image-limits.js.map +1 -1
  8. package/dist/ai/llms/llms.d.ts.map +1 -1
  9. package/dist/ai/llms/llms.js +2 -4
  10. package/dist/ai/llms/llms.js.map +1 -1
  11. package/dist/ai/unified-prompts/reminders.js +2 -4
  12. package/dist/ai/unified-prompts/reminders.js.map +1 -1
  13. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
  14. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +2 -5
  15. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
  16. package/dist/ai/unified-prompts/skill-site-prompt-parts/brain.js +3 -6
  17. package/dist/ai/unified-prompts/skill-site-prompt-parts/brain.js.map +1 -1
  18. package/dist/ai/unified-prompts/skill-site-prompt-parts/cli-help.js +3 -6
  19. package/dist/ai/unified-prompts/skill-site-prompt-parts/cli-help.js.map +1 -1
  20. package/dist/ai/unified-prompts/skill-site-prompt-parts/config-docs.js +3 -6
  21. package/dist/ai/unified-prompts/skill-site-prompt-parts/config-docs.js.map +1 -1
  22. package/dist/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js +3 -6
  23. package/dist/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js.map +1 -1
  24. package/dist/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js +3 -6
  25. package/dist/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js.map +1 -1
  26. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -1
  27. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +5 -6
  28. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -1
  29. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +1 -2
  30. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -1
  31. package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js +3 -6
  32. package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js.map +1 -1
  33. package/dist/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js +3 -6
  34. package/dist/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js.map +1 -1
  35. package/dist/ai/unified-prompts/skill-site-prompt.d.ts.map +1 -1
  36. package/dist/ai/unified-prompts/skill-site-prompt.js +2 -4
  37. package/dist/ai/unified-prompts/skill-site-prompt.js.map +1 -1
  38. package/dist/analytics-IjkAsefy.d.ts +14 -0
  39. package/dist/analytics-IjkAsefy.d.ts.map +1 -0
  40. package/dist/apps/apps-config.d.ts.map +1 -1
  41. package/dist/apps/apps-config.js +2 -3
  42. package/dist/apps/apps-config.js.map +1 -1
  43. package/dist/apps/apps-ui.d.ts +1 -2
  44. package/dist/apps/apps-ui.d.ts.map +1 -1
  45. package/dist/apps/apps-ui.js +4 -5
  46. package/dist/apps/apps-ui.js.map +1 -1
  47. package/dist/client-interface-CGrvUtX0.d.ts +447 -0
  48. package/dist/client-interface-CGrvUtX0.d.ts.map +1 -0
  49. package/dist/config/db-sync-mappings.js +2 -3
  50. package/dist/config/db-sync-mappings.js.map +1 -1
  51. package/dist/config/format.d.ts +2 -61
  52. package/dist/config/format.js +2 -192
  53. package/dist/config/format.js.map +1 -1
  54. package/dist/config/migrate-catalogs-to-product-lines.d.ts.map +1 -1
  55. package/dist/config/migrate-catalogs-to-product-lines.js +2 -196
  56. package/dist/config/migrate-catalogs-to-product-lines.js.map +1 -1
  57. package/dist/config/schema-fuzzer.test.js +18 -172
  58. package/dist/config/schema-fuzzer.test.js.map +1 -1
  59. package/dist/config/schema.d.ts +2 -2328
  60. package/dist/config/schema.js +6 -351
  61. package/dist/config/schema.js.map +1 -1
  62. package/dist/config-authoring.d.ts +1 -1
  63. package/dist/config-authoring.d.ts.map +1 -1
  64. package/dist/config-authoring.js +2 -3
  65. package/dist/config-authoring.js.map +1 -1
  66. package/dist/config-authoring.test.js +1 -3
  67. package/dist/config-authoring.test.js.map +1 -1
  68. package/dist/config-eval.d.ts.map +1 -1
  69. package/dist/config-eval.js +4 -46
  70. package/dist/config-eval.js.map +1 -1
  71. package/dist/config-rendering.d.ts.map +1 -1
  72. package/dist/config-rendering.js +2 -48
  73. package/dist/config-rendering.js.map +1 -1
  74. package/dist/connected-accounts-D5CKe50A.d.ts +67 -0
  75. package/dist/connected-accounts-D5CKe50A.d.ts.map +1 -0
  76. package/dist/contact-channels-DW8yQxlc.d.ts +180 -0
  77. package/dist/contact-channels-DW8yQxlc.d.ts.map +1 -0
  78. package/dist/country-codes-CRWDroBE.d.ts +11 -0
  79. package/dist/country-codes-CRWDroBE.d.ts.map +1 -0
  80. package/dist/crud-CqmEW9s6.d.ts +98 -0
  81. package/dist/crud-CqmEW9s6.d.ts.map +1 -0
  82. package/dist/crud.d.ts +2 -98
  83. package/dist/crud.js +3 -71
  84. package/dist/crud.js.map +1 -1
  85. package/dist/currency-constants-Cq_q8twn.d.ts +45 -0
  86. package/dist/currency-constants-Cq_q8twn.d.ts.map +1 -0
  87. package/dist/current-user-Dvf8Ttjo.d.ts +284 -0
  88. package/dist/current-user-Dvf8Ttjo.d.ts.map +1 -0
  89. package/dist/dates-B6ne9iOR.d.ts +23 -0
  90. package/dist/dates-B6ne9iOR.d.ts.map +1 -0
  91. package/dist/email-outbox-BVqBaXpn.d.ts +1464 -0
  92. package/dist/{interface/crud/email-outbox.d.ts.map → email-outbox-BVqBaXpn.d.ts.map} +1 -1
  93. package/dist/emails-Ba4yEaCS.d.ts +40 -0
  94. package/dist/emails-Ba4yEaCS.d.ts.map +1 -0
  95. package/dist/errors-Cl-RUyed.d.ts +238 -0
  96. package/dist/errors-Cl-RUyed.d.ts.map +1 -0
  97. package/dist/esm/ai/image-limits.d.ts.map +1 -1
  98. package/dist/esm/ai/image-limits.js +5 -5
  99. package/dist/esm/ai/image-limits.js.map +1 -1
  100. package/dist/esm/ai/llms/llms.d.ts +1 -1
  101. package/dist/esm/ai/llms/llms.d.ts.map +1 -1
  102. package/dist/esm/ai/llms/llms.js +1 -2
  103. package/dist/esm/ai/llms/llms.js.map +1 -1
  104. package/dist/esm/ai/unified-prompts/reminders.js +1 -2
  105. package/dist/esm/ai/unified-prompts/reminders.js.map +1 -1
  106. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
  107. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +25 -28
  108. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
  109. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/brain.js +1 -2
  110. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/brain.js.map +1 -1
  111. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/cli-help.js +1 -2
  112. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/cli-help.js.map +1 -1
  113. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/config-docs.js +1 -2
  114. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/config-docs.js.map +1 -1
  115. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js +1 -2
  116. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js.map +1 -1
  117. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js +1 -2
  118. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js.map +1 -1
  119. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -1
  120. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +2 -3
  121. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -1
  122. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +1 -1
  123. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -1
  124. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js +1 -2
  125. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js.map +1 -1
  126. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js +1 -2
  127. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js.map +1 -1
  128. package/dist/esm/ai/unified-prompts/skill-site-prompt.d.ts.map +1 -1
  129. package/dist/esm/ai/unified-prompts/skill-site-prompt.js +1 -2
  130. package/dist/esm/ai/unified-prompts/skill-site-prompt.js.map +1 -1
  131. package/dist/esm/apps/apps-config.d.ts.map +1 -1
  132. package/dist/esm/apps/apps-config.js +1 -1
  133. package/dist/esm/apps/apps-config.js.map +1 -1
  134. package/dist/esm/apps/apps-ui.d.ts +2 -3
  135. package/dist/esm/apps/apps-ui.d.ts.map +1 -1
  136. package/dist/esm/apps/apps-ui.js +2 -3
  137. package/dist/esm/apps/apps-ui.js.map +1 -1
  138. package/dist/esm/config/db-sync-mappings.js +1 -1
  139. package/dist/esm/config/db-sync-mappings.js.map +1 -1
  140. package/dist/esm/config/format.d.ts +1 -1
  141. package/dist/esm/config/format.d.ts.map +1 -1
  142. package/dist/esm/config/format.js +1 -190
  143. package/dist/esm/config/format.js.map +1 -1
  144. package/dist/esm/config/migrate-catalogs-to-product-lines.d.ts.map +1 -1
  145. package/dist/esm/config/migrate-catalogs-to-product-lines.js +1 -194
  146. package/dist/esm/config/migrate-catalogs-to-product-lines.js.map +1 -1
  147. package/dist/esm/config/schema-fuzzer.test.js +20 -173
  148. package/dist/esm/config/schema-fuzzer.test.js.map +1 -1
  149. package/dist/esm/config/schema.d.ts +249 -250
  150. package/dist/esm/config/schema.d.ts.map +1 -1
  151. package/dist/esm/config/schema.js +2 -347
  152. package/dist/esm/config/schema.js.map +1 -1
  153. package/dist/esm/config-authoring.d.ts +1 -1
  154. package/dist/esm/config-authoring.d.ts.map +1 -1
  155. package/dist/esm/config-authoring.js +1 -1
  156. package/dist/esm/config-authoring.js.map +1 -1
  157. package/dist/esm/config-authoring.test.js +2 -3
  158. package/dist/esm/config-authoring.test.js.map +1 -1
  159. package/dist/esm/config-eval.d.ts +1 -1
  160. package/dist/esm/config-eval.d.ts.map +1 -1
  161. package/dist/esm/config-eval.js +1 -43
  162. package/dist/esm/config-eval.js.map +1 -1
  163. package/dist/esm/config-rendering.d.ts.map +1 -1
  164. package/dist/esm/config-rendering.js +1 -46
  165. package/dist/esm/config-rendering.js.map +1 -1
  166. package/dist/esm/crud.d.ts +1 -1
  167. package/dist/esm/crud.d.ts.map +1 -1
  168. package/dist/esm/crud.js +2 -69
  169. package/dist/esm/crud.js.map +1 -1
  170. package/dist/esm/helpers/emails.js +1 -2
  171. package/dist/esm/helpers/emails.js.map +1 -1
  172. package/dist/esm/helpers/init-prompt.d.ts.map +1 -1
  173. package/dist/esm/helpers/init-prompt.js +1 -2
  174. package/dist/esm/helpers/init-prompt.js.map +1 -1
  175. package/dist/esm/helpers/password.d.ts +1 -1
  176. package/dist/esm/helpers/password.d.ts.map +1 -1
  177. package/dist/esm/helpers/password.js +1 -2
  178. package/dist/esm/helpers/password.js.map +1 -1
  179. package/dist/esm/helpers/production-mode.d.ts +1 -1
  180. package/dist/esm/helpers/production-mode.d.ts.map +1 -1
  181. package/dist/esm/helpers/production-mode.js +1 -2
  182. package/dist/esm/helpers/production-mode.js.map +1 -1
  183. package/dist/esm/helpers/support-sla.d.ts.map +1 -1
  184. package/dist/esm/helpers/support-sla.js +1 -1
  185. package/dist/esm/helpers/support-sla.js.map +1 -1
  186. package/dist/esm/helpers/support-sla.test.js +2 -3
  187. package/dist/esm/helpers/support-sla.test.js.map +1 -1
  188. package/dist/esm/helpers/vault/client-side.d.ts.map +1 -1
  189. package/dist/esm/helpers/vault/client-side.js +1 -20
  190. package/dist/esm/helpers/vault/client-side.js.map +1 -1
  191. package/dist/esm/helpers/vault/server-side.js +1 -2
  192. package/dist/esm/helpers/vault/server-side.js.map +1 -1
  193. package/dist/esm/hooks/use-async-callback.d.ts.map +1 -1
  194. package/dist/esm/hooks/use-async-callback.js +1 -2
  195. package/dist/esm/hooks/use-async-callback.js.map +1 -1
  196. package/dist/esm/hooks/use-async-external-store.d.ts +1 -1
  197. package/dist/esm/hooks/use-async-external-store.d.ts.map +1 -1
  198. package/dist/esm/hooks/use-async-external-store.js +1 -2
  199. package/dist/esm/hooks/use-async-external-store.js.map +1 -1
  200. package/dist/esm/hooks/use-hash.js +1 -2
  201. package/dist/esm/hooks/use-hash.js.map +1 -1
  202. package/dist/esm/hooks/use-hover.d.ts.map +1 -1
  203. package/dist/esm/hooks/use-hover.js +1 -2
  204. package/dist/esm/hooks/use-hover.js.map +1 -1
  205. package/dist/esm/hooks/use-strict-memo.d.ts.map +1 -1
  206. package/dist/esm/hooks/use-strict-memo.js +1 -70
  207. package/dist/esm/hooks/use-strict-memo.js.map +1 -1
  208. package/dist/esm/index.d.ts +4 -4
  209. package/dist/esm/index.js +1 -2
  210. package/dist/esm/interface/admin-interface.d.ts +19 -19
  211. package/dist/esm/interface/admin-interface.d.ts.map +1 -1
  212. package/dist/esm/interface/admin-interface.js +1 -2
  213. package/dist/esm/interface/admin-interface.js.map +1 -1
  214. package/dist/esm/interface/admin-metrics.d.ts +11 -11
  215. package/dist/esm/interface/admin-metrics.d.ts.map +1 -1
  216. package/dist/esm/interface/admin-metrics.js +1 -2
  217. package/dist/esm/interface/admin-metrics.js.map +1 -1
  218. package/dist/esm/interface/client-interface.d.ts +22 -22
  219. package/dist/esm/interface/client-interface.d.ts.map +1 -1
  220. package/dist/esm/interface/client-interface.js +31 -15
  221. package/dist/esm/interface/client-interface.js.map +1 -1
  222. package/dist/esm/interface/client-interface.test.js +84 -13
  223. package/dist/esm/interface/client-interface.test.js.map +1 -1
  224. package/dist/esm/interface/conversations.d.ts +33 -33
  225. package/dist/esm/interface/conversations.d.ts.map +1 -1
  226. package/dist/esm/interface/conversations.js +1 -2
  227. package/dist/esm/interface/conversations.js.map +1 -1
  228. package/dist/esm/interface/crud/analytics.d.ts.map +1 -1
  229. package/dist/esm/interface/crud/analytics.js +1 -1
  230. package/dist/esm/interface/crud/connected-accounts.d.ts +15 -17
  231. package/dist/esm/interface/crud/connected-accounts.d.ts.map +1 -1
  232. package/dist/esm/interface/crud/connected-accounts.js +1 -2
  233. package/dist/esm/interface/crud/connected-accounts.js.map +1 -1
  234. package/dist/esm/interface/crud/contact-channels.d.ts +24 -26
  235. package/dist/esm/interface/crud/contact-channels.d.ts.map +1 -1
  236. package/dist/esm/interface/crud/contact-channels.js +1 -2
  237. package/dist/esm/interface/crud/contact-channels.js.map +1 -1
  238. package/dist/esm/interface/crud/current-user.d.ts +20 -22
  239. package/dist/esm/interface/crud/current-user.d.ts.map +1 -1
  240. package/dist/esm/interface/crud/current-user.js +25 -29
  241. package/dist/esm/interface/crud/current-user.js.map +1 -1
  242. package/dist/esm/interface/crud/email-outbox.d.ts +32 -34
  243. package/dist/esm/interface/crud/email-outbox.d.ts.map +1 -1
  244. package/dist/esm/interface/crud/email-outbox.js +1 -2
  245. package/dist/esm/interface/crud/email-outbox.js.map +1 -1
  246. package/dist/esm/interface/crud/email-templates.d.ts +16 -18
  247. package/dist/esm/interface/crud/email-templates.d.ts.map +1 -1
  248. package/dist/esm/interface/crud/email-templates.js +1 -2
  249. package/dist/esm/interface/crud/email-templates.js.map +1 -1
  250. package/dist/esm/interface/crud/emails.d.ts +6 -8
  251. package/dist/esm/interface/crud/emails.d.ts.map +1 -1
  252. package/dist/esm/interface/crud/emails.js +1 -2
  253. package/dist/esm/interface/crud/emails.js.map +1 -1
  254. package/dist/esm/interface/crud/internal-api-keys.d.ts +16 -18
  255. package/dist/esm/interface/crud/internal-api-keys.d.ts.map +1 -1
  256. package/dist/esm/interface/crud/internal-api-keys.js +1 -2
  257. package/dist/esm/interface/crud/internal-api-keys.js.map +1 -1
  258. package/dist/esm/interface/crud/invoices.d.ts +2 -2
  259. package/dist/esm/interface/crud/invoices.d.ts.map +1 -1
  260. package/dist/esm/interface/crud/invoices.js +1 -2
  261. package/dist/esm/interface/crud/invoices.js.map +1 -1
  262. package/dist/esm/interface/crud/items.d.ts +6 -8
  263. package/dist/esm/interface/crud/items.d.ts.map +1 -1
  264. package/dist/esm/interface/crud/items.js +12 -16
  265. package/dist/esm/interface/crud/items.js.map +1 -1
  266. package/dist/esm/interface/crud/notification-preferences.d.ts +6 -8
  267. package/dist/esm/interface/crud/notification-preferences.d.ts.map +1 -1
  268. package/dist/esm/interface/crud/notification-preferences.js +8 -12
  269. package/dist/esm/interface/crud/notification-preferences.js.map +1 -1
  270. package/dist/esm/interface/crud/oauth-providers.d.ts +24 -26
  271. package/dist/esm/interface/crud/oauth-providers.d.ts.map +1 -1
  272. package/dist/esm/interface/crud/oauth-providers.js +1 -2
  273. package/dist/esm/interface/crud/oauth-providers.js.map +1 -1
  274. package/dist/esm/interface/crud/products.d.ts +21 -22
  275. package/dist/esm/interface/crud/products.d.ts.map +1 -1
  276. package/dist/esm/interface/crud/products.js +3 -2
  277. package/dist/esm/interface/crud/products.js.map +1 -1
  278. package/dist/esm/interface/crud/project-api-keys.d.ts +5 -6
  279. package/dist/esm/interface/crud/project-api-keys.d.ts.map +1 -1
  280. package/dist/esm/interface/crud/project-api-keys.js +1 -2
  281. package/dist/esm/interface/crud/project-api-keys.js.map +1 -1
  282. package/dist/esm/interface/crud/project-permissions.d.ts +29 -31
  283. package/dist/esm/interface/crud/project-permissions.d.ts.map +1 -1
  284. package/dist/esm/interface/crud/project-permissions.js +1 -2
  285. package/dist/esm/interface/crud/project-permissions.js.map +1 -1
  286. package/dist/esm/interface/crud/projects.d.ts +71 -73
  287. package/dist/esm/interface/crud/projects.d.ts.map +1 -1
  288. package/dist/esm/interface/crud/projects.js +3 -2
  289. package/dist/esm/interface/crud/projects.js.map +1 -1
  290. package/dist/esm/interface/crud/session-replays.d.ts.map +1 -1
  291. package/dist/esm/interface/crud/session-replays.js +1 -1
  292. package/dist/esm/interface/crud/sessions.d.ts +15 -17
  293. package/dist/esm/interface/crud/sessions.d.ts.map +1 -1
  294. package/dist/esm/interface/crud/sessions.js +1 -2
  295. package/dist/esm/interface/crud/sessions.js.map +1 -1
  296. package/dist/esm/interface/crud/sign-up-rules.d.ts.map +1 -1
  297. package/dist/esm/interface/crud/sign-up-rules.js +1 -1
  298. package/dist/esm/interface/crud/svix-token.d.ts +8 -10
  299. package/dist/esm/interface/crud/svix-token.d.ts.map +1 -1
  300. package/dist/esm/interface/crud/svix-token.js +1 -2
  301. package/dist/esm/interface/crud/svix-token.js.map +1 -1
  302. package/dist/esm/interface/crud/team-invitation-details.d.ts +6 -8
  303. package/dist/esm/interface/crud/team-invitation-details.d.ts.map +1 -1
  304. package/dist/esm/interface/crud/team-invitation-details.js +1 -2
  305. package/dist/esm/interface/crud/team-invitation-details.js.map +1 -1
  306. package/dist/esm/interface/crud/team-invitation.d.ts +7 -9
  307. package/dist/esm/interface/crud/team-invitation.d.ts.map +1 -1
  308. package/dist/esm/interface/crud/team-invitation.js +1 -2
  309. package/dist/esm/interface/crud/team-invitation.js.map +1 -1
  310. package/dist/esm/interface/crud/team-member-profiles.d.ts +26 -28
  311. package/dist/esm/interface/crud/team-member-profiles.d.ts.map +1 -1
  312. package/dist/esm/interface/crud/team-member-profiles.js +1 -2
  313. package/dist/esm/interface/crud/team-member-profiles.js.map +1 -1
  314. package/dist/esm/interface/crud/team-memberships.d.ts +14 -16
  315. package/dist/esm/interface/crud/team-memberships.d.ts.map +1 -1
  316. package/dist/esm/interface/crud/team-memberships.js +1 -2
  317. package/dist/esm/interface/crud/team-memberships.js.map +1 -1
  318. package/dist/esm/interface/crud/team-permissions.d.ts +29 -31
  319. package/dist/esm/interface/crud/team-permissions.d.ts.map +1 -1
  320. package/dist/esm/interface/crud/team-permissions.js +1 -2
  321. package/dist/esm/interface/crud/team-permissions.js.map +1 -1
  322. package/dist/esm/interface/crud/teams.d.ts +36 -38
  323. package/dist/esm/interface/crud/teams.d.ts.map +1 -1
  324. package/dist/esm/interface/crud/teams.js +2 -4
  325. package/dist/esm/interface/crud/teams.js.map +1 -1
  326. package/dist/esm/interface/crud/transactions.d.ts +14 -16
  327. package/dist/esm/interface/crud/transactions.d.ts.map +1 -1
  328. package/dist/esm/interface/crud/transactions.js +7 -13
  329. package/dist/esm/interface/crud/transactions.js.map +1 -1
  330. package/dist/esm/interface/crud/users.d.ts +11 -12
  331. package/dist/esm/interface/crud/users.d.ts.map +1 -1
  332. package/dist/esm/interface/crud/users.js +9 -5
  333. package/dist/esm/interface/crud/users.js.map +1 -1
  334. package/dist/esm/interface/handler-urls.d.ts +1 -1
  335. package/dist/esm/interface/handler-urls.d.ts.map +1 -1
  336. package/dist/esm/interface/handler-urls.js +1 -2
  337. package/dist/esm/interface/page-component-versions.d.ts +1 -1
  338. package/dist/esm/interface/page-component-versions.d.ts.map +1 -1
  339. package/dist/esm/interface/page-component-versions.js +1 -2
  340. package/dist/esm/interface/page-component-versions.js.map +1 -1
  341. package/dist/esm/interface/plan-usage.d.ts +1 -1
  342. package/dist/esm/interface/plan-usage.d.ts.map +1 -1
  343. package/dist/esm/interface/plan-usage.js +1 -2
  344. package/dist/esm/interface/plan-usage.js.map +1 -1
  345. package/dist/esm/interface/server-interface.d.ts +19 -19
  346. package/dist/esm/interface/server-interface.d.ts.map +1 -1
  347. package/dist/esm/interface/server-interface.js +1 -2
  348. package/dist/esm/interface/server-interface.js.map +1 -1
  349. package/dist/esm/interface/webhooks.d.ts +2 -2
  350. package/dist/esm/interface/webhooks.d.ts.map +1 -1
  351. package/dist/esm/interface/webhooks.js +1 -2
  352. package/dist/esm/interface/webhooks.js.map +1 -1
  353. package/dist/esm/known-errors.d.ts +2 -2
  354. package/dist/esm/known-errors.d.ts.map +1 -1
  355. package/dist/esm/known-errors.js +10 -21
  356. package/dist/esm/known-errors.js.map +1 -1
  357. package/dist/esm/payments/payment-methods.d.ts.map +1 -1
  358. package/dist/esm/payments/payment-methods.js +1 -1
  359. package/dist/esm/payments/payment-methods.js.map +1 -1
  360. package/dist/esm/payments/stripe-limits.d.ts.map +1 -1
  361. package/dist/esm/payments/stripe-limits.js +1 -1
  362. package/dist/esm/payments/stripe-limits.js.map +1 -1
  363. package/dist/esm/plans.d.ts.map +1 -1
  364. package/dist/esm/plans.js +1 -1
  365. package/dist/esm/plans.js.map +1 -1
  366. package/dist/esm/schema-fields.d.ts +14 -14
  367. package/dist/esm/schema-fields.d.ts.map +1 -1
  368. package/dist/esm/schema-fields.js +3 -64
  369. package/dist/esm/schema-fields.js.map +1 -1
  370. package/dist/esm/sessions.d.ts +6 -6
  371. package/dist/esm/sessions.d.ts.map +1 -1
  372. package/dist/esm/sessions.js +1 -2
  373. package/dist/esm/sessions.js.map +1 -1
  374. package/dist/esm/sessions.test.js +2 -3
  375. package/dist/esm/sessions.test.js.map +1 -1
  376. package/dist/esm/utils/analytics-clickmap-overlay.d.ts.map +1 -1
  377. package/dist/esm/utils/analytics-clickmap-overlay.js +1 -1
  378. package/dist/esm/utils/api-keys.d.ts.map +1 -1
  379. package/dist/esm/utils/api-keys.js +1 -2
  380. package/dist/esm/utils/api-keys.js.map +1 -1
  381. package/dist/esm/utils/arrays.d.ts.map +1 -1
  382. package/dist/esm/utils/arrays.js +1 -470
  383. package/dist/esm/utils/arrays.js.map +1 -1
  384. package/dist/esm/utils/auth-methods.d.ts.map +1 -1
  385. package/dist/esm/utils/auth-methods.js +1 -1
  386. package/dist/esm/utils/auth-methods.js.map +1 -1
  387. package/dist/esm/utils/base64.d.ts.map +1 -1
  388. package/dist/esm/utils/base64.js +1 -10
  389. package/dist/esm/utils/base64.js.map +1 -1
  390. package/dist/esm/utils/booleans.d.ts.map +1 -1
  391. package/dist/esm/utils/booleans.js +1 -25
  392. package/dist/esm/utils/booleans.js.map +1 -1
  393. package/dist/esm/utils/browser-compat.d.ts.map +1 -1
  394. package/dist/esm/utils/browser-compat.js +1 -1
  395. package/dist/esm/utils/browser-compat.js.map +1 -1
  396. package/dist/esm/utils/bytes.d.ts.map +1 -1
  397. package/dist/esm/utils/bytes.js +3 -198
  398. package/dist/esm/utils/bytes.js.map +1 -1
  399. package/dist/esm/utils/caches.d.ts +1 -1
  400. package/dist/esm/utils/caches.d.ts.map +1 -1
  401. package/dist/esm/utils/caches.js +1 -27
  402. package/dist/esm/utils/caches.js.map +1 -1
  403. package/dist/esm/utils/cel-fields.d.ts.map +1 -1
  404. package/dist/esm/utils/cel-fields.js +1 -2
  405. package/dist/esm/utils/cel-fields.js.map +1 -1
  406. package/dist/esm/utils/cloud-hosts.d.ts.map +1 -1
  407. package/dist/esm/utils/cloud-hosts.js +1 -27
  408. package/dist/esm/utils/cloud-hosts.js.map +1 -1
  409. package/dist/esm/utils/compile-time.d.ts.map +1 -1
  410. package/dist/esm/utils/compile-time.js +1 -1
  411. package/dist/esm/utils/compile-time.js.map +1 -1
  412. package/dist/esm/utils/country-codes.d.ts.map +1 -1
  413. package/dist/esm/utils/country-codes.js +1 -16
  414. package/dist/esm/utils/country-codes.js.map +1 -1
  415. package/dist/esm/utils/crypto.d.ts.map +1 -1
  416. package/dist/esm/utils/crypto.js +3 -113
  417. package/dist/esm/utils/crypto.js.map +1 -1
  418. package/dist/esm/utils/currencies.d.ts +1 -1
  419. package/dist/esm/utils/currencies.d.ts.map +1 -1
  420. package/dist/esm/utils/currencies.js +2 -37
  421. package/dist/esm/utils/currencies.js.map +1 -1
  422. package/dist/esm/utils/currency-constants.d.ts.map +1 -1
  423. package/dist/esm/utils/currency-constants.js +1 -1
  424. package/dist/esm/utils/currency-constants.js.map +1 -1
  425. package/dist/esm/utils/dates.d.ts.map +1 -1
  426. package/dist/esm/utils/dates.js +1 -44
  427. package/dist/esm/utils/dates.js.map +1 -1
  428. package/dist/esm/utils/dev-env-state-path.d.ts.map +1 -1
  429. package/dist/esm/utils/dev-env-state-path.js +1 -2
  430. package/dist/esm/utils/dev-env-state-path.js.map +1 -1
  431. package/dist/esm/utils/dev-tool.d.ts.map +1 -1
  432. package/dist/esm/utils/dev-tool.js +1 -1
  433. package/dist/esm/utils/dom.d.ts.map +1 -1
  434. package/dist/esm/utils/dom.js +1 -1
  435. package/dist/esm/utils/dom.js.map +1 -1
  436. package/dist/esm/utils/elements-chain.d.ts.map +1 -1
  437. package/dist/esm/utils/elements-chain.js +5 -50
  438. package/dist/esm/utils/elements-chain.js.map +1 -1
  439. package/dist/esm/utils/env.d.ts.map +1 -1
  440. package/dist/esm/utils/env.js +1 -2
  441. package/dist/esm/utils/env.js.map +1 -1
  442. package/dist/esm/utils/env.test.js +2 -3
  443. package/dist/esm/utils/env.test.js.map +1 -1
  444. package/dist/esm/utils/errors.d.ts +1 -1
  445. package/dist/esm/utils/errors.d.ts.map +1 -1
  446. package/dist/esm/utils/errors.js +1 -2
  447. package/dist/esm/utils/errors.js.map +1 -1
  448. package/dist/esm/utils/esbuild.d.ts +1 -1
  449. package/dist/esm/utils/esbuild.d.ts.map +1 -1
  450. package/dist/esm/utils/esbuild.js +2 -3
  451. package/dist/esm/utils/esbuild.js.map +1 -1
  452. package/dist/esm/utils/featurebase.d.ts.map +1 -1
  453. package/dist/esm/utils/featurebase.js +1 -2
  454. package/dist/esm/utils/featurebase.js.map +1 -1
  455. package/dist/esm/utils/fs.d.ts.map +1 -1
  456. package/dist/esm/utils/fs.js +1 -2
  457. package/dist/esm/utils/fs.js.map +1 -1
  458. package/dist/esm/utils/functions.d.ts.map +1 -1
  459. package/dist/esm/utils/functions.js +1 -24
  460. package/dist/esm/utils/functions.js.map +1 -1
  461. package/dist/esm/utils/geo.d.ts.map +1 -1
  462. package/dist/esm/utils/geo.js +1 -2
  463. package/dist/esm/utils/geo.js.map +1 -1
  464. package/dist/esm/utils/globals.d.ts.map +1 -1
  465. package/dist/esm/utils/globals.js +1 -1
  466. package/dist/esm/utils/globals.js.map +1 -1
  467. package/dist/esm/utils/hashes.d.ts.map +1 -1
  468. package/dist/esm/utils/hashes.js +1 -2
  469. package/dist/esm/utils/hashes.js.map +1 -1
  470. package/dist/esm/utils/html.d.ts.map +1 -1
  471. package/dist/esm/utils/html.js +1 -19
  472. package/dist/esm/utils/html.js.map +1 -1
  473. package/dist/esm/utils/http.d.ts.map +1 -1
  474. package/dist/esm/utils/http.js +1 -19
  475. package/dist/esm/utils/http.js.map +1 -1
  476. package/dist/esm/utils/ips.d.ts.map +1 -1
  477. package/dist/esm/utils/ips.js +1 -25
  478. package/dist/esm/utils/ips.js.map +1 -1
  479. package/dist/esm/utils/json.d.ts +1 -1
  480. package/dist/esm/utils/json.d.ts.map +1 -1
  481. package/dist/esm/utils/json.js +1 -155
  482. package/dist/esm/utils/json.js.map +1 -1
  483. package/dist/esm/utils/jsx-editable-transpiler.d.ts.map +1 -1
  484. package/dist/esm/utils/jsx-editable-transpiler.js +1 -2
  485. package/dist/esm/utils/jsx-editable-transpiler.js.map +1 -1
  486. package/dist/esm/utils/jsx-editable-transpiler.test.js +2 -3
  487. package/dist/esm/utils/jsx-editable-transpiler.test.js.map +1 -1
  488. package/dist/esm/utils/jwt.d.ts.map +1 -1
  489. package/dist/esm/utils/jwt.js +1 -2
  490. package/dist/esm/utils/jwt.js.map +1 -1
  491. package/dist/esm/utils/locks.d.ts.map +1 -1
  492. package/dist/esm/utils/locks.js +1 -2
  493. package/dist/esm/utils/locks.js.map +1 -1
  494. package/dist/esm/utils/maps.d.ts.map +1 -1
  495. package/dist/esm/utils/maps.js +1 -111
  496. package/dist/esm/utils/maps.js.map +1 -1
  497. package/dist/esm/utils/math.d.ts.map +1 -1
  498. package/dist/esm/utils/math.js +1 -11
  499. package/dist/esm/utils/math.js.map +1 -1
  500. package/dist/esm/utils/monkey-patch.d.ts.map +1 -1
  501. package/dist/esm/utils/monkey-patch.js +2 -3
  502. package/dist/esm/utils/monkey-patch.js.map +1 -1
  503. package/dist/esm/utils/node-http.js +1 -2
  504. package/dist/esm/utils/node-http.js.map +1 -1
  505. package/dist/esm/utils/numbers.d.ts.map +1 -1
  506. package/dist/esm/utils/numbers.js +1 -45
  507. package/dist/esm/utils/numbers.js.map +1 -1
  508. package/dist/esm/utils/oauth.d.ts.map +1 -1
  509. package/dist/esm/utils/oauth.js +1 -1
  510. package/dist/esm/utils/oauth.js.map +1 -1
  511. package/dist/esm/utils/objects.d.ts.map +1 -1
  512. package/dist/esm/utils/objects.js +1 -622
  513. package/dist/esm/utils/objects.js.map +1 -1
  514. package/dist/esm/utils/paginated-lists.d.ts.map +1 -1
  515. package/dist/esm/utils/paginated-lists.js +1 -2
  516. package/dist/esm/utils/paginated-lists.js.map +1 -1
  517. package/dist/esm/utils/paginated-lists.test.js +2 -3
  518. package/dist/esm/utils/paginated-lists.test.js.map +1 -1
  519. package/dist/esm/utils/passkey.d.ts +1 -1
  520. package/dist/esm/utils/passkey.js +1 -1
  521. package/dist/esm/utils/promises.d.ts +1 -1
  522. package/dist/esm/utils/promises.d.ts.map +1 -1
  523. package/dist/esm/utils/promises.js +1 -160
  524. package/dist/esm/utils/promises.js.map +1 -1
  525. package/dist/esm/utils/proxies.d.ts.map +1 -1
  526. package/dist/esm/utils/proxies.js +1 -37
  527. package/dist/esm/utils/proxies.js.map +1 -1
  528. package/dist/esm/utils/react.d.ts.map +1 -1
  529. package/dist/esm/utils/react.js +1 -41
  530. package/dist/esm/utils/react.js.map +1 -1
  531. package/dist/esm/utils/redirect-urls.d.ts.map +1 -1
  532. package/dist/esm/utils/redirect-urls.js +2 -92
  533. package/dist/esm/utils/redirect-urls.js.map +1 -1
  534. package/dist/esm/utils/regex.js +1 -1
  535. package/dist/esm/utils/regex.js.map +1 -1
  536. package/dist/esm/utils/results.d.ts.map +1 -1
  537. package/dist/esm/utils/results.js +1 -213
  538. package/dist/esm/utils/results.js.map +1 -1
  539. package/dist/esm/utils/sentry.js +1 -1
  540. package/dist/esm/utils/sentry.js.map +1 -1
  541. package/dist/esm/utils/stores.d.ts +3 -3
  542. package/dist/esm/utils/stores.d.ts.map +1 -1
  543. package/dist/esm/utils/stores.js +1 -2
  544. package/dist/esm/utils/stores.js.map +1 -1
  545. package/dist/esm/utils/strings.d.ts.map +1 -1
  546. package/dist/esm/utils/strings.js +1 -251
  547. package/dist/esm/utils/strings.js.map +1 -1
  548. package/dist/esm/utils/strings.nicify.test.js +2 -3
  549. package/dist/esm/utils/strings.nicify.test.js.map +1 -1
  550. package/dist/esm/utils/telemetry.d.ts.map +1 -1
  551. package/dist/esm/utils/telemetry.js +1 -2
  552. package/dist/esm/utils/telemetry.js.map +1 -1
  553. package/dist/esm/utils/turnstile-browser.d.ts +1 -1
  554. package/dist/esm/utils/turnstile-browser.d.ts.map +1 -1
  555. package/dist/esm/utils/turnstile-browser.js +1 -2
  556. package/dist/esm/utils/turnstile-browser.js.map +1 -1
  557. package/dist/esm/utils/turnstile-flow.d.ts +1 -1
  558. package/dist/esm/utils/turnstile-flow.d.ts.map +1 -1
  559. package/dist/esm/utils/turnstile-flow.js +1 -2
  560. package/dist/esm/utils/turnstile-flow.js.map +1 -1
  561. package/dist/esm/utils/turnstile-flow.test.js +2 -3
  562. package/dist/esm/utils/turnstile-flow.test.js.map +1 -1
  563. package/dist/esm/utils/turnstile.d.ts.map +1 -1
  564. package/dist/esm/utils/turnstile.js +1 -1
  565. package/dist/esm/utils/turnstile.js.map +1 -1
  566. package/dist/esm/utils/typed-arrays.js +1 -2
  567. package/dist/esm/utils/typed-arrays.js.map +1 -1
  568. package/dist/esm/utils/types.d.ts +1 -1
  569. package/dist/esm/utils/types.d.ts.map +1 -1
  570. package/dist/esm/utils/types.js +1 -1
  571. package/dist/esm/utils/types.js.map +1 -1
  572. package/dist/esm/utils/unicode.d.ts.map +1 -1
  573. package/dist/esm/utils/unicode.js +1 -13
  574. package/dist/esm/utils/unicode.js.map +1 -1
  575. package/dist/esm/utils/urls.d.ts.map +1 -1
  576. package/dist/esm/utils/urls.js +1 -151
  577. package/dist/esm/utils/urls.js.map +1 -1
  578. package/dist/esm/utils/uuids.d.ts.map +1 -1
  579. package/dist/esm/utils/uuids.js +2 -26
  580. package/dist/esm/utils/uuids.js.map +1 -1
  581. package/dist/format-4JG1MGv5.d.ts +61 -0
  582. package/dist/format-4JG1MGv5.d.ts.map +1 -0
  583. package/dist/handler-urls-BHt3v8Ai.d.ts +70 -0
  584. package/dist/handler-urls-BHt3v8Ai.d.ts.map +1 -0
  585. package/dist/helpers/emails.js +2 -4
  586. package/dist/helpers/emails.js.map +1 -1
  587. package/dist/helpers/init-prompt.d.ts.map +1 -1
  588. package/dist/helpers/init-prompt.js +2 -4
  589. package/dist/helpers/init-prompt.js.map +1 -1
  590. package/dist/helpers/password.d.ts +1 -1
  591. package/dist/helpers/password.d.ts.map +1 -1
  592. package/dist/helpers/password.js +2 -4
  593. package/dist/helpers/password.js.map +1 -1
  594. package/dist/helpers/production-mode.d.ts +1 -1
  595. package/dist/helpers/production-mode.d.ts.map +1 -1
  596. package/dist/helpers/production-mode.js +2 -4
  597. package/dist/helpers/production-mode.js.map +1 -1
  598. package/dist/helpers/support-sla.d.ts.map +1 -1
  599. package/dist/helpers/support-sla.js +2 -3
  600. package/dist/helpers/support-sla.js.map +1 -1
  601. package/dist/helpers/support-sla.test.js +1 -3
  602. package/dist/helpers/support-sla.test.js.map +1 -1
  603. package/dist/helpers/vault/client-side.d.ts.map +1 -1
  604. package/dist/helpers/vault/client-side.js +2 -22
  605. package/dist/helpers/vault/client-side.js.map +1 -1
  606. package/dist/helpers/vault/server-side.js +2 -4
  607. package/dist/helpers/vault/server-side.js.map +1 -1
  608. package/dist/hooks/use-async-callback.d.ts.map +1 -1
  609. package/dist/hooks/use-async-callback.js +4 -5
  610. package/dist/hooks/use-async-callback.js.map +1 -1
  611. package/dist/hooks/use-async-external-store.d.ts +1 -1
  612. package/dist/hooks/use-async-external-store.d.ts.map +1 -1
  613. package/dist/hooks/use-async-external-store.js +2 -4
  614. package/dist/hooks/use-async-external-store.js.map +1 -1
  615. package/dist/hooks/use-hash.js +2 -4
  616. package/dist/hooks/use-hash.js.map +1 -1
  617. package/dist/hooks/use-hover.d.ts.map +1 -1
  618. package/dist/hooks/use-hover.js +2 -4
  619. package/dist/hooks/use-hover.js.map +1 -1
  620. package/dist/hooks/use-strict-memo.d.ts.map +1 -1
  621. package/dist/hooks/use-strict-memo.js +2 -72
  622. package/dist/hooks/use-strict-memo.js.map +1 -1
  623. package/dist/index.d.ts +4 -4
  624. package/dist/index.js +27 -29
  625. package/dist/interface/admin-interface.d.ts +3 -379
  626. package/dist/interface/admin-interface.js +2 -4
  627. package/dist/interface/admin-interface.js.map +1 -1
  628. package/dist/interface/admin-metrics.d.ts +2 -807
  629. package/dist/interface/admin-metrics.js +2 -4
  630. package/dist/interface/admin-metrics.js.map +1 -1
  631. package/dist/interface/client-interface.d.ts +2 -447
  632. package/dist/interface/client-interface.js +32 -17
  633. package/dist/interface/client-interface.js.map +1 -1
  634. package/dist/interface/client-interface.test.js +83 -13
  635. package/dist/interface/client-interface.test.js.map +1 -1
  636. package/dist/interface/conversations.d.ts +33 -33
  637. package/dist/interface/conversations.d.ts.map +1 -1
  638. package/dist/interface/conversations.js +2 -4
  639. package/dist/interface/conversations.js.map +1 -1
  640. package/dist/interface/crud/analytics.d.ts +2 -14
  641. package/dist/interface/crud/connected-accounts.d.ts +2 -68
  642. package/dist/interface/crud/connected-accounts.js +2 -4
  643. package/dist/interface/crud/connected-accounts.js.map +1 -1
  644. package/dist/interface/crud/contact-channels.d.ts +2 -181
  645. package/dist/interface/crud/contact-channels.js +2 -4
  646. package/dist/interface/crud/contact-channels.js.map +1 -1
  647. package/dist/interface/crud/current-user.d.ts +2 -285
  648. package/dist/interface/crud/current-user.js +2 -4
  649. package/dist/interface/crud/current-user.js.map +1 -1
  650. package/dist/interface/crud/email-outbox.d.ts +2 -1465
  651. package/dist/interface/crud/email-outbox.js +4 -5
  652. package/dist/interface/crud/email-outbox.js.map +1 -1
  653. package/dist/interface/crud/email-templates.d.ts +15 -16
  654. package/dist/interface/crud/email-templates.d.ts.map +1 -1
  655. package/dist/interface/crud/email-templates.js +2 -4
  656. package/dist/interface/crud/email-templates.js.map +1 -1
  657. package/dist/interface/crud/emails.d.ts +2 -41
  658. package/dist/interface/crud/emails.js +4 -5
  659. package/dist/interface/crud/emails.js.map +1 -1
  660. package/dist/interface/crud/internal-api-keys.d.ts +2 -140
  661. package/dist/interface/crud/internal-api-keys.js +2 -4
  662. package/dist/interface/crud/internal-api-keys.js.map +1 -1
  663. package/dist/interface/crud/invoices.d.ts +2 -43
  664. package/dist/interface/crud/invoices.js +2 -4
  665. package/dist/interface/crud/invoices.js.map +1 -1
  666. package/dist/interface/crud/items.d.ts +2 -30
  667. package/dist/interface/crud/items.js +2 -4
  668. package/dist/interface/crud/items.js.map +1 -1
  669. package/dist/interface/crud/notification-preferences.d.ts +2 -38
  670. package/dist/interface/crud/notification-preferences.js +2 -4
  671. package/dist/interface/crud/notification-preferences.js.map +1 -1
  672. package/dist/interface/crud/oauth-providers.d.ts +2 -186
  673. package/dist/interface/crud/oauth-providers.js +2 -4
  674. package/dist/interface/crud/oauth-providers.js.map +1 -1
  675. package/dist/interface/crud/products.d.ts +2 -182
  676. package/dist/interface/crud/products.js +4 -4
  677. package/dist/interface/crud/products.js.map +1 -1
  678. package/dist/interface/crud/project-api-keys.d.ts +2 -203
  679. package/dist/interface/crud/project-api-keys.js +2 -4
  680. package/dist/interface/crud/project-api-keys.js.map +1 -1
  681. package/dist/interface/crud/project-permissions.d.ts +2 -161
  682. package/dist/interface/crud/project-permissions.js +4 -5
  683. package/dist/interface/crud/project-permissions.js.map +1 -1
  684. package/dist/interface/crud/projects.d.ts +2 -901
  685. package/dist/interface/crud/projects.js +6 -5
  686. package/dist/interface/crud/projects.js.map +1 -1
  687. package/dist/interface/crud/session-replays.d.ts +2 -83
  688. package/dist/interface/crud/sessions.d.ts +2 -150
  689. package/dist/interface/crud/sessions.js +2 -4
  690. package/dist/interface/crud/sessions.js.map +1 -1
  691. package/dist/interface/crud/sign-up-rules.d.ts.map +1 -1
  692. package/dist/interface/crud/svix-token.d.ts +2 -31
  693. package/dist/interface/crud/svix-token.js +2 -4
  694. package/dist/interface/crud/svix-token.js.map +1 -1
  695. package/dist/interface/crud/team-invitation-details.d.ts +5 -6
  696. package/dist/interface/crud/team-invitation-details.d.ts.map +1 -1
  697. package/dist/interface/crud/team-invitation-details.js +4 -5
  698. package/dist/interface/crud/team-invitation-details.js.map +1 -1
  699. package/dist/interface/crud/team-invitation.d.ts +2 -54
  700. package/dist/interface/crud/team-invitation.js +4 -5
  701. package/dist/interface/crud/team-invitation.js.map +1 -1
  702. package/dist/interface/crud/team-member-profiles.d.ts +2 -286
  703. package/dist/interface/crud/team-member-profiles.js +4 -5
  704. package/dist/interface/crud/team-member-profiles.js.map +1 -1
  705. package/dist/interface/crud/team-memberships.d.ts +2 -75
  706. package/dist/interface/crud/team-memberships.js +2 -4
  707. package/dist/interface/crud/team-memberships.js.map +1 -1
  708. package/dist/interface/crud/team-permissions.d.ts +2 -169
  709. package/dist/interface/crud/team-permissions.js +4 -5
  710. package/dist/interface/crud/team-permissions.js.map +1 -1
  711. package/dist/interface/crud/teams.d.ts +2 -299
  712. package/dist/interface/crud/teams.js +5 -7
  713. package/dist/interface/crud/teams.js.map +1 -1
  714. package/dist/interface/crud/transactions.d.ts +2 -183
  715. package/dist/interface/crud/transactions.js +2 -4
  716. package/dist/interface/crud/transactions.js.map +1 -1
  717. package/dist/interface/crud/users.d.ts +2 -653
  718. package/dist/interface/crud/users.js +12 -8
  719. package/dist/interface/crud/users.js.map +1 -1
  720. package/dist/interface/handler-urls.d.ts +2 -51
  721. package/dist/interface/handler-urls.js +12 -14
  722. package/dist/interface/page-component-versions.d.ts +2 -25
  723. package/dist/interface/page-component-versions.js +2 -4
  724. package/dist/interface/page-component-versions.js.map +1 -1
  725. package/dist/interface/plan-usage.d.ts +2 -57
  726. package/dist/interface/plan-usage.js +2 -4
  727. package/dist/interface/plan-usage.js.map +1 -1
  728. package/dist/interface/server-interface.d.ts +2 -257
  729. package/dist/interface/server-interface.js +2 -4
  730. package/dist/interface/server-interface.js.map +1 -1
  731. package/dist/interface/webhooks.d.ts +2 -326
  732. package/dist/interface/webhooks.js +2 -4
  733. package/dist/interface/webhooks.js.map +1 -1
  734. package/dist/internal-api-keys-D8IYDodH.d.ts +139 -0
  735. package/dist/internal-api-keys-D8IYDodH.d.ts.map +1 -0
  736. package/dist/invoices-U65KzAZX.d.ts +43 -0
  737. package/dist/invoices-U65KzAZX.d.ts.map +1 -0
  738. package/dist/items-DlLSlVUD.d.ts +29 -0
  739. package/dist/items-DlLSlVUD.d.ts.map +1 -0
  740. package/dist/json-a1QIXu5z.d.ts +15 -0
  741. package/dist/json-a1QIXu5z.d.ts.map +1 -0
  742. package/dist/known-errors-Bm4a61wL.d.ts +575 -0
  743. package/dist/known-errors-Bm4a61wL.d.ts.map +1 -0
  744. package/dist/known-errors.d.ts +2 -575
  745. package/dist/known-errors.js +11 -23
  746. package/dist/known-errors.js.map +1 -1
  747. package/dist/notification-preferences-Bmzr_EOY.d.ts +37 -0
  748. package/dist/notification-preferences-Bmzr_EOY.d.ts.map +1 -0
  749. package/dist/oauth-providers-BMkKSSlA.d.ts +185 -0
  750. package/dist/oauth-providers-BMkKSSlA.d.ts.map +1 -0
  751. package/dist/objects-DkCkeBWE.d.ts +59 -0
  752. package/dist/objects-DkCkeBWE.d.ts.map +1 -0
  753. package/dist/passkey-CKg87UH-.d.ts +2 -0
  754. package/dist/payments/payment-methods.d.ts.map +1 -1
  755. package/dist/payments/payment-methods.js +2 -3
  756. package/dist/payments/payment-methods.js.map +1 -1
  757. package/dist/payments/stripe-limits.d.ts.map +1 -1
  758. package/dist/payments/stripe-limits.js +2 -3
  759. package/dist/payments/stripe-limits.js.map +1 -1
  760. package/dist/plan-usage-DfDoj5K4.d.ts +57 -0
  761. package/dist/plan-usage-DfDoj5K4.d.ts.map +1 -0
  762. package/dist/plans.d.ts.map +1 -1
  763. package/dist/plans.js +2 -3
  764. package/dist/plans.js.map +1 -1
  765. package/dist/products-Bs74ld-v.d.ts +182 -0
  766. package/dist/products-Bs74ld-v.d.ts.map +1 -0
  767. package/dist/project-api-keys--7V5X_UW.d.ts +203 -0
  768. package/dist/project-api-keys--7V5X_UW.d.ts.map +1 -0
  769. package/dist/project-permissions-kdi675F-.d.ts +160 -0
  770. package/dist/project-permissions-kdi675F-.d.ts.map +1 -0
  771. package/dist/projects-CgFGB3nO.d.ts +900 -0
  772. package/dist/projects-CgFGB3nO.d.ts.map +1 -0
  773. package/dist/results-DP3BzoL6.d.ts +70 -0
  774. package/dist/results-DP3BzoL6.d.ts.map +1 -0
  775. package/dist/{chunk-BE-pF4vm.js → rolldown-runtime-D6vf50IK.js} +12 -18
  776. package/dist/schema-01nWxmb4.d.ts +2328 -0
  777. package/dist/schema-01nWxmb4.d.ts.map +1 -0
  778. package/dist/schema-fields-DqGQ4kF7.d.ts +517 -0
  779. package/dist/schema-fields-DqGQ4kF7.d.ts.map +1 -0
  780. package/dist/schema-fields.d.ts +3 -518
  781. package/dist/schema-fields.js +21 -82
  782. package/dist/schema-fields.js.map +1 -1
  783. package/dist/server-interface-BUPG1kor.d.ts +257 -0
  784. package/dist/server-interface-BUPG1kor.d.ts.map +1 -0
  785. package/dist/session-replays-CXqhDpZq.d.ts +83 -0
  786. package/dist/session-replays-CXqhDpZq.d.ts.map +1 -0
  787. package/dist/sessions-B7Ko2Ldr.d.ts +149 -0
  788. package/dist/sessions-B7Ko2Ldr.d.ts.map +1 -0
  789. package/dist/sessions-d8qtvBUB.d.ts +175 -0
  790. package/dist/sessions-d8qtvBUB.d.ts.map +1 -0
  791. package/dist/sessions.d.ts +2 -175
  792. package/dist/sessions.js +4 -5
  793. package/dist/sessions.js.map +1 -1
  794. package/dist/sessions.test.js +1 -3
  795. package/dist/sessions.test.js.map +1 -1
  796. package/dist/strings-DWgkUybS.d.ts +76 -0
  797. package/dist/strings-DWgkUybS.d.ts.map +1 -0
  798. package/dist/svix-token-BsMrLGvy.d.ts +30 -0
  799. package/dist/svix-token-BsMrLGvy.d.ts.map +1 -0
  800. package/dist/team-invitation-Cyqt9oWw.d.ts +53 -0
  801. package/dist/team-invitation-Cyqt9oWw.d.ts.map +1 -0
  802. package/dist/team-member-profiles-uTluO8XI.d.ts +285 -0
  803. package/dist/team-member-profiles-uTluO8XI.d.ts.map +1 -0
  804. package/dist/team-memberships-DZHk2A5b.d.ts +74 -0
  805. package/dist/team-memberships-DZHk2A5b.d.ts.map +1 -0
  806. package/dist/team-permissions-DqOpaOWh.d.ts +168 -0
  807. package/dist/team-permissions-DqOpaOWh.d.ts.map +1 -0
  808. package/dist/teams-CQMcBnjM.d.ts +298 -0
  809. package/dist/teams-CQMcBnjM.d.ts.map +1 -0
  810. package/dist/transactions-DhnbvGH5.d.ts +182 -0
  811. package/dist/transactions-DhnbvGH5.d.ts.map +1 -0
  812. package/dist/types-DfTcxNtM.d.ts +77 -0
  813. package/dist/types-DfTcxNtM.d.ts.map +1 -0
  814. package/dist/users-CmBBuF00.d.ts +653 -0
  815. package/dist/users-CmBBuF00.d.ts.map +1 -0
  816. package/dist/utils/analytics-clickmap-overlay.d.ts.map +1 -1
  817. package/dist/utils/analytics-clickmap-overlay.js +2 -3
  818. package/dist/utils/analytics-clickmap-overlay.js.map +1 -1
  819. package/dist/utils/api-keys.d.ts.map +1 -1
  820. package/dist/utils/api-keys.js +4 -5
  821. package/dist/utils/api-keys.js.map +1 -1
  822. package/dist/utils/arrays.d.ts.map +1 -1
  823. package/dist/utils/arrays.js +2 -472
  824. package/dist/utils/arrays.js.map +1 -1
  825. package/dist/utils/auth-methods.d.ts.map +1 -1
  826. package/dist/utils/auth-methods.js +2 -3
  827. package/dist/utils/auth-methods.js.map +1 -1
  828. package/dist/utils/base64.d.ts.map +1 -1
  829. package/dist/utils/base64.js +2 -12
  830. package/dist/utils/base64.js.map +1 -1
  831. package/dist/utils/booleans.d.ts.map +1 -1
  832. package/dist/utils/booleans.js +2 -27
  833. package/dist/utils/booleans.js.map +1 -1
  834. package/dist/utils/browser-compat.d.ts.map +1 -1
  835. package/dist/utils/browser-compat.js +2 -3
  836. package/dist/utils/browser-compat.js.map +1 -1
  837. package/dist/utils/bytes.d.ts.map +1 -1
  838. package/dist/utils/bytes.js +4 -200
  839. package/dist/utils/bytes.js.map +1 -1
  840. package/dist/utils/caches.d.ts.map +1 -1
  841. package/dist/utils/caches.js +2 -29
  842. package/dist/utils/caches.js.map +1 -1
  843. package/dist/utils/cel-fields.d.ts.map +1 -1
  844. package/dist/utils/cel-fields.js +2 -4
  845. package/dist/utils/cel-fields.js.map +1 -1
  846. package/dist/utils/cloud-hosts.d.ts.map +1 -1
  847. package/dist/utils/cloud-hosts.js +2 -29
  848. package/dist/utils/cloud-hosts.js.map +1 -1
  849. package/dist/utils/compile-time.d.ts.map +1 -1
  850. package/dist/utils/compile-time.js +2 -3
  851. package/dist/utils/compile-time.js.map +1 -1
  852. package/dist/utils/country-codes.d.ts +2 -11
  853. package/dist/utils/country-codes.js +2 -18
  854. package/dist/utils/country-codes.js.map +1 -1
  855. package/dist/utils/crypto.d.ts.map +1 -1
  856. package/dist/utils/crypto.js +4 -115
  857. package/dist/utils/crypto.js.map +1 -1
  858. package/dist/utils/currencies.d.ts +1 -1
  859. package/dist/utils/currencies.d.ts.map +1 -1
  860. package/dist/utils/currencies.js +3 -39
  861. package/dist/utils/currencies.js.map +1 -1
  862. package/dist/utils/currency-constants.d.ts +2 -45
  863. package/dist/utils/currency-constants.js +2 -3
  864. package/dist/utils/currency-constants.js.map +1 -1
  865. package/dist/utils/dates.d.ts +2 -23
  866. package/dist/utils/dates.js +2 -46
  867. package/dist/utils/dates.js.map +1 -1
  868. package/dist/utils/dev-env-state-path.d.ts.map +1 -1
  869. package/dist/utils/dev-env-state-path.js +2 -4
  870. package/dist/utils/dev-env-state-path.js.map +1 -1
  871. package/dist/utils/dev-tool.d.ts.map +1 -1
  872. package/dist/utils/dev-tool.js +2 -3
  873. package/dist/utils/dev-tool.js.map +1 -1
  874. package/dist/utils/dom.d.ts.map +1 -1
  875. package/dist/utils/dom.js +2 -3
  876. package/dist/utils/dom.js.map +1 -1
  877. package/dist/utils/elements-chain.d.ts.map +1 -1
  878. package/dist/utils/elements-chain.js +6 -52
  879. package/dist/utils/elements-chain.js.map +1 -1
  880. package/dist/utils/env.d.ts.map +1 -1
  881. package/dist/utils/env.js +2 -4
  882. package/dist/utils/env.js.map +1 -1
  883. package/dist/utils/env.test.js +1 -3
  884. package/dist/utils/env.test.js.map +1 -1
  885. package/dist/utils/errors.d.ts +2 -238
  886. package/dist/utils/errors.js +2 -4
  887. package/dist/utils/errors.js.map +1 -1
  888. package/dist/utils/esbuild.d.ts +1 -1
  889. package/dist/utils/esbuild.d.ts.map +1 -1
  890. package/dist/utils/esbuild.js +5 -6
  891. package/dist/utils/esbuild.js.map +1 -1
  892. package/dist/utils/featurebase.d.ts.map +1 -1
  893. package/dist/utils/featurebase.js +2 -4
  894. package/dist/utils/featurebase.js.map +1 -1
  895. package/dist/utils/fs.d.ts.map +1 -1
  896. package/dist/utils/fs.js +5 -6
  897. package/dist/utils/fs.js.map +1 -1
  898. package/dist/utils/functions.d.ts.map +1 -1
  899. package/dist/utils/functions.js +2 -26
  900. package/dist/utils/functions.js.map +1 -1
  901. package/dist/utils/geo.d.ts.map +1 -1
  902. package/dist/utils/geo.js +2 -4
  903. package/dist/utils/geo.js.map +1 -1
  904. package/dist/utils/globals.d.ts.map +1 -1
  905. package/dist/utils/globals.js +2 -3
  906. package/dist/utils/globals.js.map +1 -1
  907. package/dist/utils/hashes.d.ts.map +1 -1
  908. package/dist/utils/hashes.js +4 -5
  909. package/dist/utils/hashes.js.map +1 -1
  910. package/dist/utils/html.d.ts.map +1 -1
  911. package/dist/utils/html.js +2 -21
  912. package/dist/utils/html.js.map +1 -1
  913. package/dist/utils/http.d.ts.map +1 -1
  914. package/dist/utils/http.js +2 -21
  915. package/dist/utils/http.js.map +1 -1
  916. package/dist/utils/ips.d.ts.map +1 -1
  917. package/dist/utils/ips.js +4 -28
  918. package/dist/utils/ips.js.map +1 -1
  919. package/dist/utils/json.d.ts +2 -15
  920. package/dist/utils/json.js +2 -157
  921. package/dist/utils/json.js.map +1 -1
  922. package/dist/utils/jsx-editable-transpiler.d.ts.map +1 -1
  923. package/dist/utils/jsx-editable-transpiler.js +7 -8
  924. package/dist/utils/jsx-editable-transpiler.js.map +1 -1
  925. package/dist/utils/jsx-editable-transpiler.test.js +1 -3
  926. package/dist/utils/jsx-editable-transpiler.test.js.map +1 -1
  927. package/dist/utils/jwt.d.ts.map +1 -1
  928. package/dist/utils/jwt.js +6 -7
  929. package/dist/utils/jwt.js.map +1 -1
  930. package/dist/utils/locks.d.ts.map +1 -1
  931. package/dist/utils/locks.js +2 -4
  932. package/dist/utils/locks.js.map +1 -1
  933. package/dist/utils/maps.d.ts.map +1 -1
  934. package/dist/utils/maps.js +2 -113
  935. package/dist/utils/maps.js.map +1 -1
  936. package/dist/utils/math.d.ts.map +1 -1
  937. package/dist/utils/math.js +2 -13
  938. package/dist/utils/math.js.map +1 -1
  939. package/dist/utils/monkey-patch.d.ts.map +1 -1
  940. package/dist/utils/monkey-patch.js +3 -5
  941. package/dist/utils/monkey-patch.js.map +1 -1
  942. package/dist/utils/node-http.js +2 -4
  943. package/dist/utils/node-http.js.map +1 -1
  944. package/dist/utils/numbers.d.ts.map +1 -1
  945. package/dist/utils/numbers.js +2 -47
  946. package/dist/utils/numbers.js.map +1 -1
  947. package/dist/utils/oauth.d.ts.map +1 -1
  948. package/dist/utils/oauth.js +2 -3
  949. package/dist/utils/oauth.js.map +1 -1
  950. package/dist/utils/objects.d.ts +2 -59
  951. package/dist/utils/objects.js +2 -624
  952. package/dist/utils/objects.js.map +1 -1
  953. package/dist/utils/paginated-lists.d.ts.map +1 -1
  954. package/dist/utils/paginated-lists.js +2 -4
  955. package/dist/utils/paginated-lists.js.map +1 -1
  956. package/dist/utils/paginated-lists.test.js +1 -3
  957. package/dist/utils/paginated-lists.test.js.map +1 -1
  958. package/dist/utils/passkey.d.ts +2 -2
  959. package/dist/utils/promises.d.ts +1 -1
  960. package/dist/utils/promises.d.ts.map +1 -1
  961. package/dist/utils/promises.js +2 -162
  962. package/dist/utils/promises.js.map +1 -1
  963. package/dist/utils/proxies.d.ts.map +1 -1
  964. package/dist/utils/proxies.js +2 -39
  965. package/dist/utils/proxies.js.map +1 -1
  966. package/dist/utils/react.d.ts.map +1 -1
  967. package/dist/utils/react.js +4 -44
  968. package/dist/utils/react.js.map +1 -1
  969. package/dist/utils/redirect-urls.d.ts.map +1 -1
  970. package/dist/utils/redirect-urls.js +3 -94
  971. package/dist/utils/redirect-urls.js.map +1 -1
  972. package/dist/utils/regex.js +2 -3
  973. package/dist/utils/regex.js.map +1 -1
  974. package/dist/utils/results.d.ts +2 -70
  975. package/dist/utils/results.js +2 -215
  976. package/dist/utils/results.js.map +1 -1
  977. package/dist/utils/sentry.js +2 -3
  978. package/dist/utils/sentry.js.map +1 -1
  979. package/dist/utils/stores.d.ts +1 -1
  980. package/dist/utils/stores.d.ts.map +1 -1
  981. package/dist/utils/stores.js +2 -4
  982. package/dist/utils/stores.js.map +1 -1
  983. package/dist/utils/strings.d.ts +2 -76
  984. package/dist/utils/strings.js +2 -253
  985. package/dist/utils/strings.js.map +1 -1
  986. package/dist/utils/strings.nicify.test.js +1 -3
  987. package/dist/utils/strings.nicify.test.js.map +1 -1
  988. package/dist/utils/telemetry.d.ts.map +1 -1
  989. package/dist/utils/telemetry.js +2 -4
  990. package/dist/utils/telemetry.js.map +1 -1
  991. package/dist/utils/turnstile-browser.d.ts.map +1 -1
  992. package/dist/utils/turnstile-browser.js +2 -4
  993. package/dist/utils/turnstile-browser.js.map +1 -1
  994. package/dist/utils/turnstile-flow.d.ts.map +1 -1
  995. package/dist/utils/turnstile-flow.js +2 -4
  996. package/dist/utils/turnstile-flow.js.map +1 -1
  997. package/dist/utils/turnstile-flow.test.js +1 -3
  998. package/dist/utils/turnstile-flow.test.js.map +1 -1
  999. package/dist/utils/turnstile.d.ts.map +1 -1
  1000. package/dist/utils/turnstile.js +2 -3
  1001. package/dist/utils/turnstile.js.map +1 -1
  1002. package/dist/utils/typed-arrays.js +2 -4
  1003. package/dist/utils/typed-arrays.js.map +1 -1
  1004. package/dist/utils/types.d.ts +2 -77
  1005. package/dist/utils/types.js +2 -3
  1006. package/dist/utils/types.js.map +1 -1
  1007. package/dist/utils/unicode.d.ts.map +1 -1
  1008. package/dist/utils/unicode.js +2 -15
  1009. package/dist/utils/unicode.js.map +1 -1
  1010. package/dist/utils/urls.d.ts.map +1 -1
  1011. package/dist/utils/urls.js +2 -153
  1012. package/dist/utils/urls.js.map +1 -1
  1013. package/dist/utils/uuids.d.ts.map +1 -1
  1014. package/dist/utils/uuids.js +3 -28
  1015. package/dist/utils/uuids.js.map +1 -1
  1016. package/dist/webhooks-ByXrdSOx.d.ts +326 -0
  1017. package/dist/webhooks-ByXrdSOx.d.ts.map +1 -0
  1018. package/package.json +2 -8
  1019. package/src/interface/client-interface.test.ts +77 -12
  1020. package/src/interface/client-interface.ts +9 -9
  1021. package/dist/config/format.d.ts.map +0 -1
  1022. package/dist/config/schema.d.ts.map +0 -1
  1023. package/dist/crud.d.ts.map +0 -1
  1024. package/dist/interface/admin-interface.d.ts.map +0 -1
  1025. package/dist/interface/admin-metrics.d.ts.map +0 -1
  1026. package/dist/interface/client-interface.d.ts.map +0 -1
  1027. package/dist/interface/crud/analytics.d.ts.map +0 -1
  1028. package/dist/interface/crud/connected-accounts.d.ts.map +0 -1
  1029. package/dist/interface/crud/contact-channels.d.ts.map +0 -1
  1030. package/dist/interface/crud/current-user.d.ts.map +0 -1
  1031. package/dist/interface/crud/emails.d.ts.map +0 -1
  1032. package/dist/interface/crud/internal-api-keys.d.ts.map +0 -1
  1033. package/dist/interface/crud/invoices.d.ts.map +0 -1
  1034. package/dist/interface/crud/items.d.ts.map +0 -1
  1035. package/dist/interface/crud/notification-preferences.d.ts.map +0 -1
  1036. package/dist/interface/crud/oauth-providers.d.ts.map +0 -1
  1037. package/dist/interface/crud/products.d.ts.map +0 -1
  1038. package/dist/interface/crud/project-api-keys.d.ts.map +0 -1
  1039. package/dist/interface/crud/project-permissions.d.ts.map +0 -1
  1040. package/dist/interface/crud/projects.d.ts.map +0 -1
  1041. package/dist/interface/crud/session-replays.d.ts.map +0 -1
  1042. package/dist/interface/crud/sessions.d.ts.map +0 -1
  1043. package/dist/interface/crud/svix-token.d.ts.map +0 -1
  1044. package/dist/interface/crud/team-invitation.d.ts.map +0 -1
  1045. package/dist/interface/crud/team-member-profiles.d.ts.map +0 -1
  1046. package/dist/interface/crud/team-memberships.d.ts.map +0 -1
  1047. package/dist/interface/crud/team-permissions.d.ts.map +0 -1
  1048. package/dist/interface/crud/teams.d.ts.map +0 -1
  1049. package/dist/interface/crud/transactions.d.ts.map +0 -1
  1050. package/dist/interface/crud/users.d.ts.map +0 -1
  1051. package/dist/interface/handler-urls.d.ts.map +0 -1
  1052. package/dist/interface/page-component-versions.d.ts.map +0 -1
  1053. package/dist/interface/plan-usage.d.ts.map +0 -1
  1054. package/dist/interface/server-interface.d.ts.map +0 -1
  1055. package/dist/interface/webhooks.d.ts.map +0 -1
  1056. package/dist/known-errors.d.ts.map +0 -1
  1057. package/dist/schema-fields.d.ts.map +0 -1
  1058. package/dist/sessions.d.ts.map +0 -1
  1059. package/dist/utils/country-codes.d.ts.map +0 -1
  1060. package/dist/utils/currency-constants.d.ts.map +0 -1
  1061. package/dist/utils/dates.d.ts.map +0 -1
  1062. package/dist/utils/errors.d.ts.map +0 -1
  1063. package/dist/utils/json.d.ts.map +0 -1
  1064. package/dist/utils/objects.d.ts.map +0 -1
  1065. package/dist/utils/results.d.ts.map +0 -1
  1066. package/dist/utils/strings.d.ts.map +0 -1
  1067. package/dist/utils/types.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"currencies.js","names":[],"sources":["../../src/utils/currencies.tsx"],"sourcesContent":["import { moneyAmountSchema } from \"../schema-fields\";\nimport { SUPPORTED_CURRENCIES, type Currency, type MoneyAmount } from \"./currency-constants\";\nimport { HexclaveAssertionError } from \"./errors\";\n\nexport type SupportedCurrency = (typeof SUPPORTED_CURRENCIES)[number];\n\nexport function moneyAmountToStripeUnits(amount: MoneyAmount, currency: Currency): number {\n const validated = moneyAmountSchema(currency).defined().validateSync(amount);\n if (currency.stripeDecimals !== currency.decimals) {\n throw new HexclaveAssertionError(\"unimplemented: TODO support different decimal configurations\");\n }\n // `moneyAmountSchema` accepts strings with 0..currency.decimals fractional\n // digits, so we must right-pad the fractional part before stripping the dot.\n // A naïve `replace('.', '')` underweights inputs like \"5\" → 5 (should be 500\n // for USD) and \"0.5\" → 5 (should be 50).\n const [whole, fractional = \"\"] = validated.split(\".\");\n const paddedFractional = fractional.padEnd(currency.decimals, \"0\");\n return Number.parseInt(whole + paddedFractional, 10);\n}\n\nimport.meta.vitest?.describe(\"moneyAmountToStripeUnits\", (test) => {\n const USD = SUPPORTED_CURRENCIES.find((c) => c.code === \"USD\")!;\n\n test(\"converts fully-padded USD amounts\", ({ expect }) => {\n expect(moneyAmountToStripeUnits(\"5.00\" as MoneyAmount, USD)).toBe(500);\n expect(moneyAmountToStripeUnits(\"0.01\" as MoneyAmount, USD)).toBe(1);\n expect(moneyAmountToStripeUnits(\"12.34\" as MoneyAmount, USD)).toBe(1234);\n });\n\n test(\"converts whole-number USD amounts (no decimals)\", ({ expect }) => {\n expect(moneyAmountToStripeUnits(\"5\" as MoneyAmount, USD)).toBe(500);\n expect(moneyAmountToStripeUnits(\"10\" as MoneyAmount, USD)).toBe(1000);\n expect(moneyAmountToStripeUnits(\"0\" as MoneyAmount, USD)).toBe(0);\n });\n\n test(\"converts USD amounts with one decimal digit\", ({ expect }) => {\n expect(moneyAmountToStripeUnits(\"5.5\" as MoneyAmount, USD)).toBe(550);\n expect(moneyAmountToStripeUnits(\"0.5\" as MoneyAmount, USD)).toBe(50);\n });\n\n test(\"matches stripeUnitsToMoneyAmount round-trip\", ({ expect }) => {\n for (const cents of [0, 1, 5, 50, 99, 100, 1234, 100000]) {\n const padded = `${Math.floor(cents / 100)}.${(cents % 100).toString().padStart(2, \"0\")}` as MoneyAmount;\n expect(moneyAmountToStripeUnits(padded, USD)).toBe(cents);\n }\n });\n\n test(\"rejects invalid money strings via schema\", ({ expect }) => {\n expect(() => moneyAmountToStripeUnits(\"abc\" as MoneyAmount, USD)).toThrow();\n expect(() => moneyAmountToStripeUnits(\"5.555\" as MoneyAmount, USD)).toThrow();\n expect(() => moneyAmountToStripeUnits(\"05\" as MoneyAmount, USD)).toThrow();\n });\n});\n"],"mappings":";;;;;;;AAMA,SAAgB,yBAAyB,QAAqB,UAA4B;CACxF,MAAM,uDAA8B,SAAS,CAAC,SAAS,CAAC,aAAa,OAAO;AAC5E,KAAI,SAAS,mBAAmB,SAAS,SACvC,OAAM,IAAI,mCAAuB,+DAA+D;CAMlG,MAAM,CAAC,OAAO,aAAa,MAAM,UAAU,MAAM,IAAI;CACrD,MAAM,mBAAmB,WAAW,OAAO,SAAS,UAAU,IAAI;AAClE,QAAO,OAAO,SAAS,QAAQ,kBAAkB,GAAG;;CAGtD,SAAW,SAAS,6BAAU,SAA4B;CACxD,MAAM,MAAM,6CAAqB,MAAM,MAAM,EAAE,SAAS,MAAM;AAE9D,MAAK,sCAAsC,EAAE,aAAa;AACxD,SAAO,yBAAyB,QAAuB,IAAI,CAAC,CAAC,KAAK,IAAI;AACtE,SAAO,yBAAyB,QAAuB,IAAI,CAAC,CAAC,KAAK,EAAE;AACpE,SAAO,yBAAyB,SAAwB,IAAI,CAAC,CAAC,KAAK,KAAK;GACxE;AAEF,MAAK,oDAAoD,EAAE,aAAa;AACtE,SAAO,yBAAyB,KAAoB,IAAI,CAAC,CAAC,KAAK,IAAI;AACnE,SAAO,yBAAyB,MAAqB,IAAI,CAAC,CAAC,KAAK,IAAK;AACrE,SAAO,yBAAyB,KAAoB,IAAI,CAAC,CAAC,KAAK,EAAE;GACjE;AAEF,MAAK,gDAAgD,EAAE,aAAa;AAClE,SAAO,yBAAyB,OAAsB,IAAI,CAAC,CAAC,KAAK,IAAI;AACrE,SAAO,yBAAyB,OAAsB,IAAI,CAAC,CAAC,KAAK,GAAG;GACpE;AAEF,MAAK,gDAAgD,EAAE,aAAa;AAClE,OAAK,MAAM,SAAS;GAAC;GAAG;GAAG;GAAG;GAAI;GAAI;GAAK;GAAM;GAAO,CAEtD,QAAO,yBADQ,GAAG,KAAK,MAAM,QAAQ,IAAI,CAAC,IAAI,QAAQ,KAAK,UAAU,CAAC,SAAS,GAAG,IAAI,IAC9C,IAAI,CAAC,CAAC,KAAK,MAAM;GAE3D;AAEF,MAAK,6CAA6C,EAAE,aAAa;AAC/D,eAAa,yBAAyB,OAAsB,IAAI,CAAC,CAAC,SAAS;AAC3E,eAAa,yBAAyB,SAAwB,IAAI,CAAC,CAAC,SAAS;AAC7E,eAAa,yBAAyB,MAAqB,IAAI,CAAC,CAAC,SAAS;GAC1E;EACF"}
1
+ {"version":3,"file":"currencies.js","names":["HexclaveAssertionError"],"sources":["../../src/utils/currencies.tsx"],"sourcesContent":["import { moneyAmountSchema } from \"../schema-fields\";\nimport { SUPPORTED_CURRENCIES, type Currency, type MoneyAmount } from \"./currency-constants\";\nimport { HexclaveAssertionError } from \"./errors\";\n\nexport type SupportedCurrency = (typeof SUPPORTED_CURRENCIES)[number];\n\nexport function moneyAmountToStripeUnits(amount: MoneyAmount, currency: Currency): number {\n const validated = moneyAmountSchema(currency).defined().validateSync(amount);\n if (currency.stripeDecimals !== currency.decimals) {\n throw new HexclaveAssertionError(\"unimplemented: TODO support different decimal configurations\");\n }\n // `moneyAmountSchema` accepts strings with 0..currency.decimals fractional\n // digits, so we must right-pad the fractional part before stripping the dot.\n // A naïve `replace('.', '')` underweights inputs like \"5\" → 5 (should be 500\n // for USD) and \"0.5\" → 5 (should be 50).\n const [whole, fractional = \"\"] = validated.split(\".\");\n const paddedFractional = fractional.padEnd(currency.decimals, \"0\");\n return Number.parseInt(whole + paddedFractional, 10);\n}\n\nimport.meta.vitest?.describe(\"moneyAmountToStripeUnits\", (test) => {\n const USD = SUPPORTED_CURRENCIES.find((c) => c.code === \"USD\")!;\n\n test(\"converts fully-padded USD amounts\", ({ expect }) => {\n expect(moneyAmountToStripeUnits(\"5.00\" as MoneyAmount, USD)).toBe(500);\n expect(moneyAmountToStripeUnits(\"0.01\" as MoneyAmount, USD)).toBe(1);\n expect(moneyAmountToStripeUnits(\"12.34\" as MoneyAmount, USD)).toBe(1234);\n });\n\n test(\"converts whole-number USD amounts (no decimals)\", ({ expect }) => {\n expect(moneyAmountToStripeUnits(\"5\" as MoneyAmount, USD)).toBe(500);\n expect(moneyAmountToStripeUnits(\"10\" as MoneyAmount, USD)).toBe(1000);\n expect(moneyAmountToStripeUnits(\"0\" as MoneyAmount, USD)).toBe(0);\n });\n\n test(\"converts USD amounts with one decimal digit\", ({ expect }) => {\n expect(moneyAmountToStripeUnits(\"5.5\" as MoneyAmount, USD)).toBe(550);\n expect(moneyAmountToStripeUnits(\"0.5\" as MoneyAmount, USD)).toBe(50);\n });\n\n test(\"matches stripeUnitsToMoneyAmount round-trip\", ({ expect }) => {\n for (const cents of [0, 1, 5, 50, 99, 100, 1234, 100000]) {\n const padded = `${Math.floor(cents / 100)}.${(cents % 100).toString().padStart(2, \"0\")}` as MoneyAmount;\n expect(moneyAmountToStripeUnits(padded, USD)).toBe(cents);\n }\n });\n\n test(\"rejects invalid money strings via schema\", ({ expect }) => {\n expect(() => moneyAmountToStripeUnits(\"abc\" as MoneyAmount, USD)).toThrow();\n expect(() => moneyAmountToStripeUnits(\"5.555\" as MoneyAmount, USD)).toThrow();\n expect(() => moneyAmountToStripeUnits(\"05\" as MoneyAmount, USD)).toThrow();\n });\n});\n"],"mappings":";;;;;AAMA,SAAgB,yBAAyB,QAAqB,UAA4B;CACxF,MAAM,aAAA,GAAA,oBAAA,kBAAA,CAA8B,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,aAAa,MAAM;CAC3E,IAAI,SAAS,mBAAmB,SAAS,UACvC,MAAM,IAAIA,YAAAA,uBAAuB,8DAA8D;CAMjG,MAAM,CAAC,OAAO,aAAa,MAAM,UAAU,MAAM,GAAG;CACpD,MAAM,mBAAmB,WAAW,OAAO,SAAS,UAAU,GAAG;CACjE,OAAO,OAAO,SAAS,QAAQ,kBAAkB,EAAE;AACrD"}
@@ -1,45 +1,2 @@
1
- //#region src/utils/currency-constants.d.ts
2
- /**
3
- * A decimal string representing a monetary amount, e.g. `"9.99"`, `"0.01"`, or `"1000"`.
4
- *
5
- * This is NOT an integer in cents/minor units — it is always a human-readable decimal string.
6
- * For example, nine dollars and ninety-nine cents is `"9.99"`, not `999`.
7
- */
8
- type MoneyAmount = `${number}` | `${number}.${number}`;
9
- type Currency = {
10
- code: Uppercase<string>;
11
- decimals: number;
12
- stripeDecimals: number;
13
- };
14
- declare const SUPPORTED_CURRENCIES: [{
15
- readonly code: "USD";
16
- readonly decimals: 2;
17
- readonly stripeDecimals: 2;
18
- }, {
19
- readonly code: "EUR";
20
- readonly decimals: 2;
21
- readonly stripeDecimals: 2;
22
- }, {
23
- readonly code: "GBP";
24
- readonly decimals: 2;
25
- readonly stripeDecimals: 2;
26
- }, {
27
- readonly code: "JPY";
28
- readonly decimals: 0;
29
- readonly stripeDecimals: 0;
30
- }, {
31
- readonly code: "INR";
32
- readonly decimals: 2;
33
- readonly stripeDecimals: 2;
34
- }, {
35
- readonly code: "AUD";
36
- readonly decimals: 2;
37
- readonly stripeDecimals: 2;
38
- }, {
39
- readonly code: "CAD";
40
- readonly decimals: 2;
41
- readonly stripeDecimals: 2;
42
- }];
43
- //#endregion
44
- export { Currency, MoneyAmount, SUPPORTED_CURRENCIES };
45
- //# sourceMappingURL=currency-constants.d.ts.map
1
+ import { n as MoneyAmount, r as SUPPORTED_CURRENCIES, t as Currency } from "../currency-constants-Cq_q8twn.js";
2
+ export { Currency, MoneyAmount, SUPPORTED_CURRENCIES };
@@ -1,5 +1,4 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
2
  //#region src/utils/currency-constants.tsx
4
3
  const SUPPORTED_CURRENCIES = [
5
4
  {
@@ -38,7 +37,7 @@ const SUPPORTED_CURRENCIES = [
38
37
  stripeDecimals: 2
39
38
  }
40
39
  ];
41
-
42
40
  //#endregion
43
41
  exports.SUPPORTED_CURRENCIES = SUPPORTED_CURRENCIES;
42
+
44
43
  //# sourceMappingURL=currency-constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"currency-constants.js","names":[],"sources":["../../src/utils/currency-constants.tsx"],"sourcesContent":["/**\n * A decimal string representing a monetary amount, e.g. `\"9.99\"`, `\"0.01\"`, or `\"1000\"`.\n *\n * This is NOT an integer in cents/minor units — it is always a human-readable decimal string.\n * For example, nine dollars and ninety-nine cents is `\"9.99\"`, not `999`.\n */\nexport type MoneyAmount = `${number}` | `${number}.${number}`;\n\nexport type Currency = {\n code: Uppercase<string>,\n decimals: number,\n stripeDecimals: number,\n};\n\nexport const SUPPORTED_CURRENCIES = [\n {\n code: 'USD',\n decimals: 2,\n stripeDecimals: 2,\n },\n {\n code: 'EUR',\n decimals: 2,\n stripeDecimals: 2,\n },\n {\n code: 'GBP',\n decimals: 2,\n stripeDecimals: 2,\n },\n {\n code: 'JPY',\n decimals: 0,\n stripeDecimals: 0,\n },\n {\n code: 'INR',\n decimals: 2,\n stripeDecimals: 2,\n },\n {\n code: 'AUD',\n decimals: 2,\n stripeDecimals: 2,\n },\n {\n code: 'CAD',\n decimals: 2,\n stripeDecimals: 2,\n },\n] as const satisfies Currency[];\n"],"mappings":";;;AAcA,MAAa,uBAAuB;CAClC;EACE,MAAM;EACN,UAAU;EACV,gBAAgB;EACjB;CACD;EACE,MAAM;EACN,UAAU;EACV,gBAAgB;EACjB;CACD;EACE,MAAM;EACN,UAAU;EACV,gBAAgB;EACjB;CACD;EACE,MAAM;EACN,UAAU;EACV,gBAAgB;EACjB;CACD;EACE,MAAM;EACN,UAAU;EACV,gBAAgB;EACjB;CACD;EACE,MAAM;EACN,UAAU;EACV,gBAAgB;EACjB;CACD;EACE,MAAM;EACN,UAAU;EACV,gBAAgB;EACjB;CACF"}
1
+ {"version":3,"file":"currency-constants.js","names":[],"sources":["../../src/utils/currency-constants.tsx"],"sourcesContent":["/**\n * A decimal string representing a monetary amount, e.g. `\"9.99\"`, `\"0.01\"`, or `\"1000\"`.\n *\n * This is NOT an integer in cents/minor units — it is always a human-readable decimal string.\n * For example, nine dollars and ninety-nine cents is `\"9.99\"`, not `999`.\n */\nexport type MoneyAmount = `${number}` | `${number}.${number}`;\n\nexport type Currency = {\n code: Uppercase<string>,\n decimals: number,\n stripeDecimals: number,\n};\n\nexport const SUPPORTED_CURRENCIES = [\n {\n code: 'USD',\n decimals: 2,\n stripeDecimals: 2,\n },\n {\n code: 'EUR',\n decimals: 2,\n stripeDecimals: 2,\n },\n {\n code: 'GBP',\n decimals: 2,\n stripeDecimals: 2,\n },\n {\n code: 'JPY',\n decimals: 0,\n stripeDecimals: 0,\n },\n {\n code: 'INR',\n decimals: 2,\n stripeDecimals: 2,\n },\n {\n code: 'AUD',\n decimals: 2,\n stripeDecimals: 2,\n },\n {\n code: 'CAD',\n decimals: 2,\n stripeDecimals: 2,\n },\n] as const satisfies Currency[];\n"],"mappings":";;AAcA,MAAa,uBAAuB;CAClC;EACE,MAAM;EACN,UAAU;EACV,gBAAgB;CAClB;CACA;EACE,MAAM;EACN,UAAU;EACV,gBAAgB;CAClB;CACA;EACE,MAAM;EACN,UAAU;EACV,gBAAgB;CAClB;CACA;EACE,MAAM;EACN,UAAU;EACV,gBAAgB;CAClB;CACA;EACE,MAAM;EACN,UAAU;EACV,gBAAgB;CAClB;CACA;EACE,MAAM;EACN,UAAU;EACV,gBAAgB;CAClB;CACA;EACE,MAAM;EACN,UAAU;EACV,gBAAgB;CAClB;AACF"}
@@ -1,23 +1,2 @@
1
- //#region src/utils/dates.d.ts
2
- declare function isWeekend(date: Date): boolean;
3
- declare function fromNow(date: Date): string;
4
- declare function fromNowDetailed(date: Date): {
5
- result: string;
6
- /**
7
- * May be Infinity if the result will never change.
8
- */
9
- secondsUntilChange: number;
10
- };
11
- /**
12
- * Returns a string representation of the given date in the format expected by the `datetime-local` input type.
13
- */
14
- declare function getInputDatetimeLocalString(date: Date): string;
15
- type Interval = [number, 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year'];
16
- type DayInterval = [number, 'day' | 'week' | 'month' | 'year'];
17
- declare function subtractInterval(date: Date, interval: Interval): Date;
18
- declare function addInterval(date: Date, interval: Interval): Date;
19
- declare const FAR_FUTURE_DATE: Date;
20
- declare function getIntervalsElapsed(anchor: Date, to: Date, repeat: DayInterval): number;
21
- //#endregion
22
- export { DayInterval, FAR_FUTURE_DATE, Interval, addInterval, fromNow, fromNowDetailed, getInputDatetimeLocalString, getIntervalsElapsed, isWeekend, subtractInterval };
23
- //# sourceMappingURL=dates.d.ts.map
1
+ import { a as fromNow, c as getIntervalsElapsed, i as addInterval, l as isWeekend, n as FAR_FUTURE_DATE, o as fromNowDetailed, r as Interval, s as getInputDatetimeLocalString, t as DayInterval, u as subtractInterval } from "../dates-B6ne9iOR.js";
2
+ export { DayInterval, FAR_FUTURE_DATE, Interval, addInterval, fromNow, fromNowDetailed, getInputDatetimeLocalString, getIntervalsElapsed, isWeekend, subtractInterval };
@@ -1,19 +1,11 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_chunk = require('../chunk-BE-pF4vm.js');
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
2
  let ___schema_fields_js = require("../schema-fields.js");
4
3
  let __errors_js = require("./errors.js");
5
4
  let __math_js = require("./math.js");
6
-
7
5
  //#region src/utils/dates.tsx
8
6
  function isWeekend(date) {
9
7
  return date.getDay() === 0 || date.getDay() === 6;
10
8
  }
11
- (void 0)?.test("isWeekend", ({ expect }) => {
12
- expect(isWeekend(new Date(2023, 0, 1))).toBe(true);
13
- expect(isWeekend(new Date(2023, 0, 7))).toBe(true);
14
- expect(isWeekend(new Date(2023, 0, 2))).toBe(false);
15
- expect(isWeekend(new Date(2023, 0, 6))).toBe(false);
16
- });
17
9
  const agoUnits = [
18
10
  [60, "second"],
19
11
  [60, "minute"],
@@ -24,23 +16,6 @@ const agoUnits = [
24
16
  function fromNow(date) {
25
17
  return fromNowDetailed(date).result;
26
18
  }
27
- (void 0)?.test("fromNow", ({ expect }) => {
28
- const fixedDate = /* @__PURE__ */ new Date("2023-01-15T12:00:00.000Z");
29
- (void 0)?.vi.useFakeTimers();
30
- (void 0)?.vi.setSystemTime(fixedDate);
31
- expect(fromNow(/* @__PURE__ */ new Date("2023-01-15T11:59:50.000Z"))).toBe("just now");
32
- expect(fromNow(/* @__PURE__ */ new Date("2023-01-15T11:59:00.000Z"))).toBe("1 minute ago");
33
- expect(fromNow(/* @__PURE__ */ new Date("2023-01-15T11:00:00.000Z"))).toBe("1 hour ago");
34
- expect(fromNow(/* @__PURE__ */ new Date("2023-01-14T12:00:00.000Z"))).toBe("1 day ago");
35
- expect(fromNow(/* @__PURE__ */ new Date("2023-01-08T12:00:00.000Z"))).toBe("1 week ago");
36
- expect(fromNow(/* @__PURE__ */ new Date("2023-01-15T12:00:10.000Z"))).toBe("just now");
37
- expect(fromNow(/* @__PURE__ */ new Date("2023-01-15T12:01:00.000Z"))).toBe("in 1 minute");
38
- expect(fromNow(/* @__PURE__ */ new Date("2023-01-15T13:00:00.000Z"))).toBe("in 1 hour");
39
- expect(fromNow(/* @__PURE__ */ new Date("2023-01-16T12:00:00.000Z"))).toBe("in 1 day");
40
- expect(fromNow(/* @__PURE__ */ new Date("2023-01-22T12:00:00.000Z"))).toBe("in 1 week");
41
- expect(fromNow(/* @__PURE__ */ new Date("2022-01-15T12:00:00.000Z"))).toMatch(/Jan 15, 2022/);
42
- (void 0)?.vi.useRealTimers();
43
- });
44
19
  function fromNowDetailed(date) {
45
20
  if (!(date instanceof Date)) throw new Error(`fromNow only accepts Date objects (received: ${date})`);
46
21
  const elapsed = (/* @__PURE__ */ new Date()).getTime() - date.getTime();
@@ -80,17 +55,6 @@ function getInputDatetimeLocalString(date) {
80
55
  date.setMinutes(date.getMinutes() - date.getTimezoneOffset());
81
56
  return date.toISOString().slice(0, 19);
82
57
  }
83
- (void 0)?.test("getInputDatetimeLocalString", ({ expect }) => {
84
- (void 0)?.vi.useFakeTimers();
85
- expect(getInputDatetimeLocalString(/* @__PURE__ */ new Date("2023-01-15T12:30:45.000Z"))).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$/);
86
- const dates = [
87
- /* @__PURE__ */ new Date("2023-01-01T00:00:00.000Z"),
88
- /* @__PURE__ */ new Date("2023-06-15T23:59:59.000Z"),
89
- /* @__PURE__ */ new Date("2023-12-31T12:34:56.000Z")
90
- ];
91
- for (const date of dates) expect(getInputDatetimeLocalString(date)).toMatch(/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}$/);
92
- (void 0)?.vi.useRealTimers();
93
- });
94
58
  function applyInterval(date, times, interval) {
95
59
  if (!___schema_fields_js.intervalSchema.isValidSync(interval)) throw new __errors_js.HexclaveAssertionError(`Invalid interval`, { interval });
96
60
  const [amount, unit] = interval;
@@ -155,15 +119,6 @@ function getIntervalsElapsed(anchor, to, repeat) {
155
119
  }
156
120
  return 0;
157
121
  }
158
- (void 0)?.test("getIntervalsElapsed", ({ expect }) => {
159
- const anchor = /* @__PURE__ */ new Date("2025-01-01T00:00:00.000Z");
160
- const to = /* @__PURE__ */ new Date("2025-01-15T00:00:00.000Z");
161
- expect(getIntervalsElapsed(anchor, to, [1, "week"])).toBe(2);
162
- expect(getIntervalsElapsed(anchor, to, [3, "day"])).toBe(4);
163
- expect(getIntervalsElapsed(/* @__PURE__ */ new Date("2023-01-31T00:00:00.000Z"), /* @__PURE__ */ new Date("2023-03-01T00:00:00.000Z"), [1, "month"])).toBe(0);
164
- expect(getIntervalsElapsed(/* @__PURE__ */ new Date("2020-01-01T00:00:00.000Z"), /* @__PURE__ */ new Date("2022-06-01T00:00:00.000Z"), [1, "year"])).toBe(2);
165
- });
166
-
167
122
  //#endregion
168
123
  exports.FAR_FUTURE_DATE = FAR_FUTURE_DATE;
169
124
  exports.addInterval = addInterval;
@@ -173,4 +128,5 @@ exports.getInputDatetimeLocalString = getInputDatetimeLocalString;
173
128
  exports.getIntervalsElapsed = getIntervalsElapsed;
174
129
  exports.isWeekend = isWeekend;
175
130
  exports.subtractInterval = subtractInterval;
131
+
176
132
  //# sourceMappingURL=dates.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dates.js","names":[],"sources":["../../src/utils/dates.tsx"],"sourcesContent":["import { intervalSchema } from \"../schema-fields\";\nimport { HexclaveAssertionError } from \"./errors\";\nimport { remainder } from \"./math\";\n\nexport function isWeekend(date: Date): boolean {\n return date.getDay() === 0 || date.getDay() === 6;\n}\n\nimport.meta.vitest?.test(\"isWeekend\", ({ expect }) => {\n // Sunday (day 0)\n expect(isWeekend(new Date(2023, 0, 1))).toBe(true);\n // Saturday (day 6)\n expect(isWeekend(new Date(2023, 0, 7))).toBe(true);\n // Monday (day 1)\n expect(isWeekend(new Date(2023, 0, 2))).toBe(false);\n // Friday (day 5)\n expect(isWeekend(new Date(2023, 0, 6))).toBe(false);\n});\n\nconst agoUnits = [\n [60, 'second'],\n [60, 'minute'],\n [24, 'hour'],\n [7, 'day'],\n [5, 'week'],\n] as const;\n\nexport function fromNow(date: Date): string {\n return fromNowDetailed(date).result;\n}\n\nimport.meta.vitest?.test(\"fromNow\", ({ expect }) => {\n // Set a fixed date for testing\n const fixedDate = new Date(\"2023-01-15T12:00:00.000Z\");\n\n // Use Vitest's fake timers\n import.meta.vitest?.vi.useFakeTimers();\n import.meta.vitest?.vi.setSystemTime(fixedDate);\n\n // Test past times\n expect(fromNow(new Date(\"2023-01-15T11:59:50.000Z\"))).toBe(\"just now\");\n expect(fromNow(new Date(\"2023-01-15T11:59:00.000Z\"))).toBe(\"1 minute ago\");\n expect(fromNow(new Date(\"2023-01-15T11:00:00.000Z\"))).toBe(\"1 hour ago\");\n expect(fromNow(new Date(\"2023-01-14T12:00:00.000Z\"))).toBe(\"1 day ago\");\n expect(fromNow(new Date(\"2023-01-08T12:00:00.000Z\"))).toBe(\"1 week ago\");\n\n // Test future times\n expect(fromNow(new Date(\"2023-01-15T12:00:10.000Z\"))).toBe(\"just now\");\n expect(fromNow(new Date(\"2023-01-15T12:01:00.000Z\"))).toBe(\"in 1 minute\");\n expect(fromNow(new Date(\"2023-01-15T13:00:00.000Z\"))).toBe(\"in 1 hour\");\n expect(fromNow(new Date(\"2023-01-16T12:00:00.000Z\"))).toBe(\"in 1 day\");\n expect(fromNow(new Date(\"2023-01-22T12:00:00.000Z\"))).toBe(\"in 1 week\");\n\n // Test very old dates (should use date format)\n expect(fromNow(new Date(\"2022-01-15T12:00:00.000Z\"))).toMatch(/Jan 15, 2022/);\n\n // Restore real timers\n import.meta.vitest?.vi.useRealTimers();\n});\n\nexport function fromNowDetailed(date: Date): {\n result: string,\n /**\n * May be Infinity if the result will never change.\n */\n secondsUntilChange: number,\n} {\n if (!(date instanceof Date)) {\n throw new Error(`fromNow only accepts Date objects (received: ${date})`);\n }\n\n const now = new Date();\n const elapsed = now.getTime() - date.getTime();\n\n let remainingInUnit = Math.abs(elapsed) / 1000;\n if (remainingInUnit < 15) {\n return {\n result: 'just now',\n secondsUntilChange: 15 - remainingInUnit,\n };\n }\n let unitInSeconds = 1;\n for (const [nextUnitSize, unitName] of agoUnits) {\n const rounded = Math.round(remainingInUnit);\n if (rounded < nextUnitSize) {\n if (elapsed < 0) {\n return {\n result: `in ${rounded} ${unitName}${rounded === 1 ? '' : 's'}`,\n secondsUntilChange: remainder((remainingInUnit - rounded + 0.5) * unitInSeconds, unitInSeconds),\n };\n } else {\n return {\n result: `${rounded} ${unitName}${rounded === 1 ? '' : 's'} ago`,\n secondsUntilChange: remainder((rounded - remainingInUnit - 0.5) * unitInSeconds, unitInSeconds),\n };\n }\n }\n unitInSeconds *= nextUnitSize;\n remainingInUnit /= nextUnitSize;\n }\n\n return {\n result: date.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' }),\n secondsUntilChange: Infinity,\n };\n}\n\n/**\n * Returns a string representation of the given date in the format expected by the `datetime-local` input type.\n */\nexport function getInputDatetimeLocalString(date: Date): string {\n date = new Date(date);\n date.setMinutes(date.getMinutes() - date.getTimezoneOffset());\n return date.toISOString().slice(0, 19);\n}\n\nimport.meta.vitest?.test(\"getInputDatetimeLocalString\", ({ expect }) => {\n // Use Vitest's fake timers to ensure consistent timezone behavior\n import.meta.vitest?.vi.useFakeTimers();\n\n // Test with a specific date\n const mockDate = new Date(\"2023-01-15T12:30:45.000Z\");\n const result = getInputDatetimeLocalString(mockDate);\n\n // The result should be in the format YYYY-MM-DDTHH:MM:SS\n expect(result).toMatch(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$/);\n\n // Test with different dates\n const dates = [\n new Date(\"2023-01-01T00:00:00.000Z\"),\n new Date(\"2023-06-15T23:59:59.000Z\"),\n new Date(\"2023-12-31T12:34:56.000Z\"),\n ];\n\n for (const date of dates) {\n const result = getInputDatetimeLocalString(date);\n expect(result).toMatch(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$/);\n }\n\n // Restore real timers\n import.meta.vitest?.vi.useRealTimers();\n});\n\n\nexport type Interval = [number, 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year'];\nexport type DayInterval = [number, 'day' | 'week' | 'month' | 'year'];\n\nfunction applyInterval(date: Date, times: number, interval: Interval): Date {\n if (!intervalSchema.isValidSync(interval)) {\n throw new HexclaveAssertionError(`Invalid interval`, { interval });\n }\n const [amount, unit] = interval;\n switch (unit) {\n case 'millisecond': {\n date.setMilliseconds(date.getMilliseconds() + amount * times);\n break;\n }\n case 'second': {\n date.setSeconds(date.getSeconds() + amount * times);\n break;\n }\n case 'minute': {\n date.setMinutes(date.getMinutes() + amount * times);\n break;\n }\n case 'hour': {\n date.setHours(date.getHours() + amount * times);\n break;\n }\n case 'day': {\n date.setDate(date.getDate() + amount * times);\n break;\n }\n case 'week': {\n date.setDate(date.getDate() + amount * times * 7);\n break;\n }\n case 'month': {\n date.setMonth(date.getMonth() + amount * times);\n break;\n }\n case 'year': {\n date.setFullYear(date.getFullYear() + amount * times);\n break;\n }\n default: {\n throw new HexclaveAssertionError(`Invalid interval despite schema validation`, { interval });\n }\n }\n return date;\n}\n\nexport function subtractInterval(date: Date, interval: Interval): Date {\n return applyInterval(date, -1, interval);\n}\n\nexport function addInterval(date: Date, interval: Interval): Date {\n return applyInterval(date, 1, interval);\n}\n\nexport const FAR_FUTURE_DATE = new Date(8640000000000000); // 13 Sep 275760 00:00:00 UTC\n\nfunction getMsPerDayIntervalUnit(unit: 'day' | 'week'): number {\n if (unit === 'day') {\n return 24 * 60 * 60 * 1000;\n }\n return 7 * 24 * 60 * 60 * 1000;\n}\n\n\nexport function getIntervalsElapsed(anchor: Date, to: Date, repeat: DayInterval): number {\n const [amount, unit] = repeat;\n if (to <= anchor) return 0;\n if (unit === 'day' || unit === 'week') {\n const msPerUnit = getMsPerDayIntervalUnit(unit);\n const diffMs = to.getTime() - anchor.getTime();\n return Math.floor(diffMs / (msPerUnit * amount));\n }\n if ([\"month\", \"year\"].includes(unit)) {\n let count = 0;\n let current = new Date(anchor);\n for (; ;) {\n const next = addInterval(new Date(current), [amount, unit]);\n if (next > to) break;\n current = next;\n count += 1;\n }\n return count;\n }\n return 0;\n}\n\nimport.meta.vitest?.test(\"getIntervalsElapsed\", ({ expect }) => {\n const anchor = new Date('2025-01-01T00:00:00.000Z');\n const to = new Date('2025-01-15T00:00:00.000Z');\n expect(getIntervalsElapsed(anchor, to, [1, 'week'])).toBe(2);\n expect(getIntervalsElapsed(anchor, to, [3, 'day'])).toBe(4);\n\n const mAnchor = new Date('2023-01-31T00:00:00.000Z');\n const mTo = new Date('2023-03-01T00:00:00.000Z');\n expect(getIntervalsElapsed(mAnchor, mTo, [1, 'month'])).toBe(0);\n\n const yAnchor = new Date('2020-01-01T00:00:00.000Z');\n const yTo = new Date('2022-06-01T00:00:00.000Z');\n expect(getIntervalsElapsed(yAnchor, yTo, [1, 'year'])).toBe(2);\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"dates.js","names":["intervalSchema","HexclaveAssertionError"],"sources":["../../src/utils/dates.tsx"],"sourcesContent":["import { intervalSchema } from \"../schema-fields\";\nimport { HexclaveAssertionError } from \"./errors\";\nimport { remainder } from \"./math\";\n\nexport function isWeekend(date: Date): boolean {\n return date.getDay() === 0 || date.getDay() === 6;\n}\n\nimport.meta.vitest?.test(\"isWeekend\", ({ expect }) => {\n // Sunday (day 0)\n expect(isWeekend(new Date(2023, 0, 1))).toBe(true);\n // Saturday (day 6)\n expect(isWeekend(new Date(2023, 0, 7))).toBe(true);\n // Monday (day 1)\n expect(isWeekend(new Date(2023, 0, 2))).toBe(false);\n // Friday (day 5)\n expect(isWeekend(new Date(2023, 0, 6))).toBe(false);\n});\n\nconst agoUnits = [\n [60, 'second'],\n [60, 'minute'],\n [24, 'hour'],\n [7, 'day'],\n [5, 'week'],\n] as const;\n\nexport function fromNow(date: Date): string {\n return fromNowDetailed(date).result;\n}\n\nimport.meta.vitest?.test(\"fromNow\", ({ expect }) => {\n // Set a fixed date for testing\n const fixedDate = new Date(\"2023-01-15T12:00:00.000Z\");\n\n // Use Vitest's fake timers\n import.meta.vitest?.vi.useFakeTimers();\n import.meta.vitest?.vi.setSystemTime(fixedDate);\n\n // Test past times\n expect(fromNow(new Date(\"2023-01-15T11:59:50.000Z\"))).toBe(\"just now\");\n expect(fromNow(new Date(\"2023-01-15T11:59:00.000Z\"))).toBe(\"1 minute ago\");\n expect(fromNow(new Date(\"2023-01-15T11:00:00.000Z\"))).toBe(\"1 hour ago\");\n expect(fromNow(new Date(\"2023-01-14T12:00:00.000Z\"))).toBe(\"1 day ago\");\n expect(fromNow(new Date(\"2023-01-08T12:00:00.000Z\"))).toBe(\"1 week ago\");\n\n // Test future times\n expect(fromNow(new Date(\"2023-01-15T12:00:10.000Z\"))).toBe(\"just now\");\n expect(fromNow(new Date(\"2023-01-15T12:01:00.000Z\"))).toBe(\"in 1 minute\");\n expect(fromNow(new Date(\"2023-01-15T13:00:00.000Z\"))).toBe(\"in 1 hour\");\n expect(fromNow(new Date(\"2023-01-16T12:00:00.000Z\"))).toBe(\"in 1 day\");\n expect(fromNow(new Date(\"2023-01-22T12:00:00.000Z\"))).toBe(\"in 1 week\");\n\n // Test very old dates (should use date format)\n expect(fromNow(new Date(\"2022-01-15T12:00:00.000Z\"))).toMatch(/Jan 15, 2022/);\n\n // Restore real timers\n import.meta.vitest?.vi.useRealTimers();\n});\n\nexport function fromNowDetailed(date: Date): {\n result: string,\n /**\n * May be Infinity if the result will never change.\n */\n secondsUntilChange: number,\n} {\n if (!(date instanceof Date)) {\n throw new Error(`fromNow only accepts Date objects (received: ${date})`);\n }\n\n const now = new Date();\n const elapsed = now.getTime() - date.getTime();\n\n let remainingInUnit = Math.abs(elapsed) / 1000;\n if (remainingInUnit < 15) {\n return {\n result: 'just now',\n secondsUntilChange: 15 - remainingInUnit,\n };\n }\n let unitInSeconds = 1;\n for (const [nextUnitSize, unitName] of agoUnits) {\n const rounded = Math.round(remainingInUnit);\n if (rounded < nextUnitSize) {\n if (elapsed < 0) {\n return {\n result: `in ${rounded} ${unitName}${rounded === 1 ? '' : 's'}`,\n secondsUntilChange: remainder((remainingInUnit - rounded + 0.5) * unitInSeconds, unitInSeconds),\n };\n } else {\n return {\n result: `${rounded} ${unitName}${rounded === 1 ? '' : 's'} ago`,\n secondsUntilChange: remainder((rounded - remainingInUnit - 0.5) * unitInSeconds, unitInSeconds),\n };\n }\n }\n unitInSeconds *= nextUnitSize;\n remainingInUnit /= nextUnitSize;\n }\n\n return {\n result: date.toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric' }),\n secondsUntilChange: Infinity,\n };\n}\n\n/**\n * Returns a string representation of the given date in the format expected by the `datetime-local` input type.\n */\nexport function getInputDatetimeLocalString(date: Date): string {\n date = new Date(date);\n date.setMinutes(date.getMinutes() - date.getTimezoneOffset());\n return date.toISOString().slice(0, 19);\n}\n\nimport.meta.vitest?.test(\"getInputDatetimeLocalString\", ({ expect }) => {\n // Use Vitest's fake timers to ensure consistent timezone behavior\n import.meta.vitest?.vi.useFakeTimers();\n\n // Test with a specific date\n const mockDate = new Date(\"2023-01-15T12:30:45.000Z\");\n const result = getInputDatetimeLocalString(mockDate);\n\n // The result should be in the format YYYY-MM-DDTHH:MM:SS\n expect(result).toMatch(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$/);\n\n // Test with different dates\n const dates = [\n new Date(\"2023-01-01T00:00:00.000Z\"),\n new Date(\"2023-06-15T23:59:59.000Z\"),\n new Date(\"2023-12-31T12:34:56.000Z\"),\n ];\n\n for (const date of dates) {\n const result = getInputDatetimeLocalString(date);\n expect(result).toMatch(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$/);\n }\n\n // Restore real timers\n import.meta.vitest?.vi.useRealTimers();\n});\n\n\nexport type Interval = [number, 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year'];\nexport type DayInterval = [number, 'day' | 'week' | 'month' | 'year'];\n\nfunction applyInterval(date: Date, times: number, interval: Interval): Date {\n if (!intervalSchema.isValidSync(interval)) {\n throw new HexclaveAssertionError(`Invalid interval`, { interval });\n }\n const [amount, unit] = interval;\n switch (unit) {\n case 'millisecond': {\n date.setMilliseconds(date.getMilliseconds() + amount * times);\n break;\n }\n case 'second': {\n date.setSeconds(date.getSeconds() + amount * times);\n break;\n }\n case 'minute': {\n date.setMinutes(date.getMinutes() + amount * times);\n break;\n }\n case 'hour': {\n date.setHours(date.getHours() + amount * times);\n break;\n }\n case 'day': {\n date.setDate(date.getDate() + amount * times);\n break;\n }\n case 'week': {\n date.setDate(date.getDate() + amount * times * 7);\n break;\n }\n case 'month': {\n date.setMonth(date.getMonth() + amount * times);\n break;\n }\n case 'year': {\n date.setFullYear(date.getFullYear() + amount * times);\n break;\n }\n default: {\n throw new HexclaveAssertionError(`Invalid interval despite schema validation`, { interval });\n }\n }\n return date;\n}\n\nexport function subtractInterval(date: Date, interval: Interval): Date {\n return applyInterval(date, -1, interval);\n}\n\nexport function addInterval(date: Date, interval: Interval): Date {\n return applyInterval(date, 1, interval);\n}\n\nexport const FAR_FUTURE_DATE = new Date(8640000000000000); // 13 Sep 275760 00:00:00 UTC\n\nfunction getMsPerDayIntervalUnit(unit: 'day' | 'week'): number {\n if (unit === 'day') {\n return 24 * 60 * 60 * 1000;\n }\n return 7 * 24 * 60 * 60 * 1000;\n}\n\n\nexport function getIntervalsElapsed(anchor: Date, to: Date, repeat: DayInterval): number {\n const [amount, unit] = repeat;\n if (to <= anchor) return 0;\n if (unit === 'day' || unit === 'week') {\n const msPerUnit = getMsPerDayIntervalUnit(unit);\n const diffMs = to.getTime() - anchor.getTime();\n return Math.floor(diffMs / (msPerUnit * amount));\n }\n if ([\"month\", \"year\"].includes(unit)) {\n let count = 0;\n let current = new Date(anchor);\n for (; ;) {\n const next = addInterval(new Date(current), [amount, unit]);\n if (next > to) break;\n current = next;\n count += 1;\n }\n return count;\n }\n return 0;\n}\n\nimport.meta.vitest?.test(\"getIntervalsElapsed\", ({ expect }) => {\n const anchor = new Date('2025-01-01T00:00:00.000Z');\n const to = new Date('2025-01-15T00:00:00.000Z');\n expect(getIntervalsElapsed(anchor, to, [1, 'week'])).toBe(2);\n expect(getIntervalsElapsed(anchor, to, [3, 'day'])).toBe(4);\n\n const mAnchor = new Date('2023-01-31T00:00:00.000Z');\n const mTo = new Date('2023-03-01T00:00:00.000Z');\n expect(getIntervalsElapsed(mAnchor, mTo, [1, 'month'])).toBe(0);\n\n const yAnchor = new Date('2020-01-01T00:00:00.000Z');\n const yTo = new Date('2022-06-01T00:00:00.000Z');\n expect(getIntervalsElapsed(yAnchor, yTo, [1, 'year'])).toBe(2);\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"dev-env-state-path.d.ts","names":[],"sources":["../../src/utils/dev-env-state-path.ts"],"mappings":";iBAGgB,8BAAA,CAAA;AAAA,iBAQA,uBAAA,CAAA"}
1
+ {"version":3,"file":"dev-env-state-path.d.ts","names":[],"sources":["../../src/utils/dev-env-state-path.ts"],"mappings":";iBAGgB,8BAAA;AAAA,iBAQA,uBAAA"}
@@ -1,8 +1,6 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_chunk = require('../chunk-BE-pF4vm.js');
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
2
  let path = require("path");
4
3
  let os = require("os");
5
-
6
4
  //#region src/utils/dev-env-state-path.ts
7
5
  function defaultHexclaveDevEnvStatePath() {
8
6
  if (process.platform === "win32") return (0, path.join)(process.env.LOCALAPPDATA ?? (0, path.join)((0, os.homedir)(), "AppData", "Local"), "Hexclave", "dev-envs.json");
@@ -11,8 +9,8 @@ function defaultHexclaveDevEnvStatePath() {
11
9
  function hexclaveDevEnvStatePath() {
12
10
  return process.env.STACK_DEV_ENVS_PATH ?? defaultHexclaveDevEnvStatePath();
13
11
  }
14
-
15
12
  //#endregion
16
13
  exports.defaultHexclaveDevEnvStatePath = defaultHexclaveDevEnvStatePath;
17
14
  exports.hexclaveDevEnvStatePath = hexclaveDevEnvStatePath;
15
+
18
16
  //# sourceMappingURL=dev-env-state-path.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev-env-state-path.js","names":[],"sources":["../../src/utils/dev-env-state-path.ts"],"sourcesContent":["import { homedir } from \"os\";\nimport { join } from \"path\";\n\nexport function defaultHexclaveDevEnvStatePath(): string {\n if (process.platform === \"win32\") {\n const localAppData = process.env.LOCALAPPDATA ?? join(homedir(), \"AppData\", \"Local\");\n return join(localAppData, \"Hexclave\", \"dev-envs.json\");\n }\n return join(homedir(), \".stack\", \"dev-envs.json\");\n}\n\nexport function hexclaveDevEnvStatePath(): string {\n return process.env.STACK_DEV_ENVS_PATH ?? defaultHexclaveDevEnvStatePath();\n}\n"],"mappings":";;;;;;AAGA,SAAgB,iCAAyC;AACvD,KAAI,QAAQ,aAAa,QAEvB,uBADqB,QAAQ,IAAI,gDAA8B,EAAE,WAAW,QAAQ,EAC1D,YAAY,gBAAgB;AAExD,wCAAqB,EAAE,UAAU,gBAAgB;;AAGnD,SAAgB,0BAAkC;AAChD,QAAO,QAAQ,IAAI,uBAAuB,gCAAgC"}
1
+ {"version":3,"file":"dev-env-state-path.js","names":[],"sources":["../../src/utils/dev-env-state-path.ts"],"sourcesContent":["import { homedir } from \"os\";\nimport { join } from \"path\";\n\nexport function defaultHexclaveDevEnvStatePath(): string {\n if (process.platform === \"win32\") {\n const localAppData = process.env.LOCALAPPDATA ?? join(homedir(), \"AppData\", \"Local\");\n return join(localAppData, \"Hexclave\", \"dev-envs.json\");\n }\n return join(homedir(), \".stack\", \"dev-envs.json\");\n}\n\nexport function hexclaveDevEnvStatePath(): string {\n return process.env.STACK_DEV_ENVS_PATH ?? defaultHexclaveDevEnvStatePath();\n}\n"],"mappings":";;;;AAGA,SAAgB,iCAAyC;CACvD,IAAI,QAAQ,aAAa,SAEvB,QAAA,GAAA,KAAA,KAAA,CADqB,QAAQ,IAAI,iBAAA,GAAA,KAAA,KAAA,EAAA,GAAA,GAAA,QAAA,CAA6B,GAAG,WAAW,OAAO,GACzD,YAAY,eAAe;CAEvD,QAAA,GAAA,KAAA,KAAA,EAAA,GAAA,GAAA,QAAA,CAAoB,GAAG,UAAU,eAAe;AAClD;AAEA,SAAgB,0BAAkC;CAChD,OAAO,QAAQ,IAAI,uBAAuB,+BAA+B;AAC3E"}
@@ -1 +1 @@
1
- {"version":3,"file":"dev-tool.d.ts","names":[],"sources":["../../src/utils/dev-tool.tsx"],"mappings":";;AAeA;;;;;AAQA;;;;;AAGA;;;;cAXa,gBAAA;AAcb;;;;;;AAAA,cANa,gBAAA;;cAGA,qBAAA;;cAGA,qBAAA"}
1
+ {"version":3,"file":"dev-tool.d.ts","names":[],"sources":["../../src/utils/dev-tool.tsx"],"mappings":";;AAeA;;;;AAA6B;AAQ7B;;;;AAA6B;AAG7B;;;;cAXa,gBAAA;AAcb;;;;AAAkC;;AAAlC,cANa,gBAAA;;cAGA,qBAAA;;cAGA,qBAAA"}
@@ -1,5 +1,4 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
2
  //#region src/utils/dev-tool.tsx
4
3
  /**
5
4
  * Shared identity of the Hexclave in-page dev tool / clickmap overlay.
@@ -28,10 +27,10 @@ const CLICKMAP_ROOT_ID = "__hexclave-clickmap-root";
28
27
  const DEV_TOOL_CLASS_PREFIX = "sdt-";
29
28
  /** Legacy class marker still present on older dev-tool builds. */
30
29
  const DEV_TOOL_LEGACY_CLASS = "stack-devtool";
31
-
32
30
  //#endregion
33
31
  exports.CLICKMAP_ROOT_ID = CLICKMAP_ROOT_ID;
34
32
  exports.DEV_TOOL_CLASS_PREFIX = DEV_TOOL_CLASS_PREFIX;
35
33
  exports.DEV_TOOL_LEGACY_CLASS = DEV_TOOL_LEGACY_CLASS;
36
34
  exports.DEV_TOOL_ROOT_ID = DEV_TOOL_ROOT_ID;
35
+
37
36
  //# sourceMappingURL=dev-tool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dev-tool.js","names":[],"sources":["../../src/utils/dev-tool.tsx"],"sourcesContent":["/**\n * Shared identity of the Hexclave in-page dev tool / clickmap overlay.\n *\n * These constants are the single source of truth for \"is this DOM / event /\n * stored click part of the dev tool itself?\". They are consumed across package\n * boundaries:\n * - the dev tool mounts its root element with {@link DEV_TOOL_ROOT_ID} and\n * prefixes every generated class with {@link DEV_TOOL_CLASS_PREFIX};\n * - the event tracker uses them to skip self-clicks at ingest;\n * - the backend clickmap query uses them to filter dev-tool clicks out of\n * aggregate clickmaps server-side.\n *\n * Keep them here so a rename can never silently desync the SQL filter from the\n * actual DOM identity.\n */\nexport const DEV_TOOL_ROOT_ID = \"__hexclave-dev-tool-root\";\n\n/**\n * Root element id of the standalone clickmap overlay. The clickmap is an\n * independent feature with its own mount (it must survive the dev tool being\n * removed), so it gets its own root — but its self-clicks need the exact same\n * ingest/query exclusions as the dev tool's.\n */\nexport const CLICKMAP_ROOT_ID = \"__hexclave-clickmap-root\";\n\n/** Prefix applied to every class/generated id the dev tool renders. */\nexport const DEV_TOOL_CLASS_PREFIX = \"sdt-\";\n\n/** Legacy class marker still present on older dev-tool builds. */\nexport const DEV_TOOL_LEGACY_CLASS = \"stack-devtool\";\n"],"mappings":";;;;;;;;;;;;;;;;;;AAeA,MAAa,mBAAmB;;;;;;;AAQhC,MAAa,mBAAmB;;AAGhC,MAAa,wBAAwB;;AAGrC,MAAa,wBAAwB"}
1
+ {"version":3,"file":"dev-tool.js","names":[],"sources":["../../src/utils/dev-tool.tsx"],"sourcesContent":["/**\n * Shared identity of the Hexclave in-page dev tool / clickmap overlay.\n *\n * These constants are the single source of truth for \"is this DOM / event /\n * stored click part of the dev tool itself?\". They are consumed across package\n * boundaries:\n * - the dev tool mounts its root element with {@link DEV_TOOL_ROOT_ID} and\n * prefixes every generated class with {@link DEV_TOOL_CLASS_PREFIX};\n * - the event tracker uses them to skip self-clicks at ingest;\n * - the backend clickmap query uses them to filter dev-tool clicks out of\n * aggregate clickmaps server-side.\n *\n * Keep them here so a rename can never silently desync the SQL filter from the\n * actual DOM identity.\n */\nexport const DEV_TOOL_ROOT_ID = \"__hexclave-dev-tool-root\";\n\n/**\n * Root element id of the standalone clickmap overlay. The clickmap is an\n * independent feature with its own mount (it must survive the dev tool being\n * removed), so it gets its own root — but its self-clicks need the exact same\n * ingest/query exclusions as the dev tool's.\n */\nexport const CLICKMAP_ROOT_ID = \"__hexclave-clickmap-root\";\n\n/** Prefix applied to every class/generated id the dev tool renders. */\nexport const DEV_TOOL_CLASS_PREFIX = \"sdt-\";\n\n/** Legacy class marker still present on older dev-tool builds. */\nexport const DEV_TOOL_LEGACY_CLASS = \"stack-devtool\";\n"],"mappings":";;;;;;;;;;;;;;;;;AAeA,MAAa,mBAAmB;;;;;;;AAQhC,MAAa,mBAAmB;;AAGhC,MAAa,wBAAwB;;AAGrC,MAAa,wBAAwB"}
@@ -1 +1 @@
1
- {"version":3,"file":"dom.d.ts","names":[],"sources":["../../src/utils/dom.tsx"],"mappings":";iBAAgB,kBAAA,CAAmB,OAAA,EAAS,WAAA;AAA5C;;;;;AAAA,iBAagB,cAAA,CAAe,KAAA"}
1
+ {"version":3,"file":"dom.d.ts","names":[],"sources":["../../src/utils/dom.tsx"],"mappings":";iBAAgB,kBAAA,CAAmB,OAAoB,EAAX,WAAW;AAAvD;;;;AAAuD;AAAvD,iBAagB,cAAA,CAAe,KAAa"}
package/dist/utils/dom.js CHANGED
@@ -1,5 +1,4 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
2
  //#region src/utils/dom.tsx
4
3
  function hasClickableParent(element) {
5
4
  const parent = element.parentElement;
@@ -26,8 +25,8 @@ function cssEscapeIdent(value) {
26
25
  }
27
26
  return escaped;
28
27
  }
29
-
30
28
  //#endregion
31
29
  exports.cssEscapeIdent = cssEscapeIdent;
32
30
  exports.hasClickableParent = hasClickableParent;
31
+
33
32
  //# sourceMappingURL=dom.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"dom.js","names":[],"sources":["../../src/utils/dom.tsx"],"sourcesContent":["export function hasClickableParent(element: HTMLElement): boolean {\n const parent = element.parentElement;\n if (!parent) return false;\n if (parent.dataset.n2Clickable) return true;\n\n return hasClickableParent(element.parentElement);\n}\n\n/**\n * Escape a string so it is safe to use as a CSS identifier (id/class) inside a selector.\n * Prefers the native `CSS.escape` when available, falling back to a conservative\n * backslash-escape for non-DOM environments (SSR, tests, older runtimes).\n */\nexport function cssEscapeIdent(value: string): string {\n if (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") {\n return CSS.escape(value);\n }\n\n let escaped = \"\";\n for (let i = 0; i < value.length; i += 1) {\n const char = value.charAt(i);\n const codeUnit = value.charCodeAt(i);\n\n if (codeUnit === 0x0000) {\n escaped += \"\\uFFFD\";\n } else if (\n (codeUnit >= 0x0001 && codeUnit <= 0x001f) ||\n codeUnit === 0x007f ||\n (i === 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n (i === 1 && codeUnit >= 0x0030 && codeUnit <= 0x0039 && value.charCodeAt(0) === 0x002d)\n ) {\n escaped += `\\\\${codeUnit.toString(16)} `;\n } else if (i === 0 && codeUnit === 0x002d && value.length === 1) {\n escaped += \"\\\\-\";\n } else if (\n codeUnit >= 0x0080 ||\n codeUnit === 0x002d ||\n codeUnit === 0x005f ||\n (codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n (codeUnit >= 0x0041 && codeUnit <= 0x005a) ||\n (codeUnit >= 0x0061 && codeUnit <= 0x007a)\n ) {\n escaped += char;\n } else {\n escaped += `\\\\${char}`;\n }\n }\n return escaped;\n}\n"],"mappings":";;;AAAA,SAAgB,mBAAmB,SAA+B;CAChE,MAAM,SAAS,QAAQ;AACvB,KAAI,CAAC,OAAQ,QAAO;AACpB,KAAI,OAAO,QAAQ,YAAa,QAAO;AAEvC,QAAO,mBAAmB,QAAQ,cAAc;;;;;;;AAQlD,SAAgB,eAAe,OAAuB;AACpD,KAAI,OAAO,QAAQ,eAAe,OAAO,IAAI,WAAW,WACtD,QAAO,IAAI,OAAO,MAAM;CAG1B,IAAI,UAAU;AACd,MAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxC,MAAM,OAAO,MAAM,OAAO,EAAE;EAC5B,MAAM,WAAW,MAAM,WAAW,EAAE;AAEpC,MAAI,aAAa,EACf,YAAW;WAEV,YAAY,KAAU,YAAY,MACnC,aAAa,OACZ,MAAM,KAAK,YAAY,MAAU,YAAY,MAC7C,MAAM,KAAK,YAAY,MAAU,YAAY,MAAU,MAAM,WAAW,EAAE,KAAK,GAEhF,YAAW,KAAK,SAAS,SAAS,GAAG,CAAC;WAC7B,MAAM,KAAK,aAAa,MAAU,MAAM,WAAW,EAC5D,YAAW;WAEX,YAAY,OACZ,aAAa,MACb,aAAa,MACZ,YAAY,MAAU,YAAY,MAClC,YAAY,MAAU,YAAY,MAClC,YAAY,MAAU,YAAY,IAEnC,YAAW;MAEX,YAAW,KAAK;;AAGpB,QAAO"}
1
+ {"version":3,"file":"dom.js","names":[],"sources":["../../src/utils/dom.tsx"],"sourcesContent":["export function hasClickableParent(element: HTMLElement): boolean {\n const parent = element.parentElement;\n if (!parent) return false;\n if (parent.dataset.n2Clickable) return true;\n\n return hasClickableParent(element.parentElement);\n}\n\n/**\n * Escape a string so it is safe to use as a CSS identifier (id/class) inside a selector.\n * Prefers the native `CSS.escape` when available, falling back to a conservative\n * backslash-escape for non-DOM environments (SSR, tests, older runtimes).\n */\nexport function cssEscapeIdent(value: string): string {\n if (typeof CSS !== \"undefined\" && typeof CSS.escape === \"function\") {\n return CSS.escape(value);\n }\n\n let escaped = \"\";\n for (let i = 0; i < value.length; i += 1) {\n const char = value.charAt(i);\n const codeUnit = value.charCodeAt(i);\n\n if (codeUnit === 0x0000) {\n escaped += \"\\uFFFD\";\n } else if (\n (codeUnit >= 0x0001 && codeUnit <= 0x001f) ||\n codeUnit === 0x007f ||\n (i === 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n (i === 1 && codeUnit >= 0x0030 && codeUnit <= 0x0039 && value.charCodeAt(0) === 0x002d)\n ) {\n escaped += `\\\\${codeUnit.toString(16)} `;\n } else if (i === 0 && codeUnit === 0x002d && value.length === 1) {\n escaped += \"\\\\-\";\n } else if (\n codeUnit >= 0x0080 ||\n codeUnit === 0x002d ||\n codeUnit === 0x005f ||\n (codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n (codeUnit >= 0x0041 && codeUnit <= 0x005a) ||\n (codeUnit >= 0x0061 && codeUnit <= 0x007a)\n ) {\n escaped += char;\n } else {\n escaped += `\\\\${char}`;\n }\n }\n return escaped;\n}\n"],"mappings":";;AAAA,SAAgB,mBAAmB,SAA+B;CAChE,MAAM,SAAS,QAAQ;CACvB,IAAI,CAAC,QAAQ,OAAO;CACpB,IAAI,OAAO,QAAQ,aAAa,OAAO;CAEvC,OAAO,mBAAmB,QAAQ,aAAa;AACjD;;;;;;AAOA,SAAgB,eAAe,OAAuB;CACpD,IAAI,OAAO,QAAQ,eAAe,OAAO,IAAI,WAAW,YACtD,OAAO,IAAI,OAAO,KAAK;CAGzB,IAAI,UAAU;CACd,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;EACxC,MAAM,OAAO,MAAM,OAAO,CAAC;EAC3B,MAAM,WAAW,MAAM,WAAW,CAAC;EAEnC,IAAI,aAAa,GACf,WAAW;OACN,IACJ,YAAY,KAAU,YAAY,MACnC,aAAa,OACZ,MAAM,KAAK,YAAY,MAAU,YAAY,MAC7C,MAAM,KAAK,YAAY,MAAU,YAAY,MAAU,MAAM,WAAW,CAAC,MAAM,IAEhF,WAAW,KAAK,SAAS,SAAS,EAAE,EAAE;OACjC,IAAI,MAAM,KAAK,aAAa,MAAU,MAAM,WAAW,GAC5D,WAAW;OACN,IACL,YAAY,OACZ,aAAa,MACb,aAAa,MACZ,YAAY,MAAU,YAAY,MAClC,YAAY,MAAU,YAAY,MAClC,YAAY,MAAU,YAAY,KAEnC,WAAW;OAEX,WAAW,KAAK;CAEpB;CACA,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"elements-chain.d.ts","names":[],"sources":["../../src/utils/elements-chain.tsx"],"mappings":";;AAeA;;;;;;;;;;;;;KAAY,oBAAA;EACV,GAAA;EACA,OAAA;EACA,KAAA,EAAO,MAAA;EACP,IAAA;EACA,QAAA;EACA,SAAA;EACA,IAAA;AAAA;AAAA,cAGW,wBAAA;AAAA,cACA,uBAAA;AAAA,cACA,uBAAA;AAAA,cAKA,oBAAA;;;;AAAb;iBAyFgB,kBAAA,CAAmB,OAAA,EAAS,OAAA;;iBA0K5B,kBAAA,CAAmB,KAAA,WAAgB,oBAAA"}
1
+ {"version":3,"file":"elements-chain.d.ts","names":[],"sources":["../../src/utils/elements-chain.tsx"],"mappings":";;AAeA;;;;;;;;;;;;;KAAY,oBAAA;EACV,GAAA;EACA,OAAA;EACA,KAAA,EAAO,MAAM;EACb,IAAA;EACA,QAAA;EACA,SAAA;EACA,IAAA;AAAA;AAAA,cAGW,wBAAA;AAAA,cACA,uBAAA;AAAA,cACA,uBAAA;AAAA,cAKA,oBAAA;;;AALuB;AAKpC;iBAyFgB,kBAAA,CAAmB,OAAgB,EAAP,OAAO;;iBA0KnC,kBAAA,CAAmB,KAAA,WAAgB,oBAAoB"}
@@ -1,5 +1,4 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
2
  //#region src/utils/elements-chain.tsx
4
3
  const ELEMENTS_CHAIN_MAX_DEPTH = 8;
5
4
  const ELEMENTS_CHAIN_TEXT_MAX = 80;
@@ -47,7 +46,7 @@ function serializeElementsChainSegment(element) {
47
46
  parts.push(element.tagName.toLowerCase());
48
47
  const classes = getElementClasses(element);
49
48
  if (classes.length > 0) parts.push(`.${classes.map(escapeElementsChainClass).join(".")}`);
50
- const text = element.textContent.trim().replace(/\s+/g, " ").slice(0, ELEMENTS_CHAIN_TEXT_MAX);
49
+ const text = element.textContent.trim().replace(/\s+/g, " ").slice(0, 80);
51
50
  const nthChild = getNthChildIndex(element);
52
51
  const nthOfType = getNthOfTypeIndex(element);
53
52
  const attrPairs = [];
@@ -57,11 +56,11 @@ function serializeElementsChainSegment(element) {
57
56
  for (const attrName of ELEMENTS_CHAIN_ATTRS) {
58
57
  const value = element.getAttribute(attrName);
59
58
  if (value == null || value === "") continue;
60
- attrPairs.push(`attr__${attrName}="${escapeElementsChainValue(value.slice(0, ELEMENTS_CHAIN_ATTR_MAX))}"`);
59
+ attrPairs.push(`attr__${attrName}="${escapeElementsChainValue(value.slice(0, 200))}"`);
61
60
  }
62
61
  if (element.tagName === "A") {
63
62
  const href = element.getAttribute("href");
64
- if (href != null && href !== "") attrPairs.push(`href="${escapeElementsChainValue(href.slice(0, ELEMENTS_CHAIN_ATTR_MAX))}"`);
63
+ if (href != null && href !== "") attrPairs.push(`href="${escapeElementsChainValue(href.slice(0, 200))}"`);
65
64
  }
66
65
  if (attrPairs.length > 0) parts.push(`:${attrPairs.join(":")}`);
67
66
  return parts.join("");
@@ -74,7 +73,7 @@ function buildElementsChain(element) {
74
73
  const segments = [];
75
74
  let current = element;
76
75
  let depth = 0;
77
- while (current != null && depth < ELEMENTS_CHAIN_MAX_DEPTH && current !== document.documentElement) {
76
+ while (current != null && depth < 8 && current !== document.documentElement) {
78
77
  segments.push(serializeElementsChainSegment(current));
79
78
  current = current.parentElement;
80
79
  depth += 1;
@@ -248,52 +247,6 @@ function parseElementsChain(chain) {
248
247
  if (current.length > 0) segments.push(current);
249
248
  return segments.map(parseElementsChainSegment).filter((segment) => segment != null);
250
249
  }
251
- (void 0)?.test("parseElementsChain parses a simple leaf+ancestor chain", ({ expect }) => {
252
- expect(parseElementsChain("button.btn.btn-primary:nth-of-type=\"1\":text=\"Save\":attr__id=\"save-btn\";div.container")).toEqual([{
253
- tag: "button",
254
- classes: ["btn", "btn-primary"],
255
- attrs: { id: "save-btn" },
256
- text: "Save",
257
- nthChild: null,
258
- nthOfType: 1,
259
- href: null
260
- }, {
261
- tag: "div",
262
- classes: ["container"],
263
- attrs: {},
264
- text: null,
265
- nthChild: null,
266
- nthOfType: null,
267
- href: null
268
- }]);
269
- });
270
- (void 0)?.test("parseElementsChain reverses class escaping for Tailwind-style tokens", ({ expect }) => {
271
- expect(parseElementsChain("a.md\\:hover\\:bg-blue-500.w-\\[1\\.5rem\\]:href=\"/p?a=1\"")).toEqual([{
272
- tag: "a",
273
- classes: ["md:hover:bg-blue-500", "w-[1.5rem]"],
274
- attrs: { href: "/p?a=1" },
275
- text: null,
276
- nthChild: null,
277
- nthOfType: null,
278
- href: "/p?a=1"
279
- }]);
280
- });
281
- (void 0)?.test("parseElementsChain unescapes quotes/backslashes and ignores ';' inside quoted values", ({ expect }) => {
282
- expect(parseElementsChain("span:text=\"a \\\"b\\\"; c \\\\ d\"")).toEqual([{
283
- tag: "span",
284
- classes: [],
285
- attrs: {},
286
- text: "a \"b\"; c \\ d",
287
- nthChild: null,
288
- nthOfType: null,
289
- href: null
290
- }]);
291
- });
292
- (void 0)?.test("parseElementsChain drops empty/tagless segments", ({ expect }) => {
293
- expect(parseElementsChain("")).toEqual([]);
294
- expect(parseElementsChain(";;")).toEqual([]);
295
- });
296
-
297
250
  //#endregion
298
251
  exports.ELEMENTS_CHAIN_ATTRS = ELEMENTS_CHAIN_ATTRS;
299
252
  exports.ELEMENTS_CHAIN_ATTR_MAX = ELEMENTS_CHAIN_ATTR_MAX;
@@ -301,4 +254,5 @@ exports.ELEMENTS_CHAIN_MAX_DEPTH = ELEMENTS_CHAIN_MAX_DEPTH;
301
254
  exports.ELEMENTS_CHAIN_TEXT_MAX = ELEMENTS_CHAIN_TEXT_MAX;
302
255
  exports.buildElementsChain = buildElementsChain;
303
256
  exports.parseElementsChain = parseElementsChain;
257
+
304
258
  //# sourceMappingURL=elements-chain.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"elements-chain.js","names":[],"sources":["../../src/utils/elements-chain.tsx"],"sourcesContent":["/**\n * PostHog-style `elements_chain` format — the single owner of both halves of the\n * contract. The event tracker {@link buildElementsChain serializes} a clicked\n * element (and its ancestors) into a string; the clickmap overlay\n * {@link parseElementsChain parses} that string back into structured segments so\n * it can re-locate the element in a live DOM.\n *\n * Encode and decode MUST round-trip exactly, which is why they live together:\n * the escaping applied here on the write side is reversed by the parser below,\n * and a single round-trip test in `elements-chain.test.tsx` guards the pair.\n *\n * Segment shape (leaf-first, joined by `;`):\n * tag.class1.class2:nth-child=\"2\":nth-of-type=\"1\":text=\"Save\":attr__id=\"x\":href=\"...\"\n */\n\nexport type ElementsChainSegment = {\n tag: string,\n classes: string[],\n attrs: Record<string, string>,\n text: string | null,\n nthChild: number | null,\n nthOfType: number | null,\n href: string | null,\n};\n\nexport const ELEMENTS_CHAIN_MAX_DEPTH = 8;\nexport const ELEMENTS_CHAIN_TEXT_MAX = 80;\nexport const ELEMENTS_CHAIN_ATTR_MAX = 200;\n\n// Attributes we serialise into elements_chain. Mirrors the set PostHog persists:\n// stable identifiers (id, data-testid), semantics (role, type, name, aria-label),\n// and a few we expect downstream tooling to want to match against.\nexport const ELEMENTS_CHAIN_ATTRS = [\n \"id\",\n \"data-testid\",\n \"data-test-id\",\n \"data-hexclave-id\",\n \"name\",\n \"type\",\n \"role\",\n \"aria-label\",\n \"placeholder\",\n \"title\",\n] as const;\n\n// ---------------------------------------------------------------------------\n// Serialization (DOM element -> elements_chain string)\n// ---------------------------------------------------------------------------\n\nfunction escapeElementsChainValue(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\n// Class tokens are written into the unquoted, dot-joined prefix of a segment, so\n// any \".\" or \":\" inside a class (e.g. Tailwind variants like `md:hover:bg-blue-500`\n// or arbitrary values like `w-[1.5rem]`) must be escaped to round-trip through the\n// parser, which splits the prefix on unescaped \".\" and the segment on unescaped \":\".\nfunction escapeElementsChainClass(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\./g, \"\\\\.\").replace(/:/g, \"\\\\:\");\n}\n\nfunction getElementClasses(element: Element): string[] {\n const className = (element as HTMLElement).className;\n if (typeof className !== \"string\" || className.trim() === \"\") {\n return [];\n }\n return className.trim().split(/\\s+/).filter(Boolean).slice(0, 4);\n}\n\nfunction getNthChildIndex(element: Element): number | null {\n const parent = element.parentElement;\n if (parent == null) return null;\n const index = Array.prototype.indexOf.call(parent.children, element);\n return index >= 0 ? index + 1 : null;\n}\n\nfunction getNthOfTypeIndex(element: Element): number | null {\n const parent = element.parentElement;\n if (parent == null) return null;\n const tagName = element.tagName;\n const siblings = Array.from(parent.children).filter((child) => child.tagName === tagName);\n if (siblings.length <= 1) return null;\n const index = siblings.indexOf(element);\n return index >= 0 ? index + 1 : null;\n}\n\nfunction serializeElementsChainSegment(element: Element): string {\n const parts: string[] = [];\n parts.push(element.tagName.toLowerCase());\n const classes = getElementClasses(element);\n if (classes.length > 0) {\n parts.push(`.${classes.map(escapeElementsChainClass).join(\".\")}`);\n }\n const text = element.textContent.trim().replace(/\\s+/g, \" \").slice(0, ELEMENTS_CHAIN_TEXT_MAX);\n const nthChild = getNthChildIndex(element);\n const nthOfType = getNthOfTypeIndex(element);\n const attrPairs: string[] = [];\n if (nthChild != null) attrPairs.push(`nth-child=\"${nthChild}\"`);\n if (nthOfType != null) attrPairs.push(`nth-of-type=\"${nthOfType}\"`);\n if (text !== \"\") attrPairs.push(`text=\"${escapeElementsChainValue(text)}\"`);\n for (const attrName of ELEMENTS_CHAIN_ATTRS) {\n const value = element.getAttribute(attrName);\n if (value == null || value === \"\") continue;\n attrPairs.push(`attr__${attrName}=\"${escapeElementsChainValue(value.slice(0, ELEMENTS_CHAIN_ATTR_MAX))}\"`);\n }\n if (element.tagName === \"A\") {\n const href = element.getAttribute(\"href\");\n if (href != null && href !== \"\") {\n attrPairs.push(`href=\"${escapeElementsChainValue(href.slice(0, ELEMENTS_CHAIN_ATTR_MAX))}\"`);\n }\n }\n if (attrPairs.length > 0) {\n parts.push(`:${attrPairs.join(\":\")}`);\n }\n return parts.join(\"\");\n}\n\n/**\n * Serialise a clicked element and up to {@link ELEMENTS_CHAIN_MAX_DEPTH}\n * ancestors (leaf-first) into an `elements_chain` string.\n */\nexport function buildElementsChain(element: Element): string {\n const segments: string[] = [];\n let current: Element | null = element;\n let depth = 0;\n while (current != null && depth < ELEMENTS_CHAIN_MAX_DEPTH && current !== document.documentElement) {\n segments.push(serializeElementsChainSegment(current));\n current = current.parentElement;\n depth += 1;\n }\n return segments.join(\";\");\n}\n\n// ---------------------------------------------------------------------------\n// Parsing (elements_chain string -> structured segments)\n// ---------------------------------------------------------------------------\n\n// Split a string on unescaped occurrences of `.`, unescaping `\\.`, `\\:` and `\\\\`\n// back to their literal characters. Reverses `escapeElementsChainClass`.\nfunction splitEscapedDots(input: string): string[] {\n const out: string[] = [];\n let cur = '';\n for (let i = 0; i < input.length; i++) {\n const ch = input[i];\n if (ch === '\\\\' && i + 1 < input.length) {\n cur += input[i + 1];\n i += 1;\n continue;\n }\n if (ch === '.') {\n out.push(cur);\n cur = '';\n continue;\n }\n cur += ch;\n }\n out.push(cur);\n return out;\n}\n\ntype ElementsChainAttrResult = {\n nthChild?: number,\n nthOfType?: number,\n text?: string,\n href?: string,\n attrKey?: string,\n attrValue?: string,\n};\n\nfunction applyElementsChainAttr(key: string, value: string): ElementsChainAttrResult {\n if (key === 'nth-child') {\n const n = Number.parseInt(value, 10);\n return Number.isFinite(n) ? { nthChild: n } : {};\n }\n if (key === 'nth-of-type') {\n const n = Number.parseInt(value, 10);\n return Number.isFinite(n) ? { nthOfType: n } : {};\n }\n if (key === 'text') {\n return { text: value };\n }\n if (key === 'href') {\n return { href: value, attrKey: key, attrValue: value };\n }\n if (key.startsWith('attr__')) {\n return { attrKey: key.slice('attr__'.length), attrValue: value };\n }\n return { attrKey: key, attrValue: value };\n}\n\nfunction parseElementsChainSegment(segment: string): ElementsChainSegment | null {\n const trimmed = segment.trim();\n if (trimmed === '') return null;\n\n // Find first ':' at top level — separates tag/classes prefix from attribute pairs.\n let prefixEnd = trimmed.length;\n let inQuotes = false;\n for (let i = 0; i < trimmed.length; i++) {\n const ch = trimmed[i];\n if (ch === '\\\\' && i + 1 < trimmed.length) {\n i += 1;\n continue;\n }\n if (ch === '\"') {\n inQuotes = !inQuotes;\n continue;\n }\n if (ch === ':' && !inQuotes) {\n prefixEnd = i;\n break;\n }\n }\n\n const prefix = trimmed.slice(0, prefixEnd);\n const rest = trimmed.slice(prefixEnd);\n const prefixParts = splitEscapedDots(prefix);\n const tag = prefixParts[0].trim().toLowerCase();\n if (tag === '') return null;\n const classes = prefixParts.slice(1).map((c) => c.trim()).filter((c) => c !== '');\n\n const attrs: Record<string, string> = {};\n let nthChild: number | null = null;\n let nthOfType: number | null = null;\n let text: string | null = null;\n let href: string | null = null;\n\n // Parse :key=\"value\" pairs from rest.\n let i = 0;\n while (i < rest.length) {\n if (rest[i] !== ':') {\n i += 1;\n continue;\n }\n i += 1; // skip ':'\n // read key up to '='\n let keyEnd = i;\n while (keyEnd < rest.length && rest[keyEnd] !== '=' && rest[keyEnd] !== ':') keyEnd += 1;\n const key = rest.slice(i, keyEnd).trim();\n if (keyEnd >= rest.length || rest[keyEnd] !== '=') {\n i = keyEnd;\n continue;\n }\n let valStart = keyEnd + 1;\n if (rest[valStart] !== '\"') {\n // unquoted — read until next ':' at top level\n let end = valStart;\n while (end < rest.length && rest[end] !== ':') end += 1;\n const value = rest.slice(valStart, end);\n const result = applyElementsChainAttr(key, value);\n if (result.nthChild != null) nthChild = result.nthChild;\n if (result.nthOfType != null) nthOfType = result.nthOfType;\n if (result.text != null) text = result.text;\n if (result.href != null) href = result.href;\n if (result.attrKey != null) attrs[result.attrKey] = result.attrValue ?? '';\n i = end;\n continue;\n }\n // quoted value — find unescaped closing quote\n valStart += 1;\n let end = valStart;\n let value = '';\n while (end < rest.length) {\n const ch = rest[end];\n if (ch === '\\\\' && end + 1 < rest.length) {\n const next = rest[end + 1];\n if (next === '\"' || next === '\\\\') {\n value += next;\n end += 2;\n continue;\n }\n value += ch;\n end += 1;\n continue;\n }\n if (ch === '\"') break;\n value += ch;\n end += 1;\n }\n const result = applyElementsChainAttr(key, value);\n if (result.nthChild != null) nthChild = result.nthChild;\n if (result.nthOfType != null) nthOfType = result.nthOfType;\n if (result.text != null) text = result.text;\n if (result.href != null) href = result.href;\n if (result.attrKey != null) attrs[result.attrKey] = result.attrValue ?? '';\n i = end + 1; // skip closing quote\n }\n\n return { tag, classes, attrs, text, nthChild, nthOfType, href };\n}\n\n/** Parse an `elements_chain` string into structured, leaf-first segments. */\nexport function parseElementsChain(chain: string): ElementsChainSegment[] {\n // Split top-level by ';' respecting quoted strings.\n const segments: string[] = [];\n let current = '';\n let inQuotes = false;\n for (let i = 0; i < chain.length; i++) {\n const ch = chain[i];\n if (ch === '\\\\' && i + 1 < chain.length) {\n current += ch + chain[i + 1];\n i += 1;\n continue;\n }\n if (ch === '\"') {\n inQuotes = !inQuotes;\n current += ch;\n continue;\n }\n if (ch === ';' && !inQuotes) {\n segments.push(current);\n current = '';\n continue;\n }\n current += ch;\n }\n if (current.length > 0) {\n segments.push(current);\n }\n return segments.map(parseElementsChainSegment).filter((segment): segment is ElementsChainSegment => segment != null);\n}\n\nimport.meta.vitest?.test(\"parseElementsChain parses a simple leaf+ancestor chain\", ({ expect }) => {\n const parsed = parseElementsChain('button.btn.btn-primary:nth-of-type=\"1\":text=\"Save\":attr__id=\"save-btn\";div.container');\n expect(parsed).toEqual([\n { tag: \"button\", classes: [\"btn\", \"btn-primary\"], attrs: { id: \"save-btn\" }, text: \"Save\", nthChild: null, nthOfType: 1, href: null },\n { tag: \"div\", classes: [\"container\"], attrs: {}, text: null, nthChild: null, nthOfType: null, href: null },\n ]);\n});\n\nimport.meta.vitest?.test(\"parseElementsChain reverses class escaping for Tailwind-style tokens\", ({ expect }) => {\n // `md:hover:bg-blue-500` and `w-[1.5rem]` contain the prefix delimiters `:`/`.`,\n // so the serializer escapes them; the parser must recover the literal classes.\n const parsed = parseElementsChain('a.md\\\\:hover\\\\:bg-blue-500.w-\\\\[1\\\\.5rem\\\\]:href=\"/p?a=1\"');\n expect(parsed).toEqual([\n { tag: \"a\", classes: [\"md:hover:bg-blue-500\", \"w-[1.5rem]\"], attrs: { href: \"/p?a=1\" }, text: null, nthChild: null, nthOfType: null, href: \"/p?a=1\" },\n ]);\n});\n\nimport.meta.vitest?.test(\"parseElementsChain unescapes quotes/backslashes and ignores ';' inside quoted values\", ({ expect }) => {\n const parsed = parseElementsChain('span:text=\"a \\\\\"b\\\\\"; c \\\\\\\\ d\"');\n expect(parsed).toEqual([\n { tag: \"span\", classes: [], attrs: {}, text: 'a \"b\"; c \\\\ d', nthChild: null, nthOfType: null, href: null },\n ]);\n});\n\nimport.meta.vitest?.test(\"parseElementsChain drops empty/tagless segments\", ({ expect }) => {\n expect(parseElementsChain(\"\")).toEqual([]);\n expect(parseElementsChain(\";;\")).toEqual([]);\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"elements-chain.js","names":[],"sources":["../../src/utils/elements-chain.tsx"],"sourcesContent":["/**\n * PostHog-style `elements_chain` format — the single owner of both halves of the\n * contract. The event tracker {@link buildElementsChain serializes} a clicked\n * element (and its ancestors) into a string; the clickmap overlay\n * {@link parseElementsChain parses} that string back into structured segments so\n * it can re-locate the element in a live DOM.\n *\n * Encode and decode MUST round-trip exactly, which is why they live together:\n * the escaping applied here on the write side is reversed by the parser below,\n * and a single round-trip test in `elements-chain.test.tsx` guards the pair.\n *\n * Segment shape (leaf-first, joined by `;`):\n * tag.class1.class2:nth-child=\"2\":nth-of-type=\"1\":text=\"Save\":attr__id=\"x\":href=\"...\"\n */\n\nexport type ElementsChainSegment = {\n tag: string,\n classes: string[],\n attrs: Record<string, string>,\n text: string | null,\n nthChild: number | null,\n nthOfType: number | null,\n href: string | null,\n};\n\nexport const ELEMENTS_CHAIN_MAX_DEPTH = 8;\nexport const ELEMENTS_CHAIN_TEXT_MAX = 80;\nexport const ELEMENTS_CHAIN_ATTR_MAX = 200;\n\n// Attributes we serialise into elements_chain. Mirrors the set PostHog persists:\n// stable identifiers (id, data-testid), semantics (role, type, name, aria-label),\n// and a few we expect downstream tooling to want to match against.\nexport const ELEMENTS_CHAIN_ATTRS = [\n \"id\",\n \"data-testid\",\n \"data-test-id\",\n \"data-hexclave-id\",\n \"name\",\n \"type\",\n \"role\",\n \"aria-label\",\n \"placeholder\",\n \"title\",\n] as const;\n\n// ---------------------------------------------------------------------------\n// Serialization (DOM element -> elements_chain string)\n// ---------------------------------------------------------------------------\n\nfunction escapeElementsChainValue(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n\n// Class tokens are written into the unquoted, dot-joined prefix of a segment, so\n// any \".\" or \":\" inside a class (e.g. Tailwind variants like `md:hover:bg-blue-500`\n// or arbitrary values like `w-[1.5rem]`) must be escaped to round-trip through the\n// parser, which splits the prefix on unescaped \".\" and the segment on unescaped \":\".\nfunction escapeElementsChainClass(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\\./g, \"\\\\.\").replace(/:/g, \"\\\\:\");\n}\n\nfunction getElementClasses(element: Element): string[] {\n const className = (element as HTMLElement).className;\n if (typeof className !== \"string\" || className.trim() === \"\") {\n return [];\n }\n return className.trim().split(/\\s+/).filter(Boolean).slice(0, 4);\n}\n\nfunction getNthChildIndex(element: Element): number | null {\n const parent = element.parentElement;\n if (parent == null) return null;\n const index = Array.prototype.indexOf.call(parent.children, element);\n return index >= 0 ? index + 1 : null;\n}\n\nfunction getNthOfTypeIndex(element: Element): number | null {\n const parent = element.parentElement;\n if (parent == null) return null;\n const tagName = element.tagName;\n const siblings = Array.from(parent.children).filter((child) => child.tagName === tagName);\n if (siblings.length <= 1) return null;\n const index = siblings.indexOf(element);\n return index >= 0 ? index + 1 : null;\n}\n\nfunction serializeElementsChainSegment(element: Element): string {\n const parts: string[] = [];\n parts.push(element.tagName.toLowerCase());\n const classes = getElementClasses(element);\n if (classes.length > 0) {\n parts.push(`.${classes.map(escapeElementsChainClass).join(\".\")}`);\n }\n const text = element.textContent.trim().replace(/\\s+/g, \" \").slice(0, ELEMENTS_CHAIN_TEXT_MAX);\n const nthChild = getNthChildIndex(element);\n const nthOfType = getNthOfTypeIndex(element);\n const attrPairs: string[] = [];\n if (nthChild != null) attrPairs.push(`nth-child=\"${nthChild}\"`);\n if (nthOfType != null) attrPairs.push(`nth-of-type=\"${nthOfType}\"`);\n if (text !== \"\") attrPairs.push(`text=\"${escapeElementsChainValue(text)}\"`);\n for (const attrName of ELEMENTS_CHAIN_ATTRS) {\n const value = element.getAttribute(attrName);\n if (value == null || value === \"\") continue;\n attrPairs.push(`attr__${attrName}=\"${escapeElementsChainValue(value.slice(0, ELEMENTS_CHAIN_ATTR_MAX))}\"`);\n }\n if (element.tagName === \"A\") {\n const href = element.getAttribute(\"href\");\n if (href != null && href !== \"\") {\n attrPairs.push(`href=\"${escapeElementsChainValue(href.slice(0, ELEMENTS_CHAIN_ATTR_MAX))}\"`);\n }\n }\n if (attrPairs.length > 0) {\n parts.push(`:${attrPairs.join(\":\")}`);\n }\n return parts.join(\"\");\n}\n\n/**\n * Serialise a clicked element and up to {@link ELEMENTS_CHAIN_MAX_DEPTH}\n * ancestors (leaf-first) into an `elements_chain` string.\n */\nexport function buildElementsChain(element: Element): string {\n const segments: string[] = [];\n let current: Element | null = element;\n let depth = 0;\n while (current != null && depth < ELEMENTS_CHAIN_MAX_DEPTH && current !== document.documentElement) {\n segments.push(serializeElementsChainSegment(current));\n current = current.parentElement;\n depth += 1;\n }\n return segments.join(\";\");\n}\n\n// ---------------------------------------------------------------------------\n// Parsing (elements_chain string -> structured segments)\n// ---------------------------------------------------------------------------\n\n// Split a string on unescaped occurrences of `.`, unescaping `\\.`, `\\:` and `\\\\`\n// back to their literal characters. Reverses `escapeElementsChainClass`.\nfunction splitEscapedDots(input: string): string[] {\n const out: string[] = [];\n let cur = '';\n for (let i = 0; i < input.length; i++) {\n const ch = input[i];\n if (ch === '\\\\' && i + 1 < input.length) {\n cur += input[i + 1];\n i += 1;\n continue;\n }\n if (ch === '.') {\n out.push(cur);\n cur = '';\n continue;\n }\n cur += ch;\n }\n out.push(cur);\n return out;\n}\n\ntype ElementsChainAttrResult = {\n nthChild?: number,\n nthOfType?: number,\n text?: string,\n href?: string,\n attrKey?: string,\n attrValue?: string,\n};\n\nfunction applyElementsChainAttr(key: string, value: string): ElementsChainAttrResult {\n if (key === 'nth-child') {\n const n = Number.parseInt(value, 10);\n return Number.isFinite(n) ? { nthChild: n } : {};\n }\n if (key === 'nth-of-type') {\n const n = Number.parseInt(value, 10);\n return Number.isFinite(n) ? { nthOfType: n } : {};\n }\n if (key === 'text') {\n return { text: value };\n }\n if (key === 'href') {\n return { href: value, attrKey: key, attrValue: value };\n }\n if (key.startsWith('attr__')) {\n return { attrKey: key.slice('attr__'.length), attrValue: value };\n }\n return { attrKey: key, attrValue: value };\n}\n\nfunction parseElementsChainSegment(segment: string): ElementsChainSegment | null {\n const trimmed = segment.trim();\n if (trimmed === '') return null;\n\n // Find first ':' at top level — separates tag/classes prefix from attribute pairs.\n let prefixEnd = trimmed.length;\n let inQuotes = false;\n for (let i = 0; i < trimmed.length; i++) {\n const ch = trimmed[i];\n if (ch === '\\\\' && i + 1 < trimmed.length) {\n i += 1;\n continue;\n }\n if (ch === '\"') {\n inQuotes = !inQuotes;\n continue;\n }\n if (ch === ':' && !inQuotes) {\n prefixEnd = i;\n break;\n }\n }\n\n const prefix = trimmed.slice(0, prefixEnd);\n const rest = trimmed.slice(prefixEnd);\n const prefixParts = splitEscapedDots(prefix);\n const tag = prefixParts[0].trim().toLowerCase();\n if (tag === '') return null;\n const classes = prefixParts.slice(1).map((c) => c.trim()).filter((c) => c !== '');\n\n const attrs: Record<string, string> = {};\n let nthChild: number | null = null;\n let nthOfType: number | null = null;\n let text: string | null = null;\n let href: string | null = null;\n\n // Parse :key=\"value\" pairs from rest.\n let i = 0;\n while (i < rest.length) {\n if (rest[i] !== ':') {\n i += 1;\n continue;\n }\n i += 1; // skip ':'\n // read key up to '='\n let keyEnd = i;\n while (keyEnd < rest.length && rest[keyEnd] !== '=' && rest[keyEnd] !== ':') keyEnd += 1;\n const key = rest.slice(i, keyEnd).trim();\n if (keyEnd >= rest.length || rest[keyEnd] !== '=') {\n i = keyEnd;\n continue;\n }\n let valStart = keyEnd + 1;\n if (rest[valStart] !== '\"') {\n // unquoted — read until next ':' at top level\n let end = valStart;\n while (end < rest.length && rest[end] !== ':') end += 1;\n const value = rest.slice(valStart, end);\n const result = applyElementsChainAttr(key, value);\n if (result.nthChild != null) nthChild = result.nthChild;\n if (result.nthOfType != null) nthOfType = result.nthOfType;\n if (result.text != null) text = result.text;\n if (result.href != null) href = result.href;\n if (result.attrKey != null) attrs[result.attrKey] = result.attrValue ?? '';\n i = end;\n continue;\n }\n // quoted value — find unescaped closing quote\n valStart += 1;\n let end = valStart;\n let value = '';\n while (end < rest.length) {\n const ch = rest[end];\n if (ch === '\\\\' && end + 1 < rest.length) {\n const next = rest[end + 1];\n if (next === '\"' || next === '\\\\') {\n value += next;\n end += 2;\n continue;\n }\n value += ch;\n end += 1;\n continue;\n }\n if (ch === '\"') break;\n value += ch;\n end += 1;\n }\n const result = applyElementsChainAttr(key, value);\n if (result.nthChild != null) nthChild = result.nthChild;\n if (result.nthOfType != null) nthOfType = result.nthOfType;\n if (result.text != null) text = result.text;\n if (result.href != null) href = result.href;\n if (result.attrKey != null) attrs[result.attrKey] = result.attrValue ?? '';\n i = end + 1; // skip closing quote\n }\n\n return { tag, classes, attrs, text, nthChild, nthOfType, href };\n}\n\n/** Parse an `elements_chain` string into structured, leaf-first segments. */\nexport function parseElementsChain(chain: string): ElementsChainSegment[] {\n // Split top-level by ';' respecting quoted strings.\n const segments: string[] = [];\n let current = '';\n let inQuotes = false;\n for (let i = 0; i < chain.length; i++) {\n const ch = chain[i];\n if (ch === '\\\\' && i + 1 < chain.length) {\n current += ch + chain[i + 1];\n i += 1;\n continue;\n }\n if (ch === '\"') {\n inQuotes = !inQuotes;\n current += ch;\n continue;\n }\n if (ch === ';' && !inQuotes) {\n segments.push(current);\n current = '';\n continue;\n }\n current += ch;\n }\n if (current.length > 0) {\n segments.push(current);\n }\n return segments.map(parseElementsChainSegment).filter((segment): segment is ElementsChainSegment => segment != null);\n}\n\nimport.meta.vitest?.test(\"parseElementsChain parses a simple leaf+ancestor chain\", ({ expect }) => {\n const parsed = parseElementsChain('button.btn.btn-primary:nth-of-type=\"1\":text=\"Save\":attr__id=\"save-btn\";div.container');\n expect(parsed).toEqual([\n { tag: \"button\", classes: [\"btn\", \"btn-primary\"], attrs: { id: \"save-btn\" }, text: \"Save\", nthChild: null, nthOfType: 1, href: null },\n { tag: \"div\", classes: [\"container\"], attrs: {}, text: null, nthChild: null, nthOfType: null, href: null },\n ]);\n});\n\nimport.meta.vitest?.test(\"parseElementsChain reverses class escaping for Tailwind-style tokens\", ({ expect }) => {\n // `md:hover:bg-blue-500` and `w-[1.5rem]` contain the prefix delimiters `:`/`.`,\n // so the serializer escapes them; the parser must recover the literal classes.\n const parsed = parseElementsChain('a.md\\\\:hover\\\\:bg-blue-500.w-\\\\[1\\\\.5rem\\\\]:href=\"/p?a=1\"');\n expect(parsed).toEqual([\n { tag: \"a\", classes: [\"md:hover:bg-blue-500\", \"w-[1.5rem]\"], attrs: { href: \"/p?a=1\" }, text: null, nthChild: null, nthOfType: null, href: \"/p?a=1\" },\n ]);\n});\n\nimport.meta.vitest?.test(\"parseElementsChain unescapes quotes/backslashes and ignores ';' inside quoted values\", ({ expect }) => {\n const parsed = parseElementsChain('span:text=\"a \\\\\"b\\\\\"; c \\\\\\\\ d\"');\n expect(parsed).toEqual([\n { tag: \"span\", classes: [], attrs: {}, text: 'a \"b\"; c \\\\ d', nthChild: null, nthOfType: null, href: null },\n ]);\n});\n\nimport.meta.vitest?.test(\"parseElementsChain drops empty/tagless segments\", ({ expect }) => {\n expect(parseElementsChain(\"\")).toEqual([]);\n expect(parseElementsChain(\";;\")).toEqual([]);\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","names":[],"sources":["../../src/utils/env.tsx"],"mappings":";iBAGgB,aAAA,CAAA;AAAA,iBASA,+BAAA,CAAgC,YAAA,UAAsB,SAAA,UAAmB,aAAA,sBAAmC,UAAA;;;;iBAgC5G,cAAA,CAAe,IAAA,UAAc,YAAA;AAAA,iBAgD7B,aAAA,CAAc,IAAA;AAAA,iBAWd,cAAA,CAAA;AAAA,iBAKA,kBAAA,CAAA;;;;;;;;AAhEhB;;;;;iBAgFgB,aAAA,CAAc,IAAA"}
1
+ {"version":3,"file":"env.d.ts","names":[],"sources":["../../src/utils/env.tsx"],"mappings":";iBAGgB,aAAA;AAAA,iBASA,+BAAA,CAAgC,YAAA,UAAsB,SAAA,UAAmB,aAAA,sBAAmC,UAAA;;;;iBAgC5G,cAAA,CAAe,IAAA,UAAc,YAAiC;AAAA,iBAgD9D,aAAA,CAAc,IAAY;AAAA,iBAW1B,cAAA;AAAA,iBAKA,kBAAA;;;;;;;AAhG0I;AAgC1J;;;;AAA8E;iBAgF9D,aAAA,CAAc,IAAY"}
package/dist/utils/env.js CHANGED
@@ -1,8 +1,6 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_chunk = require('../chunk-BE-pF4vm.js');
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
2
  let __errors_js = require("./errors.js");
4
3
  let __strings_js = require("./strings.js");
5
-
6
4
  //#region src/utils/env.tsx
7
5
  function isBrowserLike() {
8
6
  return typeof window !== "undefined" && typeof document !== "undefined" && typeof document.createElement !== "undefined";
@@ -86,7 +84,6 @@ function getProcessEnv(name) {
86
84
  if (typeof process === "undefined" || typeof process.env === "undefined") return;
87
85
  return getEnvVarWithHexclaveFallback(name);
88
86
  }
89
-
90
87
  //#endregion
91
88
  exports.getEnvBoolean = getEnvBoolean;
92
89
  exports.getEnvVariable = getEnvVariable;
@@ -95,4 +92,5 @@ exports.getNodeEnvironment = getNodeEnvironment;
95
92
  exports.getProcessEnv = getProcessEnv;
96
93
  exports.isBrowserLike = isBrowserLike;
97
94
  exports.resolveHexclaveStackEnvVarValue = resolveHexclaveStackEnvVarValue;
95
+
98
96
  //# sourceMappingURL=env.js.map