@hexclave/shared 1.0.41 → 1.0.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1066) hide show
  1. package/dist/admin-interface-Y9EZqwD6.d.ts +379 -0
  2. package/dist/admin-interface-Y9EZqwD6.d.ts.map +1 -0
  3. package/dist/admin-metrics-bsOkw4YQ.d.ts +807 -0
  4. package/dist/admin-metrics-bsOkw4YQ.d.ts.map +1 -0
  5. package/dist/ai/image-limits.d.ts.map +1 -1
  6. package/dist/ai/image-limits.js +6 -7
  7. package/dist/ai/image-limits.js.map +1 -1
  8. package/dist/ai/llms/llms.d.ts.map +1 -1
  9. package/dist/ai/llms/llms.js +2 -4
  10. package/dist/ai/llms/llms.js.map +1 -1
  11. package/dist/ai/unified-prompts/reminders.js +3 -6
  12. package/dist/ai/unified-prompts/reminders.js.map +1 -1
  13. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
  14. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +2 -5
  15. package/dist/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
  16. package/dist/ai/unified-prompts/skill-site-prompt-parts/brain.js +3 -6
  17. package/dist/ai/unified-prompts/skill-site-prompt-parts/brain.js.map +1 -1
  18. package/dist/ai/unified-prompts/skill-site-prompt-parts/cli-help.js +3 -6
  19. package/dist/ai/unified-prompts/skill-site-prompt-parts/cli-help.js.map +1 -1
  20. package/dist/ai/unified-prompts/skill-site-prompt-parts/config-docs.js +3 -6
  21. package/dist/ai/unified-prompts/skill-site-prompt-parts/config-docs.js.map +1 -1
  22. package/dist/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js +3 -6
  23. package/dist/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js.map +1 -1
  24. package/dist/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js +3 -6
  25. package/dist/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js.map +1 -1
  26. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -1
  27. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +5 -6
  28. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -1
  29. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +1 -2
  30. package/dist/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -1
  31. package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js +3 -6
  32. package/dist/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js.map +1 -1
  33. package/dist/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js +3 -6
  34. package/dist/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js.map +1 -1
  35. package/dist/ai/unified-prompts/skill-site-prompt.d.ts.map +1 -1
  36. package/dist/ai/unified-prompts/skill-site-prompt.js +2 -4
  37. package/dist/ai/unified-prompts/skill-site-prompt.js.map +1 -1
  38. package/dist/analytics-IjkAsefy.d.ts +14 -0
  39. package/dist/analytics-IjkAsefy.d.ts.map +1 -0
  40. package/dist/apps/apps-config.d.ts.map +1 -1
  41. package/dist/apps/apps-config.js +2 -3
  42. package/dist/apps/apps-config.js.map +1 -1
  43. package/dist/apps/apps-ui.d.ts +1 -2
  44. package/dist/apps/apps-ui.d.ts.map +1 -1
  45. package/dist/apps/apps-ui.js +4 -5
  46. package/dist/apps/apps-ui.js.map +1 -1
  47. package/dist/client-interface-iIw4nU5k.d.ts +447 -0
  48. package/dist/client-interface-iIw4nU5k.d.ts.map +1 -0
  49. package/dist/config/db-sync-mappings.js +2 -3
  50. package/dist/config/db-sync-mappings.js.map +1 -1
  51. package/dist/config/format.d.ts +2 -61
  52. package/dist/config/format.js +2 -192
  53. package/dist/config/format.js.map +1 -1
  54. package/dist/config/migrate-catalogs-to-product-lines.d.ts.map +1 -1
  55. package/dist/config/migrate-catalogs-to-product-lines.js +2 -196
  56. package/dist/config/migrate-catalogs-to-product-lines.js.map +1 -1
  57. package/dist/config/schema-fuzzer.test.js +18 -172
  58. package/dist/config/schema-fuzzer.test.js.map +1 -1
  59. package/dist/config/schema.d.ts +2 -2328
  60. package/dist/config/schema.js +6 -351
  61. package/dist/config/schema.js.map +1 -1
  62. package/dist/config-authoring.d.ts +1 -1
  63. package/dist/config-authoring.d.ts.map +1 -1
  64. package/dist/config-authoring.js +2 -3
  65. package/dist/config-authoring.js.map +1 -1
  66. package/dist/config-authoring.test.js +1 -3
  67. package/dist/config-authoring.test.js.map +1 -1
  68. package/dist/config-eval.d.ts.map +1 -1
  69. package/dist/config-eval.js +4 -46
  70. package/dist/config-eval.js.map +1 -1
  71. package/dist/config-rendering.d.ts.map +1 -1
  72. package/dist/config-rendering.js +2 -48
  73. package/dist/config-rendering.js.map +1 -1
  74. package/dist/connected-accounts-D5CKe50A.d.ts +67 -0
  75. package/dist/connected-accounts-D5CKe50A.d.ts.map +1 -0
  76. package/dist/contact-channels-DW8yQxlc.d.ts +180 -0
  77. package/dist/contact-channels-DW8yQxlc.d.ts.map +1 -0
  78. package/dist/country-codes-CRWDroBE.d.ts +11 -0
  79. package/dist/country-codes-CRWDroBE.d.ts.map +1 -0
  80. package/dist/crud-CqmEW9s6.d.ts +98 -0
  81. package/dist/crud-CqmEW9s6.d.ts.map +1 -0
  82. package/dist/crud.d.ts +2 -98
  83. package/dist/crud.js +3 -71
  84. package/dist/crud.js.map +1 -1
  85. package/dist/currency-constants-Cq_q8twn.d.ts +45 -0
  86. package/dist/currency-constants-Cq_q8twn.d.ts.map +1 -0
  87. package/dist/current-user-BBoN3hsn.d.ts +284 -0
  88. package/dist/current-user-BBoN3hsn.d.ts.map +1 -0
  89. package/dist/dates-B6ne9iOR.d.ts +23 -0
  90. package/dist/dates-B6ne9iOR.d.ts.map +1 -0
  91. package/dist/email-outbox-B1wmVPRG.d.ts +1464 -0
  92. package/dist/{interface/crud/email-outbox.d.ts.map → email-outbox-B1wmVPRG.d.ts.map} +1 -1
  93. package/dist/emails-Ba4yEaCS.d.ts +40 -0
  94. package/dist/emails-Ba4yEaCS.d.ts.map +1 -0
  95. package/dist/errors-Cl-RUyed.d.ts +238 -0
  96. package/dist/errors-Cl-RUyed.d.ts.map +1 -0
  97. package/dist/esm/ai/image-limits.d.ts.map +1 -1
  98. package/dist/esm/ai/image-limits.js +5 -5
  99. package/dist/esm/ai/image-limits.js.map +1 -1
  100. package/dist/esm/ai/llms/llms.d.ts +1 -1
  101. package/dist/esm/ai/llms/llms.d.ts.map +1 -1
  102. package/dist/esm/ai/llms/llms.js +1 -2
  103. package/dist/esm/ai/llms/llms.js.map +1 -1
  104. package/dist/esm/ai/unified-prompts/reminders.js +2 -3
  105. package/dist/esm/ai/unified-prompts/reminders.js.map +1 -1
  106. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.d.ts.map +1 -1
  107. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js +25 -28
  108. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js.map +1 -1
  109. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/brain.js +1 -2
  110. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/brain.js.map +1 -1
  111. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/cli-help.js +1 -2
  112. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/cli-help.js.map +1 -1
  113. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/config-docs.js +1 -2
  114. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/config-docs.js.map +1 -1
  115. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js +1 -2
  116. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/custom-components-instructions.js.map +1 -1
  117. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js +1 -2
  118. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/dashboard-instructions.js.map +1 -1
  119. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.d.ts.map +1 -1
  120. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js +2 -3
  121. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-index.js.map +1 -1
  122. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js +1 -1
  123. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/docs-json.generated.js.map +1 -1
  124. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js +1 -2
  125. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/openapi-specs.js.map +1 -1
  126. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js +1 -2
  127. package/dist/esm/ai/unified-prompts/skill-site-prompt-parts/sdk-interface-source.js.map +1 -1
  128. package/dist/esm/ai/unified-prompts/skill-site-prompt.d.ts.map +1 -1
  129. package/dist/esm/ai/unified-prompts/skill-site-prompt.js +1 -2
  130. package/dist/esm/ai/unified-prompts/skill-site-prompt.js.map +1 -1
  131. package/dist/esm/apps/apps-config.d.ts.map +1 -1
  132. package/dist/esm/apps/apps-config.js +1 -1
  133. package/dist/esm/apps/apps-config.js.map +1 -1
  134. package/dist/esm/apps/apps-ui.d.ts +2 -3
  135. package/dist/esm/apps/apps-ui.d.ts.map +1 -1
  136. package/dist/esm/apps/apps-ui.js +2 -3
  137. package/dist/esm/apps/apps-ui.js.map +1 -1
  138. package/dist/esm/config/db-sync-mappings.js +1 -1
  139. package/dist/esm/config/db-sync-mappings.js.map +1 -1
  140. package/dist/esm/config/format.d.ts +1 -1
  141. package/dist/esm/config/format.d.ts.map +1 -1
  142. package/dist/esm/config/format.js +1 -190
  143. package/dist/esm/config/format.js.map +1 -1
  144. package/dist/esm/config/migrate-catalogs-to-product-lines.d.ts.map +1 -1
  145. package/dist/esm/config/migrate-catalogs-to-product-lines.js +1 -194
  146. package/dist/esm/config/migrate-catalogs-to-product-lines.js.map +1 -1
  147. package/dist/esm/config/schema-fuzzer.test.js +20 -173
  148. package/dist/esm/config/schema-fuzzer.test.js.map +1 -1
  149. package/dist/esm/config/schema.d.ts +227 -228
  150. package/dist/esm/config/schema.d.ts.map +1 -1
  151. package/dist/esm/config/schema.js +2 -347
  152. package/dist/esm/config/schema.js.map +1 -1
  153. package/dist/esm/config-authoring.d.ts +1 -1
  154. package/dist/esm/config-authoring.d.ts.map +1 -1
  155. package/dist/esm/config-authoring.js +1 -1
  156. package/dist/esm/config-authoring.js.map +1 -1
  157. package/dist/esm/config-authoring.test.js +2 -3
  158. package/dist/esm/config-authoring.test.js.map +1 -1
  159. package/dist/esm/config-eval.d.ts +1 -1
  160. package/dist/esm/config-eval.d.ts.map +1 -1
  161. package/dist/esm/config-eval.js +1 -43
  162. package/dist/esm/config-eval.js.map +1 -1
  163. package/dist/esm/config-rendering.d.ts.map +1 -1
  164. package/dist/esm/config-rendering.js +1 -46
  165. package/dist/esm/config-rendering.js.map +1 -1
  166. package/dist/esm/crud.d.ts +1 -1
  167. package/dist/esm/crud.d.ts.map +1 -1
  168. package/dist/esm/crud.js +2 -69
  169. package/dist/esm/crud.js.map +1 -1
  170. package/dist/esm/helpers/emails.js +1 -2
  171. package/dist/esm/helpers/emails.js.map +1 -1
  172. package/dist/esm/helpers/init-prompt.d.ts.map +1 -1
  173. package/dist/esm/helpers/init-prompt.js +1 -2
  174. package/dist/esm/helpers/init-prompt.js.map +1 -1
  175. package/dist/esm/helpers/password.d.ts +1 -1
  176. package/dist/esm/helpers/password.d.ts.map +1 -1
  177. package/dist/esm/helpers/password.js +1 -2
  178. package/dist/esm/helpers/password.js.map +1 -1
  179. package/dist/esm/helpers/production-mode.d.ts +1 -1
  180. package/dist/esm/helpers/production-mode.d.ts.map +1 -1
  181. package/dist/esm/helpers/production-mode.js +1 -2
  182. package/dist/esm/helpers/production-mode.js.map +1 -1
  183. package/dist/esm/helpers/support-sla.d.ts.map +1 -1
  184. package/dist/esm/helpers/support-sla.js +1 -1
  185. package/dist/esm/helpers/support-sla.js.map +1 -1
  186. package/dist/esm/helpers/support-sla.test.js +2 -3
  187. package/dist/esm/helpers/support-sla.test.js.map +1 -1
  188. package/dist/esm/helpers/vault/client-side.d.ts.map +1 -1
  189. package/dist/esm/helpers/vault/client-side.js +1 -20
  190. package/dist/esm/helpers/vault/client-side.js.map +1 -1
  191. package/dist/esm/helpers/vault/server-side.js +1 -2
  192. package/dist/esm/helpers/vault/server-side.js.map +1 -1
  193. package/dist/esm/hooks/use-async-callback.d.ts.map +1 -1
  194. package/dist/esm/hooks/use-async-callback.js +1 -2
  195. package/dist/esm/hooks/use-async-callback.js.map +1 -1
  196. package/dist/esm/hooks/use-async-external-store.d.ts +1 -1
  197. package/dist/esm/hooks/use-async-external-store.d.ts.map +1 -1
  198. package/dist/esm/hooks/use-async-external-store.js +1 -2
  199. package/dist/esm/hooks/use-async-external-store.js.map +1 -1
  200. package/dist/esm/hooks/use-hash.js +1 -2
  201. package/dist/esm/hooks/use-hash.js.map +1 -1
  202. package/dist/esm/hooks/use-hover.d.ts.map +1 -1
  203. package/dist/esm/hooks/use-hover.js +1 -2
  204. package/dist/esm/hooks/use-hover.js.map +1 -1
  205. package/dist/esm/hooks/use-strict-memo.d.ts.map +1 -1
  206. package/dist/esm/hooks/use-strict-memo.js +1 -70
  207. package/dist/esm/hooks/use-strict-memo.js.map +1 -1
  208. package/dist/esm/index.d.ts +4 -4
  209. package/dist/esm/index.js +1 -2
  210. package/dist/esm/interface/admin-interface.d.ts +19 -19
  211. package/dist/esm/interface/admin-interface.d.ts.map +1 -1
  212. package/dist/esm/interface/admin-interface.js +2 -3
  213. package/dist/esm/interface/admin-interface.js.map +1 -1
  214. package/dist/esm/interface/admin-metrics.d.ts +10 -10
  215. package/dist/esm/interface/admin-metrics.d.ts.map +1 -1
  216. package/dist/esm/interface/admin-metrics.js +1 -2
  217. package/dist/esm/interface/admin-metrics.js.map +1 -1
  218. package/dist/esm/interface/client-interface.d.ts +22 -22
  219. package/dist/esm/interface/client-interface.d.ts.map +1 -1
  220. package/dist/esm/interface/client-interface.js +32 -16
  221. package/dist/esm/interface/client-interface.js.map +1 -1
  222. package/dist/esm/interface/client-interface.test.js +84 -13
  223. package/dist/esm/interface/client-interface.test.js.map +1 -1
  224. package/dist/esm/interface/conversations.d.ts +8 -8
  225. package/dist/esm/interface/conversations.d.ts.map +1 -1
  226. package/dist/esm/interface/conversations.js +1 -2
  227. package/dist/esm/interface/conversations.js.map +1 -1
  228. package/dist/esm/interface/crud/analytics.d.ts.map +1 -1
  229. package/dist/esm/interface/crud/analytics.js +1 -1
  230. package/dist/esm/interface/crud/connected-accounts.d.ts +15 -17
  231. package/dist/esm/interface/crud/connected-accounts.d.ts.map +1 -1
  232. package/dist/esm/interface/crud/connected-accounts.js +1 -2
  233. package/dist/esm/interface/crud/connected-accounts.js.map +1 -1
  234. package/dist/esm/interface/crud/contact-channels.d.ts +24 -26
  235. package/dist/esm/interface/crud/contact-channels.d.ts.map +1 -1
  236. package/dist/esm/interface/crud/contact-channels.js +1 -2
  237. package/dist/esm/interface/crud/contact-channels.js.map +1 -1
  238. package/dist/esm/interface/crud/current-user.d.ts +22 -24
  239. package/dist/esm/interface/crud/current-user.d.ts.map +1 -1
  240. package/dist/esm/interface/crud/current-user.js +25 -29
  241. package/dist/esm/interface/crud/current-user.js.map +1 -1
  242. package/dist/esm/interface/crud/email-outbox.d.ts +30 -32
  243. package/dist/esm/interface/crud/email-outbox.d.ts.map +1 -1
  244. package/dist/esm/interface/crud/email-outbox.js +1 -2
  245. package/dist/esm/interface/crud/email-outbox.js.map +1 -1
  246. package/dist/esm/interface/crud/email-templates.d.ts +16 -18
  247. package/dist/esm/interface/crud/email-templates.d.ts.map +1 -1
  248. package/dist/esm/interface/crud/email-templates.js +1 -2
  249. package/dist/esm/interface/crud/email-templates.js.map +1 -1
  250. package/dist/esm/interface/crud/emails.d.ts +6 -8
  251. package/dist/esm/interface/crud/emails.d.ts.map +1 -1
  252. package/dist/esm/interface/crud/emails.js +1 -2
  253. package/dist/esm/interface/crud/emails.js.map +1 -1
  254. package/dist/esm/interface/crud/internal-api-keys.d.ts +16 -18
  255. package/dist/esm/interface/crud/internal-api-keys.d.ts.map +1 -1
  256. package/dist/esm/interface/crud/internal-api-keys.js +1 -2
  257. package/dist/esm/interface/crud/internal-api-keys.js.map +1 -1
  258. package/dist/esm/interface/crud/invoices.d.ts.map +1 -1
  259. package/dist/esm/interface/crud/invoices.js +1 -2
  260. package/dist/esm/interface/crud/invoices.js.map +1 -1
  261. package/dist/esm/interface/crud/items.d.ts +6 -8
  262. package/dist/esm/interface/crud/items.d.ts.map +1 -1
  263. package/dist/esm/interface/crud/items.js +12 -16
  264. package/dist/esm/interface/crud/items.js.map +1 -1
  265. package/dist/esm/interface/crud/notification-preferences.d.ts +6 -8
  266. package/dist/esm/interface/crud/notification-preferences.d.ts.map +1 -1
  267. package/dist/esm/interface/crud/notification-preferences.js +8 -12
  268. package/dist/esm/interface/crud/notification-preferences.js.map +1 -1
  269. package/dist/esm/interface/crud/oauth-providers.d.ts +24 -26
  270. package/dist/esm/interface/crud/oauth-providers.d.ts.map +1 -1
  271. package/dist/esm/interface/crud/oauth-providers.js +1 -2
  272. package/dist/esm/interface/crud/oauth-providers.js.map +1 -1
  273. package/dist/esm/interface/crud/products.d.ts +21 -22
  274. package/dist/esm/interface/crud/products.d.ts.map +1 -1
  275. package/dist/esm/interface/crud/products.js +3 -2
  276. package/dist/esm/interface/crud/products.js.map +1 -1
  277. package/dist/esm/interface/crud/project-api-keys.d.ts +5 -6
  278. package/dist/esm/interface/crud/project-api-keys.d.ts.map +1 -1
  279. package/dist/esm/interface/crud/project-api-keys.js +1 -2
  280. package/dist/esm/interface/crud/project-api-keys.js.map +1 -1
  281. package/dist/esm/interface/crud/project-permissions.d.ts +29 -31
  282. package/dist/esm/interface/crud/project-permissions.d.ts.map +1 -1
  283. package/dist/esm/interface/crud/project-permissions.js +1 -2
  284. package/dist/esm/interface/crud/project-permissions.js.map +1 -1
  285. package/dist/esm/interface/crud/projects.d.ts +63 -65
  286. package/dist/esm/interface/crud/projects.d.ts.map +1 -1
  287. package/dist/esm/interface/crud/projects.js +3 -2
  288. package/dist/esm/interface/crud/projects.js.map +1 -1
  289. package/dist/esm/interface/crud/session-replays.d.ts.map +1 -1
  290. package/dist/esm/interface/crud/session-replays.js +1 -1
  291. package/dist/esm/interface/crud/sessions.d.ts +15 -17
  292. package/dist/esm/interface/crud/sessions.d.ts.map +1 -1
  293. package/dist/esm/interface/crud/sessions.js +1 -2
  294. package/dist/esm/interface/crud/sessions.js.map +1 -1
  295. package/dist/esm/interface/crud/sign-up-rules.d.ts.map +1 -1
  296. package/dist/esm/interface/crud/sign-up-rules.js +1 -1
  297. package/dist/esm/interface/crud/svix-token.d.ts +8 -10
  298. package/dist/esm/interface/crud/svix-token.d.ts.map +1 -1
  299. package/dist/esm/interface/crud/svix-token.js +1 -2
  300. package/dist/esm/interface/crud/svix-token.js.map +1 -1
  301. package/dist/esm/interface/crud/team-invitation-details.d.ts +6 -8
  302. package/dist/esm/interface/crud/team-invitation-details.d.ts.map +1 -1
  303. package/dist/esm/interface/crud/team-invitation-details.js +1 -2
  304. package/dist/esm/interface/crud/team-invitation-details.js.map +1 -1
  305. package/dist/esm/interface/crud/team-invitation.d.ts +7 -9
  306. package/dist/esm/interface/crud/team-invitation.d.ts.map +1 -1
  307. package/dist/esm/interface/crud/team-invitation.js +1 -2
  308. package/dist/esm/interface/crud/team-invitation.js.map +1 -1
  309. package/dist/esm/interface/crud/team-member-profiles.d.ts +36 -38
  310. package/dist/esm/interface/crud/team-member-profiles.d.ts.map +1 -1
  311. package/dist/esm/interface/crud/team-member-profiles.js +1 -2
  312. package/dist/esm/interface/crud/team-member-profiles.js.map +1 -1
  313. package/dist/esm/interface/crud/team-memberships.d.ts +14 -16
  314. package/dist/esm/interface/crud/team-memberships.d.ts.map +1 -1
  315. package/dist/esm/interface/crud/team-memberships.js +1 -2
  316. package/dist/esm/interface/crud/team-memberships.js.map +1 -1
  317. package/dist/esm/interface/crud/team-permissions.d.ts +29 -31
  318. package/dist/esm/interface/crud/team-permissions.d.ts.map +1 -1
  319. package/dist/esm/interface/crud/team-permissions.js +1 -2
  320. package/dist/esm/interface/crud/team-permissions.js.map +1 -1
  321. package/dist/esm/interface/crud/teams.d.ts +36 -38
  322. package/dist/esm/interface/crud/teams.d.ts.map +1 -1
  323. package/dist/esm/interface/crud/teams.js +2 -4
  324. package/dist/esm/interface/crud/teams.js.map +1 -1
  325. package/dist/esm/interface/crud/transactions.d.ts +14 -16
  326. package/dist/esm/interface/crud/transactions.d.ts.map +1 -1
  327. package/dist/esm/interface/crud/transactions.js +7 -13
  328. package/dist/esm/interface/crud/transactions.js.map +1 -1
  329. package/dist/esm/interface/crud/users.d.ts +21 -22
  330. package/dist/esm/interface/crud/users.d.ts.map +1 -1
  331. package/dist/esm/interface/crud/users.js +9 -5
  332. package/dist/esm/interface/crud/users.js.map +1 -1
  333. package/dist/esm/interface/handler-urls.d.ts +1 -1
  334. package/dist/esm/interface/handler-urls.d.ts.map +1 -1
  335. package/dist/esm/interface/handler-urls.js +1 -2
  336. package/dist/esm/interface/page-component-versions.d.ts +1 -1
  337. package/dist/esm/interface/page-component-versions.d.ts.map +1 -1
  338. package/dist/esm/interface/page-component-versions.js +1 -2
  339. package/dist/esm/interface/page-component-versions.js.map +1 -1
  340. package/dist/esm/interface/plan-usage.d.ts +1 -1
  341. package/dist/esm/interface/plan-usage.d.ts.map +1 -1
  342. package/dist/esm/interface/plan-usage.js +1 -2
  343. package/dist/esm/interface/plan-usage.js.map +1 -1
  344. package/dist/esm/interface/server-interface.d.ts +19 -19
  345. package/dist/esm/interface/server-interface.d.ts.map +1 -1
  346. package/dist/esm/interface/server-interface.js +2 -3
  347. package/dist/esm/interface/server-interface.js.map +1 -1
  348. package/dist/esm/interface/webhooks.d.ts +4 -4
  349. package/dist/esm/interface/webhooks.d.ts.map +1 -1
  350. package/dist/esm/interface/webhooks.js +1 -2
  351. package/dist/esm/interface/webhooks.js.map +1 -1
  352. package/dist/esm/known-errors.d.ts +2 -2
  353. package/dist/esm/known-errors.d.ts.map +1 -1
  354. package/dist/esm/known-errors.js +10 -21
  355. package/dist/esm/known-errors.js.map +1 -1
  356. package/dist/esm/payments/payment-methods.d.ts.map +1 -1
  357. package/dist/esm/payments/payment-methods.js +1 -1
  358. package/dist/esm/payments/payment-methods.js.map +1 -1
  359. package/dist/esm/payments/stripe-limits.d.ts.map +1 -1
  360. package/dist/esm/payments/stripe-limits.js +1 -1
  361. package/dist/esm/payments/stripe-limits.js.map +1 -1
  362. package/dist/esm/plans.d.ts.map +1 -1
  363. package/dist/esm/plans.js +1 -1
  364. package/dist/esm/plans.js.map +1 -1
  365. package/dist/esm/schema-fields.d.ts +14 -14
  366. package/dist/esm/schema-fields.d.ts.map +1 -1
  367. package/dist/esm/schema-fields.js +3 -64
  368. package/dist/esm/schema-fields.js.map +1 -1
  369. package/dist/esm/sessions.d.ts +6 -6
  370. package/dist/esm/sessions.d.ts.map +1 -1
  371. package/dist/esm/sessions.js +1 -2
  372. package/dist/esm/sessions.js.map +1 -1
  373. package/dist/esm/sessions.test.js +2 -3
  374. package/dist/esm/sessions.test.js.map +1 -1
  375. package/dist/esm/utils/analytics-clickmap-overlay.d.ts.map +1 -1
  376. package/dist/esm/utils/analytics-clickmap-overlay.js +1 -1
  377. package/dist/esm/utils/api-keys.d.ts.map +1 -1
  378. package/dist/esm/utils/api-keys.js +1 -2
  379. package/dist/esm/utils/api-keys.js.map +1 -1
  380. package/dist/esm/utils/arrays.d.ts.map +1 -1
  381. package/dist/esm/utils/arrays.js +1 -470
  382. package/dist/esm/utils/arrays.js.map +1 -1
  383. package/dist/esm/utils/auth-methods.d.ts.map +1 -1
  384. package/dist/esm/utils/auth-methods.js +1 -1
  385. package/dist/esm/utils/auth-methods.js.map +1 -1
  386. package/dist/esm/utils/base64.d.ts.map +1 -1
  387. package/dist/esm/utils/base64.js +1 -10
  388. package/dist/esm/utils/base64.js.map +1 -1
  389. package/dist/esm/utils/booleans.d.ts.map +1 -1
  390. package/dist/esm/utils/booleans.js +1 -25
  391. package/dist/esm/utils/booleans.js.map +1 -1
  392. package/dist/esm/utils/browser-compat.d.ts.map +1 -1
  393. package/dist/esm/utils/browser-compat.js +1 -1
  394. package/dist/esm/utils/browser-compat.js.map +1 -1
  395. package/dist/esm/utils/bytes.d.ts.map +1 -1
  396. package/dist/esm/utils/bytes.js +3 -198
  397. package/dist/esm/utils/bytes.js.map +1 -1
  398. package/dist/esm/utils/caches.d.ts +1 -1
  399. package/dist/esm/utils/caches.d.ts.map +1 -1
  400. package/dist/esm/utils/caches.js +1 -27
  401. package/dist/esm/utils/caches.js.map +1 -1
  402. package/dist/esm/utils/cel-fields.d.ts.map +1 -1
  403. package/dist/esm/utils/cel-fields.js +1 -2
  404. package/dist/esm/utils/cel-fields.js.map +1 -1
  405. package/dist/esm/utils/cloud-hosts.d.ts.map +1 -1
  406. package/dist/esm/utils/cloud-hosts.js +1 -27
  407. package/dist/esm/utils/cloud-hosts.js.map +1 -1
  408. package/dist/esm/utils/compile-time.d.ts.map +1 -1
  409. package/dist/esm/utils/compile-time.js +1 -1
  410. package/dist/esm/utils/compile-time.js.map +1 -1
  411. package/dist/esm/utils/country-codes.d.ts.map +1 -1
  412. package/dist/esm/utils/country-codes.js +1 -16
  413. package/dist/esm/utils/country-codes.js.map +1 -1
  414. package/dist/esm/utils/crypto.d.ts.map +1 -1
  415. package/dist/esm/utils/crypto.js +3 -113
  416. package/dist/esm/utils/crypto.js.map +1 -1
  417. package/dist/esm/utils/currencies.d.ts +1 -1
  418. package/dist/esm/utils/currencies.d.ts.map +1 -1
  419. package/dist/esm/utils/currencies.js +2 -37
  420. package/dist/esm/utils/currencies.js.map +1 -1
  421. package/dist/esm/utils/currency-constants.d.ts.map +1 -1
  422. package/dist/esm/utils/currency-constants.js +1 -1
  423. package/dist/esm/utils/currency-constants.js.map +1 -1
  424. package/dist/esm/utils/dates.d.ts.map +1 -1
  425. package/dist/esm/utils/dates.js +1 -44
  426. package/dist/esm/utils/dates.js.map +1 -1
  427. package/dist/esm/utils/dev-env-state-path.d.ts.map +1 -1
  428. package/dist/esm/utils/dev-env-state-path.js +1 -2
  429. package/dist/esm/utils/dev-env-state-path.js.map +1 -1
  430. package/dist/esm/utils/dev-tool.d.ts.map +1 -1
  431. package/dist/esm/utils/dev-tool.js +1 -1
  432. package/dist/esm/utils/dom.d.ts.map +1 -1
  433. package/dist/esm/utils/dom.js +1 -1
  434. package/dist/esm/utils/dom.js.map +1 -1
  435. package/dist/esm/utils/elements-chain.d.ts.map +1 -1
  436. package/dist/esm/utils/elements-chain.js +5 -50
  437. package/dist/esm/utils/elements-chain.js.map +1 -1
  438. package/dist/esm/utils/env.d.ts.map +1 -1
  439. package/dist/esm/utils/env.js +1 -2
  440. package/dist/esm/utils/env.js.map +1 -1
  441. package/dist/esm/utils/env.test.js +2 -3
  442. package/dist/esm/utils/env.test.js.map +1 -1
  443. package/dist/esm/utils/errors.d.ts +1 -1
  444. package/dist/esm/utils/errors.d.ts.map +1 -1
  445. package/dist/esm/utils/errors.js +1 -2
  446. package/dist/esm/utils/errors.js.map +1 -1
  447. package/dist/esm/utils/esbuild.d.ts +1 -1
  448. package/dist/esm/utils/esbuild.d.ts.map +1 -1
  449. package/dist/esm/utils/esbuild.js +2 -3
  450. package/dist/esm/utils/esbuild.js.map +1 -1
  451. package/dist/esm/utils/featurebase.d.ts.map +1 -1
  452. package/dist/esm/utils/featurebase.js +1 -2
  453. package/dist/esm/utils/featurebase.js.map +1 -1
  454. package/dist/esm/utils/fs.d.ts.map +1 -1
  455. package/dist/esm/utils/fs.js +1 -2
  456. package/dist/esm/utils/fs.js.map +1 -1
  457. package/dist/esm/utils/functions.d.ts.map +1 -1
  458. package/dist/esm/utils/functions.js +1 -24
  459. package/dist/esm/utils/functions.js.map +1 -1
  460. package/dist/esm/utils/geo.d.ts.map +1 -1
  461. package/dist/esm/utils/geo.js +1 -2
  462. package/dist/esm/utils/geo.js.map +1 -1
  463. package/dist/esm/utils/globals.d.ts.map +1 -1
  464. package/dist/esm/utils/globals.js +1 -1
  465. package/dist/esm/utils/globals.js.map +1 -1
  466. package/dist/esm/utils/hashes.d.ts.map +1 -1
  467. package/dist/esm/utils/hashes.js +1 -2
  468. package/dist/esm/utils/hashes.js.map +1 -1
  469. package/dist/esm/utils/html.d.ts.map +1 -1
  470. package/dist/esm/utils/html.js +1 -19
  471. package/dist/esm/utils/html.js.map +1 -1
  472. package/dist/esm/utils/http.d.ts.map +1 -1
  473. package/dist/esm/utils/http.js +1 -19
  474. package/dist/esm/utils/http.js.map +1 -1
  475. package/dist/esm/utils/ips.d.ts.map +1 -1
  476. package/dist/esm/utils/ips.js +1 -25
  477. package/dist/esm/utils/ips.js.map +1 -1
  478. package/dist/esm/utils/json.d.ts +1 -1
  479. package/dist/esm/utils/json.d.ts.map +1 -1
  480. package/dist/esm/utils/json.js +1 -155
  481. package/dist/esm/utils/json.js.map +1 -1
  482. package/dist/esm/utils/jsx-editable-transpiler.d.ts.map +1 -1
  483. package/dist/esm/utils/jsx-editable-transpiler.js +1 -2
  484. package/dist/esm/utils/jsx-editable-transpiler.js.map +1 -1
  485. package/dist/esm/utils/jsx-editable-transpiler.test.js +2 -3
  486. package/dist/esm/utils/jsx-editable-transpiler.test.js.map +1 -1
  487. package/dist/esm/utils/jwt.d.ts.map +1 -1
  488. package/dist/esm/utils/jwt.js +1 -2
  489. package/dist/esm/utils/jwt.js.map +1 -1
  490. package/dist/esm/utils/locks.d.ts.map +1 -1
  491. package/dist/esm/utils/locks.js +1 -2
  492. package/dist/esm/utils/locks.js.map +1 -1
  493. package/dist/esm/utils/maps.d.ts.map +1 -1
  494. package/dist/esm/utils/maps.js +1 -111
  495. package/dist/esm/utils/maps.js.map +1 -1
  496. package/dist/esm/utils/math.d.ts.map +1 -1
  497. package/dist/esm/utils/math.js +1 -11
  498. package/dist/esm/utils/math.js.map +1 -1
  499. package/dist/esm/utils/monkey-patch.d.ts.map +1 -1
  500. package/dist/esm/utils/monkey-patch.js +2 -3
  501. package/dist/esm/utils/monkey-patch.js.map +1 -1
  502. package/dist/esm/utils/node-http.js +1 -2
  503. package/dist/esm/utils/node-http.js.map +1 -1
  504. package/dist/esm/utils/numbers.d.ts.map +1 -1
  505. package/dist/esm/utils/numbers.js +1 -45
  506. package/dist/esm/utils/numbers.js.map +1 -1
  507. package/dist/esm/utils/oauth.d.ts.map +1 -1
  508. package/dist/esm/utils/oauth.js +1 -1
  509. package/dist/esm/utils/oauth.js.map +1 -1
  510. package/dist/esm/utils/objects.d.ts.map +1 -1
  511. package/dist/esm/utils/objects.js +1 -622
  512. package/dist/esm/utils/objects.js.map +1 -1
  513. package/dist/esm/utils/paginated-lists.d.ts.map +1 -1
  514. package/dist/esm/utils/paginated-lists.js +1 -2
  515. package/dist/esm/utils/paginated-lists.js.map +1 -1
  516. package/dist/esm/utils/paginated-lists.test.js +2 -3
  517. package/dist/esm/utils/paginated-lists.test.js.map +1 -1
  518. package/dist/esm/utils/passkey.d.ts +1 -1
  519. package/dist/esm/utils/passkey.js +1 -1
  520. package/dist/esm/utils/promises.d.ts +1 -1
  521. package/dist/esm/utils/promises.d.ts.map +1 -1
  522. package/dist/esm/utils/promises.js +2 -161
  523. package/dist/esm/utils/promises.js.map +1 -1
  524. package/dist/esm/utils/proxies.d.ts.map +1 -1
  525. package/dist/esm/utils/proxies.js +1 -37
  526. package/dist/esm/utils/proxies.js.map +1 -1
  527. package/dist/esm/utils/react.d.ts.map +1 -1
  528. package/dist/esm/utils/react.js +1 -41
  529. package/dist/esm/utils/react.js.map +1 -1
  530. package/dist/esm/utils/redirect-urls.d.ts.map +1 -1
  531. package/dist/esm/utils/redirect-urls.js +2 -92
  532. package/dist/esm/utils/redirect-urls.js.map +1 -1
  533. package/dist/esm/utils/regex.js +1 -1
  534. package/dist/esm/utils/regex.js.map +1 -1
  535. package/dist/esm/utils/results.d.ts.map +1 -1
  536. package/dist/esm/utils/results.js +1 -213
  537. package/dist/esm/utils/results.js.map +1 -1
  538. package/dist/esm/utils/sentry.js +1 -1
  539. package/dist/esm/utils/sentry.js.map +1 -1
  540. package/dist/esm/utils/stores.d.ts +3 -3
  541. package/dist/esm/utils/stores.d.ts.map +1 -1
  542. package/dist/esm/utils/stores.js +1 -2
  543. package/dist/esm/utils/stores.js.map +1 -1
  544. package/dist/esm/utils/strings.d.ts.map +1 -1
  545. package/dist/esm/utils/strings.js +1 -251
  546. package/dist/esm/utils/strings.js.map +1 -1
  547. package/dist/esm/utils/strings.nicify.test.js +2 -3
  548. package/dist/esm/utils/strings.nicify.test.js.map +1 -1
  549. package/dist/esm/utils/telemetry.d.ts.map +1 -1
  550. package/dist/esm/utils/telemetry.js +1 -2
  551. package/dist/esm/utils/telemetry.js.map +1 -1
  552. package/dist/esm/utils/turnstile-browser.d.ts +1 -1
  553. package/dist/esm/utils/turnstile-browser.d.ts.map +1 -1
  554. package/dist/esm/utils/turnstile-browser.js +1 -2
  555. package/dist/esm/utils/turnstile-browser.js.map +1 -1
  556. package/dist/esm/utils/turnstile-flow.d.ts +1 -1
  557. package/dist/esm/utils/turnstile-flow.d.ts.map +1 -1
  558. package/dist/esm/utils/turnstile-flow.js +1 -2
  559. package/dist/esm/utils/turnstile-flow.js.map +1 -1
  560. package/dist/esm/utils/turnstile-flow.test.js +2 -3
  561. package/dist/esm/utils/turnstile-flow.test.js.map +1 -1
  562. package/dist/esm/utils/turnstile.d.ts.map +1 -1
  563. package/dist/esm/utils/turnstile.js +1 -1
  564. package/dist/esm/utils/turnstile.js.map +1 -1
  565. package/dist/esm/utils/typed-arrays.js +1 -2
  566. package/dist/esm/utils/typed-arrays.js.map +1 -1
  567. package/dist/esm/utils/types.d.ts +1 -1
  568. package/dist/esm/utils/types.d.ts.map +1 -1
  569. package/dist/esm/utils/types.js +1 -1
  570. package/dist/esm/utils/types.js.map +1 -1
  571. package/dist/esm/utils/unicode.d.ts.map +1 -1
  572. package/dist/esm/utils/unicode.js +1 -13
  573. package/dist/esm/utils/unicode.js.map +1 -1
  574. package/dist/esm/utils/urls.d.ts.map +1 -1
  575. package/dist/esm/utils/urls.js +1 -151
  576. package/dist/esm/utils/urls.js.map +1 -1
  577. package/dist/esm/utils/uuids.d.ts.map +1 -1
  578. package/dist/esm/utils/uuids.js +2 -26
  579. package/dist/esm/utils/uuids.js.map +1 -1
  580. package/dist/format-4JG1MGv5.d.ts +61 -0
  581. package/dist/format-4JG1MGv5.d.ts.map +1 -0
  582. package/dist/handler-urls-BHt3v8Ai.d.ts +70 -0
  583. package/dist/handler-urls-BHt3v8Ai.d.ts.map +1 -0
  584. package/dist/helpers/emails.js +2 -4
  585. package/dist/helpers/emails.js.map +1 -1
  586. package/dist/helpers/init-prompt.d.ts.map +1 -1
  587. package/dist/helpers/init-prompt.js +2 -4
  588. package/dist/helpers/init-prompt.js.map +1 -1
  589. package/dist/helpers/password.d.ts +1 -1
  590. package/dist/helpers/password.d.ts.map +1 -1
  591. package/dist/helpers/password.js +2 -4
  592. package/dist/helpers/password.js.map +1 -1
  593. package/dist/helpers/production-mode.d.ts +1 -1
  594. package/dist/helpers/production-mode.d.ts.map +1 -1
  595. package/dist/helpers/production-mode.js +2 -4
  596. package/dist/helpers/production-mode.js.map +1 -1
  597. package/dist/helpers/support-sla.d.ts.map +1 -1
  598. package/dist/helpers/support-sla.js +2 -3
  599. package/dist/helpers/support-sla.js.map +1 -1
  600. package/dist/helpers/support-sla.test.js +1 -3
  601. package/dist/helpers/support-sla.test.js.map +1 -1
  602. package/dist/helpers/vault/client-side.d.ts.map +1 -1
  603. package/dist/helpers/vault/client-side.js +2 -22
  604. package/dist/helpers/vault/client-side.js.map +1 -1
  605. package/dist/helpers/vault/server-side.js +2 -4
  606. package/dist/helpers/vault/server-side.js.map +1 -1
  607. package/dist/hooks/use-async-callback.d.ts.map +1 -1
  608. package/dist/hooks/use-async-callback.js +4 -5
  609. package/dist/hooks/use-async-callback.js.map +1 -1
  610. package/dist/hooks/use-async-external-store.d.ts +1 -1
  611. package/dist/hooks/use-async-external-store.d.ts.map +1 -1
  612. package/dist/hooks/use-async-external-store.js +2 -4
  613. package/dist/hooks/use-async-external-store.js.map +1 -1
  614. package/dist/hooks/use-hash.js +2 -4
  615. package/dist/hooks/use-hash.js.map +1 -1
  616. package/dist/hooks/use-hover.d.ts.map +1 -1
  617. package/dist/hooks/use-hover.js +2 -4
  618. package/dist/hooks/use-hover.js.map +1 -1
  619. package/dist/hooks/use-strict-memo.d.ts.map +1 -1
  620. package/dist/hooks/use-strict-memo.js +2 -72
  621. package/dist/hooks/use-strict-memo.js.map +1 -1
  622. package/dist/index.d.ts +4 -4
  623. package/dist/index.js +27 -29
  624. package/dist/interface/admin-interface.d.ts +3 -379
  625. package/dist/interface/admin-interface.js +3 -5
  626. package/dist/interface/admin-interface.js.map +1 -1
  627. package/dist/interface/admin-metrics.d.ts +2 -807
  628. package/dist/interface/admin-metrics.js +2 -4
  629. package/dist/interface/admin-metrics.js.map +1 -1
  630. package/dist/interface/client-interface.d.ts +2 -447
  631. package/dist/interface/client-interface.js +33 -18
  632. package/dist/interface/client-interface.js.map +1 -1
  633. package/dist/interface/client-interface.test.js +83 -13
  634. package/dist/interface/client-interface.test.js.map +1 -1
  635. package/dist/interface/conversations.d.ts +8 -8
  636. package/dist/interface/conversations.d.ts.map +1 -1
  637. package/dist/interface/conversations.js +2 -4
  638. package/dist/interface/conversations.js.map +1 -1
  639. package/dist/interface/crud/analytics.d.ts +2 -14
  640. package/dist/interface/crud/connected-accounts.d.ts +2 -68
  641. package/dist/interface/crud/connected-accounts.js +2 -4
  642. package/dist/interface/crud/connected-accounts.js.map +1 -1
  643. package/dist/interface/crud/contact-channels.d.ts +2 -181
  644. package/dist/interface/crud/contact-channels.js +2 -4
  645. package/dist/interface/crud/contact-channels.js.map +1 -1
  646. package/dist/interface/crud/current-user.d.ts +2 -285
  647. package/dist/interface/crud/current-user.js +2 -4
  648. package/dist/interface/crud/current-user.js.map +1 -1
  649. package/dist/interface/crud/email-outbox.d.ts +2 -1465
  650. package/dist/interface/crud/email-outbox.js +4 -5
  651. package/dist/interface/crud/email-outbox.js.map +1 -1
  652. package/dist/interface/crud/email-templates.d.ts +15 -16
  653. package/dist/interface/crud/email-templates.d.ts.map +1 -1
  654. package/dist/interface/crud/email-templates.js +2 -4
  655. package/dist/interface/crud/email-templates.js.map +1 -1
  656. package/dist/interface/crud/emails.d.ts +2 -41
  657. package/dist/interface/crud/emails.js +4 -5
  658. package/dist/interface/crud/emails.js.map +1 -1
  659. package/dist/interface/crud/internal-api-keys.d.ts +2 -140
  660. package/dist/interface/crud/internal-api-keys.js +2 -4
  661. package/dist/interface/crud/internal-api-keys.js.map +1 -1
  662. package/dist/interface/crud/invoices.d.ts +2 -43
  663. package/dist/interface/crud/invoices.js +2 -4
  664. package/dist/interface/crud/invoices.js.map +1 -1
  665. package/dist/interface/crud/items.d.ts +2 -30
  666. package/dist/interface/crud/items.js +2 -4
  667. package/dist/interface/crud/items.js.map +1 -1
  668. package/dist/interface/crud/notification-preferences.d.ts +2 -38
  669. package/dist/interface/crud/notification-preferences.js +2 -4
  670. package/dist/interface/crud/notification-preferences.js.map +1 -1
  671. package/dist/interface/crud/oauth-providers.d.ts +2 -186
  672. package/dist/interface/crud/oauth-providers.js +2 -4
  673. package/dist/interface/crud/oauth-providers.js.map +1 -1
  674. package/dist/interface/crud/products.d.ts +2 -182
  675. package/dist/interface/crud/products.js +4 -4
  676. package/dist/interface/crud/products.js.map +1 -1
  677. package/dist/interface/crud/project-api-keys.d.ts +2 -203
  678. package/dist/interface/crud/project-api-keys.js +2 -4
  679. package/dist/interface/crud/project-api-keys.js.map +1 -1
  680. package/dist/interface/crud/project-permissions.d.ts +2 -161
  681. package/dist/interface/crud/project-permissions.js +4 -5
  682. package/dist/interface/crud/project-permissions.js.map +1 -1
  683. package/dist/interface/crud/projects.d.ts +2 -901
  684. package/dist/interface/crud/projects.js +6 -5
  685. package/dist/interface/crud/projects.js.map +1 -1
  686. package/dist/interface/crud/session-replays.d.ts +2 -83
  687. package/dist/interface/crud/sessions.d.ts +2 -150
  688. package/dist/interface/crud/sessions.js +2 -4
  689. package/dist/interface/crud/sessions.js.map +1 -1
  690. package/dist/interface/crud/sign-up-rules.d.ts.map +1 -1
  691. package/dist/interface/crud/svix-token.d.ts +2 -31
  692. package/dist/interface/crud/svix-token.js +2 -4
  693. package/dist/interface/crud/svix-token.js.map +1 -1
  694. package/dist/interface/crud/team-invitation-details.d.ts +5 -6
  695. package/dist/interface/crud/team-invitation-details.d.ts.map +1 -1
  696. package/dist/interface/crud/team-invitation-details.js +4 -5
  697. package/dist/interface/crud/team-invitation-details.js.map +1 -1
  698. package/dist/interface/crud/team-invitation.d.ts +2 -54
  699. package/dist/interface/crud/team-invitation.js +4 -5
  700. package/dist/interface/crud/team-invitation.js.map +1 -1
  701. package/dist/interface/crud/team-member-profiles.d.ts +2 -286
  702. package/dist/interface/crud/team-member-profiles.js +4 -5
  703. package/dist/interface/crud/team-member-profiles.js.map +1 -1
  704. package/dist/interface/crud/team-memberships.d.ts +2 -75
  705. package/dist/interface/crud/team-memberships.js +2 -4
  706. package/dist/interface/crud/team-memberships.js.map +1 -1
  707. package/dist/interface/crud/team-permissions.d.ts +2 -169
  708. package/dist/interface/crud/team-permissions.js +4 -5
  709. package/dist/interface/crud/team-permissions.js.map +1 -1
  710. package/dist/interface/crud/teams.d.ts +2 -299
  711. package/dist/interface/crud/teams.js +5 -7
  712. package/dist/interface/crud/teams.js.map +1 -1
  713. package/dist/interface/crud/transactions.d.ts +2 -183
  714. package/dist/interface/crud/transactions.js +2 -4
  715. package/dist/interface/crud/transactions.js.map +1 -1
  716. package/dist/interface/crud/users.d.ts +2 -653
  717. package/dist/interface/crud/users.js +12 -8
  718. package/dist/interface/crud/users.js.map +1 -1
  719. package/dist/interface/handler-urls.d.ts +2 -51
  720. package/dist/interface/handler-urls.js +12 -14
  721. package/dist/interface/page-component-versions.d.ts +2 -25
  722. package/dist/interface/page-component-versions.js +2 -4
  723. package/dist/interface/page-component-versions.js.map +1 -1
  724. package/dist/interface/plan-usage.d.ts +2 -57
  725. package/dist/interface/plan-usage.js +2 -4
  726. package/dist/interface/plan-usage.js.map +1 -1
  727. package/dist/interface/server-interface.d.ts +2 -257
  728. package/dist/interface/server-interface.js +3 -5
  729. package/dist/interface/server-interface.js.map +1 -1
  730. package/dist/interface/webhooks.d.ts +2 -326
  731. package/dist/interface/webhooks.js +2 -4
  732. package/dist/interface/webhooks.js.map +1 -1
  733. package/dist/internal-api-keys-D8IYDodH.d.ts +139 -0
  734. package/dist/internal-api-keys-D8IYDodH.d.ts.map +1 -0
  735. package/dist/invoices-CHo9YKbI.d.ts +43 -0
  736. package/dist/invoices-CHo9YKbI.d.ts.map +1 -0
  737. package/dist/items-DlLSlVUD.d.ts +29 -0
  738. package/dist/items-DlLSlVUD.d.ts.map +1 -0
  739. package/dist/json-a1QIXu5z.d.ts +15 -0
  740. package/dist/json-a1QIXu5z.d.ts.map +1 -0
  741. package/dist/known-errors-Bm4a61wL.d.ts +575 -0
  742. package/dist/known-errors-Bm4a61wL.d.ts.map +1 -0
  743. package/dist/known-errors.d.ts +2 -575
  744. package/dist/known-errors.js +11 -23
  745. package/dist/known-errors.js.map +1 -1
  746. package/dist/notification-preferences-Bmzr_EOY.d.ts +37 -0
  747. package/dist/notification-preferences-Bmzr_EOY.d.ts.map +1 -0
  748. package/dist/oauth-providers-BMkKSSlA.d.ts +185 -0
  749. package/dist/oauth-providers-BMkKSSlA.d.ts.map +1 -0
  750. package/dist/objects-DkCkeBWE.d.ts +59 -0
  751. package/dist/objects-DkCkeBWE.d.ts.map +1 -0
  752. package/dist/passkey-CKg87UH-.d.ts +2 -0
  753. package/dist/payments/payment-methods.d.ts.map +1 -1
  754. package/dist/payments/payment-methods.js +2 -3
  755. package/dist/payments/payment-methods.js.map +1 -1
  756. package/dist/payments/stripe-limits.d.ts.map +1 -1
  757. package/dist/payments/stripe-limits.js +2 -3
  758. package/dist/payments/stripe-limits.js.map +1 -1
  759. package/dist/plan-usage-DfDoj5K4.d.ts +57 -0
  760. package/dist/plan-usage-DfDoj5K4.d.ts.map +1 -0
  761. package/dist/plans.d.ts.map +1 -1
  762. package/dist/plans.js +2 -3
  763. package/dist/plans.js.map +1 -1
  764. package/dist/products-Bs74ld-v.d.ts +182 -0
  765. package/dist/products-Bs74ld-v.d.ts.map +1 -0
  766. package/dist/project-api-keys--7V5X_UW.d.ts +203 -0
  767. package/dist/project-api-keys--7V5X_UW.d.ts.map +1 -0
  768. package/dist/project-permissions-kdi675F-.d.ts +160 -0
  769. package/dist/project-permissions-kdi675F-.d.ts.map +1 -0
  770. package/dist/projects-CFTNXRfG.d.ts +900 -0
  771. package/dist/projects-CFTNXRfG.d.ts.map +1 -0
  772. package/dist/results-DP3BzoL6.d.ts +70 -0
  773. package/dist/results-DP3BzoL6.d.ts.map +1 -0
  774. package/dist/{chunk-BE-pF4vm.js → rolldown-runtime-D6vf50IK.js} +12 -18
  775. package/dist/schema-CJwkGkdf.d.ts +2328 -0
  776. package/dist/schema-CJwkGkdf.d.ts.map +1 -0
  777. package/dist/schema-fields-DqGQ4kF7.d.ts +517 -0
  778. package/dist/schema-fields-DqGQ4kF7.d.ts.map +1 -0
  779. package/dist/schema-fields.d.ts +3 -518
  780. package/dist/schema-fields.js +21 -82
  781. package/dist/schema-fields.js.map +1 -1
  782. package/dist/server-interface-CgpxsLT_.d.ts +257 -0
  783. package/dist/server-interface-CgpxsLT_.d.ts.map +1 -0
  784. package/dist/session-replays-CXqhDpZq.d.ts +83 -0
  785. package/dist/session-replays-CXqhDpZq.d.ts.map +1 -0
  786. package/dist/sessions-B7Ko2Ldr.d.ts +149 -0
  787. package/dist/sessions-B7Ko2Ldr.d.ts.map +1 -0
  788. package/dist/sessions-d8qtvBUB.d.ts +175 -0
  789. package/dist/sessions-d8qtvBUB.d.ts.map +1 -0
  790. package/dist/sessions.d.ts +2 -175
  791. package/dist/sessions.js +4 -5
  792. package/dist/sessions.js.map +1 -1
  793. package/dist/sessions.test.js +1 -3
  794. package/dist/sessions.test.js.map +1 -1
  795. package/dist/strings-DWgkUybS.d.ts +76 -0
  796. package/dist/strings-DWgkUybS.d.ts.map +1 -0
  797. package/dist/svix-token-BsMrLGvy.d.ts +30 -0
  798. package/dist/svix-token-BsMrLGvy.d.ts.map +1 -0
  799. package/dist/team-invitation-Cyqt9oWw.d.ts +53 -0
  800. package/dist/team-invitation-Cyqt9oWw.d.ts.map +1 -0
  801. package/dist/team-member-profiles-BoDEqx-0.d.ts +285 -0
  802. package/dist/team-member-profiles-BoDEqx-0.d.ts.map +1 -0
  803. package/dist/team-memberships-DZHk2A5b.d.ts +74 -0
  804. package/dist/team-memberships-DZHk2A5b.d.ts.map +1 -0
  805. package/dist/team-permissions-DqOpaOWh.d.ts +168 -0
  806. package/dist/team-permissions-DqOpaOWh.d.ts.map +1 -0
  807. package/dist/teams-CQMcBnjM.d.ts +298 -0
  808. package/dist/teams-CQMcBnjM.d.ts.map +1 -0
  809. package/dist/transactions-DhnbvGH5.d.ts +182 -0
  810. package/dist/transactions-DhnbvGH5.d.ts.map +1 -0
  811. package/dist/types-DfTcxNtM.d.ts +77 -0
  812. package/dist/types-DfTcxNtM.d.ts.map +1 -0
  813. package/dist/users-DHNRwoSz.d.ts +653 -0
  814. package/dist/users-DHNRwoSz.d.ts.map +1 -0
  815. package/dist/utils/analytics-clickmap-overlay.d.ts.map +1 -1
  816. package/dist/utils/analytics-clickmap-overlay.js +2 -3
  817. package/dist/utils/analytics-clickmap-overlay.js.map +1 -1
  818. package/dist/utils/api-keys.d.ts.map +1 -1
  819. package/dist/utils/api-keys.js +4 -5
  820. package/dist/utils/api-keys.js.map +1 -1
  821. package/dist/utils/arrays.d.ts.map +1 -1
  822. package/dist/utils/arrays.js +2 -472
  823. package/dist/utils/arrays.js.map +1 -1
  824. package/dist/utils/auth-methods.d.ts.map +1 -1
  825. package/dist/utils/auth-methods.js +2 -3
  826. package/dist/utils/auth-methods.js.map +1 -1
  827. package/dist/utils/base64.d.ts.map +1 -1
  828. package/dist/utils/base64.js +2 -12
  829. package/dist/utils/base64.js.map +1 -1
  830. package/dist/utils/booleans.d.ts.map +1 -1
  831. package/dist/utils/booleans.js +2 -27
  832. package/dist/utils/booleans.js.map +1 -1
  833. package/dist/utils/browser-compat.d.ts.map +1 -1
  834. package/dist/utils/browser-compat.js +2 -3
  835. package/dist/utils/browser-compat.js.map +1 -1
  836. package/dist/utils/bytes.d.ts.map +1 -1
  837. package/dist/utils/bytes.js +4 -200
  838. package/dist/utils/bytes.js.map +1 -1
  839. package/dist/utils/caches.d.ts.map +1 -1
  840. package/dist/utils/caches.js +2 -29
  841. package/dist/utils/caches.js.map +1 -1
  842. package/dist/utils/cel-fields.d.ts.map +1 -1
  843. package/dist/utils/cel-fields.js +2 -4
  844. package/dist/utils/cel-fields.js.map +1 -1
  845. package/dist/utils/cloud-hosts.d.ts.map +1 -1
  846. package/dist/utils/cloud-hosts.js +2 -29
  847. package/dist/utils/cloud-hosts.js.map +1 -1
  848. package/dist/utils/compile-time.d.ts.map +1 -1
  849. package/dist/utils/compile-time.js +2 -3
  850. package/dist/utils/compile-time.js.map +1 -1
  851. package/dist/utils/country-codes.d.ts +2 -11
  852. package/dist/utils/country-codes.js +2 -18
  853. package/dist/utils/country-codes.js.map +1 -1
  854. package/dist/utils/crypto.d.ts.map +1 -1
  855. package/dist/utils/crypto.js +4 -115
  856. package/dist/utils/crypto.js.map +1 -1
  857. package/dist/utils/currencies.d.ts +1 -1
  858. package/dist/utils/currencies.d.ts.map +1 -1
  859. package/dist/utils/currencies.js +3 -39
  860. package/dist/utils/currencies.js.map +1 -1
  861. package/dist/utils/currency-constants.d.ts +2 -45
  862. package/dist/utils/currency-constants.js +2 -3
  863. package/dist/utils/currency-constants.js.map +1 -1
  864. package/dist/utils/dates.d.ts +2 -23
  865. package/dist/utils/dates.js +2 -46
  866. package/dist/utils/dates.js.map +1 -1
  867. package/dist/utils/dev-env-state-path.d.ts.map +1 -1
  868. package/dist/utils/dev-env-state-path.js +2 -4
  869. package/dist/utils/dev-env-state-path.js.map +1 -1
  870. package/dist/utils/dev-tool.d.ts.map +1 -1
  871. package/dist/utils/dev-tool.js +2 -3
  872. package/dist/utils/dev-tool.js.map +1 -1
  873. package/dist/utils/dom.d.ts.map +1 -1
  874. package/dist/utils/dom.js +2 -3
  875. package/dist/utils/dom.js.map +1 -1
  876. package/dist/utils/elements-chain.d.ts.map +1 -1
  877. package/dist/utils/elements-chain.js +6 -52
  878. package/dist/utils/elements-chain.js.map +1 -1
  879. package/dist/utils/env.d.ts.map +1 -1
  880. package/dist/utils/env.js +2 -4
  881. package/dist/utils/env.js.map +1 -1
  882. package/dist/utils/env.test.js +1 -3
  883. package/dist/utils/env.test.js.map +1 -1
  884. package/dist/utils/errors.d.ts +2 -238
  885. package/dist/utils/errors.js +2 -4
  886. package/dist/utils/errors.js.map +1 -1
  887. package/dist/utils/esbuild.d.ts +1 -1
  888. package/dist/utils/esbuild.d.ts.map +1 -1
  889. package/dist/utils/esbuild.js +5 -6
  890. package/dist/utils/esbuild.js.map +1 -1
  891. package/dist/utils/featurebase.d.ts.map +1 -1
  892. package/dist/utils/featurebase.js +2 -4
  893. package/dist/utils/featurebase.js.map +1 -1
  894. package/dist/utils/fs.d.ts.map +1 -1
  895. package/dist/utils/fs.js +5 -6
  896. package/dist/utils/fs.js.map +1 -1
  897. package/dist/utils/functions.d.ts.map +1 -1
  898. package/dist/utils/functions.js +2 -26
  899. package/dist/utils/functions.js.map +1 -1
  900. package/dist/utils/geo.d.ts.map +1 -1
  901. package/dist/utils/geo.js +2 -4
  902. package/dist/utils/geo.js.map +1 -1
  903. package/dist/utils/globals.d.ts.map +1 -1
  904. package/dist/utils/globals.js +2 -3
  905. package/dist/utils/globals.js.map +1 -1
  906. package/dist/utils/hashes.d.ts.map +1 -1
  907. package/dist/utils/hashes.js +4 -5
  908. package/dist/utils/hashes.js.map +1 -1
  909. package/dist/utils/html.d.ts.map +1 -1
  910. package/dist/utils/html.js +2 -21
  911. package/dist/utils/html.js.map +1 -1
  912. package/dist/utils/http.d.ts.map +1 -1
  913. package/dist/utils/http.js +2 -21
  914. package/dist/utils/http.js.map +1 -1
  915. package/dist/utils/ips.d.ts.map +1 -1
  916. package/dist/utils/ips.js +4 -28
  917. package/dist/utils/ips.js.map +1 -1
  918. package/dist/utils/json.d.ts +2 -15
  919. package/dist/utils/json.js +2 -157
  920. package/dist/utils/json.js.map +1 -1
  921. package/dist/utils/jsx-editable-transpiler.d.ts.map +1 -1
  922. package/dist/utils/jsx-editable-transpiler.js +7 -8
  923. package/dist/utils/jsx-editable-transpiler.js.map +1 -1
  924. package/dist/utils/jsx-editable-transpiler.test.js +1 -3
  925. package/dist/utils/jsx-editable-transpiler.test.js.map +1 -1
  926. package/dist/utils/jwt.d.ts.map +1 -1
  927. package/dist/utils/jwt.js +6 -7
  928. package/dist/utils/jwt.js.map +1 -1
  929. package/dist/utils/locks.d.ts.map +1 -1
  930. package/dist/utils/locks.js +2 -4
  931. package/dist/utils/locks.js.map +1 -1
  932. package/dist/utils/maps.d.ts.map +1 -1
  933. package/dist/utils/maps.js +2 -113
  934. package/dist/utils/maps.js.map +1 -1
  935. package/dist/utils/math.d.ts.map +1 -1
  936. package/dist/utils/math.js +2 -13
  937. package/dist/utils/math.js.map +1 -1
  938. package/dist/utils/monkey-patch.d.ts.map +1 -1
  939. package/dist/utils/monkey-patch.js +3 -5
  940. package/dist/utils/monkey-patch.js.map +1 -1
  941. package/dist/utils/node-http.js +2 -4
  942. package/dist/utils/node-http.js.map +1 -1
  943. package/dist/utils/numbers.d.ts.map +1 -1
  944. package/dist/utils/numbers.js +2 -47
  945. package/dist/utils/numbers.js.map +1 -1
  946. package/dist/utils/oauth.d.ts.map +1 -1
  947. package/dist/utils/oauth.js +2 -3
  948. package/dist/utils/oauth.js.map +1 -1
  949. package/dist/utils/objects.d.ts +2 -59
  950. package/dist/utils/objects.js +2 -624
  951. package/dist/utils/objects.js.map +1 -1
  952. package/dist/utils/paginated-lists.d.ts.map +1 -1
  953. package/dist/utils/paginated-lists.js +2 -4
  954. package/dist/utils/paginated-lists.js.map +1 -1
  955. package/dist/utils/paginated-lists.test.js +1 -3
  956. package/dist/utils/paginated-lists.test.js.map +1 -1
  957. package/dist/utils/passkey.d.ts +2 -2
  958. package/dist/utils/promises.d.ts +1 -1
  959. package/dist/utils/promises.d.ts.map +1 -1
  960. package/dist/utils/promises.js +3 -163
  961. package/dist/utils/promises.js.map +1 -1
  962. package/dist/utils/proxies.d.ts.map +1 -1
  963. package/dist/utils/proxies.js +2 -39
  964. package/dist/utils/proxies.js.map +1 -1
  965. package/dist/utils/react.d.ts.map +1 -1
  966. package/dist/utils/react.js +4 -44
  967. package/dist/utils/react.js.map +1 -1
  968. package/dist/utils/redirect-urls.d.ts.map +1 -1
  969. package/dist/utils/redirect-urls.js +3 -94
  970. package/dist/utils/redirect-urls.js.map +1 -1
  971. package/dist/utils/regex.js +2 -3
  972. package/dist/utils/regex.js.map +1 -1
  973. package/dist/utils/results.d.ts +2 -70
  974. package/dist/utils/results.js +2 -215
  975. package/dist/utils/results.js.map +1 -1
  976. package/dist/utils/sentry.js +2 -3
  977. package/dist/utils/sentry.js.map +1 -1
  978. package/dist/utils/stores.d.ts +1 -1
  979. package/dist/utils/stores.d.ts.map +1 -1
  980. package/dist/utils/stores.js +2 -4
  981. package/dist/utils/stores.js.map +1 -1
  982. package/dist/utils/strings.d.ts +2 -76
  983. package/dist/utils/strings.js +2 -253
  984. package/dist/utils/strings.js.map +1 -1
  985. package/dist/utils/strings.nicify.test.js +1 -3
  986. package/dist/utils/strings.nicify.test.js.map +1 -1
  987. package/dist/utils/telemetry.d.ts.map +1 -1
  988. package/dist/utils/telemetry.js +2 -4
  989. package/dist/utils/telemetry.js.map +1 -1
  990. package/dist/utils/turnstile-browser.d.ts.map +1 -1
  991. package/dist/utils/turnstile-browser.js +2 -4
  992. package/dist/utils/turnstile-browser.js.map +1 -1
  993. package/dist/utils/turnstile-flow.d.ts.map +1 -1
  994. package/dist/utils/turnstile-flow.js +2 -4
  995. package/dist/utils/turnstile-flow.js.map +1 -1
  996. package/dist/utils/turnstile-flow.test.js +1 -3
  997. package/dist/utils/turnstile-flow.test.js.map +1 -1
  998. package/dist/utils/turnstile.d.ts.map +1 -1
  999. package/dist/utils/turnstile.js +2 -3
  1000. package/dist/utils/turnstile.js.map +1 -1
  1001. package/dist/utils/typed-arrays.js +2 -4
  1002. package/dist/utils/typed-arrays.js.map +1 -1
  1003. package/dist/utils/types.d.ts +2 -77
  1004. package/dist/utils/types.js +2 -3
  1005. package/dist/utils/types.js.map +1 -1
  1006. package/dist/utils/unicode.d.ts.map +1 -1
  1007. package/dist/utils/unicode.js +2 -15
  1008. package/dist/utils/unicode.js.map +1 -1
  1009. package/dist/utils/urls.d.ts.map +1 -1
  1010. package/dist/utils/urls.js +2 -153
  1011. package/dist/utils/urls.js.map +1 -1
  1012. package/dist/utils/uuids.d.ts.map +1 -1
  1013. package/dist/utils/uuids.js +3 -28
  1014. package/dist/utils/uuids.js.map +1 -1
  1015. package/dist/webhooks-8Ts1Clcb.d.ts +326 -0
  1016. package/dist/webhooks-8Ts1Clcb.d.ts.map +1 -0
  1017. package/package.json +2 -8
  1018. package/src/interface/client-interface.test.ts +77 -12
  1019. package/src/interface/client-interface.ts +9 -9
  1020. package/dist/config/format.d.ts.map +0 -1
  1021. package/dist/config/schema.d.ts.map +0 -1
  1022. package/dist/crud.d.ts.map +0 -1
  1023. package/dist/interface/admin-interface.d.ts.map +0 -1
  1024. package/dist/interface/admin-metrics.d.ts.map +0 -1
  1025. package/dist/interface/client-interface.d.ts.map +0 -1
  1026. package/dist/interface/crud/analytics.d.ts.map +0 -1
  1027. package/dist/interface/crud/connected-accounts.d.ts.map +0 -1
  1028. package/dist/interface/crud/contact-channels.d.ts.map +0 -1
  1029. package/dist/interface/crud/current-user.d.ts.map +0 -1
  1030. package/dist/interface/crud/emails.d.ts.map +0 -1
  1031. package/dist/interface/crud/internal-api-keys.d.ts.map +0 -1
  1032. package/dist/interface/crud/invoices.d.ts.map +0 -1
  1033. package/dist/interface/crud/items.d.ts.map +0 -1
  1034. package/dist/interface/crud/notification-preferences.d.ts.map +0 -1
  1035. package/dist/interface/crud/oauth-providers.d.ts.map +0 -1
  1036. package/dist/interface/crud/products.d.ts.map +0 -1
  1037. package/dist/interface/crud/project-api-keys.d.ts.map +0 -1
  1038. package/dist/interface/crud/project-permissions.d.ts.map +0 -1
  1039. package/dist/interface/crud/projects.d.ts.map +0 -1
  1040. package/dist/interface/crud/session-replays.d.ts.map +0 -1
  1041. package/dist/interface/crud/sessions.d.ts.map +0 -1
  1042. package/dist/interface/crud/svix-token.d.ts.map +0 -1
  1043. package/dist/interface/crud/team-invitation.d.ts.map +0 -1
  1044. package/dist/interface/crud/team-member-profiles.d.ts.map +0 -1
  1045. package/dist/interface/crud/team-memberships.d.ts.map +0 -1
  1046. package/dist/interface/crud/team-permissions.d.ts.map +0 -1
  1047. package/dist/interface/crud/teams.d.ts.map +0 -1
  1048. package/dist/interface/crud/transactions.d.ts.map +0 -1
  1049. package/dist/interface/crud/users.d.ts.map +0 -1
  1050. package/dist/interface/handler-urls.d.ts.map +0 -1
  1051. package/dist/interface/page-component-versions.d.ts.map +0 -1
  1052. package/dist/interface/plan-usage.d.ts.map +0 -1
  1053. package/dist/interface/server-interface.d.ts.map +0 -1
  1054. package/dist/interface/webhooks.d.ts.map +0 -1
  1055. package/dist/known-errors.d.ts.map +0 -1
  1056. package/dist/schema-fields.d.ts.map +0 -1
  1057. package/dist/sessions.d.ts.map +0 -1
  1058. package/dist/utils/country-codes.d.ts.map +0 -1
  1059. package/dist/utils/currency-constants.d.ts.map +0 -1
  1060. package/dist/utils/dates.d.ts.map +0 -1
  1061. package/dist/utils/errors.d.ts.map +0 -1
  1062. package/dist/utils/json.d.ts.map +0 -1
  1063. package/dist/utils/objects.d.ts.map +0 -1
  1064. package/dist/utils/results.d.ts.map +0 -1
  1065. package/dist/utils/strings.d.ts.map +0 -1
  1066. package/dist/utils/types.d.ts.map +0 -1
