@hexclave/shared 1.0.41 → 1.0.42

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 (1066) hide show
  1. package/dist/admin-interface-Y9EZqwD6.d.ts +379 -0
  2. package/dist/admin-interface-Y9EZqwD6.d.ts.map +1 -0
  3. package/dist/admin-metrics-bsOkw4YQ.d.ts +807 -0
  4. package/dist/admin-metrics-bsOkw4YQ.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 +3 -6
  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-iIw4nU5k.d.ts +447 -0
  48. package/dist/client-interface-iIw4nU5k.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-BBoN3hsn.d.ts +284 -0
  88. package/dist/current-user-BBoN3hsn.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-B1wmVPRG.d.ts +1464 -0
  92. package/dist/{interface/crud/email-outbox.d.ts.map → email-outbox-B1wmVPRG.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 +2 -3
  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 +227 -228
  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 +2 -3
  213. package/dist/esm/interface/admin-interface.js.map +1 -1
  214. package/dist/esm/interface/admin-metrics.d.ts +10 -10
  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 +32 -16
  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 +8 -8
  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 +22 -24
  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 +30 -32
  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.map +1 -1
  259. package/dist/esm/interface/crud/invoices.js +1 -2
  260. package/dist/esm/interface/crud/invoices.js.map +1 -1
  261. package/dist/esm/interface/crud/items.d.ts +6 -8
  262. package/dist/esm/interface/crud/items.d.ts.map +1 -1
  263. package/dist/esm/interface/crud/items.js +12 -16
  264. package/dist/esm/interface/crud/items.js.map +1 -1
  265. package/dist/esm/interface/crud/notification-preferences.d.ts +6 -8
  266. package/dist/esm/interface/crud/notification-preferences.d.ts.map +1 -1
  267. package/dist/esm/interface/crud/notification-preferences.js +8 -12
  268. package/dist/esm/interface/crud/notification-preferences.js.map +1 -1
  269. package/dist/esm/interface/crud/oauth-providers.d.ts +24 -26
  270. package/dist/esm/interface/crud/oauth-providers.d.ts.map +1 -1
  271. package/dist/esm/interface/crud/oauth-providers.js +1 -2
  272. package/dist/esm/interface/crud/oauth-providers.js.map +1 -1
  273. package/dist/esm/interface/crud/products.d.ts +21 -22
  274. package/dist/esm/interface/crud/products.d.ts.map +1 -1
  275. package/dist/esm/interface/crud/products.js +3 -2
  276. package/dist/esm/interface/crud/products.js.map +1 -1
  277. package/dist/esm/interface/crud/project-api-keys.d.ts +5 -6
  278. package/dist/esm/interface/crud/project-api-keys.d.ts.map +1 -1
  279. package/dist/esm/interface/crud/project-api-keys.js +1 -2
  280. package/dist/esm/interface/crud/project-api-keys.js.map +1 -1
  281. package/dist/esm/interface/crud/project-permissions.d.ts +29 -31
  282. package/dist/esm/interface/crud/project-permissions.d.ts.map +1 -1
  283. package/dist/esm/interface/crud/project-permissions.js +1 -2
  284. package/dist/esm/interface/crud/project-permissions.js.map +1 -1
  285. package/dist/esm/interface/crud/projects.d.ts +63 -65
  286. package/dist/esm/interface/crud/projects.d.ts.map +1 -1
  287. package/dist/esm/interface/crud/projects.js +3 -2
  288. package/dist/esm/interface/crud/projects.js.map +1 -1
  289. package/dist/esm/interface/crud/session-replays.d.ts.map +1 -1
  290. package/dist/esm/interface/crud/session-replays.js +1 -1
  291. package/dist/esm/interface/crud/sessions.d.ts +15 -17
  292. package/dist/esm/interface/crud/sessions.d.ts.map +1 -1
  293. package/dist/esm/interface/crud/sessions.js +1 -2
  294. package/dist/esm/interface/crud/sessions.js.map +1 -1
  295. package/dist/esm/interface/crud/sign-up-rules.d.ts.map +1 -1
  296. package/dist/esm/interface/crud/sign-up-rules.js +1 -1
  297. package/dist/esm/interface/crud/svix-token.d.ts +8 -10
  298. package/dist/esm/interface/crud/svix-token.d.ts.map +1 -1
  299. package/dist/esm/interface/crud/svix-token.js +1 -2
  300. package/dist/esm/interface/crud/svix-token.js.map +1 -1
  301. package/dist/esm/interface/crud/team-invitation-details.d.ts +6 -8
  302. package/dist/esm/interface/crud/team-invitation-details.d.ts.map +1 -1
  303. package/dist/esm/interface/crud/team-invitation-details.js +1 -2
  304. package/dist/esm/interface/crud/team-invitation-details.js.map +1 -1
  305. package/dist/esm/interface/crud/team-invitation.d.ts +7 -9
  306. package/dist/esm/interface/crud/team-invitation.d.ts.map +1 -1
  307. package/dist/esm/interface/crud/team-invitation.js +1 -2
  308. package/dist/esm/interface/crud/team-invitation.js.map +1 -1
  309. package/dist/esm/interface/crud/team-member-profiles.d.ts +36 -38
  310. package/dist/esm/interface/crud/team-member-profiles.d.ts.map +1 -1
  311. package/dist/esm/interface/crud/team-member-profiles.js +1 -2
  312. package/dist/esm/interface/crud/team-member-profiles.js.map +1 -1
  313. package/dist/esm/interface/crud/team-memberships.d.ts +14 -16
  314. package/dist/esm/interface/crud/team-memberships.d.ts.map +1 -1
  315. package/dist/esm/interface/crud/team-memberships.js +1 -2
  316. package/dist/esm/interface/crud/team-memberships.js.map +1 -1
  317. package/dist/esm/interface/crud/team-permissions.d.ts +29 -31
  318. package/dist/esm/interface/crud/team-permissions.d.ts.map +1 -1
  319. package/dist/esm/interface/crud/team-permissions.js +1 -2
  320. package/dist/esm/interface/crud/team-permissions.js.map +1 -1
  321. package/dist/esm/interface/crud/teams.d.ts +36 -38
  322. package/dist/esm/interface/crud/teams.d.ts.map +1 -1
  323. package/dist/esm/interface/crud/teams.js +2 -4
  324. package/dist/esm/interface/crud/teams.js.map +1 -1
  325. package/dist/esm/interface/crud/transactions.d.ts +14 -16
  326. package/dist/esm/interface/crud/transactions.d.ts.map +1 -1
  327. package/dist/esm/interface/crud/transactions.js +7 -13
  328. package/dist/esm/interface/crud/transactions.js.map +1 -1
  329. package/dist/esm/interface/crud/users.d.ts +21 -22
  330. package/dist/esm/interface/crud/users.d.ts.map +1 -1
  331. package/dist/esm/interface/crud/users.js +9 -5
  332. package/dist/esm/interface/crud/users.js.map +1 -1
  333. package/dist/esm/interface/handler-urls.d.ts +1 -1
  334. package/dist/esm/interface/handler-urls.d.ts.map +1 -1
  335. package/dist/esm/interface/handler-urls.js +1 -2
  336. package/dist/esm/interface/page-component-versions.d.ts +1 -1
  337. package/dist/esm/interface/page-component-versions.d.ts.map +1 -1
  338. package/dist/esm/interface/page-component-versions.js +1 -2
  339. package/dist/esm/interface/page-component-versions.js.map +1 -1
  340. package/dist/esm/interface/plan-usage.d.ts +1 -1
  341. package/dist/esm/interface/plan-usage.d.ts.map +1 -1
  342. package/dist/esm/interface/plan-usage.js +1 -2
  343. package/dist/esm/interface/plan-usage.js.map +1 -1
  344. package/dist/esm/interface/server-interface.d.ts +19 -19
  345. package/dist/esm/interface/server-interface.d.ts.map +1 -1
  346. package/dist/esm/interface/server-interface.js +2 -3
  347. package/dist/esm/interface/server-interface.js.map +1 -1
  348. package/dist/esm/interface/webhooks.d.ts +4 -4
  349. package/dist/esm/interface/webhooks.d.ts.map +1 -1
  350. package/dist/esm/interface/webhooks.js +1 -2
  351. package/dist/esm/interface/webhooks.js.map +1 -1
  352. package/dist/esm/known-errors.d.ts +2 -2
  353. package/dist/esm/known-errors.d.ts.map +1 -1
  354. package/dist/esm/known-errors.js +10 -21
  355. package/dist/esm/known-errors.js.map +1 -1
  356. package/dist/esm/payments/payment-methods.d.ts.map +1 -1
  357. package/dist/esm/payments/payment-methods.js +1 -1
  358. package/dist/esm/payments/payment-methods.js.map +1 -1
  359. package/dist/esm/payments/stripe-limits.d.ts.map +1 -1
  360. package/dist/esm/payments/stripe-limits.js +1 -1
  361. package/dist/esm/payments/stripe-limits.js.map +1 -1
  362. package/dist/esm/plans.d.ts.map +1 -1
  363. package/dist/esm/plans.js +1 -1
  364. package/dist/esm/plans.js.map +1 -1
  365. package/dist/esm/schema-fields.d.ts +14 -14
  366. package/dist/esm/schema-fields.d.ts.map +1 -1
  367. package/dist/esm/schema-fields.js +3 -64
  368. package/dist/esm/schema-fields.js.map +1 -1
  369. package/dist/esm/sessions.d.ts +6 -6
  370. package/dist/esm/sessions.d.ts.map +1 -1
  371. package/dist/esm/sessions.js +1 -2
  372. package/dist/esm/sessions.js.map +1 -1
  373. package/dist/esm/sessions.test.js +2 -3
  374. package/dist/esm/sessions.test.js.map +1 -1
  375. package/dist/esm/utils/analytics-clickmap-overlay.d.ts.map +1 -1
  376. package/dist/esm/utils/analytics-clickmap-overlay.js +1 -1
  377. package/dist/esm/utils/api-keys.d.ts.map +1 -1
  378. package/dist/esm/utils/api-keys.js +1 -2
  379. package/dist/esm/utils/api-keys.js.map +1 -1
  380. package/dist/esm/utils/arrays.d.ts.map +1 -1
  381. package/dist/esm/utils/arrays.js +1 -470
  382. package/dist/esm/utils/arrays.js.map +1 -1
  383. package/dist/esm/utils/auth-methods.d.ts.map +1 -1
  384. package/dist/esm/utils/auth-methods.js +1 -1
  385. package/dist/esm/utils/auth-methods.js.map +1 -1
  386. package/dist/esm/utils/base64.d.ts.map +1 -1
  387. package/dist/esm/utils/base64.js +1 -10
  388. package/dist/esm/utils/base64.js.map +1 -1
  389. package/dist/esm/utils/booleans.d.ts.map +1 -1
  390. package/dist/esm/utils/booleans.js +1 -25
  391. package/dist/esm/utils/booleans.js.map +1 -1
  392. package/dist/esm/utils/browser-compat.d.ts.map +1 -1
  393. package/dist/esm/utils/browser-compat.js +1 -1
  394. package/dist/esm/utils/browser-compat.js.map +1 -1
  395. package/dist/esm/utils/bytes.d.ts.map +1 -1
  396. package/dist/esm/utils/bytes.js +3 -198
  397. package/dist/esm/utils/bytes.js.map +1 -1
  398. package/dist/esm/utils/caches.d.ts +1 -1
  399. package/dist/esm/utils/caches.d.ts.map +1 -1
  400. package/dist/esm/utils/caches.js +1 -27
  401. package/dist/esm/utils/caches.js.map +1 -1
  402. package/dist/esm/utils/cel-fields.d.ts.map +1 -1
  403. package/dist/esm/utils/cel-fields.js +1 -2
  404. package/dist/esm/utils/cel-fields.js.map +1 -1
  405. package/dist/esm/utils/cloud-hosts.d.ts.map +1 -1
  406. package/dist/esm/utils/cloud-hosts.js +1 -27
  407. package/dist/esm/utils/cloud-hosts.js.map +1 -1
  408. package/dist/esm/utils/compile-time.d.ts.map +1 -1
  409. package/dist/esm/utils/compile-time.js +1 -1
  410. package/dist/esm/utils/compile-time.js.map +1 -1
  411. package/dist/esm/utils/country-codes.d.ts.map +1 -1
  412. package/dist/esm/utils/country-codes.js +1 -16
  413. package/dist/esm/utils/country-codes.js.map +1 -1
  414. package/dist/esm/utils/crypto.d.ts.map +1 -1
  415. package/dist/esm/utils/crypto.js +3 -113
  416. package/dist/esm/utils/crypto.js.map +1 -1
  417. package/dist/esm/utils/currencies.d.ts +1 -1
  418. package/dist/esm/utils/currencies.d.ts.map +1 -1
  419. package/dist/esm/utils/currencies.js +2 -37
  420. package/dist/esm/utils/currencies.js.map +1 -1
  421. package/dist/esm/utils/currency-constants.d.ts.map +1 -1
  422. package/dist/esm/utils/currency-constants.js +1 -1
  423. package/dist/esm/utils/currency-constants.js.map +1 -1
  424. package/dist/esm/utils/dates.d.ts.map +1 -1
  425. package/dist/esm/utils/dates.js +1 -44
  426. package/dist/esm/utils/dates.js.map +1 -1
  427. package/dist/esm/utils/dev-env-state-path.d.ts.map +1 -1
  428. package/dist/esm/utils/dev-env-state-path.js +1 -2
  429. package/dist/esm/utils/dev-env-state-path.js.map +1 -1
  430. package/dist/esm/utils/dev-tool.d.ts.map +1 -1
  431. package/dist/esm/utils/dev-tool.js +1 -1
  432. package/dist/esm/utils/dom.d.ts.map +1 -1
  433. package/dist/esm/utils/dom.js +1 -1
  434. package/dist/esm/utils/dom.js.map +1 -1
  435. package/dist/esm/utils/elements-chain.d.ts.map +1 -1
  436. package/dist/esm/utils/elements-chain.js +5 -50
  437. package/dist/esm/utils/elements-chain.js.map +1 -1
  438. package/dist/esm/utils/env.d.ts.map +1 -1
  439. package/dist/esm/utils/env.js +1 -2
  440. package/dist/esm/utils/env.js.map +1 -1
  441. package/dist/esm/utils/env.test.js +2 -3
  442. package/dist/esm/utils/env.test.js.map +1 -1
  443. package/dist/esm/utils/errors.d.ts +1 -1
  444. package/dist/esm/utils/errors.d.ts.map +1 -1
  445. package/dist/esm/utils/errors.js +1 -2
  446. package/dist/esm/utils/errors.js.map +1 -1
  447. package/dist/esm/utils/esbuild.d.ts +1 -1
  448. package/dist/esm/utils/esbuild.d.ts.map +1 -1
  449. package/dist/esm/utils/esbuild.js +2 -3
  450. package/dist/esm/utils/esbuild.js.map +1 -1
  451. package/dist/esm/utils/featurebase.d.ts.map +1 -1
  452. package/dist/esm/utils/featurebase.js +1 -2
  453. package/dist/esm/utils/featurebase.js.map +1 -1
  454. package/dist/esm/utils/fs.d.ts.map +1 -1
  455. package/dist/esm/utils/fs.js +1 -2
  456. package/dist/esm/utils/fs.js.map +1 -1
  457. package/dist/esm/utils/functions.d.ts.map +1 -1
  458. package/dist/esm/utils/functions.js +1 -24
  459. package/dist/esm/utils/functions.js.map +1 -1
  460. package/dist/esm/utils/geo.d.ts.map +1 -1
  461. package/dist/esm/utils/geo.js +1 -2
  462. package/dist/esm/utils/geo.js.map +1 -1
  463. package/dist/esm/utils/globals.d.ts.map +1 -1
  464. package/dist/esm/utils/globals.js +1 -1
  465. package/dist/esm/utils/globals.js.map +1 -1
  466. package/dist/esm/utils/hashes.d.ts.map +1 -1
  467. package/dist/esm/utils/hashes.js +1 -2
  468. package/dist/esm/utils/hashes.js.map +1 -1
  469. package/dist/esm/utils/html.d.ts.map +1 -1
  470. package/dist/esm/utils/html.js +1 -19
  471. package/dist/esm/utils/html.js.map +1 -1
  472. package/dist/esm/utils/http.d.ts.map +1 -1
  473. package/dist/esm/utils/http.js +1 -19
  474. package/dist/esm/utils/http.js.map +1 -1
  475. package/dist/esm/utils/ips.d.ts.map +1 -1
  476. package/dist/esm/utils/ips.js +1 -25
  477. package/dist/esm/utils/ips.js.map +1 -1
  478. package/dist/esm/utils/json.d.ts +1 -1
  479. package/dist/esm/utils/json.d.ts.map +1 -1
  480. package/dist/esm/utils/json.js +1 -155
  481. package/dist/esm/utils/json.js.map +1 -1
  482. package/dist/esm/utils/jsx-editable-transpiler.d.ts.map +1 -1
  483. package/dist/esm/utils/jsx-editable-transpiler.js +1 -2
  484. package/dist/esm/utils/jsx-editable-transpiler.js.map +1 -1
  485. package/dist/esm/utils/jsx-editable-transpiler.test.js +2 -3
  486. package/dist/esm/utils/jsx-editable-transpiler.test.js.map +1 -1
  487. package/dist/esm/utils/jwt.d.ts.map +1 -1
  488. package/dist/esm/utils/jwt.js +1 -2
  489. package/dist/esm/utils/jwt.js.map +1 -1
  490. package/dist/esm/utils/locks.d.ts.map +1 -1
  491. package/dist/esm/utils/locks.js +1 -2
  492. package/dist/esm/utils/locks.js.map +1 -1
  493. package/dist/esm/utils/maps.d.ts.map +1 -1
  494. package/dist/esm/utils/maps.js +1 -111
  495. package/dist/esm/utils/maps.js.map +1 -1
  496. package/dist/esm/utils/math.d.ts.map +1 -1
  497. package/dist/esm/utils/math.js +1 -11
  498. package/dist/esm/utils/math.js.map +1 -1
  499. package/dist/esm/utils/monkey-patch.d.ts.map +1 -1
  500. package/dist/esm/utils/monkey-patch.js +2 -3
  501. package/dist/esm/utils/monkey-patch.js.map +1 -1
  502. package/dist/esm/utils/node-http.js +1 -2
  503. package/dist/esm/utils/node-http.js.map +1 -1
  504. package/dist/esm/utils/numbers.d.ts.map +1 -1
  505. package/dist/esm/utils/numbers.js +1 -45
  506. package/dist/esm/utils/numbers.js.map +1 -1
  507. package/dist/esm/utils/oauth.d.ts.map +1 -1
  508. package/dist/esm/utils/oauth.js +1 -1
  509. package/dist/esm/utils/oauth.js.map +1 -1
  510. package/dist/esm/utils/objects.d.ts.map +1 -1
  511. package/dist/esm/utils/objects.js +1 -622
  512. package/dist/esm/utils/objects.js.map +1 -1
  513. package/dist/esm/utils/paginated-lists.d.ts.map +1 -1
  514. package/dist/esm/utils/paginated-lists.js +1 -2
  515. package/dist/esm/utils/paginated-lists.js.map +1 -1
  516. package/dist/esm/utils/paginated-lists.test.js +2 -3
  517. package/dist/esm/utils/paginated-lists.test.js.map +1 -1
  518. package/dist/esm/utils/passkey.d.ts +1 -1
  519. package/dist/esm/utils/passkey.js +1 -1
  520. package/dist/esm/utils/promises.d.ts +1 -1
  521. package/dist/esm/utils/promises.d.ts.map +1 -1
  522. package/dist/esm/utils/promises.js +2 -161
  523. package/dist/esm/utils/promises.js.map +1 -1
  524. package/dist/esm/utils/proxies.d.ts.map +1 -1
  525. package/dist/esm/utils/proxies.js +1 -37
  526. package/dist/esm/utils/proxies.js.map +1 -1
  527. package/dist/esm/utils/react.d.ts.map +1 -1
  528. package/dist/esm/utils/react.js +1 -41
  529. package/dist/esm/utils/react.js.map +1 -1
  530. package/dist/esm/utils/redirect-urls.d.ts.map +1 -1
  531. package/dist/esm/utils/redirect-urls.js +2 -92
  532. package/dist/esm/utils/redirect-urls.js.map +1 -1
  533. package/dist/esm/utils/regex.js +1 -1
  534. package/dist/esm/utils/regex.js.map +1 -1
  535. package/dist/esm/utils/results.d.ts.map +1 -1
  536. package/dist/esm/utils/results.js +1 -213
  537. package/dist/esm/utils/results.js.map +1 -1
  538. package/dist/esm/utils/sentry.js +1 -1
  539. package/dist/esm/utils/sentry.js.map +1 -1
  540. package/dist/esm/utils/stores.d.ts +3 -3
  541. package/dist/esm/utils/stores.d.ts.map +1 -1
  542. package/dist/esm/utils/stores.js +1 -2
  543. package/dist/esm/utils/stores.js.map +1 -1
  544. package/dist/esm/utils/strings.d.ts.map +1 -1
  545. package/dist/esm/utils/strings.js +1 -251
  546. package/dist/esm/utils/strings.js.map +1 -1
  547. package/dist/esm/utils/strings.nicify.test.js +2 -3
  548. package/dist/esm/utils/strings.nicify.test.js.map +1 -1
  549. package/dist/esm/utils/telemetry.d.ts.map +1 -1
  550. package/dist/esm/utils/telemetry.js +1 -2
  551. package/dist/esm/utils/telemetry.js.map +1 -1
  552. package/dist/esm/utils/turnstile-browser.d.ts +1 -1
  553. package/dist/esm/utils/turnstile-browser.d.ts.map +1 -1
  554. package/dist/esm/utils/turnstile-browser.js +1 -2
  555. package/dist/esm/utils/turnstile-browser.js.map +1 -1
  556. package/dist/esm/utils/turnstile-flow.d.ts +1 -1
  557. package/dist/esm/utils/turnstile-flow.d.ts.map +1 -1
  558. package/dist/esm/utils/turnstile-flow.js +1 -2
  559. package/dist/esm/utils/turnstile-flow.js.map +1 -1
  560. package/dist/esm/utils/turnstile-flow.test.js +2 -3
  561. package/dist/esm/utils/turnstile-flow.test.js.map +1 -1
  562. package/dist/esm/utils/turnstile.d.ts.map +1 -1
  563. package/dist/esm/utils/turnstile.js +1 -1
  564. package/dist/esm/utils/turnstile.js.map +1 -1
  565. package/dist/esm/utils/typed-arrays.js +1 -2
  566. package/dist/esm/utils/typed-arrays.js.map +1 -1
  567. package/dist/esm/utils/types.d.ts +1 -1
  568. package/dist/esm/utils/types.d.ts.map +1 -1
  569. package/dist/esm/utils/types.js +1 -1
  570. package/dist/esm/utils/types.js.map +1 -1
  571. package/dist/esm/utils/unicode.d.ts.map +1 -1
  572. package/dist/esm/utils/unicode.js +1 -13
  573. package/dist/esm/utils/unicode.js.map +1 -1
  574. package/dist/esm/utils/urls.d.ts.map +1 -1
  575. package/dist/esm/utils/urls.js +1 -151
  576. package/dist/esm/utils/urls.js.map +1 -1
  577. package/dist/esm/utils/uuids.d.ts.map +1 -1
  578. package/dist/esm/utils/uuids.js +2 -26
  579. package/dist/esm/utils/uuids.js.map +1 -1
  580. package/dist/format-4JG1MGv5.d.ts +61 -0
  581. package/dist/format-4JG1MGv5.d.ts.map +1 -0
  582. package/dist/handler-urls-BHt3v8Ai.d.ts +70 -0
  583. package/dist/handler-urls-BHt3v8Ai.d.ts.map +1 -0
  584. package/dist/helpers/emails.js +2 -4
  585. package/dist/helpers/emails.js.map +1 -1
  586. package/dist/helpers/init-prompt.d.ts.map +1 -1
  587. package/dist/helpers/init-prompt.js +2 -4
  588. package/dist/helpers/init-prompt.js.map +1 -1
  589. package/dist/helpers/password.d.ts +1 -1
  590. package/dist/helpers/password.d.ts.map +1 -1
  591. package/dist/helpers/password.js +2 -4
  592. package/dist/helpers/password.js.map +1 -1
  593. package/dist/helpers/production-mode.d.ts +1 -1
  594. package/dist/helpers/production-mode.d.ts.map +1 -1
  595. package/dist/helpers/production-mode.js +2 -4
  596. package/dist/helpers/production-mode.js.map +1 -1
  597. package/dist/helpers/support-sla.d.ts.map +1 -1
  598. package/dist/helpers/support-sla.js +2 -3
  599. package/dist/helpers/support-sla.js.map +1 -1
  600. package/dist/helpers/support-sla.test.js +1 -3
  601. package/dist/helpers/support-sla.test.js.map +1 -1
  602. package/dist/helpers/vault/client-side.d.ts.map +1 -1
  603. package/dist/helpers/vault/client-side.js +2 -22
  604. package/dist/helpers/vault/client-side.js.map +1 -1
  605. package/dist/helpers/vault/server-side.js +2 -4
  606. package/dist/helpers/vault/server-side.js.map +1 -1
  607. package/dist/hooks/use-async-callback.d.ts.map +1 -1
  608. package/dist/hooks/use-async-callback.js +4 -5
  609. package/dist/hooks/use-async-callback.js.map +1 -1
  610. package/dist/hooks/use-async-external-store.d.ts +1 -1
  611. package/dist/hooks/use-async-external-store.d.ts.map +1 -1
  612. package/dist/hooks/use-async-external-store.js +2 -4
  613. package/dist/hooks/use-async-external-store.js.map +1 -1
  614. package/dist/hooks/use-hash.js +2 -4
  615. package/dist/hooks/use-hash.js.map +1 -1
  616. package/dist/hooks/use-hover.d.ts.map +1 -1
  617. package/dist/hooks/use-hover.js +2 -4
  618. package/dist/hooks/use-hover.js.map +1 -1
  619. package/dist/hooks/use-strict-memo.d.ts.map +1 -1
  620. package/dist/hooks/use-strict-memo.js +2 -72
  621. package/dist/hooks/use-strict-memo.js.map +1 -1
  622. package/dist/index.d.ts +4 -4
  623. package/dist/index.js +27 -29
  624. package/dist/interface/admin-interface.d.ts +3 -379
  625. package/dist/interface/admin-interface.js +3 -5
  626. package/dist/interface/admin-interface.js.map +1 -1
  627. package/dist/interface/admin-metrics.d.ts +2 -807
  628. package/dist/interface/admin-metrics.js +2 -4
  629. package/dist/interface/admin-metrics.js.map +1 -1
  630. package/dist/interface/client-interface.d.ts +2 -447
  631. package/dist/interface/client-interface.js +33 -18
  632. package/dist/interface/client-interface.js.map +1 -1
  633. package/dist/interface/client-interface.test.js +83 -13
  634. package/dist/interface/client-interface.test.js.map +1 -1
  635. package/dist/interface/conversations.d.ts +8 -8
  636. package/dist/interface/conversations.d.ts.map +1 -1
  637. package/dist/interface/conversations.js +2 -4
  638. package/dist/interface/conversations.js.map +1 -1
  639. package/dist/interface/crud/analytics.d.ts +2 -14
  640. package/dist/interface/crud/connected-accounts.d.ts +2 -68
  641. package/dist/interface/crud/connected-accounts.js +2 -4
  642. package/dist/interface/crud/connected-accounts.js.map +1 -1
  643. package/dist/interface/crud/contact-channels.d.ts +2 -181
  644. package/dist/interface/crud/contact-channels.js +2 -4
  645. package/dist/interface/crud/contact-channels.js.map +1 -1
  646. package/dist/interface/crud/current-user.d.ts +2 -285
  647. package/dist/interface/crud/current-user.js +2 -4
  648. package/dist/interface/crud/current-user.js.map +1 -1
  649. package/dist/interface/crud/email-outbox.d.ts +2 -1465
  650. package/dist/interface/crud/email-outbox.js +4 -5
  651. package/dist/interface/crud/email-outbox.js.map +1 -1
  652. package/dist/interface/crud/email-templates.d.ts +15 -16
  653. package/dist/interface/crud/email-templates.d.ts.map +1 -1
  654. package/dist/interface/crud/email-templates.js +2 -4
  655. package/dist/interface/crud/email-templates.js.map +1 -1
  656. package/dist/interface/crud/emails.d.ts +2 -41
  657. package/dist/interface/crud/emails.js +4 -5
  658. package/dist/interface/crud/emails.js.map +1 -1
  659. package/dist/interface/crud/internal-api-keys.d.ts +2 -140
  660. package/dist/interface/crud/internal-api-keys.js +2 -4
  661. package/dist/interface/crud/internal-api-keys.js.map +1 -1
  662. package/dist/interface/crud/invoices.d.ts +2 -43
  663. package/dist/interface/crud/invoices.js +2 -4
  664. package/dist/interface/crud/invoices.js.map +1 -1
  665. package/dist/interface/crud/items.d.ts +2 -30
  666. package/dist/interface/crud/items.js +2 -4
  667. package/dist/interface/crud/items.js.map +1 -1
  668. package/dist/interface/crud/notification-preferences.d.ts +2 -38
  669. package/dist/interface/crud/notification-preferences.js +2 -4
  670. package/dist/interface/crud/notification-preferences.js.map +1 -1
  671. package/dist/interface/crud/oauth-providers.d.ts +2 -186
  672. package/dist/interface/crud/oauth-providers.js +2 -4
  673. package/dist/interface/crud/oauth-providers.js.map +1 -1
  674. package/dist/interface/crud/products.d.ts +2 -182
  675. package/dist/interface/crud/products.js +4 -4
  676. package/dist/interface/crud/products.js.map +1 -1
  677. package/dist/interface/crud/project-api-keys.d.ts +2 -203
  678. package/dist/interface/crud/project-api-keys.js +2 -4
  679. package/dist/interface/crud/project-api-keys.js.map +1 -1
  680. package/dist/interface/crud/project-permissions.d.ts +2 -161
  681. package/dist/interface/crud/project-permissions.js +4 -5
  682. package/dist/interface/crud/project-permissions.js.map +1 -1
  683. package/dist/interface/crud/projects.d.ts +2 -901
  684. package/dist/interface/crud/projects.js +6 -5
  685. package/dist/interface/crud/projects.js.map +1 -1
  686. package/dist/interface/crud/session-replays.d.ts +2 -83
  687. package/dist/interface/crud/sessions.d.ts +2 -150
  688. package/dist/interface/crud/sessions.js +2 -4
  689. package/dist/interface/crud/sessions.js.map +1 -1
  690. package/dist/interface/crud/sign-up-rules.d.ts.map +1 -1
  691. package/dist/interface/crud/svix-token.d.ts +2 -31
  692. package/dist/interface/crud/svix-token.js +2 -4
  693. package/dist/interface/crud/svix-token.js.map +1 -1
  694. package/dist/interface/crud/team-invitation-details.d.ts +5 -6
  695. package/dist/interface/crud/team-invitation-details.d.ts.map +1 -1
  696. package/dist/interface/crud/team-invitation-details.js +4 -5
  697. package/dist/interface/crud/team-invitation-details.js.map +1 -1
  698. package/dist/interface/crud/team-invitation.d.ts +2 -54
  699. package/dist/interface/crud/team-invitation.js +4 -5
  700. package/dist/interface/crud/team-invitation.js.map +1 -1
  701. package/dist/interface/crud/team-member-profiles.d.ts +2 -286
  702. package/dist/interface/crud/team-member-profiles.js +4 -5
  703. package/dist/interface/crud/team-member-profiles.js.map +1 -1
  704. package/dist/interface/crud/team-memberships.d.ts +2 -75
  705. package/dist/interface/crud/team-memberships.js +2 -4
  706. package/dist/interface/crud/team-memberships.js.map +1 -1
  707. package/dist/interface/crud/team-permissions.d.ts +2 -169
  708. package/dist/interface/crud/team-permissions.js +4 -5
  709. package/dist/interface/crud/team-permissions.js.map +1 -1
  710. package/dist/interface/crud/teams.d.ts +2 -299
  711. package/dist/interface/crud/teams.js +5 -7
  712. package/dist/interface/crud/teams.js.map +1 -1
  713. package/dist/interface/crud/transactions.d.ts +2 -183
  714. package/dist/interface/crud/transactions.js +2 -4
  715. package/dist/interface/crud/transactions.js.map +1 -1
  716. package/dist/interface/crud/users.d.ts +2 -653
  717. package/dist/interface/crud/users.js +12 -8
  718. package/dist/interface/crud/users.js.map +1 -1
  719. package/dist/interface/handler-urls.d.ts +2 -51
  720. package/dist/interface/handler-urls.js +12 -14
  721. package/dist/interface/page-component-versions.d.ts +2 -25
  722. package/dist/interface/page-component-versions.js +2 -4
  723. package/dist/interface/page-component-versions.js.map +1 -1
  724. package/dist/interface/plan-usage.d.ts +2 -57
  725. package/dist/interface/plan-usage.js +2 -4
  726. package/dist/interface/plan-usage.js.map +1 -1
  727. package/dist/interface/server-interface.d.ts +2 -257
  728. package/dist/interface/server-interface.js +3 -5
  729. package/dist/interface/server-interface.js.map +1 -1
  730. package/dist/interface/webhooks.d.ts +2 -326
  731. package/dist/interface/webhooks.js +2 -4
  732. package/dist/interface/webhooks.js.map +1 -1
  733. package/dist/internal-api-keys-D8IYDodH.d.ts +139 -0
  734. package/dist/internal-api-keys-D8IYDodH.d.ts.map +1 -0
  735. package/dist/invoices-CHo9YKbI.d.ts +43 -0
  736. package/dist/invoices-CHo9YKbI.d.ts.map +1 -0
  737. package/dist/items-DlLSlVUD.d.ts +29 -0
  738. package/dist/items-DlLSlVUD.d.ts.map +1 -0
  739. package/dist/json-a1QIXu5z.d.ts +15 -0
  740. package/dist/json-a1QIXu5z.d.ts.map +1 -0
  741. package/dist/known-errors-Bm4a61wL.d.ts +575 -0
  742. package/dist/known-errors-Bm4a61wL.d.ts.map +1 -0
  743. package/dist/known-errors.d.ts +2 -575
  744. package/dist/known-errors.js +11 -23
  745. package/dist/known-errors.js.map +1 -1
  746. package/dist/notification-preferences-Bmzr_EOY.d.ts +37 -0
  747. package/dist/notification-preferences-Bmzr_EOY.d.ts.map +1 -0
  748. package/dist/oauth-providers-BMkKSSlA.d.ts +185 -0
  749. package/dist/oauth-providers-BMkKSSlA.d.ts.map +1 -0
  750. package/dist/objects-DkCkeBWE.d.ts +59 -0
  751. package/dist/objects-DkCkeBWE.d.ts.map +1 -0
  752. package/dist/passkey-CKg87UH-.d.ts +2 -0
  753. package/dist/payments/payment-methods.d.ts.map +1 -1
  754. package/dist/payments/payment-methods.js +2 -3
  755. package/dist/payments/payment-methods.js.map +1 -1
  756. package/dist/payments/stripe-limits.d.ts.map +1 -1
  757. package/dist/payments/stripe-limits.js +2 -3
  758. package/dist/payments/stripe-limits.js.map +1 -1
  759. package/dist/plan-usage-DfDoj5K4.d.ts +57 -0
  760. package/dist/plan-usage-DfDoj5K4.d.ts.map +1 -0
  761. package/dist/plans.d.ts.map +1 -1
  762. package/dist/plans.js +2 -3
  763. package/dist/plans.js.map +1 -1
  764. package/dist/products-Bs74ld-v.d.ts +182 -0
  765. package/dist/products-Bs74ld-v.d.ts.map +1 -0
  766. package/dist/project-api-keys--7V5X_UW.d.ts +203 -0
  767. package/dist/project-api-keys--7V5X_UW.d.ts.map +1 -0
  768. package/dist/project-permissions-kdi675F-.d.ts +160 -0
  769. package/dist/project-permissions-kdi675F-.d.ts.map +1 -0
  770. package/dist/projects-CFTNXRfG.d.ts +900 -0
  771. package/dist/projects-CFTNXRfG.d.ts.map +1 -0
  772. package/dist/results-DP3BzoL6.d.ts +70 -0
  773. package/dist/results-DP3BzoL6.d.ts.map +1 -0
  774. package/dist/{chunk-BE-pF4vm.js → rolldown-runtime-D6vf50IK.js} +12 -18
  775. package/dist/schema-CJwkGkdf.d.ts +2328 -0
  776. package/dist/schema-CJwkGkdf.d.ts.map +1 -0
  777. package/dist/schema-fields-DqGQ4kF7.d.ts +517 -0
  778. package/dist/schema-fields-DqGQ4kF7.d.ts.map +1 -0
  779. package/dist/schema-fields.d.ts +3 -518
  780. package/dist/schema-fields.js +21 -82
  781. package/dist/schema-fields.js.map +1 -1
  782. package/dist/server-interface-CgpxsLT_.d.ts +257 -0
  783. package/dist/server-interface-CgpxsLT_.d.ts.map +1 -0
  784. package/dist/session-replays-CXqhDpZq.d.ts +83 -0
  785. package/dist/session-replays-CXqhDpZq.d.ts.map +1 -0
  786. package/dist/sessions-B7Ko2Ldr.d.ts +149 -0
  787. package/dist/sessions-B7Ko2Ldr.d.ts.map +1 -0
  788. package/dist/sessions-d8qtvBUB.d.ts +175 -0
  789. package/dist/sessions-d8qtvBUB.d.ts.map +1 -0
  790. package/dist/sessions.d.ts +2 -175
  791. package/dist/sessions.js +4 -5
  792. package/dist/sessions.js.map +1 -1
  793. package/dist/sessions.test.js +1 -3
  794. package/dist/sessions.test.js.map +1 -1
  795. package/dist/strings-DWgkUybS.d.ts +76 -0
  796. package/dist/strings-DWgkUybS.d.ts.map +1 -0
  797. package/dist/svix-token-BsMrLGvy.d.ts +30 -0
  798. package/dist/svix-token-BsMrLGvy.d.ts.map +1 -0
  799. package/dist/team-invitation-Cyqt9oWw.d.ts +53 -0
  800. package/dist/team-invitation-Cyqt9oWw.d.ts.map +1 -0
  801. package/dist/team-member-profiles-BoDEqx-0.d.ts +285 -0
  802. package/dist/team-member-profiles-BoDEqx-0.d.ts.map +1 -0
  803. package/dist/team-memberships-DZHk2A5b.d.ts +74 -0
  804. package/dist/team-memberships-DZHk2A5b.d.ts.map +1 -0
  805. package/dist/team-permissions-DqOpaOWh.d.ts +168 -0
  806. package/dist/team-permissions-DqOpaOWh.d.ts.map +1 -0
  807. package/dist/teams-CQMcBnjM.d.ts +298 -0
  808. package/dist/teams-CQMcBnjM.d.ts.map +1 -0
  809. package/dist/transactions-DhnbvGH5.d.ts +182 -0
  810. package/dist/transactions-DhnbvGH5.d.ts.map +1 -0
  811. package/dist/types-DfTcxNtM.d.ts +77 -0
  812. package/dist/types-DfTcxNtM.d.ts.map +1 -0
  813. package/dist/users-DHNRwoSz.d.ts +653 -0
  814. package/dist/users-DHNRwoSz.d.ts.map +1 -0
  815. package/dist/utils/analytics-clickmap-overlay.d.ts.map +1 -1
  816. package/dist/utils/analytics-clickmap-overlay.js +2 -3
  817. package/dist/utils/analytics-clickmap-overlay.js.map +1 -1
  818. package/dist/utils/api-keys.d.ts.map +1 -1
  819. package/dist/utils/api-keys.js +4 -5
  820. package/dist/utils/api-keys.js.map +1 -1
  821. package/dist/utils/arrays.d.ts.map +1 -1
  822. package/dist/utils/arrays.js +2 -472
  823. package/dist/utils/arrays.js.map +1 -1
  824. package/dist/utils/auth-methods.d.ts.map +1 -1
  825. package/dist/utils/auth-methods.js +2 -3
  826. package/dist/utils/auth-methods.js.map +1 -1
  827. package/dist/utils/base64.d.ts.map +1 -1
  828. package/dist/utils/base64.js +2 -12
  829. package/dist/utils/base64.js.map +1 -1
  830. package/dist/utils/booleans.d.ts.map +1 -1
  831. package/dist/utils/booleans.js +2 -27
  832. package/dist/utils/booleans.js.map +1 -1
  833. package/dist/utils/browser-compat.d.ts.map +1 -1
  834. package/dist/utils/browser-compat.js +2 -3
  835. package/dist/utils/browser-compat.js.map +1 -1
  836. package/dist/utils/bytes.d.ts.map +1 -1
  837. package/dist/utils/bytes.js +4 -200
  838. package/dist/utils/bytes.js.map +1 -1
  839. package/dist/utils/caches.d.ts.map +1 -1
  840. package/dist/utils/caches.js +2 -29
  841. package/dist/utils/caches.js.map +1 -1
  842. package/dist/utils/cel-fields.d.ts.map +1 -1
  843. package/dist/utils/cel-fields.js +2 -4
  844. package/dist/utils/cel-fields.js.map +1 -1
  845. package/dist/utils/cloud-hosts.d.ts.map +1 -1
  846. package/dist/utils/cloud-hosts.js +2 -29
  847. package/dist/utils/cloud-hosts.js.map +1 -1
  848. package/dist/utils/compile-time.d.ts.map +1 -1
  849. package/dist/utils/compile-time.js +2 -3
  850. package/dist/utils/compile-time.js.map +1 -1
  851. package/dist/utils/country-codes.d.ts +2 -11
  852. package/dist/utils/country-codes.js +2 -18
  853. package/dist/utils/country-codes.js.map +1 -1
  854. package/dist/utils/crypto.d.ts.map +1 -1
  855. package/dist/utils/crypto.js +4 -115
  856. package/dist/utils/crypto.js.map +1 -1
  857. package/dist/utils/currencies.d.ts +1 -1
  858. package/dist/utils/currencies.d.ts.map +1 -1
  859. package/dist/utils/currencies.js +3 -39
  860. package/dist/utils/currencies.js.map +1 -1
  861. package/dist/utils/currency-constants.d.ts +2 -45
  862. package/dist/utils/currency-constants.js +2 -3
  863. package/dist/utils/currency-constants.js.map +1 -1
  864. package/dist/utils/dates.d.ts +2 -23
  865. package/dist/utils/dates.js +2 -46
  866. package/dist/utils/dates.js.map +1 -1
  867. package/dist/utils/dev-env-state-path.d.ts.map +1 -1
  868. package/dist/utils/dev-env-state-path.js +2 -4
  869. package/dist/utils/dev-env-state-path.js.map +1 -1
  870. package/dist/utils/dev-tool.d.ts.map +1 -1
  871. package/dist/utils/dev-tool.js +2 -3
  872. package/dist/utils/dev-tool.js.map +1 -1
  873. package/dist/utils/dom.d.ts.map +1 -1
  874. package/dist/utils/dom.js +2 -3
  875. package/dist/utils/dom.js.map +1 -1
  876. package/dist/utils/elements-chain.d.ts.map +1 -1
  877. package/dist/utils/elements-chain.js +6 -52
  878. package/dist/utils/elements-chain.js.map +1 -1
  879. package/dist/utils/env.d.ts.map +1 -1
  880. package/dist/utils/env.js +2 -4
  881. package/dist/utils/env.js.map +1 -1
  882. package/dist/utils/env.test.js +1 -3
  883. package/dist/utils/env.test.js.map +1 -1
  884. package/dist/utils/errors.d.ts +2 -238
  885. package/dist/utils/errors.js +2 -4
  886. package/dist/utils/errors.js.map +1 -1
  887. package/dist/utils/esbuild.d.ts +1 -1
  888. package/dist/utils/esbuild.d.ts.map +1 -1
  889. package/dist/utils/esbuild.js +5 -6
  890. package/dist/utils/esbuild.js.map +1 -1
  891. package/dist/utils/featurebase.d.ts.map +1 -1
  892. package/dist/utils/featurebase.js +2 -4
  893. package/dist/utils/featurebase.js.map +1 -1
  894. package/dist/utils/fs.d.ts.map +1 -1
  895. package/dist/utils/fs.js +5 -6
  896. package/dist/utils/fs.js.map +1 -1
  897. package/dist/utils/functions.d.ts.map +1 -1
  898. package/dist/utils/functions.js +2 -26
  899. package/dist/utils/functions.js.map +1 -1
  900. package/dist/utils/geo.d.ts.map +1 -1
  901. package/dist/utils/geo.js +2 -4
  902. package/dist/utils/geo.js.map +1 -1
  903. package/dist/utils/globals.d.ts.map +1 -1
  904. package/dist/utils/globals.js +2 -3
  905. package/dist/utils/globals.js.map +1 -1
  906. package/dist/utils/hashes.d.ts.map +1 -1
  907. package/dist/utils/hashes.js +4 -5
  908. package/dist/utils/hashes.js.map +1 -1
  909. package/dist/utils/html.d.ts.map +1 -1
  910. package/dist/utils/html.js +2 -21
  911. package/dist/utils/html.js.map +1 -1
  912. package/dist/utils/http.d.ts.map +1 -1
  913. package/dist/utils/http.js +2 -21
  914. package/dist/utils/http.js.map +1 -1
  915. package/dist/utils/ips.d.ts.map +1 -1
  916. package/dist/utils/ips.js +4 -28
  917. package/dist/utils/ips.js.map +1 -1
  918. package/dist/utils/json.d.ts +2 -15
  919. package/dist/utils/json.js +2 -157
  920. package/dist/utils/json.js.map +1 -1
  921. package/dist/utils/jsx-editable-transpiler.d.ts.map +1 -1
  922. package/dist/utils/jsx-editable-transpiler.js +7 -8
  923. package/dist/utils/jsx-editable-transpiler.js.map +1 -1
  924. package/dist/utils/jsx-editable-transpiler.test.js +1 -3
  925. package/dist/utils/jsx-editable-transpiler.test.js.map +1 -1
  926. package/dist/utils/jwt.d.ts.map +1 -1
  927. package/dist/utils/jwt.js +6 -7
  928. package/dist/utils/jwt.js.map +1 -1
  929. package/dist/utils/locks.d.ts.map +1 -1
  930. package/dist/utils/locks.js +2 -4
  931. package/dist/utils/locks.js.map +1 -1
  932. package/dist/utils/maps.d.ts.map +1 -1
  933. package/dist/utils/maps.js +2 -113
  934. package/dist/utils/maps.js.map +1 -1
  935. package/dist/utils/math.d.ts.map +1 -1
  936. package/dist/utils/math.js +2 -13
  937. package/dist/utils/math.js.map +1 -1
  938. package/dist/utils/monkey-patch.d.ts.map +1 -1
  939. package/dist/utils/monkey-patch.js +3 -5
  940. package/dist/utils/monkey-patch.js.map +1 -1
  941. package/dist/utils/node-http.js +2 -4
  942. package/dist/utils/node-http.js.map +1 -1
  943. package/dist/utils/numbers.d.ts.map +1 -1
  944. package/dist/utils/numbers.js +2 -47
  945. package/dist/utils/numbers.js.map +1 -1
  946. package/dist/utils/oauth.d.ts.map +1 -1
  947. package/dist/utils/oauth.js +2 -3
  948. package/dist/utils/oauth.js.map +1 -1
  949. package/dist/utils/objects.d.ts +2 -59
  950. package/dist/utils/objects.js +2 -624
  951. package/dist/utils/objects.js.map +1 -1
  952. package/dist/utils/paginated-lists.d.ts.map +1 -1
  953. package/dist/utils/paginated-lists.js +2 -4
  954. package/dist/utils/paginated-lists.js.map +1 -1
  955. package/dist/utils/paginated-lists.test.js +1 -3
  956. package/dist/utils/paginated-lists.test.js.map +1 -1
  957. package/dist/utils/passkey.d.ts +2 -2
  958. package/dist/utils/promises.d.ts +1 -1
  959. package/dist/utils/promises.d.ts.map +1 -1
  960. package/dist/utils/promises.js +3 -163
  961. package/dist/utils/promises.js.map +1 -1
  962. package/dist/utils/proxies.d.ts.map +1 -1
  963. package/dist/utils/proxies.js +2 -39
  964. package/dist/utils/proxies.js.map +1 -1
  965. package/dist/utils/react.d.ts.map +1 -1
  966. package/dist/utils/react.js +4 -44
  967. package/dist/utils/react.js.map +1 -1
  968. package/dist/utils/redirect-urls.d.ts.map +1 -1
  969. package/dist/utils/redirect-urls.js +3 -94
  970. package/dist/utils/redirect-urls.js.map +1 -1
  971. package/dist/utils/regex.js +2 -3
  972. package/dist/utils/regex.js.map +1 -1
  973. package/dist/utils/results.d.ts +2 -70
  974. package/dist/utils/results.js +2 -215
  975. package/dist/utils/results.js.map +1 -1
  976. package/dist/utils/sentry.js +2 -3
  977. package/dist/utils/sentry.js.map +1 -1
  978. package/dist/utils/stores.d.ts +1 -1
  979. package/dist/utils/stores.d.ts.map +1 -1
  980. package/dist/utils/stores.js +2 -4
  981. package/dist/utils/stores.js.map +1 -1
  982. package/dist/utils/strings.d.ts +2 -76
  983. package/dist/utils/strings.js +2 -253
  984. package/dist/utils/strings.js.map +1 -1
  985. package/dist/utils/strings.nicify.test.js +1 -3
  986. package/dist/utils/strings.nicify.test.js.map +1 -1
  987. package/dist/utils/telemetry.d.ts.map +1 -1
  988. package/dist/utils/telemetry.js +2 -4
  989. package/dist/utils/telemetry.js.map +1 -1
  990. package/dist/utils/turnstile-browser.d.ts.map +1 -1
  991. package/dist/utils/turnstile-browser.js +2 -4
  992. package/dist/utils/turnstile-browser.js.map +1 -1
  993. package/dist/utils/turnstile-flow.d.ts.map +1 -1
  994. package/dist/utils/turnstile-flow.js +2 -4
  995. package/dist/utils/turnstile-flow.js.map +1 -1
  996. package/dist/utils/turnstile-flow.test.js +1 -3
  997. package/dist/utils/turnstile-flow.test.js.map +1 -1
  998. package/dist/utils/turnstile.d.ts.map +1 -1
  999. package/dist/utils/turnstile.js +2 -3
  1000. package/dist/utils/turnstile.js.map +1 -1
  1001. package/dist/utils/typed-arrays.js +2 -4
  1002. package/dist/utils/typed-arrays.js.map +1 -1
  1003. package/dist/utils/types.d.ts +2 -77
  1004. package/dist/utils/types.js +2 -3
  1005. package/dist/utils/types.js.map +1 -1
  1006. package/dist/utils/unicode.d.ts.map +1 -1
  1007. package/dist/utils/unicode.js +2 -15
  1008. package/dist/utils/unicode.js.map +1 -1
  1009. package/dist/utils/urls.d.ts.map +1 -1
  1010. package/dist/utils/urls.js +2 -153
  1011. package/dist/utils/urls.js.map +1 -1
  1012. package/dist/utils/uuids.d.ts.map +1 -1
  1013. package/dist/utils/uuids.js +3 -28
  1014. package/dist/utils/uuids.js.map +1 -1
  1015. package/dist/webhooks-8Ts1Clcb.d.ts +326 -0
  1016. package/dist/webhooks-8Ts1Clcb.d.ts.map +1 -0
  1017. package/package.json +2 -8
  1018. package/src/interface/client-interface.test.ts +77 -12
  1019. package/src/interface/client-interface.ts +9 -9
  1020. package/dist/config/format.d.ts.map +0 -1
  1021. package/dist/config/schema.d.ts.map +0 -1
  1022. package/dist/crud.d.ts.map +0 -1
  1023. package/dist/interface/admin-interface.d.ts.map +0 -1
  1024. package/dist/interface/admin-metrics.d.ts.map +0 -1
  1025. package/dist/interface/client-interface.d.ts.map +0 -1
  1026. package/dist/interface/crud/analytics.d.ts.map +0 -1
  1027. package/dist/interface/crud/connected-accounts.d.ts.map +0 -1
  1028. package/dist/interface/crud/contact-channels.d.ts.map +0 -1
  1029. package/dist/interface/crud/current-user.d.ts.map +0 -1
  1030. package/dist/interface/crud/emails.d.ts.map +0 -1
  1031. package/dist/interface/crud/internal-api-keys.d.ts.map +0 -1
  1032. package/dist/interface/crud/invoices.d.ts.map +0 -1
  1033. package/dist/interface/crud/items.d.ts.map +0 -1
  1034. package/dist/interface/crud/notification-preferences.d.ts.map +0 -1
  1035. package/dist/interface/crud/oauth-providers.d.ts.map +0 -1
  1036. package/dist/interface/crud/products.d.ts.map +0 -1
  1037. package/dist/interface/crud/project-api-keys.d.ts.map +0 -1
  1038. package/dist/interface/crud/project-permissions.d.ts.map +0 -1
  1039. package/dist/interface/crud/projects.d.ts.map +0 -1
  1040. package/dist/interface/crud/session-replays.d.ts.map +0 -1
  1041. package/dist/interface/crud/sessions.d.ts.map +0 -1
  1042. package/dist/interface/crud/svix-token.d.ts.map +0 -1
  1043. package/dist/interface/crud/team-invitation.d.ts.map +0 -1
  1044. package/dist/interface/crud/team-member-profiles.d.ts.map +0 -1
  1045. package/dist/interface/crud/team-memberships.d.ts.map +0 -1
  1046. package/dist/interface/crud/team-permissions.d.ts.map +0 -1
  1047. package/dist/interface/crud/teams.d.ts.map +0 -1
  1048. package/dist/interface/crud/transactions.d.ts.map +0 -1
  1049. package/dist/interface/crud/users.d.ts.map +0 -1
  1050. package/dist/interface/handler-urls.d.ts.map +0 -1
  1051. package/dist/interface/page-component-versions.d.ts.map +0 -1
  1052. package/dist/interface/plan-usage.d.ts.map +0 -1
  1053. package/dist/interface/server-interface.d.ts.map +0 -1
  1054. package/dist/interface/webhooks.d.ts.map +0 -1
  1055. package/dist/known-errors.d.ts.map +0 -1
  1056. package/dist/schema-fields.d.ts.map +0 -1
  1057. package/dist/sessions.d.ts.map +0 -1
  1058. package/dist/utils/country-codes.d.ts.map +0 -1
  1059. package/dist/utils/currency-constants.d.ts.map +0 -1
  1060. package/dist/utils/dates.d.ts.map +0 -1
  1061. package/dist/utils/errors.d.ts.map +0 -1
  1062. package/dist/utils/json.d.ts.map +0 -1
  1063. package/dist/utils/objects.d.ts.map +0 -1
  1064. package/dist/utils/results.d.ts.map +0 -1
  1065. package/dist/utils/strings.d.ts.map +0 -1
  1066. package/dist/utils/types.d.ts.map +0 -1
@@ -1,5 +1,4 @@
1
1
  import { Result } from "./results.js";
2
-
3
2
  //#region src/utils/json.tsx
4
3
  function isJsonSerializable(value) {
5
4
  switch (typeof value) {
@@ -13,166 +12,13 @@ function isJsonSerializable(value) {
13
12
  default: return false;
14
13
  }
15
14
  }
16
- (void 0)?.test("isJsonSerializable", ({ expect }) => {
17
- expect(isJsonSerializable(null)).toBe(true);
18
- expect(isJsonSerializable(true)).toBe(true);
19
- expect(isJsonSerializable(false)).toBe(true);
20
- expect(isJsonSerializable(123)).toBe(true);
21
- expect(isJsonSerializable("string")).toBe(true);
22
- expect(isJsonSerializable([])).toBe(true);
23
- expect(isJsonSerializable([
24
- 1,
25
- 2,
26
- 3
27
- ])).toBe(true);
28
- expect(isJsonSerializable([
29
- "a",
30
- "b",
31
- "c"
32
- ])).toBe(true);
33
- expect(isJsonSerializable([
34
- 1,
35
- "a",
36
- true,
37
- null
38
- ])).toBe(true);
39
- expect(isJsonSerializable([
40
- 1,
41
- [2, 3],
42
- { a: "b" }
43
- ])).toBe(true);
44
- expect(isJsonSerializable({})).toBe(true);
45
- expect(isJsonSerializable({
46
- a: 1,
47
- b: 2
48
- })).toBe(true);
49
- expect(isJsonSerializable({
50
- a: "string",
51
- b: true,
52
- c: null
53
- })).toBe(true);
54
- expect(isJsonSerializable({
55
- a: [
56
- 1,
57
- 2,
58
- 3
59
- ],
60
- b: { c: "d" }
61
- })).toBe(true);
62
- expect(isJsonSerializable(void 0)).toBe(false);
63
- expect(isJsonSerializable(() => {})).toBe(false);
64
- expect(isJsonSerializable(Symbol())).toBe(false);
65
- expect(isJsonSerializable(BigInt(123))).toBe(false);
66
- expect(isJsonSerializable([
67
- 1,
68
- void 0,
69
- 3
70
- ])).toBe(false);
71
- expect(isJsonSerializable([
72
- 1,
73
- () => {},
74
- 3
75
- ])).toBe(false);
76
- expect(isJsonSerializable({
77
- a: 1,
78
- b: void 0
79
- })).toBe(false);
80
- expect(isJsonSerializable({
81
- a: 1,
82
- b: () => {}
83
- })).toBe(false);
84
- });
85
15
  function parseJson(json) {
86
16
  return Result.fromThrowing(() => JSON.parse(json));
87
17
  }
88
- (void 0)?.test("parseJson", ({ expect }) => {
89
- const nullResult = parseJson("null");
90
- expect(nullResult.status).toBe("ok");
91
- if (nullResult.status === "ok") expect(nullResult.data).toBe(null);
92
- const trueResult = parseJson("true");
93
- expect(trueResult.status).toBe("ok");
94
- if (trueResult.status === "ok") expect(trueResult.data).toBe(true);
95
- const numberResult = parseJson("123");
96
- expect(numberResult.status).toBe("ok");
97
- if (numberResult.status === "ok") expect(numberResult.data).toBe(123);
98
- const stringResult = parseJson("\"string\"");
99
- expect(stringResult.status).toBe("ok");
100
- if (stringResult.status === "ok") expect(stringResult.data).toBe("string");
101
- const emptyArrayResult = parseJson("[]");
102
- expect(emptyArrayResult.status).toBe("ok");
103
- if (emptyArrayResult.status === "ok") expect(emptyArrayResult.data).toEqual([]);
104
- const arrayResult = parseJson("[1,2,3]");
105
- expect(arrayResult.status).toBe("ok");
106
- if (arrayResult.status === "ok") expect(arrayResult.data).toEqual([
107
- 1,
108
- 2,
109
- 3
110
- ]);
111
- const emptyObjectResult = parseJson("{}");
112
- expect(emptyObjectResult.status).toBe("ok");
113
- if (emptyObjectResult.status === "ok") expect(emptyObjectResult.data).toEqual({});
114
- const objectResult = parseJson("{\"a\":1,\"b\":\"string\"}");
115
- expect(objectResult.status).toBe("ok");
116
- if (objectResult.status === "ok") expect(objectResult.data).toEqual({
117
- a: 1,
118
- b: "string"
119
- });
120
- expect(parseJson("").status).toBe("error");
121
- expect(parseJson("undefined").status).toBe("error");
122
- expect(parseJson("{").status).toBe("error");
123
- expect(parseJson("{\"a\":1,}").status).toBe("error");
124
- expect(parseJson("function(){}").status).toBe("error");
125
- });
126
18
  function stringifyJson(json) {
127
19
  return Result.fromThrowing(() => JSON.stringify(json));
128
20
  }
129
- (void 0)?.test("stringifyJson", ({ expect }) => {
130
- const nullResult = stringifyJson(null);
131
- expect(nullResult.status).toBe("ok");
132
- if (nullResult.status === "ok") expect(nullResult.data).toBe("null");
133
- const trueResult = stringifyJson(true);
134
- expect(trueResult.status).toBe("ok");
135
- if (trueResult.status === "ok") expect(trueResult.data).toBe("true");
136
- const numberResult = stringifyJson(123);
137
- expect(numberResult.status).toBe("ok");
138
- if (numberResult.status === "ok") expect(numberResult.data).toBe("123");
139
- const stringResult = stringifyJson("string");
140
- expect(stringResult.status).toBe("ok");
141
- if (stringResult.status === "ok") expect(stringResult.data).toBe("\"string\"");
142
- const emptyArrayResult = stringifyJson([]);
143
- expect(emptyArrayResult.status).toBe("ok");
144
- if (emptyArrayResult.status === "ok") expect(emptyArrayResult.data).toBe("[]");
145
- const arrayResult = stringifyJson([
146
- 1,
147
- 2,
148
- 3
149
- ]);
150
- expect(arrayResult.status).toBe("ok");
151
- if (arrayResult.status === "ok") expect(arrayResult.data).toBe("[1,2,3]");
152
- const emptyObjectResult = stringifyJson({});
153
- expect(emptyObjectResult.status).toBe("ok");
154
- if (emptyObjectResult.status === "ok") expect(emptyObjectResult.data).toBe("{}");
155
- const objectResult = stringifyJson({
156
- a: 1,
157
- b: "string"
158
- });
159
- expect(objectResult.status).toBe("ok");
160
- if (objectResult.status === "ok") expect(objectResult.data).toBe("{\"a\":1,\"b\":\"string\"}");
161
- const nestedResult = stringifyJson({
162
- a: [
163
- 1,
164
- 2,
165
- 3
166
- ],
167
- b: { c: "d" }
168
- });
169
- expect(nestedResult.status).toBe("ok");
170
- if (nestedResult.status === "ok") expect(nestedResult.data).toBe("{\"a\":[1,2,3],\"b\":{\"c\":\"d\"}}");
171
- const circular = { a: 1 };
172
- circular.self = circular;
173
- expect(stringifyJson(circular).status).toBe("error");
174
- });
175
-
176
21
  //#endregion
177
22
  export { isJsonSerializable, parseJson, stringifyJson };
23
+
178
24
  //# sourceMappingURL=json.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json.js","names":[],"sources":["../../../src/utils/json.tsx"],"sourcesContent":["import { Result } from \"./results\";\n\nexport type Json =\n | null\n | boolean\n | number\n | string\n | Json[]\n | { [key: string]: Json };\n\nexport type ReadonlyJson =\n | null\n | boolean\n | number\n | string\n | readonly ReadonlyJson[]\n | { readonly [key: string]: ReadonlyJson };\n\nexport function isJsonSerializable(value: unknown): value is Json {\n switch (typeof value) {\n case \"object\": {\n if (value === null) return true;\n if (Array.isArray(value)) return value.every(isJsonSerializable);\n return Object.keys(value).every(k => typeof k === \"string\") && Object.values(value).every(isJsonSerializable);\n }\n case \"string\":\n case \"number\":\n case \"boolean\": {\n return true;\n }\n default: {\n return false;\n }\n }\n}\nimport.meta.vitest?.test(\"isJsonSerializable\", ({ expect }) => {\n // Test primitive values\n expect(isJsonSerializable(null)).toBe(true);\n expect(isJsonSerializable(true)).toBe(true);\n expect(isJsonSerializable(false)).toBe(true);\n expect(isJsonSerializable(123)).toBe(true);\n expect(isJsonSerializable(\"string\")).toBe(true);\n\n // Test arrays\n expect(isJsonSerializable([])).toBe(true);\n expect(isJsonSerializable([1, 2, 3])).toBe(true);\n expect(isJsonSerializable([\"a\", \"b\", \"c\"])).toBe(true);\n expect(isJsonSerializable([1, \"a\", true, null])).toBe(true);\n expect(isJsonSerializable([1, [2, 3], { a: \"b\" }])).toBe(true);\n\n // Test objects\n expect(isJsonSerializable({})).toBe(true);\n expect(isJsonSerializable({ a: 1, b: 2 })).toBe(true);\n expect(isJsonSerializable({ a: \"string\", b: true, c: null })).toBe(true);\n expect(isJsonSerializable({ a: [1, 2, 3], b: { c: \"d\" } })).toBe(true);\n\n // Test invalid JSON values\n expect(isJsonSerializable(undefined)).toBe(false);\n expect(isJsonSerializable(() => {})).toBe(false);\n expect(isJsonSerializable(Symbol())).toBe(false);\n expect(isJsonSerializable(BigInt(123))).toBe(false);\n\n // Test arrays with invalid JSON values\n expect(isJsonSerializable([1, undefined, 3])).toBe(false);\n expect(isJsonSerializable([1, () => {}, 3])).toBe(false);\n\n // Test objects with invalid JSON values\n expect(isJsonSerializable({ a: 1, b: undefined })).toBe(false);\n expect(isJsonSerializable({ a: 1, b: () => {} })).toBe(false);\n});\n\nexport function parseJson(json: string): Result<Json> {\n return Result.fromThrowing(() => JSON.parse(json));\n}\nimport.meta.vitest?.test(\"parseJson\", ({ expect }) => {\n // Test valid JSON strings\n const nullResult = parseJson(\"null\");\n expect(nullResult.status).toBe(\"ok\");\n if (nullResult.status === \"ok\") {\n expect(nullResult.data).toBe(null);\n }\n\n const trueResult = parseJson(\"true\");\n expect(trueResult.status).toBe(\"ok\");\n if (trueResult.status === \"ok\") {\n expect(trueResult.data).toBe(true);\n }\n\n const numberResult = parseJson(\"123\");\n expect(numberResult.status).toBe(\"ok\");\n if (numberResult.status === \"ok\") {\n expect(numberResult.data).toBe(123);\n }\n\n const stringResult = parseJson('\"string\"');\n expect(stringResult.status).toBe(\"ok\");\n if (stringResult.status === \"ok\") {\n expect(stringResult.data).toBe(\"string\");\n }\n\n const emptyArrayResult = parseJson(\"[]\");\n expect(emptyArrayResult.status).toBe(\"ok\");\n if (emptyArrayResult.status === \"ok\") {\n expect(emptyArrayResult.data).toEqual([]);\n }\n\n const arrayResult = parseJson(\"[1,2,3]\");\n expect(arrayResult.status).toBe(\"ok\");\n if (arrayResult.status === \"ok\") {\n expect(arrayResult.data).toEqual([1, 2, 3]);\n }\n\n const emptyObjectResult = parseJson(\"{}\");\n expect(emptyObjectResult.status).toBe(\"ok\");\n if (emptyObjectResult.status === \"ok\") {\n expect(emptyObjectResult.data).toEqual({});\n }\n\n const objectResult = parseJson('{\"a\":1,\"b\":\"string\"}');\n expect(objectResult.status).toBe(\"ok\");\n if (objectResult.status === \"ok\") {\n expect(objectResult.data).toEqual({ a: 1, b: \"string\" });\n }\n\n // Test invalid JSON strings\n expect(parseJson(\"\").status).toBe(\"error\");\n expect(parseJson(\"undefined\").status).toBe(\"error\");\n expect(parseJson(\"{\").status).toBe(\"error\");\n expect(parseJson('{\"a\":1,}').status).toBe(\"error\");\n expect(parseJson(\"function(){}\").status).toBe(\"error\");\n});\n\nexport function stringifyJson(json: Json): Result<string> {\n return Result.fromThrowing(() => JSON.stringify(json));\n}\nimport.meta.vitest?.test(\"stringifyJson\", ({ expect }) => {\n // Test primitive values\n const nullResult = stringifyJson(null);\n expect(nullResult.status).toBe(\"ok\");\n if (nullResult.status === \"ok\") {\n expect(nullResult.data).toBe(\"null\");\n }\n\n const trueResult = stringifyJson(true);\n expect(trueResult.status).toBe(\"ok\");\n if (trueResult.status === \"ok\") {\n expect(trueResult.data).toBe(\"true\");\n }\n\n const numberResult = stringifyJson(123);\n expect(numberResult.status).toBe(\"ok\");\n if (numberResult.status === \"ok\") {\n expect(numberResult.data).toBe(\"123\");\n }\n\n const stringResult = stringifyJson(\"string\");\n expect(stringResult.status).toBe(\"ok\");\n if (stringResult.status === \"ok\") {\n expect(stringResult.data).toBe('\"string\"');\n }\n\n // Test arrays\n const emptyArrayResult = stringifyJson([]);\n expect(emptyArrayResult.status).toBe(\"ok\");\n if (emptyArrayResult.status === \"ok\") {\n expect(emptyArrayResult.data).toBe(\"[]\");\n }\n\n const arrayResult = stringifyJson([1, 2, 3]);\n expect(arrayResult.status).toBe(\"ok\");\n if (arrayResult.status === \"ok\") {\n expect(arrayResult.data).toBe(\"[1,2,3]\");\n }\n\n // Test objects\n const emptyObjectResult = stringifyJson({});\n expect(emptyObjectResult.status).toBe(\"ok\");\n if (emptyObjectResult.status === \"ok\") {\n expect(emptyObjectResult.data).toBe(\"{}\");\n }\n\n const objectResult = stringifyJson({ a: 1, b: \"string\" });\n expect(objectResult.status).toBe(\"ok\");\n if (objectResult.status === \"ok\") {\n expect(objectResult.data).toBe('{\"a\":1,\"b\":\"string\"}');\n }\n\n // Test nested structures\n const nested = { a: [1, 2, 3], b: { c: \"d\" } };\n const nestedResult = stringifyJson(nested);\n expect(nestedResult.status).toBe(\"ok\");\n if (nestedResult.status === \"ok\") {\n expect(nestedResult.data).toBe('{\"a\":[1,2,3],\"b\":{\"c\":\"d\"}}');\n }\n\n // Test circular references (should error)\n const circular: any = { a: 1 };\n circular.self = circular;\n expect(stringifyJson(circular).status).toBe(\"error\");\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"json.js","names":[],"sources":["../../../src/utils/json.tsx"],"sourcesContent":["import { Result } from \"./results\";\n\nexport type Json =\n | null\n | boolean\n | number\n | string\n | Json[]\n | { [key: string]: Json };\n\nexport type ReadonlyJson =\n | null\n | boolean\n | number\n | string\n | readonly ReadonlyJson[]\n | { readonly [key: string]: ReadonlyJson };\n\nexport function isJsonSerializable(value: unknown): value is Json {\n switch (typeof value) {\n case \"object\": {\n if (value === null) return true;\n if (Array.isArray(value)) return value.every(isJsonSerializable);\n return Object.keys(value).every(k => typeof k === \"string\") && Object.values(value).every(isJsonSerializable);\n }\n case \"string\":\n case \"number\":\n case \"boolean\": {\n return true;\n }\n default: {\n return false;\n }\n }\n}\nimport.meta.vitest?.test(\"isJsonSerializable\", ({ expect }) => {\n // Test primitive values\n expect(isJsonSerializable(null)).toBe(true);\n expect(isJsonSerializable(true)).toBe(true);\n expect(isJsonSerializable(false)).toBe(true);\n expect(isJsonSerializable(123)).toBe(true);\n expect(isJsonSerializable(\"string\")).toBe(true);\n\n // Test arrays\n expect(isJsonSerializable([])).toBe(true);\n expect(isJsonSerializable([1, 2, 3])).toBe(true);\n expect(isJsonSerializable([\"a\", \"b\", \"c\"])).toBe(true);\n expect(isJsonSerializable([1, \"a\", true, null])).toBe(true);\n expect(isJsonSerializable([1, [2, 3], { a: \"b\" }])).toBe(true);\n\n // Test objects\n expect(isJsonSerializable({})).toBe(true);\n expect(isJsonSerializable({ a: 1, b: 2 })).toBe(true);\n expect(isJsonSerializable({ a: \"string\", b: true, c: null })).toBe(true);\n expect(isJsonSerializable({ a: [1, 2, 3], b: { c: \"d\" } })).toBe(true);\n\n // Test invalid JSON values\n expect(isJsonSerializable(undefined)).toBe(false);\n expect(isJsonSerializable(() => {})).toBe(false);\n expect(isJsonSerializable(Symbol())).toBe(false);\n expect(isJsonSerializable(BigInt(123))).toBe(false);\n\n // Test arrays with invalid JSON values\n expect(isJsonSerializable([1, undefined, 3])).toBe(false);\n expect(isJsonSerializable([1, () => {}, 3])).toBe(false);\n\n // Test objects with invalid JSON values\n expect(isJsonSerializable({ a: 1, b: undefined })).toBe(false);\n expect(isJsonSerializable({ a: 1, b: () => {} })).toBe(false);\n});\n\nexport function parseJson(json: string): Result<Json> {\n return Result.fromThrowing(() => JSON.parse(json));\n}\nimport.meta.vitest?.test(\"parseJson\", ({ expect }) => {\n // Test valid JSON strings\n const nullResult = parseJson(\"null\");\n expect(nullResult.status).toBe(\"ok\");\n if (nullResult.status === \"ok\") {\n expect(nullResult.data).toBe(null);\n }\n\n const trueResult = parseJson(\"true\");\n expect(trueResult.status).toBe(\"ok\");\n if (trueResult.status === \"ok\") {\n expect(trueResult.data).toBe(true);\n }\n\n const numberResult = parseJson(\"123\");\n expect(numberResult.status).toBe(\"ok\");\n if (numberResult.status === \"ok\") {\n expect(numberResult.data).toBe(123);\n }\n\n const stringResult = parseJson('\"string\"');\n expect(stringResult.status).toBe(\"ok\");\n if (stringResult.status === \"ok\") {\n expect(stringResult.data).toBe(\"string\");\n }\n\n const emptyArrayResult = parseJson(\"[]\");\n expect(emptyArrayResult.status).toBe(\"ok\");\n if (emptyArrayResult.status === \"ok\") {\n expect(emptyArrayResult.data).toEqual([]);\n }\n\n const arrayResult = parseJson(\"[1,2,3]\");\n expect(arrayResult.status).toBe(\"ok\");\n if (arrayResult.status === \"ok\") {\n expect(arrayResult.data).toEqual([1, 2, 3]);\n }\n\n const emptyObjectResult = parseJson(\"{}\");\n expect(emptyObjectResult.status).toBe(\"ok\");\n if (emptyObjectResult.status === \"ok\") {\n expect(emptyObjectResult.data).toEqual({});\n }\n\n const objectResult = parseJson('{\"a\":1,\"b\":\"string\"}');\n expect(objectResult.status).toBe(\"ok\");\n if (objectResult.status === \"ok\") {\n expect(objectResult.data).toEqual({ a: 1, b: \"string\" });\n }\n\n // Test invalid JSON strings\n expect(parseJson(\"\").status).toBe(\"error\");\n expect(parseJson(\"undefined\").status).toBe(\"error\");\n expect(parseJson(\"{\").status).toBe(\"error\");\n expect(parseJson('{\"a\":1,}').status).toBe(\"error\");\n expect(parseJson(\"function(){}\").status).toBe(\"error\");\n});\n\nexport function stringifyJson(json: Json): Result<string> {\n return Result.fromThrowing(() => JSON.stringify(json));\n}\nimport.meta.vitest?.test(\"stringifyJson\", ({ expect }) => {\n // Test primitive values\n const nullResult = stringifyJson(null);\n expect(nullResult.status).toBe(\"ok\");\n if (nullResult.status === \"ok\") {\n expect(nullResult.data).toBe(\"null\");\n }\n\n const trueResult = stringifyJson(true);\n expect(trueResult.status).toBe(\"ok\");\n if (trueResult.status === \"ok\") {\n expect(trueResult.data).toBe(\"true\");\n }\n\n const numberResult = stringifyJson(123);\n expect(numberResult.status).toBe(\"ok\");\n if (numberResult.status === \"ok\") {\n expect(numberResult.data).toBe(\"123\");\n }\n\n const stringResult = stringifyJson(\"string\");\n expect(stringResult.status).toBe(\"ok\");\n if (stringResult.status === \"ok\") {\n expect(stringResult.data).toBe('\"string\"');\n }\n\n // Test arrays\n const emptyArrayResult = stringifyJson([]);\n expect(emptyArrayResult.status).toBe(\"ok\");\n if (emptyArrayResult.status === \"ok\") {\n expect(emptyArrayResult.data).toBe(\"[]\");\n }\n\n const arrayResult = stringifyJson([1, 2, 3]);\n expect(arrayResult.status).toBe(\"ok\");\n if (arrayResult.status === \"ok\") {\n expect(arrayResult.data).toBe(\"[1,2,3]\");\n }\n\n // Test objects\n const emptyObjectResult = stringifyJson({});\n expect(emptyObjectResult.status).toBe(\"ok\");\n if (emptyObjectResult.status === \"ok\") {\n expect(emptyObjectResult.data).toBe(\"{}\");\n }\n\n const objectResult = stringifyJson({ a: 1, b: \"string\" });\n expect(objectResult.status).toBe(\"ok\");\n if (objectResult.status === \"ok\") {\n expect(objectResult.data).toBe('{\"a\":1,\"b\":\"string\"}');\n }\n\n // Test nested structures\n const nested = { a: [1, 2, 3], b: { c: \"d\" } };\n const nestedResult = stringifyJson(nested);\n expect(nestedResult.status).toBe(\"ok\");\n if (nestedResult.status === \"ok\") {\n expect(nestedResult.data).toBe('{\"a\":[1,2,3],\"b\":{\"c\":\"d\"}}');\n }\n\n // Test circular references (should error)\n const circular: any = { a: 1 };\n circular.self = circular;\n expect(stringifyJson(circular).status).toBe(\"error\");\n});\n"],"mappings":";;AAkBA,SAAgB,mBAAmB,OAA+B;CAChE,QAAQ,OAAO,OAAf;EACE,KAAK;GACH,IAAI,UAAU,MAAM,OAAO;GAC3B,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,MAAM,MAAM,kBAAkB;GAC/D,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC,OAAM,MAAK,OAAO,MAAM,QAAQ,KAAK,OAAO,OAAO,KAAK,CAAC,CAAC,MAAM,kBAAkB;EAE9G,KAAK;EACL,KAAK;EACL,KAAK,WACH,OAAO;EAET,SACE,OAAO;CAEX;AACF;AAqCA,SAAgB,UAAU,MAA4B;CACpD,OAAO,OAAO,mBAAmB,KAAK,MAAM,IAAI,CAAC;AACnD;AA2DA,SAAgB,cAAc,MAA4B;CACxD,OAAO,OAAO,mBAAmB,KAAK,UAAU,IAAI,CAAC;AACvD"}
@@ -1 +1 @@
1
- {"version":3,"file":"jsx-editable-transpiler.d.ts","names":[],"sources":["../../../src/utils/jsx-editable-transpiler.tsx"],"mappings":";;AAUA;;;KAAY,gBAAA;EAEV,iDAAA,EAAA,UAIE;EADF,GAAA;IACE,KAAA;IACA,GAAA;IACA,IAAA;IACA,MAAA;EAAA,GAaF;EATA,YAAA,UAWE;EARF,QAAA,UAYA;EATA,OAAA,YAWE;EARF,aAAA;IACE,OAAA;IACA,KAAA,EAAO,MAAA;EAAA,GAmBC;EAfV,aAAA;IACE,MAAA;IACA,KAAA;EAAA,GAuBqB;EAnBvB,YAAA,UAmBA;EAhBA,eAAA,UAgBgC;EAbhC,eAAA,UAagD;EAVhD,UAAA;AAAA;;;;KAMU,eAAA;EAsDV,2DApDA,IAAA,UAuDgB;EArDhB,eAAA,EAAiB,MAAA,SAAe,gBAAA;AAAA;;;;;;;;;;;;;;;;;iBAgDlB,sBAAA,CACd,MAAA,UACA,OAAA;EACE,UAAA;AAAA,IAED,eAAA;;;;;;;;;;iBAsRa,+BAAA,CAAgC,IAAA"}
1
+ {"version":3,"file":"jsx-editable-transpiler.d.ts","names":[],"sources":["../../../src/utils/jsx-editable-transpiler.tsx"],"mappings":";;AAUA;;;KAAY,gBAAA;EAEV,iDAAA,EAAA,UAIE;EADF,GAAA;IACE,KAAA;IACA,GAAA;IACA,IAAA;IACA,MAAA;EAAA,GAaF;EATA,YAAA,UAWE;EARF,QAAA,UAYA;EATA,OAAA,YAWE;EARF,aAAA;IACE,OAAA;IACA,KAAA,EAAO,MAAM;EAAA,GAmBL;EAfV,aAAA;IACE,MAAA;IACA,KAAA;EAAA,GAuBqB;EAnBvB,YAAA,UAmBA;EAhBA,eAAA,UAgBgC;EAbhC,eAAA,UAagD;EAVhD,UAAA;AAAA;;;;KAMU,eAAA;EAsDV,2DApDA,IAAA,UAuDgB;EArDhB,eAAA,EAAiB,MAAM,SAAS,gBAAA;AAAA;;;;AA2U0B;;;;;;;;;;;;;iBA3R5C,sBAAA,CACd,MAAA,UACA,OAAA;EACE,UAAA;AAAA,IAED,eAAe;;;;;;;;;;iBAsRF,+BAAA,CAAgC,IAAY"}
@@ -3,7 +3,6 @@ import * as parser from "@babel/parser";
3
3
  import traverse from "@babel/traverse";
4
4
  import * as t from "@babel/types";
5
5
  import { createHash } from "crypto";
6
-
7
6
  //#region src/utils/jsx-editable-transpiler.tsx
8
7
  /**
9
8
  * The __Editable component definition that gets injected into transformed source.
@@ -210,7 +209,7 @@ function transpileJsxForEditing(source, options) {
210
209
  function convertSentinelTokensToComments(html) {
211
210
  return html.replace(/⟦STACK_EDITABLE_START:([^⟧]+)⟧/g, "<!-- STACK_EDITABLE_START $1 -->").replace(/⟦STACK_EDITABLE_END:([^⟧]+)⟧/g, "<!-- STACK_EDITABLE_END $1 -->").replace(/⟦STACK_EXPR_START:([^⟧]+)⟧/g, "<!-- STACK_EXPR_START $1 -->").replace(/⟦STACK_EXPR_END⟧/g, "<!-- STACK_EXPR_END -->");
212
211
  }
213
-
214
212
  //#endregion
215
213
  export { convertSentinelTokensToComments, transpileJsxForEditing };
214
+
216
215
  //# sourceMappingURL=jsx-editable-transpiler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jsx-editable-transpiler.js","names":[],"sources":["../../../src/utils/jsx-editable-transpiler.tsx"],"sourcesContent":["import generate from '@babel/generator';\nimport * as parser from '@babel/parser';\nimport traverse, { NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { createHash } from 'crypto';\n\n/**\n * Metadata for an editable text region in JSX source code.\n * This information is used by the AI to accurately locate and update text.\n */\nexport type EditableMetadata = {\n /** Unique identifier for this editable region */\n id: string,\n\n /** Exact source code location */\n loc: {\n start: number,\n end: number,\n line: number,\n column: number,\n },\n\n /** The original text content */\n originalText: string,\n\n /** Hash of original text for quick mismatch detection */\n textHash: string,\n\n /** JSX ancestry path from component root to this text node */\n jsxPath: string[],\n\n /** The immediate parent JSX element */\n parentElement: {\n tagName: string,\n props: Record<string, string>,\n },\n\n /** Surrounding source context for disambiguation */\n sourceContext: {\n before: string,\n after: string,\n },\n\n /** Index among sibling text nodes in the same parent */\n siblingIndex: number,\n\n /** Total count of this exact text in the source */\n occurrenceCount: number,\n\n /** Which occurrence this is (1-indexed) */\n occurrenceIndex: number,\n\n /** Which file this text is in */\n sourceFile: \"template\" | \"theme\",\n};\n\n/**\n * Result of transpiling JSX source to include editable markers.\n */\nexport type TranspileResult = {\n /** The transformed source code with __Editable wrappers */\n code: string,\n /** Map of editable region IDs to their metadata */\n editableRegions: Record<string, EditableMetadata>,\n};\n\n/**\n * The __Editable component definition that gets injected into transformed source.\n * It renders sentinel tokens around text that will be converted to HTML comments.\n */\nconst EDITABLE_COMPONENT_CODE = `\nfunction __Editable({ __id, children }) {\n return (\n <>\n {\\`⟦STACK_EDITABLE_START:\\${__id}⟧\\`}\n {children}\n {\\`⟦STACK_EDITABLE_END:\\${__id}⟧\\`}\n </>\n );\n}\nfunction __ExpressionTooltip({ __expr, children }) {\n // Only render markers if children is a primitive (string/number), not a React element\n if (typeof children === 'object' && children !== null) {\n return children;\n }\n return (\n <>\n {\\`⟦STACK_EXPR_START:\\${__expr}⟧\\`}\n {children}\n {\\`⟦STACK_EXPR_END⟧\\`}\n </>\n );\n}\n`;\n\n/**\n * Transpiles TSX source code to wrap all static JSX text nodes with __Editable components.\n *\n * For example:\n * ```tsx\n * <Text>Hi, {name}! Welcome.</Text>\n * ```\n * becomes:\n * ```tsx\n * <Text>\n * <__Editable __id=\"e1\">Hi, </__Editable>\n * {name}\n * <__Editable __id=\"e2\">! Welcome.</__Editable>\n * </Text>\n * ```\n */\nexport function transpileJsxForEditing(\n source: string,\n options: {\n sourceFile: \"template\" | \"theme\",\n }\n): TranspileResult {\n const editableRegions: Record<string, EditableMetadata> = {};\n let idCounter = 0;\n\n // Count occurrences of each text for the occurrenceCount/occurrenceIndex fields\n const textOccurrences = new Map<string, number>();\n\n // First pass: count all text occurrences\n const astForCounting = parser.parse(source, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n });\n\n traverse(astForCounting, {\n JSXText(path) {\n const text = path.node.value;\n // Skip whitespace-only text nodes\n if (text.trim() === '') return;\n textOccurrences.set(text, (textOccurrences.get(text) ?? 0) + 1);\n },\n });\n\n // Track current occurrence index for each text\n const textCurrentIndex = new Map<string, number>();\n\n // Parse the source again for transformation\n const ast = parser.parse(source, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n });\n\n // Helper to get JSX ancestry path\n function getJsxPath(path: NodePath<t.JSXText>): string[] {\n const jsxPath: string[] = [];\n let current: NodePath | null = path.parentPath;\n\n while (current) {\n if (t.isJSXElement(current.node)) {\n const openingElement = current.node.openingElement;\n if (t.isJSXIdentifier(openingElement.name)) {\n jsxPath.unshift(openingElement.name.name);\n } else if (t.isJSXMemberExpression(openingElement.name)) {\n jsxPath.unshift(generate(openingElement.name).code);\n }\n } else if (t.isFunctionDeclaration(current.node) && current.node.id) {\n jsxPath.unshift(current.node.id.name);\n break;\n } else if (t.isVariableDeclarator(current.node) && t.isIdentifier(current.node.id)) {\n jsxPath.unshift(current.node.id.name);\n break;\n }\n current = current.parentPath;\n }\n\n return jsxPath;\n }\n\n // Helper to get parent element info\n function getParentElement(path: NodePath<t.JSXText>): { tagName: string, props: Record<string, string> } {\n let current: NodePath | null = path.parentPath;\n\n while (current) {\n if (t.isJSXElement(current.node)) {\n const openingElement = current.node.openingElement;\n let tagName = '';\n\n if (t.isJSXIdentifier(openingElement.name)) {\n tagName = openingElement.name.name;\n } else if (t.isJSXMemberExpression(openingElement.name)) {\n tagName = generate(openingElement.name).code;\n }\n\n const props: Record<string, string> = {};\n for (const attr of openingElement.attributes) {\n if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {\n const propName = attr.name.name;\n if (t.isStringLiteral(attr.value)) {\n props[propName] = attr.value.value;\n } else if (t.isJSXExpressionContainer(attr.value) && !t.isJSXEmptyExpression(attr.value.expression)) {\n // For expressions, just note that it's dynamic\n props[propName] = `{${generate(attr.value.expression).code}}`;\n }\n }\n }\n\n return { tagName, props };\n }\n current = current.parentPath;\n }\n\n return { tagName: 'unknown', props: {} };\n }\n\n // Helper to get sibling index among text nodes\n function getSiblingIndex(path: NodePath<t.JSXText>): number {\n const parent = path.parentPath;\n if (!t.isJSXElement(parent.node) && !t.isJSXFragment(parent.node)) {\n return 0;\n }\n\n const children = parent.node.children;\n let textIndex = 0;\n\n for (const child of children) {\n if (child === path.node) {\n return textIndex;\n }\n if (t.isJSXText(child) && child.value.trim() !== '') {\n textIndex++;\n }\n }\n\n return textIndex;\n }\n\n // Helper to get source context (lines before/after)\n function getSourceContext(loc: { start: number, end: number }): { before: string, after: string } {\n const lines = source.split('\\n');\n let currentPos = 0;\n let startLine = 0;\n\n // Find line number for start position\n for (let i = 0; i < lines.length; i++) {\n if (currentPos + lines[i].length >= loc.start) {\n startLine = i;\n break;\n }\n currentPos += lines[i].length + 1; // +1 for newline\n }\n\n const beforeLines = lines.slice(Math.max(0, startLine - 3), startLine).join('\\n');\n const afterLines = lines.slice(startLine + 1, startLine + 4).join('\\n');\n\n return { before: beforeLines, after: afterLines };\n }\n\n // Transform JSXText nodes\n traverse(ast, {\n JSXText(path) {\n const decodedText = path.node.value;\n\n // Skip whitespace-only text nodes\n if (decodedText.trim() === '') return;\n\n // Skip if node doesn't have location info\n // Use explicit null checks since start/end can validly be 0\n if (!path.node.loc || path.node.start == null || path.node.end == null) return;\n\n // IMPORTANT: Use the RAW source text, not the decoded path.node.value\n // Babel's parser decodes HTML entities (e.g., &lt; -> <) in JSX text,\n // but we need to preserve the original source to avoid XSS vulnerabilities\n const rawText = source.slice(path.node.start, path.node.end);\n\n // Use source file prefix to ensure unique IDs across template and theme\n const prefix = options.sourceFile === 'template' ? 't' : 'h'; // t for template, h for theme (header)\n const id = `${prefix}${idCounter++}`;\n const occurrenceCount = textOccurrences.get(decodedText) ?? 1;\n const currentIndex = (textCurrentIndex.get(decodedText) ?? 0) + 1;\n textCurrentIndex.set(decodedText, currentIndex);\n\n const metadata: EditableMetadata = {\n id,\n loc: {\n start: path.node.start,\n end: path.node.end,\n line: path.node.loc.start.line,\n column: path.node.loc.start.column,\n },\n originalText: rawText,\n textHash: createHash('sha256').update(rawText).digest('hex').slice(0, 16),\n jsxPath: getJsxPath(path),\n parentElement: getParentElement(path),\n sourceContext: getSourceContext({ start: path.node.start, end: path.node.end }),\n siblingIndex: getSiblingIndex(path),\n occurrenceCount,\n occurrenceIndex: currentIndex,\n sourceFile: options.sourceFile,\n };\n\n editableRegions[id] = metadata;\n\n // Create the __Editable wrapper\n // <__Editable __id=\"...\">text</__Editable>\n // Use rawText to preserve HTML entities from the original source\n const editableElement = t.jsxElement(\n t.jsxOpeningElement(\n t.jsxIdentifier('__Editable'),\n [\n t.jsxAttribute(\n t.jsxIdentifier('__id'),\n t.stringLiteral(id)\n ),\n ],\n false\n ),\n t.jsxClosingElement(t.jsxIdentifier('__Editable')),\n [t.jsxText(rawText)],\n false\n );\n\n path.replaceWith(editableElement);\n },\n JSXExpressionContainer(path) {\n const expression = path.node.expression;\n\n // Skip empty expressions\n if (t.isJSXEmptyExpression(expression)) return;\n\n // Skip if parent is not a JSXElement (e.g., it's an attribute value)\n if (!t.isJSXElement(path.parent) && !t.isJSXFragment(path.parent)) return;\n\n // Skip JSX elements - we only want to show tooltips for text-rendering expressions\n if (t.isJSXElement(expression) || t.isJSXFragment(expression)) return;\n\n // Skip if no location info\n if (path.node.start == null || path.node.end == null) return;\n\n // Get the exact source code of the expression (including the ${} or just the expression)\n const exprSource = source.slice(path.node.start, path.node.end);\n\n // Base64 encode the expression to safely pass it through the marker\n const encodedExpr = Buffer.from(exprSource).toString('base64');\n\n // Create wrapper: <__ExpressionTooltip __expr=\"...\">{expression}</__ExpressionTooltip>\n const tooltipElement = t.jsxElement(\n t.jsxOpeningElement(\n t.jsxIdentifier('__ExpressionTooltip'),\n [\n t.jsxAttribute(\n t.jsxIdentifier('__expr'),\n t.stringLiteral(encodedExpr)\n ),\n ],\n false\n ),\n t.jsxClosingElement(t.jsxIdentifier('__ExpressionTooltip')),\n [t.jsxExpressionContainer(expression)],\n false\n );\n\n path.replaceWith(t.jsxExpressionContainer(tooltipElement));\n },\n });\n\n // Generate the transformed code\n const output = generate(ast, {\n retainLines: true,\n compact: false,\n });\n\n // Inject the __Editable component at the top of the file (after imports)\n let code = output.code;\n\n // Find the position after all imports\n const importEndMatch = code.match(/^(import\\s+[\\s\\S]*?from\\s+['\"][^'\"]+['\"];?\\s*)+/m);\n if (importEndMatch) {\n const insertPos = (importEndMatch.index ?? 0) + importEndMatch[0].length;\n code = code.slice(0, insertPos) + '\\n' + EDITABLE_COMPONENT_CODE + '\\n' + code.slice(insertPos);\n } else {\n // No imports found, add at the beginning\n code = EDITABLE_COMPONENT_CODE + '\\n' + code;\n }\n\n return {\n code,\n editableRegions,\n };\n}\n\n/**\n * Post-processes rendered HTML to convert sentinel tokens to HTML comments.\n *\n * Converts:\n * - `⟦STACK_EDITABLE_START:<id>⟧` → `<!-- STACK_EDITABLE_START <id> -->`\n * - `⟦STACK_EDITABLE_END:<id>⟧` → `<!-- STACK_EDITABLE_END <id> -->`\n * - `⟦STACK_EXPR_START:<base64-encoded-expr>⟧` → `<!-- STACK_EXPR_START <base64> -->`\n * - `⟦STACK_EXPR_END⟧` → `<!-- STACK_EXPR_END -->`\n */\nexport function convertSentinelTokensToComments(html: string): string {\n return html\n .replace(/⟦STACK_EDITABLE_START:([^⟧]+)⟧/g, '<!-- STACK_EDITABLE_START $1 -->')\n .replace(/⟦STACK_EDITABLE_END:([^⟧]+)⟧/g, '<!-- STACK_EDITABLE_END $1 -->')\n .replace(/⟦STACK_EXPR_START:([^⟧]+)⟧/g, '<!-- STACK_EXPR_START $1 -->')\n .replace(/⟦STACK_EXPR_END⟧/g, '<!-- STACK_EXPR_END -->');\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"jsx-editable-transpiler.js","names":[],"sources":["../../../src/utils/jsx-editable-transpiler.tsx"],"sourcesContent":["import generate from '@babel/generator';\nimport * as parser from '@babel/parser';\nimport traverse, { NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { createHash } from 'crypto';\n\n/**\n * Metadata for an editable text region in JSX source code.\n * This information is used by the AI to accurately locate and update text.\n */\nexport type EditableMetadata = {\n /** Unique identifier for this editable region */\n id: string,\n\n /** Exact source code location */\n loc: {\n start: number,\n end: number,\n line: number,\n column: number,\n },\n\n /** The original text content */\n originalText: string,\n\n /** Hash of original text for quick mismatch detection */\n textHash: string,\n\n /** JSX ancestry path from component root to this text node */\n jsxPath: string[],\n\n /** The immediate parent JSX element */\n parentElement: {\n tagName: string,\n props: Record<string, string>,\n },\n\n /** Surrounding source context for disambiguation */\n sourceContext: {\n before: string,\n after: string,\n },\n\n /** Index among sibling text nodes in the same parent */\n siblingIndex: number,\n\n /** Total count of this exact text in the source */\n occurrenceCount: number,\n\n /** Which occurrence this is (1-indexed) */\n occurrenceIndex: number,\n\n /** Which file this text is in */\n sourceFile: \"template\" | \"theme\",\n};\n\n/**\n * Result of transpiling JSX source to include editable markers.\n */\nexport type TranspileResult = {\n /** The transformed source code with __Editable wrappers */\n code: string,\n /** Map of editable region IDs to their metadata */\n editableRegions: Record<string, EditableMetadata>,\n};\n\n/**\n * The __Editable component definition that gets injected into transformed source.\n * It renders sentinel tokens around text that will be converted to HTML comments.\n */\nconst EDITABLE_COMPONENT_CODE = `\nfunction __Editable({ __id, children }) {\n return (\n <>\n {\\`⟦STACK_EDITABLE_START:\\${__id}⟧\\`}\n {children}\n {\\`⟦STACK_EDITABLE_END:\\${__id}⟧\\`}\n </>\n );\n}\nfunction __ExpressionTooltip({ __expr, children }) {\n // Only render markers if children is a primitive (string/number), not a React element\n if (typeof children === 'object' && children !== null) {\n return children;\n }\n return (\n <>\n {\\`⟦STACK_EXPR_START:\\${__expr}⟧\\`}\n {children}\n {\\`⟦STACK_EXPR_END⟧\\`}\n </>\n );\n}\n`;\n\n/**\n * Transpiles TSX source code to wrap all static JSX text nodes with __Editable components.\n *\n * For example:\n * ```tsx\n * <Text>Hi, {name}! Welcome.</Text>\n * ```\n * becomes:\n * ```tsx\n * <Text>\n * <__Editable __id=\"e1\">Hi, </__Editable>\n * {name}\n * <__Editable __id=\"e2\">! Welcome.</__Editable>\n * </Text>\n * ```\n */\nexport function transpileJsxForEditing(\n source: string,\n options: {\n sourceFile: \"template\" | \"theme\",\n }\n): TranspileResult {\n const editableRegions: Record<string, EditableMetadata> = {};\n let idCounter = 0;\n\n // Count occurrences of each text for the occurrenceCount/occurrenceIndex fields\n const textOccurrences = new Map<string, number>();\n\n // First pass: count all text occurrences\n const astForCounting = parser.parse(source, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n });\n\n traverse(astForCounting, {\n JSXText(path) {\n const text = path.node.value;\n // Skip whitespace-only text nodes\n if (text.trim() === '') return;\n textOccurrences.set(text, (textOccurrences.get(text) ?? 0) + 1);\n },\n });\n\n // Track current occurrence index for each text\n const textCurrentIndex = new Map<string, number>();\n\n // Parse the source again for transformation\n const ast = parser.parse(source, {\n sourceType: 'module',\n plugins: ['jsx', 'typescript'],\n });\n\n // Helper to get JSX ancestry path\n function getJsxPath(path: NodePath<t.JSXText>): string[] {\n const jsxPath: string[] = [];\n let current: NodePath | null = path.parentPath;\n\n while (current) {\n if (t.isJSXElement(current.node)) {\n const openingElement = current.node.openingElement;\n if (t.isJSXIdentifier(openingElement.name)) {\n jsxPath.unshift(openingElement.name.name);\n } else if (t.isJSXMemberExpression(openingElement.name)) {\n jsxPath.unshift(generate(openingElement.name).code);\n }\n } else if (t.isFunctionDeclaration(current.node) && current.node.id) {\n jsxPath.unshift(current.node.id.name);\n break;\n } else if (t.isVariableDeclarator(current.node) && t.isIdentifier(current.node.id)) {\n jsxPath.unshift(current.node.id.name);\n break;\n }\n current = current.parentPath;\n }\n\n return jsxPath;\n }\n\n // Helper to get parent element info\n function getParentElement(path: NodePath<t.JSXText>): { tagName: string, props: Record<string, string> } {\n let current: NodePath | null = path.parentPath;\n\n while (current) {\n if (t.isJSXElement(current.node)) {\n const openingElement = current.node.openingElement;\n let tagName = '';\n\n if (t.isJSXIdentifier(openingElement.name)) {\n tagName = openingElement.name.name;\n } else if (t.isJSXMemberExpression(openingElement.name)) {\n tagName = generate(openingElement.name).code;\n }\n\n const props: Record<string, string> = {};\n for (const attr of openingElement.attributes) {\n if (t.isJSXAttribute(attr) && t.isJSXIdentifier(attr.name)) {\n const propName = attr.name.name;\n if (t.isStringLiteral(attr.value)) {\n props[propName] = attr.value.value;\n } else if (t.isJSXExpressionContainer(attr.value) && !t.isJSXEmptyExpression(attr.value.expression)) {\n // For expressions, just note that it's dynamic\n props[propName] = `{${generate(attr.value.expression).code}}`;\n }\n }\n }\n\n return { tagName, props };\n }\n current = current.parentPath;\n }\n\n return { tagName: 'unknown', props: {} };\n }\n\n // Helper to get sibling index among text nodes\n function getSiblingIndex(path: NodePath<t.JSXText>): number {\n const parent = path.parentPath;\n if (!t.isJSXElement(parent.node) && !t.isJSXFragment(parent.node)) {\n return 0;\n }\n\n const children = parent.node.children;\n let textIndex = 0;\n\n for (const child of children) {\n if (child === path.node) {\n return textIndex;\n }\n if (t.isJSXText(child) && child.value.trim() !== '') {\n textIndex++;\n }\n }\n\n return textIndex;\n }\n\n // Helper to get source context (lines before/after)\n function getSourceContext(loc: { start: number, end: number }): { before: string, after: string } {\n const lines = source.split('\\n');\n let currentPos = 0;\n let startLine = 0;\n\n // Find line number for start position\n for (let i = 0; i < lines.length; i++) {\n if (currentPos + lines[i].length >= loc.start) {\n startLine = i;\n break;\n }\n currentPos += lines[i].length + 1; // +1 for newline\n }\n\n const beforeLines = lines.slice(Math.max(0, startLine - 3), startLine).join('\\n');\n const afterLines = lines.slice(startLine + 1, startLine + 4).join('\\n');\n\n return { before: beforeLines, after: afterLines };\n }\n\n // Transform JSXText nodes\n traverse(ast, {\n JSXText(path) {\n const decodedText = path.node.value;\n\n // Skip whitespace-only text nodes\n if (decodedText.trim() === '') return;\n\n // Skip if node doesn't have location info\n // Use explicit null checks since start/end can validly be 0\n if (!path.node.loc || path.node.start == null || path.node.end == null) return;\n\n // IMPORTANT: Use the RAW source text, not the decoded path.node.value\n // Babel's parser decodes HTML entities (e.g., &lt; -> <) in JSX text,\n // but we need to preserve the original source to avoid XSS vulnerabilities\n const rawText = source.slice(path.node.start, path.node.end);\n\n // Use source file prefix to ensure unique IDs across template and theme\n const prefix = options.sourceFile === 'template' ? 't' : 'h'; // t for template, h for theme (header)\n const id = `${prefix}${idCounter++}`;\n const occurrenceCount = textOccurrences.get(decodedText) ?? 1;\n const currentIndex = (textCurrentIndex.get(decodedText) ?? 0) + 1;\n textCurrentIndex.set(decodedText, currentIndex);\n\n const metadata: EditableMetadata = {\n id,\n loc: {\n start: path.node.start,\n end: path.node.end,\n line: path.node.loc.start.line,\n column: path.node.loc.start.column,\n },\n originalText: rawText,\n textHash: createHash('sha256').update(rawText).digest('hex').slice(0, 16),\n jsxPath: getJsxPath(path),\n parentElement: getParentElement(path),\n sourceContext: getSourceContext({ start: path.node.start, end: path.node.end }),\n siblingIndex: getSiblingIndex(path),\n occurrenceCount,\n occurrenceIndex: currentIndex,\n sourceFile: options.sourceFile,\n };\n\n editableRegions[id] = metadata;\n\n // Create the __Editable wrapper\n // <__Editable __id=\"...\">text</__Editable>\n // Use rawText to preserve HTML entities from the original source\n const editableElement = t.jsxElement(\n t.jsxOpeningElement(\n t.jsxIdentifier('__Editable'),\n [\n t.jsxAttribute(\n t.jsxIdentifier('__id'),\n t.stringLiteral(id)\n ),\n ],\n false\n ),\n t.jsxClosingElement(t.jsxIdentifier('__Editable')),\n [t.jsxText(rawText)],\n false\n );\n\n path.replaceWith(editableElement);\n },\n JSXExpressionContainer(path) {\n const expression = path.node.expression;\n\n // Skip empty expressions\n if (t.isJSXEmptyExpression(expression)) return;\n\n // Skip if parent is not a JSXElement (e.g., it's an attribute value)\n if (!t.isJSXElement(path.parent) && !t.isJSXFragment(path.parent)) return;\n\n // Skip JSX elements - we only want to show tooltips for text-rendering expressions\n if (t.isJSXElement(expression) || t.isJSXFragment(expression)) return;\n\n // Skip if no location info\n if (path.node.start == null || path.node.end == null) return;\n\n // Get the exact source code of the expression (including the ${} or just the expression)\n const exprSource = source.slice(path.node.start, path.node.end);\n\n // Base64 encode the expression to safely pass it through the marker\n const encodedExpr = Buffer.from(exprSource).toString('base64');\n\n // Create wrapper: <__ExpressionTooltip __expr=\"...\">{expression}</__ExpressionTooltip>\n const tooltipElement = t.jsxElement(\n t.jsxOpeningElement(\n t.jsxIdentifier('__ExpressionTooltip'),\n [\n t.jsxAttribute(\n t.jsxIdentifier('__expr'),\n t.stringLiteral(encodedExpr)\n ),\n ],\n false\n ),\n t.jsxClosingElement(t.jsxIdentifier('__ExpressionTooltip')),\n [t.jsxExpressionContainer(expression)],\n false\n );\n\n path.replaceWith(t.jsxExpressionContainer(tooltipElement));\n },\n });\n\n // Generate the transformed code\n const output = generate(ast, {\n retainLines: true,\n compact: false,\n });\n\n // Inject the __Editable component at the top of the file (after imports)\n let code = output.code;\n\n // Find the position after all imports\n const importEndMatch = code.match(/^(import\\s+[\\s\\S]*?from\\s+['\"][^'\"]+['\"];?\\s*)+/m);\n if (importEndMatch) {\n const insertPos = (importEndMatch.index ?? 0) + importEndMatch[0].length;\n code = code.slice(0, insertPos) + '\\n' + EDITABLE_COMPONENT_CODE + '\\n' + code.slice(insertPos);\n } else {\n // No imports found, add at the beginning\n code = EDITABLE_COMPONENT_CODE + '\\n' + code;\n }\n\n return {\n code,\n editableRegions,\n };\n}\n\n/**\n * Post-processes rendered HTML to convert sentinel tokens to HTML comments.\n *\n * Converts:\n * - `⟦STACK_EDITABLE_START:<id>⟧` → `<!-- STACK_EDITABLE_START <id> -->`\n * - `⟦STACK_EDITABLE_END:<id>⟧` → `<!-- STACK_EDITABLE_END <id> -->`\n * - `⟦STACK_EXPR_START:<base64-encoded-expr>⟧` → `<!-- STACK_EXPR_START <base64> -->`\n * - `⟦STACK_EXPR_END⟧` → `<!-- STACK_EXPR_END -->`\n */\nexport function convertSentinelTokensToComments(html: string): string {\n return html\n .replace(/⟦STACK_EDITABLE_START:([^⟧]+)⟧/g, '<!-- STACK_EDITABLE_START $1 -->')\n .replace(/⟦STACK_EDITABLE_END:([^⟧]+)⟧/g, '<!-- STACK_EDITABLE_END $1 -->')\n .replace(/⟦STACK_EXPR_START:([^⟧]+)⟧/g, '<!-- STACK_EXPR_START $1 -->')\n .replace(/⟦STACK_EXPR_END⟧/g, '<!-- STACK_EXPR_END -->');\n}\n"],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import { convertSentinelTokensToComments, transpileJsxForEditing } from "./jsx-editable-transpiler.js";
3
-
4
3
  //#region src/utils/jsx-editable-transpiler.test.ts
5
4
  describe("transpileJsxForEditing", () => {
6
5
  it("should wrap simple JSX text nodes with __Editable", () => {
@@ -116,7 +115,7 @@ describe("convertSentinelTokensToComments", () => {
116
115
  expect(convertSentinelTokensToComments(html)).toBe(html);
117
116
  });
118
117
  });
119
-
120
118
  //#endregion
121
- export { };
119
+ export {};
120
+
122
121
  //# sourceMappingURL=jsx-editable-transpiler.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jsx-editable-transpiler.test.js","names":[],"sources":["../../../src/utils/jsx-editable-transpiler.test.ts"],"sourcesContent":["import { describe, it, expect } from 'vitest';\nimport { transpileJsxForEditing, convertSentinelTokensToComments } from './jsx-editable-transpiler';\n\ndescribe('transpileJsxForEditing', () => {\n it('should wrap simple JSX text nodes with __Editable', () => {\n const source = `\nexport function EmailTemplate() {\n return <div>Hello World!</div>;\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n expect(result.code).toContain('__Editable');\n expect(result.code).toContain('Hello World!');\n expect(Object.keys(result.editableRegions).length).toBeGreaterThan(0);\n\n // Check that the editable region has the expected metadata\n const region = Object.values(result.editableRegions)[0];\n expect(region.originalText).toBe('Hello World!');\n expect(region.sourceFile).toBe('template');\n expect(region.parentElement.tagName).toBe('div');\n });\n\n it('should handle multiple text nodes in the same element', () => {\n const source = `\nexport function EmailTemplate({ name }) {\n return <div>Hello, {name}! Welcome to our platform.</div>;\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n // Should have 2 editable regions (text before and after the expression)\n const regions = Object.values(result.editableRegions);\n expect(regions.length).toBe(2);\n\n const texts = regions.map(r => r.originalText);\n expect(texts).toContain('Hello, ');\n expect(texts).toContain('! Welcome to our platform.');\n });\n\n it('should skip whitespace-only text nodes', () => {\n const source = `\nexport function EmailTemplate() {\n return (\n <div>\n <span>Text</span>\n </div>\n );\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n // Should only have 1 editable region (the \"Text\" in span)\n const regions = Object.values(result.editableRegions);\n expect(regions.length).toBe(1);\n expect(regions[0].originalText).toBe('Text');\n });\n\n it('should track occurrence count for duplicate text', () => {\n const source = `\nexport function EmailTemplate() {\n return (\n <div>\n <p>Click here</p>\n <p>Click here</p>\n </div>\n );\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n const regions = Object.values(result.editableRegions);\n expect(regions.length).toBe(2);\n\n // Both should have occurrenceCount of 2\n expect(regions[0].occurrenceCount).toBe(2);\n expect(regions[1].occurrenceCount).toBe(2);\n\n // They should have different occurrence indices\n expect(regions[0].occurrenceIndex).toBe(1);\n expect(regions[1].occurrenceIndex).toBe(2);\n });\n\n it('should capture JSX path correctly', () => {\n const source = `\nexport function EmailTemplate() {\n return (\n <Container>\n <Section>\n <Text>Hello</Text>\n </Section>\n </Container>\n );\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n const region = Object.values(result.editableRegions)[0];\n expect(region.jsxPath).toContain('EmailTemplate');\n expect(region.jsxPath).toContain('Container');\n expect(region.jsxPath).toContain('Section');\n expect(region.jsxPath).toContain('Text');\n });\n\n it('should capture parent element props', () => {\n const source = `\nexport function EmailTemplate() {\n return <Text className=\"heading\" style={{ color: 'red' }}>Title</Text>;\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n const region = Object.values(result.editableRegions)[0];\n expect(region.parentElement.tagName).toBe('Text');\n expect(region.parentElement.props.className).toBe('heading');\n });\n\n it('should inject __Editable component definition', () => {\n const source = `\nexport function EmailTemplate() {\n return <div>Test</div>;\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n expect(result.code).toContain('function __Editable');\n expect(result.code).toContain('STACK_EDITABLE_START');\n expect(result.code).toContain('STACK_EDITABLE_END');\n });\n});\n\ndescribe('convertSentinelTokensToComments', () => {\n it('should convert start tokens to HTML comments', () => {\n const html = '<div>⟦STACK_EDITABLE_START:e0⟧Hello⟦STACK_EDITABLE_END:e0⟧</div>';\n const result = convertSentinelTokensToComments(html);\n\n expect(result).toBe('<div><!-- STACK_EDITABLE_START e0 -->Hello<!-- STACK_EDITABLE_END e0 --></div>');\n });\n\n it('should handle multiple editable regions', () => {\n const html = '<div>⟦STACK_EDITABLE_START:e0⟧Hello⟦STACK_EDITABLE_END:e0⟧ ⟦STACK_EDITABLE_START:e1⟧World⟦STACK_EDITABLE_END:e1⟧</div>';\n const result = convertSentinelTokensToComments(html);\n\n expect(result).toContain('<!-- STACK_EDITABLE_START e0 -->');\n expect(result).toContain('<!-- STACK_EDITABLE_END e0 -->');\n expect(result).toContain('<!-- STACK_EDITABLE_START e1 -->');\n expect(result).toContain('<!-- STACK_EDITABLE_END e1 -->');\n });\n\n it('should leave regular HTML unchanged', () => {\n const html = '<div><p>Hello World</p></div>';\n const result = convertSentinelTokensToComments(html);\n\n expect(result).toBe(html);\n });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"jsx-editable-transpiler.test.js","names":[],"sources":["../../../src/utils/jsx-editable-transpiler.test.ts"],"sourcesContent":["import { describe, it, expect } from 'vitest';\nimport { transpileJsxForEditing, convertSentinelTokensToComments } from './jsx-editable-transpiler';\n\ndescribe('transpileJsxForEditing', () => {\n it('should wrap simple JSX text nodes with __Editable', () => {\n const source = `\nexport function EmailTemplate() {\n return <div>Hello World!</div>;\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n expect(result.code).toContain('__Editable');\n expect(result.code).toContain('Hello World!');\n expect(Object.keys(result.editableRegions).length).toBeGreaterThan(0);\n\n // Check that the editable region has the expected metadata\n const region = Object.values(result.editableRegions)[0];\n expect(region.originalText).toBe('Hello World!');\n expect(region.sourceFile).toBe('template');\n expect(region.parentElement.tagName).toBe('div');\n });\n\n it('should handle multiple text nodes in the same element', () => {\n const source = `\nexport function EmailTemplate({ name }) {\n return <div>Hello, {name}! Welcome to our platform.</div>;\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n // Should have 2 editable regions (text before and after the expression)\n const regions = Object.values(result.editableRegions);\n expect(regions.length).toBe(2);\n\n const texts = regions.map(r => r.originalText);\n expect(texts).toContain('Hello, ');\n expect(texts).toContain('! Welcome to our platform.');\n });\n\n it('should skip whitespace-only text nodes', () => {\n const source = `\nexport function EmailTemplate() {\n return (\n <div>\n <span>Text</span>\n </div>\n );\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n // Should only have 1 editable region (the \"Text\" in span)\n const regions = Object.values(result.editableRegions);\n expect(regions.length).toBe(1);\n expect(regions[0].originalText).toBe('Text');\n });\n\n it('should track occurrence count for duplicate text', () => {\n const source = `\nexport function EmailTemplate() {\n return (\n <div>\n <p>Click here</p>\n <p>Click here</p>\n </div>\n );\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n const regions = Object.values(result.editableRegions);\n expect(regions.length).toBe(2);\n\n // Both should have occurrenceCount of 2\n expect(regions[0].occurrenceCount).toBe(2);\n expect(regions[1].occurrenceCount).toBe(2);\n\n // They should have different occurrence indices\n expect(regions[0].occurrenceIndex).toBe(1);\n expect(regions[1].occurrenceIndex).toBe(2);\n });\n\n it('should capture JSX path correctly', () => {\n const source = `\nexport function EmailTemplate() {\n return (\n <Container>\n <Section>\n <Text>Hello</Text>\n </Section>\n </Container>\n );\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n const region = Object.values(result.editableRegions)[0];\n expect(region.jsxPath).toContain('EmailTemplate');\n expect(region.jsxPath).toContain('Container');\n expect(region.jsxPath).toContain('Section');\n expect(region.jsxPath).toContain('Text');\n });\n\n it('should capture parent element props', () => {\n const source = `\nexport function EmailTemplate() {\n return <Text className=\"heading\" style={{ color: 'red' }}>Title</Text>;\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n const region = Object.values(result.editableRegions)[0];\n expect(region.parentElement.tagName).toBe('Text');\n expect(region.parentElement.props.className).toBe('heading');\n });\n\n it('should inject __Editable component definition', () => {\n const source = `\nexport function EmailTemplate() {\n return <div>Test</div>;\n}\n`;\n const result = transpileJsxForEditing(source, { sourceFile: 'template' });\n\n expect(result.code).toContain('function __Editable');\n expect(result.code).toContain('STACK_EDITABLE_START');\n expect(result.code).toContain('STACK_EDITABLE_END');\n });\n});\n\ndescribe('convertSentinelTokensToComments', () => {\n it('should convert start tokens to HTML comments', () => {\n const html = '<div>⟦STACK_EDITABLE_START:e0⟧Hello⟦STACK_EDITABLE_END:e0⟧</div>';\n const result = convertSentinelTokensToComments(html);\n\n expect(result).toBe('<div><!-- STACK_EDITABLE_START e0 -->Hello<!-- STACK_EDITABLE_END e0 --></div>');\n });\n\n it('should handle multiple editable regions', () => {\n const html = '<div>⟦STACK_EDITABLE_START:e0⟧Hello⟦STACK_EDITABLE_END:e0⟧ ⟦STACK_EDITABLE_START:e1⟧World⟦STACK_EDITABLE_END:e1⟧</div>';\n const result = convertSentinelTokensToComments(html);\n\n expect(result).toContain('<!-- STACK_EDITABLE_START e0 -->');\n expect(result).toContain('<!-- STACK_EDITABLE_END e0 -->');\n expect(result).toContain('<!-- STACK_EDITABLE_START e1 -->');\n expect(result).toContain('<!-- STACK_EDITABLE_END e1 -->');\n });\n\n it('should leave regular HTML unchanged', () => {\n const html = '<div><p>Hello World</p></div>';\n const result = convertSentinelTokensToComments(html);\n\n expect(result).toBe(html);\n });\n});\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.d.ts","names":[],"sources":["../../../src/utils/jwt.tsx"],"mappings":";;;iBAsBsB,UAAA,CAAW,OAAA;EAC/B,GAAA;AAAA,IACD,OAAA;;;;;;;;;;;;;;;;;;;aAF+B,IAAA,CAAA,UAAA;EAAA;AAAA;;;;;;;;;;iBAeV,OAAA,CAAQ,OAAA;EAC5B,MAAA;EACA,QAAA;EACA,OAAA;EACA,cAAA;AAAA,IACD,OAAA;AAAA,iBAaqB,SAAA,CAAU,OAAA;EAC9B,cAAA;EACA,GAAA;AAAA,IACD,OAAA,CAAA,IAAA,CAAA,UAAA;AAAA,KAYW,UAAA;EACV,GAAA;EACA,GAAA;EACA,GAAA;EACA,GAAA;EACA,CAAA;EACA,CAAA;EACA,CAAA;AAAA;;;;AAPF;iBAgCsB,cAAA,CAAe,OAAA;EACnC,QAAA;AAAA,IACE,OAAA,CAAQ,UAAA;AAAA,KA0BA,SAAA;EACV,GAAA;EACA,GAAA;EACA,GAAA;EACA,GAAA;EACA,CAAA;EACA,CAAA;AAAA;AAAA,iBAEoB,eAAA,CAAgB,WAAA,EAAa,UAAA,KAAe,OAAA;EAAU,IAAA,EAAM,SAAA;AAAA;AAAA,iBAsBlE,SAAA,CAAU,OAAA;EACxB,MAAA;AAAA"}
1
+ {"version":3,"file":"jwt.d.ts","names":[],"sources":["../../../src/utils/jwt.tsx"],"mappings":";;;iBAsBsB,UAAA,CAAW,OAAA;EAC/B,GAAA;AAAA,IACD,OAAA;;;;;;;;;;;;;;;;;;;aAF+B,IAAA,CAAA,UAAA;EAAA;AAAA;;;;;;;;;;iBAeV,OAAA,CAAQ,OAAA;EAC5B,MAAA;EACA,QAAA;EACA,OAAA;EACA,cAAA;AAAA,IACD,OAAA;AAAA,iBAaqB,SAAA,CAAU,OAAA;EAC9B,cAAA;EACA,GAAA;AAAA,IACD,OAAA,CAAA,IAAA,CAAA,UAAA;AAAA,KAYW,UAAA;EACV,GAAA;EACA,GAAA;EACA,GAAA;EACA,GAAA;EACA,CAAA;EACA,CAAA;EACA,CAAA;AAAA;;;AAnBD;AAYD;iBAgCsB,cAAA,CAAe,OAAA;EACnC,QAAA;AAAA,IACE,OAAO,CAAC,UAAA;AAAA,KA0BA,SAAA;EACV,GAAA;EACA,GAAA;EACA,GAAA;EACA,GAAA;EACA,CAAA;EACA,CAAA;AAAA;AAAA,iBAEoB,eAAA,CAAgB,WAAA,EAAa,UAAA,KAAe,OAAA;EAAU,IAAA,EAAM,SAAA;AAAA;AAAA,iBAsBlE,SAAA,CAAU,OAEzB;EADC,MAAA;AAAA"}
@@ -9,7 +9,6 @@ import { nicify } from "./strings.js";
9
9
  import crypto from "crypto";
10
10
  import elliptic from "elliptic";
11
11
  import { JOSEError } from "jose/errors";
12
-
13
12
  //#region src/utils/jwt.tsx
14
13
  function getHexclaveServerSecret() {
15
14
  const STACK_SERVER_SECRET = getEnvVariable("STACK_SERVER_SECRET");
@@ -96,7 +95,7 @@ function oldGetPerAudienceSecret(options) {
96
95
  function oldGetKid(options) {
97
96
  return jose.base64url.encode(crypto.createHash("sha256").update(JSON.stringify([options.secret, "kid"])).digest()).slice(0, 12);
98
97
  }
99
-
100
98
  //#endregion
101
99
  export { getJwtInfo, getPrivateJwks, getPublicJwkSet, oldGetKid, signJWT, verifyJWT };
100
+
102
101
  //# sourceMappingURL=jwt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.js","names":[],"sources":["../../../src/utils/jwt.tsx"],"sourcesContent":["import crypto from \"crypto\";\nimport elliptic from \"elliptic\";\nimport * as jose from \"jose\";\nimport { JOSEError } from \"jose/errors\";\nimport { encodeBase64Url } from \"./bytes\";\nimport { getEnvVariable } from \"./env\";\nimport { HexclaveAssertionError, errorToNiceString } from \"./errors\";\nimport { globalVar } from \"./globals\";\nimport { pick } from \"./objects\";\nimport { Result } from \"./results\";\nimport { nicify } from \"./strings\";\n\nfunction getHexclaveServerSecret() {\n const STACK_SERVER_SECRET = getEnvVariable(\"STACK_SERVER_SECRET\");\n try {\n jose.base64url.decode(STACK_SERVER_SECRET);\n } catch (e) {\n throw new HexclaveAssertionError(\"STACK_SERVER_SECRET is not valid. Please use the generateKeys script to generate a new secret.\", { cause: e });\n }\n return STACK_SERVER_SECRET;\n}\n\nexport async function getJwtInfo(options: {\n jwt: string,\n}) {\n try {\n if (typeof options.jwt !== \"string\") return Result.error({ error: \"JWT input is not a string!\", stringifiedInput: nicify(options.jwt) });\n if (!options.jwt.startsWith(\"ey\")) return Result.error({ error: \"Input is a string, but not a JWT!\", input: options.jwt });\n const decodedJwt = jose.decodeJwt(options.jwt);\n return Result.ok({ payload: decodedJwt });\n } catch (e) {\n return Result.error({\n exception: errorToNiceString(e),\n });\n }\n}\n\nexport async function signJWT(options: {\n issuer: string,\n audience: string,\n payload: any,\n expirationTime?: string,\n}) {\n const privateJwks = await getPrivateJwks({ audience: options.audience });\n const privateKey = await jose.importJWK(privateJwks[0]);\n\n return await new jose.SignJWT(options.payload)\n .setProtectedHeader({ alg: \"ES256\", kid: privateJwks[0].kid })\n .setIssuer(options.issuer)\n .setIssuedAt()\n .setAudience(options.audience)\n .setExpirationTime(options.expirationTime || \"5m\")\n .sign(privateKey);\n}\n\nexport async function verifyJWT(options: {\n allowedIssuers: string[],\n jwt: string,\n}) {\n const decodedJwt = jose.decodeJwt(options.jwt);\n const audience = decodedJwt.aud;\n if (!audience || typeof audience !== \"string\") {\n throw new JOSEError(\"Invalid JWT audience\");\n }\n\n const jwkSet = jose.createLocalJWKSet(await getPublicJwkSet(await getPrivateJwks({ audience })));\n const verified = await jose.jwtVerify(options.jwt, jwkSet, { issuer: options.allowedIssuers });\n return verified.payload;\n}\n\nexport type PrivateJwk = {\n kty: \"EC\",\n alg: \"ES256\",\n crv: \"P-256\",\n kid: string,\n d: string,\n x: string,\n y: string,\n};\nasync function getPrivateJwkFromDerivedSecret(derivedSecret: string, kid: string): Promise<PrivateJwk> {\n const secretHash = await globalVar.crypto.subtle.digest(\"SHA-256\", jose.base64url.decode(derivedSecret));\n const priv = new Uint8Array(secretHash);\n\n const ec = new elliptic.ec('p256');\n const key = ec.keyFromPrivate(priv);\n const publicKey = key.getPublic();\n\n return {\n kty: 'EC',\n crv: 'P-256',\n alg: 'ES256',\n kid: kid,\n d: encodeBase64Url(priv),\n x: encodeBase64Url(publicKey.getX().toBuffer()),\n y: encodeBase64Url(publicKey.getY().toBuffer()),\n };\n}\n\n/**\n * Returns a list of valid private JWKs for the given audience, with the first one taking precedence when signing new\n * JWTs.\n */\nexport async function getPrivateJwks(options: {\n audience: string,\n}): Promise<PrivateJwk[]> {\n const getHashOfJwkInfo = (type: string) => jose.base64url.encode(\n crypto\n .createHash('sha256')\n .update(JSON.stringify([type, getHexclaveServerSecret(), {\n audience: options.audience,\n }]))\n .digest()\n );\n // NOTE (Hexclave rebrand): do NOT rename these \"stack-*\" literals. They are hashed into the\n // per-audience JWT signing secret and key id (kid); renaming them would rotate every project's\n // JWKS and invalidate all already-issued access tokens. Internal constants, never user-visible.\n const perAudienceSecret = getHashOfJwkInfo(\"stack-jwk-audience-secret\");\n const perAudienceKid = getHashOfJwkInfo(\"stack-jwk-kid\").slice(0, 12);\n\n const oldPerAudienceSecret = oldGetPerAudienceSecret({ audience: options.audience });\n const oldPerAudienceKid = oldGetKid({ secret: oldPerAudienceSecret });\n\n return [\n // TODO next-release: make this not take precedence; then, in the release after that, remove it entirely\n await getPrivateJwkFromDerivedSecret(oldPerAudienceSecret, oldPerAudienceKid),\n\n await getPrivateJwkFromDerivedSecret(perAudienceSecret, perAudienceKid),\n ];\n}\n\nexport type PublicJwk = {\n kty: \"EC\",\n alg: \"ES256\",\n crv: \"P-256\",\n kid: string,\n x: string,\n y: string,\n};\nexport async function getPublicJwkSet(privateJwks: PrivateJwk[]): Promise<{ keys: PublicJwk[] }> {\n return {\n keys: privateJwks.map(jwk => pick(jwk, [\"kty\", \"alg\", \"crv\", \"x\", \"y\", \"kid\"])),\n };\n}\n\nfunction oldGetPerAudienceSecret(options: {\n audience: string,\n}) {\n if (options.audience === \"kid\") {\n throw new HexclaveAssertionError(\"You cannot use the 'kid' audience for a per-audience secret, see comment below in jwt.tsx\");\n }\n return jose.base64url.encode(\n crypto\n .createHash('sha256')\n // TODO we should prefix a string like \"stack-audience-secret\" before we hash so you can't use `getKid(...)` to get the secret for eg. the \"kid\" audience if the same secret value is used\n // Sadly doing this modification is a bit annoying as we need to leave the old keys to be valid for a little longer\n .update(JSON.stringify([getHexclaveServerSecret(), options.audience]))\n .digest()\n );\n};\n\nexport function oldGetKid(options: {\n secret: string,\n}) {\n return jose.base64url.encode(\n crypto\n .createHash('sha256')\n .update(JSON.stringify([options.secret, \"kid\"])) // TODO see above in getPerAudienceSecret\n .digest()\n ).slice(0, 12);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"jwt.js","names":[],"sources":["../../../src/utils/jwt.tsx"],"sourcesContent":["import crypto from \"crypto\";\nimport elliptic from \"elliptic\";\nimport * as jose from \"jose\";\nimport { JOSEError } from \"jose/errors\";\nimport { encodeBase64Url } from \"./bytes\";\nimport { getEnvVariable } from \"./env\";\nimport { HexclaveAssertionError, errorToNiceString } from \"./errors\";\nimport { globalVar } from \"./globals\";\nimport { pick } from \"./objects\";\nimport { Result } from \"./results\";\nimport { nicify } from \"./strings\";\n\nfunction getHexclaveServerSecret() {\n const STACK_SERVER_SECRET = getEnvVariable(\"STACK_SERVER_SECRET\");\n try {\n jose.base64url.decode(STACK_SERVER_SECRET);\n } catch (e) {\n throw new HexclaveAssertionError(\"STACK_SERVER_SECRET is not valid. Please use the generateKeys script to generate a new secret.\", { cause: e });\n }\n return STACK_SERVER_SECRET;\n}\n\nexport async function getJwtInfo(options: {\n jwt: string,\n}) {\n try {\n if (typeof options.jwt !== \"string\") return Result.error({ error: \"JWT input is not a string!\", stringifiedInput: nicify(options.jwt) });\n if (!options.jwt.startsWith(\"ey\")) return Result.error({ error: \"Input is a string, but not a JWT!\", input: options.jwt });\n const decodedJwt = jose.decodeJwt(options.jwt);\n return Result.ok({ payload: decodedJwt });\n } catch (e) {\n return Result.error({\n exception: errorToNiceString(e),\n });\n }\n}\n\nexport async function signJWT(options: {\n issuer: string,\n audience: string,\n payload: any,\n expirationTime?: string,\n}) {\n const privateJwks = await getPrivateJwks({ audience: options.audience });\n const privateKey = await jose.importJWK(privateJwks[0]);\n\n return await new jose.SignJWT(options.payload)\n .setProtectedHeader({ alg: \"ES256\", kid: privateJwks[0].kid })\n .setIssuer(options.issuer)\n .setIssuedAt()\n .setAudience(options.audience)\n .setExpirationTime(options.expirationTime || \"5m\")\n .sign(privateKey);\n}\n\nexport async function verifyJWT(options: {\n allowedIssuers: string[],\n jwt: string,\n}) {\n const decodedJwt = jose.decodeJwt(options.jwt);\n const audience = decodedJwt.aud;\n if (!audience || typeof audience !== \"string\") {\n throw new JOSEError(\"Invalid JWT audience\");\n }\n\n const jwkSet = jose.createLocalJWKSet(await getPublicJwkSet(await getPrivateJwks({ audience })));\n const verified = await jose.jwtVerify(options.jwt, jwkSet, { issuer: options.allowedIssuers });\n return verified.payload;\n}\n\nexport type PrivateJwk = {\n kty: \"EC\",\n alg: \"ES256\",\n crv: \"P-256\",\n kid: string,\n d: string,\n x: string,\n y: string,\n};\nasync function getPrivateJwkFromDerivedSecret(derivedSecret: string, kid: string): Promise<PrivateJwk> {\n const secretHash = await globalVar.crypto.subtle.digest(\"SHA-256\", jose.base64url.decode(derivedSecret));\n const priv = new Uint8Array(secretHash);\n\n const ec = new elliptic.ec('p256');\n const key = ec.keyFromPrivate(priv);\n const publicKey = key.getPublic();\n\n return {\n kty: 'EC',\n crv: 'P-256',\n alg: 'ES256',\n kid: kid,\n d: encodeBase64Url(priv),\n x: encodeBase64Url(publicKey.getX().toBuffer()),\n y: encodeBase64Url(publicKey.getY().toBuffer()),\n };\n}\n\n/**\n * Returns a list of valid private JWKs for the given audience, with the first one taking precedence when signing new\n * JWTs.\n */\nexport async function getPrivateJwks(options: {\n audience: string,\n}): Promise<PrivateJwk[]> {\n const getHashOfJwkInfo = (type: string) => jose.base64url.encode(\n crypto\n .createHash('sha256')\n .update(JSON.stringify([type, getHexclaveServerSecret(), {\n audience: options.audience,\n }]))\n .digest()\n );\n // NOTE (Hexclave rebrand): do NOT rename these \"stack-*\" literals. They are hashed into the\n // per-audience JWT signing secret and key id (kid); renaming them would rotate every project's\n // JWKS and invalidate all already-issued access tokens. Internal constants, never user-visible.\n const perAudienceSecret = getHashOfJwkInfo(\"stack-jwk-audience-secret\");\n const perAudienceKid = getHashOfJwkInfo(\"stack-jwk-kid\").slice(0, 12);\n\n const oldPerAudienceSecret = oldGetPerAudienceSecret({ audience: options.audience });\n const oldPerAudienceKid = oldGetKid({ secret: oldPerAudienceSecret });\n\n return [\n // TODO next-release: make this not take precedence; then, in the release after that, remove it entirely\n await getPrivateJwkFromDerivedSecret(oldPerAudienceSecret, oldPerAudienceKid),\n\n await getPrivateJwkFromDerivedSecret(perAudienceSecret, perAudienceKid),\n ];\n}\n\nexport type PublicJwk = {\n kty: \"EC\",\n alg: \"ES256\",\n crv: \"P-256\",\n kid: string,\n x: string,\n y: string,\n};\nexport async function getPublicJwkSet(privateJwks: PrivateJwk[]): Promise<{ keys: PublicJwk[] }> {\n return {\n keys: privateJwks.map(jwk => pick(jwk, [\"kty\", \"alg\", \"crv\", \"x\", \"y\", \"kid\"])),\n };\n}\n\nfunction oldGetPerAudienceSecret(options: {\n audience: string,\n}) {\n if (options.audience === \"kid\") {\n throw new HexclaveAssertionError(\"You cannot use the 'kid' audience for a per-audience secret, see comment below in jwt.tsx\");\n }\n return jose.base64url.encode(\n crypto\n .createHash('sha256')\n // TODO we should prefix a string like \"stack-audience-secret\" before we hash so you can't use `getKid(...)` to get the secret for eg. the \"kid\" audience if the same secret value is used\n // Sadly doing this modification is a bit annoying as we need to leave the old keys to be valid for a little longer\n .update(JSON.stringify([getHexclaveServerSecret(), options.audience]))\n .digest()\n );\n};\n\nexport function oldGetKid(options: {\n secret: string,\n}) {\n return jose.base64url.encode(\n crypto\n .createHash('sha256')\n .update(JSON.stringify([options.secret, \"kid\"])) // TODO see above in getPerAudienceSecret\n .digest()\n ).slice(0, 12);\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"locks.d.ts","names":[],"sources":["../../../src/utils/locks.tsx"],"mappings":";KAEK,YAAA,YAAwB,OAAA,CAAQ,CAAA;AAAA,cAExB,aAAA;EAAA,QACH,SAAA;EAAA,QACA,OAAA;EAAA,QACA,YAAA;;EAQF,YAAA,GAAA,CAAgB,QAAA,EAAU,YAAA,CAAa,CAAA,IAAK,OAAA,CAAQ,CAAA;EASpD,aAAA,GAAA,CAAiB,QAAA,EAAU,YAAA,CAAa,CAAA,IAAK,OAAA,CAAQ,CAAA;EAAA,QAS7C,gBAAA;EAAA,QAcA,gBAAA;EAAA,QAcA,iBAAA;EAAA,QAKA,iBAAA;AAAA"}
1
+ {"version":3,"file":"locks.d.ts","names":[],"sources":["../../../src/utils/locks.tsx"],"mappings":";KAEK,YAAA,YAAwB,OAAO,CAAC,CAAA;AAAA,cAExB,aAAA;EAAA,QACH,SAAA;EAAA,QACA,OAAA;EAAA,QACA,YAAA;;EAQF,YAAA,IAAgB,QAAA,EAAU,YAAA,CAAa,CAAA,IAAK,OAAA,CAAQ,CAAA;EASpD,aAAA,IAAiB,QAAA,EAAU,YAAA,CAAa,CAAA,IAAK,OAAA,CAAQ,CAAA;EAAA,QAS7C,gBAAA;EAAA,QAcA,gBAAA;EAAA,QAcA,iBAAA;EAAA,QAKA,iBAAA;AAAA"}
@@ -1,5 +1,4 @@
1
1
  import { Semaphore } from "async-mutex";
2
-
3
2
  //#region src/utils/locks.tsx
4
3
  var ReadWriteLock = class {
5
4
  constructor() {
@@ -48,7 +47,7 @@ var ReadWriteLock = class {
48
47
  this.semaphore.release();
49
48
  }
50
49
  };
51
-
52
50
  //#endregion
53
51
  export { ReadWriteLock };
52
+
54
53
  //# sourceMappingURL=locks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"locks.js","names":[],"sources":["../../../src/utils/locks.tsx"],"sourcesContent":["import { Semaphore } from 'async-mutex';\n\ntype LockCallback<T> = () => Promise<T>;\n\nexport class ReadWriteLock {\n private semaphore: Semaphore;\n private readers: number;\n private readersMutex: Semaphore;\n\n constructor() {\n this.semaphore = new Semaphore(1); // Semaphore with 1 permit\n this.readers = 0; // Track the number of readers\n this.readersMutex = new Semaphore(1); // Protect access to `readers` count\n }\n\n async withReadLock<T>(callback: LockCallback<T>): Promise<T> {\n await this._acquireReadLock();\n try {\n return await callback();\n } finally {\n await this._releaseReadLock();\n }\n }\n\n async withWriteLock<T>(callback: LockCallback<T>): Promise<T> {\n await this._acquireWriteLock();\n try {\n return await callback();\n } finally {\n await this._releaseWriteLock();\n }\n }\n\n private async _acquireReadLock(): Promise<void> {\n // Increment the readers count\n await this.readersMutex.acquire();\n try {\n this.readers += 1;\n // If this is the first reader, block writers\n if (this.readers === 1) {\n await this.semaphore.acquire();\n }\n } finally {\n this.readersMutex.release();\n }\n }\n\n private async _releaseReadLock(): Promise<void> {\n // Decrement the readers count\n await this.readersMutex.acquire();\n try {\n this.readers -= 1;\n // If this was the last reader, release the writer block\n if (this.readers === 0) {\n this.semaphore.release();\n }\n } finally {\n this.readersMutex.release();\n }\n }\n\n private async _acquireWriteLock(): Promise<void> {\n // Writers acquire the main semaphore exclusively\n await this.semaphore.acquire();\n }\n\n private async _releaseWriteLock(): Promise<void> {\n // Writers release the main semaphore\n this.semaphore.release();\n }\n}\n"],"mappings":";;;AAIA,IAAa,gBAAb,MAA2B;CAKzB,cAAc;AACZ,OAAK,YAAY,IAAI,UAAU,EAAE;AACjC,OAAK,UAAU;AACf,OAAK,eAAe,IAAI,UAAU,EAAE;;CAGtC,MAAM,aAAgB,UAAuC;AAC3D,QAAM,KAAK,kBAAkB;AAC7B,MAAI;AACF,UAAO,MAAM,UAAU;YACf;AACR,SAAM,KAAK,kBAAkB;;;CAIjC,MAAM,cAAiB,UAAuC;AAC5D,QAAM,KAAK,mBAAmB;AAC9B,MAAI;AACF,UAAO,MAAM,UAAU;YACf;AACR,SAAM,KAAK,mBAAmB;;;CAIlC,MAAc,mBAAkC;AAE9C,QAAM,KAAK,aAAa,SAAS;AACjC,MAAI;AACF,QAAK,WAAW;AAEhB,OAAI,KAAK,YAAY,EACnB,OAAM,KAAK,UAAU,SAAS;YAExB;AACR,QAAK,aAAa,SAAS;;;CAI/B,MAAc,mBAAkC;AAE9C,QAAM,KAAK,aAAa,SAAS;AACjC,MAAI;AACF,QAAK,WAAW;AAEhB,OAAI,KAAK,YAAY,EACnB,MAAK,UAAU,SAAS;YAElB;AACR,QAAK,aAAa,SAAS;;;CAI/B,MAAc,oBAAmC;AAE/C,QAAM,KAAK,UAAU,SAAS;;CAGhC,MAAc,oBAAmC;AAE/C,OAAK,UAAU,SAAS"}
1
+ {"version":3,"file":"locks.js","names":[],"sources":["../../../src/utils/locks.tsx"],"sourcesContent":["import { Semaphore } from 'async-mutex';\n\ntype LockCallback<T> = () => Promise<T>;\n\nexport class ReadWriteLock {\n private semaphore: Semaphore;\n private readers: number;\n private readersMutex: Semaphore;\n\n constructor() {\n this.semaphore = new Semaphore(1); // Semaphore with 1 permit\n this.readers = 0; // Track the number of readers\n this.readersMutex = new Semaphore(1); // Protect access to `readers` count\n }\n\n async withReadLock<T>(callback: LockCallback<T>): Promise<T> {\n await this._acquireReadLock();\n try {\n return await callback();\n } finally {\n await this._releaseReadLock();\n }\n }\n\n async withWriteLock<T>(callback: LockCallback<T>): Promise<T> {\n await this._acquireWriteLock();\n try {\n return await callback();\n } finally {\n await this._releaseWriteLock();\n }\n }\n\n private async _acquireReadLock(): Promise<void> {\n // Increment the readers count\n await this.readersMutex.acquire();\n try {\n this.readers += 1;\n // If this is the first reader, block writers\n if (this.readers === 1) {\n await this.semaphore.acquire();\n }\n } finally {\n this.readersMutex.release();\n }\n }\n\n private async _releaseReadLock(): Promise<void> {\n // Decrement the readers count\n await this.readersMutex.acquire();\n try {\n this.readers -= 1;\n // If this was the last reader, release the writer block\n if (this.readers === 0) {\n this.semaphore.release();\n }\n } finally {\n this.readersMutex.release();\n }\n }\n\n private async _acquireWriteLock(): Promise<void> {\n // Writers acquire the main semaphore exclusively\n await this.semaphore.acquire();\n }\n\n private async _releaseWriteLock(): Promise<void> {\n // Writers release the main semaphore\n this.semaphore.release();\n }\n}\n"],"mappings":";;AAIA,IAAa,gBAAb,MAA2B;CAKzB,cAAc;EACZ,KAAK,YAAY,IAAI,UAAU,CAAC;EAChC,KAAK,UAAU;EACf,KAAK,eAAe,IAAI,UAAU,CAAC;CACrC;CAEA,MAAM,aAAgB,UAAuC;EAC3D,MAAM,KAAK,iBAAiB;EAC5B,IAAI;GACF,OAAO,MAAM,SAAS;EACxB,UAAU;GACR,MAAM,KAAK,iBAAiB;EAC9B;CACF;CAEA,MAAM,cAAiB,UAAuC;EAC5D,MAAM,KAAK,kBAAkB;EAC7B,IAAI;GACF,OAAO,MAAM,SAAS;EACxB,UAAU;GACR,MAAM,KAAK,kBAAkB;EAC/B;CACF;CAEA,MAAc,mBAAkC;EAE9C,MAAM,KAAK,aAAa,QAAQ;EAChC,IAAI;GACF,KAAK,WAAW;GAEhB,IAAI,KAAK,YAAY,GACnB,MAAM,KAAK,UAAU,QAAQ;EAEjC,UAAU;GACR,KAAK,aAAa,QAAQ;EAC5B;CACF;CAEA,MAAc,mBAAkC;EAE9C,MAAM,KAAK,aAAa,QAAQ;EAChC,IAAI;GACF,KAAK,WAAW;GAEhB,IAAI,KAAK,YAAY,GACnB,KAAK,UAAU,QAAQ;EAE3B,UAAU;GACR,KAAK,aAAa,QAAQ;EAC5B;CACF;CAEA,MAAc,oBAAmC;EAE/C,MAAM,KAAK,UAAU,QAAQ;CAC/B;CAEA,MAAc,oBAAmC;EAE/C,KAAK,UAAU,QAAQ;CACzB;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"maps.d.ts","names":[],"sources":["../../../src/utils/maps.tsx"],"mappings":";cAEa,kBAAA;EAAA,iBACM,IAAA;cAEL,KAAA,EAAO,CAAA;EAQnB,KAAA,CAAA,GAAS,CAAA;AAAA;;;;;;cA4BE,eAAA;EAAA,iBACM,QAAA;EAAA,iBACA,QAAA;cAEL,OAAA,uBAA8B,CAAA,EAAG,CAAA;EAM7C,GAAA,CAAI,GAAA,EAAK,CAAA,GAAI,CAAA;EAIb,GAAA,CAAI,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,CAAA;EAQnB,MAAA,CAAO,GAAA,EAAK,CAAA;EAUZ,GAAA,CAAI,GAAA,EAAK,CAAA;EAAA,CAIP,MAAA,CAAO,QAAA,KAAa,gBAAA,EAAkB,CAAA,EAAG,CAAA;EAAA,CAa1C,MAAA,CAAO,WAAA;AAAA;;;;;;;cAuEG,YAAA;EAAA,iBACM,aAAA;EAAA,iBACA,QAAA;cAEL,OAAA,uBAA8B,CAAA,EAAG,CAAA;EAAA,QAMrC,mBAAA;EAIR,GAAA,CAAI,GAAA,EAAK,CAAA,GAAI,CAAA;EAQb,GAAA,CAAI,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,CAAA;EASnB,MAAA,CAAO,GAAA,EAAK,CAAA;EAQZ,GAAA,CAAI,GAAA,EAAK,CAAA;EAAA,CAQP,MAAA,CAAO,QAAA,KAAa,gBAAA,EAAkB,CAAA,EAAG,CAAA;EAAA,CAK1C,MAAA,CAAO,WAAA;AAAA;;;;;cA6DG,eAAA;EAAA,QACH,MAAA;EAAA,QAEA,cAAA;EAAA,QASA,gBAAA;EAAA,QAaA,WAAA;EAAA,QAqBC,aAAA;EAST,GAAA,CAAI,YAAA,EAAc,CAAA,GAAI,CAAA;EAItB,GAAA,CAAI,YAAA,EAAc,CAAA,EAAG,KAAA,EAAO,CAAA;EAK5B,MAAA,CAAO,YAAA,EAAc,CAAA;EAIrB,GAAA,CAAI,YAAA,EAAc,CAAA;EAIlB,KAAA,CAAA;EAAA,CAIE,MAAA,CAAO,QAAA,KAAa,gBAAA,EAAkB,CAAA,EAAG,CAAA;EAAA,CAI1C,MAAA,CAAO,WAAA;AAAA"}
1
+ {"version":3,"file":"maps.d.ts","names":[],"sources":["../../../src/utils/maps.tsx"],"mappings":";cAEa,kBAAA;EAAA,iBACM,IAAA;cAEL,KAAA,EAAO,CAAA;EAQnB,KAAA,IAAS,CAAC;AAAA;;;;;;cA4BC,eAAA;EAAA,iBACM,QAAA;EAAA,iBACA,QAAA;cAEL,OAAA,uBAA8B,CAAA,EAAG,CAAA;EAM7C,GAAA,CAAI,GAAA,EAAK,CAAA,GAAI,CAAA;EAIb,GAAA,CAAI,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,CAAA;EAQnB,MAAA,CAAO,GAAA,EAAK,CAAA;EAUZ,GAAA,CAAI,GAAA,EAAK,CAAA;EAAA,CAIP,MAAA,CAAO,QAAA,KAAa,gBAAA,EAAkB,CAAA,EAAG,CAAA;EAAA,CAa1C,MAAA,CAAO,WAAA;AAAA;;;;;;;cAuEG,YAAA;EAAA,iBACM,aAAA;EAAA,iBACA,QAAA;cAEL,OAAA,uBAA8B,CAAA,EAAG,CAAA;EAAA,QAMrC,mBAAA;EAIR,GAAA,CAAI,GAAA,EAAK,CAAA,GAAI,CAAA;EAQb,GAAA,CAAI,GAAA,EAAK,CAAA,EAAG,KAAA,EAAO,CAAA;EASnB,MAAA,CAAO,GAAA,EAAK,CAAA;EAQZ,GAAA,CAAI,GAAA,EAAK,CAAA;EAAA,CAQP,MAAA,CAAO,QAAA,KAAa,gBAAA,EAAkB,CAAA,EAAG,CAAA;EAAA,CAK1C,MAAA,CAAO,WAAA;AAAA;;;;;cA6DG,eAAA;EAAA,QACH,MAAA;EAAA,QAEA,cAAA;EAAA,QASA,gBAAA;EAAA,QAaA,WAAA;EAAA,QAqBC,aAAA;EAST,GAAA,CAAI,YAAA,EAAc,CAAA,GAAI,CAAA;EAItB,GAAA,CAAI,YAAA,EAAc,CAAA,EAAG,KAAA,EAAO,CAAA;EAK5B,MAAA,CAAO,YAAA,EAAc,CAAA;EAIrB,GAAA,CAAI,YAAA,EAAc,CAAA;EAIlB,KAAA;EAAA,CAIE,MAAA,CAAO,QAAA,KAAa,gBAAA,EAAkB,CAAA,EAAG,CAAA;EAAA,CAI1C,MAAA,CAAO,WAAA;AAAA"}