@hexclave/shared 1.0.41 → 1.0.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1067) hide show
  1. package/dist/admin-interface-Bv8rBJo-.d.ts +379 -0
  2. package/dist/admin-interface-Bv8rBJo-.d.ts.map +1 -0
  3. package/dist/admin-metrics-DyW8_G82.d.ts +807 -0
  4. package/dist/admin-metrics-DyW8_G82.d.ts.map +1 -0
  5. package/dist/ai/image-limits.d.ts.map +1 -1
  6. package/dist/ai/image-limits.js +6 -7
  7. package/dist/ai/image-limits.js.map +1 -1
  8. package/dist/ai/llms/llms.d.ts.map +1 -1
  9. package/dist/ai/llms/llms.js +2 -4
  10. package/dist/ai/llms/llms.js.map +1 -1
  11. package/dist/ai/unified-prompts/reminders.js +2 -4
  12. package/dist/ai/unified-prompts/reminders.js.map +1 -1
  13. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
  14. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +2 -5
  15. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
  16. package/dist/ai/unified-prompts/skill-site-prompt-parts/brain.js +3 -6
  17. package/dist/ai/unified-prompts/skill-site-prompt-parts/brain.js.map +1 -1
  18. package/dist/ai/unified-prompts/skill-site-prompt-parts/cli-help.js +3 -6
  19. package/dist/ai/unified-prompts/skill-site-prompt-parts/cli-help.js.map +1 -1
  20. package/dist/ai/unified-prompts/skill-site-prompt-parts/config-docs.js +3 -6
  21. package/dist/ai/unified-prompts/skill-site-prompt-parts/config-docs.js.map +1 -1
  22. package/dist/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js +3 -6
  23. package/dist/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js.map +1 -1
  24. package/dist/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js +3 -6
  25. package/dist/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js.map +1 -1
  26. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -1
  27. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +5 -6
  28. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -1
  29. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +1 -2
  30. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -1
  31. package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js +3 -6
  32. package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js.map +1 -1
  33. package/dist/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js +3 -6
  34. package/dist/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js.map +1 -1
  35. package/dist/ai/unified-prompts/skill-site-prompt.d.ts.map +1 -1
  36. package/dist/ai/unified-prompts/skill-site-prompt.js +2 -4
  37. package/dist/ai/unified-prompts/skill-site-prompt.js.map +1 -1
  38. package/dist/analytics-IjkAsefy.d.ts +14 -0
  39. package/dist/analytics-IjkAsefy.d.ts.map +1 -0
  40. package/dist/apps/apps-config.d.ts.map +1 -1
  41. package/dist/apps/apps-config.js +2 -3
  42. package/dist/apps/apps-config.js.map +1 -1
  43. package/dist/apps/apps-ui.d.ts +1 -2
  44. package/dist/apps/apps-ui.d.ts.map +1 -1
  45. package/dist/apps/apps-ui.js +4 -5
  46. package/dist/apps/apps-ui.js.map +1 -1
  47. package/dist/client-interface-CGrvUtX0.d.ts +447 -0
  48. package/dist/client-interface-CGrvUtX0.d.ts.map +1 -0
  49. package/dist/config/db-sync-mappings.js +2 -3
  50. package/dist/config/db-sync-mappings.js.map +1 -1
  51. package/dist/config/format.d.ts +2 -61
  52. package/dist/config/format.js +2 -192
  53. package/dist/config/format.js.map +1 -1
  54. package/dist/config/migrate-catalogs-to-product-lines.d.ts.map +1 -1
  55. package/dist/config/migrate-catalogs-to-product-lines.js +2 -196
  56. package/dist/config/migrate-catalogs-to-product-lines.js.map +1 -1
  57. package/dist/config/schema-fuzzer.test.js +18 -172
  58. package/dist/config/schema-fuzzer.test.js.map +1 -1
  59. package/dist/config/schema.d.ts +2 -2328
  60. package/dist/config/schema.js +6 -351
  61. package/dist/config/schema.js.map +1 -1
  62. package/dist/config-authoring.d.ts +1 -1
  63. package/dist/config-authoring.d.ts.map +1 -1
  64. package/dist/config-authoring.js +2 -3
  65. package/dist/config-authoring.js.map +1 -1
  66. package/dist/config-authoring.test.js +1 -3
  67. package/dist/config-authoring.test.js.map +1 -1
  68. package/dist/config-eval.d.ts.map +1 -1
  69. package/dist/config-eval.js +4 -46
  70. package/dist/config-eval.js.map +1 -1
  71. package/dist/config-rendering.d.ts.map +1 -1
  72. package/dist/config-rendering.js +2 -48
  73. package/dist/config-rendering.js.map +1 -1
  74. package/dist/connected-accounts-D5CKe50A.d.ts +67 -0
  75. package/dist/connected-accounts-D5CKe50A.d.ts.map +1 -0
  76. package/dist/contact-channels-DW8yQxlc.d.ts +180 -0
  77. package/dist/contact-channels-DW8yQxlc.d.ts.map +1 -0
  78. package/dist/country-codes-CRWDroBE.d.ts +11 -0
  79. package/dist/country-codes-CRWDroBE.d.ts.map +1 -0
  80. package/dist/crud-CqmEW9s6.d.ts +98 -0
  81. package/dist/crud-CqmEW9s6.d.ts.map +1 -0
  82. package/dist/crud.d.ts +2 -98
  83. package/dist/crud.js +3 -71
  84. package/dist/crud.js.map +1 -1
  85. package/dist/currency-constants-Cq_q8twn.d.ts +45 -0
  86. package/dist/currency-constants-Cq_q8twn.d.ts.map +1 -0
  87. package/dist/current-user-Dvf8Ttjo.d.ts +284 -0
  88. package/dist/current-user-Dvf8Ttjo.d.ts.map +1 -0
  89. package/dist/dates-B6ne9iOR.d.ts +23 -0
  90. package/dist/dates-B6ne9iOR.d.ts.map +1 -0
  91. package/dist/email-outbox-BVqBaXpn.d.ts +1464 -0
  92. package/dist/{interface/crud/email-outbox.d.ts.map → email-outbox-BVqBaXpn.d.ts.map} +1 -1
  93. package/dist/emails-Ba4yEaCS.d.ts +40 -0
  94. package/dist/emails-Ba4yEaCS.d.ts.map +1 -0
  95. package/dist/errors-Cl-RUyed.d.ts +238 -0
  96. package/dist/errors-Cl-RUyed.d.ts.map +1 -0
  97. package/dist/esm/ai/image-limits.d.ts.map +1 -1
  98. package/dist/esm/ai/image-limits.js +5 -5
  99. package/dist/esm/ai/image-limits.js.map +1 -1
  100. package/dist/esm/ai/llms/llms.d.ts +1 -1
  101. package/dist/esm/ai/llms/llms.d.ts.map +1 -1
  102. package/dist/esm/ai/llms/llms.js +1 -2
  103. package/dist/esm/ai/llms/llms.js.map +1 -1
  104. package/dist/esm/ai/unified-prompts/reminders.js +1 -2
  105. package/dist/esm/ai/unified-prompts/reminders.js.map +1 -1
  106. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
  107. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +25 -28
  108. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
  109. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/brain.js +1 -2
  110. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/brain.js.map +1 -1
  111. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/cli-help.js +1 -2
  112. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/cli-help.js.map +1 -1
  113. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/config-docs.js +1 -2
  114. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/config-docs.js.map +1 -1
  115. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js +1 -2
  116. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js.map +1 -1
  117. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js +1 -2
  118. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js.map +1 -1
  119. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -1
  120. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +2 -3
  121. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -1
  122. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +1 -1
  123. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -1
  124. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js +1 -2
  125. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js.map +1 -1
  126. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js +1 -2
  127. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js.map +1 -1
  128. package/dist/esm/ai/unified-prompts/skill-site-prompt.d.ts.map +1 -1
  129. package/dist/esm/ai/unified-prompts/skill-site-prompt.js +1 -2
  130. package/dist/esm/ai/unified-prompts/skill-site-prompt.js.map +1 -1
  131. package/dist/esm/apps/apps-config.d.ts.map +1 -1
  132. package/dist/esm/apps/apps-config.js +1 -1
  133. package/dist/esm/apps/apps-config.js.map +1 -1
  134. package/dist/esm/apps/apps-ui.d.ts +2 -3
  135. package/dist/esm/apps/apps-ui.d.ts.map +1 -1
  136. package/dist/esm/apps/apps-ui.js +2 -3
  137. package/dist/esm/apps/apps-ui.js.map +1 -1
  138. package/dist/esm/config/db-sync-mappings.js +1 -1
  139. package/dist/esm/config/db-sync-mappings.js.map +1 -1
  140. package/dist/esm/config/format.d.ts +1 -1
  141. package/dist/esm/config/format.d.ts.map +1 -1
  142. package/dist/esm/config/format.js +1 -190
  143. package/dist/esm/config/format.js.map +1 -1
  144. package/dist/esm/config/migrate-catalogs-to-product-lines.d.ts.map +1 -1
  145. package/dist/esm/config/migrate-catalogs-to-product-lines.js +1 -194
  146. package/dist/esm/config/migrate-catalogs-to-product-lines.js.map +1 -1
  147. package/dist/esm/config/schema-fuzzer.test.js +20 -173
  148. package/dist/esm/config/schema-fuzzer.test.js.map +1 -1
  149. package/dist/esm/config/schema.d.ts +249 -250
  150. package/dist/esm/config/schema.d.ts.map +1 -1
  151. package/dist/esm/config/schema.js +2 -347
  152. package/dist/esm/config/schema.js.map +1 -1
  153. package/dist/esm/config-authoring.d.ts +1 -1
  154. package/dist/esm/config-authoring.d.ts.map +1 -1
  155. package/dist/esm/config-authoring.js +1 -1
  156. package/dist/esm/config-authoring.js.map +1 -1
  157. package/dist/esm/config-authoring.test.js +2 -3
  158. package/dist/esm/config-authoring.test.js.map +1 -1
  159. package/dist/esm/config-eval.d.ts +1 -1
  160. package/dist/esm/config-eval.d.ts.map +1 -1
  161. package/dist/esm/config-eval.js +1 -43
  162. package/dist/esm/config-eval.js.map +1 -1
  163. package/dist/esm/config-rendering.d.ts.map +1 -1
  164. package/dist/esm/config-rendering.js +1 -46
  165. package/dist/esm/config-rendering.js.map +1 -1
  166. package/dist/esm/crud.d.ts +1 -1
  167. package/dist/esm/crud.d.ts.map +1 -1
  168. package/dist/esm/crud.js +2 -69
  169. package/dist/esm/crud.js.map +1 -1
  170. package/dist/esm/helpers/emails.js +1 -2
  171. package/dist/esm/helpers/emails.js.map +1 -1
  172. package/dist/esm/helpers/init-prompt.d.ts.map +1 -1
  173. package/dist/esm/helpers/init-prompt.js +1 -2
  174. package/dist/esm/helpers/init-prompt.js.map +1 -1
  175. package/dist/esm/helpers/password.d.ts +1 -1
  176. package/dist/esm/helpers/password.d.ts.map +1 -1
  177. package/dist/esm/helpers/password.js +1 -2
  178. package/dist/esm/helpers/password.js.map +1 -1
  179. package/dist/esm/helpers/production-mode.d.ts +1 -1
  180. package/dist/esm/helpers/production-mode.d.ts.map +1 -1
  181. package/dist/esm/helpers/production-mode.js +1 -2
  182. package/dist/esm/helpers/production-mode.js.map +1 -1
  183. package/dist/esm/helpers/support-sla.d.ts.map +1 -1
  184. package/dist/esm/helpers/support-sla.js +1 -1
  185. package/dist/esm/helpers/support-sla.js.map +1 -1
  186. package/dist/esm/helpers/support-sla.test.js +2 -3
  187. package/dist/esm/helpers/support-sla.test.js.map +1 -1
  188. package/dist/esm/helpers/vault/client-side.d.ts.map +1 -1
  189. package/dist/esm/helpers/vault/client-side.js +1 -20
  190. package/dist/esm/helpers/vault/client-side.js.map +1 -1
  191. package/dist/esm/helpers/vault/server-side.js +1 -2
  192. package/dist/esm/helpers/vault/server-side.js.map +1 -1
  193. package/dist/esm/hooks/use-async-callback.d.ts.map +1 -1
  194. package/dist/esm/hooks/use-async-callback.js +1 -2
  195. package/dist/esm/hooks/use-async-callback.js.map +1 -1
  196. package/dist/esm/hooks/use-async-external-store.d.ts +1 -1
  197. package/dist/esm/hooks/use-async-external-store.d.ts.map +1 -1
  198. package/dist/esm/hooks/use-async-external-store.js +1 -2
  199. package/dist/esm/hooks/use-async-external-store.js.map +1 -1
  200. package/dist/esm/hooks/use-hash.js +1 -2
  201. package/dist/esm/hooks/use-hash.js.map +1 -1
  202. package/dist/esm/hooks/use-hover.d.ts.map +1 -1
  203. package/dist/esm/hooks/use-hover.js +1 -2
  204. package/dist/esm/hooks/use-hover.js.map +1 -1
  205. package/dist/esm/hooks/use-strict-memo.d.ts.map +1 -1
  206. package/dist/esm/hooks/use-strict-memo.js +1 -70
  207. package/dist/esm/hooks/use-strict-memo.js.map +1 -1
  208. package/dist/esm/index.d.ts +4 -4
  209. package/dist/esm/index.js +1 -2
  210. package/dist/esm/interface/admin-interface.d.ts +19 -19
  211. package/dist/esm/interface/admin-interface.d.ts.map +1 -1
  212. package/dist/esm/interface/admin-interface.js +1 -2
  213. package/dist/esm/interface/admin-interface.js.map +1 -1
  214. package/dist/esm/interface/admin-metrics.d.ts +11 -11
  215. package/dist/esm/interface/admin-metrics.d.ts.map +1 -1
  216. package/dist/esm/interface/admin-metrics.js +1 -2
  217. package/dist/esm/interface/admin-metrics.js.map +1 -1
  218. package/dist/esm/interface/client-interface.d.ts +22 -22
  219. package/dist/esm/interface/client-interface.d.ts.map +1 -1
  220. package/dist/esm/interface/client-interface.js +31 -15
  221. package/dist/esm/interface/client-interface.js.map +1 -1
  222. package/dist/esm/interface/client-interface.test.js +84 -13
  223. package/dist/esm/interface/client-interface.test.js.map +1 -1
  224. package/dist/esm/interface/conversations.d.ts +33 -33
  225. package/dist/esm/interface/conversations.d.ts.map +1 -1
  226. package/dist/esm/interface/conversations.js +1 -2
  227. package/dist/esm/interface/conversations.js.map +1 -1
  228. package/dist/esm/interface/crud/analytics.d.ts.map +1 -1
  229. package/dist/esm/interface/crud/analytics.js +1 -1
  230. package/dist/esm/interface/crud/connected-accounts.d.ts +15 -17
  231. package/dist/esm/interface/crud/connected-accounts.d.ts.map +1 -1
  232. package/dist/esm/interface/crud/connected-accounts.js +1 -2
  233. package/dist/esm/interface/crud/connected-accounts.js.map +1 -1
  234. package/dist/esm/interface/crud/contact-channels.d.ts +24 -26
  235. package/dist/esm/interface/crud/contact-channels.d.ts.map +1 -1
  236. package/dist/esm/interface/crud/contact-channels.js +1 -2
  237. package/dist/esm/interface/crud/contact-channels.js.map +1 -1
  238. package/dist/esm/interface/crud/current-user.d.ts +20 -22
  239. package/dist/esm/interface/crud/current-user.d.ts.map +1 -1
  240. package/dist/esm/interface/crud/current-user.js +25 -29
  241. package/dist/esm/interface/crud/current-user.js.map +1 -1
  242. package/dist/esm/interface/crud/email-outbox.d.ts +32 -34
  243. package/dist/esm/interface/crud/email-outbox.d.ts.map +1 -1
  244. package/dist/esm/interface/crud/email-outbox.js +1 -2
  245. package/dist/esm/interface/crud/email-outbox.js.map +1 -1
  246. package/dist/esm/interface/crud/email-templates.d.ts +16 -18
  247. package/dist/esm/interface/crud/email-templates.d.ts.map +1 -1
  248. package/dist/esm/interface/crud/email-templates.js +1 -2
  249. package/dist/esm/interface/crud/email-templates.js.map +1 -1
  250. package/dist/esm/interface/crud/emails.d.ts +6 -8
  251. package/dist/esm/interface/crud/emails.d.ts.map +1 -1
  252. package/dist/esm/interface/crud/emails.js +1 -2
  253. package/dist/esm/interface/crud/emails.js.map +1 -1
  254. package/dist/esm/interface/crud/internal-api-keys.d.ts +16 -18
  255. package/dist/esm/interface/crud/internal-api-keys.d.ts.map +1 -1
  256. package/dist/esm/interface/crud/internal-api-keys.js +1 -2
  257. package/dist/esm/interface/crud/internal-api-keys.js.map +1 -1
  258. package/dist/esm/interface/crud/invoices.d.ts +2 -2
  259. package/dist/esm/interface/crud/invoices.d.ts.map +1 -1
  260. package/dist/esm/interface/crud/invoices.js +1 -2
  261. package/dist/esm/interface/crud/invoices.js.map +1 -1
  262. package/dist/esm/interface/crud/items.d.ts +6 -8
  263. package/dist/esm/interface/crud/items.d.ts.map +1 -1
  264. package/dist/esm/interface/crud/items.js +12 -16
  265. package/dist/esm/interface/crud/items.js.map +1 -1
  266. package/dist/esm/interface/crud/notification-preferences.d.ts +6 -8
  267. package/dist/esm/interface/crud/notification-preferences.d.ts.map +1 -1
  268. package/dist/esm/interface/crud/notification-preferences.js +8 -12
  269. package/dist/esm/interface/crud/notification-preferences.js.map +1 -1
  270. package/dist/esm/interface/crud/oauth-providers.d.ts +24 -26
  271. package/dist/esm/interface/crud/oauth-providers.d.ts.map +1 -1
  272. package/dist/esm/interface/crud/oauth-providers.js +1 -2
  273. package/dist/esm/interface/crud/oauth-providers.js.map +1 -1
  274. package/dist/esm/interface/crud/products.d.ts +21 -22
  275. package/dist/esm/interface/crud/products.d.ts.map +1 -1
  276. package/dist/esm/interface/crud/products.js +3 -2
  277. package/dist/esm/interface/crud/products.js.map +1 -1
  278. package/dist/esm/interface/crud/project-api-keys.d.ts +5 -6
  279. package/dist/esm/interface/crud/project-api-keys.d.ts.map +1 -1
  280. package/dist/esm/interface/crud/project-api-keys.js +1 -2
  281. package/dist/esm/interface/crud/project-api-keys.js.map +1 -1
  282. package/dist/esm/interface/crud/project-permissions.d.ts +29 -31
  283. package/dist/esm/interface/crud/project-permissions.d.ts.map +1 -1
  284. package/dist/esm/interface/crud/project-permissions.js +1 -2
  285. package/dist/esm/interface/crud/project-permissions.js.map +1 -1
  286. package/dist/esm/interface/crud/projects.d.ts +71 -73
  287. package/dist/esm/interface/crud/projects.d.ts.map +1 -1
  288. package/dist/esm/interface/crud/projects.js +3 -2
  289. package/dist/esm/interface/crud/projects.js.map +1 -1
  290. package/dist/esm/interface/crud/session-replays.d.ts.map +1 -1
  291. package/dist/esm/interface/crud/session-replays.js +1 -1
  292. package/dist/esm/interface/crud/sessions.d.ts +15 -17
  293. package/dist/esm/interface/crud/sessions.d.ts.map +1 -1
  294. package/dist/esm/interface/crud/sessions.js +1 -2
  295. package/dist/esm/interface/crud/sessions.js.map +1 -1
  296. package/dist/esm/interface/crud/sign-up-rules.d.ts.map +1 -1
  297. package/dist/esm/interface/crud/sign-up-rules.js +1 -1
  298. package/dist/esm/interface/crud/svix-token.d.ts +8 -10
  299. package/dist/esm/interface/crud/svix-token.d.ts.map +1 -1
  300. package/dist/esm/interface/crud/svix-token.js +1 -2
  301. package/dist/esm/interface/crud/svix-token.js.map +1 -1
  302. package/dist/esm/interface/crud/team-invitation-details.d.ts +6 -8
  303. package/dist/esm/interface/crud/team-invitation-details.d.ts.map +1 -1
  304. package/dist/esm/interface/crud/team-invitation-details.js +1 -2
  305. package/dist/esm/interface/crud/team-invitation-details.js.map +1 -1
  306. package/dist/esm/interface/crud/team-invitation.d.ts +7 -9
  307. package/dist/esm/interface/crud/team-invitation.d.ts.map +1 -1
  308. package/dist/esm/interface/crud/team-invitation.js +1 -2
  309. package/dist/esm/interface/crud/team-invitation.js.map +1 -1
  310. package/dist/esm/interface/crud/team-member-profiles.d.ts +26 -28
  311. package/dist/esm/interface/crud/team-member-profiles.d.ts.map +1 -1
  312. package/dist/esm/interface/crud/team-member-profiles.js +1 -2
  313. package/dist/esm/interface/crud/team-member-profiles.js.map +1 -1
  314. package/dist/esm/interface/crud/team-memberships.d.ts +14 -16
  315. package/dist/esm/interface/crud/team-memberships.d.ts.map +1 -1
  316. package/dist/esm/interface/crud/team-memberships.js +1 -2
  317. package/dist/esm/interface/crud/team-memberships.js.map +1 -1
  318. package/dist/esm/interface/crud/team-permissions.d.ts +29 -31
  319. package/dist/esm/interface/crud/team-permissions.d.ts.map +1 -1
  320. package/dist/esm/interface/crud/team-permissions.js +1 -2
  321. package/dist/esm/interface/crud/team-permissions.js.map +1 -1
  322. package/dist/esm/interface/crud/teams.d.ts +36 -38
  323. package/dist/esm/interface/crud/teams.d.ts.map +1 -1
  324. package/dist/esm/interface/crud/teams.js +2 -4
  325. package/dist/esm/interface/crud/teams.js.map +1 -1
  326. package/dist/esm/interface/crud/transactions.d.ts +14 -16
  327. package/dist/esm/interface/crud/transactions.d.ts.map +1 -1
  328. package/dist/esm/interface/crud/transactions.js +7 -13
  329. package/dist/esm/interface/crud/transactions.js.map +1 -1
  330. package/dist/esm/interface/crud/users.d.ts +11 -12
  331. package/dist/esm/interface/crud/users.d.ts.map +1 -1
  332. package/dist/esm/interface/crud/users.js +9 -5
  333. package/dist/esm/interface/crud/users.js.map +1 -1
  334. package/dist/esm/interface/handler-urls.d.ts +1 -1
  335. package/dist/esm/interface/handler-urls.d.ts.map +1 -1
  336. package/dist/esm/interface/handler-urls.js +1 -2
  337. package/dist/esm/interface/page-component-versions.d.ts +1 -1
  338. package/dist/esm/interface/page-component-versions.d.ts.map +1 -1
  339. package/dist/esm/interface/page-component-versions.js +1 -2
  340. package/dist/esm/interface/page-component-versions.js.map +1 -1
  341. package/dist/esm/interface/plan-usage.d.ts +1 -1
  342. package/dist/esm/interface/plan-usage.d.ts.map +1 -1
  343. package/dist/esm/interface/plan-usage.js +1 -2
  344. package/dist/esm/interface/plan-usage.js.map +1 -1
  345. package/dist/esm/interface/server-interface.d.ts +19 -19
  346. package/dist/esm/interface/server-interface.d.ts.map +1 -1
  347. package/dist/esm/interface/server-interface.js +1 -2
  348. package/dist/esm/interface/server-interface.js.map +1 -1
  349. package/dist/esm/interface/webhooks.d.ts +2 -2
  350. package/dist/esm/interface/webhooks.d.ts.map +1 -1
  351. package/dist/esm/interface/webhooks.js +1 -2
  352. package/dist/esm/interface/webhooks.js.map +1 -1
  353. package/dist/esm/known-errors.d.ts +2 -2
  354. package/dist/esm/known-errors.d.ts.map +1 -1
  355. package/dist/esm/known-errors.js +10 -21
  356. package/dist/esm/known-errors.js.map +1 -1
  357. package/dist/esm/payments/payment-methods.d.ts.map +1 -1
  358. package/dist/esm/payments/payment-methods.js +1 -1
  359. package/dist/esm/payments/payment-methods.js.map +1 -1
  360. package/dist/esm/payments/stripe-limits.d.ts.map +1 -1
  361. package/dist/esm/payments/stripe-limits.js +1 -1
  362. package/dist/esm/payments/stripe-limits.js.map +1 -1
  363. package/dist/esm/plans.d.ts.map +1 -1
  364. package/dist/esm/plans.js +1 -1
  365. package/dist/esm/plans.js.map +1 -1
  366. package/dist/esm/schema-fields.d.ts +14 -14
  367. package/dist/esm/schema-fields.d.ts.map +1 -1
  368. package/dist/esm/schema-fields.js +3 -64
  369. package/dist/esm/schema-fields.js.map +1 -1
  370. package/dist/esm/sessions.d.ts +6 -6
  371. package/dist/esm/sessions.d.ts.map +1 -1
  372. package/dist/esm/sessions.js +1 -2
  373. package/dist/esm/sessions.js.map +1 -1
  374. package/dist/esm/sessions.test.js +2 -3
  375. package/dist/esm/sessions.test.js.map +1 -1
  376. package/dist/esm/utils/analytics-clickmap-overlay.d.ts.map +1 -1
  377. package/dist/esm/utils/analytics-clickmap-overlay.js +1 -1
  378. package/dist/esm/utils/api-keys.d.ts.map +1 -1
  379. package/dist/esm/utils/api-keys.js +1 -2
  380. package/dist/esm/utils/api-keys.js.map +1 -1
  381. package/dist/esm/utils/arrays.d.ts.map +1 -1
  382. package/dist/esm/utils/arrays.js +1 -470
  383. package/dist/esm/utils/arrays.js.map +1 -1
  384. package/dist/esm/utils/auth-methods.d.ts.map +1 -1
  385. package/dist/esm/utils/auth-methods.js +1 -1
  386. package/dist/esm/utils/auth-methods.js.map +1 -1
  387. package/dist/esm/utils/base64.d.ts.map +1 -1
  388. package/dist/esm/utils/base64.js +1 -10
  389. package/dist/esm/utils/base64.js.map +1 -1
  390. package/dist/esm/utils/booleans.d.ts.map +1 -1
  391. package/dist/esm/utils/booleans.js +1 -25
  392. package/dist/esm/utils/booleans.js.map +1 -1
  393. package/dist/esm/utils/browser-compat.d.ts.map +1 -1
  394. package/dist/esm/utils/browser-compat.js +1 -1
  395. package/dist/esm/utils/browser-compat.js.map +1 -1
  396. package/dist/esm/utils/bytes.d.ts.map +1 -1
  397. package/dist/esm/utils/bytes.js +3 -198
  398. package/dist/esm/utils/bytes.js.map +1 -1
  399. package/dist/esm/utils/caches.d.ts +1 -1
  400. package/dist/esm/utils/caches.d.ts.map +1 -1
  401. package/dist/esm/utils/caches.js +1 -27
  402. package/dist/esm/utils/caches.js.map +1 -1
  403. package/dist/esm/utils/cel-fields.d.ts.map +1 -1
  404. package/dist/esm/utils/cel-fields.js +1 -2
  405. package/dist/esm/utils/cel-fields.js.map +1 -1
  406. package/dist/esm/utils/cloud-hosts.d.ts.map +1 -1
  407. package/dist/esm/utils/cloud-hosts.js +1 -27
  408. package/dist/esm/utils/cloud-hosts.js.map +1 -1
  409. package/dist/esm/utils/compile-time.d.ts.map +1 -1
  410. package/dist/esm/utils/compile-time.js +1 -1
  411. package/dist/esm/utils/compile-time.js.map +1 -1
  412. package/dist/esm/utils/country-codes.d.ts.map +1 -1
  413. package/dist/esm/utils/country-codes.js +1 -16
  414. package/dist/esm/utils/country-codes.js.map +1 -1
  415. package/dist/esm/utils/crypto.d.ts.map +1 -1
  416. package/dist/esm/utils/crypto.js +3 -113
  417. package/dist/esm/utils/crypto.js.map +1 -1
  418. package/dist/esm/utils/currencies.d.ts +1 -1
  419. package/dist/esm/utils/currencies.d.ts.map +1 -1
  420. package/dist/esm/utils/currencies.js +2 -37
  421. package/dist/esm/utils/currencies.js.map +1 -1
  422. package/dist/esm/utils/currency-constants.d.ts.map +1 -1
  423. package/dist/esm/utils/currency-constants.js +1 -1
  424. package/dist/esm/utils/currency-constants.js.map +1 -1
  425. package/dist/esm/utils/dates.d.ts.map +1 -1
  426. package/dist/esm/utils/dates.js +1 -44
  427. package/dist/esm/utils/dates.js.map +1 -1
  428. package/dist/esm/utils/dev-env-state-path.d.ts.map +1 -1
  429. package/dist/esm/utils/dev-env-state-path.js +1 -2
  430. package/dist/esm/utils/dev-env-state-path.js.map +1 -1
  431. package/dist/esm/utils/dev-tool.d.ts.map +1 -1
  432. package/dist/esm/utils/dev-tool.js +1 -1
  433. package/dist/esm/utils/dom.d.ts.map +1 -1
  434. package/dist/esm/utils/dom.js +1 -1
  435. package/dist/esm/utils/dom.js.map +1 -1
  436. package/dist/esm/utils/elements-chain.d.ts.map +1 -1
  437. package/dist/esm/utils/elements-chain.js +5 -50
  438. package/dist/esm/utils/elements-chain.js.map +1 -1
  439. package/dist/esm/utils/env.d.ts.map +1 -1
  440. package/dist/esm/utils/env.js +1 -2
  441. package/dist/esm/utils/env.js.map +1 -1
  442. package/dist/esm/utils/env.test.js +2 -3
  443. package/dist/esm/utils/env.test.js.map +1 -1
  444. package/dist/esm/utils/errors.d.ts +1 -1
  445. package/dist/esm/utils/errors.d.ts.map +1 -1
  446. package/dist/esm/utils/errors.js +1 -2
  447. package/dist/esm/utils/errors.js.map +1 -1
  448. package/dist/esm/utils/esbuild.d.ts +1 -1
  449. package/dist/esm/utils/esbuild.d.ts.map +1 -1
  450. package/dist/esm/utils/esbuild.js +2 -3
  451. package/dist/esm/utils/esbuild.js.map +1 -1
  452. package/dist/esm/utils/featurebase.d.ts.map +1 -1
  453. package/dist/esm/utils/featurebase.js +1 -2
  454. package/dist/esm/utils/featurebase.js.map +1 -1
  455. package/dist/esm/utils/fs.d.ts.map +1 -1
  456. package/dist/esm/utils/fs.js +1 -2
  457. package/dist/esm/utils/fs.js.map +1 -1
  458. package/dist/esm/utils/functions.d.ts.map +1 -1
  459. package/dist/esm/utils/functions.js +1 -24
  460. package/dist/esm/utils/functions.js.map +1 -1
  461. package/dist/esm/utils/geo.d.ts.map +1 -1
  462. package/dist/esm/utils/geo.js +1 -2
  463. package/dist/esm/utils/geo.js.map +1 -1
  464. package/dist/esm/utils/globals.d.ts.map +1 -1
  465. package/dist/esm/utils/globals.js +1 -1
  466. package/dist/esm/utils/globals.js.map +1 -1
  467. package/dist/esm/utils/hashes.d.ts.map +1 -1
  468. package/dist/esm/utils/hashes.js +1 -2
  469. package/dist/esm/utils/hashes.js.map +1 -1
  470. package/dist/esm/utils/html.d.ts.map +1 -1
  471. package/dist/esm/utils/html.js +1 -19
  472. package/dist/esm/utils/html.js.map +1 -1
  473. package/dist/esm/utils/http.d.ts.map +1 -1
  474. package/dist/esm/utils/http.js +1 -19
  475. package/dist/esm/utils/http.js.map +1 -1
  476. package/dist/esm/utils/ips.d.ts.map +1 -1
  477. package/dist/esm/utils/ips.js +1 -25
  478. package/dist/esm/utils/ips.js.map +1 -1
  479. package/dist/esm/utils/json.d.ts +1 -1
  480. package/dist/esm/utils/json.d.ts.map +1 -1
  481. package/dist/esm/utils/json.js +1 -155
  482. package/dist/esm/utils/json.js.map +1 -1
  483. package/dist/esm/utils/jsx-editable-transpiler.d.ts.map +1 -1
  484. package/dist/esm/utils/jsx-editable-transpiler.js +1 -2
  485. package/dist/esm/utils/jsx-editable-transpiler.js.map +1 -1
  486. package/dist/esm/utils/jsx-editable-transpiler.test.js +2 -3
  487. package/dist/esm/utils/jsx-editable-transpiler.test.js.map +1 -1
  488. package/dist/esm/utils/jwt.d.ts.map +1 -1
  489. package/dist/esm/utils/jwt.js +1 -2
  490. package/dist/esm/utils/jwt.js.map +1 -1
  491. package/dist/esm/utils/locks.d.ts.map +1 -1
  492. package/dist/esm/utils/locks.js +1 -2
  493. package/dist/esm/utils/locks.js.map +1 -1
  494. package/dist/esm/utils/maps.d.ts.map +1 -1
  495. package/dist/esm/utils/maps.js +1 -111
  496. package/dist/esm/utils/maps.js.map +1 -1
  497. package/dist/esm/utils/math.d.ts.map +1 -1
  498. package/dist/esm/utils/math.js +1 -11
  499. package/dist/esm/utils/math.js.map +1 -1
  500. package/dist/esm/utils/monkey-patch.d.ts.map +1 -1
  501. package/dist/esm/utils/monkey-patch.js +2 -3
  502. package/dist/esm/utils/monkey-patch.js.map +1 -1
  503. package/dist/esm/utils/node-http.js +1 -2
  504. package/dist/esm/utils/node-http.js.map +1 -1
  505. package/dist/esm/utils/numbers.d.ts.map +1 -1
  506. package/dist/esm/utils/numbers.js +1 -45
  507. package/dist/esm/utils/numbers.js.map +1 -1
  508. package/dist/esm/utils/oauth.d.ts.map +1 -1
  509. package/dist/esm/utils/oauth.js +1 -1
  510. package/dist/esm/utils/oauth.js.map +1 -1
  511. package/dist/esm/utils/objects.d.ts.map +1 -1
  512. package/dist/esm/utils/objects.js +1 -622
  513. package/dist/esm/utils/objects.js.map +1 -1
  514. package/dist/esm/utils/paginated-lists.d.ts.map +1 -1
  515. package/dist/esm/utils/paginated-lists.js +1 -2
  516. package/dist/esm/utils/paginated-lists.js.map +1 -1
  517. package/dist/esm/utils/paginated-lists.test.js +2 -3
  518. package/dist/esm/utils/paginated-lists.test.js.map +1 -1
  519. package/dist/esm/utils/passkey.d.ts +1 -1
  520. package/dist/esm/utils/passkey.js +1 -1
  521. package/dist/esm/utils/promises.d.ts +1 -1
  522. package/dist/esm/utils/promises.d.ts.map +1 -1
  523. package/dist/esm/utils/promises.js +1 -160
  524. package/dist/esm/utils/promises.js.map +1 -1
  525. package/dist/esm/utils/proxies.d.ts.map +1 -1
  526. package/dist/esm/utils/proxies.js +1 -37
  527. package/dist/esm/utils/proxies.js.map +1 -1
  528. package/dist/esm/utils/react.d.ts.map +1 -1
  529. package/dist/esm/utils/react.js +1 -41
  530. package/dist/esm/utils/react.js.map +1 -1
  531. package/dist/esm/utils/redirect-urls.d.ts.map +1 -1
  532. package/dist/esm/utils/redirect-urls.js +2 -92
  533. package/dist/esm/utils/redirect-urls.js.map +1 -1
  534. package/dist/esm/utils/regex.js +1 -1
  535. package/dist/esm/utils/regex.js.map +1 -1
  536. package/dist/esm/utils/results.d.ts.map +1 -1
  537. package/dist/esm/utils/results.js +1 -213
  538. package/dist/esm/utils/results.js.map +1 -1
  539. package/dist/esm/utils/sentry.js +1 -1
  540. package/dist/esm/utils/sentry.js.map +1 -1
  541. package/dist/esm/utils/stores.d.ts +3 -3
  542. package/dist/esm/utils/stores.d.ts.map +1 -1
  543. package/dist/esm/utils/stores.js +1 -2
  544. package/dist/esm/utils/stores.js.map +1 -1
  545. package/dist/esm/utils/strings.d.ts.map +1 -1
  546. package/dist/esm/utils/strings.js +1 -251
  547. package/dist/esm/utils/strings.js.map +1 -1
  548. package/dist/esm/utils/strings.nicify.test.js +2 -3
  549. package/dist/esm/utils/strings.nicify.test.js.map +1 -1
  550. package/dist/esm/utils/telemetry.d.ts.map +1 -1
  551. package/dist/esm/utils/telemetry.js +1 -2
  552. package/dist/esm/utils/telemetry.js.map +1 -1
  553. package/dist/esm/utils/turnstile-browser.d.ts +1 -1
  554. package/dist/esm/utils/turnstile-browser.d.ts.map +1 -1
  555. package/dist/esm/utils/turnstile-browser.js +1 -2
  556. package/dist/esm/utils/turnstile-browser.js.map +1 -1
  557. package/dist/esm/utils/turnstile-flow.d.ts +1 -1
  558. package/dist/esm/utils/turnstile-flow.d.ts.map +1 -1
  559. package/dist/esm/utils/turnstile-flow.js +1 -2
  560. package/dist/esm/utils/turnstile-flow.js.map +1 -1
  561. package/dist/esm/utils/turnstile-flow.test.js +2 -3
  562. package/dist/esm/utils/turnstile-flow.test.js.map +1 -1
  563. package/dist/esm/utils/turnstile.d.ts.map +1 -1
  564. package/dist/esm/utils/turnstile.js +1 -1
  565. package/dist/esm/utils/turnstile.js.map +1 -1
  566. package/dist/esm/utils/typed-arrays.js +1 -2
  567. package/dist/esm/utils/typed-arrays.js.map +1 -1
  568. package/dist/esm/utils/types.d.ts +1 -1
  569. package/dist/esm/utils/types.d.ts.map +1 -1
  570. package/dist/esm/utils/types.js +1 -1
  571. package/dist/esm/utils/types.js.map +1 -1
  572. package/dist/esm/utils/unicode.d.ts.map +1 -1
  573. package/dist/esm/utils/unicode.js +1 -13
  574. package/dist/esm/utils/unicode.js.map +1 -1
  575. package/dist/esm/utils/urls.d.ts.map +1 -1
  576. package/dist/esm/utils/urls.js +1 -151
  577. package/dist/esm/utils/urls.js.map +1 -1
  578. package/dist/esm/utils/uuids.d.ts.map +1 -1
  579. package/dist/esm/utils/uuids.js +2 -26
  580. package/dist/esm/utils/uuids.js.map +1 -1
  581. package/dist/format-4JG1MGv5.d.ts +61 -0
  582. package/dist/format-4JG1MGv5.d.ts.map +1 -0
  583. package/dist/handler-urls-BHt3v8Ai.d.ts +70 -0
  584. package/dist/handler-urls-BHt3v8Ai.d.ts.map +1 -0
  585. package/dist/helpers/emails.js +2 -4
  586. package/dist/helpers/emails.js.map +1 -1
  587. package/dist/helpers/init-prompt.d.ts.map +1 -1
  588. package/dist/helpers/init-prompt.js +2 -4
  589. package/dist/helpers/init-prompt.js.map +1 -1
  590. package/dist/helpers/password.d.ts +1 -1
  591. package/dist/helpers/password.d.ts.map +1 -1
  592. package/dist/helpers/password.js +2 -4
  593. package/dist/helpers/password.js.map +1 -1
  594. package/dist/helpers/production-mode.d.ts +1 -1
  595. package/dist/helpers/production-mode.d.ts.map +1 -1
  596. package/dist/helpers/production-mode.js +2 -4
  597. package/dist/helpers/production-mode.js.map +1 -1
  598. package/dist/helpers/support-sla.d.ts.map +1 -1
  599. package/dist/helpers/support-sla.js +2 -3
  600. package/dist/helpers/support-sla.js.map +1 -1
  601. package/dist/helpers/support-sla.test.js +1 -3
  602. package/dist/helpers/support-sla.test.js.map +1 -1
  603. package/dist/helpers/vault/client-side.d.ts.map +1 -1
  604. package/dist/helpers/vault/client-side.js +2 -22
  605. package/dist/helpers/vault/client-side.js.map +1 -1
  606. package/dist/helpers/vault/server-side.js +2 -4
  607. package/dist/helpers/vault/server-side.js.map +1 -1
  608. package/dist/hooks/use-async-callback.d.ts.map +1 -1
  609. package/dist/hooks/use-async-callback.js +4 -5
  610. package/dist/hooks/use-async-callback.js.map +1 -1
  611. package/dist/hooks/use-async-external-store.d.ts +1 -1
  612. package/dist/hooks/use-async-external-store.d.ts.map +1 -1
  613. package/dist/hooks/use-async-external-store.js +2 -4
  614. package/dist/hooks/use-async-external-store.js.map +1 -1
  615. package/dist/hooks/use-hash.js +2 -4
  616. package/dist/hooks/use-hash.js.map +1 -1
  617. package/dist/hooks/use-hover.d.ts.map +1 -1
  618. package/dist/hooks/use-hover.js +2 -4
  619. package/dist/hooks/use-hover.js.map +1 -1
  620. package/dist/hooks/use-strict-memo.d.ts.map +1 -1
  621. package/dist/hooks/use-strict-memo.js +2 -72
  622. package/dist/hooks/use-strict-memo.js.map +1 -1
  623. package/dist/index.d.ts +4 -4
  624. package/dist/index.js +27 -29
  625. package/dist/interface/admin-interface.d.ts +3 -379
  626. package/dist/interface/admin-interface.js +2 -4
  627. package/dist/interface/admin-interface.js.map +1 -1
  628. package/dist/interface/admin-metrics.d.ts +2 -807
  629. package/dist/interface/admin-metrics.js +2 -4
  630. package/dist/interface/admin-metrics.js.map +1 -1
  631. package/dist/interface/client-interface.d.ts +2 -447
  632. package/dist/interface/client-interface.js +32 -17
  633. package/dist/interface/client-interface.js.map +1 -1
  634. package/dist/interface/client-interface.test.js +83 -13
  635. package/dist/interface/client-interface.test.js.map +1 -1
  636. package/dist/interface/conversations.d.ts +33 -33
  637. package/dist/interface/conversations.d.ts.map +1 -1
  638. package/dist/interface/conversations.js +2 -4
  639. package/dist/interface/conversations.js.map +1 -1
  640. package/dist/interface/crud/analytics.d.ts +2 -14
  641. package/dist/interface/crud/connected-accounts.d.ts +2 -68
  642. package/dist/interface/crud/connected-accounts.js +2 -4
  643. package/dist/interface/crud/connected-accounts.js.map +1 -1
  644. package/dist/interface/crud/contact-channels.d.ts +2 -181
  645. package/dist/interface/crud/contact-channels.js +2 -4
  646. package/dist/interface/crud/contact-channels.js.map +1 -1
  647. package/dist/interface/crud/current-user.d.ts +2 -285
  648. package/dist/interface/crud/current-user.js +2 -4
  649. package/dist/interface/crud/current-user.js.map +1 -1
  650. package/dist/interface/crud/email-outbox.d.ts +2 -1465
  651. package/dist/interface/crud/email-outbox.js +4 -5
  652. package/dist/interface/crud/email-outbox.js.map +1 -1
  653. package/dist/interface/crud/email-templates.d.ts +15 -16
  654. package/dist/interface/crud/email-templates.d.ts.map +1 -1
  655. package/dist/interface/crud/email-templates.js +2 -4
  656. package/dist/interface/crud/email-templates.js.map +1 -1
  657. package/dist/interface/crud/emails.d.ts +2 -41
  658. package/dist/interface/crud/emails.js +4 -5
  659. package/dist/interface/crud/emails.js.map +1 -1
  660. package/dist/interface/crud/internal-api-keys.d.ts +2 -140
  661. package/dist/interface/crud/internal-api-keys.js +2 -4
  662. package/dist/interface/crud/internal-api-keys.js.map +1 -1
  663. package/dist/interface/crud/invoices.d.ts +2 -43
  664. package/dist/interface/crud/invoices.js +2 -4
  665. package/dist/interface/crud/invoices.js.map +1 -1
  666. package/dist/interface/crud/items.d.ts +2 -30
  667. package/dist/interface/crud/items.js +2 -4
  668. package/dist/interface/crud/items.js.map +1 -1
  669. package/dist/interface/crud/notification-preferences.d.ts +2 -38
  670. package/dist/interface/crud/notification-preferences.js +2 -4
  671. package/dist/interface/crud/notification-preferences.js.map +1 -1
  672. package/dist/interface/crud/oauth-providers.d.ts +2 -186
  673. package/dist/interface/crud/oauth-providers.js +2 -4
  674. package/dist/interface/crud/oauth-providers.js.map +1 -1
  675. package/dist/interface/crud/products.d.ts +2 -182
  676. package/dist/interface/crud/products.js +4 -4
  677. package/dist/interface/crud/products.js.map +1 -1
  678. package/dist/interface/crud/project-api-keys.d.ts +2 -203
  679. package/dist/interface/crud/project-api-keys.js +2 -4
  680. package/dist/interface/crud/project-api-keys.js.map +1 -1
  681. package/dist/interface/crud/project-permissions.d.ts +2 -161
  682. package/dist/interface/crud/project-permissions.js +4 -5
  683. package/dist/interface/crud/project-permissions.js.map +1 -1
  684. package/dist/interface/crud/projects.d.ts +2 -901
  685. package/dist/interface/crud/projects.js +6 -5
  686. package/dist/interface/crud/projects.js.map +1 -1
  687. package/dist/interface/crud/session-replays.d.ts +2 -83
  688. package/dist/interface/crud/sessions.d.ts +2 -150
  689. package/dist/interface/crud/sessions.js +2 -4
  690. package/dist/interface/crud/sessions.js.map +1 -1
  691. package/dist/interface/crud/sign-up-rules.d.ts.map +1 -1
  692. package/dist/interface/crud/svix-token.d.ts +2 -31
  693. package/dist/interface/crud/svix-token.js +2 -4
  694. package/dist/interface/crud/svix-token.js.map +1 -1
  695. package/dist/interface/crud/team-invitation-details.d.ts +5 -6
  696. package/dist/interface/crud/team-invitation-details.d.ts.map +1 -1
  697. package/dist/interface/crud/team-invitation-details.js +4 -5
  698. package/dist/interface/crud/team-invitation-details.js.map +1 -1
  699. package/dist/interface/crud/team-invitation.d.ts +2 -54
  700. package/dist/interface/crud/team-invitation.js +4 -5
  701. package/dist/interface/crud/team-invitation.js.map +1 -1
  702. package/dist/interface/crud/team-member-profiles.d.ts +2 -286
  703. package/dist/interface/crud/team-member-profiles.js +4 -5
  704. package/dist/interface/crud/team-member-profiles.js.map +1 -1
  705. package/dist/interface/crud/team-memberships.d.ts +2 -75
  706. package/dist/interface/crud/team-memberships.js +2 -4
  707. package/dist/interface/crud/team-memberships.js.map +1 -1
  708. package/dist/interface/crud/team-permissions.d.ts +2 -169
  709. package/dist/interface/crud/team-permissions.js +4 -5
  710. package/dist/interface/crud/team-permissions.js.map +1 -1
  711. package/dist/interface/crud/teams.d.ts +2 -299
  712. package/dist/interface/crud/teams.js +5 -7
  713. package/dist/interface/crud/teams.js.map +1 -1
  714. package/dist/interface/crud/transactions.d.ts +2 -183
  715. package/dist/interface/crud/transactions.js +2 -4
  716. package/dist/interface/crud/transactions.js.map +1 -1
  717. package/dist/interface/crud/users.d.ts +2 -653
  718. package/dist/interface/crud/users.js +12 -8
  719. package/dist/interface/crud/users.js.map +1 -1
  720. package/dist/interface/handler-urls.d.ts +2 -51
  721. package/dist/interface/handler-urls.js +12 -14
  722. package/dist/interface/page-component-versions.d.ts +2 -25
  723. package/dist/interface/page-component-versions.js +2 -4
  724. package/dist/interface/page-component-versions.js.map +1 -1
  725. package/dist/interface/plan-usage.d.ts +2 -57
  726. package/dist/interface/plan-usage.js +2 -4
  727. package/dist/interface/plan-usage.js.map +1 -1
  728. package/dist/interface/server-interface.d.ts +2 -257
  729. package/dist/interface/server-interface.js +2 -4
  730. package/dist/interface/server-interface.js.map +1 -1
  731. package/dist/interface/webhooks.d.ts +2 -326
  732. package/dist/interface/webhooks.js +2 -4
  733. package/dist/interface/webhooks.js.map +1 -1
  734. package/dist/internal-api-keys-D8IYDodH.d.ts +139 -0
  735. package/dist/internal-api-keys-D8IYDodH.d.ts.map +1 -0
  736. package/dist/invoices-U65KzAZX.d.ts +43 -0
  737. package/dist/invoices-U65KzAZX.d.ts.map +1 -0
  738. package/dist/items-DlLSlVUD.d.ts +29 -0
  739. package/dist/items-DlLSlVUD.d.ts.map +1 -0
  740. package/dist/json-a1QIXu5z.d.ts +15 -0
  741. package/dist/json-a1QIXu5z.d.ts.map +1 -0
  742. package/dist/known-errors-Bm4a61wL.d.ts +575 -0
  743. package/dist/known-errors-Bm4a61wL.d.ts.map +1 -0
  744. package/dist/known-errors.d.ts +2 -575
  745. package/dist/known-errors.js +11 -23
  746. package/dist/known-errors.js.map +1 -1
  747. package/dist/notification-preferences-Bmzr_EOY.d.ts +37 -0
  748. package/dist/notification-preferences-Bmzr_EOY.d.ts.map +1 -0
  749. package/dist/oauth-providers-BMkKSSlA.d.ts +185 -0
  750. package/dist/oauth-providers-BMkKSSlA.d.ts.map +1 -0
  751. package/dist/objects-DkCkeBWE.d.ts +59 -0
  752. package/dist/objects-DkCkeBWE.d.ts.map +1 -0
  753. package/dist/passkey-CKg87UH-.d.ts +2 -0
  754. package/dist/payments/payment-methods.d.ts.map +1 -1
  755. package/dist/payments/payment-methods.js +2 -3
  756. package/dist/payments/payment-methods.js.map +1 -1
  757. package/dist/payments/stripe-limits.d.ts.map +1 -1
  758. package/dist/payments/stripe-limits.js +2 -3
  759. package/dist/payments/stripe-limits.js.map +1 -1
  760. package/dist/plan-usage-DfDoj5K4.d.ts +57 -0
  761. package/dist/plan-usage-DfDoj5K4.d.ts.map +1 -0
  762. package/dist/plans.d.ts.map +1 -1
  763. package/dist/plans.js +2 -3
  764. package/dist/plans.js.map +1 -1
  765. package/dist/products-Bs74ld-v.d.ts +182 -0
  766. package/dist/products-Bs74ld-v.d.ts.map +1 -0
  767. package/dist/project-api-keys--7V5X_UW.d.ts +203 -0
  768. package/dist/project-api-keys--7V5X_UW.d.ts.map +1 -0
  769. package/dist/project-permissions-kdi675F-.d.ts +160 -0
  770. package/dist/project-permissions-kdi675F-.d.ts.map +1 -0
  771. package/dist/projects-CgFGB3nO.d.ts +900 -0
  772. package/dist/projects-CgFGB3nO.d.ts.map +1 -0
  773. package/dist/results-DP3BzoL6.d.ts +70 -0
  774. package/dist/results-DP3BzoL6.d.ts.map +1 -0
  775. package/dist/{chunk-BE-pF4vm.js → rolldown-runtime-D6vf50IK.js} +12 -18
  776. package/dist/schema-01nWxmb4.d.ts +2328 -0
  777. package/dist/schema-01nWxmb4.d.ts.map +1 -0
  778. package/dist/schema-fields-DqGQ4kF7.d.ts +517 -0
  779. package/dist/schema-fields-DqGQ4kF7.d.ts.map +1 -0
  780. package/dist/schema-fields.d.ts +3 -518
  781. package/dist/schema-fields.js +21 -82
  782. package/dist/schema-fields.js.map +1 -1
  783. package/dist/server-interface-BUPG1kor.d.ts +257 -0
  784. package/dist/server-interface-BUPG1kor.d.ts.map +1 -0
  785. package/dist/session-replays-CXqhDpZq.d.ts +83 -0
  786. package/dist/session-replays-CXqhDpZq.d.ts.map +1 -0
  787. package/dist/sessions-B7Ko2Ldr.d.ts +149 -0
  788. package/dist/sessions-B7Ko2Ldr.d.ts.map +1 -0
  789. package/dist/sessions-d8qtvBUB.d.ts +175 -0
  790. package/dist/sessions-d8qtvBUB.d.ts.map +1 -0
  791. package/dist/sessions.d.ts +2 -175
  792. package/dist/sessions.js +4 -5
  793. package/dist/sessions.js.map +1 -1
  794. package/dist/sessions.test.js +1 -3
  795. package/dist/sessions.test.js.map +1 -1
  796. package/dist/strings-DWgkUybS.d.ts +76 -0
  797. package/dist/strings-DWgkUybS.d.ts.map +1 -0
  798. package/dist/svix-token-BsMrLGvy.d.ts +30 -0
  799. package/dist/svix-token-BsMrLGvy.d.ts.map +1 -0
  800. package/dist/team-invitation-Cyqt9oWw.d.ts +53 -0
  801. package/dist/team-invitation-Cyqt9oWw.d.ts.map +1 -0
  802. package/dist/team-member-profiles-uTluO8XI.d.ts +285 -0
  803. package/dist/team-member-profiles-uTluO8XI.d.ts.map +1 -0
  804. package/dist/team-memberships-DZHk2A5b.d.ts +74 -0
  805. package/dist/team-memberships-DZHk2A5b.d.ts.map +1 -0
  806. package/dist/team-permissions-DqOpaOWh.d.ts +168 -0
  807. package/dist/team-permissions-DqOpaOWh.d.ts.map +1 -0
  808. package/dist/teams-CQMcBnjM.d.ts +298 -0
  809. package/dist/teams-CQMcBnjM.d.ts.map +1 -0
  810. package/dist/transactions-DhnbvGH5.d.ts +182 -0
  811. package/dist/transactions-DhnbvGH5.d.ts.map +1 -0
  812. package/dist/types-DfTcxNtM.d.ts +77 -0
  813. package/dist/types-DfTcxNtM.d.ts.map +1 -0
  814. package/dist/users-CmBBuF00.d.ts +653 -0
  815. package/dist/users-CmBBuF00.d.ts.map +1 -0
  816. package/dist/utils/analytics-clickmap-overlay.d.ts.map +1 -1
  817. package/dist/utils/analytics-clickmap-overlay.js +2 -3
  818. package/dist/utils/analytics-clickmap-overlay.js.map +1 -1
  819. package/dist/utils/api-keys.d.ts.map +1 -1
  820. package/dist/utils/api-keys.js +4 -5
  821. package/dist/utils/api-keys.js.map +1 -1
  822. package/dist/utils/arrays.d.ts.map +1 -1
  823. package/dist/utils/arrays.js +2 -472
  824. package/dist/utils/arrays.js.map +1 -1
  825. package/dist/utils/auth-methods.d.ts.map +1 -1
  826. package/dist/utils/auth-methods.js +2 -3
  827. package/dist/utils/auth-methods.js.map +1 -1
  828. package/dist/utils/base64.d.ts.map +1 -1
  829. package/dist/utils/base64.js +2 -12
  830. package/dist/utils/base64.js.map +1 -1
  831. package/dist/utils/booleans.d.ts.map +1 -1
  832. package/dist/utils/booleans.js +2 -27
  833. package/dist/utils/booleans.js.map +1 -1
  834. package/dist/utils/browser-compat.d.ts.map +1 -1
  835. package/dist/utils/browser-compat.js +2 -3
  836. package/dist/utils/browser-compat.js.map +1 -1
  837. package/dist/utils/bytes.d.ts.map +1 -1
  838. package/dist/utils/bytes.js +4 -200
  839. package/dist/utils/bytes.js.map +1 -1
  840. package/dist/utils/caches.d.ts.map +1 -1
  841. package/dist/utils/caches.js +2 -29
  842. package/dist/utils/caches.js.map +1 -1
  843. package/dist/utils/cel-fields.d.ts.map +1 -1
  844. package/dist/utils/cel-fields.js +2 -4
  845. package/dist/utils/cel-fields.js.map +1 -1
  846. package/dist/utils/cloud-hosts.d.ts.map +1 -1
  847. package/dist/utils/cloud-hosts.js +2 -29
  848. package/dist/utils/cloud-hosts.js.map +1 -1
  849. package/dist/utils/compile-time.d.ts.map +1 -1
  850. package/dist/utils/compile-time.js +2 -3
  851. package/dist/utils/compile-time.js.map +1 -1
  852. package/dist/utils/country-codes.d.ts +2 -11
  853. package/dist/utils/country-codes.js +2 -18
  854. package/dist/utils/country-codes.js.map +1 -1
  855. package/dist/utils/crypto.d.ts.map +1 -1
  856. package/dist/utils/crypto.js +4 -115
  857. package/dist/utils/crypto.js.map +1 -1
  858. package/dist/utils/currencies.d.ts +1 -1
  859. package/dist/utils/currencies.d.ts.map +1 -1
  860. package/dist/utils/currencies.js +3 -39
  861. package/dist/utils/currencies.js.map +1 -1
  862. package/dist/utils/currency-constants.d.ts +2 -45
  863. package/dist/utils/currency-constants.js +2 -3
  864. package/dist/utils/currency-constants.js.map +1 -1
  865. package/dist/utils/dates.d.ts +2 -23
  866. package/dist/utils/dates.js +2 -46
  867. package/dist/utils/dates.js.map +1 -1
  868. package/dist/utils/dev-env-state-path.d.ts.map +1 -1
  869. package/dist/utils/dev-env-state-path.js +2 -4
  870. package/dist/utils/dev-env-state-path.js.map +1 -1
  871. package/dist/utils/dev-tool.d.ts.map +1 -1
  872. package/dist/utils/dev-tool.js +2 -3
  873. package/dist/utils/dev-tool.js.map +1 -1
  874. package/dist/utils/dom.d.ts.map +1 -1
  875. package/dist/utils/dom.js +2 -3
  876. package/dist/utils/dom.js.map +1 -1
  877. package/dist/utils/elements-chain.d.ts.map +1 -1
  878. package/dist/utils/elements-chain.js +6 -52
  879. package/dist/utils/elements-chain.js.map +1 -1
  880. package/dist/utils/env.d.ts.map +1 -1
  881. package/dist/utils/env.js +2 -4
  882. package/dist/utils/env.js.map +1 -1
  883. package/dist/utils/env.test.js +1 -3
  884. package/dist/utils/env.test.js.map +1 -1
  885. package/dist/utils/errors.d.ts +2 -238
  886. package/dist/utils/errors.js +2 -4
  887. package/dist/utils/errors.js.map +1 -1
  888. package/dist/utils/esbuild.d.ts +1 -1
  889. package/dist/utils/esbuild.d.ts.map +1 -1
  890. package/dist/utils/esbuild.js +5 -6
  891. package/dist/utils/esbuild.js.map +1 -1
  892. package/dist/utils/featurebase.d.ts.map +1 -1
  893. package/dist/utils/featurebase.js +2 -4
  894. package/dist/utils/featurebase.js.map +1 -1
  895. package/dist/utils/fs.d.ts.map +1 -1
  896. package/dist/utils/fs.js +5 -6
  897. package/dist/utils/fs.js.map +1 -1
  898. package/dist/utils/functions.d.ts.map +1 -1
  899. package/dist/utils/functions.js +2 -26
  900. package/dist/utils/functions.js.map +1 -1
  901. package/dist/utils/geo.d.ts.map +1 -1
  902. package/dist/utils/geo.js +2 -4
  903. package/dist/utils/geo.js.map +1 -1
  904. package/dist/utils/globals.d.ts.map +1 -1
  905. package/dist/utils/globals.js +2 -3
  906. package/dist/utils/globals.js.map +1 -1
  907. package/dist/utils/hashes.d.ts.map +1 -1
  908. package/dist/utils/hashes.js +4 -5
  909. package/dist/utils/hashes.js.map +1 -1
  910. package/dist/utils/html.d.ts.map +1 -1
  911. package/dist/utils/html.js +2 -21
  912. package/dist/utils/html.js.map +1 -1
  913. package/dist/utils/http.d.ts.map +1 -1
  914. package/dist/utils/http.js +2 -21
  915. package/dist/utils/http.js.map +1 -1
  916. package/dist/utils/ips.d.ts.map +1 -1
  917. package/dist/utils/ips.js +4 -28
  918. package/dist/utils/ips.js.map +1 -1
  919. package/dist/utils/json.d.ts +2 -15
  920. package/dist/utils/json.js +2 -157
  921. package/dist/utils/json.js.map +1 -1
  922. package/dist/utils/jsx-editable-transpiler.d.ts.map +1 -1
  923. package/dist/utils/jsx-editable-transpiler.js +7 -8
  924. package/dist/utils/jsx-editable-transpiler.js.map +1 -1
  925. package/dist/utils/jsx-editable-transpiler.test.js +1 -3
  926. package/dist/utils/jsx-editable-transpiler.test.js.map +1 -1
  927. package/dist/utils/jwt.d.ts.map +1 -1
  928. package/dist/utils/jwt.js +6 -7
  929. package/dist/utils/jwt.js.map +1 -1
  930. package/dist/utils/locks.d.ts.map +1 -1
  931. package/dist/utils/locks.js +2 -4
  932. package/dist/utils/locks.js.map +1 -1
  933. package/dist/utils/maps.d.ts.map +1 -1
  934. package/dist/utils/maps.js +2 -113
  935. package/dist/utils/maps.js.map +1 -1
  936. package/dist/utils/math.d.ts.map +1 -1
  937. package/dist/utils/math.js +2 -13
  938. package/dist/utils/math.js.map +1 -1
  939. package/dist/utils/monkey-patch.d.ts.map +1 -1
  940. package/dist/utils/monkey-patch.js +3 -5
  941. package/dist/utils/monkey-patch.js.map +1 -1
  942. package/dist/utils/node-http.js +2 -4
  943. package/dist/utils/node-http.js.map +1 -1
  944. package/dist/utils/numbers.d.ts.map +1 -1
  945. package/dist/utils/numbers.js +2 -47
  946. package/dist/utils/numbers.js.map +1 -1
  947. package/dist/utils/oauth.d.ts.map +1 -1
  948. package/dist/utils/oauth.js +2 -3
  949. package/dist/utils/oauth.js.map +1 -1
  950. package/dist/utils/objects.d.ts +2 -59
  951. package/dist/utils/objects.js +2 -624
  952. package/dist/utils/objects.js.map +1 -1
  953. package/dist/utils/paginated-lists.d.ts.map +1 -1
  954. package/dist/utils/paginated-lists.js +2 -4
  955. package/dist/utils/paginated-lists.js.map +1 -1
  956. package/dist/utils/paginated-lists.test.js +1 -3
  957. package/dist/utils/paginated-lists.test.js.map +1 -1
  958. package/dist/utils/passkey.d.ts +2 -2
  959. package/dist/utils/promises.d.ts +1 -1
  960. package/dist/utils/promises.d.ts.map +1 -1
  961. package/dist/utils/promises.js +2 -162
  962. package/dist/utils/promises.js.map +1 -1
  963. package/dist/utils/proxies.d.ts.map +1 -1
  964. package/dist/utils/proxies.js +2 -39
  965. package/dist/utils/proxies.js.map +1 -1
  966. package/dist/utils/react.d.ts.map +1 -1
  967. package/dist/utils/react.js +4 -44
  968. package/dist/utils/react.js.map +1 -1
  969. package/dist/utils/redirect-urls.d.ts.map +1 -1
  970. package/dist/utils/redirect-urls.js +3 -94
  971. package/dist/utils/redirect-urls.js.map +1 -1
  972. package/dist/utils/regex.js +2 -3
  973. package/dist/utils/regex.js.map +1 -1
  974. package/dist/utils/results.d.ts +2 -70
  975. package/dist/utils/results.js +2 -215
  976. package/dist/utils/results.js.map +1 -1
  977. package/dist/utils/sentry.js +2 -3
  978. package/dist/utils/sentry.js.map +1 -1
  979. package/dist/utils/stores.d.ts +1 -1
  980. package/dist/utils/stores.d.ts.map +1 -1
  981. package/dist/utils/stores.js +2 -4
  982. package/dist/utils/stores.js.map +1 -1
  983. package/dist/utils/strings.d.ts +2 -76
  984. package/dist/utils/strings.js +2 -253
  985. package/dist/utils/strings.js.map +1 -1
  986. package/dist/utils/strings.nicify.test.js +1 -3
  987. package/dist/utils/strings.nicify.test.js.map +1 -1
  988. package/dist/utils/telemetry.d.ts.map +1 -1
  989. package/dist/utils/telemetry.js +2 -4
  990. package/dist/utils/telemetry.js.map +1 -1
  991. package/dist/utils/turnstile-browser.d.ts.map +1 -1
  992. package/dist/utils/turnstile-browser.js +2 -4
  993. package/dist/utils/turnstile-browser.js.map +1 -1
  994. package/dist/utils/turnstile-flow.d.ts.map +1 -1
  995. package/dist/utils/turnstile-flow.js +2 -4
  996. package/dist/utils/turnstile-flow.js.map +1 -1
  997. package/dist/utils/turnstile-flow.test.js +1 -3
  998. package/dist/utils/turnstile-flow.test.js.map +1 -1
  999. package/dist/utils/turnstile.d.ts.map +1 -1
  1000. package/dist/utils/turnstile.js +2 -3
  1001. package/dist/utils/turnstile.js.map +1 -1
  1002. package/dist/utils/typed-arrays.js +2 -4
  1003. package/dist/utils/typed-arrays.js.map +1 -1
  1004. package/dist/utils/types.d.ts +2 -77
  1005. package/dist/utils/types.js +2 -3
  1006. package/dist/utils/types.js.map +1 -1
  1007. package/dist/utils/unicode.d.ts.map +1 -1
  1008. package/dist/utils/unicode.js +2 -15
  1009. package/dist/utils/unicode.js.map +1 -1
  1010. package/dist/utils/urls.d.ts.map +1 -1
  1011. package/dist/utils/urls.js +2 -153
  1012. package/dist/utils/urls.js.map +1 -1
  1013. package/dist/utils/uuids.d.ts.map +1 -1
  1014. package/dist/utils/uuids.js +3 -28
  1015. package/dist/utils/uuids.js.map +1 -1
  1016. package/dist/webhooks-ByXrdSOx.d.ts +326 -0
  1017. package/dist/webhooks-ByXrdSOx.d.ts.map +1 -0
  1018. package/package.json +2 -8
  1019. package/src/interface/client-interface.test.ts +77 -12
  1020. package/src/interface/client-interface.ts +9 -9
  1021. package/dist/config/format.d.ts.map +0 -1
  1022. package/dist/config/schema.d.ts.map +0 -1
  1023. package/dist/crud.d.ts.map +0 -1
  1024. package/dist/interface/admin-interface.d.ts.map +0 -1
  1025. package/dist/interface/admin-metrics.d.ts.map +0 -1
  1026. package/dist/interface/client-interface.d.ts.map +0 -1
  1027. package/dist/interface/crud/analytics.d.ts.map +0 -1
  1028. package/dist/interface/crud/connected-accounts.d.ts.map +0 -1
  1029. package/dist/interface/crud/contact-channels.d.ts.map +0 -1
  1030. package/dist/interface/crud/current-user.d.ts.map +0 -1
  1031. package/dist/interface/crud/emails.d.ts.map +0 -1
  1032. package/dist/interface/crud/internal-api-keys.d.ts.map +0 -1
  1033. package/dist/interface/crud/invoices.d.ts.map +0 -1
  1034. package/dist/interface/crud/items.d.ts.map +0 -1
  1035. package/dist/interface/crud/notification-preferences.d.ts.map +0 -1
  1036. package/dist/interface/crud/oauth-providers.d.ts.map +0 -1
  1037. package/dist/interface/crud/products.d.ts.map +0 -1
  1038. package/dist/interface/crud/project-api-keys.d.ts.map +0 -1
  1039. package/dist/interface/crud/project-permissions.d.ts.map +0 -1
  1040. package/dist/interface/crud/projects.d.ts.map +0 -1
  1041. package/dist/interface/crud/session-replays.d.ts.map +0 -1
  1042. package/dist/interface/crud/sessions.d.ts.map +0 -1
  1043. package/dist/interface/crud/svix-token.d.ts.map +0 -1
  1044. package/dist/interface/crud/team-invitation.d.ts.map +0 -1
  1045. package/dist/interface/crud/team-member-profiles.d.ts.map +0 -1
  1046. package/dist/interface/crud/team-memberships.d.ts.map +0 -1
  1047. package/dist/interface/crud/team-permissions.d.ts.map +0 -1
  1048. package/dist/interface/crud/teams.d.ts.map +0 -1
  1049. package/dist/interface/crud/transactions.d.ts.map +0 -1
  1050. package/dist/interface/crud/users.d.ts.map +0 -1
  1051. package/dist/interface/handler-urls.d.ts.map +0 -1
  1052. package/dist/interface/page-component-versions.d.ts.map +0 -1
  1053. package/dist/interface/plan-usage.d.ts.map +0 -1
  1054. package/dist/interface/server-interface.d.ts.map +0 -1
  1055. package/dist/interface/webhooks.d.ts.map +0 -1
  1056. package/dist/known-errors.d.ts.map +0 -1
  1057. package/dist/schema-fields.d.ts.map +0 -1
  1058. package/dist/sessions.d.ts.map +0 -1
  1059. package/dist/utils/country-codes.d.ts.map +0 -1
  1060. package/dist/utils/currency-constants.d.ts.map +0 -1
  1061. package/dist/utils/dates.d.ts.map +0 -1
  1062. package/dist/utils/errors.d.ts.map +0 -1
  1063. package/dist/utils/json.d.ts.map +0 -1
  1064. package/dist/utils/objects.d.ts.map +0 -1
  1065. package/dist/utils/results.d.ts.map +0 -1
  1066. package/dist/utils/strings.d.ts.map +0 -1
  1067. package/dist/utils/types.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"migrate-catalogs-to-product-lines.js","names":[],"sources":["../../../src/config/migrate-catalogs-to-product-lines.ts"],"sourcesContent":["import { HexclaveAssertionError } from \"../utils/errors\";\nimport { isObjectLike, set, typedEntries } from \"../utils/objects\";\n\n/**\n * Renames properties in an object based on a path condition.\n * This is a local copy to avoid circular dependencies with schema.ts.\n */\nfunction renameProperty(obj: Record<string, any>, oldPath: string | ((path: string[]) => boolean), newName: string | ((path: string[]) => string)): any {\n const pathCond = typeof oldPath === \"function\" ? oldPath : (p: string[]) => p.join(\".\") === oldPath;\n const pathMapper = typeof newName === \"function\" ? newName : (p: string[]) => (newName as string);\n\n const res: Record<string, any> = Array.isArray(obj) ? [] : {};\n for (const [key, originalValue] of typedEntries(obj)) {\n const path = key.split(\".\");\n\n for (let i = 0; i < path.length; i++) {\n const pathPrefix = path.slice(0, i + 1);\n if (pathCond(pathPrefix)) {\n const name = pathMapper(pathPrefix);\n if (name.includes(\".\")) throw new HexclaveAssertionError(`newName must not contain a dot. Provided: ${name}`);\n path[i] = name;\n }\n }\n\n const value = isObjectLike(originalValue) ? renameProperty(originalValue, p => pathCond([...path, ...p]), p => pathMapper([...path, ...p])) : originalValue;\n set(res, path.join(\".\"), value);\n }\n\n return res;\n}\n\n/**\n * Migrates the old \"catalogs\" format to \"productLines\", including:\n * 1. Inferring customerType for each catalog from its products (since old catalogs didn't have customerType)\n * 2. Removing empty catalogs (those with no products) since they can't have customerType inferred\n * 3. Renaming payments.catalogs -> payments.productLines\n * 4. Renaming payments.products.*.catalogId -> payments.products.*.productLineId\n *\n * This handles all config formats (nested objects, flat dot-notation, or mixed).\n */\nexport function migrateCatalogsToProductLines(obj: Record<string, any>): Record<string, any> {\n // Step 1: Collect catalogId -> customerType mappings from products\n const catalogCustomerTypes = new Map<string, string>();\n collectCatalogCustomerTypes(obj, [], catalogCustomerTypes);\n\n // Step 2: Find all catalog IDs that exist\n const allCatalogIds = new Set<string>();\n findAllCatalogIds(obj, [], allCatalogIds);\n\n // Step 3: Add customerType keys for catalogs that need them\n let res = { ...obj };\n for (const catalogId of allCatalogIds) {\n const customerType = catalogCustomerTypes.get(catalogId);\n if (customerType) {\n // Find the format used for this catalog and add customerType in the same format\n res = addCustomerTypeToCatalog(res, catalogId, customerType);\n } else {\n // Empty catalog (no products) - remove it since we can't infer customerType\n res = removeCatalog(res, catalogId);\n }\n }\n\n // Step 4: Rename catalogs -> productLines\n res = renameProperty(res, \"payments.catalogs\", \"productLines\");\n\n // Step 5: Rename catalogId -> productLineId in products\n res = renameProperty(res, (p) => p.length === 4 && p[0] === \"payments\" && p[1] === \"products\" && p[3] === \"catalogId\", () => \"productLineId\");\n\n return res;\n}\n\n/**\n * Recursively collects catalogId -> customerType mappings from products.\n * Handles both nested and flat config formats.\n */\nfunction collectCatalogCustomerTypes(\n obj: Record<string, any>,\n basePath: string[],\n result: Map<string, string>\n): void {\n for (const [key, value] of typedEntries(obj)) {\n const keyParts = key.split(\".\");\n const fullPath = [...basePath, ...keyParts];\n\n // Check for flat format at ROOT level only: payments.products.<productId>.catalogId\n // We check basePath.length === 0 to ensure we're at root and key contains the full path\n if (basePath.length === 0 && fullPath.length === 4 && fullPath[0] === \"payments\" && fullPath[1] === \"products\" && fullPath[3] === \"catalogId\") {\n if (typeof value === \"string\") {\n const productId = fullPath[2];\n // Look for customerType in the same flat format\n const customerTypeKey = `payments.products.${productId}.customerType`;\n if (customerTypeKey in obj && typeof obj[customerTypeKey] === \"string\") {\n result.set(value, obj[customerTypeKey]);\n }\n }\n }\n\n // Check for nested format: payments.products.<productId> with object value\n if (fullPath.length === 3 && fullPath[0] === \"payments\" && fullPath[1] === \"products\" && isObjectLike(value)) {\n const catalogId = findPropertyValue(value, \"catalogId\") ?? findPropertyValue(value, \"productLineId\");\n const customerType = findPropertyValue(value, \"customerType\");\n if (catalogId && typeof catalogId === \"string\" && customerType && typeof customerType === \"string\") {\n result.set(catalogId, customerType);\n }\n }\n\n if (isObjectLike(value)) {\n collectCatalogCustomerTypes(value, fullPath, result);\n }\n }\n}\n\n/**\n * Finds a property value in an object, handling both direct properties and dot-notation keys.\n */\nfunction findPropertyValue(obj: Record<string, any>, propertyName: string): any {\n // Direct property\n if (propertyName in obj) {\n return obj[propertyName];\n }\n // Check for dot-notation keys that end with the property name\n for (const key of Object.keys(obj)) {\n const parts = key.split(\".\");\n if (parts[parts.length - 1] === propertyName) {\n return obj[key];\n }\n }\n return undefined;\n}\n\n/**\n * Finds all catalog IDs that exist in the config.\n */\nfunction findAllCatalogIds(\n obj: Record<string, any>,\n basePath: string[],\n result: Set<string>\n): void {\n for (const [key, value] of typedEntries(obj)) {\n const keyParts = key.split(\".\");\n const fullPath = [...basePath, ...keyParts];\n\n // Check for catalog entry at payments.catalogs.<catalogId>\n if (fullPath.length >= 3 && fullPath[0] === \"payments\" && fullPath[1] === \"catalogs\") {\n const catalogId = fullPath[2];\n result.add(catalogId);\n }\n\n if (isObjectLike(value)) {\n findAllCatalogIds(value, fullPath, result);\n }\n }\n}\n\n/**\n * Removes a catalog from the config in any format (nested or flat).\n */\nfunction removeCatalog(obj: Record<string, any>, catalogId: string): Record<string, any> {\n // Don't process arrays - they should be copied as-is\n if (Array.isArray(obj)) {\n return obj;\n }\n\n const res: Record<string, any> = {};\n\n for (const [key, value] of typedEntries(obj)) {\n const keyParts = key.split(\".\");\n\n // Check if this key is for the catalog we want to remove\n // Format 4: \"payments.catalogs.<catalogId>.displayName\" or similar flat keys\n if (keyParts.length >= 3 && keyParts[0] === \"payments\" && keyParts[1] === \"catalogs\" && keyParts[2] === catalogId) {\n // Skip this key - don't copy it\n continue;\n }\n\n // Format 3: \"payments.catalogs.<catalogId>\" as a single key\n if (key === `payments.catalogs.${catalogId}`) {\n continue;\n }\n\n if (Array.isArray(value)) {\n res[key] = value;\n } else if (isObjectLike(value)) {\n const processed = removeCatalog(value, catalogId);\n // Check if we need to remove the catalog from nested structures\n if (key === \"payments\" && isObjectLike(processed) && \"catalogs\" in processed) {\n const catalogs = processed.catalogs;\n if (isObjectLike(catalogs) && catalogId in catalogs) {\n const { [catalogId]: _, ...rest } = catalogs as Record<string, any>;\n res[key] = { ...processed, catalogs: rest };\n continue;\n }\n }\n // Format 2: \"payments.catalogs\" as a key with nested catalog\n if (key === \"payments.catalogs\" && isObjectLike(processed) && catalogId in processed) {\n const { [catalogId]: _, ...rest } = processed as Record<string, any>;\n res[key] = rest;\n continue;\n }\n res[key] = processed;\n } else {\n res[key] = value;\n }\n }\n\n return res;\n}\n\n/**\n * Adds customerType to a catalog in the appropriate format.\n */\nfunction addCustomerTypeToCatalog(obj: Record<string, any>, catalogId: string, customerType: string): Record<string, any> {\n // Don't process arrays - they should be copied as-is\n if (Array.isArray(obj)) {\n return obj;\n }\n\n const res: Record<string, any> = {};\n\n // First, copy all existing properties\n for (const [key, value] of typedEntries(obj)) {\n if (Array.isArray(value)) {\n // Copy arrays directly without processing\n res[key] = value;\n } else if (isObjectLike(value)) {\n res[key] = addCustomerTypeToCatalog(value, catalogId, customerType);\n } else {\n res[key] = value;\n }\n }\n\n // Check what format the catalog uses\n // Format 1: { payments: { catalogs: { [catalogId]: { ... } } } }\n const payments = res.payments;\n if (payments && isObjectLike(payments) && !Array.isArray(payments) && typeof payments !== \"function\") {\n const paymentsObj = payments as Record<string, any>;\n const catalogs = paymentsObj.catalogs;\n if (catalogs && isObjectLike(catalogs) && !Array.isArray(catalogs) && typeof catalogs !== \"function\") {\n const catalogsObj = catalogs as Record<string, any>;\n const catalog = catalogsObj[catalogId];\n if (catalog && isObjectLike(catalog)) {\n if (!(\"customerType\" in catalog)) {\n catalogsObj[catalogId] = { ...catalog, customerType };\n }\n return res;\n }\n }\n }\n\n // Format 2: { \"payments.catalogs\": { [catalogId]: { ... } } }\n const paymentsCatalogs = res[\"payments.catalogs\"];\n if (paymentsCatalogs && isObjectLike(paymentsCatalogs) && !Array.isArray(paymentsCatalogs) && typeof paymentsCatalogs !== \"function\") {\n const catalogs = paymentsCatalogs as Record<string, any>;\n if (catalogId in catalogs && isObjectLike(catalogs[catalogId])) {\n if (!(\"customerType\" in catalogs[catalogId])) {\n catalogs[catalogId] = { ...catalogs[catalogId], customerType };\n }\n return res;\n }\n }\n\n // Format 3: { \"payments.catalogs.[catalogId]\": { ... } }\n const catalogKey = `payments.catalogs.${catalogId}`;\n if (catalogKey in res && isObjectLike(res[catalogKey])) {\n if (!(\"customerType\" in res[catalogKey])) {\n res[catalogKey] = { ...res[catalogKey], customerType };\n }\n return res;\n }\n\n // Format 4: { \"payments.catalogs.[catalogId].displayName\": \"...\" }\n // Need to add a new key for customerType\n const customerTypeKey = `payments.catalogs.${catalogId}.customerType`;\n for (const key of Object.keys(res)) {\n if (key.startsWith(`payments.catalogs.${catalogId}.`) && key !== customerTypeKey) {\n // Found a flat key for this catalog, add customerType in same format\n res[customerTypeKey] = customerType;\n return res;\n }\n }\n\n return res;\n}\n\n// Tests\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - basic migrations\", ({ expect }) => {\n // Basic nested format\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n myCatalog: { displayName: \"My Catalog\" }\n },\n products: {\n myProduct: { catalogId: \"myCatalog\", customerType: \"user\", prices: {} }\n }\n }\n })).toEqual({\n payments: {\n productLines: {\n myCatalog: { displayName: \"My Catalog\", customerType: \"user\" }\n },\n products: {\n myProduct: { productLineId: \"myCatalog\", customerType: \"user\", prices: {} }\n }\n }\n });\n\n // Flat format\n expect(migrateCatalogsToProductLines({\n \"payments.catalogs.myCatalog\": { displayName: \"My Catalog\" },\n \"payments.products.myProduct.catalogId\": \"myCatalog\",\n \"payments.products.myProduct.customerType\": \"user\",\n })).toEqual({\n \"payments.productLines.myCatalog\": { displayName: \"My Catalog\", customerType: \"user\" },\n \"payments.products.myProduct.productLineId\": \"myCatalog\",\n \"payments.products.myProduct.customerType\": \"user\",\n });\n\n // Mixed format\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: { myCatalog: { displayName: \"My Catalog\" } }\n },\n \"payments.products.myProduct\": { catalogId: \"myCatalog\", customerType: \"user\" }\n })).toEqual({\n payments: {\n productLines: { myCatalog: { displayName: \"My Catalog\", customerType: \"user\" } }\n },\n \"payments.products.myProduct\": { productLineId: \"myCatalog\", customerType: \"user\" }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - does not overwrite existing customerType\", ({ expect }) => {\n // If catalog already has customerType, don't overwrite it\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n myCatalog: { displayName: \"My Catalog\", customerType: \"team\" }\n },\n products: {\n myProduct: { catalogId: \"myCatalog\", customerType: \"user\", prices: {} }\n }\n }\n })).toEqual({\n payments: {\n productLines: {\n myCatalog: { displayName: \"My Catalog\", customerType: \"team\" }\n },\n products: {\n myProduct: { productLineId: \"myCatalog\", customerType: \"user\", prices: {} }\n }\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - multiple catalogs and products\", ({ expect }) => {\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n userPlans: { displayName: \"User Plans\" },\n teamPlans: { displayName: \"Team Plans\" }\n },\n products: {\n userBasic: { catalogId: \"userPlans\", customerType: \"user\", prices: {} },\n userPro: { catalogId: \"userPlans\", customerType: \"user\", prices: {} },\n teamBasic: { catalogId: \"teamPlans\", customerType: \"team\", prices: {} }\n }\n }\n })).toEqual({\n payments: {\n productLines: {\n userPlans: { displayName: \"User Plans\", customerType: \"user\" },\n teamPlans: { displayName: \"Team Plans\", customerType: \"team\" }\n },\n products: {\n userBasic: { productLineId: \"userPlans\", customerType: \"user\", prices: {} },\n userPro: { productLineId: \"userPlans\", customerType: \"user\", prices: {} },\n teamBasic: { productLineId: \"teamPlans\", customerType: \"team\", prices: {} }\n }\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - catalog without products is removed\", ({ expect }) => {\n // Catalog without any products should be removed since we can't infer customerType\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n emptyCatalog: { displayName: \"Empty\" }\n },\n products: {}\n }\n })).toEqual({\n payments: {\n productLines: {},\n products: {}\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - products without catalogId\", ({ expect }) => {\n // Catalogs without any products referencing them should be removed\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n myCatalog: { displayName: \"My Catalog\" }\n },\n products: {\n standalone: { customerType: \"user\", prices: {} }\n }\n }\n })).toEqual({\n payments: {\n productLines: {},\n products: {\n standalone: { customerType: \"user\", prices: {} }\n }\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - deeply nested flat format\", ({ expect }) => {\n expect(migrateCatalogsToProductLines({\n \"payments.catalogs.myCatalog.displayName\": \"My Catalog\",\n \"payments.products.myProduct.catalogId\": \"myCatalog\",\n \"payments.products.myProduct.customerType\": \"user\",\n \"payments.products.myProduct.prices\": {},\n })).toEqual({\n \"payments.productLines.myCatalog.displayName\": \"My Catalog\",\n \"payments.productLines.myCatalog.customerType\": \"user\",\n \"payments.products.myProduct.productLineId\": \"myCatalog\",\n \"payments.products.myProduct.customerType\": \"user\",\n \"payments.products.myProduct.prices\": {},\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - no catalogs\", ({ expect }) => {\n // Config without catalogs should pass through unchanged (except productLineId rename)\n expect(migrateCatalogsToProductLines({\n payments: {\n products: {\n myProduct: { catalogId: \"someCatalog\", customerType: \"user\" }\n }\n }\n })).toEqual({\n payments: {\n products: {\n myProduct: { productLineId: \"someCatalog\", customerType: \"user\" }\n }\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - already migrated (productLines)\", ({ expect }) => {\n // Already has productLines, should not change customerType\n expect(migrateCatalogsToProductLines({\n payments: {\n productLines: {\n myLine: { displayName: \"My Line\", customerType: \"team\" }\n },\n products: {\n myProduct: { productLineId: \"myLine\", customerType: \"team\" }\n }\n }\n })).toEqual({\n payments: {\n productLines: {\n myLine: { displayName: \"My Line\", customerType: \"team\" }\n },\n products: {\n myProduct: { productLineId: \"myLine\", customerType: \"team\" }\n }\n }\n });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"migrate-catalogs-to-product-lines.js","names":["paymentsObj"],"sources":["../../../src/config/migrate-catalogs-to-product-lines.ts"],"sourcesContent":["import { HexclaveAssertionError } from \"../utils/errors\";\nimport { isObjectLike, set, typedEntries } from \"../utils/objects\";\n\n/**\n * Renames properties in an object based on a path condition.\n * This is a local copy to avoid circular dependencies with schema.ts.\n */\nfunction renameProperty(obj: Record<string, any>, oldPath: string | ((path: string[]) => boolean), newName: string | ((path: string[]) => string)): any {\n const pathCond = typeof oldPath === \"function\" ? oldPath : (p: string[]) => p.join(\".\") === oldPath;\n const pathMapper = typeof newName === \"function\" ? newName : (p: string[]) => (newName as string);\n\n const res: Record<string, any> = Array.isArray(obj) ? [] : {};\n for (const [key, originalValue] of typedEntries(obj)) {\n const path = key.split(\".\");\n\n for (let i = 0; i < path.length; i++) {\n const pathPrefix = path.slice(0, i + 1);\n if (pathCond(pathPrefix)) {\n const name = pathMapper(pathPrefix);\n if (name.includes(\".\")) throw new HexclaveAssertionError(`newName must not contain a dot. Provided: ${name}`);\n path[i] = name;\n }\n }\n\n const value = isObjectLike(originalValue) ? renameProperty(originalValue, p => pathCond([...path, ...p]), p => pathMapper([...path, ...p])) : originalValue;\n set(res, path.join(\".\"), value);\n }\n\n return res;\n}\n\n/**\n * Migrates the old \"catalogs\" format to \"productLines\", including:\n * 1. Inferring customerType for each catalog from its products (since old catalogs didn't have customerType)\n * 2. Removing empty catalogs (those with no products) since they can't have customerType inferred\n * 3. Renaming payments.catalogs -> payments.productLines\n * 4. Renaming payments.products.*.catalogId -> payments.products.*.productLineId\n *\n * This handles all config formats (nested objects, flat dot-notation, or mixed).\n */\nexport function migrateCatalogsToProductLines(obj: Record<string, any>): Record<string, any> {\n // Step 1: Collect catalogId -> customerType mappings from products\n const catalogCustomerTypes = new Map<string, string>();\n collectCatalogCustomerTypes(obj, [], catalogCustomerTypes);\n\n // Step 2: Find all catalog IDs that exist\n const allCatalogIds = new Set<string>();\n findAllCatalogIds(obj, [], allCatalogIds);\n\n // Step 3: Add customerType keys for catalogs that need them\n let res = { ...obj };\n for (const catalogId of allCatalogIds) {\n const customerType = catalogCustomerTypes.get(catalogId);\n if (customerType) {\n // Find the format used for this catalog and add customerType in the same format\n res = addCustomerTypeToCatalog(res, catalogId, customerType);\n } else {\n // Empty catalog (no products) - remove it since we can't infer customerType\n res = removeCatalog(res, catalogId);\n }\n }\n\n // Step 4: Rename catalogs -> productLines\n res = renameProperty(res, \"payments.catalogs\", \"productLines\");\n\n // Step 5: Rename catalogId -> productLineId in products\n res = renameProperty(res, (p) => p.length === 4 && p[0] === \"payments\" && p[1] === \"products\" && p[3] === \"catalogId\", () => \"productLineId\");\n\n return res;\n}\n\n/**\n * Recursively collects catalogId -> customerType mappings from products.\n * Handles both nested and flat config formats.\n */\nfunction collectCatalogCustomerTypes(\n obj: Record<string, any>,\n basePath: string[],\n result: Map<string, string>\n): void {\n for (const [key, value] of typedEntries(obj)) {\n const keyParts = key.split(\".\");\n const fullPath = [...basePath, ...keyParts];\n\n // Check for flat format at ROOT level only: payments.products.<productId>.catalogId\n // We check basePath.length === 0 to ensure we're at root and key contains the full path\n if (basePath.length === 0 && fullPath.length === 4 && fullPath[0] === \"payments\" && fullPath[1] === \"products\" && fullPath[3] === \"catalogId\") {\n if (typeof value === \"string\") {\n const productId = fullPath[2];\n // Look for customerType in the same flat format\n const customerTypeKey = `payments.products.${productId}.customerType`;\n if (customerTypeKey in obj && typeof obj[customerTypeKey] === \"string\") {\n result.set(value, obj[customerTypeKey]);\n }\n }\n }\n\n // Check for nested format: payments.products.<productId> with object value\n if (fullPath.length === 3 && fullPath[0] === \"payments\" && fullPath[1] === \"products\" && isObjectLike(value)) {\n const catalogId = findPropertyValue(value, \"catalogId\") ?? findPropertyValue(value, \"productLineId\");\n const customerType = findPropertyValue(value, \"customerType\");\n if (catalogId && typeof catalogId === \"string\" && customerType && typeof customerType === \"string\") {\n result.set(catalogId, customerType);\n }\n }\n\n if (isObjectLike(value)) {\n collectCatalogCustomerTypes(value, fullPath, result);\n }\n }\n}\n\n/**\n * Finds a property value in an object, handling both direct properties and dot-notation keys.\n */\nfunction findPropertyValue(obj: Record<string, any>, propertyName: string): any {\n // Direct property\n if (propertyName in obj) {\n return obj[propertyName];\n }\n // Check for dot-notation keys that end with the property name\n for (const key of Object.keys(obj)) {\n const parts = key.split(\".\");\n if (parts[parts.length - 1] === propertyName) {\n return obj[key];\n }\n }\n return undefined;\n}\n\n/**\n * Finds all catalog IDs that exist in the config.\n */\nfunction findAllCatalogIds(\n obj: Record<string, any>,\n basePath: string[],\n result: Set<string>\n): void {\n for (const [key, value] of typedEntries(obj)) {\n const keyParts = key.split(\".\");\n const fullPath = [...basePath, ...keyParts];\n\n // Check for catalog entry at payments.catalogs.<catalogId>\n if (fullPath.length >= 3 && fullPath[0] === \"payments\" && fullPath[1] === \"catalogs\") {\n const catalogId = fullPath[2];\n result.add(catalogId);\n }\n\n if (isObjectLike(value)) {\n findAllCatalogIds(value, fullPath, result);\n }\n }\n}\n\n/**\n * Removes a catalog from the config in any format (nested or flat).\n */\nfunction removeCatalog(obj: Record<string, any>, catalogId: string): Record<string, any> {\n // Don't process arrays - they should be copied as-is\n if (Array.isArray(obj)) {\n return obj;\n }\n\n const res: Record<string, any> = {};\n\n for (const [key, value] of typedEntries(obj)) {\n const keyParts = key.split(\".\");\n\n // Check if this key is for the catalog we want to remove\n // Format 4: \"payments.catalogs.<catalogId>.displayName\" or similar flat keys\n if (keyParts.length >= 3 && keyParts[0] === \"payments\" && keyParts[1] === \"catalogs\" && keyParts[2] === catalogId) {\n // Skip this key - don't copy it\n continue;\n }\n\n // Format 3: \"payments.catalogs.<catalogId>\" as a single key\n if (key === `payments.catalogs.${catalogId}`) {\n continue;\n }\n\n if (Array.isArray(value)) {\n res[key] = value;\n } else if (isObjectLike(value)) {\n const processed = removeCatalog(value, catalogId);\n // Check if we need to remove the catalog from nested structures\n if (key === \"payments\" && isObjectLike(processed) && \"catalogs\" in processed) {\n const catalogs = processed.catalogs;\n if (isObjectLike(catalogs) && catalogId in catalogs) {\n const { [catalogId]: _, ...rest } = catalogs as Record<string, any>;\n res[key] = { ...processed, catalogs: rest };\n continue;\n }\n }\n // Format 2: \"payments.catalogs\" as a key with nested catalog\n if (key === \"payments.catalogs\" && isObjectLike(processed) && catalogId in processed) {\n const { [catalogId]: _, ...rest } = processed as Record<string, any>;\n res[key] = rest;\n continue;\n }\n res[key] = processed;\n } else {\n res[key] = value;\n }\n }\n\n return res;\n}\n\n/**\n * Adds customerType to a catalog in the appropriate format.\n */\nfunction addCustomerTypeToCatalog(obj: Record<string, any>, catalogId: string, customerType: string): Record<string, any> {\n // Don't process arrays - they should be copied as-is\n if (Array.isArray(obj)) {\n return obj;\n }\n\n const res: Record<string, any> = {};\n\n // First, copy all existing properties\n for (const [key, value] of typedEntries(obj)) {\n if (Array.isArray(value)) {\n // Copy arrays directly without processing\n res[key] = value;\n } else if (isObjectLike(value)) {\n res[key] = addCustomerTypeToCatalog(value, catalogId, customerType);\n } else {\n res[key] = value;\n }\n }\n\n // Check what format the catalog uses\n // Format 1: { payments: { catalogs: { [catalogId]: { ... } } } }\n const payments = res.payments;\n if (payments && isObjectLike(payments) && !Array.isArray(payments) && typeof payments !== \"function\") {\n const paymentsObj = payments as Record<string, any>;\n const catalogs = paymentsObj.catalogs;\n if (catalogs && isObjectLike(catalogs) && !Array.isArray(catalogs) && typeof catalogs !== \"function\") {\n const catalogsObj = catalogs as Record<string, any>;\n const catalog = catalogsObj[catalogId];\n if (catalog && isObjectLike(catalog)) {\n if (!(\"customerType\" in catalog)) {\n catalogsObj[catalogId] = { ...catalog, customerType };\n }\n return res;\n }\n }\n }\n\n // Format 2: { \"payments.catalogs\": { [catalogId]: { ... } } }\n const paymentsCatalogs = res[\"payments.catalogs\"];\n if (paymentsCatalogs && isObjectLike(paymentsCatalogs) && !Array.isArray(paymentsCatalogs) && typeof paymentsCatalogs !== \"function\") {\n const catalogs = paymentsCatalogs as Record<string, any>;\n if (catalogId in catalogs && isObjectLike(catalogs[catalogId])) {\n if (!(\"customerType\" in catalogs[catalogId])) {\n catalogs[catalogId] = { ...catalogs[catalogId], customerType };\n }\n return res;\n }\n }\n\n // Format 3: { \"payments.catalogs.[catalogId]\": { ... } }\n const catalogKey = `payments.catalogs.${catalogId}`;\n if (catalogKey in res && isObjectLike(res[catalogKey])) {\n if (!(\"customerType\" in res[catalogKey])) {\n res[catalogKey] = { ...res[catalogKey], customerType };\n }\n return res;\n }\n\n // Format 4: { \"payments.catalogs.[catalogId].displayName\": \"...\" }\n // Need to add a new key for customerType\n const customerTypeKey = `payments.catalogs.${catalogId}.customerType`;\n for (const key of Object.keys(res)) {\n if (key.startsWith(`payments.catalogs.${catalogId}.`) && key !== customerTypeKey) {\n // Found a flat key for this catalog, add customerType in same format\n res[customerTypeKey] = customerType;\n return res;\n }\n }\n\n return res;\n}\n\n// Tests\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - basic migrations\", ({ expect }) => {\n // Basic nested format\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n myCatalog: { displayName: \"My Catalog\" }\n },\n products: {\n myProduct: { catalogId: \"myCatalog\", customerType: \"user\", prices: {} }\n }\n }\n })).toEqual({\n payments: {\n productLines: {\n myCatalog: { displayName: \"My Catalog\", customerType: \"user\" }\n },\n products: {\n myProduct: { productLineId: \"myCatalog\", customerType: \"user\", prices: {} }\n }\n }\n });\n\n // Flat format\n expect(migrateCatalogsToProductLines({\n \"payments.catalogs.myCatalog\": { displayName: \"My Catalog\" },\n \"payments.products.myProduct.catalogId\": \"myCatalog\",\n \"payments.products.myProduct.customerType\": \"user\",\n })).toEqual({\n \"payments.productLines.myCatalog\": { displayName: \"My Catalog\", customerType: \"user\" },\n \"payments.products.myProduct.productLineId\": \"myCatalog\",\n \"payments.products.myProduct.customerType\": \"user\",\n });\n\n // Mixed format\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: { myCatalog: { displayName: \"My Catalog\" } }\n },\n \"payments.products.myProduct\": { catalogId: \"myCatalog\", customerType: \"user\" }\n })).toEqual({\n payments: {\n productLines: { myCatalog: { displayName: \"My Catalog\", customerType: \"user\" } }\n },\n \"payments.products.myProduct\": { productLineId: \"myCatalog\", customerType: \"user\" }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - does not overwrite existing customerType\", ({ expect }) => {\n // If catalog already has customerType, don't overwrite it\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n myCatalog: { displayName: \"My Catalog\", customerType: \"team\" }\n },\n products: {\n myProduct: { catalogId: \"myCatalog\", customerType: \"user\", prices: {} }\n }\n }\n })).toEqual({\n payments: {\n productLines: {\n myCatalog: { displayName: \"My Catalog\", customerType: \"team\" }\n },\n products: {\n myProduct: { productLineId: \"myCatalog\", customerType: \"user\", prices: {} }\n }\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - multiple catalogs and products\", ({ expect }) => {\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n userPlans: { displayName: \"User Plans\" },\n teamPlans: { displayName: \"Team Plans\" }\n },\n products: {\n userBasic: { catalogId: \"userPlans\", customerType: \"user\", prices: {} },\n userPro: { catalogId: \"userPlans\", customerType: \"user\", prices: {} },\n teamBasic: { catalogId: \"teamPlans\", customerType: \"team\", prices: {} }\n }\n }\n })).toEqual({\n payments: {\n productLines: {\n userPlans: { displayName: \"User Plans\", customerType: \"user\" },\n teamPlans: { displayName: \"Team Plans\", customerType: \"team\" }\n },\n products: {\n userBasic: { productLineId: \"userPlans\", customerType: \"user\", prices: {} },\n userPro: { productLineId: \"userPlans\", customerType: \"user\", prices: {} },\n teamBasic: { productLineId: \"teamPlans\", customerType: \"team\", prices: {} }\n }\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - catalog without products is removed\", ({ expect }) => {\n // Catalog without any products should be removed since we can't infer customerType\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n emptyCatalog: { displayName: \"Empty\" }\n },\n products: {}\n }\n })).toEqual({\n payments: {\n productLines: {},\n products: {}\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - products without catalogId\", ({ expect }) => {\n // Catalogs without any products referencing them should be removed\n expect(migrateCatalogsToProductLines({\n payments: {\n catalogs: {\n myCatalog: { displayName: \"My Catalog\" }\n },\n products: {\n standalone: { customerType: \"user\", prices: {} }\n }\n }\n })).toEqual({\n payments: {\n productLines: {},\n products: {\n standalone: { customerType: \"user\", prices: {} }\n }\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - deeply nested flat format\", ({ expect }) => {\n expect(migrateCatalogsToProductLines({\n \"payments.catalogs.myCatalog.displayName\": \"My Catalog\",\n \"payments.products.myProduct.catalogId\": \"myCatalog\",\n \"payments.products.myProduct.customerType\": \"user\",\n \"payments.products.myProduct.prices\": {},\n })).toEqual({\n \"payments.productLines.myCatalog.displayName\": \"My Catalog\",\n \"payments.productLines.myCatalog.customerType\": \"user\",\n \"payments.products.myProduct.productLineId\": \"myCatalog\",\n \"payments.products.myProduct.customerType\": \"user\",\n \"payments.products.myProduct.prices\": {},\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - no catalogs\", ({ expect }) => {\n // Config without catalogs should pass through unchanged (except productLineId rename)\n expect(migrateCatalogsToProductLines({\n payments: {\n products: {\n myProduct: { catalogId: \"someCatalog\", customerType: \"user\" }\n }\n }\n })).toEqual({\n payments: {\n products: {\n myProduct: { productLineId: \"someCatalog\", customerType: \"user\" }\n }\n }\n });\n});\n\nimport.meta.vitest?.test(\"migrateCatalogsToProductLines - already migrated (productLines)\", ({ expect }) => {\n // Already has productLines, should not change customerType\n expect(migrateCatalogsToProductLines({\n payments: {\n productLines: {\n myLine: { displayName: \"My Line\", customerType: \"team\" }\n },\n products: {\n myProduct: { productLineId: \"myLine\", customerType: \"team\" }\n }\n }\n })).toEqual({\n payments: {\n productLines: {\n myLine: { displayName: \"My Line\", customerType: \"team\" }\n },\n products: {\n myProduct: { productLineId: \"myLine\", customerType: \"team\" }\n }\n }\n });\n});\n"],"mappings":"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"}