@@ -3,7 +3,6 @@ import { existsSync, readFileSync } from "fs";
3
3
  import { createJiti } from "jiti";
4
4
  import path from "path";
5
5
  import { detectConfigImportPackage } from "./config-rendering.js";
6
-
7
6
  //#region src/config-eval.ts
8
7
  const jiti = createJiti(import.meta.url, { moduleCache: false });
9
8
  /**
@@ -65,48 +64,7 @@ function evalConfigFileContent(content, filePath) {
65
64
  if (isRecord(config)) return config;
66
65
  throw invalidConfigShape(filePath);
67
66
  }
68
- (void 0)?.test("evalConfigFileContent parses static config exports", ({ expect }) => {
69
- expect(evalConfigFileContent(`
70
- import type { StackConfig } from "@hexclave/js";
71
- export const config: StackConfig = {
72
- auth: { allowSignUp: true },
73
- payments: { testMode: false },
74
- };
75
- `, "stack.config.ts")).toMatchInlineSnapshot(`
76
- {
77
- "auth": {
78
- "allowSignUp": true,
79
- },
80
- "payments": {
81
- "testMode": false,
82
- },
83
- }
84
- `);
85
- });
86
- (void 0)?.test("evalConfigFileContent parses show-onboarding", ({ expect }) => {
87
- expect(evalConfigFileContent("export const config = \"show-onboarding\";", "stack.config.ts")).toBe("show-onboarding");
88
- });
89
- (void 0)?.test("evalConfigFileContent rejects content without config export", ({ expect }) => {
90
- expect(() => evalConfigFileContent("export const other = {};", "stack.config.ts")).toThrow(/must export/);
91
- });
92
- (void 0)?.test("evalConfigFileContent rejects arbitrary string config values", ({ expect }) => {
93
- expect(() => evalConfigFileContent("export const config = \"arbitrary-string\";", "stack.config.ts")).toThrow(/must be "show-onboarding"/);
94
- });
95
- (void 0)?.test("evalConfigFileContent rejects unresolvable config factories", ({ expect }) => {
96
- expect(() => evalConfigFileContent("export const config = makeConfig();", "stack.config.ts")).toThrow();
97
- });
98
- (void 0)?.test("evalConfigFileContent rejects missing config import targets", ({ expect }) => {
99
- expect(() => evalConfigFileContent(`
100
- import missingConfigPart from "./missing-config-part";
101
- export const config = { auth: missingConfigPart };
102
- `, "/tmp/hexclave-missing-import-config.ts")).toThrow();
103
- });
104
- (void 0)?.test("evalConfigFileContent surfaces invalid syntax as a loader error, not ConfigFileEvalError", ({ expect }) => {
105
- const evalInvalid = () => evalConfigFileContent("export const config = {", "stack.config.ts");
106
- expect(evalInvalid).toThrow();
107
- expect(evalInvalid).not.toThrow(ConfigFileEvalError);
108
- });
109
-
110
67
  //#endregion
111
68
  export { ConfigFileEvalError, detectImportPackageFromDir, evalConfigFileContent };
69
+
112
70
  //# sourceMappingURL=config-eval.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-eval.js","names":[],"sources":["../../src/config-eval.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"fs\";\nimport { createJiti } from \"jiti\";\nimport path from \"path\";\nimport { showOnboardingHexclaveConfigValue } from \"./config-authoring\";\nimport { detectConfigImportPackage } from \"./config-rendering\";\n\nconst jiti = createJiti(import.meta.url, { moduleCache: false });\n\n/**\n * Thrown when a config file evaluates successfully but its exported `config`\n * isn't a usable shape (missing, or not an object / \"show-onboarding\" string).\n * Distinct from the underlying loader errors jiti throws, so callers can tell a\n * malformed config apart from a file that simply failed to load.\n */\nexport class ConfigFileEvalError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigFileEvalError\";\n }\n}\n\n/**\n * Walks up from `dir` to find the nearest `package.json` and returns the\n * best SDK package to use for the `HexclaveConfig` type import.\n */\nexport function detectImportPackageFromDir(dir: string): string | undefined {\n let current = dir;\n while (true) {\n const pkgPath = path.join(current, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n const deps = [\n ...Object.keys(pkg.dependencies ?? {}),\n ...Object.keys(pkg.devDependencies ?? {}),\n ];\n return detectConfigImportPackage(deps);\n } catch {\n return undefined;\n }\n }\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\n/** A config object, or the `\"show-onboarding\"` sentinel that stands in for one. */\nexport type ParsedConfigValue = Record<string, unknown> | typeof showOnboardingHexclaveConfigValue;\n\nfunction invalidConfigShape(filePath: string): ConfigFileEvalError {\n return new ConfigFileEvalError(`Invalid config in ${filePath}. The file must export a plain \\`config\\` object or \"${showOnboardingHexclaveConfigValue}\".`);\n}\n\n/**\n * Evaluates config file content using jiti and returns the exported `config`\n * value.\n *\n * WARNING: This executes arbitrary code via `jiti.evalModule` — only use on\n * content that is fully operator-controlled (local filesystem). Never call\n * this on untrusted input (e.g. content fetched from a remote repository).\n */\nexport function evalConfigFileContent(content: string, filePath: string): ParsedConfigValue {\n if (content.trim() === \"\") return {};\n const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n const mod: unknown = jiti.evalModule(content, { filename: resolvedPath });\n if (!isRecord(mod)) {\n throw invalidConfigShape(filePath);\n }\n const config = mod.config;\n if (config === undefined) {\n throw invalidConfigShape(filePath);\n }\n if (typeof config === \"string\") {\n if (config !== showOnboardingHexclaveConfigValue) {\n throw new ConfigFileEvalError(`Invalid config in ${filePath}. String config values must be \"${showOnboardingHexclaveConfigValue}\", got \"${config}\".`);\n }\n return config;\n }\n if (isRecord(config)) return config;\n throw invalidConfigShape(filePath);\n}\n\n// --- inline vitest tests ---\n\nimport.meta.vitest?.test(\"evalConfigFileContent parses static config exports\", ({ expect }) => {\n expect(evalConfigFileContent(`\n import type { StackConfig } from \"@hexclave/js\";\n export const config: StackConfig = {\n auth: { allowSignUp: true },\n payments: { testMode: false },\n };\n `, \"stack.config.ts\")).toMatchInlineSnapshot(`\n {\n \"auth\": {\n \"allowSignUp\": true,\n },\n \"payments\": {\n \"testMode\": false,\n },\n }\n `);\n});\n\nimport.meta.vitest?.test(\"evalConfigFileContent parses show-onboarding\", ({ expect }) => {\n expect(evalConfigFileContent('export const config = \"show-onboarding\";', \"stack.config.ts\")).toBe(\"show-onboarding\");\n});\n\nimport.meta.vitest?.test(\"evalConfigFileContent rejects content without config export\", ({ expect }) => {\n expect(() => evalConfigFileContent(\"export const other = {};\", \"stack.config.ts\")).toThrow(/must export/);\n});\n\nimport.meta.vitest?.test(\"evalConfigFileContent rejects arbitrary string config values\", ({ expect }) => {\n expect(() => evalConfigFileContent('export const config = \"arbitrary-string\";', \"stack.config.ts\")).toThrow(/must be \"show-onboarding\"/);\n});\n\nimport.meta.vitest?.test(\"evalConfigFileContent rejects unresolvable config factories\", ({ expect }) => {\n expect(() => evalConfigFileContent(\"export const config = makeConfig();\", \"stack.config.ts\")).toThrow();\n});\n\nimport.meta.vitest?.test(\"evalConfigFileContent rejects missing config import targets\", ({ expect }) => {\n expect(() => evalConfigFileContent(`\n import missingConfigPart from \"./missing-config-part\";\n export const config = { auth: missingConfigPart };\n `, \"/tmp/hexclave-missing-import-config.ts\")).toThrow();\n});\n\nimport.meta.vitest?.test(\"evalConfigFileContent surfaces invalid syntax as a loader error, not ConfigFileEvalError\", ({ expect }) => {\n // A malformed file fails inside jiti's parser, so the thrown error is a loader\n // error — NOT a ConfigFileEvalError. Callers depend on that distinction to route\n // it to \"Failed to load config file\" rather than \"Invalid config\".\n const evalInvalid = () => evalConfigFileContent(\"export const config = {\", \"stack.config.ts\");\n expect(evalInvalid).toThrow();\n expect(evalInvalid).not.toThrow(ConfigFileEvalError);\n});\n"],"mappings":";;;;;;;AAMA,MAAM,OAAO,WAAW,OAAO,KAAK,KAAK,EAAE,aAAa,OAAO,CAAC;;;;;;;AAQhE,IAAa,sBAAb,cAAyC,MAAM;CAC7C,YAAY,SAAiB;AAC3B,QAAM,QAAQ;AACd,OAAK,OAAO;;;;;;;AAQhB,SAAgB,2BAA2B,KAAiC;CAC1E,IAAI,UAAU;AACd,QAAO,MAAM;EACX,MAAM,UAAU,KAAK,KAAK,SAAS,eAAe;AAClD,MAAI,WAAW,QAAQ,CACrB,KAAI;GACF,MAAM,MAAM,KAAK,MAAM,aAAa,SAAS,QAAQ,CAAC;AAKtD,UAAO,0BAJM,CACX,GAAG,OAAO,KAAK,IAAI,gBAAgB,EAAE,CAAC,EACtC,GAAG,OAAO,KAAK,IAAI,mBAAmB,EAAE,CAAC,CAC1C,CACqC;UAChC;AACN;;EAGJ,MAAM,SAAS,KAAK,QAAQ,QAAQ;AACpC,MAAI,WAAW,QAAS;AACxB,YAAU;;;AAKd,SAAS,SAAS,OAAkD;AAClE,QAAO,SAAS,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM;;AAM5E,SAAS,mBAAmB,UAAuC;AACjE,QAAO,IAAI,oBAAoB,qBAAqB,SAAS,uDAAuD,kCAAkC,IAAI;;;;;;;;;;AAW5J,SAAgB,sBAAsB,SAAiB,UAAqC;AAC1F,KAAI,QAAQ,MAAM,KAAK,GAAI,QAAO,EAAE;CACpC,MAAM,eAAe,KAAK,WAAW,SAAS,GAAG,WAAW,KAAK,QAAQ,SAAS;CAClF,MAAM,MAAe,KAAK,WAAW,SAAS,EAAE,UAAU,cAAc,CAAC;AACzE,KAAI,CAAC,SAAS,IAAI,CAChB,OAAM,mBAAmB,SAAS;CAEpC,MAAM,SAAS,IAAI;AACnB,KAAI,WAAW,OACb,OAAM,mBAAmB,SAAS;AAEpC,KAAI,OAAO,WAAW,UAAU;AAC9B,MAAI,WAAW,kCACb,OAAM,IAAI,oBAAoB,qBAAqB,SAAS,kCAAkC,kCAAkC,UAAU,OAAO,IAAI;AAEvJ,SAAO;;AAET,KAAI,SAAS,OAAO,CAAE,QAAO;AAC7B,OAAM,mBAAmB,SAAS;;CAKpC,SAAW,KAAC,uDAAyD,EAAA,aAAa;AAChF,QAAO,sBAAsB;;;;;;KAM1B,kBAAkB,CAAC,CAAC,sBAAsB;;;;;;;;;IAS3C;EACF;CAEF,SAAW,KAAC,iDAAgD,EAAA,aAAgB;AAC1E,QAAO,sBAAsB,8CAA4C,kBAAkB,CAAC,CAAC,KAAK,kBAAkB;EACpH;CAEF,SAAW,KAAC,gEAAmE,EAAA,aAAY;AACzF,cAAa,sBAAsB,4BAA4B,kBAAkB,CAAC,CAAC,QAAQ,cAAc;EACzG;CAEF,SAAW,KAAC,iEAAoE,EAAA,aAAY;AAC1F,cAAa,sBAAsB,+CAA6C,kBAAkB,CAAC,CAAC,QAAQ,4BAA4B;EACxI;CAEF,SAAW,KAAC,gEAAgE,EAAA,aAAe;AACzF,cAAa,sBAAsB,uCAAuC,kBAAkB,CAAC,CAAC,SAAS;EACvG;CAEF,SAAW,KAAC,gEAAkE,EAAA,aAAa;AACzF,cAAa,sBAAsB;;;KAGhC,yCAAyC,CAAC,CAAC,SAAS;EACvD;CAEF,SAAW,KAAC,6FAAmF,EAAA,aAAyB;CAItH,MAAM,oBAAoB,sBAAsB,2BAA2B,kBAAkB;AAC7F,QAAO,YAAY,CAAC,SAAS;AAC7B,QAAO,YAAY,CAAC,IAAI,QAAQ,oBAAoB;EACpD"}
