@hexclave/shared 1.0.40 → 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 +3 -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 +1 -2
  105. package/dist/esm/ai/unified-prompts/reminders.js.map +1 -1
  106. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
  107. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +26 -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 +81 -82
  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 +2 -2
  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 +11 -11
  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 +11 -13
  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 +10 -12
  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 +16 -17
  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 +3 -4
  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 +28 -30
  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 +14 -16
  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 +12 -14
  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 +5 -6
  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.map +1 -1
  349. package/dist/esm/interface/webhooks.js +1 -2
  350. package/dist/esm/interface/webhooks.js.map +1 -1
  351. package/dist/esm/known-errors.d.ts +2 -2
  352. package/dist/esm/known-errors.d.ts.map +1 -1
  353. package/dist/esm/known-errors.js +10 -21
  354. package/dist/esm/known-errors.js.map +1 -1
  355. package/dist/esm/payments/payment-methods.d.ts.map +1 -1
  356. package/dist/esm/payments/payment-methods.js +1 -1
  357. package/dist/esm/payments/payment-methods.js.map +1 -1
  358. package/dist/esm/payments/stripe-limits.d.ts.map +1 -1
  359. package/dist/esm/payments/stripe-limits.js +1 -1
  360. package/dist/esm/payments/stripe-limits.js.map +1 -1
  361. package/dist/esm/plans.d.ts.map +1 -1
  362. package/dist/esm/plans.js +1 -1
  363. package/dist/esm/plans.js.map +1 -1
  364. package/dist/esm/schema-fields.d.ts +3 -3
  365. package/dist/esm/schema-fields.d.ts.map +1 -1
  366. package/dist/esm/schema-fields.js +3 -64
  367. package/dist/esm/schema-fields.js.map +1 -1
  368. package/dist/esm/sessions.d.ts +1 -1
  369. package/dist/esm/sessions.d.ts.map +1 -1
  370. package/dist/esm/sessions.js +1 -2
  371. package/dist/esm/sessions.js.map +1 -1
  372. package/dist/esm/sessions.test.js +2 -3
  373. package/dist/esm/sessions.test.js.map +1 -1
  374. package/dist/esm/utils/analytics-clickmap-overlay.d.ts.map +1 -1
  375. package/dist/esm/utils/analytics-clickmap-overlay.js +1 -1
  376. package/dist/esm/utils/api-keys.d.ts.map +1 -1
  377. package/dist/esm/utils/api-keys.js +1 -2
  378. package/dist/esm/utils/api-keys.js.map +1 -1
  379. package/dist/esm/utils/arrays.d.ts.map +1 -1
  380. package/dist/esm/utils/arrays.js +1 -470
  381. package/dist/esm/utils/arrays.js.map +1 -1
  382. package/dist/esm/utils/auth-methods.d.ts.map +1 -1
  383. package/dist/esm/utils/auth-methods.js +1 -1
  384. package/dist/esm/utils/auth-methods.js.map +1 -1
  385. package/dist/esm/utils/base64.d.ts.map +1 -1
  386. package/dist/esm/utils/base64.js +1 -10
  387. package/dist/esm/utils/base64.js.map +1 -1
  388. package/dist/esm/utils/booleans.d.ts.map +1 -1
  389. package/dist/esm/utils/booleans.js +1 -25
  390. package/dist/esm/utils/booleans.js.map +1 -1
  391. package/dist/esm/utils/browser-compat.d.ts.map +1 -1
  392. package/dist/esm/utils/browser-compat.js +1 -1
  393. package/dist/esm/utils/browser-compat.js.map +1 -1
  394. package/dist/esm/utils/bytes.d.ts.map +1 -1
  395. package/dist/esm/utils/bytes.js +3 -198
  396. package/dist/esm/utils/bytes.js.map +1 -1
  397. package/dist/esm/utils/caches.d.ts +1 -1
  398. package/dist/esm/utils/caches.d.ts.map +1 -1
  399. package/dist/esm/utils/caches.js +1 -27
  400. package/dist/esm/utils/caches.js.map +1 -1
  401. package/dist/esm/utils/cel-fields.d.ts.map +1 -1
  402. package/dist/esm/utils/cel-fields.js +1 -2
  403. package/dist/esm/utils/cel-fields.js.map +1 -1
  404. package/dist/esm/utils/cloud-hosts.d.ts.map +1 -1
  405. package/dist/esm/utils/cloud-hosts.js +1 -27
  406. package/dist/esm/utils/cloud-hosts.js.map +1 -1
  407. package/dist/esm/utils/compile-time.d.ts.map +1 -1
  408. package/dist/esm/utils/compile-time.js +1 -1
  409. package/dist/esm/utils/compile-time.js.map +1 -1
  410. package/dist/esm/utils/country-codes.d.ts.map +1 -1
  411. package/dist/esm/utils/country-codes.js +1 -16
  412. package/dist/esm/utils/country-codes.js.map +1 -1
  413. package/dist/esm/utils/crypto.d.ts.map +1 -1
  414. package/dist/esm/utils/crypto.js +3 -113
  415. package/dist/esm/utils/crypto.js.map +1 -1
  416. package/dist/esm/utils/currencies.d.ts +1 -1
  417. package/dist/esm/utils/currencies.d.ts.map +1 -1
  418. package/dist/esm/utils/currencies.js +2 -37
  419. package/dist/esm/utils/currencies.js.map +1 -1
  420. package/dist/esm/utils/currency-constants.d.ts.map +1 -1
  421. package/dist/esm/utils/currency-constants.js +1 -1
  422. package/dist/esm/utils/currency-constants.js.map +1 -1
  423. package/dist/esm/utils/dates.d.ts.map +1 -1
  424. package/dist/esm/utils/dates.js +1 -44
  425. package/dist/esm/utils/dates.js.map +1 -1
  426. package/dist/esm/utils/dev-env-state-path.d.ts.map +1 -1
  427. package/dist/esm/utils/dev-env-state-path.js +1 -2
  428. package/dist/esm/utils/dev-env-state-path.js.map +1 -1
  429. package/dist/esm/utils/dev-tool.d.ts.map +1 -1
  430. package/dist/esm/utils/dev-tool.js +1 -1
  431. package/dist/esm/utils/dom.d.ts.map +1 -1
  432. package/dist/esm/utils/dom.js +1 -1
  433. package/dist/esm/utils/dom.js.map +1 -1
  434. package/dist/esm/utils/elements-chain.d.ts.map +1 -1
  435. package/dist/esm/utils/elements-chain.js +5 -50
  436. package/dist/esm/utils/elements-chain.js.map +1 -1
  437. package/dist/esm/utils/env.d.ts.map +1 -1
  438. package/dist/esm/utils/env.js +1 -2
  439. package/dist/esm/utils/env.js.map +1 -1
  440. package/dist/esm/utils/env.test.js +2 -3
  441. package/dist/esm/utils/env.test.js.map +1 -1
  442. package/dist/esm/utils/errors.d.ts +1 -1
  443. package/dist/esm/utils/errors.d.ts.map +1 -1
  444. package/dist/esm/utils/errors.js +1 -2
  445. package/dist/esm/utils/errors.js.map +1 -1
  446. package/dist/esm/utils/esbuild.d.ts +1 -1
  447. package/dist/esm/utils/esbuild.d.ts.map +1 -1
  448. package/dist/esm/utils/esbuild.js +2 -3
  449. package/dist/esm/utils/esbuild.js.map +1 -1
  450. package/dist/esm/utils/featurebase.d.ts.map +1 -1
  451. package/dist/esm/utils/featurebase.js +1 -2
  452. package/dist/esm/utils/featurebase.js.map +1 -1
  453. package/dist/esm/utils/fs.d.ts.map +1 -1
  454. package/dist/esm/utils/fs.js +1 -2
  455. package/dist/esm/utils/fs.js.map +1 -1
  456. package/dist/esm/utils/functions.d.ts.map +1 -1
  457. package/dist/esm/utils/functions.js +1 -24
  458. package/dist/esm/utils/functions.js.map +1 -1
  459. package/dist/esm/utils/geo.d.ts.map +1 -1
  460. package/dist/esm/utils/geo.js +1 -2
  461. package/dist/esm/utils/geo.js.map +1 -1
  462. package/dist/esm/utils/globals.d.ts.map +1 -1
  463. package/dist/esm/utils/globals.js +1 -1
  464. package/dist/esm/utils/globals.js.map +1 -1
  465. package/dist/esm/utils/hashes.d.ts.map +1 -1
  466. package/dist/esm/utils/hashes.js +1 -2
  467. package/dist/esm/utils/hashes.js.map +1 -1
  468. package/dist/esm/utils/html.d.ts.map +1 -1
  469. package/dist/esm/utils/html.js +1 -19
  470. package/dist/esm/utils/html.js.map +1 -1
  471. package/dist/esm/utils/http.d.ts.map +1 -1
  472. package/dist/esm/utils/http.js +1 -19
  473. package/dist/esm/utils/http.js.map +1 -1
  474. package/dist/esm/utils/ips.d.ts.map +1 -1
  475. package/dist/esm/utils/ips.js +1 -25
  476. package/dist/esm/utils/ips.js.map +1 -1
  477. package/dist/esm/utils/json.d.ts +1 -1
  478. package/dist/esm/utils/json.d.ts.map +1 -1
  479. package/dist/esm/utils/json.js +1 -155
  480. package/dist/esm/utils/json.js.map +1 -1
  481. package/dist/esm/utils/jsx-editable-transpiler.d.ts.map +1 -1
  482. package/dist/esm/utils/jsx-editable-transpiler.js +1 -2
  483. package/dist/esm/utils/jsx-editable-transpiler.js.map +1 -1
  484. package/dist/esm/utils/jsx-editable-transpiler.test.js +2 -3
  485. package/dist/esm/utils/jsx-editable-transpiler.test.js.map +1 -1
  486. package/dist/esm/utils/jwt.d.ts.map +1 -1
  487. package/dist/esm/utils/jwt.js +1 -2
  488. package/dist/esm/utils/jwt.js.map +1 -1
  489. package/dist/esm/utils/locks.d.ts.map +1 -1
  490. package/dist/esm/utils/locks.js +1 -2
  491. package/dist/esm/utils/locks.js.map +1 -1
  492. package/dist/esm/utils/maps.d.ts.map +1 -1
  493. package/dist/esm/utils/maps.js +1 -111
  494. package/dist/esm/utils/maps.js.map +1 -1
  495. package/dist/esm/utils/math.d.ts.map +1 -1
  496. package/dist/esm/utils/math.js +1 -11
  497. package/dist/esm/utils/math.js.map +1 -1
  498. package/dist/esm/utils/monkey-patch.d.ts.map +1 -1
  499. package/dist/esm/utils/monkey-patch.js +2 -3
  500. package/dist/esm/utils/monkey-patch.js.map +1 -1
  501. package/dist/esm/utils/node-http.js +1 -2
  502. package/dist/esm/utils/node-http.js.map +1 -1
  503. package/dist/esm/utils/numbers.d.ts.map +1 -1
  504. package/dist/esm/utils/numbers.js +1 -45
  505. package/dist/esm/utils/numbers.js.map +1 -1
  506. package/dist/esm/utils/oauth.d.ts.map +1 -1
  507. package/dist/esm/utils/oauth.js +1 -1
  508. package/dist/esm/utils/oauth.js.map +1 -1
  509. package/dist/esm/utils/objects.d.ts.map +1 -1
  510. package/dist/esm/utils/objects.js +1 -622
  511. package/dist/esm/utils/objects.js.map +1 -1
  512. package/dist/esm/utils/paginated-lists.d.ts.map +1 -1
  513. package/dist/esm/utils/paginated-lists.js +1 -2
  514. package/dist/esm/utils/paginated-lists.js.map +1 -1
  515. package/dist/esm/utils/paginated-lists.test.js +2 -3
  516. package/dist/esm/utils/paginated-lists.test.js.map +1 -1
  517. package/dist/esm/utils/passkey.d.ts +1 -1
  518. package/dist/esm/utils/passkey.js +1 -1
  519. package/dist/esm/utils/promises.d.ts +1 -1
  520. package/dist/esm/utils/promises.d.ts.map +1 -1
  521. package/dist/esm/utils/promises.js +2 -161
  522. package/dist/esm/utils/promises.js.map +1 -1
  523. package/dist/esm/utils/proxies.d.ts.map +1 -1
  524. package/dist/esm/utils/proxies.js +1 -37
  525. package/dist/esm/utils/proxies.js.map +1 -1
  526. package/dist/esm/utils/react.d.ts.map +1 -1
  527. package/dist/esm/utils/react.js +1 -41
  528. package/dist/esm/utils/react.js.map +1 -1
  529. package/dist/esm/utils/redirect-urls.d.ts.map +1 -1
  530. package/dist/esm/utils/redirect-urls.js +2 -92
  531. package/dist/esm/utils/redirect-urls.js.map +1 -1
  532. package/dist/esm/utils/regex.js +1 -1
  533. package/dist/esm/utils/regex.js.map +1 -1
  534. package/dist/esm/utils/results.d.ts.map +1 -1
  535. package/dist/esm/utils/results.js +1 -213
  536. package/dist/esm/utils/results.js.map +1 -1
  537. package/dist/esm/utils/sentry.js +1 -1
  538. package/dist/esm/utils/sentry.js.map +1 -1
  539. package/dist/esm/utils/stores.d.ts +3 -3
  540. package/dist/esm/utils/stores.d.ts.map +1 -1
  541. package/dist/esm/utils/stores.js +1 -2
  542. package/dist/esm/utils/stores.js.map +1 -1
  543. package/dist/esm/utils/strings.d.ts.map +1 -1
  544. package/dist/esm/utils/strings.js +1 -251
  545. package/dist/esm/utils/strings.js.map +1 -1
  546. package/dist/esm/utils/strings.nicify.test.js +2 -3
  547. package/dist/esm/utils/strings.nicify.test.js.map +1 -1
  548. package/dist/esm/utils/telemetry.d.ts.map +1 -1
  549. package/dist/esm/utils/telemetry.js +1 -2
  550. package/dist/esm/utils/telemetry.js.map +1 -1
  551. package/dist/esm/utils/turnstile-browser.d.ts +1 -1
  552. package/dist/esm/utils/turnstile-browser.d.ts.map +1 -1
  553. package/dist/esm/utils/turnstile-browser.js +1 -2
  554. package/dist/esm/utils/turnstile-browser.js.map +1 -1
  555. package/dist/esm/utils/turnstile-flow.d.ts +1 -1
  556. package/dist/esm/utils/turnstile-flow.d.ts.map +1 -1
  557. package/dist/esm/utils/turnstile-flow.js +1 -2
  558. package/dist/esm/utils/turnstile-flow.js.map +1 -1
  559. package/dist/esm/utils/turnstile-flow.test.js +2 -3
  560. package/dist/esm/utils/turnstile-flow.test.js.map +1 -1
  561. package/dist/esm/utils/turnstile.d.ts.map +1 -1
  562. package/dist/esm/utils/turnstile.js +1 -1
  563. package/dist/esm/utils/turnstile.js.map +1 -1
  564. package/dist/esm/utils/typed-arrays.js +1 -2
  565. package/dist/esm/utils/typed-arrays.js.map +1 -1
  566. package/dist/esm/utils/types.d.ts +1 -1
  567. package/dist/esm/utils/types.d.ts.map +1 -1
  568. package/dist/esm/utils/types.js +1 -1
  569. package/dist/esm/utils/types.js.map +1 -1
  570. package/dist/esm/utils/unicode.d.ts.map +1 -1
  571. package/dist/esm/utils/unicode.js +1 -13
  572. package/dist/esm/utils/unicode.js.map +1 -1
  573. package/dist/esm/utils/urls.d.ts.map +1 -1
  574. package/dist/esm/utils/urls.js +1 -151
  575. package/dist/esm/utils/urls.js.map +1 -1
  576. package/dist/esm/utils/uuids.d.ts.map +1 -1
  577. package/dist/esm/utils/uuids.js +2 -26
  578. package/dist/esm/utils/uuids.js.map +1 -1
  579. package/dist/format-4JG1MGv5.d.ts +61 -0
  580. package/dist/format-4JG1MGv5.d.ts.map +1 -0
  581. package/dist/handler-urls-BHt3v8Ai.d.ts +70 -0
  582. package/dist/handler-urls-BHt3v8Ai.d.ts.map +1 -0
  583. package/dist/helpers/emails.js +2 -4
  584. package/dist/helpers/emails.js.map +1 -1
  585. package/dist/helpers/init-prompt.d.ts.map +1 -1
  586. package/dist/helpers/init-prompt.js +2 -4
  587. package/dist/helpers/init-prompt.js.map +1 -1
  588. package/dist/helpers/password.d.ts +1 -1
  589. package/dist/helpers/password.d.ts.map +1 -1
  590. package/dist/helpers/password.js +2 -4
  591. package/dist/helpers/password.js.map +1 -1
  592. package/dist/helpers/production-mode.d.ts +1 -1
  593. package/dist/helpers/production-mode.d.ts.map +1 -1
  594. package/dist/helpers/production-mode.js +2 -4
  595. package/dist/helpers/production-mode.js.map +1 -1
  596. package/dist/helpers/support-sla.d.ts.map +1 -1
  597. package/dist/helpers/support-sla.js +2 -3
  598. package/dist/helpers/support-sla.js.map +1 -1
  599. package/dist/helpers/support-sla.test.js +1 -3
  600. package/dist/helpers/support-sla.test.js.map +1 -1
  601. package/dist/helpers/vault/client-side.d.ts.map +1 -1
  602. package/dist/helpers/vault/client-side.js +2 -22
  603. package/dist/helpers/vault/client-side.js.map +1 -1
  604. package/dist/helpers/vault/server-side.js +2 -4
  605. package/dist/helpers/vault/server-side.js.map +1 -1
  606. package/dist/hooks/use-async-callback.d.ts.map +1 -1
  607. package/dist/hooks/use-async-callback.js +4 -5
  608. package/dist/hooks/use-async-callback.js.map +1 -1
  609. package/dist/hooks/use-async-external-store.d.ts +1 -1
  610. package/dist/hooks/use-async-external-store.d.ts.map +1 -1
  611. package/dist/hooks/use-async-external-store.js +2 -4
  612. package/dist/hooks/use-async-external-store.js.map +1 -1
  613. package/dist/hooks/use-hash.js +2 -4
  614. package/dist/hooks/use-hash.js.map +1 -1
  615. package/dist/hooks/use-hover.d.ts.map +1 -1
  616. package/dist/hooks/use-hover.js +2 -4
  617. package/dist/hooks/use-hover.js.map +1 -1
  618. package/dist/hooks/use-strict-memo.d.ts.map +1 -1
  619. package/dist/hooks/use-strict-memo.js +2 -72
  620. package/dist/hooks/use-strict-memo.js.map +1 -1
  621. package/dist/index.d.ts +4 -4
  622. package/dist/index.js +27 -29
  623. package/dist/interface/admin-interface.d.ts +3 -379
  624. package/dist/interface/admin-interface.js +3 -5
  625. package/dist/interface/admin-interface.js.map +1 -1
  626. package/dist/interface/admin-metrics.d.ts +2 -807
  627. package/dist/interface/admin-metrics.js +2 -4
  628. package/dist/interface/admin-metrics.js.map +1 -1
  629. package/dist/interface/client-interface.d.ts +2 -447
  630. package/dist/interface/client-interface.js +33 -18
  631. package/dist/interface/client-interface.js.map +1 -1
  632. package/dist/interface/client-interface.test.js +83 -13
  633. package/dist/interface/client-interface.test.js.map +1 -1
  634. package/dist/interface/conversations.d.ts +11 -11
  635. package/dist/interface/conversations.d.ts.map +1 -1
  636. package/dist/interface/conversations.js +2 -4
  637. package/dist/interface/conversations.js.map +1 -1
  638. package/dist/interface/crud/analytics.d.ts +2 -14
  639. package/dist/interface/crud/connected-accounts.d.ts +2 -68
  640. package/dist/interface/crud/connected-accounts.js +2 -4
  641. package/dist/interface/crud/connected-accounts.js.map +1 -1
  642. package/dist/interface/crud/contact-channels.d.ts +2 -181
  643. package/dist/interface/crud/contact-channels.js +2 -4
  644. package/dist/interface/crud/contact-channels.js.map +1 -1
  645. package/dist/interface/crud/current-user.d.ts +2 -285
  646. package/dist/interface/crud/current-user.js +2 -4
  647. package/dist/interface/crud/current-user.js.map +1 -1
  648. package/dist/interface/crud/email-outbox.d.ts +2 -1465
  649. package/dist/interface/crud/email-outbox.js +4 -5
  650. package/dist/interface/crud/email-outbox.js.map +1 -1
  651. package/dist/interface/crud/email-templates.d.ts +15 -16
  652. package/dist/interface/crud/email-templates.d.ts.map +1 -1
  653. package/dist/interface/crud/email-templates.js +2 -4
  654. package/dist/interface/crud/email-templates.js.map +1 -1
  655. package/dist/interface/crud/emails.d.ts +2 -41
  656. package/dist/interface/crud/emails.js +4 -5
  657. package/dist/interface/crud/emails.js.map +1 -1
  658. package/dist/interface/crud/internal-api-keys.d.ts +2 -140
  659. package/dist/interface/crud/internal-api-keys.js +2 -4
  660. package/dist/interface/crud/internal-api-keys.js.map +1 -1
  661. package/dist/interface/crud/invoices.d.ts +2 -43
  662. package/dist/interface/crud/invoices.js +2 -4
  663. package/dist/interface/crud/invoices.js.map +1 -1
  664. package/dist/interface/crud/items.d.ts +2 -30
  665. package/dist/interface/crud/items.js +2 -4
  666. package/dist/interface/crud/items.js.map +1 -1
  667. package/dist/interface/crud/notification-preferences.d.ts +2 -38
  668. package/dist/interface/crud/notification-preferences.js +2 -4
  669. package/dist/interface/crud/notification-preferences.js.map +1 -1
  670. package/dist/interface/crud/oauth-providers.d.ts +2 -186
  671. package/dist/interface/crud/oauth-providers.js +2 -4
  672. package/dist/interface/crud/oauth-providers.js.map +1 -1
  673. package/dist/interface/crud/products.d.ts +2 -182
  674. package/dist/interface/crud/products.js +4 -4
  675. package/dist/interface/crud/products.js.map +1 -1
  676. package/dist/interface/crud/project-api-keys.d.ts +2 -203
  677. package/dist/interface/crud/project-api-keys.js +2 -4
  678. package/dist/interface/crud/project-api-keys.js.map +1 -1
  679. package/dist/interface/crud/project-permissions.d.ts +2 -161
  680. package/dist/interface/crud/project-permissions.js +4 -5
  681. package/dist/interface/crud/project-permissions.js.map +1 -1
  682. package/dist/interface/crud/projects.d.ts +2 -901
  683. package/dist/interface/crud/projects.js +6 -5
  684. package/dist/interface/crud/projects.js.map +1 -1
  685. package/dist/interface/crud/session-replays.d.ts +2 -83
  686. package/dist/interface/crud/sessions.d.ts +2 -150
  687. package/dist/interface/crud/sessions.js +2 -4
  688. package/dist/interface/crud/sessions.js.map +1 -1
  689. package/dist/interface/crud/sign-up-rules.d.ts.map +1 -1
  690. package/dist/interface/crud/svix-token.d.ts +2 -31
  691. package/dist/interface/crud/svix-token.js +2 -4
  692. package/dist/interface/crud/svix-token.js.map +1 -1
  693. package/dist/interface/crud/team-invitation-details.d.ts +5 -6
  694. package/dist/interface/crud/team-invitation-details.d.ts.map +1 -1
  695. package/dist/interface/crud/team-invitation-details.js +4 -5
  696. package/dist/interface/crud/team-invitation-details.js.map +1 -1
  697. package/dist/interface/crud/team-invitation.d.ts +2 -54
  698. package/dist/interface/crud/team-invitation.js +4 -5
  699. package/dist/interface/crud/team-invitation.js.map +1 -1
  700. package/dist/interface/crud/team-member-profiles.d.ts +2 -286
  701. package/dist/interface/crud/team-member-profiles.js +4 -5
  702. package/dist/interface/crud/team-member-profiles.js.map +1 -1
  703. package/dist/interface/crud/team-memberships.d.ts +2 -75
  704. package/dist/interface/crud/team-memberships.js +2 -4
  705. package/dist/interface/crud/team-memberships.js.map +1 -1
  706. package/dist/interface/crud/team-permissions.d.ts +2 -169
  707. package/dist/interface/crud/team-permissions.js +4 -5
  708. package/dist/interface/crud/team-permissions.js.map +1 -1
  709. package/dist/interface/crud/teams.d.ts +2 -299
  710. package/dist/interface/crud/teams.js +5 -7
  711. package/dist/interface/crud/teams.js.map +1 -1
  712. package/dist/interface/crud/transactions.d.ts +2 -183
  713. package/dist/interface/crud/transactions.js +2 -4
  714. package/dist/interface/crud/transactions.js.map +1 -1
  715. package/dist/interface/crud/users.d.ts +2 -653
  716. package/dist/interface/crud/users.js +12 -8
  717. package/dist/interface/crud/users.js.map +1 -1
  718. package/dist/interface/handler-urls.d.ts +2 -51
  719. package/dist/interface/handler-urls.js +12 -14
  720. package/dist/interface/page-component-versions.d.ts +2 -25
  721. package/dist/interface/page-component-versions.js +2 -4
  722. package/dist/interface/page-component-versions.js.map +1 -1
  723. package/dist/interface/plan-usage.d.ts +2 -57
  724. package/dist/interface/plan-usage.js +2 -4
  725. package/dist/interface/plan-usage.js.map +1 -1
  726. package/dist/interface/server-interface.d.ts +2 -257
  727. package/dist/interface/server-interface.js +3 -5
  728. package/dist/interface/server-interface.js.map +1 -1
  729. package/dist/interface/webhooks.d.ts +2 -326
  730. package/dist/interface/webhooks.js +2 -4
  731. package/dist/interface/webhooks.js.map +1 -1
  732. package/dist/internal-api-keys-D8IYDodH.d.ts +139 -0
  733. package/dist/internal-api-keys-D8IYDodH.d.ts.map +1 -0
  734. package/dist/invoices-CHo9YKbI.d.ts +43 -0
  735. package/dist/invoices-CHo9YKbI.d.ts.map +1 -0
  736. package/dist/items-DlLSlVUD.d.ts +29 -0
  737. package/dist/items-DlLSlVUD.d.ts.map +1 -0
  738. package/dist/json-a1QIXu5z.d.ts +15 -0
  739. package/dist/json-a1QIXu5z.d.ts.map +1 -0
  740. package/dist/known-errors-Bm4a61wL.d.ts +575 -0
  741. package/dist/known-errors-Bm4a61wL.d.ts.map +1 -0
  742. package/dist/known-errors.d.ts +2 -575
  743. package/dist/known-errors.js +11 -23
  744. package/dist/known-errors.js.map +1 -1
  745. package/dist/notification-preferences-Bmzr_EOY.d.ts +37 -0
  746. package/dist/notification-preferences-Bmzr_EOY.d.ts.map +1 -0
  747. package/dist/oauth-providers-BMkKSSlA.d.ts +185 -0
  748. package/dist/oauth-providers-BMkKSSlA.d.ts.map +1 -0
  749. package/dist/objects-DkCkeBWE.d.ts +59 -0
  750. package/dist/objects-DkCkeBWE.d.ts.map +1 -0
  751. package/dist/passkey-CKg87UH-.d.ts +2 -0
  752. package/dist/payments/payment-methods.d.ts.map +1 -1
  753. package/dist/payments/payment-methods.js +2 -3
  754. package/dist/payments/payment-methods.js.map +1 -1
  755. package/dist/payments/stripe-limits.d.ts.map +1 -1
  756. package/dist/payments/stripe-limits.js +2 -3
  757. package/dist/payments/stripe-limits.js.map +1 -1
  758. package/dist/plan-usage-DfDoj5K4.d.ts +57 -0
  759. package/dist/plan-usage-DfDoj5K4.d.ts.map +1 -0
  760. package/dist/plans.d.ts.map +1 -1
  761. package/dist/plans.js +2 -3
  762. package/dist/plans.js.map +1 -1
  763. package/dist/products-Bs74ld-v.d.ts +182 -0
  764. package/dist/products-Bs74ld-v.d.ts.map +1 -0
  765. package/dist/project-api-keys--7V5X_UW.d.ts +203 -0
  766. package/dist/project-api-keys--7V5X_UW.d.ts.map +1 -0
  767. package/dist/project-permissions-kdi675F-.d.ts +160 -0
  768. package/dist/project-permissions-kdi675F-.d.ts.map +1 -0
  769. package/dist/projects-CFTNXRfG.d.ts +900 -0
  770. package/dist/projects-CFTNXRfG.d.ts.map +1 -0
  771. package/dist/results-DP3BzoL6.d.ts +70 -0
  772. package/dist/results-DP3BzoL6.d.ts.map +1 -0
  773. package/dist/{chunk-BE-pF4vm.js → rolldown-runtime-D6vf50IK.js} +12 -18
  774. package/dist/schema-CJwkGkdf.d.ts +2328 -0
  775. package/dist/schema-CJwkGkdf.d.ts.map +1 -0
  776. package/dist/schema-fields-DqGQ4kF7.d.ts +517 -0
  777. package/dist/schema-fields-DqGQ4kF7.d.ts.map +1 -0
  778. package/dist/schema-fields.d.ts +3 -518
  779. package/dist/schema-fields.js +21 -82
  780. package/dist/schema-fields.js.map +1 -1
  781. package/dist/server-interface-CgpxsLT_.d.ts +257 -0
  782. package/dist/server-interface-CgpxsLT_.d.ts.map +1 -0
  783. package/dist/session-replays-CXqhDpZq.d.ts +83 -0
  784. package/dist/session-replays-CXqhDpZq.d.ts.map +1 -0
  785. package/dist/sessions-B7Ko2Ldr.d.ts +149 -0
  786. package/dist/sessions-B7Ko2Ldr.d.ts.map +1 -0
  787. package/dist/sessions-d8qtvBUB.d.ts +175 -0
  788. package/dist/sessions-d8qtvBUB.d.ts.map +1 -0
  789. package/dist/sessions.d.ts +2 -175
  790. package/dist/sessions.js +4 -5
  791. package/dist/sessions.js.map +1 -1
  792. package/dist/sessions.test.js +1 -3
  793. package/dist/sessions.test.js.map +1 -1
  794. package/dist/strings-DWgkUybS.d.ts +76 -0
  795. package/dist/strings-DWgkUybS.d.ts.map +1 -0
  796. package/dist/svix-token-BsMrLGvy.d.ts +30 -0
  797. package/dist/svix-token-BsMrLGvy.d.ts.map +1 -0
  798. package/dist/team-invitation-Cyqt9oWw.d.ts +53 -0
  799. package/dist/team-invitation-Cyqt9oWw.d.ts.map +1 -0
  800. package/dist/team-member-profiles-BoDEqx-0.d.ts +285 -0
  801. package/dist/team-member-profiles-BoDEqx-0.d.ts.map +1 -0
  802. package/dist/team-memberships-DZHk2A5b.d.ts +74 -0
  803. package/dist/team-memberships-DZHk2A5b.d.ts.map +1 -0
  804. package/dist/team-permissions-DqOpaOWh.d.ts +168 -0
  805. package/dist/team-permissions-DqOpaOWh.d.ts.map +1 -0
  806. package/dist/teams-CQMcBnjM.d.ts +298 -0
  807. package/dist/teams-CQMcBnjM.d.ts.map +1 -0
  808. package/dist/transactions-DhnbvGH5.d.ts +182 -0
  809. package/dist/transactions-DhnbvGH5.d.ts.map +1 -0
  810. package/dist/types-DfTcxNtM.d.ts +77 -0
  811. package/dist/types-DfTcxNtM.d.ts.map +1 -0
  812. package/dist/users-DHNRwoSz.d.ts +653 -0
  813. package/dist/users-DHNRwoSz.d.ts.map +1 -0
  814. package/dist/utils/analytics-clickmap-overlay.d.ts.map +1 -1
  815. package/dist/utils/analytics-clickmap-overlay.js +2 -3
  816. package/dist/utils/analytics-clickmap-overlay.js.map +1 -1
  817. package/dist/utils/api-keys.d.ts.map +1 -1
  818. package/dist/utils/api-keys.js +4 -5
  819. package/dist/utils/api-keys.js.map +1 -1
  820. package/dist/utils/arrays.d.ts.map +1 -1
  821. package/dist/utils/arrays.js +2 -472
  822. package/dist/utils/arrays.js.map +1 -1
  823. package/dist/utils/auth-methods.d.ts.map +1 -1
  824. package/dist/utils/auth-methods.js +2 -3
  825. package/dist/utils/auth-methods.js.map +1 -1
  826. package/dist/utils/base64.d.ts.map +1 -1
  827. package/dist/utils/base64.js +2 -12
  828. package/dist/utils/base64.js.map +1 -1
  829. package/dist/utils/booleans.d.ts.map +1 -1
  830. package/dist/utils/booleans.js +2 -27
  831. package/dist/utils/booleans.js.map +1 -1
  832. package/dist/utils/browser-compat.d.ts.map +1 -1
  833. package/dist/utils/browser-compat.js +2 -3
  834. package/dist/utils/browser-compat.js.map +1 -1
  835. package/dist/utils/bytes.d.ts.map +1 -1
  836. package/dist/utils/bytes.js +4 -200
  837. package/dist/utils/bytes.js.map +1 -1
  838. package/dist/utils/caches.d.ts.map +1 -1
  839. package/dist/utils/caches.js +2 -29
  840. package/dist/utils/caches.js.map +1 -1
  841. package/dist/utils/cel-fields.d.ts.map +1 -1
  842. package/dist/utils/cel-fields.js +2 -4
  843. package/dist/utils/cel-fields.js.map +1 -1
  844. package/dist/utils/cloud-hosts.d.ts.map +1 -1
  845. package/dist/utils/cloud-hosts.js +2 -29
  846. package/dist/utils/cloud-hosts.js.map +1 -1
  847. package/dist/utils/compile-time.d.ts.map +1 -1
  848. package/dist/utils/compile-time.js +2 -3
  849. package/dist/utils/compile-time.js.map +1 -1
  850. package/dist/utils/country-codes.d.ts +2 -11
  851. package/dist/utils/country-codes.js +2 -18
  852. package/dist/utils/country-codes.js.map +1 -1
  853. package/dist/utils/crypto.d.ts.map +1 -1
  854. package/dist/utils/crypto.js +4 -115
  855. package/dist/utils/crypto.js.map +1 -1
  856. package/dist/utils/currencies.d.ts +1 -1
  857. package/dist/utils/currencies.d.ts.map +1 -1
  858. package/dist/utils/currencies.js +3 -39
  859. package/dist/utils/currencies.js.map +1 -1
  860. package/dist/utils/currency-constants.d.ts +2 -45
  861. package/dist/utils/currency-constants.js +2 -3
  862. package/dist/utils/currency-constants.js.map +1 -1
  863. package/dist/utils/dates.d.ts +2 -23
  864. package/dist/utils/dates.js +2 -46
  865. package/dist/utils/dates.js.map +1 -1
  866. package/dist/utils/dev-env-state-path.d.ts.map +1 -1
  867. package/dist/utils/dev-env-state-path.js +2 -4
  868. package/dist/utils/dev-env-state-path.js.map +1 -1
  869. package/dist/utils/dev-tool.d.ts.map +1 -1
  870. package/dist/utils/dev-tool.js +2 -3
  871. package/dist/utils/dev-tool.js.map +1 -1
  872. package/dist/utils/dom.d.ts.map +1 -1
  873. package/dist/utils/dom.js +2 -3
  874. package/dist/utils/dom.js.map +1 -1
  875. package/dist/utils/elements-chain.d.ts.map +1 -1
  876. package/dist/utils/elements-chain.js +6 -52
  877. package/dist/utils/elements-chain.js.map +1 -1
  878. package/dist/utils/env.d.ts.map +1 -1
  879. package/dist/utils/env.js +2 -4
  880. package/dist/utils/env.js.map +1 -1
  881. package/dist/utils/env.test.js +1 -3
  882. package/dist/utils/env.test.js.map +1 -1
  883. package/dist/utils/errors.d.ts +2 -238
  884. package/dist/utils/errors.js +2 -4
  885. package/dist/utils/errors.js.map +1 -1
  886. package/dist/utils/esbuild.d.ts +1 -1
  887. package/dist/utils/esbuild.d.ts.map +1 -1
  888. package/dist/utils/esbuild.js +5 -6
  889. package/dist/utils/esbuild.js.map +1 -1
  890. package/dist/utils/featurebase.d.ts.map +1 -1
  891. package/dist/utils/featurebase.js +2 -4
  892. package/dist/utils/featurebase.js.map +1 -1
  893. package/dist/utils/fs.d.ts.map +1 -1
  894. package/dist/utils/fs.js +5 -6
  895. package/dist/utils/fs.js.map +1 -1
  896. package/dist/utils/functions.d.ts.map +1 -1
  897. package/dist/utils/functions.js +2 -26
  898. package/dist/utils/functions.js.map +1 -1
  899. package/dist/utils/geo.d.ts.map +1 -1
  900. package/dist/utils/geo.js +2 -4
  901. package/dist/utils/geo.js.map +1 -1
  902. package/dist/utils/globals.d.ts.map +1 -1
  903. package/dist/utils/globals.js +2 -3
  904. package/dist/utils/globals.js.map +1 -1
  905. package/dist/utils/hashes.d.ts.map +1 -1
  906. package/dist/utils/hashes.js +4 -5
  907. package/dist/utils/hashes.js.map +1 -1
  908. package/dist/utils/html.d.ts.map +1 -1
  909. package/dist/utils/html.js +2 -21
  910. package/dist/utils/html.js.map +1 -1
  911. package/dist/utils/http.d.ts.map +1 -1
  912. package/dist/utils/http.js +2 -21
  913. package/dist/utils/http.js.map +1 -1
  914. package/dist/utils/ips.d.ts.map +1 -1
  915. package/dist/utils/ips.js +4 -28
  916. package/dist/utils/ips.js.map +1 -1
  917. package/dist/utils/json.d.ts +2 -15
  918. package/dist/utils/json.js +2 -157
  919. package/dist/utils/json.js.map +1 -1
  920. package/dist/utils/jsx-editable-transpiler.d.ts.map +1 -1
  921. package/dist/utils/jsx-editable-transpiler.js +7 -8
  922. package/dist/utils/jsx-editable-transpiler.js.map +1 -1
  923. package/dist/utils/jsx-editable-transpiler.test.js +1 -3
  924. package/dist/utils/jsx-editable-transpiler.test.js.map +1 -1
  925. package/dist/utils/jwt.d.ts.map +1 -1
  926. package/dist/utils/jwt.js +6 -7
  927. package/dist/utils/jwt.js.map +1 -1
  928. package/dist/utils/locks.d.ts.map +1 -1
  929. package/dist/utils/locks.js +2 -4
  930. package/dist/utils/locks.js.map +1 -1
  931. package/dist/utils/maps.d.ts.map +1 -1
  932. package/dist/utils/maps.js +2 -113
  933. package/dist/utils/maps.js.map +1 -1
  934. package/dist/utils/math.d.ts.map +1 -1
  935. package/dist/utils/math.js +2 -13
  936. package/dist/utils/math.js.map +1 -1
  937. package/dist/utils/monkey-patch.d.ts.map +1 -1
  938. package/dist/utils/monkey-patch.js +3 -5
  939. package/dist/utils/monkey-patch.js.map +1 -1
  940. package/dist/utils/node-http.js +2 -4
  941. package/dist/utils/node-http.js.map +1 -1
  942. package/dist/utils/numbers.d.ts.map +1 -1
  943. package/dist/utils/numbers.js +2 -47
  944. package/dist/utils/numbers.js.map +1 -1
  945. package/dist/utils/oauth.d.ts.map +1 -1
  946. package/dist/utils/oauth.js +2 -3
  947. package/dist/utils/oauth.js.map +1 -1
  948. package/dist/utils/objects.d.ts +2 -59
  949. package/dist/utils/objects.js +2 -624
  950. package/dist/utils/objects.js.map +1 -1
  951. package/dist/utils/paginated-lists.d.ts.map +1 -1
  952. package/dist/utils/paginated-lists.js +2 -4
  953. package/dist/utils/paginated-lists.js.map +1 -1
  954. package/dist/utils/paginated-lists.test.js +1 -3
  955. package/dist/utils/paginated-lists.test.js.map +1 -1
  956. package/dist/utils/passkey.d.ts +2 -2
  957. package/dist/utils/promises.d.ts +1 -1
  958. package/dist/utils/promises.d.ts.map +1 -1
  959. package/dist/utils/promises.js +3 -163
  960. package/dist/utils/promises.js.map +1 -1
  961. package/dist/utils/proxies.d.ts.map +1 -1
  962. package/dist/utils/proxies.js +2 -39
  963. package/dist/utils/proxies.js.map +1 -1
  964. package/dist/utils/react.d.ts.map +1 -1
  965. package/dist/utils/react.js +4 -44
  966. package/dist/utils/react.js.map +1 -1
  967. package/dist/utils/redirect-urls.d.ts.map +1 -1
  968. package/dist/utils/redirect-urls.js +3 -94
  969. package/dist/utils/redirect-urls.js.map +1 -1
  970. package/dist/utils/regex.js +2 -3
  971. package/dist/utils/regex.js.map +1 -1
  972. package/dist/utils/results.d.ts +2 -70
  973. package/dist/utils/results.js +2 -215
  974. package/dist/utils/results.js.map +1 -1
  975. package/dist/utils/sentry.js +2 -3
  976. package/dist/utils/sentry.js.map +1 -1
  977. package/dist/utils/stores.d.ts +1 -1
  978. package/dist/utils/stores.d.ts.map +1 -1
  979. package/dist/utils/stores.js +2 -4
  980. package/dist/utils/stores.js.map +1 -1
  981. package/dist/utils/strings.d.ts +2 -76
  982. package/dist/utils/strings.js +2 -253
  983. package/dist/utils/strings.js.map +1 -1
  984. package/dist/utils/strings.nicify.test.js +1 -3
  985. package/dist/utils/strings.nicify.test.js.map +1 -1
  986. package/dist/utils/telemetry.d.ts.map +1 -1
  987. package/dist/utils/telemetry.js +2 -4
  988. package/dist/utils/telemetry.js.map +1 -1
  989. package/dist/utils/turnstile-browser.d.ts.map +1 -1
  990. package/dist/utils/turnstile-browser.js +2 -4
  991. package/dist/utils/turnstile-browser.js.map +1 -1
  992. package/dist/utils/turnstile-flow.d.ts.map +1 -1
  993. package/dist/utils/turnstile-flow.js +2 -4
  994. package/dist/utils/turnstile-flow.js.map +1 -1
  995. package/dist/utils/turnstile-flow.test.js +1 -3
  996. package/dist/utils/turnstile-flow.test.js.map +1 -1
  997. package/dist/utils/turnstile.d.ts.map +1 -1
  998. package/dist/utils/turnstile.js +2 -3
  999. package/dist/utils/turnstile.js.map +1 -1
  1000. package/dist/utils/typed-arrays.js +2 -4
  1001. package/dist/utils/typed-arrays.js.map +1 -1
  1002. package/dist/utils/types.d.ts +2 -77
  1003. package/dist/utils/types.js +2 -3
  1004. package/dist/utils/types.js.map +1 -1
  1005. package/dist/utils/unicode.d.ts.map +1 -1
  1006. package/dist/utils/unicode.js +2 -15
  1007. package/dist/utils/unicode.js.map +1 -1
  1008. package/dist/utils/urls.d.ts.map +1 -1
  1009. package/dist/utils/urls.js +2 -153
  1010. package/dist/utils/urls.js.map +1 -1
  1011. package/dist/utils/uuids.d.ts.map +1 -1
  1012. package/dist/utils/uuids.js +3 -28
  1013. package/dist/utils/uuids.js.map +1 -1
  1014. package/dist/webhooks-8Ts1Clcb.d.ts +326 -0
  1015. package/dist/webhooks-8Ts1Clcb.d.ts.map +1 -0
  1016. package/package.json +2 -8
  1017. package/src/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.ts +1 -0
  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,7 +1,5 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_chunk = require('../chunk-BE-pF4vm.js');
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
2
  let __results_js = require("./results.js");