@@ -1,16 +1,11 @@
1
- import { HexclaveAssertionError } from "../utils/errors.js";
2
- import { getOrUndefined, isObjectLike, set, typedEntries, typedFromEntries } from "../utils/objects.js";
1
+ import "../utils/errors.js";
2
+ import { typedEntries, typedFromEntries } from "../utils/objects.js";
3
3
  import { ALL_APPS } from "../apps/apps-config.js";
4
4
  import { SUPPORTED_CURRENCIES } from "../utils/currency-constants.js";
5
- import { nicify } from "../utils/strings.js";
6
- import { normalize, override } from "./format.js";
7
- import { applyBranchDefaults, applyEnvironmentDefaults, applyOrganizationDefaults, applyProjectDefaults, assertNoConfigOverrideErrors, branchConfigSchema, environmentConfigSchema, migrateConfigOverride, organizationConfigSchema, projectConfigSchema, sanitizeBranchConfig, sanitizeEnvironmentConfig, sanitizeOrganizationConfig, sanitizeProjectConfig } from "./schema.js";
8
-
5
+ import "../utils/strings.js";
6
+ import "./format.js";
7
+ import "./schema.js";
9
8
  //#region src/config/schema-fuzzer.test.ts
10
- const projectSchemaFuzzerConfig = [{
11
- sourceOfTruth: [{ type: ["hosted"] }],
12
- project: [{ requirePublishableClientKey: [true, false] }]
13
- }];
14
9
  const branchSchemaFuzzerConfig = [{
15
10
  apiKeys: [{ enabled: [{
16
11
  team: [true, false],
@@ -238,168 +233,20 @@ const branchSchemaFuzzerConfig = [{
238
233
  apps: [{ installed: [typedFromEntries(typedEntries(ALL_APPS).map(([key, value]) => [key, [{ enabled: [true, false] }]]))] }],
239
234
  onboarding: [{ requireEmailVerification: [true, false] }]
240
235
  }];
241
- const environmentSchemaFuzzerConfig = [{
242
- ...branchSchemaFuzzerConfig[0],
243
- auth: [{
244
- ...branchSchemaFuzzerConfig[0].auth[0],
245
- oauth: [{
246
- ...branchSchemaFuzzerConfig[0].auth[0].oauth[0],
247
- providers: [typedFromEntries(typedEntries(branchSchemaFuzzerConfig[0].auth[0].oauth[0].providers[0]).map(([key, value]) => [key, [{
248
- ...value[0],
249
- isShared: [true, false],
250
- clientId: ["some-client-id"],
251
- clientSecret: ["some-client-secret"],
252
- customCallbackUrl: [void 0],
253
- facebookConfigId: ["some-facebook-config-id"],
254
- microsoftTenantId: ["some-microsoft-tenant-id"],
255
- appleBundles: [{ "some-bundle-id": [{ bundleId: ["com.example.app"] }] }],
256
- issuerUrl: [void 0, "https://accounts.google.com"],
257
- scope: [void 0, "openid email profile"],
258
- displayName: [void 0, "My OIDC Provider"]
259
- }]]))]
260
- }]
261
- }],
262
- domains: [{
263
- allowLocalhost: [true, false],
264
- trustedDomains: [{ "some-domain-id": [{
265
- baseUrl: ["https://example.com/something-here"],
266
- handlerPath: ["/something-here"]
267
- }] }]
268
- }],
269
- emails: [{
270
- ...branchSchemaFuzzerConfig[0].emails[0],
271
- server: [{
272
- isShared: [true, false],
273
- provider: [
274
- "resend",
275
- "smtp",
276
- "managed"
277
- ],
278
- host: ["example.com", "://super weird host that's not valid"],
279
- port: [
280
- 1234,
281
- .12543,
282
- -100,
283
- Infinity
284
- ],
285
- username: ["some-username", "some username with a space"],
286
- password: ["some-password", "some password with a space"],
287
- senderName: ["Some Sender"],
288
- senderEmail: ["some-sender@example.com", "some invalid email"],
289
- managedSubdomain: ["mail.example.com", "invalid subdomain"],
290
- managedSenderLocalPart: ["noreply", "some invalid local part"]
291
- }]
292
- }],
293
- payments: [{
294
- ...branchSchemaFuzzerConfig[0].payments[0],
295
- testMode: [false, true]
296
- }],
297
- analytics: [{ queryFolders: [{ "some-folder-id": [{
298
- displayName: ["Some Folder", "Some Other Folder"],
299
- sortOrder: [
300
- 0,
301
- 1,
302
- 10,
303
- -5
304
- ],
305
- queries: [{ "some-query-id": [{
306
- displayName: ["Some Query", "Some Other Query"],
307
- sqlQuery: [
308
- "",
309
- "SELECT * FROM events",
310
- "SELECT * FROM users"
311
- ],
312
- description: [
313
- "",
314
- "A query description",
315
- "Another description"
316
- ]
317
- }] }]
318
- }] }] }],
319
- customDashboards: [{ "12345678-1234-4234-9234-123456789012": [{
320
- displayName: ["My Dashboard", "User Growth Dashboard"],
321
- tsxSource: ["", "function Dashboard() { return <div>Hello</div>; }"]
322
- }] }]
323
- }];
324
- const organizationSchemaFuzzerConfig = environmentSchemaFuzzerConfig;
325
- function setDeep(obj, path, value) {
326
- if (!isObjectLike(obj)) return obj;
327
- if (path.length === 0) throw new Error("Path is empty");
328
- else if (path.length === 1) set(obj, path[0], value);
329
- else {
330
- const [key, ...rest] = path;
331
- setDeep(getOrUndefined(obj, key), rest, value);
332
- }
333
- }
334
- function createFuzzerInput(config, progress) {
335
- progress = Math.min(1, 2 * progress);
336
- const createShouldRandom = (strength) => {
337
- const chance = Math.random() * strength * 1.2 - .1;
338
- return () => Math.random() < chance;
339
- };
340
- const createShouldObjectDependent = (strength) => {
341
- const objectChance = Math.random() * strength * 1.2 - .1;
342
- const primitiveChance = Math.random() * strength * 1.2 - .1;
343
- return (v) => Math.random() * Math.random() < (isObjectLike(v) ? objectChance : primitiveChance);
344
- };
345
- const shouldKeep = createShouldObjectDependent(progress * 1);
346
- const shouldMakeNested = createShouldObjectDependent(1.25);
347
- const shouldNull = createShouldRandom(.25);
348
- let res;
349
- const recurse = (outputPath, config, forceNested, forceNonNull) => {
350
- let subConfig = config[Math.floor(Math.random() * config.length)];
351
- const originalValue = isObjectLike(subConfig) ? Array.isArray(subConfig) ? [] : {} : subConfig;
352
- const newValue = forceNonNull || !shouldNull() ? originalValue : null;
353
- const newOutputPath = forceNested || shouldMakeNested(originalValue) || outputPath.length === 0 ? outputPath : [outputPath.join(".")];
354
- if (outputPath.length === 0) res = newValue;
355
- else if (forceNested || shouldKeep(originalValue)) setDeep(res, newOutputPath, newValue);
356
- if (isObjectLike(subConfig)) for (const [key, newValue] of typedEntries(subConfig)) recurse([...newOutputPath, key], newValue, Array.isArray(subConfig), Array.isArray(subConfig));
357
- };
358
- recurse([], config, false, true);
359
- return res;
360
- }
361
- (void 0)?.test("fuzz schemas", async ({ expect }) => {
362
- const totalIterations = process.env.CI ? 1e3 : 200;
363
- for (let i = 0; i < totalIterations; i++) {
364
- const projectInput = createFuzzerInput(projectSchemaFuzzerConfig, i / totalIterations);
365
- const branchInput = createFuzzerInput(branchSchemaFuzzerConfig, i / totalIterations);
366
- const environmentInput = createFuzzerInput(environmentSchemaFuzzerConfig, i / totalIterations);
367
- const organizationInput = createFuzzerInput(organizationSchemaFuzzerConfig, i / totalIterations);
368
- try {
369
- const projectMigrated = migrateConfigOverride("project", projectInput);
370
- await assertNoConfigOverrideErrors(projectConfigSchema, projectMigrated);
371
- const projectOverridden = override({}, projectMigrated);
372
- await sanitizeProjectConfig(normalize(applyProjectDefaults(projectOverridden), { onDotIntoNonObject: "ignore" }));
373
- const branchMigrated = migrateConfigOverride("branch", branchInput);
374
- await assertNoConfigOverrideErrors(branchConfigSchema, branchMigrated);
375
- const branchOverridden = override(projectOverridden, branchMigrated);
376
- await sanitizeBranchConfig(normalize(applyBranchDefaults(branchOverridden), { onDotIntoNonObject: "ignore" }));
377
- const environmentMigrated = migrateConfigOverride("environment", environmentInput);
378
- await assertNoConfigOverrideErrors(environmentConfigSchema, environmentMigrated);
379
- const environmentOverridden = override(branchOverridden, environmentMigrated);
380
- await sanitizeEnvironmentConfig(normalize(applyEnvironmentDefaults(environmentOverridden), { onDotIntoNonObject: "ignore" }));
381
- const organizationMigrated = migrateConfigOverride("organization", organizationInput);
382
- await assertNoConfigOverrideErrors(organizationConfigSchema, organizationMigrated);
383
- await sanitizeOrganizationConfig(normalize(applyOrganizationDefaults(override(environmentOverridden, organizationMigrated)), { onDotIntoNonObject: "ignore" }));
384
- } catch (e) {
385
- const data = {
386
- cause: e,
387
- inputs: {
388
- projectInput,
389
- branchInput,
390
- environmentInput,
391
- organizationInput
392
- }
393
- };
394
- console.error("Failed to fuzz schema in iteration ${i}/${totalIterations}!", nicify(data));
395
- throw new HexclaveAssertionError(`Error in iteration ${i}/${totalIterations} of schema fuzz: ${e}`, { cause: e });
396
- }
397
- }
398
- });
399
- (void 0)?.test("rejects include-by-default product prices in config overrides", async ({ expect }) => {
400
- await expect(assertNoConfigOverrideErrors(branchConfigSchema, { "payments.products.free.prices": "include-by-default" })).rejects.toThrow(/payments\.products\.free\.prices must not be one of the following values: include-by-default/);
401
- });
402
-
236
+ ({ ...branchSchemaFuzzerConfig[0] }), { ...branchSchemaFuzzerConfig[0].auth[0] }, { ...branchSchemaFuzzerConfig[0].auth[0].oauth[0] }, typedFromEntries(typedEntries(branchSchemaFuzzerConfig[0].auth[0].oauth[0].providers[0]).map(([key, value]) => [key, [{
237
+ ...value[0],
238
+ isShared: [true, false],
239
+ clientId: ["some-client-id"],
240
+ clientSecret: ["some-client-secret"],
241
+ customCallbackUrl: [void 0],
242
+ facebookConfigId: ["some-facebook-config-id"],
243
+ microsoftTenantId: ["some-microsoft-tenant-id"],
244
+ appleBundles: [{ "some-bundle-id": [{ bundleId: ["com.example.app"] }] }],
245
+ issuerUrl: [void 0, "https://accounts.google.com"],
246
+ scope: [void 0, "openid email profile"],
247
+ displayName: [void 0, "My OIDC Provider"]
248
+ }]])), { ...branchSchemaFuzzerConfig[0].emails[0] }, { ...branchSchemaFuzzerConfig[0].payments[0] };
403
249
  //#endregion
404
- export { };
250
+ export {};
251
+
405
252
  //# sourceMappingURL=schema-fuzzer.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema-fuzzer.test.js","names":[],"sources":["../../../src/config/schema-fuzzer.test.ts"],"sourcesContent":["import { ALL_APPS } from \"../apps/apps-config\";\nimport { SUPPORTED_CURRENCIES } from \"../utils/currency-constants\";\nimport { HexclaveAssertionError } from \"../utils/errors\";\nimport { getOrUndefined, isObjectLike, set, typedEntries, typedFromEntries } from \"../utils/objects\";\nimport { nicify } from \"../utils/strings\";\nimport { normalize, override } from \"./format\";\nimport { BranchConfigNormalizedOverride, EnvironmentConfigNormalizedOverride, OrganizationConfigNormalizedOverride, ProjectConfigNormalizedOverride, applyBranchDefaults, applyEnvironmentDefaults, applyOrganizationDefaults, applyProjectDefaults, assertNoConfigOverrideErrors, branchConfigSchema, environmentConfigSchema, migrateConfigOverride, organizationConfigSchema, projectConfigSchema, sanitizeBranchConfig, sanitizeEnvironmentConfig, sanitizeOrganizationConfig, sanitizeProjectConfig } from \"./schema\";\n\ntype FuzzerConfig<T> = ReadonlyArray<T extends object ? ([T] extends [any[]] ? { readonly [K in keyof T]: FuzzerConfig<T[K]> } : Required<{\n [K in keyof T]: FuzzerConfig<T[K]>;\n}> & Record<string, FuzzerConfig<any>>) : T>;\n\nconst projectSchemaFuzzerConfig = [{\n sourceOfTruth: [{\n type: [\"hosted\"],\n }],\n project: [{\n requirePublishableClientKey: [true, false],\n }],\n}] satisfies FuzzerConfig<ProjectConfigNormalizedOverride>;\n\nconst branchSchemaFuzzerConfig = [{\n apiKeys: [{\n enabled: [{\n team: [true, false],\n user: [true, false],\n }],\n }],\n auth: [{\n allowSignUp: [true, false],\n password: [{\n allowSignIn: [true, false],\n }],\n otp: [{\n allowSignIn: [true, false],\n }],\n passkey: [{\n allowSignIn: [true, false],\n }],\n oauth: [{\n accountMergeStrategy: [\"link_method\", \"raise_error\", \"allow_duplicates\"],\n providers: [{\n \"google\": [{\n type: [\"google\", \"github\", \"x\"] as const,\n allowSignIn: [true, false],\n allowConnectedAccounts: [true, false],\n }],\n }],\n }],\n signUpRules: [{\n \"some-rule-id\": [{\n enabled: [true, false],\n displayName: [\"Block Test Emails\", \"Allow Only Company Domain\"],\n priority: [0, 1, 100],\n condition: ['email.endsWith(\"@test.com\")', 'emailDomain == \"company.com\"'],\n action: [{\n type: [\"allow\", \"reject\", \"restrict\", \"log\"] as const,\n message: [\"\", \"Sign up is not allowed for this email\"],\n }],\n }],\n }],\n signUpRulesDefaultAction: [\"allow\", \"reject\"],\n }],\n dbSync: [{\n externalDatabases: [{\n \"some-external-db-id\": [{\n type: [\"postgres\"] as const,\n connectionString: [\n \"postgres://user:password@host:port/database\",\n \"some-connection-string\",\n ],\n }],\n }],\n }],\n dataVault: [{\n stores: [{\n \"some-store-id\": [{\n displayName: [\"Some Store\", \"Some Other Store\"],\n }],\n \"some-other-store-id\": [{\n displayName: [\"Some Store\", \"Some Other Store\"],\n }],\n }],\n }],\n payments: [{\n blockNewPurchases: [false, true],\n autoPay: [{\n interval: [[[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n }],\n productLines: [{\n \"some-product-line-id\": [{\n displayName: [\"Some Product Line\", \"Some Other Product Line\"],\n customerType: [\"user\", \"team\", \"custom\"] as const,\n }],\n }],\n catalogs: [{ // ensure migration works\n \"some-product-line-id\": [{\n displayName: [\"Some Product Line\", \"Some Other Product Line\"],\n }],\n }],\n groups: [{ // ensure migration works\n \"some-product-line-id\": [{\n displayName: [\"Some Product Line\", \"Some Other Product Line\"],\n }],\n }],\n items: [{\n \"some-item-id\": [{\n customerType: [\"user\", \"team\", \"custom\"] as const,\n displayName: [\"Some Item\", \"Some Other Item\"],\n }],\n }],\n products: [{\n \"some-product-id\": [{\n displayName: [\"Some Product\", \"Some Other Product\"],\n customerType: [\"user\", \"team\", \"custom\"] as const,\n freeTrial: [[[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n serverOnly: [true, false],\n stackable: [true, false],\n productLineId: [\"some-product-line-id\", \"some-other-product-line-id\"],\n catalogId: [\"some-product-line-id\", \"some-other-product-line-id\"], // ensure migration works\n groupId: [\"some-product-line-id\", \"some-other-product-line-id\"], // ensure migration works\n isAddOnTo: [false, { \"some-product-id\": [true], \"some-other-product-id\": [true] }] as const,\n prices: [{\n \"some-price-id\": [{\n ...typedFromEntries(SUPPORTED_CURRENCIES.map(currency => [currency.code, [\"100_00\", \"not a number\", \"Infinity\", \"0\"]])),\n interval: [[[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n serverOnly: [true, false],\n freeTrial: [[[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n }],\n }],\n includedItems: [{\n \"some-item-id\": [{\n quantity: [0, 1, -3, 100, 0.333, Infinity],\n repeat: [\"never\", [[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n expires: [\"never\", \"when-purchase-expires\", \"when-repeated\"] as const,\n }],\n }],\n }],\n }],\n }],\n emails: [{\n themes: [{\n \"12345678-1234-4234-9234-123456789012\": [{\n displayName: [\"Some Theme\", \"Some Other Theme\"],\n tsxSource: [\"\", \"some typescript source code\"],\n }],\n }],\n selectedThemeId: [\"some-theme-id\", \"some-other-theme-id\"],\n templates: [{\n \"12345678-1234-4234-9234-123456789012\": [{\n themeId: [\"some-theme-id\", \"some-other-theme-id\"],\n displayName: [\"Some Template\", \"Some Other Template\"],\n tsxSource: [\"\", \"some typescript source code\"],\n }],\n }],\n }],\n teams: [{\n createPersonalTeamOnSignUp: [true, false],\n allowClientTeamCreation: [true, false],\n }],\n users: [{\n allowClientUserDeletion: [true, false],\n }],\n rbac: [{\n permissions: [{\n \"some_permission_id\": [{\n containedPermissionIds: [{\n \"some_permission_id\": [true],\n \"$some_other_permission_id\": [true],\n }] as const,\n description: [\"Some Permission\", \"Some Other Permission\"],\n scope: [\"team\", \"project\"] as const,\n }],\n }],\n defaultPermissions: [{\n teamCreator: [{\n \"some_permission_id\": [true],\n \"$some_other_permission_id\": [true],\n }] as const,\n teamMember: [{\n \"some_permission_id\": [true],\n \"$some_other_permission_id\": [true],\n }] as const,\n signUp: [{\n \"some_permission_id\": [true],\n \"$some_other_permission_id\": [true],\n }] as const,\n }],\n }],\n domains: [{}],\n apps: [{\n installed: [typedFromEntries(typedEntries(ALL_APPS).map(([key, value]) => [key, [{\n enabled: [true, false],\n }]]))],\n }],\n onboarding: [{\n requireEmailVerification: [true, false],\n }],\n}] satisfies FuzzerConfig<BranchConfigNormalizedOverride>;\n\nconst environmentSchemaFuzzerConfig = [{\n ...branchSchemaFuzzerConfig[0],\n auth: [{\n ...branchSchemaFuzzerConfig[0].auth[0],\n oauth: [{\n ...branchSchemaFuzzerConfig[0].auth[0].oauth[0],\n providers: [typedFromEntries(typedEntries(branchSchemaFuzzerConfig[0].auth[0].oauth[0].providers[0]).map(([key, value]) => [key, [{\n ...value[0],\n isShared: [true, false],\n clientId: [\"some-client-id\"],\n clientSecret: [\"some-client-secret\"],\n // Kept undefined: the schema forbids customCallbackUrl when isShared is\n // true, and the fuzzer randomizes each field independently so it cannot\n // honor that coupling. The accept path is covered by an e2e test.\n customCallbackUrl: [undefined] as (string | undefined)[],\n facebookConfigId: [\"some-facebook-config-id\"],\n microsoftTenantId: [\"some-microsoft-tenant-id\"],\n appleBundles: [{ \"some-bundle-id\": [{ bundleId: [\"com.example.app\"] }] }],\n issuerUrl: [undefined, \"https://accounts.google.com\"] as (string | undefined)[],\n scope: [undefined, \"openid email profile\"] as (string | undefined)[],\n displayName: [undefined, \"My OIDC Provider\"] as (string | undefined)[],\n }]]))] as const,\n }],\n }],\n domains: [{\n allowLocalhost: [true, false],\n trustedDomains: [{\n \"some-domain-id\": [{\n baseUrl: [\"https://example.com/something-here\"],\n handlerPath: [\"/something-here\"],\n }],\n }],\n }],\n emails: [{\n ...branchSchemaFuzzerConfig[0].emails[0],\n server: [{\n isShared: [true, false],\n provider: [\"resend\", \"smtp\", \"managed\"] as const,\n host: [\"example.com\", \"://super weird host that's not valid\"],\n port: [1234, 0.12543, -100, Infinity],\n username: [\"some-username\", \"some username with a space\"],\n password: [\"some-password\", \"some password with a space\"],\n senderName: [\"Some Sender\"],\n senderEmail: [\"some-sender@example.com\", \"some invalid email\"],\n managedSubdomain: [\"mail.example.com\", \"invalid subdomain\"],\n managedSenderLocalPart: [\"noreply\", \"some invalid local part\"],\n }],\n }],\n payments: [{\n ...branchSchemaFuzzerConfig[0].payments[0],\n testMode: [false, true],\n }],\n analytics: [{\n queryFolders: [{\n \"some-folder-id\": [{\n displayName: [\"Some Folder\", \"Some Other Folder\"],\n sortOrder: [0, 1, 10, -5],\n queries: [{\n \"some-query-id\": [{\n displayName: [\"Some Query\", \"Some Other Query\"],\n sqlQuery: [\"\", \"SELECT * FROM events\", \"SELECT * FROM users\"],\n description: [\"\", \"A query description\", \"Another description\"],\n }],\n }],\n }],\n }],\n }],\n customDashboards: [{\n \"12345678-1234-4234-9234-123456789012\": [{\n displayName: [\"My Dashboard\", \"User Growth Dashboard\"],\n tsxSource: [\"\", \"function Dashboard() { return <div>Hello</div>; }\"],\n }],\n }],\n}] satisfies FuzzerConfig<EnvironmentConfigNormalizedOverride>;\n\nconst organizationSchemaFuzzerConfig = environmentSchemaFuzzerConfig satisfies FuzzerConfig<OrganizationConfigNormalizedOverride>;\n\nfunction setDeep<T>(obj: T, path: string[], value: any) {\n if (!isObjectLike(obj)) return obj;\n\n if (path.length === 0) {\n throw new Error(\"Path is empty\");\n } else if (path.length === 1) {\n set(obj as any, path[0], value);\n } else {\n const [key, ...rest] = path;\n setDeep(getOrUndefined(obj as any, key), rest, value);\n }\n}\n\nfunction createFuzzerInput<T>(config: FuzzerConfig<T>, progress: number): T {\n progress = Math.min(1, 2 * progress);\n const createShouldRandom = (strength: number) => {\n const chance = Math.random() * strength * 1.2 - 0.1;\n return () => Math.random() < chance;\n };\n const createShouldObjectDependent = (strength: number) => {\n const objectChance = Math.random() * strength * 1.2 - 0.1;\n const primitiveChance = Math.random() * strength * 1.2 - 0.1;\n return (v: any) => Math.random() * Math.random() < (isObjectLike(v) ? objectChance : primitiveChance);\n };\n\n const shouldKeep = createShouldObjectDependent(progress * 1);\n const shouldMakeNested = createShouldObjectDependent(1.25);\n const shouldNull = createShouldRandom(0.25);\n\n let res: any;\n const recurse = <U>(outputPath: string[], config: FuzzerConfig<U>, forceNested: boolean, forceNonNull: boolean) => {\n let subConfig: any = config[Math.floor(Math.random() * config.length)];\n const originalValue = isObjectLike(subConfig) ? (Array.isArray(subConfig) ? [] : {}) : subConfig;\n\n const newValue = forceNonNull || !shouldNull() ? originalValue : null;\n const newOutputPath = forceNested || shouldMakeNested(originalValue) || outputPath.length === 0 ? outputPath : [outputPath.join(\".\")];\n if (outputPath.length === 0) {\n res = newValue;\n } else {\n if (forceNested || shouldKeep(originalValue)) {\n setDeep(res, newOutputPath, newValue);\n }\n }\n if (isObjectLike(subConfig)) {\n for (const [key, newValue] of typedEntries(subConfig)) {\n recurse([...newOutputPath, key], newValue, Array.isArray(subConfig), Array.isArray(subConfig));\n }\n }\n };\n recurse<T>([], config, false, true);\n return res;\n}\n\nimport.meta.vitest?.test(\"fuzz schemas\", async ({ expect }) => {\n const totalIterations = process.env.CI ? 1000 : 200;\n for (let i = 0; i < totalIterations; i++) {\n const projectInput = createFuzzerInput<ProjectConfigNormalizedOverride>(projectSchemaFuzzerConfig, i / totalIterations);\n const branchInput = createFuzzerInput<BranchConfigNormalizedOverride>(branchSchemaFuzzerConfig, i / totalIterations);\n const environmentInput = createFuzzerInput<EnvironmentConfigNormalizedOverride>(environmentSchemaFuzzerConfig, i / totalIterations);\n const organizationInput = createFuzzerInput<OrganizationConfigNormalizedOverride>(organizationSchemaFuzzerConfig, i / totalIterations);\n\n try {\n const projectMigrated = migrateConfigOverride(\"project\", projectInput);\n await assertNoConfigOverrideErrors(projectConfigSchema, projectMigrated);\n const projectOverridden = override({}, projectMigrated);\n await sanitizeProjectConfig(normalize(applyProjectDefaults(projectOverridden), { onDotIntoNonObject: \"ignore\" }) as any);\n\n const branchMigrated = migrateConfigOverride(\"branch\", branchInput);\n await assertNoConfigOverrideErrors(branchConfigSchema, branchMigrated);\n const branchOverridden = override(projectOverridden, branchMigrated);\n await sanitizeBranchConfig(normalize(applyBranchDefaults(branchOverridden), { onDotIntoNonObject: \"ignore\" }) as any);\n\n const environmentMigrated = migrateConfigOverride(\"environment\", environmentInput);\n await assertNoConfigOverrideErrors(environmentConfigSchema, environmentMigrated);\n const environmentOverridden = override(branchOverridden, environmentMigrated);\n await sanitizeEnvironmentConfig(normalize(applyEnvironmentDefaults(environmentOverridden), { onDotIntoNonObject: \"ignore\" }) as any);\n\n const organizationMigrated = migrateConfigOverride(\"organization\", organizationInput);\n await assertNoConfigOverrideErrors(organizationConfigSchema, organizationMigrated);\n const organizationOverridden = override(environmentOverridden, organizationMigrated);\n await sanitizeOrganizationConfig(normalize(applyOrganizationDefaults(organizationOverridden), { onDotIntoNonObject: \"ignore\" }) as any);\n\n } catch (e) {\n const data = {\n cause: e,\n inputs: {\n projectInput,\n branchInput,\n environmentInput,\n organizationInput,\n },\n } as const;\n console.error(\"Failed to fuzz schema in iteration ${i}/${totalIterations}!\", nicify(data));\n throw new HexclaveAssertionError(`Error in iteration ${i}/${totalIterations} of schema fuzz: ${e}`, { cause: e });\n }\n }\n});\n\nimport.meta.vitest?.test(\"rejects include-by-default product prices in config overrides\", async ({ expect }) => {\n await expect(assertNoConfigOverrideErrors(branchConfigSchema, {\n \"payments.products.free.prices\": \"include-by-default\",\n })).rejects.toThrow(/payments\\.products\\.free\\.prices must not be one of the following values: include-by-default/);\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"schema-fuzzer.test.js","names":[],"sources":["../../../src/config/schema-fuzzer.test.ts"],"sourcesContent":["import { ALL_APPS } from \"../apps/apps-config\";\nimport { SUPPORTED_CURRENCIES } from \"../utils/currency-constants\";\nimport { HexclaveAssertionError } from \"../utils/errors\";\nimport { getOrUndefined, isObjectLike, set, typedEntries, typedFromEntries } from \"../utils/objects\";\nimport { nicify } from \"../utils/strings\";\nimport { normalize, override } from \"./format\";\nimport { BranchConfigNormalizedOverride, EnvironmentConfigNormalizedOverride, OrganizationConfigNormalizedOverride, ProjectConfigNormalizedOverride, applyBranchDefaults, applyEnvironmentDefaults, applyOrganizationDefaults, applyProjectDefaults, assertNoConfigOverrideErrors, branchConfigSchema, environmentConfigSchema, migrateConfigOverride, organizationConfigSchema, projectConfigSchema, sanitizeBranchConfig, sanitizeEnvironmentConfig, sanitizeOrganizationConfig, sanitizeProjectConfig } from \"./schema\";\n\ntype FuzzerConfig<T> = ReadonlyArray<T extends object ? ([T] extends [any[]] ? { readonly [K in keyof T]: FuzzerConfig<T[K]> } : Required<{\n [K in keyof T]: FuzzerConfig<T[K]>;\n}> & Record<string, FuzzerConfig<any>>) : T>;\n\nconst projectSchemaFuzzerConfig = [{\n sourceOfTruth: [{\n type: [\"hosted\"],\n }],\n project: [{\n requirePublishableClientKey: [true, false],\n }],\n}] satisfies FuzzerConfig<ProjectConfigNormalizedOverride>;\n\nconst branchSchemaFuzzerConfig = [{\n apiKeys: [{\n enabled: [{\n team: [true, false],\n user: [true, false],\n }],\n }],\n auth: [{\n allowSignUp: [true, false],\n password: [{\n allowSignIn: [true, false],\n }],\n otp: [{\n allowSignIn: [true, false],\n }],\n passkey: [{\n allowSignIn: [true, false],\n }],\n oauth: [{\n accountMergeStrategy: [\"link_method\", \"raise_error\", \"allow_duplicates\"],\n providers: [{\n \"google\": [{\n type: [\"google\", \"github\", \"x\"] as const,\n allowSignIn: [true, false],\n allowConnectedAccounts: [true, false],\n }],\n }],\n }],\n signUpRules: [{\n \"some-rule-id\": [{\n enabled: [true, false],\n displayName: [\"Block Test Emails\", \"Allow Only Company Domain\"],\n priority: [0, 1, 100],\n condition: ['email.endsWith(\"@test.com\")', 'emailDomain == \"company.com\"'],\n action: [{\n type: [\"allow\", \"reject\", \"restrict\", \"log\"] as const,\n message: [\"\", \"Sign up is not allowed for this email\"],\n }],\n }],\n }],\n signUpRulesDefaultAction: [\"allow\", \"reject\"],\n }],\n dbSync: [{\n externalDatabases: [{\n \"some-external-db-id\": [{\n type: [\"postgres\"] as const,\n connectionString: [\n \"postgres://user:password@host:port/database\",\n \"some-connection-string\",\n ],\n }],\n }],\n }],\n dataVault: [{\n stores: [{\n \"some-store-id\": [{\n displayName: [\"Some Store\", \"Some Other Store\"],\n }],\n \"some-other-store-id\": [{\n displayName: [\"Some Store\", \"Some Other Store\"],\n }],\n }],\n }],\n payments: [{\n blockNewPurchases: [false, true],\n autoPay: [{\n interval: [[[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n }],\n productLines: [{\n \"some-product-line-id\": [{\n displayName: [\"Some Product Line\", \"Some Other Product Line\"],\n customerType: [\"user\", \"team\", \"custom\"] as const,\n }],\n }],\n catalogs: [{ // ensure migration works\n \"some-product-line-id\": [{\n displayName: [\"Some Product Line\", \"Some Other Product Line\"],\n }],\n }],\n groups: [{ // ensure migration works\n \"some-product-line-id\": [{\n displayName: [\"Some Product Line\", \"Some Other Product Line\"],\n }],\n }],\n items: [{\n \"some-item-id\": [{\n customerType: [\"user\", \"team\", \"custom\"] as const,\n displayName: [\"Some Item\", \"Some Other Item\"],\n }],\n }],\n products: [{\n \"some-product-id\": [{\n displayName: [\"Some Product\", \"Some Other Product\"],\n customerType: [\"user\", \"team\", \"custom\"] as const,\n freeTrial: [[[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n serverOnly: [true, false],\n stackable: [true, false],\n productLineId: [\"some-product-line-id\", \"some-other-product-line-id\"],\n catalogId: [\"some-product-line-id\", \"some-other-product-line-id\"], // ensure migration works\n groupId: [\"some-product-line-id\", \"some-other-product-line-id\"], // ensure migration works\n isAddOnTo: [false, { \"some-product-id\": [true], \"some-other-product-id\": [true] }] as const,\n prices: [{\n \"some-price-id\": [{\n ...typedFromEntries(SUPPORTED_CURRENCIES.map(currency => [currency.code, [\"100_00\", \"not a number\", \"Infinity\", \"0\"]])),\n interval: [[[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n serverOnly: [true, false],\n freeTrial: [[[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n }],\n }],\n includedItems: [{\n \"some-item-id\": [{\n quantity: [0, 1, -3, 100, 0.333, Infinity],\n repeat: [\"never\", [[0, 1, -3, 100, 0.333, Infinity], [\"day\", \"week\", \"month\", \"year\"]]] as const,\n expires: [\"never\", \"when-purchase-expires\", \"when-repeated\"] as const,\n }],\n }],\n }],\n }],\n }],\n emails: [{\n themes: [{\n \"12345678-1234-4234-9234-123456789012\": [{\n displayName: [\"Some Theme\", \"Some Other Theme\"],\n tsxSource: [\"\", \"some typescript source code\"],\n }],\n }],\n selectedThemeId: [\"some-theme-id\", \"some-other-theme-id\"],\n templates: [{\n \"12345678-1234-4234-9234-123456789012\": [{\n themeId: [\"some-theme-id\", \"some-other-theme-id\"],\n displayName: [\"Some Template\", \"Some Other Template\"],\n tsxSource: [\"\", \"some typescript source code\"],\n }],\n }],\n }],\n teams: [{\n createPersonalTeamOnSignUp: [true, false],\n allowClientTeamCreation: [true, false],\n }],\n users: [{\n allowClientUserDeletion: [true, false],\n }],\n rbac: [{\n permissions: [{\n \"some_permission_id\": [{\n containedPermissionIds: [{\n \"some_permission_id\": [true],\n \"$some_other_permission_id\": [true],\n }] as const,\n description: [\"Some Permission\", \"Some Other Permission\"],\n scope: [\"team\", \"project\"] as const,\n }],\n }],\n defaultPermissions: [{\n teamCreator: [{\n \"some_permission_id\": [true],\n \"$some_other_permission_id\": [true],\n }] as const,\n teamMember: [{\n \"some_permission_id\": [true],\n \"$some_other_permission_id\": [true],\n }] as const,\n signUp: [{\n \"some_permission_id\": [true],\n \"$some_other_permission_id\": [true],\n }] as const,\n }],\n }],\n domains: [{}],\n apps: [{\n installed: [typedFromEntries(typedEntries(ALL_APPS).map(([key, value]) => [key, [{\n enabled: [true, false],\n }]]))],\n }],\n onboarding: [{\n requireEmailVerification: [true, false],\n }],\n}] satisfies FuzzerConfig<BranchConfigNormalizedOverride>;\n\nconst environmentSchemaFuzzerConfig = [{\n ...branchSchemaFuzzerConfig[0],\n auth: [{\n ...branchSchemaFuzzerConfig[0].auth[0],\n oauth: [{\n ...branchSchemaFuzzerConfig[0].auth[0].oauth[0],\n providers: [typedFromEntries(typedEntries(branchSchemaFuzzerConfig[0].auth[0].oauth[0].providers[0]).map(([key, value]) => [key, [{\n ...value[0],\n isShared: [true, false],\n clientId: [\"some-client-id\"],\n clientSecret: [\"some-client-secret\"],\n // Kept undefined: the schema forbids customCallbackUrl when isShared is\n // true, and the fuzzer randomizes each field independently so it cannot\n // honor that coupling. The accept path is covered by an e2e test.\n customCallbackUrl: [undefined] as (string | undefined)[],\n facebookConfigId: [\"some-facebook-config-id\"],\n microsoftTenantId: [\"some-microsoft-tenant-id\"],\n appleBundles: [{ \"some-bundle-id\": [{ bundleId: [\"com.example.app\"] }] }],\n issuerUrl: [undefined, \"https://accounts.google.com\"] as (string | undefined)[],\n scope: [undefined, \"openid email profile\"] as (string | undefined)[],\n displayName: [undefined, \"My OIDC Provider\"] as (string | undefined)[],\n }]]))] as const,\n }],\n }],\n domains: [{\n allowLocalhost: [true, false],\n trustedDomains: [{\n \"some-domain-id\": [{\n baseUrl: [\"https://example.com/something-here\"],\n handlerPath: [\"/something-here\"],\n }],\n }],\n }],\n emails: [{\n ...branchSchemaFuzzerConfig[0].emails[0],\n server: [{\n isShared: [true, false],\n provider: [\"resend\", \"smtp\", \"managed\"] as const,\n host: [\"example.com\", \"://super weird host that's not valid\"],\n port: [1234, 0.12543, -100, Infinity],\n username: [\"some-username\", \"some username with a space\"],\n password: [\"some-password\", \"some password with a space\"],\n senderName: [\"Some Sender\"],\n senderEmail: [\"some-sender@example.com\", \"some invalid email\"],\n managedSubdomain: [\"mail.example.com\", \"invalid subdomain\"],\n managedSenderLocalPart: [\"noreply\", \"some invalid local part\"],\n }],\n }],\n payments: [{\n ...branchSchemaFuzzerConfig[0].payments[0],\n testMode: [false, true],\n }],\n analytics: [{\n queryFolders: [{\n \"some-folder-id\": [{\n displayName: [\"Some Folder\", \"Some Other Folder\"],\n sortOrder: [0, 1, 10, -5],\n queries: [{\n \"some-query-id\": [{\n displayName: [\"Some Query\", \"Some Other Query\"],\n sqlQuery: [\"\", \"SELECT * FROM events\", \"SELECT * FROM users\"],\n description: [\"\", \"A query description\", \"Another description\"],\n }],\n }],\n }],\n }],\n }],\n customDashboards: [{\n \"12345678-1234-4234-9234-123456789012\": [{\n displayName: [\"My Dashboard\", \"User Growth Dashboard\"],\n tsxSource: [\"\", \"function Dashboard() { return <div>Hello</div>; }\"],\n }],\n }],\n}] satisfies FuzzerConfig<EnvironmentConfigNormalizedOverride>;\n\nconst organizationSchemaFuzzerConfig = environmentSchemaFuzzerConfig satisfies FuzzerConfig<OrganizationConfigNormalizedOverride>;\n\nfunction setDeep<T>(obj: T, path: string[], value: any) {\n if (!isObjectLike(obj)) return obj;\n\n if (path.length === 0) {\n throw new Error(\"Path is empty\");\n } else if (path.length === 1) {\n set(obj as any, path[0], value);\n } else {\n const [key, ...rest] = path;\n setDeep(getOrUndefined(obj as any, key), rest, value);\n }\n}\n\nfunction createFuzzerInput<T>(config: FuzzerConfig<T>, progress: number): T {\n progress = Math.min(1, 2 * progress);\n const createShouldRandom = (strength: number) => {\n const chance = Math.random() * strength * 1.2 - 0.1;\n return () => Math.random() < chance;\n };\n const createShouldObjectDependent = (strength: number) => {\n const objectChance = Math.random() * strength * 1.2 - 0.1;\n const primitiveChance = Math.random() * strength * 1.2 - 0.1;\n return (v: any) => Math.random() * Math.random() < (isObjectLike(v) ? objectChance : primitiveChance);\n };\n\n const shouldKeep = createShouldObjectDependent(progress * 1);\n const shouldMakeNested = createShouldObjectDependent(1.25);\n const shouldNull = createShouldRandom(0.25);\n\n let res: any;\n const recurse = <U>(outputPath: string[], config: FuzzerConfig<U>, forceNested: boolean, forceNonNull: boolean) => {\n let subConfig: any = config[Math.floor(Math.random() * config.length)];\n const originalValue = isObjectLike(subConfig) ? (Array.isArray(subConfig) ? [] : {}) : subConfig;\n\n const newValue = forceNonNull || !shouldNull() ? originalValue : null;\n const newOutputPath = forceNested || shouldMakeNested(originalValue) || outputPath.length === 0 ? outputPath : [outputPath.join(\".\")];\n if (outputPath.length === 0) {\n res = newValue;\n } else {\n if (forceNested || shouldKeep(originalValue)) {\n setDeep(res, newOutputPath, newValue);\n }\n }\n if (isObjectLike(subConfig)) {\n for (const [key, newValue] of typedEntries(subConfig)) {\n recurse([...newOutputPath, key], newValue, Array.isArray(subConfig), Array.isArray(subConfig));\n }\n }\n };\n recurse<T>([], config, false, true);\n return res;\n}\n\nimport.meta.vitest?.test(\"fuzz schemas\", async ({ expect }) => {\n const totalIterations = process.env.CI ? 1000 : 200;\n for (let i = 0; i < totalIterations; i++) {\n const projectInput = createFuzzerInput<ProjectConfigNormalizedOverride>(projectSchemaFuzzerConfig, i / totalIterations);\n const branchInput = createFuzzerInput<BranchConfigNormalizedOverride>(branchSchemaFuzzerConfig, i / totalIterations);\n const environmentInput = createFuzzerInput<EnvironmentConfigNormalizedOverride>(environmentSchemaFuzzerConfig, i / totalIterations);\n const organizationInput = createFuzzerInput<OrganizationConfigNormalizedOverride>(organizationSchemaFuzzerConfig, i / totalIterations);\n\n try {\n const projectMigrated = migrateConfigOverride(\"project\", projectInput);\n await assertNoConfigOverrideErrors(projectConfigSchema, projectMigrated);\n const projectOverridden = override({}, projectMigrated);\n await sanitizeProjectConfig(normalize(applyProjectDefaults(projectOverridden), { onDotIntoNonObject: \"ignore\" }) as any);\n\n const branchMigrated = migrateConfigOverride(\"branch\", branchInput);\n await assertNoConfigOverrideErrors(branchConfigSchema, branchMigrated);\n const branchOverridden = override(projectOverridden, branchMigrated);\n await sanitizeBranchConfig(normalize(applyBranchDefaults(branchOverridden), { onDotIntoNonObject: \"ignore\" }) as any);\n\n const environmentMigrated = migrateConfigOverride(\"environment\", environmentInput);\n await assertNoConfigOverrideErrors(environmentConfigSchema, environmentMigrated);\n const environmentOverridden = override(branchOverridden, environmentMigrated);\n await sanitizeEnvironmentConfig(normalize(applyEnvironmentDefaults(environmentOverridden), { onDotIntoNonObject: \"ignore\" }) as any);\n\n const organizationMigrated = migrateConfigOverride(\"organization\", organizationInput);\n await assertNoConfigOverrideErrors(organizationConfigSchema, organizationMigrated);\n const organizationOverridden = override(environmentOverridden, organizationMigrated);\n await sanitizeOrganizationConfig(normalize(applyOrganizationDefaults(organizationOverridden), { onDotIntoNonObject: \"ignore\" }) as any);\n\n } catch (e) {\n const data = {\n cause: e,\n inputs: {\n projectInput,\n branchInput,\n environmentInput,\n organizationInput,\n },\n } as const;\n console.error(\"Failed to fuzz schema in iteration ${i}/${totalIterations}!\", nicify(data));\n throw new HexclaveAssertionError(`Error in iteration ${i}/${totalIterations} of schema fuzz: ${e}`, { cause: e });\n }\n }\n});\n\nimport.meta.vitest?.test(\"rejects include-by-default product prices in config overrides\", async ({ expect }) => {\n await expect(assertNoConfigOverrideErrors(branchConfigSchema, {\n \"payments.products.free.prices\": \"include-by-default\",\n })).rejects.toThrow(/payments\\.products\\.free\\.prices must not be one of the following values: include-by-default/);\n});\n"],"mappings":"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"}