1
+ {"version":3,"file":"config-eval.js","names":[],"sources":["../../src/config-eval.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"fs\";\nimport { createJiti } from \"jiti\";\nimport path from \"path\";\nimport { showOnboardingHexclaveConfigValue } from \"./config-authoring\";\nimport { detectConfigImportPackage } from \"./config-rendering\";\n\nconst jiti = createJiti(import.meta.url, { moduleCache: false });\n\n/**\n * Thrown when a config file evaluates successfully but its exported `config`\n * isn't a usable shape (missing, or not an object / \"show-onboarding\" string).\n * Distinct from the underlying loader errors jiti throws, so callers can tell a\n * malformed config apart from a file that simply failed to load.\n */\nexport class ConfigFileEvalError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ConfigFileEvalError\";\n }\n}\n\n/**\n * Walks up from `dir` to find the nearest `package.json` and returns the\n * best SDK package to use for the `HexclaveConfig` type import.\n */\nexport function detectImportPackageFromDir(dir: string): string | undefined {\n let current = dir;\n while (true) {\n const pkgPath = path.join(current, \"package.json\");\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf-8\"));\n const deps = [\n ...Object.keys(pkg.dependencies ?? {}),\n ...Object.keys(pkg.devDependencies ?? {}),\n ];\n return detectConfigImportPackage(deps);\n } catch {\n return undefined;\n }\n }\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\n/** A config object, or the `\"show-onboarding\"` sentinel that stands in for one. */\nexport type ParsedConfigValue = Record<string, unknown> | typeof showOnboardingHexclaveConfigValue;\n\nfunction invalidConfigShape(filePath: string): ConfigFileEvalError {\n return new ConfigFileEvalError(`Invalid config in ${filePath}. The file must export a plain \\`config\\` object or \"${showOnboardingHexclaveConfigValue}\".`);\n}\n\n/**\n * Evaluates config file content using jiti and returns the exported `config`\n * value.\n *\n * WARNING: This executes arbitrary code via `jiti.evalModule` — only use on\n * content that is fully operator-controlled (local filesystem). Never call\n * this on untrusted input (e.g. content fetched from a remote repository).\n */\nexport function evalConfigFileContent(content: string, filePath: string): ParsedConfigValue {\n if (content.trim() === \"\") return {};\n const resolvedPath = path.isAbsolute(filePath) ? filePath : path.resolve(filePath);\n const mod: unknown = jiti.evalModule(content, { filename: resolvedPath });\n if (!isRecord(mod)) {\n throw invalidConfigShape(filePath);\n }\n const config = mod.config;\n if (config === undefined) {\n throw invalidConfigShape(filePath);\n }\n if (typeof config === \"string\") {\n if (config !== showOnboardingHexclaveConfigValue) {\n throw new ConfigFileEvalError(`Invalid config in ${filePath}. String config values must be \"${showOnboardingHexclaveConfigValue}\", got \"${config}\".`);\n }\n return config;\n }\n if (isRecord(config)) return config;\n throw invalidConfigShape(filePath);\n}\n\n// --- inline vitest tests ---\n\nimport.meta.vitest?.test(\"evalConfigFileContent parses static config exports\", ({ expect }) => {\n expect(evalConfigFileContent(`\n import type { StackConfig } from \"@hexclave/js\";\n export const config: StackConfig = {\n auth: { allowSignUp: true },\n payments: { testMode: false },\n };\n `, \"stack.config.ts\")).toMatchInlineSnapshot(`\n {\n \"auth\": {\n \"allowSignUp\": true,\n },\n \"payments\": {\n \"testMode\": false,\n },\n }\n `);\n});\n\nimport.meta.vitest?.test(\"evalConfigFileContent parses show-onboarding\", ({ expect }) => {\n expect(evalConfigFileContent('export const config = \"show-onboarding\";', \"stack.config.ts\")).toBe(\"show-onboarding\");\n});\n\nimport.meta.vitest?.test(\"evalConfigFileContent rejects content without config export\", ({ expect }) => {\n expect(() => evalConfigFileContent(\"export const other = {};\", \"stack.config.ts\")).toThrow(/must export/);\n});\n\nimport.meta.vitest?.test(\"evalConfigFileContent rejects arbitrary string config values\", ({ expect }) => {\n expect(() => evalConfigFileContent('export const config = \"arbitrary-string\";', \"stack.config.ts\")).toThrow(/must be \"show-onboarding\"/);\n});\n\nimport.meta.vitest?.test(\"evalConfigFileContent rejects unresolvable config factories\", ({ expect }) => {\n expect(() => evalConfigFileContent(\"export const config = makeConfig();\", \"stack.config.ts\")).toThrow();\n});\n\nimport.meta.vitest?.test(\"evalConfigFileContent rejects missing config import targets\", ({ expect }) => {\n expect(() => evalConfigFileContent(`\n import missingConfigPart from \"./missing-config-part\";\n export const config = { auth: missingConfigPart };\n `, \"/tmp/hexclave-missing-import-config.ts\")).toThrow();\n});\n\nimport.meta.vitest?.test(\"evalConfigFileContent surfaces invalid syntax as a loader error, not ConfigFileEvalError\", ({ expect }) => {\n // A malformed file fails inside jiti's parser, so the thrown error is a loader\n // error — NOT a ConfigFileEvalError. Callers depend on that distinction to route\n // it to \"Failed to load config file\" rather than \"Invalid config\".\n const evalInvalid = () => evalConfigFileContent(\"export const config = {\", \"stack.config.ts\");\n expect(evalInvalid).toThrow();\n expect(evalInvalid).not.toThrow(ConfigFileEvalError);\n});\n"],"mappings":";;;;;;AAMA,MAAM,OAAO,WAAW,OAAO,KAAK,KAAK,EAAE,aAAa,MAAM,CAAC;;;;;;;AAQ/D,IAAa,sBAAb,cAAyC,MAAM;CAC7C,YAAY,SAAiB;EAC3B,MAAM,OAAO;EACb,KAAK,OAAO;CACd;AACF;;;;;AAMA,SAAgB,2BAA2B,KAAiC;CAC1E,IAAI,UAAU;CACd,OAAO,MAAM;EACX,MAAM,UAAU,KAAK,KAAK,SAAS,cAAc;EACjD,IAAI,WAAW,OAAO,GACpB,IAAI;GACF,MAAM,MAAM,KAAK,MAAM,aAAa,SAAS,OAAO,CAAC;GAKrD,OAAO,0BAA0B,CAH/B,GAAG,OAAO,KAAK,IAAI,gBAAgB,CAAC,CAAC,GACrC,GAAG,OAAO,KAAK,IAAI,mBAAmB,CAAC,CAAC,CAEN,CAAC;EACvC,QAAQ;GACN;EACF;EAEF,MAAM,SAAS,KAAK,QAAQ,OAAO;EACnC,IAAI,WAAW,SAAS;EACxB,UAAU;CACZ;AAEF;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,SAAS,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC3E;AAKA,SAAS,mBAAmB,UAAuC;CACjE,OAAO,IAAI,oBAAoB,qBAAqB,SAAS,uDAAuD,kCAAkC,GAAG;AAC3J;;;;;;;;;AAUA,SAAgB,sBAAsB,SAAiB,UAAqC;CAC1F,IAAI,QAAQ,KAAK,MAAM,IAAI,OAAO,CAAC;CACnC,MAAM,eAAe,KAAK,WAAW,QAAQ,IAAI,WAAW,KAAK,QAAQ,QAAQ;CACjF,MAAM,MAAe,KAAK,WAAW,SAAS,EAAE,UAAU,aAAa,CAAC;CACxE,IAAI,CAAC,SAAS,GAAG,GACf,MAAM,mBAAmB,QAAQ;CAEnC,MAAM,SAAS,IAAI;CACnB,IAAI,WAAW,KAAA,GACb,MAAM,mBAAmB,QAAQ;CAEnC,IAAI,OAAO,WAAW,UAAU;EAC9B,IAAI,WAAW,mCACb,MAAM,IAAI,oBAAoB,qBAAqB,SAAS,kCAAkC,kCAAkC,UAAU,OAAO,GAAG;EAEtJ,OAAO;CACT;CACA,IAAI,SAAS,MAAM,GAAG,OAAO;CAC7B,MAAM,mBAAmB,QAAQ;AACnC"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-rendering.d.ts","names":[],"sources":["../../src/config-rendering.ts"],"mappings":";;AA4BA;;;;iBAAgB,yBAAA,CAA0B,YAAA;AAY1C;;;AAAA,iBAAgB,uBAAA,CAAwB,MAAA,WAAiB,aAAA"}
1
+ {"version":3,"file":"config-rendering.d.ts","names":[],"sources":["../../src/config-rendering.ts"],"mappings":";;AA4BA;;;;iBAAgB,yBAAA,CAA0B,YAAsB;AAYhE;;;AAAA,iBAAgB,uBAAA,CAAwB,MAAA,WAAiB,aAAsB"}
@@ -1,5 +1,4 @@
1
1
  import { isValidConfig, normalize } from "./config/format.js";
2
-
3
2
  //#region src/config-rendering.ts
4
3
  const DEFAULT_CONFIG_IMPORT_PACKAGE = "@hexclave/js";
5
4
  /**
@@ -43,51 +42,7 @@ function renderConfigFileContent(config, importPackage) {
43
42
  const pkg = importPackage ?? DEFAULT_CONFIG_IMPORT_PACKAGE;
44
43
  return `${`import type { HexclaveConfig } from "${pkg.startsWith("@hexclave/") ? `${pkg}/config` : pkg}";`}\n\nexport const config: HexclaveConfig = ${JSON.stringify(normalizedConfig, null, 2)};\n`;
45
44
  }
46
- (void 0)?.test("renderConfigFileContent normalizes config exports", ({ expect }) => {
47
- expect(renderConfigFileContent({
48
- "payments.items.todos.displayName": "Todo Slots",
49
- "payments.items.todos.customerType": "user"
50
- })).toContain(`export const config: HexclaveConfig = {
51
- "payments": {
52
- "items": {
53
- "todos": {
54
- "displayName": "Todo Slots",
55
- "customerType": "user"
56
- }
57
- }
58
- }
59
- };`);
60
- });
61
- (void 0)?.test("renderConfigFileContent rejects conflicting dotted keys", ({ expect }) => {
62
- expect(() => renderConfigFileContent({
63
- "a.b": 1,
64
- "a.b.c": 2
65
- })).toThrowError(/conflicting keys.*"a\.b\.c"/);
66
- });
67
- (void 0)?.test("renderConfigFileContent rejects invalid config exports", ({ expect }) => {
68
- expect(() => renderConfigFileContent(null)).toThrowErrorMatchingInlineSnapshot(`[Error: Invalid config: expected a plain object.]`);
69
- });
70
- (void 0)?.test("renderConfigFileContent uses custom import package", ({ expect }) => {
71
- expect(renderConfigFileContent({}, "@hexclave/next")).toContain("import type { HexclaveConfig } from \"@hexclave/next/config\";");
72
- });
73
- (void 0)?.test("renderConfigFileContent defaults to @hexclave/js", ({ expect }) => {
74
- expect(renderConfigFileContent({})).toContain("import type { HexclaveConfig } from \"@hexclave/js/config\";");
75
- });
76
- (void 0)?.test("renderConfigFileContent keeps legacy @stackframe packages on their root entrypoint", ({ expect }) => {
77
- expect(renderConfigFileContent({}, "@stackframe/next")).toContain("import type { HexclaveConfig } from \"@stackframe/next\";");
78
- });
79
- (void 0)?.test("detectConfigImportPackage picks first matching package by priority", ({ expect }) => {
80
- expect(detectConfigImportPackage(["@hexclave/next", "@hexclave/js"])).toBe("@hexclave/next");
81
- expect(detectConfigImportPackage(["@hexclave/react", "@hexclave/js"])).toBe("@hexclave/react");
82
- expect(detectConfigImportPackage(["@hexclave/js"])).toBe("@hexclave/js");
83
- expect(detectConfigImportPackage(["@hexclave/tanstack-start"])).toBe("@hexclave/tanstack-start");
84
- expect(detectConfigImportPackage(["@stackframe/stack", "@hexclave/next"])).toBe("@hexclave/next");
85
- expect(detectConfigImportPackage(["@stackframe/stack"])).toBe("@stackframe/stack");
86
- expect(detectConfigImportPackage(["@stackframe/template"])).toBe("@stackframe/template");
87
- expect(detectConfigImportPackage(["lodash", "express"])).toBeUndefined();
88
- expect(detectConfigImportPackage([])).toBeUndefined();
89
- });
90
-
91
45
  //#endregion
92
46
  export { detectConfigImportPackage, renderConfigFileContent };
47
+
93
48
  //# sourceMappingURL=config-rendering.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-rendering.js","names":[],"sources":["../../src/config-rendering.ts"],"sourcesContent":["import { isValidConfig, normalize } from \"./config/format\";\n\nconst DEFAULT_CONFIG_IMPORT_PACKAGE = \"@hexclave/js\";\n\n/**\n * Packages that export the `HexclaveConfig` type, in priority order.\n * The first match found in a project's dependencies wins. Hexclave-branded\n * packages come first (canonical); the legacy `@stackframe/*` names remain\n * so projects pinned to the last legacy release still render a config file\n * that compiles against their installed SDK.\n */\nconst CONFIG_IMPORT_PACKAGES = [\n \"@hexclave/next\",\n \"@hexclave/react\",\n \"@hexclave/tanstack-start\",\n \"@hexclave/js\",\n \"@hexclave/template\",\n \"@stackframe/stack\",\n \"@stackframe/react\",\n \"@stackframe/js\",\n \"@stackframe/template\",\n] as const;\n\n/**\n * Given a list of dependency names (from package.json), returns the SDK\n * package that should be used for the `HexclaveConfig` import, or `undefined`\n * if none of the known packages are installed.\n */\nexport function detectConfigImportPackage(dependencies: string[]): string | undefined {\n for (const pkg of CONFIG_IMPORT_PACKAGES) {\n if (dependencies.includes(pkg)) {\n return pkg;\n }\n }\n return undefined;\n}\n\n/**\n * Renders a config object into the source text of a `stack.config.ts` file.\n */\nexport function renderConfigFileContent(config: unknown, importPackage?: string): string {\n if (!isValidConfig(config)) {\n throw new Error(\"Invalid config: expected a plain object.\");\n }\n\n const droppedKeys: string[] = [];\n const normalizedConfig = normalize(config, {\n onDotIntoNonObject: \"ignore\",\n onDotIntoNull: \"empty-object\",\n droppedKeys,\n });\n if (droppedKeys.length > 0) {\n throw new Error(`Config has conflicting keys that would be dropped during normalization: ${droppedKeys.map(k => JSON.stringify(k)).join(\", \")}`);\n }\n const pkg = importPackage ?? DEFAULT_CONFIG_IMPORT_PACKAGE;\n const importSpecifier = pkg.startsWith(\"@hexclave/\") ? `${pkg}/config` : pkg;\n const importLine = `import type { HexclaveConfig } from \"${importSpecifier}\";`;\n return `${importLine}\\n\\nexport const config: HexclaveConfig = ${JSON.stringify(normalizedConfig, null, 2)};\\n`;\n}\n\n// --- inline vitest tests ---\n\nimport.meta.vitest?.test(\"renderConfigFileContent normalizes config exports\", ({ expect }) => {\n expect(renderConfigFileContent({\n \"payments.items.todos.displayName\": \"Todo Slots\",\n \"payments.items.todos.customerType\": \"user\",\n })).toContain(`export const config: HexclaveConfig = {\n \"payments\": {\n \"items\": {\n \"todos\": {\n \"displayName\": \"Todo Slots\",\n \"customerType\": \"user\"\n }\n }\n }\n};`);\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent rejects conflicting dotted keys\", ({ expect }) => {\n expect(() => renderConfigFileContent({\n \"a.b\": 1,\n \"a.b.c\": 2,\n })).toThrowError(/conflicting keys.*\"a\\.b\\.c\"/);\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent rejects invalid config exports\", ({ expect }) => {\n expect(() => renderConfigFileContent(null)).toThrowErrorMatchingInlineSnapshot(\n `[Error: Invalid config: expected a plain object.]`,\n );\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent uses custom import package\", ({ expect }) => {\n const content = renderConfigFileContent({}, \"@hexclave/next\");\n expect(content).toContain('import type { HexclaveConfig } from \"@hexclave/next/config\";');\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent defaults to @hexclave/js\", ({ expect }) => {\n const content = renderConfigFileContent({});\n expect(content).toContain('import type { HexclaveConfig } from \"@hexclave/js/config\";');\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent keeps legacy @stackframe packages on their root entrypoint\", ({ expect }) => {\n const content = renderConfigFileContent({}, \"@stackframe/next\");\n expect(content).toContain('import type { HexclaveConfig } from \"@stackframe/next\";');\n});\n\nimport.meta.vitest?.test(\"detectConfigImportPackage picks first matching package by priority\", ({ expect }) => {\n expect(detectConfigImportPackage([\"@hexclave/next\", \"@hexclave/js\"])).toBe(\"@hexclave/next\");\n expect(detectConfigImportPackage([\"@hexclave/react\", \"@hexclave/js\"])).toBe(\"@hexclave/react\");\n expect(detectConfigImportPackage([\"@hexclave/js\"])).toBe(\"@hexclave/js\");\n expect(detectConfigImportPackage([\"@hexclave/tanstack-start\"])).toBe(\"@hexclave/tanstack-start\");\n expect(detectConfigImportPackage([\"@stackframe/stack\", \"@hexclave/next\"])).toBe(\"@hexclave/next\");\n expect(detectConfigImportPackage([\"@stackframe/stack\"])).toBe(\"@stackframe/stack\");\n expect(detectConfigImportPackage([\"@stackframe/template\"])).toBe(\"@stackframe/template\");\n expect(detectConfigImportPackage([\"lodash\", \"express\"])).toBeUndefined();\n expect(detectConfigImportPackage([])).toBeUndefined();\n});\n"],"mappings":";;;AAEA,MAAM,gCAAgC;;;;;;;;AAStC,MAAM,yBAAyB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;AAOD,SAAgB,0BAA0B,cAA4C;AACpF,MAAK,MAAM,OAAO,uBAChB,KAAI,aAAa,SAAS,IAAI,CAC5B,QAAO;;;;;AASb,SAAgB,wBAAwB,QAAiB,eAAgC;AACvF,KAAI,CAAC,cAAc,OAAO,CACxB,OAAM,IAAI,MAAM,2CAA2C;CAG7D,MAAM,cAAwB,EAAE;CAChC,MAAM,mBAAmB,UAAU,QAAQ;EACzC,oBAAoB;EACpB,eAAe;EACf;EACD,CAAC;AACF,KAAI,YAAY,SAAS,EACvB,OAAM,IAAI,MAAM,2EAA2E,YAAY,KAAI,MAAK,KAAK,UAAU,EAAE,CAAC,CAAC,KAAK,KAAK,GAAG;CAElJ,MAAM,MAAM,iBAAiB;AAG7B,QAAO,GADY,wCADK,IAAI,WAAW,aAAa,GAAG,GAAG,IAAI,WAAW,IACE,IACtD,4CAA4C,KAAK,UAAU,kBAAkB,MAAM,EAAE,CAAC;;CAK7G,SAAW,KAAC,sDAAwD,EAAA,aAAa;AAC/E,QAAO,wBAAwB;EAC7B,oCAAoC;EACpC,qCAAqC;EACtC,CAAC,CAAC,CAAC,UAAU;;;;;;;;;IASZ;EACF;CAEF,SAAW,KAAC,4DAAgE,EAAC,aAAU;AACrF,cAAa,wBAAwB;EACnC,OAAO;EACP,SAAS;EACV,CAAC,CAAC,CAAC,aAAa,8BAA8B;EAC/C;CAEF,SAAW,KAAC,2DAA6D,EAAA,aAAa;AACpF,cAAa,wBAAwB,KAAK,CAAC,CAAC,mCAC1C,oDACD;EACD;CAEF,SAAW,KAAC,uDAAyD,EAAA,aAAa;AAEhF,QADgB,wBAAwB,EAAE,EAAE,iBAAiB,CAC9C,CAAC,UAAU,iEAA+D;EACzF;CAEF,SAAW,KAAC,qDAAmD,EAAQ,aAAS;AAE9E,QADgB,wBAAwB,EAAE,CAAC,CAC5B,CAAC,UAAU,+DAA6D;EACvF;CAEF,SAAW,KAAC,uFAAsF,EAAA,aAAgB;AAEhH,QADgB,wBAAwB,EAAE,EAAE,mBAAmB,CAChD,CAAC,UAAU,4DAA0D;EACpF;CAEF,SAAW,KAAC,uEAAwE,EAAA,aAAc;AAChG,QAAO,0BAA0B,CAAC,kBAAkB,eAAe,CAAC,CAAC,CAAC,KAAK,iBAAiB;AAC5F,QAAO,0BAA0B,CAAC,mBAAmB,eAAe,CAAC,CAAC,CAAC,KAAK,kBAAkB;AAC9F,QAAO,0BAA0B,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,eAAe;AACxE,QAAO,0BAA0B,CAAC,2BAA2B,CAAC,CAAC,CAAC,KAAK,2BAA2B;AAChG,QAAO,0BAA0B,CAAC,qBAAqB,iBAAiB,CAAC,CAAC,CAAC,KAAK,iBAAiB;AACjG,QAAO,0BAA0B,CAAC,oBAAoB,CAAC,CAAC,CAAC,KAAK,oBAAoB;AAClF,QAAO,0BAA0B,CAAC,uBAAuB,CAAC,CAAC,CAAC,KAAK,uBAAuB;AACxF,QAAO,0BAA0B,CAAC,UAAU,UAAU,CAAC,CAAC,CAAC,eAAe;AACxE,QAAO,0BAA0B,EAAE,CAAC,CAAC,CAAC,eAAe;EACrD"}