4
-
5
3
  //#region src/utils/json.tsx
6
4
  function isJsonSerializable(value) {
7
5
  switch (typeof value) {
@@ -15,168 +13,15 @@ function isJsonSerializable(value) {
15
13
  default: return false;
16
14
  }
17
15
  }
18
- (void 0)?.test("isJsonSerializable", ({ expect }) => {
19
- expect(isJsonSerializable(null)).toBe(true);
20
- expect(isJsonSerializable(true)).toBe(true);
21
- expect(isJsonSerializable(false)).toBe(true);
22
- expect(isJsonSerializable(123)).toBe(true);
23
- expect(isJsonSerializable("string")).toBe(true);
24
- expect(isJsonSerializable([])).toBe(true);
25
- expect(isJsonSerializable([
26
- 1,
27
- 2,
28
- 3
29
- ])).toBe(true);
30
- expect(isJsonSerializable([
31
- "a",
32
- "b",
33
- "c"
34
- ])).toBe(true);
35
- expect(isJsonSerializable([
36
- 1,
37
- "a",
38
- true,
39
- null
40
- ])).toBe(true);
41
- expect(isJsonSerializable([
42
- 1,
43
- [2, 3],
44
- { a: "b" }
45
- ])).toBe(true);
46
- expect(isJsonSerializable({})).toBe(true);
47
- expect(isJsonSerializable({
48
- a: 1,
49
- b: 2
50
- })).toBe(true);
51
- expect(isJsonSerializable({
52
- a: "string",
53
- b: true,
54
- c: null
55
- })).toBe(true);
56
- expect(isJsonSerializable({
57
- a: [
58
- 1,
59
- 2,
60
- 3
61
- ],
62
- b: { c: "d" }
63
- })).toBe(true);
64
- expect(isJsonSerializable(void 0)).toBe(false);
65
- expect(isJsonSerializable(() => {})).toBe(false);
66
- expect(isJsonSerializable(Symbol())).toBe(false);
67
- expect(isJsonSerializable(BigInt(123))).toBe(false);
68
- expect(isJsonSerializable([
69
- 1,
70
- void 0,
71
- 3
72
- ])).toBe(false);
73
- expect(isJsonSerializable([
74
- 1,
75
- () => {},
76
- 3
77
- ])).toBe(false);
78
- expect(isJsonSerializable({
79
- a: 1,
80
- b: void 0
81
- })).toBe(false);
82
- expect(isJsonSerializable({
83
- a: 1,
84
- b: () => {}
85
- })).toBe(false);
86
- });
87
16
  function parseJson(json) {
88
17
  return __results_js.Result.fromThrowing(() => JSON.parse(json));
89
18
  }
90
- (void 0)?.test("parseJson", ({ expect }) => {
91
- const nullResult = parseJson("null");
92
- expect(nullResult.status).toBe("ok");
93
- if (nullResult.status === "ok") expect(nullResult.data).toBe(null);
94
- const trueResult = parseJson("true");
95
- expect(trueResult.status).toBe("ok");
96
- if (trueResult.status === "ok") expect(trueResult.data).toBe(true);
97
- const numberResult = parseJson("123");
98
- expect(numberResult.status).toBe("ok");
99
- if (numberResult.status === "ok") expect(numberResult.data).toBe(123);
100
- const stringResult = parseJson("\"string\"");
101
- expect(stringResult.status).toBe("ok");
102
- if (stringResult.status === "ok") expect(stringResult.data).toBe("string");
103
- const emptyArrayResult = parseJson("[]");
104
- expect(emptyArrayResult.status).toBe("ok");
105
- if (emptyArrayResult.status === "ok") expect(emptyArrayResult.data).toEqual([]);
106
- const arrayResult = parseJson("[1,2,3]");
107
- expect(arrayResult.status).toBe("ok");
108
- if (arrayResult.status === "ok") expect(arrayResult.data).toEqual([
109
- 1,
110
- 2,
111
- 3
112
- ]);
113
- const emptyObjectResult = parseJson("{}");
114
- expect(emptyObjectResult.status).toBe("ok");
115
- if (emptyObjectResult.status === "ok") expect(emptyObjectResult.data).toEqual({});
116
- const objectResult = parseJson("{\"a\":1,\"b\":\"string\"}");
117
- expect(objectResult.status).toBe("ok");
118
- if (objectResult.status === "ok") expect(objectResult.data).toEqual({
119
- a: 1,
120
- b: "string"
121
- });
122
- expect(parseJson("").status).toBe("error");
123
- expect(parseJson("undefined").status).toBe("error");
124
- expect(parseJson("{").status).toBe("error");
125
- expect(parseJson("{\"a\":1,}").status).toBe("error");
126
- expect(parseJson("function(){}").status).toBe("error");
127
- });
128
19
  function stringifyJson(json) {
129
20
  return __results_js.Result.fromThrowing(() => JSON.stringify(json));
130
21
  }
131
- (void 0)?.test("stringifyJson", ({ expect }) => {
132
- const nullResult = stringifyJson(null);
133
- expect(nullResult.status).toBe("ok");
134
- if (nullResult.status === "ok") expect(nullResult.data).toBe("null");
135
- const trueResult = stringifyJson(true);
136
- expect(trueResult.status).toBe("ok");
137
- if (trueResult.status === "ok") expect(trueResult.data).toBe("true");
138
- const numberResult = stringifyJson(123);
139
- expect(numberResult.status).toBe("ok");
140
- if (numberResult.status === "ok") expect(numberResult.data).toBe("123");
141
- const stringResult = stringifyJson("string");
142
- expect(stringResult.status).toBe("ok");
143
- if (stringResult.status === "ok") expect(stringResult.data).toBe("\"string\"");
144
- const emptyArrayResult = stringifyJson([]);
145
- expect(emptyArrayResult.status).toBe("ok");
146
- if (emptyArrayResult.status === "ok") expect(emptyArrayResult.data).toBe("[]");
147
- const arrayResult = stringifyJson([
148
- 1,
149
- 2,
150
- 3
151
- ]);
152
- expect(arrayResult.status).toBe("ok");
153
- if (arrayResult.status === "ok") expect(arrayResult.data).toBe("[1,2,3]");
154
- const emptyObjectResult = stringifyJson({});
155
- expect(emptyObjectResult.status).toBe("ok");
156
- if (emptyObjectResult.status === "ok") expect(emptyObjectResult.data).toBe("{}");
157
- const objectResult = stringifyJson({
158
- a: 1,
159
- b: "string"
160
- });
161
- expect(objectResult.status).toBe("ok");
162
- if (objectResult.status === "ok") expect(objectResult.data).toBe("{\"a\":1,\"b\":\"string\"}");
163
- const nestedResult = stringifyJson({
164
- a: [
165
- 1,
166
- 2,
167
- 3
168
- ],
169
- b: { c: "d" }
170
- });
171
- expect(nestedResult.status).toBe("ok");
172
- if (nestedResult.status === "ok") expect(nestedResult.data).toBe("{\"a\":[1,2,3],\"b\":{\"c\":\"d\"}}");
173
- const circular = { a: 1 };
174
- circular.self = circular;
175
- expect(stringifyJson(circular).status).toBe("error");
176
- });
177
-
178
22
  //#endregion
179
23
  exports.isJsonSerializable = isJsonSerializable;
180
24
  exports.parseJson = parseJson;
181
25
  exports.stringifyJson = stringifyJson;
26
+
182
27
  //# 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":["Result"],"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,OAAOA,aAAAA,OAAO,mBAAmB,KAAK,MAAM,IAAI,CAAC;AACnD;AA2DA,SAAgB,cAAc,MAA4B;CACxD,OAAOA,aAAAA,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"}
@@ -1,15 +1,14 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_chunk = require('../chunk-BE-pF4vm.js');
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_rolldown_runtime = require("../rolldown-runtime-D6vf50IK.js");
3
3
  let _babel_generator = require("@babel/generator");
4
- _babel_generator = require_chunk.__toESM(_babel_generator);
4
+ _babel_generator = require_rolldown_runtime.__toESM(_babel_generator);
5
5
  let _babel_parser = require("@babel/parser");
6
- _babel_parser = require_chunk.__toESM(_babel_parser);
6
+ _babel_parser = require_rolldown_runtime.__toESM(_babel_parser);
7
7
  let _babel_traverse = require("@babel/traverse");
8
- _babel_traverse = require_chunk.__toESM(_babel_traverse);
8
+ _babel_traverse = require_rolldown_runtime.__toESM(_babel_traverse);
9
9
  let _babel_types = require("@babel/types");
10
- _babel_types = require_chunk.__toESM(_babel_types);
10
+ _babel_types = require_rolldown_runtime.__toESM(_babel_types);
11
11
  let crypto = require("crypto");
12
-
13
12
  //#region src/utils/jsx-editable-transpiler.tsx
14
13
  /**
15
14
  * The __Editable component definition that gets injected into transformed source.
@@ -216,8 +215,8 @@ function transpileJsxForEditing(source, options) {
216
215
  function convertSentinelTokensToComments(html) {
217
216
  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 -->");
218
217
  }
219
-
220
218
  //#endregion
221
219
  exports.convertSentinelTokensToComments = convertSentinelTokensToComments;
222
220
  exports.transpileJsxForEditing = transpileJsxForEditing;
221
+
223
222
  //# sourceMappingURL=jsx-editable-transpiler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jsx-editable-transpiler.js","names":["parser","t"],"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":["parser","t"],"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,7 +1,5 @@
1
- const require_chunk = require('../chunk-BE-pF4vm.js');
2
1
  let vitest = require("vitest");
3
2
  let __jsx_editable_transpiler_js = require("./jsx-editable-transpiler.js");
4
-
5
3
  //#region src/utils/jsx-editable-transpiler.test.ts
6
4
  (0, vitest.describe)("transpileJsxForEditing", () => {
7
5
  (0, vitest.it)("should wrap simple JSX text nodes with __Editable", () => {
@@ -117,6 +115,6 @@ export function EmailTemplate() {
117
115
  (0, vitest.expect)((0, __jsx_editable_transpiler_js.convertSentinelTokensToComments)(html)).toBe(html);
118
116
  });
119
117
  });
120
-
121
118
  //#endregion
119
+
122
120
  //# 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"}
package/dist/utils/jwt.js CHANGED
@@ -1,7 +1,7 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_chunk = require('../chunk-BE-pF4vm.js');
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_rolldown_runtime = require("../rolldown-runtime-D6vf50IK.js");
3
3
  let jose = require("jose");
4
- jose = require_chunk.__toESM(jose);
4
+ jose = require_rolldown_runtime.__toESM(jose);
5
5
  let __bytes_js = require("./bytes.js");
6
6
  let __errors_js = require("./errors.js");
7
7
  let __env_js = require("./env.js");
@@ -10,11 +10,10 @@ let __globals_js = require("./globals.js");
10
10
  let __results_js = require("./results.js");
11
11
  let __strings_js = require("./strings.js");
12
12
  let crypto = require("crypto");
13
- crypto = require_chunk.__toESM(crypto);
13
+ crypto = require_rolldown_runtime.__toESM(crypto);
14
14
  let elliptic = require("elliptic");
15
- elliptic = require_chunk.__toESM(elliptic);
15
+ elliptic = require_rolldown_runtime.__toESM(elliptic);
16
16
  let jose_errors = require("jose/errors");
17
-
18
17
  //#region src/utils/jwt.tsx
19
18
  function getHexclaveServerSecret() {
20
19
  const STACK_SERVER_SECRET = (0, __env_js.getEnvVariable)("STACK_SERVER_SECRET");
@@ -101,7 +100,6 @@ function oldGetPerAudienceSecret(options) {
101
100
  function oldGetKid(options) {
102
101
  return jose.base64url.encode(crypto.default.createHash("sha256").update(JSON.stringify([options.secret, "kid"])).digest()).slice(0, 12);
103
102
  }
104
-
105
103
  //#endregion
106
104
  exports.getJwtInfo = getJwtInfo;
107
105
  exports.getPrivateJwks = getPrivateJwks;
@@ -109,4 +107,5 @@ exports.getPublicJwkSet = getPublicJwkSet;
109
107
  exports.oldGetKid = oldGetKid;
110
108
  exports.signJWT = signJWT;
111
109
  exports.verifyJWT = verifyJWT;
110
+
112
111
  //# sourceMappingURL=jwt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"jwt.js","names":["HexclaveAssertionError","Result","JOSEError","globalVar"],"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":["HexclaveAssertionError","Result","JOSEError","globalVar"],"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,7 +1,5 @@
1
- Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_chunk = require('../chunk-BE-pF4vm.js');
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
2
  let async_mutex = require("async-mutex");
4
-
5
3
  //#region src/utils/locks.tsx
6
4
  var ReadWriteLock = class {
7
5
  constructor() {
@@ -50,7 +48,7 @@ var ReadWriteLock = class {
50
48
  this.semaphore.release();
51
49
  }
52
50
  };
53
-
54
51
  //#endregion
55
52
  exports.ReadWriteLock = ReadWriteLock;
53
+
56
54
  //# sourceMappingURL=locks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"locks.js","names":["Semaphore"],"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,IAAIA,sBAAU,EAAE;AACjC,OAAK,UAAU;AACf,OAAK,eAAe,IAAIA,sBAAU,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":["Semaphore"],"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,IAAIA,YAAAA,UAAU,CAAC;EAChC,KAAK,UAAU;EACf,KAAK,eAAe,IAAIA,YAAAA,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"}