1
+ {"version":3,"file":"config-rendering.js","names":[],"sources":["../../src/config-rendering.ts"],"sourcesContent":["import { isValidConfig, normalize } from \"./config/format\";\n\nconst DEFAULT_CONFIG_IMPORT_PACKAGE = \"@hexclave/js\";\n\n/**\n * Packages that export the `HexclaveConfig` type, in priority order.\n * The first match found in a project's dependencies wins. Hexclave-branded\n * packages come first (canonical); the legacy `@stackframe/*` names remain\n * so projects pinned to the last legacy release still render a config file\n * that compiles against their installed SDK.\n */\nconst CONFIG_IMPORT_PACKAGES = [\n \"@hexclave/next\",\n \"@hexclave/react\",\n \"@hexclave/tanstack-start\",\n \"@hexclave/js\",\n \"@hexclave/template\",\n \"@stackframe/stack\",\n \"@stackframe/react\",\n \"@stackframe/js\",\n \"@stackframe/template\",\n] as const;\n\n/**\n * Given a list of dependency names (from package.json), returns the SDK\n * package that should be used for the `HexclaveConfig` import, or `undefined`\n * if none of the known packages are installed.\n */\nexport function detectConfigImportPackage(dependencies: string[]): string | undefined {\n for (const pkg of CONFIG_IMPORT_PACKAGES) {\n if (dependencies.includes(pkg)) {\n return pkg;\n }\n }\n return undefined;\n}\n\n/**\n * Renders a config object into the source text of a `stack.config.ts` file.\n */\nexport function renderConfigFileContent(config: unknown, importPackage?: string): string {\n if (!isValidConfig(config)) {\n throw new Error(\"Invalid config: expected a plain object.\");\n }\n\n const droppedKeys: string[] = [];\n const normalizedConfig = normalize(config, {\n onDotIntoNonObject: \"ignore\",\n onDotIntoNull: \"empty-object\",\n droppedKeys,\n });\n if (droppedKeys.length > 0) {\n throw new Error(`Config has conflicting keys that would be dropped during normalization: ${droppedKeys.map(k => JSON.stringify(k)).join(\", \")}`);\n }\n const pkg = importPackage ?? DEFAULT_CONFIG_IMPORT_PACKAGE;\n const importSpecifier = pkg.startsWith(\"@hexclave/\") ? `${pkg}/config` : pkg;\n const importLine = `import type { HexclaveConfig } from \"${importSpecifier}\";`;\n return `${importLine}\\n\\nexport const config: HexclaveConfig = ${JSON.stringify(normalizedConfig, null, 2)};\\n`;\n}\n\n// --- inline vitest tests ---\n\nimport.meta.vitest?.test(\"renderConfigFileContent normalizes config exports\", ({ expect }) => {\n expect(renderConfigFileContent({\n \"payments.items.todos.displayName\": \"Todo Slots\",\n \"payments.items.todos.customerType\": \"user\",\n })).toContain(`export const config: HexclaveConfig = {\n \"payments\": {\n \"items\": {\n \"todos\": {\n \"displayName\": \"Todo Slots\",\n \"customerType\": \"user\"\n }\n }\n }\n};`);\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent rejects conflicting dotted keys\", ({ expect }) => {\n expect(() => renderConfigFileContent({\n \"a.b\": 1,\n \"a.b.c\": 2,\n })).toThrowError(/conflicting keys.*\"a\\.b\\.c\"/);\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent rejects invalid config exports\", ({ expect }) => {\n expect(() => renderConfigFileContent(null)).toThrowErrorMatchingInlineSnapshot(\n `[Error: Invalid config: expected a plain object.]`,\n );\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent uses custom import package\", ({ expect }) => {\n const content = renderConfigFileContent({}, \"@hexclave/next\");\n expect(content).toContain('import type { HexclaveConfig } from \"@hexclave/next/config\";');\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent defaults to @hexclave/js\", ({ expect }) => {\n const content = renderConfigFileContent({});\n expect(content).toContain('import type { HexclaveConfig } from \"@hexclave/js/config\";');\n});\n\nimport.meta.vitest?.test(\"renderConfigFileContent keeps legacy @stackframe packages on their root entrypoint\", ({ expect }) => {\n const content = renderConfigFileContent({}, \"@stackframe/next\");\n expect(content).toContain('import type { HexclaveConfig } from \"@stackframe/next\";');\n});\n\nimport.meta.vitest?.test(\"detectConfigImportPackage picks first matching package by priority\", ({ expect }) => {\n expect(detectConfigImportPackage([\"@hexclave/next\", \"@hexclave/js\"])).toBe(\"@hexclave/next\");\n expect(detectConfigImportPackage([\"@hexclave/react\", \"@hexclave/js\"])).toBe(\"@hexclave/react\");\n expect(detectConfigImportPackage([\"@hexclave/js\"])).toBe(\"@hexclave/js\");\n expect(detectConfigImportPackage([\"@hexclave/tanstack-start\"])).toBe(\"@hexclave/tanstack-start\");\n expect(detectConfigImportPackage([\"@stackframe/stack\", \"@hexclave/next\"])).toBe(\"@hexclave/next\");\n expect(detectConfigImportPackage([\"@stackframe/stack\"])).toBe(\"@stackframe/stack\");\n expect(detectConfigImportPackage([\"@stackframe/template\"])).toBe(\"@stackframe/template\");\n expect(detectConfigImportPackage([\"lodash\", \"express\"])).toBeUndefined();\n expect(detectConfigImportPackage([])).toBeUndefined();\n});\n"],"mappings":";;AAEA,MAAM,gCAAgC;;;;;;;;AAStC,MAAM,yBAAyB;CAC7B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;;;AAOA,SAAgB,0BAA0B,cAA4C;CACpF,KAAK,MAAM,OAAO,wBAChB,IAAI,aAAa,SAAS,GAAG,GAC3B,OAAO;AAIb;;;;AAKA,SAAgB,wBAAwB,QAAiB,eAAgC;CACvF,IAAI,CAAC,cAAc,MAAM,GACvB,MAAM,IAAI,MAAM,0CAA0C;CAG5D,MAAM,cAAwB,CAAC;CAC/B,MAAM,mBAAmB,UAAU,QAAQ;EACzC,oBAAoB;EACpB,eAAe;EACf;CACF,CAAC;CACD,IAAI,YAAY,SAAS,GACvB,MAAM,IAAI,MAAM,2EAA2E,YAAY,KAAI,MAAK,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG;CAEjJ,MAAM,MAAM,iBAAiB;CAG7B,OAAO,GAAG,wCAFc,IAAI,WAAW,YAAY,IAAI,GAAG,IAAI,WAAW,IACE,IACtD,4CAA4C,KAAK,UAAU,kBAAkB,MAAM,CAAC,EAAE;AAC7G"}
@@ -1,5 +1,5 @@
1
+ import { NullishCoalesce } from "./utils/types.js";
1
2
  import * as yup$1 from "yup";
2
- import { NullishCoalesce } from "./utils/types";
3
3
 
4
4
  //#region src/crud.d.ts
5
5
  type AccessType = "client" | "server" | "admin";
@@ -1 +1 @@
1
- {"version":3,"file":"crud.d.ts","names":[],"sources":["../../src/crud.tsx"],"mappings":"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"}
1
+ {"version":3,"file":"crud.d.ts","names":[],"sources":["../../src/crud.tsx"],"mappings":"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"}
package/dist/esm/crud.js CHANGED
@@ -1,6 +1,5 @@
1
- import { yupObject, yupString } from "./schema-fields.js";
1
+ import "./schema-fields.js";
2
2
  import { filterUndefined } from "./utils/objects.js";
3
-
4
3
  //#region src/crud.tsx
5
4
  function createCrud(options) {
6
5
  const docs = options.docs ?? {};
@@ -55,73 +54,7 @@ function createCrud(options) {
55
54
  hasDelete: !!admin.deleteSchema
56
55
  };
57
56
  }
58
- (void 0)?.test("createCrud", ({ expect }) => {
59
- const emptyCrud = createCrud({});
60
- expect(emptyCrud.hasCreate).toBe(false);
61
- expect(emptyCrud.hasRead).toBe(false);
62
- expect(emptyCrud.hasUpdate).toBe(false);
63
- expect(emptyCrud.hasDelete).toBe(false);
64
- expect(emptyCrud.client.createSchema).toBeUndefined();
65
- expect(emptyCrud.server.createSchema).toBeUndefined();
66
- expect(emptyCrud.admin.createSchema).toBeUndefined();
67
- const mockSchema = yupObject().shape({ name: yupString().defined() });
68
- const clientOnlyCrud = createCrud({
69
- clientCreateSchema: mockSchema,
70
- clientReadSchema: mockSchema
71
- });
72
- expect(clientOnlyCrud.hasCreate).toBe(true);
73
- expect(clientOnlyCrud.hasRead).toBe(true);
74
- expect(clientOnlyCrud.hasUpdate).toBe(false);
75
- expect(clientOnlyCrud.hasDelete).toBe(false);
76
- expect(clientOnlyCrud.client.createSchema).toBe(mockSchema);
77
- expect(clientOnlyCrud.server.createSchema).toBe(mockSchema);
78
- expect(clientOnlyCrud.admin.createSchema).toBe(mockSchema);
79
- const serverSchema = yupObject().shape({
80
- name: yupString().defined(),
81
- internalField: yupString().defined()
82
- });
83
- const serverOverrideCrud = createCrud({
84
- clientCreateSchema: mockSchema,
85
- serverCreateSchema: serverSchema
86
- });
87
- expect(serverOverrideCrud.hasCreate).toBe(true);
88
- expect(serverOverrideCrud.client.createSchema).toBe(mockSchema);
89
- expect(serverOverrideCrud.server.createSchema).toBe(serverSchema);
90
- expect(serverOverrideCrud.admin.createSchema).toBe(serverSchema);
91
- const adminSchema = yupObject().shape({
92
- name: yupString().defined(),
93
- internalField: yupString().defined(),
94
- adminField: yupString().defined()
95
- });
96
- const fullOverrideCrud = createCrud({
97
- clientCreateSchema: mockSchema,
98
- serverCreateSchema: serverSchema,
99
- adminCreateSchema: adminSchema
100
- });
101
- expect(fullOverrideCrud.hasCreate).toBe(true);
102
- expect(fullOverrideCrud.client.createSchema).toBe(mockSchema);
103
- expect(fullOverrideCrud.server.createSchema).toBe(serverSchema);
104
- expect(fullOverrideCrud.admin.createSchema).toBe(adminSchema);
105
- const crudWithDocs = createCrud({
106
- clientCreateSchema: mockSchema,
107
- docs: { clientCreate: {
108
- summary: "Create a resource",
109
- description: "Creates a new resource",
110
- tags: ["resources"]
111
- } }
112
- });
113
- expect(crudWithDocs.client.createDocs).toEqual({
114
- summary: "Create a resource",
115
- description: "Creates a new resource",
116
- tags: ["resources"]
117
- });
118
- expect(crudWithDocs.server.createDocs).toEqual({
119
- summary: "Create a resource",
120
- description: "Creates a new resource",
121
- tags: ["resources"]
122
- });
123
- });
124
-
125
57
  //#endregion
126
58
  export { createCrud };
59
+
127
60
  //# sourceMappingURL=crud.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"crud.js","names":[],"sources":["../../src/crud.tsx"],"sourcesContent":["import * as yup from 'yup';\nimport { yupObject, yupString } from './schema-fields';\nimport { filterUndefined } from './utils/objects';\nimport { NullishCoalesce } from './utils/types';\n\nexport type AccessType = \"client\" | \"server\" | \"admin\";\nexport type CrudOperation = \"create\" | \"read\" | \"update\" | \"delete\";\nexport type CrudlOperation = \"create\" | \"read\" | \"update\" | \"delete\" | \"list\";\nexport type AccessTypeXCrudOperation = `${AccessType}${Capitalize<CrudOperation>}`;\nexport type AccessTypeXCrudlOperation = `${AccessType}${Capitalize<CrudlOperation>}`;\n\ndeclare module 'yup' {\n // eslint-disable-next-line @typescript-eslint/consistent-type-definitions\n export interface CustomSchemaMetadata {\n openapiField?: {\n description?: string,\n exampleValue?: any,\n hidden?: boolean,\n onlyShowInOperations?: Capitalize<CrudlOperation>[],\n },\n }\n}\n\ntype ShownEndpointDocumentation = {\n summary: string,\n description: string,\n tags?: string[],\n crudOperation?: Capitalize<CrudlOperation>,\n};\nexport type EndpointDocumentation =\n | ({ hidden: true } & Partial<ShownEndpointDocumentation>)\n | ({ hidden?: boolean } & ShownEndpointDocumentation);\n\n\ntype InnerCrudSchema<\n CreateSchema extends yup.AnySchema | undefined = yup.AnySchema | undefined,\n ReadSchema extends yup.AnySchema | undefined = yup.AnySchema | undefined,\n UpdateSchema extends yup.AnySchema | undefined = yup.AnySchema | undefined,\n DeleteSchema extends yup.AnySchema | undefined = yup.AnySchema | undefined,\n> = {\n createSchema: CreateSchema,\n createDocs: EndpointDocumentation | undefined,\n\n readSchema: ReadSchema,\n readDocs: EndpointDocumentation | undefined,\n listDocs: EndpointDocumentation | undefined,\n\n updateSchema: UpdateSchema,\n updateDocs: EndpointDocumentation | undefined,\n\n deleteSchema: DeleteSchema,\n deleteDocs: EndpointDocumentation | undefined,\n};\n\nexport type CrudSchema<\n ClientSchema extends InnerCrudSchema = InnerCrudSchema,\n ServerSchema extends InnerCrudSchema = InnerCrudSchema,\n AdminSchema extends InnerCrudSchema = InnerCrudSchema,\n> = {\n client: ClientSchema,\n server: ServerSchema,\n admin: AdminSchema,\n\n hasCreate: boolean,\n hasRead: boolean,\n hasUpdate: boolean,\n hasDelete: boolean,\n};\n\nexport type CrudSchemaCreationOptions = {\n [K in AccessTypeXCrudOperation as `${K}Schema`]?: yup.AnySchema\n};\n\ntype FillInOptionalsPrepareStep<O extends CrudSchemaCreationOptions> =\n & { [K in keyof Required<CrudSchemaCreationOptions>]: K extends keyof O ? O[K] : undefined };\n\ntype FillInOptionalsStep<O extends FillInOptionalsPrepareStep<CrudSchemaCreationOptions>> = {\n clientCreateSchema: NullishCoalesce<O['clientCreateSchema'], undefined>,\n clientReadSchema: NullishCoalesce<O['clientReadSchema'], undefined>,\n clientUpdateSchema: NullishCoalesce<O['clientUpdateSchema'], undefined>,\n clientDeleteSchema: NullishCoalesce<O['clientDeleteSchema'], undefined>,\n\n serverCreateSchema: NullishCoalesce<O['serverCreateSchema'], O['clientCreateSchema']>,\n serverReadSchema: NullishCoalesce<O['serverReadSchema'], O['clientReadSchema']>,\n serverUpdateSchema: NullishCoalesce<O['serverUpdateSchema'], O['clientUpdateSchema']>,\n serverDeleteSchema: NullishCoalesce<O['serverDeleteSchema'], O['clientDeleteSchema']>,\n\n adminCreateSchema: NullishCoalesce<O['adminCreateSchema'], O['serverCreateSchema']>,\n adminReadSchema: NullishCoalesce<O['adminReadSchema'], O['serverReadSchema']>,\n adminUpdateSchema: NullishCoalesce<O['adminUpdateSchema'], O['serverUpdateSchema']>,\n adminDeleteSchema: NullishCoalesce<O['adminDeleteSchema'], O['serverDeleteSchema']>,\n};\n\ntype FillInOptionals<O extends CrudSchemaCreationOptions> = FillInOptionalsStep<FillInOptionalsStep<FillInOptionalsStep<FillInOptionalsPrepareStep<O>>>>;\n\ntype CrudSchemaFromOptionsInner<O extends FillInOptionals<any>> = CrudSchema<\n InnerCrudSchema<O['clientCreateSchema'], O['clientReadSchema'], O['clientUpdateSchema'], O['clientDeleteSchema']>,\n InnerCrudSchema<O['serverCreateSchema'], O['serverReadSchema'], O['serverUpdateSchema'], O['serverDeleteSchema']>,\n InnerCrudSchema<O['adminCreateSchema'], O['adminReadSchema'], O['adminUpdateSchema'], O['adminDeleteSchema']>\n>;\n\nexport type CrudSchemaFromOptions<O extends CrudSchemaCreationOptions> = CrudSchemaFromOptionsInner<FillInOptionals<O>>;\n\ntype InnerCrudTypeOf<S extends InnerCrudSchema> =\n & (S['createSchema'] extends {} ? { Create: yup.InferType<S['createSchema']> } : {})\n & (S['readSchema'] extends {} ? { Read: yup.InferType<S['readSchema']> } : {})\n & (S['updateSchema'] extends {} ? { Update: yup.InferType<S['updateSchema']> } : {})\n & (S['deleteSchema'] extends {} ? { Delete: yup.InferType<S['deleteSchema']> } : {})\n & (S['readSchema'] extends {} ? { List: {\n items: yup.InferType<S['readSchema']>[],\n is_paginated: boolean,\n pagination?: {\n next_cursor: string | null,\n },\n }, } : {});\n\nexport type CrudTypeOf<S extends CrudSchema> = {\n Client: InnerCrudTypeOf<S['client']>,\n Server: InnerCrudTypeOf<S['server']>,\n Admin: InnerCrudTypeOf<S['admin']>,\n}\n\ntype CrudDocsCreationOptions<SO extends CrudSchemaCreationOptions> = {\n [X in AccessTypeXCrudlOperation]?: EndpointDocumentation\n};\n\nexport function createCrud<SO extends CrudSchemaCreationOptions>(options: SO & { docs?: CrudDocsCreationOptions<SO> }): CrudSchemaFromOptions<SO> {\n const docs = options.docs ?? {};\n const client = {\n createSchema: options.clientCreateSchema,\n createDocs: docs.clientCreate,\n\n readSchema: options.clientReadSchema,\n readDocs: docs.clientRead,\n listDocs: docs.clientList,\n\n updateSchema: options.clientUpdateSchema,\n updateDocs: docs.clientUpdate,\n\n deleteSchema: options.clientDeleteSchema,\n deleteDocs: docs.clientDelete,\n };\n\n const serverOverrides = filterUndefined({\n createSchema: options.serverCreateSchema,\n createDocs: docs.serverCreate,\n\n readSchema: options.serverReadSchema,\n readDocs: docs.serverRead,\n listDocs: docs.serverList,\n\n updateSchema: options.serverUpdateSchema,\n updateDocs: docs.serverUpdate,\n\n deleteSchema: options.serverDeleteSchema,\n deleteDocs: docs.serverDelete,\n });\n const server = {\n ...client,\n ...serverOverrides,\n };\n\n const adminOverrides = filterUndefined({\n createSchema: options.adminCreateSchema,\n createDocs: docs.adminCreate,\n\n readSchema: options.adminReadSchema,\n readDocs: docs.adminRead,\n listDocs: docs.adminList,\n\n updateSchema: options.adminUpdateSchema,\n updateDocs: docs.adminUpdate,\n\n deleteSchema: options.adminDeleteSchema,\n deleteDocs: docs.adminDelete,\n });\n const admin = {\n ...server,\n ...adminOverrides,\n };\n\n return {\n client: client as any,\n server: server as any,\n admin: admin as any,\n\n hasCreate: !!admin.createSchema,\n hasRead: !!admin.readSchema,\n hasUpdate: !!admin.updateSchema,\n hasDelete: !!admin.deleteSchema,\n };\n}\n\nimport.meta.vitest?.test(\"createCrud\", ({ expect }) => {\n // Test with empty options\n const emptyCrud = createCrud({});\n expect(emptyCrud.hasCreate).toBe(false);\n expect(emptyCrud.hasRead).toBe(false);\n expect(emptyCrud.hasUpdate).toBe(false);\n expect(emptyCrud.hasDelete).toBe(false);\n expect(emptyCrud.client.createSchema).toBeUndefined();\n expect(emptyCrud.server.createSchema).toBeUndefined();\n expect(emptyCrud.admin.createSchema).toBeUndefined();\n\n // Test with client schemas only\n const mockSchema = yupObject().shape({\n name: yupString().defined(),\n });\n\n const clientOnlyCrud = createCrud({\n clientCreateSchema: mockSchema,\n clientReadSchema: mockSchema,\n });\n expect(clientOnlyCrud.hasCreate).toBe(true);\n expect(clientOnlyCrud.hasRead).toBe(true);\n expect(clientOnlyCrud.hasUpdate).toBe(false);\n expect(clientOnlyCrud.hasDelete).toBe(false);\n expect(clientOnlyCrud.client.createSchema).toBe(mockSchema);\n expect(clientOnlyCrud.server.createSchema).toBe(mockSchema);\n expect(clientOnlyCrud.admin.createSchema).toBe(mockSchema);\n\n // Test with server overrides\n const serverSchema = yupObject().shape({\n name: yupString().defined(),\n internalField: yupString().defined(),\n });\n\n const serverOverrideCrud = createCrud({\n clientCreateSchema: mockSchema,\n serverCreateSchema: serverSchema,\n });\n expect(serverOverrideCrud.hasCreate).toBe(true);\n expect(serverOverrideCrud.client.createSchema).toBe(mockSchema);\n expect(serverOverrideCrud.server.createSchema).toBe(serverSchema);\n expect(serverOverrideCrud.admin.createSchema).toBe(serverSchema);\n\n // Test with admin overrides\n const adminSchema = yupObject().shape({\n name: yupString().defined(),\n internalField: yupString().defined(),\n adminField: yupString().defined(),\n });\n\n const fullOverrideCrud = createCrud({\n clientCreateSchema: mockSchema,\n serverCreateSchema: serverSchema,\n adminCreateSchema: adminSchema,\n });\n expect(fullOverrideCrud.hasCreate).toBe(true);\n expect(fullOverrideCrud.client.createSchema).toBe(mockSchema);\n expect(fullOverrideCrud.server.createSchema).toBe(serverSchema);\n expect(fullOverrideCrud.admin.createSchema).toBe(adminSchema);\n\n // Test with documentation\n const crudWithDocs = createCrud({\n clientCreateSchema: mockSchema,\n docs: {\n clientCreate: {\n summary: \"Create a resource\",\n description: \"Creates a new resource\",\n tags: [\"resources\"],\n },\n },\n });\n expect(crudWithDocs.client.createDocs).toEqual({\n summary: \"Create a resource\",\n description: \"Creates a new resource\",\n tags: [\"resources\"],\n });\n expect(crudWithDocs.server.createDocs).toEqual({\n summary: \"Create a resource\",\n description: \"Creates a new resource\",\n tags: [\"resources\"],\n });\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"crud.js","names":[],"sources":["../../src/crud.tsx"],"sourcesContent":["import * as yup from 'yup';\nimport { yupObject, yupString } from './schema-fields';\nimport { filterUndefined } from './utils/objects';\nimport { NullishCoalesce } from './utils/types';\n\nexport type AccessType = \"client\" | \"server\" | \"admin\";\nexport type CrudOperation = \"create\" | \"read\" | \"update\" | \"delete\";\nexport type CrudlOperation = \"create\" | \"read\" | \"update\" | \"delete\" | \"list\";\nexport type AccessTypeXCrudOperation = `${AccessType}${Capitalize<CrudOperation>}`;\nexport type AccessTypeXCrudlOperation = `${AccessType}${Capitalize<CrudlOperation>}`;\n\ndeclare module 'yup' {\n // eslint-disable-next-line @typescript-eslint/consistent-type-definitions\n export interface CustomSchemaMetadata {\n openapiField?: {\n description?: string,\n exampleValue?: any,\n hidden?: boolean,\n onlyShowInOperations?: Capitalize<CrudlOperation>[],\n },\n }\n}\n\ntype ShownEndpointDocumentation = {\n summary: string,\n description: string,\n tags?: string[],\n crudOperation?: Capitalize<CrudlOperation>,\n};\nexport type EndpointDocumentation =\n | ({ hidden: true } & Partial<ShownEndpointDocumentation>)\n | ({ hidden?: boolean } & ShownEndpointDocumentation);\n\n\ntype InnerCrudSchema<\n CreateSchema extends yup.AnySchema | undefined = yup.AnySchema | undefined,\n ReadSchema extends yup.AnySchema | undefined = yup.AnySchema | undefined,\n UpdateSchema extends yup.AnySchema | undefined = yup.AnySchema | undefined,\n DeleteSchema extends yup.AnySchema | undefined = yup.AnySchema | undefined,\n> = {\n createSchema: CreateSchema,\n createDocs: EndpointDocumentation | undefined,\n\n readSchema: ReadSchema,\n readDocs: EndpointDocumentation | undefined,\n listDocs: EndpointDocumentation | undefined,\n\n updateSchema: UpdateSchema,\n updateDocs: EndpointDocumentation | undefined,\n\n deleteSchema: DeleteSchema,\n deleteDocs: EndpointDocumentation | undefined,\n};\n\nexport type CrudSchema<\n ClientSchema extends InnerCrudSchema = InnerCrudSchema,\n ServerSchema extends InnerCrudSchema = InnerCrudSchema,\n AdminSchema extends InnerCrudSchema = InnerCrudSchema,\n> = {\n client: ClientSchema,\n server: ServerSchema,\n admin: AdminSchema,\n\n hasCreate: boolean,\n hasRead: boolean,\n hasUpdate: boolean,\n hasDelete: boolean,\n};\n\nexport type CrudSchemaCreationOptions = {\n [K in AccessTypeXCrudOperation as `${K}Schema`]?: yup.AnySchema\n};\n\ntype FillInOptionalsPrepareStep<O extends CrudSchemaCreationOptions> =\n & { [K in keyof Required<CrudSchemaCreationOptions>]: K extends keyof O ? O[K] : undefined };\n\ntype FillInOptionalsStep<O extends FillInOptionalsPrepareStep<CrudSchemaCreationOptions>> = {\n clientCreateSchema: NullishCoalesce<O['clientCreateSchema'], undefined>,\n clientReadSchema: NullishCoalesce<O['clientReadSchema'], undefined>,\n clientUpdateSchema: NullishCoalesce<O['clientUpdateSchema'], undefined>,\n clientDeleteSchema: NullishCoalesce<O['clientDeleteSchema'], undefined>,\n\n serverCreateSchema: NullishCoalesce<O['serverCreateSchema'], O['clientCreateSchema']>,\n serverReadSchema: NullishCoalesce<O['serverReadSchema'], O['clientReadSchema']>,\n serverUpdateSchema: NullishCoalesce<O['serverUpdateSchema'], O['clientUpdateSchema']>,\n serverDeleteSchema: NullishCoalesce<O['serverDeleteSchema'], O['clientDeleteSchema']>,\n\n adminCreateSchema: NullishCoalesce<O['adminCreateSchema'], O['serverCreateSchema']>,\n adminReadSchema: NullishCoalesce<O['adminReadSchema'], O['serverReadSchema']>,\n adminUpdateSchema: NullishCoalesce<O['adminUpdateSchema'], O['serverUpdateSchema']>,\n adminDeleteSchema: NullishCoalesce<O['adminDeleteSchema'], O['serverDeleteSchema']>,\n};\n\ntype FillInOptionals<O extends CrudSchemaCreationOptions> = FillInOptionalsStep<FillInOptionalsStep<FillInOptionalsStep<FillInOptionalsPrepareStep<O>>>>;\n\ntype CrudSchemaFromOptionsInner<O extends FillInOptionals<any>> = CrudSchema<\n InnerCrudSchema<O['clientCreateSchema'], O['clientReadSchema'], O['clientUpdateSchema'], O['clientDeleteSchema']>,\n InnerCrudSchema<O['serverCreateSchema'], O['serverReadSchema'], O['serverUpdateSchema'], O['serverDeleteSchema']>,\n InnerCrudSchema<O['adminCreateSchema'], O['adminReadSchema'], O['adminUpdateSchema'], O['adminDeleteSchema']>\n>;\n\nexport type CrudSchemaFromOptions<O extends CrudSchemaCreationOptions> = CrudSchemaFromOptionsInner<FillInOptionals<O>>;\n\ntype InnerCrudTypeOf<S extends InnerCrudSchema> =\n & (S['createSchema'] extends {} ? { Create: yup.InferType<S['createSchema']> } : {})\n & (S['readSchema'] extends {} ? { Read: yup.InferType<S['readSchema']> } : {})\n & (S['updateSchema'] extends {} ? { Update: yup.InferType<S['updateSchema']> } : {})\n & (S['deleteSchema'] extends {} ? { Delete: yup.InferType<S['deleteSchema']> } : {})\n & (S['readSchema'] extends {} ? { List: {\n items: yup.InferType<S['readSchema']>[],\n is_paginated: boolean,\n pagination?: {\n next_cursor: string | null,\n },\n }, } : {});\n\nexport type CrudTypeOf<S extends CrudSchema> = {\n Client: InnerCrudTypeOf<S['client']>,\n Server: InnerCrudTypeOf<S['server']>,\n Admin: InnerCrudTypeOf<S['admin']>,\n}\n\ntype CrudDocsCreationOptions<SO extends CrudSchemaCreationOptions> = {\n [X in AccessTypeXCrudlOperation]?: EndpointDocumentation\n};\n\nexport function createCrud<SO extends CrudSchemaCreationOptions>(options: SO & { docs?: CrudDocsCreationOptions<SO> }): CrudSchemaFromOptions<SO> {\n const docs = options.docs ?? {};\n const client = {\n createSchema: options.clientCreateSchema,\n createDocs: docs.clientCreate,\n\n readSchema: options.clientReadSchema,\n readDocs: docs.clientRead,\n listDocs: docs.clientList,\n\n updateSchema: options.clientUpdateSchema,\n updateDocs: docs.clientUpdate,\n\n deleteSchema: options.clientDeleteSchema,\n deleteDocs: docs.clientDelete,\n };\n\n const serverOverrides = filterUndefined({\n createSchema: options.serverCreateSchema,\n createDocs: docs.serverCreate,\n\n readSchema: options.serverReadSchema,\n readDocs: docs.serverRead,\n listDocs: docs.serverList,\n\n updateSchema: options.serverUpdateSchema,\n updateDocs: docs.serverUpdate,\n\n deleteSchema: options.serverDeleteSchema,\n deleteDocs: docs.serverDelete,\n });\n const server = {\n ...client,\n ...serverOverrides,\n };\n\n const adminOverrides = filterUndefined({\n createSchema: options.adminCreateSchema,\n createDocs: docs.adminCreate,\n\n readSchema: options.adminReadSchema,\n readDocs: docs.adminRead,\n listDocs: docs.adminList,\n\n updateSchema: options.adminUpdateSchema,\n updateDocs: docs.adminUpdate,\n\n deleteSchema: options.adminDeleteSchema,\n deleteDocs: docs.adminDelete,\n });\n const admin = {\n ...server,\n ...adminOverrides,\n };\n\n return {\n client: client as any,\n server: server as any,\n admin: admin as any,\n\n hasCreate: !!admin.createSchema,\n hasRead: !!admin.readSchema,\n hasUpdate: !!admin.updateSchema,\n hasDelete: !!admin.deleteSchema,\n };\n}\n\nimport.meta.vitest?.test(\"createCrud\", ({ expect }) => {\n // Test with empty options\n const emptyCrud = createCrud({});\n expect(emptyCrud.hasCreate).toBe(false);\n expect(emptyCrud.hasRead).toBe(false);\n expect(emptyCrud.hasUpdate).toBe(false);\n expect(emptyCrud.hasDelete).toBe(false);\n expect(emptyCrud.client.createSchema).toBeUndefined();\n expect(emptyCrud.server.createSchema).toBeUndefined();\n expect(emptyCrud.admin.createSchema).toBeUndefined();\n\n // Test with client schemas only\n const mockSchema = yupObject().shape({\n name: yupString().defined(),\n });\n\n const clientOnlyCrud = createCrud({\n clientCreateSchema: mockSchema,\n clientReadSchema: mockSchema,\n });\n expect(clientOnlyCrud.hasCreate).toBe(true);\n expect(clientOnlyCrud.hasRead).toBe(true);\n expect(clientOnlyCrud.hasUpdate).toBe(false);\n expect(clientOnlyCrud.hasDelete).toBe(false);\n expect(clientOnlyCrud.client.createSchema).toBe(mockSchema);\n expect(clientOnlyCrud.server.createSchema).toBe(mockSchema);\n expect(clientOnlyCrud.admin.createSchema).toBe(mockSchema);\n\n // Test with server overrides\n const serverSchema = yupObject().shape({\n name: yupString().defined(),\n internalField: yupString().defined(),\n });\n\n const serverOverrideCrud = createCrud({\n clientCreateSchema: mockSchema,\n serverCreateSchema: serverSchema,\n });\n expect(serverOverrideCrud.hasCreate).toBe(true);\n expect(serverOverrideCrud.client.createSchema).toBe(mockSchema);\n expect(serverOverrideCrud.server.createSchema).toBe(serverSchema);\n expect(serverOverrideCrud.admin.createSchema).toBe(serverSchema);\n\n // Test with admin overrides\n const adminSchema = yupObject().shape({\n name: yupString().defined(),\n internalField: yupString().defined(),\n adminField: yupString().defined(),\n });\n\n const fullOverrideCrud = createCrud({\n clientCreateSchema: mockSchema,\n serverCreateSchema: serverSchema,\n adminCreateSchema: adminSchema,\n });\n expect(fullOverrideCrud.hasCreate).toBe(true);\n expect(fullOverrideCrud.client.createSchema).toBe(mockSchema);\n expect(fullOverrideCrud.server.createSchema).toBe(serverSchema);\n expect(fullOverrideCrud.admin.createSchema).toBe(adminSchema);\n\n // Test with documentation\n const crudWithDocs = createCrud({\n clientCreateSchema: mockSchema,\n docs: {\n clientCreate: {\n summary: \"Create a resource\",\n description: \"Creates a new resource\",\n tags: [\"resources\"],\n },\n },\n });\n expect(crudWithDocs.client.createDocs).toEqual({\n summary: \"Create a resource\",\n description: \"Creates a new resource\",\n tags: [\"resources\"],\n });\n expect(crudWithDocs.server.createDocs).toEqual({\n summary: \"Create a resource\",\n description: \"Creates a new resource\",\n tags: [\"resources\"],\n });\n});\n"],"mappings":";;;AA8HA,SAAgB,WAAiD,SAAiF;CAChJ,MAAM,OAAO,QAAQ,QAAQ,CAAC;CAC9B,MAAM,SAAS;EACb,cAAc,QAAQ;EACtB,YAAY,KAAK;EAEjB,YAAY,QAAQ;EACpB,UAAU,KAAK;EACf,UAAU,KAAK;EAEf,cAAc,QAAQ;EACtB,YAAY,KAAK;EAEjB,cAAc,QAAQ;EACtB,YAAY,KAAK;CACnB;CAEA,MAAM,kBAAkB,gBAAgB;EACtC,cAAc,QAAQ;EACtB,YAAY,KAAK;EAEjB,YAAY,QAAQ;EACpB,UAAU,KAAK;EACf,UAAU,KAAK;EAEf,cAAc,QAAQ;EACtB,YAAY,KAAK;EAEjB,cAAc,QAAQ;EACtB,YAAY,KAAK;CACnB,CAAC;CACD,MAAM,SAAS;EACb,GAAG;EACH,GAAG;CACL;CAEA,MAAM,iBAAiB,gBAAgB;EACrC,cAAc,QAAQ;EACtB,YAAY,KAAK;EAEjB,YAAY,QAAQ;EACpB,UAAU,KAAK;EACf,UAAU,KAAK;EAEf,cAAc,QAAQ;EACtB,YAAY,KAAK;EAEjB,cAAc,QAAQ;EACtB,YAAY,KAAK;CACnB,CAAC;CACD,MAAM,QAAQ;EACZ,GAAG;EACH,GAAG;CACL;CAEA,OAAO;EACG;EACA;EACD;EAEP,WAAW,CAAC,CAAC,MAAM;EACnB,SAAS,CAAC,CAAC,MAAM;EACjB,WAAW,CAAC,CAAC,MAAM;EACnB,WAAW,CAAC,CAAC,MAAM;CACrB;AACF"}
@@ -1,5 +1,4 @@
1
1
  import { deindent } from "../utils/strings.js";
2
-
3
2
  //#region src/helpers/emails.ts
4
3
  const defaultNewTemplateSource = deindent`
5
4
  import { type } from "arktype"
@@ -237,7 +236,7 @@ const DEFAULT_TEMPLATE_IDS = {
237
236
  payment_receipt: EMAIL_TEMPLATE_PAYMENT_RECEIPT_ID,
238
237
  payment_failed: EMAIL_TEMPLATE_PAYMENT_FAILED_ID
239
238
  };
240
-
241
239
  //#endregion
242
240
  export { DEFAULT_EMAIL_TEMPLATES, DEFAULT_EMAIL_THEMES, DEFAULT_EMAIL_THEME_ID, DEFAULT_TEMPLATE_IDS, LightEmailTheme, defaultNewTemplateSource, emptyEmailTheme, previewTemplateSource };
241
+
243
242
  //# sourceMappingURL=emails.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"emails.js","names":[],"sources":["../../../src/helpers/emails.ts"],"sourcesContent":["import { deindent } from \"../utils/strings\";\n\nexport const defaultNewTemplateSource = deindent`\n import { type } from \"arktype\"\n import { Container } from \"@react-email/components\";\n import { Subject, NotificationCategory, Props } from \"@stackframe/emails\";\n\n export const variablesSchema = type({\n count: \"number\"\n });\n\n export function EmailTemplate({ user, variables }: Props<typeof variablesSchema.infer>) {\n return (\n <Container>\n <Subject value={\\`Hello \\${user.displayName}!\\`} />\n <NotificationCategory value=\"Transactional\" />\n <div className=\"font-bold\">Hi {user.displayName}!</div>\n <br />\n count is {variables.count}\n </Container>\n );\n }\n\n EmailTemplate.PreviewVariables = {\n count: 10\n } satisfies typeof variablesSchema.infer\n`;\n\nexport const previewTemplateSource = deindent`\n import { Button, Section, Hr, Text, Heading } from \"@react-email/components\";\n import { Subject, NotificationCategory } from \"@stackframe/emails\";\n\n export const variablesSchema = v => v;\n\n export function EmailTemplate({ user, project }) {\n return (\n <>\n <Subject value={\\`Verify your email at \\${project.displayName}\\`} />\n <NotificationCategory value=\"Transactional\" />\n <div className=\"font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\">\n <Section>\n <Heading as=\"h3\" className=\"font-sans font-bold text-[20px] text-center py-4 px-6 m-0\">\n Verify your email at {project.displayName}\n </Heading>\n <Text className=\"font-sans font-normal text-[14px] text-center pt-2 px-6 pb-4 m-0 opacity-80\">\n Hi{user.displayName ? (\", \" + user.displayName) : ''}! Please click on the following button to verify your email.\n </Text>\n <div className=\"text-center py-3 px-6\">\n <Button\n href=\"#\"\n className=\"text-black font-sans font-bold text-[14px] inline-block bg-[#f0f0f0] rounded-[4px] py-3 px-5 no-underline border-0\"\n >\n Verify my email\n </Button>\n </div>\n <div className=\"py-4 px-6\">\n <Hr className=\"opacity-20\" />\n </div>\n <Text className=\"font-sans font-normal text-[12px] text-center pt-1 px-6 pb-6 m-0 opacity-60\">\n If you were not expecting this email, you can safely ignore it. \n </Text>\n </Section>\n </div>\n </>\n )\n }\n`;\n\nexport const emptyEmailTheme = deindent`\n import { Html, Tailwind, Body } from '@react-email/components';\n export function EmailTheme({ children }: { children: React.ReactNode }) {\n return (\n <Html>\n <Tailwind>\n <Body>\n {children}\n </Body>\n </Tailwind>\n </Html>\n );\n }\n`;\n\nexport const LightEmailTheme = `import { Html, Head, Tailwind, Body, Container, Section } from '@react-email/components';\nimport { ThemeProps, ProjectLogo } from \"@stackframe/emails\";\n\nexport function EmailTheme({ children, unsubscribeLink, projectLogos }: ThemeProps) {\n return (\n <Html>\n <Head />\n <Tailwind>\n <Body className=\"bg-[#fafbfb] font-sans text-base m-0 p-0\" style={{ overflowX: 'hidden' }}>\n <div className=\"py-8 px-4 flex justify-center\">\n <Container className=\"bg-white p-[45px] rounded-lg shadow-sm mx-auto\" style={{ width: '100%', maxWidth: '600px' }}>\n <ProjectLogo data={projectLogos} mode=\"light\" />\n {children}\n </Container>\n </div>\n {unsubscribeLink && (\n <Section className=\"p-4 opacity-60 text-center\" style={{ textAlign: 'center' }}>\n <a href={unsubscribeLink} className=\"text-blue-600\" target=\"_blank\" rel=\"noopener noreferrer\">Click here</a> to unsubscribe from these emails\n </Section>\n )}\n </Body>\n </Tailwind>\n </Html>\n );\n}\n\nEmailTheme.PreviewProps = {\n unsubscribeLink: \"https://example.com\",\n} satisfies Partial<ThemeProps>\n`;\n\n\nconst DarkEmailTheme = `import { Html, Head, Tailwind, Body, Container, Section } from '@react-email/components';\nimport { ThemeProps, ProjectLogo } from \"@stackframe/emails\";\n\nexport function EmailTheme({ children, unsubscribeLink, projectLogos }: ThemeProps) {\n return (\n <Html>\n <Head />\n <Tailwind>\n <Body className=\"bg-[#323232] font-sans text-white m-0 p-0\" style={{ overflowX: 'hidden' }}>\n <div className=\"py-8 px-4 flex justify-center\">\n <Container className=\"bg-black p-[45px] rounded-lg shadow-sm mx-auto\" style={{ width: '100%', maxWidth: '600px' }}>\n <ProjectLogo data={projectLogos} mode=\"dark\" />\n {children}\n </Container>\n </div>\n {unsubscribeLink && (\n <Section className=\"p-4 opacity-60 text-center\" style={{ textAlign: 'center' }}>\n <a href={unsubscribeLink} className=\"text-blue-600\" target=\"_blank\" rel=\"noopener noreferrer\">Click here</a> to unsubscribe from these emails\n </Section>\n )}\n </Body>\n </Tailwind>\n </Html>\n );\n}\n\nEmailTheme.PreviewProps = {\n unsubscribeLink: \"https://example.com\",\n} satisfies Partial<ThemeProps>\n`;\n\n\nconst ColorfulEmailTheme = `import { Html, Head, Tailwind, Body, Container, Section } from '@react-email/components';\nimport { ThemeProps, ProjectLogo } from \"@stackframe/emails\";\n\nexport function EmailTheme({ children, unsubscribeLink, projectLogos }: ThemeProps) {\n return (\n <Html>\n <Head />\n <Tailwind>\n <Body className=\"bg-[#f0eef6] font-sans text-base m-0 p-0\" style={{ overflowX: 'hidden' }}>\n <div className=\"py-8 px-4 flex justify-center\">\n <Container className=\"bg-white p-[45px] rounded-2xl mx-auto\" style={{ width: '100%', maxWidth: '600px', borderTop: '4px solid #7c5ce0' }}>\n <ProjectLogo data={projectLogos} mode=\"light\" />\n {children}\n </Container>\n </div>\n {unsubscribeLink && (\n <Section className=\"p-4 opacity-60 text-center\" style={{ textAlign: 'center' }}>\n <a href={unsubscribeLink} className=\"text-[#7c5ce0]\" target=\"_blank\" rel=\"noopener noreferrer\">Click here</a> to unsubscribe from these emails\n </Section>\n )}\n </Body>\n </Tailwind>\n </Html>\n );\n}\n\nEmailTheme.PreviewProps = {\n unsubscribeLink: \"https://example.com\",\n} satisfies Partial<ThemeProps>\n`;\n\nexport const DEFAULT_EMAIL_THEME_ID = \"1df07ae6-abf3-4a40-83a5-a1a2cbe336ac\";\n\nexport const DEFAULT_EMAIL_THEMES = {\n [DEFAULT_EMAIL_THEME_ID]: {\n displayName: 'Default Light',\n tsxSource: LightEmailTheme,\n },\n \"a0172b5d-cff0-463b-83bb-85124697373a\": {\n displayName: 'Default Dark',\n tsxSource: DarkEmailTheme,\n },\n \"c7e2d94f-8a1b-4e6d-b3f5-9d0a2e7c1b8f\": {\n displayName: 'Default Colorful',\n tsxSource: ColorfulEmailTheme,\n },\n};\n\nconst EMAIL_TEMPLATE_EMAIL_VERIFICATION_ID = \"e7d009ce-8d47-4528-b245-5bf119f2ffa3\";\nconst EMAIL_TEMPLATE_PASSWORD_RESET_ID = \"a70fb3a4-56c1-4e42-af25-49d25603abd0\";\nconst EMAIL_TEMPLATE_MAGIC_LINK_ID = \"822687fe-8d0a-4467-a0d1-416b6e639478\";\nconst EMAIL_TEMPLATE_TEAM_INVITATION_ID = \"e84de395-2076-4831-9c19-8e9a96a868e4\";\nconst EMAIL_TEMPLATE_SIGN_IN_INVITATION_ID = \"066dd73c-36da-4fd0-b6d6-ebf87683f8bc\";\nconst EMAIL_TEMPLATE_PAYMENT_RECEIPT_ID = \"70372aee-0441-4d80-974c-2e858e40123a\";\nconst EMAIL_TEMPLATE_PAYMENT_FAILED_ID = \"f64b1afe-27ec-4a28-a277-7178f3261f9a\";\n\nexport const DEFAULT_EMAIL_TEMPLATES = {\n [EMAIL_TEMPLATE_EMAIL_VERIFICATION_ID]: {\n \"displayName\": \"Email Verification\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\"\\nimport { Button, Section, Hr, Text, Heading } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\nexport const variablesSchema = type({\\n emailVerificationLink: \\\"string\\\"\\n})\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={`Verify your email at ${project.displayName}`} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\\\">\\n <Section>\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-[20px] text-center py-4 px-6 m-0\\\">\\n Verify your email at {project.displayName}\\n </Heading>\\n <p className=\\\"font-sans font-normal text-[14px] text-center pt-2 px-6 pb-4 m-0 opacity-80\\\">\\n Hi{user.displayName ? (\\\", \\\" + user.displayName) : ''}! Please click on the following button to verify your email.\\n </p>\\n <div className=\\\"text-center py-3 px-6\\\">\\n <Button\\n href={variables.emailVerificationLink}\\n className=\\\"text-black font-sans font-bold text-[14px] inline-block bg-[#f0f0f0] rounded-[4px] py-3 px-5 no-underline border-0\\\"\\n >\\n Verify my email\\n </Button>\\n </div>\\n <div className=\\\"py-4 px-6\\\">\\n <Hr className=\\\"opacity-20\\\" />\\n </div>\\n <p className=\\\"font-sans font-normal text-[12px] text-center pt-1 px-6 pb-6 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it. \\n </p>\\n </Section>\\n </div>\\n </>\\n )\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n emailVerificationLink: \\\"#\\\"\\n} satisfies typeof variablesSchema.infer\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_PASSWORD_RESET_ID]: {\n \"displayName\": \"Password Reset\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\"\\nimport { Button, Section, Hr, Text, Heading } from \\\"@react-email/components\\\"\\nimport { Subject, NotificationCategory, Props} from \\\"@stackframe/emails\\\"\\n\\nexport const variablesSchema = type({\\n passwordResetLink: \\\"string\\\"\\n})\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"Reset your password at \\\" + project.displayName} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"font-sans text-base font-normal tracking-tight leading-relaxed py-8 w-full min-h-full\\\">\\n <Section>\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-[20px] text-center py-4 px-6 m-0\\\">\\n Reset your password at {project.displayName}\\n </Heading>\\n\\n <p className=\\\"text-sm font-sans font-normal text-center pt-2 pb-4 px-6 m-0 opacity-80\\\">\\n Hi{user.displayName ? (\\\", \\\" + user.displayName) : \\\"\\\"}! Please click on the following button to start the password reset process.\\n </p>\\n\\n <div className=\\\"text-center px-6 py-3\\\">\\n <Button\\n href={variables.passwordResetLink}\\n className=\\\"text-black text-sm font-sans font-bold bg-[#f0f0f0] rounded-[4px] inline-block py-3 px-5 no-underline border-none\\\"\\n target=\\\"_blank\\\"\\n >\\n Reset my password\\n </Button>\\n </div>\\n\\n <div className=\\\"px-6 py-4\\\">\\n <Hr className=\\\"opacity-20\\\" />\\n </div>\\n\\n <p className=\\\"text-xs font-sans font-normal text-center pt-1 pb-6 px-6 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it.\\n </p>\\n </Section>\\n </div>\\n </>\\n )\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n passwordResetLink: \\\"#\\\"\\n} satisfies typeof variablesSchema.infer\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_MAGIC_LINK_ID]: {\n \"displayName\": \"Magic Link/OTP\",\n \"tsxSource\": \"import { type } from 'arktype';\\nimport { Section, Hr, Text, Heading } from '@react-email/components';\\nimport { Subject, NotificationCategory, Props } from '@stackframe/emails';\\n\\nexport const variablesSchema = type({\\n magicLink: 'string',\\n otp: 'string',\\n});\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"Sign in to \\\" + project.displayName + \\\": Your code is \\\" + variables.otp} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"font-sans text-base font-normal tracking-[0.15008px] leading-6 m-0 py-8 w-full min-h-full\\\">\\n <Section className=\\\"mx-auto\\\">\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-xl text-center px-6 py-4 m-0\\\">\\n Sign in to {project.displayName}\\n </Heading>\\n <p className=\\\"text-sm font-sans font-normal text-center px-6 py-4 m-0 opacity-80\\\">\\n Hi{user.displayName ? \\\", \\\" + user.displayName : \\\"\\\"}! This is your one-time-password for signing in:\\n </p>\\n <p className=\\\"text-2xl font-mono font-bold text-center px-6 py-4 m-0\\\">\\n {variables.otp}\\n </p>\\n <p className=\\\"text-sm font-sans font-normal text-center px-6 py-4 m-0\\\">\\n Or you can click on{' '}\\n <a\\n key={20}\\n href={variables.magicLink}\\n rel=\\\"noopener noreferrer\\\"\\n className=\\\"text-blue-600 underline\\\"\\n >\\n this link\\n </a>{' '}\\n to sign in\\n </p>\\n <Hr className=\\\"px-6 py-4 opacity-20\\\" />\\n <p className=\\\"text-xs font-sans font-normal text-center px-6 pt-1 pb-6 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it.\\n </p>\\n </Section>\\n </div>\\n </>\\n );\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n magicLink: \\\"#\\\",\\n otp: \\\"3SLSWZ\\\"\\n} satisfies typeof variablesSchema.infer\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_TEAM_INVITATION_ID]: {\n \"displayName\": \"Team Invitation\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\";\\nimport { Button, Section, Hr, Text, Heading } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\n\\nexport const variablesSchema = type({\\n teamDisplayName: \\\"string\\\",\\n teamInvitationLink: \\\"string\\\"\\n});\\n\\nexport function EmailTemplate({ user, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"You have been invited to join \\\" + variables.teamDisplayName} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\\\">\\n <Section className=\\\"mx-auto max-w-lg\\\">\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-xl text-center px-6 pt-8 m-0\\\">\\n You are invited to {variables.teamDisplayName}\\n </Heading>\\n <p className=\\\"text-sm font-sans font-normal text-center px-6 pt-2 pb-4 m-0 opacity-80\\\">\\n Hi{user.displayName ? \\\", \\\" + user.displayName : \\\"\\\"}! Please click the button below to join the team {variables.teamDisplayName}\\n </p>\\n <div className=\\\"text-center px-6 py-3\\\">\\n <Button\\n href={variables.teamInvitationLink}\\n className=\\\"text-black text-sm font-sans font-bold bg-[#f0f0f0] rounded-md inline-block px-5 py-3 no-underline border-0\\\"\\n >\\n Join team\\n </Button>\\n </div>\\n <div className=\\\"px-6 py-4\\\">\\n <Hr className=\\\"opacity-20\\\" />\\n </div>\\n <p className=\\\"text-xs font-sans font-normal text-center px-6 pb-6 pt-1 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it.\\n </p>\\n </Section>\\n </div>\\n </>\\n );\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n teamDisplayName: \\\"My Team\\\",\\n teamInvitationLink: \\\"#\\\"\\n} satisfies typeof variablesSchema.infer \",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_SIGN_IN_INVITATION_ID]: {\n \"displayName\": \"Sign In Invitation\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\"\\nimport { Button, Section, Hr, Text, Heading } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\nexport const variablesSchema = type({\\n signInInvitationLink: \\\"string\\\",\\n teamDisplayName: \\\"string\\\"\\n})\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject\\n value={\\\"You have been invited to sign in to \\\" + project.displayName}\\n />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n\\n <div className=\\\"font-sans text-base font-normal leading-normal w-full min-h-full m-0 py-8\\\">\\n <Section>\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-xl text-center pt-8 px-6 m-0\\\">\\n You are invited to sign in to {variables.teamDisplayName}\\n </Heading>\\n\\n <p className=\\\"text-sm font-sans font-normal text-center pt-2 pb-4 px-6 m-0 opacity-80\\\">\\n Hi\\n {user.displayName ? \\\", \\\" + user.displayName : \\\"\\\"}! Please click on the following\\n link to sign in to your account\\n </p>\\n\\n <div className=\\\"text-center px-6 py-3\\\">\\n <Button\\n href={variables.signInInvitationLink}\\n className=\\\"text-black text-sm font-sans font-bold bg-gray-200 rounded-md inline-block py-3 px-5 no-underline border-none\\\"\\n >\\n Sign in\\n </Button>\\n </div>\\n\\n <div className=\\\"px-6 py-4\\\">\\n <Hr className=\\\"opacity-20\\\" />\\n </div>\\n\\n <p className=\\\"text-xs font-sans font-normal text-center pt-1 pb-6 px-6 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it.\\n </p>\\n </Section>\\n </div>\\n </>\\n )\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n signInInvitationLink: \\\"#\\\",\\n teamDisplayName: \\\"My Team\\\"\\n} satisfies typeof variablesSchema.infer\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_PAYMENT_RECEIPT_ID]: {\n \"displayName\": \"Payment Receipt\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\";\\nimport { Button, Section, Hr } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\nexport const variablesSchema = type({\\n productName: \\\"string\\\",\\n quantity: \\\"number\\\",\\n amount: \\\"string\\\",\\n receiptLink: \\\"string?\\\"\\n});\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"Your receipt from \\\" + project.displayName} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"bg-white text-[#242424] font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\\\">\\n <Section className=\\\"bg-white\\\">\\n <h3 className=\\\"text-black font-sans font-bold text-[20px] text-center py-4 px-6 m-0\\\">\\n Thanks for your purchase\\n </h3>\\n <p className=\\\"text-[#474849] font-sans font-normal text-[14px] text-center pt-2 px-6 pb-4 m-0\\\">\\n Hi{user.displayName ? (\\\", \\\" + user.displayName) : \\\"\\\"}! Your payment for {variables.productName} is complete.\\n </p>\\n <div className=\\\"px-6\\\">\\n <p className=\\\"text-black font-sans font-bold text-[16px] text-center m-0\\\">\\n Total paid: {variables.amount}\\n </p>\\n <p className=\\\"text-[#474849] font-sans text-[13px] text-center mt-2 mb-0\\\">\\n Quantity: {variables.quantity}\\n </p>\\n </div>\\n {variables.receiptLink ? (\\n <div className=\\\"text-center py-4 px-6\\\">\\n <Button\\n href={variables.receiptLink}\\n target=\\\"_blank\\\"\\n className=\\\"text-black font-sans font-bold text-[14px] inline-block bg-[#f0f0f0] rounded-[4px] py-3 px-5 no-underline border-0\\\"\\n >\\n View receipt\\n </Button>\\n </div>\\n ) : null}\\n <div className=\\\"py-4 px-6\\\">\\n <Hr />\\n </div>\\n </Section>\\n </div>\\n </>\\n );\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n productName: \\\"Pro Plan\\\",\\n quantity: 1,\\n amount: \\\"$29.00\\\",\\n receiptLink: \\\"https://example.com/receipt\\\"\\n} satisfies typeof variablesSchema.infer;\\n\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_PAYMENT_FAILED_ID]: {\n \"displayName\": \"Payment Failed\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\";\\nimport { Button, Section, Hr } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\nexport const variablesSchema = type({\\n productName: \\\"string\\\",\\n amount: \\\"string\\\",\\n invoiceUrl: \\\"string?\\\",\\n failureReason: \\\"string?\\\"\\n});\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"Payment failed for \\\" + project.displayName} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"bg-white text-[#242424] font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\\\">\\n <Section className=\\\"bg-white\\\">\\n <h3 className=\\\"text-black font-sans font-bold text-[20px] text-center py-4 px-6 m-0\\\">\\n We couldn't process your payment\\n </h3>\\n <p className=\\\"text-[#474849] font-sans font-normal text-[14px] text-center pt-2 px-6 pb-4 m-0\\\">\\n Hi{user.displayName ? (\\\", \\\" + user.displayName) : \\\"\\\"}! Your payment for {variables.productName} ({variables.amount}) did not go through.\\n </p>\\n {variables.failureReason ? (\\n <p className=\\\"text-[#8a8b8b] font-sans text-[12px] text-center px-6 pb-2 m-0\\\">\\n Reason: {variables.failureReason}\\n </p>\\n ) : null}\\n {variables.invoiceUrl ? (\\n <div className=\\\"text-center py-3 px-6\\\">\\n <Button\\n href={variables.invoiceUrl}\\n target=\\\"_blank\\\"\\n className=\\\"text-black font-sans font-bold text-[14px] inline-block bg-[#f0f0f0] rounded-[4px] py-3 px-5 no-underline border-0\\\"\\n >\\n View invoice\\n </Button>\\n </div>\\n ) : null}\\n <div className=\\\"py-4 px-6\\\">\\n <Hr />\\n </div>\\n <p className=\\\"text-[#474849] font-sans font-normal text-[12px] text-center pt-1 px-6 pb-6 m-0\\\">\\n Please update your payment details to avoid service interruption.\\n </p>\\n </Section>\\n </div>\\n </>\\n );\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n productName: \\\"Pro Plan\\\",\\n amount: \\\"$29.00\\\",\\n invoiceUrl: \\\"https://example.com/billing\\\",\\n failureReason: \\\"Your card was declined\\\"\\n} satisfies typeof variablesSchema.infer;\\n\",\n \"themeId\": undefined,\n }\n};\n\nexport const DEFAULT_TEMPLATE_IDS = {\n email_verification: EMAIL_TEMPLATE_EMAIL_VERIFICATION_ID,\n password_reset: EMAIL_TEMPLATE_PASSWORD_RESET_ID,\n magic_link: EMAIL_TEMPLATE_MAGIC_LINK_ID,\n team_invitation: EMAIL_TEMPLATE_TEAM_INVITATION_ID,\n sign_in_invitation: EMAIL_TEMPLATE_SIGN_IN_INVITATION_ID,\n payment_receipt: EMAIL_TEMPLATE_PAYMENT_RECEIPT_ID,\n payment_failed: EMAIL_TEMPLATE_PAYMENT_FAILED_ID,\n} as const;\n"],"mappings":";;;AAEA,MAAa,2BAA2B,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;AA0BhD,MAAa,wBAAwB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwC7C,MAAa,kBAAkB,QAAQ;;;;;;;;;;;;;;AAevC,MAAa,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgC/B,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCvB,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+B3B,MAAa,yBAAyB;AAEtC,MAAa,uBAAuB;EACjC,yBAAyB;EACxB,aAAa;EACb,WAAW;EACZ;CACD,wCAAwC;EACtC,aAAa;EACb,WAAW;EACZ;CACD,wCAAwC;EACtC,aAAa;EACb,WAAW;EACZ;CACF;AAED,MAAM,uCAAuC;AAC7C,MAAM,mCAAmC;AACzC,MAAM,+BAA+B;AACrC,MAAM,oCAAoC;AAC1C,MAAM,uCAAuC;AAC7C,MAAM,oCAAoC;AAC1C,MAAM,mCAAmC;AAEzC,MAAa,0BAA0B;EACpC,uCAAuC;EACtC,eAAe;EACf,aAAa;EACb,WAAW;EACZ;EACA,mCAAmC;EAClC,eAAe;EACf,aAAa;EACb,WAAW;EACZ;EACA,+BAA+B;EAC9B,eAAe;EACf,aAAa;EACb,WAAW;EACZ;EACA,oCAAoC;EACnC,eAAe;EACf,aAAa;EACb,WAAW;EACZ;EACA,uCAAuC;EACtC,eAAe;EACf,aAAa;EACb,WAAW;EACZ;EACA,oCAAoC;EACnC,eAAe;EACf,aAAa;EACb,WAAW;EACZ;EACA,mCAAmC;EAClC,eAAe;EACf,aAAa;EACb,WAAW;EACZ;CACF;AAED,MAAa,uBAAuB;CAClC,oBAAoB;CACpB,gBAAgB;CAChB,YAAY;CACZ,iBAAiB;CACjB,oBAAoB;CACpB,iBAAiB;CACjB,gBAAgB;CACjB"}
1
+ {"version":3,"file":"emails.js","names":[],"sources":["../../../src/helpers/emails.ts"],"sourcesContent":["import { deindent } from \"../utils/strings\";\n\nexport const defaultNewTemplateSource = deindent`\n import { type } from \"arktype\"\n import { Container } from \"@react-email/components\";\n import { Subject, NotificationCategory, Props } from \"@stackframe/emails\";\n\n export const variablesSchema = type({\n count: \"number\"\n });\n\n export function EmailTemplate({ user, variables }: Props<typeof variablesSchema.infer>) {\n return (\n <Container>\n <Subject value={\\`Hello \\${user.displayName}!\\`} />\n <NotificationCategory value=\"Transactional\" />\n <div className=\"font-bold\">Hi {user.displayName}!</div>\n <br />\n count is {variables.count}\n </Container>\n );\n }\n\n EmailTemplate.PreviewVariables = {\n count: 10\n } satisfies typeof variablesSchema.infer\n`;\n\nexport const previewTemplateSource = deindent`\n import { Button, Section, Hr, Text, Heading } from \"@react-email/components\";\n import { Subject, NotificationCategory } from \"@stackframe/emails\";\n\n export const variablesSchema = v => v;\n\n export function EmailTemplate({ user, project }) {\n return (\n <>\n <Subject value={\\`Verify your email at \\${project.displayName}\\`} />\n <NotificationCategory value=\"Transactional\" />\n <div className=\"font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\">\n <Section>\n <Heading as=\"h3\" className=\"font-sans font-bold text-[20px] text-center py-4 px-6 m-0\">\n Verify your email at {project.displayName}\n </Heading>\n <Text className=\"font-sans font-normal text-[14px] text-center pt-2 px-6 pb-4 m-0 opacity-80\">\n Hi{user.displayName ? (\", \" + user.displayName) : ''}! Please click on the following button to verify your email.\n </Text>\n <div className=\"text-center py-3 px-6\">\n <Button\n href=\"#\"\n className=\"text-black font-sans font-bold text-[14px] inline-block bg-[#f0f0f0] rounded-[4px] py-3 px-5 no-underline border-0\"\n >\n Verify my email\n </Button>\n </div>\n <div className=\"py-4 px-6\">\n <Hr className=\"opacity-20\" />\n </div>\n <Text className=\"font-sans font-normal text-[12px] text-center pt-1 px-6 pb-6 m-0 opacity-60\">\n If you were not expecting this email, you can safely ignore it. \n </Text>\n </Section>\n </div>\n </>\n )\n }\n`;\n\nexport const emptyEmailTheme = deindent`\n import { Html, Tailwind, Body } from '@react-email/components';\n export function EmailTheme({ children }: { children: React.ReactNode }) {\n return (\n <Html>\n <Tailwind>\n <Body>\n {children}\n </Body>\n </Tailwind>\n </Html>\n );\n }\n`;\n\nexport const LightEmailTheme = `import { Html, Head, Tailwind, Body, Container, Section } from '@react-email/components';\nimport { ThemeProps, ProjectLogo } from \"@stackframe/emails\";\n\nexport function EmailTheme({ children, unsubscribeLink, projectLogos }: ThemeProps) {\n return (\n <Html>\n <Head />\n <Tailwind>\n <Body className=\"bg-[#fafbfb] font-sans text-base m-0 p-0\" style={{ overflowX: 'hidden' }}>\n <div className=\"py-8 px-4 flex justify-center\">\n <Container className=\"bg-white p-[45px] rounded-lg shadow-sm mx-auto\" style={{ width: '100%', maxWidth: '600px' }}>\n <ProjectLogo data={projectLogos} mode=\"light\" />\n {children}\n </Container>\n </div>\n {unsubscribeLink && (\n <Section className=\"p-4 opacity-60 text-center\" style={{ textAlign: 'center' }}>\n <a href={unsubscribeLink} className=\"text-blue-600\" target=\"_blank\" rel=\"noopener noreferrer\">Click here</a> to unsubscribe from these emails\n </Section>\n )}\n </Body>\n </Tailwind>\n </Html>\n );\n}\n\nEmailTheme.PreviewProps = {\n unsubscribeLink: \"https://example.com\",\n} satisfies Partial<ThemeProps>\n`;\n\n\nconst DarkEmailTheme = `import { Html, Head, Tailwind, Body, Container, Section } from '@react-email/components';\nimport { ThemeProps, ProjectLogo } from \"@stackframe/emails\";\n\nexport function EmailTheme({ children, unsubscribeLink, projectLogos }: ThemeProps) {\n return (\n <Html>\n <Head />\n <Tailwind>\n <Body className=\"bg-[#323232] font-sans text-white m-0 p-0\" style={{ overflowX: 'hidden' }}>\n <div className=\"py-8 px-4 flex justify-center\">\n <Container className=\"bg-black p-[45px] rounded-lg shadow-sm mx-auto\" style={{ width: '100%', maxWidth: '600px' }}>\n <ProjectLogo data={projectLogos} mode=\"dark\" />\n {children}\n </Container>\n </div>\n {unsubscribeLink && (\n <Section className=\"p-4 opacity-60 text-center\" style={{ textAlign: 'center' }}>\n <a href={unsubscribeLink} className=\"text-blue-600\" target=\"_blank\" rel=\"noopener noreferrer\">Click here</a> to unsubscribe from these emails\n </Section>\n )}\n </Body>\n </Tailwind>\n </Html>\n );\n}\n\nEmailTheme.PreviewProps = {\n unsubscribeLink: \"https://example.com\",\n} satisfies Partial<ThemeProps>\n`;\n\n\nconst ColorfulEmailTheme = `import { Html, Head, Tailwind, Body, Container, Section } from '@react-email/components';\nimport { ThemeProps, ProjectLogo } from \"@stackframe/emails\";\n\nexport function EmailTheme({ children, unsubscribeLink, projectLogos }: ThemeProps) {\n return (\n <Html>\n <Head />\n <Tailwind>\n <Body className=\"bg-[#f0eef6] font-sans text-base m-0 p-0\" style={{ overflowX: 'hidden' }}>\n <div className=\"py-8 px-4 flex justify-center\">\n <Container className=\"bg-white p-[45px] rounded-2xl mx-auto\" style={{ width: '100%', maxWidth: '600px', borderTop: '4px solid #7c5ce0' }}>\n <ProjectLogo data={projectLogos} mode=\"light\" />\n {children}\n </Container>\n </div>\n {unsubscribeLink && (\n <Section className=\"p-4 opacity-60 text-center\" style={{ textAlign: 'center' }}>\n <a href={unsubscribeLink} className=\"text-[#7c5ce0]\" target=\"_blank\" rel=\"noopener noreferrer\">Click here</a> to unsubscribe from these emails\n </Section>\n )}\n </Body>\n </Tailwind>\n </Html>\n );\n}\n\nEmailTheme.PreviewProps = {\n unsubscribeLink: \"https://example.com\",\n} satisfies Partial<ThemeProps>\n`;\n\nexport const DEFAULT_EMAIL_THEME_ID = \"1df07ae6-abf3-4a40-83a5-a1a2cbe336ac\";\n\nexport const DEFAULT_EMAIL_THEMES = {\n [DEFAULT_EMAIL_THEME_ID]: {\n displayName: 'Default Light',\n tsxSource: LightEmailTheme,\n },\n \"a0172b5d-cff0-463b-83bb-85124697373a\": {\n displayName: 'Default Dark',\n tsxSource: DarkEmailTheme,\n },\n \"c7e2d94f-8a1b-4e6d-b3f5-9d0a2e7c1b8f\": {\n displayName: 'Default Colorful',\n tsxSource: ColorfulEmailTheme,\n },\n};\n\nconst EMAIL_TEMPLATE_EMAIL_VERIFICATION_ID = \"e7d009ce-8d47-4528-b245-5bf119f2ffa3\";\nconst EMAIL_TEMPLATE_PASSWORD_RESET_ID = \"a70fb3a4-56c1-4e42-af25-49d25603abd0\";\nconst EMAIL_TEMPLATE_MAGIC_LINK_ID = \"822687fe-8d0a-4467-a0d1-416b6e639478\";\nconst EMAIL_TEMPLATE_TEAM_INVITATION_ID = \"e84de395-2076-4831-9c19-8e9a96a868e4\";\nconst EMAIL_TEMPLATE_SIGN_IN_INVITATION_ID = \"066dd73c-36da-4fd0-b6d6-ebf87683f8bc\";\nconst EMAIL_TEMPLATE_PAYMENT_RECEIPT_ID = \"70372aee-0441-4d80-974c-2e858e40123a\";\nconst EMAIL_TEMPLATE_PAYMENT_FAILED_ID = \"f64b1afe-27ec-4a28-a277-7178f3261f9a\";\n\nexport const DEFAULT_EMAIL_TEMPLATES = {\n [EMAIL_TEMPLATE_EMAIL_VERIFICATION_ID]: {\n \"displayName\": \"Email Verification\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\"\\nimport { Button, Section, Hr, Text, Heading } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\nexport const variablesSchema = type({\\n emailVerificationLink: \\\"string\\\"\\n})\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={`Verify your email at ${project.displayName}`} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\\\">\\n <Section>\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-[20px] text-center py-4 px-6 m-0\\\">\\n Verify your email at {project.displayName}\\n </Heading>\\n <p className=\\\"font-sans font-normal text-[14px] text-center pt-2 px-6 pb-4 m-0 opacity-80\\\">\\n Hi{user.displayName ? (\\\", \\\" + user.displayName) : ''}! Please click on the following button to verify your email.\\n </p>\\n <div className=\\\"text-center py-3 px-6\\\">\\n <Button\\n href={variables.emailVerificationLink}\\n className=\\\"text-black font-sans font-bold text-[14px] inline-block bg-[#f0f0f0] rounded-[4px] py-3 px-5 no-underline border-0\\\"\\n >\\n Verify my email\\n </Button>\\n </div>\\n <div className=\\\"py-4 px-6\\\">\\n <Hr className=\\\"opacity-20\\\" />\\n </div>\\n <p className=\\\"font-sans font-normal text-[12px] text-center pt-1 px-6 pb-6 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it. \\n </p>\\n </Section>\\n </div>\\n </>\\n )\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n emailVerificationLink: \\\"#\\\"\\n} satisfies typeof variablesSchema.infer\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_PASSWORD_RESET_ID]: {\n \"displayName\": \"Password Reset\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\"\\nimport { Button, Section, Hr, Text, Heading } from \\\"@react-email/components\\\"\\nimport { Subject, NotificationCategory, Props} from \\\"@stackframe/emails\\\"\\n\\nexport const variablesSchema = type({\\n passwordResetLink: \\\"string\\\"\\n})\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"Reset your password at \\\" + project.displayName} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"font-sans text-base font-normal tracking-tight leading-relaxed py-8 w-full min-h-full\\\">\\n <Section>\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-[20px] text-center py-4 px-6 m-0\\\">\\n Reset your password at {project.displayName}\\n </Heading>\\n\\n <p className=\\\"text-sm font-sans font-normal text-center pt-2 pb-4 px-6 m-0 opacity-80\\\">\\n Hi{user.displayName ? (\\\", \\\" + user.displayName) : \\\"\\\"}! Please click on the following button to start the password reset process.\\n </p>\\n\\n <div className=\\\"text-center px-6 py-3\\\">\\n <Button\\n href={variables.passwordResetLink}\\n className=\\\"text-black text-sm font-sans font-bold bg-[#f0f0f0] rounded-[4px] inline-block py-3 px-5 no-underline border-none\\\"\\n target=\\\"_blank\\\"\\n >\\n Reset my password\\n </Button>\\n </div>\\n\\n <div className=\\\"px-6 py-4\\\">\\n <Hr className=\\\"opacity-20\\\" />\\n </div>\\n\\n <p className=\\\"text-xs font-sans font-normal text-center pt-1 pb-6 px-6 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it.\\n </p>\\n </Section>\\n </div>\\n </>\\n )\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n passwordResetLink: \\\"#\\\"\\n} satisfies typeof variablesSchema.infer\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_MAGIC_LINK_ID]: {\n \"displayName\": \"Magic Link/OTP\",\n \"tsxSource\": \"import { type } from 'arktype';\\nimport { Section, Hr, Text, Heading } from '@react-email/components';\\nimport { Subject, NotificationCategory, Props } from '@stackframe/emails';\\n\\nexport const variablesSchema = type({\\n magicLink: 'string',\\n otp: 'string',\\n});\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"Sign in to \\\" + project.displayName + \\\": Your code is \\\" + variables.otp} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"font-sans text-base font-normal tracking-[0.15008px] leading-6 m-0 py-8 w-full min-h-full\\\">\\n <Section className=\\\"mx-auto\\\">\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-xl text-center px-6 py-4 m-0\\\">\\n Sign in to {project.displayName}\\n </Heading>\\n <p className=\\\"text-sm font-sans font-normal text-center px-6 py-4 m-0 opacity-80\\\">\\n Hi{user.displayName ? \\\", \\\" + user.displayName : \\\"\\\"}! This is your one-time-password for signing in:\\n </p>\\n <p className=\\\"text-2xl font-mono font-bold text-center px-6 py-4 m-0\\\">\\n {variables.otp}\\n </p>\\n <p className=\\\"text-sm font-sans font-normal text-center px-6 py-4 m-0\\\">\\n Or you can click on{' '}\\n <a\\n key={20}\\n href={variables.magicLink}\\n rel=\\\"noopener noreferrer\\\"\\n className=\\\"text-blue-600 underline\\\"\\n >\\n this link\\n </a>{' '}\\n to sign in\\n </p>\\n <Hr className=\\\"px-6 py-4 opacity-20\\\" />\\n <p className=\\\"text-xs font-sans font-normal text-center px-6 pt-1 pb-6 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it.\\n </p>\\n </Section>\\n </div>\\n </>\\n );\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n magicLink: \\\"#\\\",\\n otp: \\\"3SLSWZ\\\"\\n} satisfies typeof variablesSchema.infer\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_TEAM_INVITATION_ID]: {\n \"displayName\": \"Team Invitation\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\";\\nimport { Button, Section, Hr, Text, Heading } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\n\\nexport const variablesSchema = type({\\n teamDisplayName: \\\"string\\\",\\n teamInvitationLink: \\\"string\\\"\\n});\\n\\nexport function EmailTemplate({ user, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"You have been invited to join \\\" + variables.teamDisplayName} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\\\">\\n <Section className=\\\"mx-auto max-w-lg\\\">\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-xl text-center px-6 pt-8 m-0\\\">\\n You are invited to {variables.teamDisplayName}\\n </Heading>\\n <p className=\\\"text-sm font-sans font-normal text-center px-6 pt-2 pb-4 m-0 opacity-80\\\">\\n Hi{user.displayName ? \\\", \\\" + user.displayName : \\\"\\\"}! Please click the button below to join the team {variables.teamDisplayName}\\n </p>\\n <div className=\\\"text-center px-6 py-3\\\">\\n <Button\\n href={variables.teamInvitationLink}\\n className=\\\"text-black text-sm font-sans font-bold bg-[#f0f0f0] rounded-md inline-block px-5 py-3 no-underline border-0\\\"\\n >\\n Join team\\n </Button>\\n </div>\\n <div className=\\\"px-6 py-4\\\">\\n <Hr className=\\\"opacity-20\\\" />\\n </div>\\n <p className=\\\"text-xs font-sans font-normal text-center px-6 pb-6 pt-1 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it.\\n </p>\\n </Section>\\n </div>\\n </>\\n );\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n teamDisplayName: \\\"My Team\\\",\\n teamInvitationLink: \\\"#\\\"\\n} satisfies typeof variablesSchema.infer \",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_SIGN_IN_INVITATION_ID]: {\n \"displayName\": \"Sign In Invitation\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\"\\nimport { Button, Section, Hr, Text, Heading } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\nexport const variablesSchema = type({\\n signInInvitationLink: \\\"string\\\",\\n teamDisplayName: \\\"string\\\"\\n})\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject\\n value={\\\"You have been invited to sign in to \\\" + project.displayName}\\n />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n\\n <div className=\\\"font-sans text-base font-normal leading-normal w-full min-h-full m-0 py-8\\\">\\n <Section>\\n <Heading as=\\\"h3\\\" className=\\\"font-sans font-bold text-xl text-center pt-8 px-6 m-0\\\">\\n You are invited to sign in to {variables.teamDisplayName}\\n </Heading>\\n\\n <p className=\\\"text-sm font-sans font-normal text-center pt-2 pb-4 px-6 m-0 opacity-80\\\">\\n Hi\\n {user.displayName ? \\\", \\\" + user.displayName : \\\"\\\"}! Please click on the following\\n link to sign in to your account\\n </p>\\n\\n <div className=\\\"text-center px-6 py-3\\\">\\n <Button\\n href={variables.signInInvitationLink}\\n className=\\\"text-black text-sm font-sans font-bold bg-gray-200 rounded-md inline-block py-3 px-5 no-underline border-none\\\"\\n >\\n Sign in\\n </Button>\\n </div>\\n\\n <div className=\\\"px-6 py-4\\\">\\n <Hr className=\\\"opacity-20\\\" />\\n </div>\\n\\n <p className=\\\"text-xs font-sans font-normal text-center pt-1 pb-6 px-6 m-0 opacity-60\\\">\\n If you were not expecting this email, you can safely ignore it.\\n </p>\\n </Section>\\n </div>\\n </>\\n )\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n signInInvitationLink: \\\"#\\\",\\n teamDisplayName: \\\"My Team\\\"\\n} satisfies typeof variablesSchema.infer\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_PAYMENT_RECEIPT_ID]: {\n \"displayName\": \"Payment Receipt\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\";\\nimport { Button, Section, Hr } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\nexport const variablesSchema = type({\\n productName: \\\"string\\\",\\n quantity: \\\"number\\\",\\n amount: \\\"string\\\",\\n receiptLink: \\\"string?\\\"\\n});\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"Your receipt from \\\" + project.displayName} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"bg-white text-[#242424] font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\\\">\\n <Section className=\\\"bg-white\\\">\\n <h3 className=\\\"text-black font-sans font-bold text-[20px] text-center py-4 px-6 m-0\\\">\\n Thanks for your purchase\\n </h3>\\n <p className=\\\"text-[#474849] font-sans font-normal text-[14px] text-center pt-2 px-6 pb-4 m-0\\\">\\n Hi{user.displayName ? (\\\", \\\" + user.displayName) : \\\"\\\"}! Your payment for {variables.productName} is complete.\\n </p>\\n <div className=\\\"px-6\\\">\\n <p className=\\\"text-black font-sans font-bold text-[16px] text-center m-0\\\">\\n Total paid: {variables.amount}\\n </p>\\n <p className=\\\"text-[#474849] font-sans text-[13px] text-center mt-2 mb-0\\\">\\n Quantity: {variables.quantity}\\n </p>\\n </div>\\n {variables.receiptLink ? (\\n <div className=\\\"text-center py-4 px-6\\\">\\n <Button\\n href={variables.receiptLink}\\n target=\\\"_blank\\\"\\n className=\\\"text-black font-sans font-bold text-[14px] inline-block bg-[#f0f0f0] rounded-[4px] py-3 px-5 no-underline border-0\\\"\\n >\\n View receipt\\n </Button>\\n </div>\\n ) : null}\\n <div className=\\\"py-4 px-6\\\">\\n <Hr />\\n </div>\\n </Section>\\n </div>\\n </>\\n );\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n productName: \\\"Pro Plan\\\",\\n quantity: 1,\\n amount: \\\"$29.00\\\",\\n receiptLink: \\\"https://example.com/receipt\\\"\\n} satisfies typeof variablesSchema.infer;\\n\",\n \"themeId\": undefined,\n },\n [EMAIL_TEMPLATE_PAYMENT_FAILED_ID]: {\n \"displayName\": \"Payment Failed\",\n \"tsxSource\": \"import { type } from \\\"arktype\\\";\\nimport { Button, Section, Hr } from \\\"@react-email/components\\\";\\nimport { Subject, NotificationCategory, Props } from \\\"@stackframe/emails\\\";\\n\\nexport const variablesSchema = type({\\n productName: \\\"string\\\",\\n amount: \\\"string\\\",\\n invoiceUrl: \\\"string?\\\",\\n failureReason: \\\"string?\\\"\\n});\\n\\nexport function EmailTemplate({ user, project, variables }: Props<typeof variablesSchema.infer>) {\\n return (\\n <>\\n <Subject value={\\\"Payment failed for \\\" + project.displayName} />\\n <NotificationCategory value=\\\"Transactional\\\" />\\n <div className=\\\"bg-white text-[#242424] font-sans text-base font-normal tracking-[0.15008px] leading-[1.5] m-0 py-8 w-full min-h-full\\\">\\n <Section className=\\\"bg-white\\\">\\n <h3 className=\\\"text-black font-sans font-bold text-[20px] text-center py-4 px-6 m-0\\\">\\n We couldn't process your payment\\n </h3>\\n <p className=\\\"text-[#474849] font-sans font-normal text-[14px] text-center pt-2 px-6 pb-4 m-0\\\">\\n Hi{user.displayName ? (\\\", \\\" + user.displayName) : \\\"\\\"}! Your payment for {variables.productName} ({variables.amount}) did not go through.\\n </p>\\n {variables.failureReason ? (\\n <p className=\\\"text-[#8a8b8b] font-sans text-[12px] text-center px-6 pb-2 m-0\\\">\\n Reason: {variables.failureReason}\\n </p>\\n ) : null}\\n {variables.invoiceUrl ? (\\n <div className=\\\"text-center py-3 px-6\\\">\\n <Button\\n href={variables.invoiceUrl}\\n target=\\\"_blank\\\"\\n className=\\\"text-black font-sans font-bold text-[14px] inline-block bg-[#f0f0f0] rounded-[4px] py-3 px-5 no-underline border-0\\\"\\n >\\n View invoice\\n </Button>\\n </div>\\n ) : null}\\n <div className=\\\"py-4 px-6\\\">\\n <Hr />\\n </div>\\n <p className=\\\"text-[#474849] font-sans font-normal text-[12px] text-center pt-1 px-6 pb-6 m-0\\\">\\n Please update your payment details to avoid service interruption.\\n </p>\\n </Section>\\n </div>\\n </>\\n );\\n}\\n\\nEmailTemplate.PreviewVariables = {\\n productName: \\\"Pro Plan\\\",\\n amount: \\\"$29.00\\\",\\n invoiceUrl: \\\"https://example.com/billing\\\",\\n failureReason: \\\"Your card was declined\\\"\\n} satisfies typeof variablesSchema.infer;\\n\",\n \"themeId\": undefined,\n }\n};\n\nexport const DEFAULT_TEMPLATE_IDS = {\n email_verification: EMAIL_TEMPLATE_EMAIL_VERIFICATION_ID,\n password_reset: EMAIL_TEMPLATE_PASSWORD_RESET_ID,\n magic_link: EMAIL_TEMPLATE_MAGIC_LINK_ID,\n team_invitation: EMAIL_TEMPLATE_TEAM_INVITATION_ID,\n sign_in_invitation: EMAIL_TEMPLATE_SIGN_IN_INVITATION_ID,\n payment_receipt: EMAIL_TEMPLATE_PAYMENT_RECEIPT_ID,\n payment_failed: EMAIL_TEMPLATE_PAYMENT_FAILED_ID,\n} as const;\n"],"mappings":";;AAEA,MAAa,2BAA2B,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;AA0BhD,MAAa,wBAAwB,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwC7C,MAAa,kBAAkB,QAAQ;;;;;;;;;;;;;;AAevC,MAAa,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgC/B,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCvB,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+B3B,MAAa,yBAAyB;AAEtC,MAAa,uBAAuB;EACjC,yBAAyB;EACxB,aAAa;EACb,WAAW;CACb;CACA,wCAAwC;EACtC,aAAa;EACb,WAAW;CACb;CACA,wCAAwC;EACtC,aAAa;EACb,WAAW;CACb;AACF;AAEA,MAAM,uCAAuC;AAC7C,MAAM,mCAAmC;AACzC,MAAM,+BAA+B;AACrC,MAAM,oCAAoC;AAC1C,MAAM,uCAAuC;AAC7C,MAAM,oCAAoC;AAC1C,MAAM,mCAAmC;AAEzC,MAAa,0BAA0B;EACpC,uCAAuC;EACtC,eAAe;EACf,aAAa;EACb,WAAW,KAAA;CACb;EACC,mCAAmC;EAClC,eAAe;EACf,aAAa;EACb,WAAW,KAAA;CACb;EACC,+BAA+B;EAC9B,eAAe;EACf,aAAa;EACb,WAAW,KAAA;CACb;EACC,oCAAoC;EACnC,eAAe;EACf,aAAa;EACb,WAAW,KAAA;CACb;EACC,uCAAuC;EACtC,eAAe;EACf,aAAa;EACb,WAAW,KAAA;CACb;EACC,oCAAoC;EACnC,eAAe;EACf,aAAa;EACb,WAAW,KAAA;CACb;EACC,mCAAmC;EAClC,eAAe;EACf,aAAa;EACb,WAAW,KAAA;CACb;AACF;AAEA,MAAa,uBAAuB;CAClC,oBAAoB;CACpB,gBAAgB;CAChB,YAAY;CACZ,iBAAiB;CACjB,oBAAoB;CACpB,iBAAiB;CACjB,gBAAgB;AAClB"}
@@ -1 +1 @@
1
- {"version":3,"file":"init-prompt.d.ts","names":[],"sources":["../../../src/helpers/init-prompt.ts"],"mappings":";cAsBa,gBAAA,GAAoB,GAAA,WAAc,UAAA"}
1
+ {"version":3,"file":"init-prompt.d.ts","names":[],"sources":["../../../src/helpers/init-prompt.ts"],"mappings":";cAsBa,gBAAA,GAAoB,GAAA,WAAc,UAAmB"}
@@ -1,5 +1,4 @@
1
1
  import { aiSetupPrompt } from "../ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt.js";
2
-
3
2
  //#region src/helpers/init-prompt.ts
4
3
  function getCliProjectSetupContext(configPath) {
5
4
  if (configPath != null) return `
@@ -34,7 +33,7 @@ Apply only the sections relevant to this project. For example, do not add Convex
34
33
 
35
34
  ${aiSetupPrompt}
36
35
  `;
37
-
38
36
  //#endregion
39
37
  export { createInitPrompt };
38
+
40
39
  //# sourceMappingURL=init-prompt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"init-prompt.js","names":[],"sources":["../../../src/helpers/init-prompt.ts"],"sourcesContent":["import { aiSetupPrompt } from \"../ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt\";\n\nfunction getCliProjectSetupContext(configPath?: string): string {\n if (configPath != null) {\n return `\nThe Hexclave CLI already created or linked this project to a local Hexclave development environment config file:\n\n\\`\\`\\`text\n${configPath}\n\\`\\`\\`\n\nDo not create or link another Hexclave project. When the SDK setup instructions mention creating \\`hexclave.config.ts\\` or wrapping the dev script with \\`hexclave dev --config-file\\`, use the config file path above.\n`;\n }\n\n return `\nThe Hexclave CLI already created or linked this project to a hosted Hexclave cloud project and wrote or printed the Hexclave environment variables.\n\nDo not create or link another Hexclave project. Use the existing environment variables in this workspace. If the variables were printed instead of written because the user declined to append them to an env file, tell the user exactly which variables still need to be added.\n`;\n}\n\nexport const createInitPrompt = (web: boolean, configPath?: string) => `=============================\nHEXCLAVE SETUP INSTRUCTIONS\n=============================\n\nThese instructions describe how to set up Hexclave.\n${web ? `\nFirst of all, use the full setup prompt below as the source of truth. Do not run the Hexclave CLI initializer unless the user explicitly asks for the CLI workflow.\n` : \"\"}\n\n${getCliProjectSetupContext(configPath)}\n\nUse the full setup guide below as the source of truth, with one important CLI-specific adjustment: the \"Setting up the project\" step is already complete. Use that section only to understand how the existing config/env files should connect to the SDK wiring; do not ask the user for project IDs or keys that the CLI already generated or linked.\n\nApply only the sections relevant to this project. For example, do not add Convex, Supabase, or command-line-app authentication unless the existing project already uses that surface or the user explicitly asked for it.\n\n${aiSetupPrompt}\n`;\n"],"mappings":";;;AAEA,SAAS,0BAA0B,YAA6B;AAC9D,KAAI,cAAc,KAChB,QAAO;;;;EAIT,WAAW;;;;;AAOX,QAAO;;;;;;AAOT,MAAa,oBAAoB,KAAc,eAAwB;;;;;EAKrE,MAAM;;IAEJ,GAAG;;EAEL,0BAA0B,WAAW,CAAC;;;;;;EAMtC,cAAc"}
1
+ {"version":3,"file":"init-prompt.js","names":[],"sources":["../../../src/helpers/init-prompt.ts"],"sourcesContent":["import { aiSetupPrompt } from \"../ai/unified-prompts/skill-site-prompt-parts/ai-setup-prompt\";\n\nfunction getCliProjectSetupContext(configPath?: string): string {\n if (configPath != null) {\n return `\nThe Hexclave CLI already created or linked this project to a local Hexclave development environment config file:\n\n\\`\\`\\`text\n${configPath}\n\\`\\`\\`\n\nDo not create or link another Hexclave project. When the SDK setup instructions mention creating \\`hexclave.config.ts\\` or wrapping the dev script with \\`hexclave dev --config-file\\`, use the config file path above.\n`;\n }\n\n return `\nThe Hexclave CLI already created or linked this project to a hosted Hexclave cloud project and wrote or printed the Hexclave environment variables.\n\nDo not create or link another Hexclave project. Use the existing environment variables in this workspace. If the variables were printed instead of written because the user declined to append them to an env file, tell the user exactly which variables still need to be added.\n`;\n}\n\nexport const createInitPrompt = (web: boolean, configPath?: string) => `=============================\nHEXCLAVE SETUP INSTRUCTIONS\n=============================\n\nThese instructions describe how to set up Hexclave.\n${web ? `\nFirst of all, use the full setup prompt below as the source of truth. Do not run the Hexclave CLI initializer unless the user explicitly asks for the CLI workflow.\n` : \"\"}\n\n${getCliProjectSetupContext(configPath)}\n\nUse the full setup guide below as the source of truth, with one important CLI-specific adjustment: the \"Setting up the project\" step is already complete. Use that section only to understand how the existing config/env files should connect to the SDK wiring; do not ask the user for project IDs or keys that the CLI already generated or linked.\n\nApply only the sections relevant to this project. For example, do not add Convex, Supabase, or command-line-app authentication unless the existing project already uses that surface or the user explicitly asked for it.\n\n${aiSetupPrompt}\n`;\n"],"mappings":";;AAEA,SAAS,0BAA0B,YAA6B;CAC9D,IAAI,cAAc,MAChB,OAAO;;;;EAIT,WAAW;;;;;CAOX,OAAO;;;;;AAKT;AAEA,MAAa,oBAAoB,KAAc,eAAwB;;;;;EAKrE,MAAM;;IAEJ,GAAG;;EAEL,0BAA0B,UAAU,EAAE;;;;;;EAMtC,cAAc"}
@@ -1,4 +1,4 @@
1
- import { KnownErrors } from "..";
1
+ import { KnownErrors } from "../index.js";
2
2
 
3
3
  //#region src/helpers/password.d.ts
4
4
  declare function getPasswordError(password: string): KnownErrors["PasswordRequirementsNotMet"] | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"password.d.ts","names":[],"sources":["../../../src/helpers/password.ts"],"mappings":";;;iBAKgB,gBAAA,CAAiB,QAAA,WAAmB,WAAA"}
1
+ {"version":3,"file":"password.d.ts","names":[],"sources":["../../../src/helpers/password.ts"],"mappings":";;;iBAKgB,gBAAA,CAAiB,QAAA,WAAmB,WAAW"}
@@ -1,5 +1,4 @@
1
1
  import { KnownErrors } from "../index.js";
2
-
3
2
  //#region src/helpers/password.ts
4
3
  const minLength = 8;
5
4
  const maxLength = 70;
@@ -7,7 +6,7 @@ function getPasswordError(password) {
7
6
  if (password.length < minLength) return new KnownErrors.PasswordTooShort(minLength);
8
7
  if (password.length > maxLength) return new KnownErrors.PasswordTooLong(maxLength);
9
8
  }
10
-
11
9
  //#endregion
12
10
  export { getPasswordError };
11
+
13
12
  //# sourceMappingURL=password.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"password.js","names":[],"sources":["../../../src/helpers/password.ts"],"sourcesContent":["import { KnownErrors } from \"..\";\n\nconst minLength = 8;\nconst maxLength = 70;\n\nexport function getPasswordError(password: string): KnownErrors[\"PasswordRequirementsNotMet\"] | undefined {\n if (password.length < minLength) {\n return new KnownErrors.PasswordTooShort(minLength);\n }\n\n if (password.length > maxLength) {\n return new KnownErrors.PasswordTooLong(maxLength);\n }\n\n return undefined;\n}\n"],"mappings":";;;AAEA,MAAM,YAAY;AAClB,MAAM,YAAY;AAElB,SAAgB,iBAAiB,UAAyE;AACxG,KAAI,SAAS,SAAS,UACpB,QAAO,IAAI,YAAY,iBAAiB,UAAU;AAGpD,KAAI,SAAS,SAAS,UACpB,QAAO,IAAI,YAAY,gBAAgB,UAAU"}
1
+ {"version":3,"file":"password.js","names":[],"sources":["../../../src/helpers/password.ts"],"sourcesContent":["import { KnownErrors } from \"..\";\n\nconst minLength = 8;\nconst maxLength = 70;\n\nexport function getPasswordError(password: string): KnownErrors[\"PasswordRequirementsNotMet\"] | undefined {\n if (password.length < minLength) {\n return new KnownErrors.PasswordTooShort(minLength);\n }\n\n if (password.length > maxLength) {\n return new KnownErrors.PasswordTooLong(maxLength);\n }\n\n return undefined;\n}\n"],"mappings":";;AAEA,MAAM,YAAY;AAClB,MAAM,YAAY;AAElB,SAAgB,iBAAiB,UAAyE;CACxG,IAAI,SAAS,SAAS,WACpB,OAAO,IAAI,YAAY,iBAAiB,SAAS;CAGnD,IAAI,SAAS,SAAS,WACpB,OAAO,IAAI,YAAY,gBAAgB,SAAS;AAIpD"}
@@ -1,4 +1,4 @@
1
- import { ProjectsCrud } from "../interface/crud/projects";
1
+ import { ProjectsCrud } from "../interface/crud/projects.js";
2
2
 
3
3
  //#region src/helpers/production-mode.d.ts
4
4
  type ProductionModeError = {