@stackframe/stack-shared 2.8.7 → 2.8.10

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 (476) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/config/format.d.cts +39 -0
  3. package/dist/config/format.d.ts +14 -13
  4. package/dist/config/format.js +147 -206
  5. package/dist/config/format.js.map +1 -0
  6. package/dist/config/schema.d.cts +724 -0
  7. package/dist/config/schema.d.ts +51 -48
  8. package/dist/config/schema.js +230 -172
  9. package/dist/config/schema.js.map +1 -0
  10. package/dist/crud.d.cts +102 -0
  11. package/dist/crud.d.ts +15 -13
  12. package/dist/crud.js +83 -128
  13. package/dist/crud.js.map +1 -0
  14. package/dist/esm/config/format.js +135 -0
  15. package/dist/esm/config/format.js.map +1 -0
  16. package/dist/esm/config/schema.js +199 -0
  17. package/dist/esm/config/schema.js.map +1 -0
  18. package/dist/esm/crud.js +60 -0
  19. package/dist/esm/crud.js.map +1 -0
  20. package/dist/esm/global.d.js +1 -0
  21. package/dist/esm/global.d.js.map +1 -0
  22. package/dist/esm/helpers/password.js +17 -0
  23. package/dist/esm/helpers/password.js.map +1 -0
  24. package/dist/esm/helpers/production-mode.js +50 -0
  25. package/dist/esm/helpers/production-mode.js.map +1 -0
  26. package/dist/esm/hooks/use-async-callback.js +38 -0
  27. package/dist/esm/hooks/use-async-callback.js.map +1 -0
  28. package/dist/esm/hooks/use-async-external-store.js +23 -0
  29. package/dist/esm/hooks/use-async-external-store.js.map +1 -0
  30. package/dist/esm/hooks/use-hash.js +17 -0
  31. package/dist/esm/hooks/use-hash.js.map +1 -0
  32. package/dist/esm/hooks/use-strict-memo.js +61 -0
  33. package/dist/esm/hooks/use-strict-memo.js.map +1 -0
  34. package/dist/esm/index.js +22 -0
  35. package/dist/esm/index.js.map +1 -0
  36. package/dist/esm/interface/adminInterface.js +244 -0
  37. package/dist/esm/interface/adminInterface.js.map +1 -0
  38. package/dist/esm/interface/clientInterface.js +2041 -0
  39. package/dist/esm/interface/clientInterface.js.map +1 -0
  40. package/dist/esm/interface/crud/contact-channels.js +77 -0
  41. package/dist/esm/interface/crud/contact-channels.js.map +1 -0
  42. package/dist/esm/interface/crud/current-user.js +65 -0
  43. package/dist/esm/interface/crud/current-user.js.map +1 -0
  44. package/dist/esm/interface/crud/email-templates.js +52 -0
  45. package/dist/esm/interface/crud/email-templates.js.map +1 -0
  46. package/dist/esm/interface/crud/emails.js +20 -0
  47. package/dist/esm/interface/crud/emails.js.map +1 -0
  48. package/dist/esm/interface/crud/internal-api-keys.js +69 -0
  49. package/dist/esm/interface/crud/internal-api-keys.js.map +1 -0
  50. package/dist/esm/interface/crud/oauth.js +24 -0
  51. package/dist/esm/interface/crud/oauth.js.map +1 -0
  52. package/dist/esm/interface/crud/project-api-keys.js +93 -0
  53. package/dist/esm/interface/crud/project-api-keys.js.map +1 -0
  54. package/dist/esm/interface/crud/project-permissions.js +113 -0
  55. package/dist/esm/interface/crud/project-permissions.js.map +1 -0
  56. package/dist/esm/interface/crud/projects.js +188 -0
  57. package/dist/esm/interface/crud/projects.js.map +1 -0
  58. package/dist/esm/interface/crud/sessions.js +62 -0
  59. package/dist/esm/interface/crud/sessions.js.map +1 -0
  60. package/dist/esm/interface/crud/svix-token.js +22 -0
  61. package/dist/esm/interface/crud/svix-token.js.map +1 -0
  62. package/dist/esm/interface/crud/team-invitation-details.js +23 -0
  63. package/dist/esm/interface/crud/team-invitation-details.js.map +1 -0
  64. package/dist/esm/interface/crud/team-invitation.js +36 -0
  65. package/dist/esm/interface/crud/team-invitation.js.map +1 -0
  66. package/dist/esm/interface/crud/team-member-profiles.js +62 -0
  67. package/dist/esm/interface/crud/team-member-profiles.js.map +1 -0
  68. package/dist/esm/interface/crud/team-memberships.js +60 -0
  69. package/dist/esm/interface/crud/team-memberships.js.map +1 -0
  70. package/dist/esm/interface/crud/team-permissions.js +114 -0
  71. package/dist/esm/interface/crud/team-permissions.js.map +1 -0
  72. package/dist/esm/interface/crud/teams.js +143 -0
  73. package/dist/esm/interface/crud/teams.js.map +1 -0
  74. package/dist/esm/interface/crud/users.js +139 -0
  75. package/dist/esm/interface/crud/users.js.map +1 -0
  76. package/dist/esm/interface/serverInterface.js +485 -0
  77. package/dist/esm/interface/serverInterface.js.map +1 -0
  78. package/dist/esm/interface/webhooks.js +21 -0
  79. package/dist/esm/interface/webhooks.js.map +1 -0
  80. package/dist/esm/known-errors.js +1223 -0
  81. package/dist/esm/known-errors.js.map +1 -0
  82. package/dist/esm/schema-fields.js +484 -0
  83. package/dist/esm/schema-fields.js.map +1 -0
  84. package/dist/esm/sessions.js +168 -0
  85. package/dist/esm/sessions.js.map +1 -0
  86. package/dist/esm/utils/api-keys.js +79 -0
  87. package/dist/esm/utils/api-keys.js.map +1 -0
  88. package/dist/esm/utils/arrays.js +78 -0
  89. package/dist/esm/utils/arrays.js.map +1 -0
  90. package/dist/esm/utils/base64.js +18 -0
  91. package/dist/esm/utils/base64.js.map +1 -0
  92. package/dist/esm/utils/booleans.js +12 -0
  93. package/dist/esm/utils/booleans.js.map +1 -0
  94. package/dist/esm/utils/browser-compat.js +21 -0
  95. package/dist/esm/utils/browser-compat.js.map +1 -0
  96. package/dist/esm/utils/bytes.js +160 -0
  97. package/dist/esm/utils/bytes.js.map +1 -0
  98. package/dist/esm/utils/caches.js +167 -0
  99. package/dist/esm/utils/caches.js.map +1 -0
  100. package/dist/esm/utils/compile-time.js +11 -0
  101. package/dist/esm/utils/compile-time.js.map +1 -0
  102. package/dist/esm/utils/crypto.js +25 -0
  103. package/dist/esm/utils/crypto.js.map +1 -0
  104. package/dist/esm/utils/dates.js +64 -0
  105. package/dist/esm/utils/dates.js.map +1 -0
  106. package/dist/esm/utils/dom.js +11 -0
  107. package/dist/esm/utils/dom.js.map +1 -0
  108. package/dist/esm/utils/env.js +58 -0
  109. package/dist/esm/utils/env.js.map +1 -0
  110. package/dist/esm/utils/errors.js +174 -0
  111. package/dist/esm/utils/errors.js.map +1 -0
  112. package/dist/esm/utils/fs.js +37 -0
  113. package/dist/esm/utils/fs.js.map +1 -0
  114. package/dist/esm/utils/functions.js +12 -0
  115. package/dist/esm/utils/functions.js.map +1 -0
  116. package/dist/esm/utils/geo.js +15 -0
  117. package/dist/esm/utils/geo.js.map +1 -0
  118. package/dist/esm/utils/globals.js +18 -0
  119. package/dist/esm/utils/globals.js.map +1 -0
  120. package/dist/esm/utils/hashes.js +55 -0
  121. package/dist/esm/utils/hashes.js.map +1 -0
  122. package/dist/esm/utils/html.js +13 -0
  123. package/dist/esm/utils/html.js.map +1 -0
  124. package/dist/esm/utils/http.js +60 -0
  125. package/dist/esm/utils/http.js.map +1 -0
  126. package/dist/esm/utils/ips.js +15 -0
  127. package/dist/esm/utils/ips.js.map +1 -0
  128. package/dist/esm/utils/json.js +31 -0
  129. package/dist/esm/utils/json.js.map +1 -0
  130. package/dist/esm/utils/jwt.js +87 -0
  131. package/dist/esm/utils/jwt.js.map +1 -0
  132. package/dist/esm/utils/locks.js +57 -0
  133. package/dist/esm/utils/locks.js.map +1 -0
  134. package/dist/esm/utils/maps.js +181 -0
  135. package/dist/esm/utils/maps.js.map +1 -0
  136. package/dist/esm/utils/math.js +8 -0
  137. package/dist/esm/utils/math.js.map +1 -0
  138. package/dist/esm/utils/node-http.js +42 -0
  139. package/dist/esm/utils/node-http.js.map +1 -0
  140. package/dist/esm/utils/numbers.js +32 -0
  141. package/dist/esm/utils/numbers.js.map +1 -0
  142. package/dist/esm/utils/oauth.js +10 -0
  143. package/dist/esm/utils/oauth.js.map +1 -0
  144. package/dist/esm/utils/objects.js +153 -0
  145. package/dist/esm/utils/objects.js.map +1 -0
  146. package/dist/esm/utils/passkey.js +1 -0
  147. package/dist/esm/utils/passkey.js.map +1 -0
  148. package/dist/esm/utils/promises.js +233 -0
  149. package/dist/esm/utils/promises.js.map +1 -0
  150. package/dist/esm/utils/proxies.js +128 -0
  151. package/dist/esm/utils/proxies.js.map +1 -0
  152. package/dist/esm/utils/react.js +78 -0
  153. package/dist/esm/utils/react.js.map +1 -0
  154. package/dist/esm/utils/results.js +141 -0
  155. package/dist/esm/utils/results.js.map +1 -0
  156. package/dist/esm/utils/sentry.js +20 -0
  157. package/dist/esm/utils/sentry.js.map +1 -0
  158. package/dist/esm/utils/stores.js +195 -0
  159. package/dist/esm/utils/stores.js.map +1 -0
  160. package/dist/esm/utils/strings.js +294 -0
  161. package/dist/esm/utils/strings.js.map +1 -0
  162. package/dist/esm/utils/strings.nicify.test.js +222 -0
  163. package/dist/esm/utils/strings.nicify.test.js.map +1 -0
  164. package/dist/esm/utils/types.js +1 -0
  165. package/dist/esm/utils/types.js.map +1 -0
  166. package/dist/esm/utils/unicode.js +11 -0
  167. package/dist/esm/utils/unicode.js.map +1 -0
  168. package/dist/esm/utils/urls.js +53 -0
  169. package/dist/esm/utils/urls.js.map +1 -0
  170. package/dist/esm/utils/uuids.js +16 -0
  171. package/dist/esm/utils/uuids.js.map +1 -0
  172. package/dist/global.d.d.cts +1 -0
  173. package/dist/global.d.d.ts +1 -0
  174. package/dist/global.d.js +2 -0
  175. package/dist/global.d.js.map +1 -0
  176. package/dist/helpers/password.d.cts +11 -0
  177. package/dist/helpers/password.d.ts +11 -2
  178. package/dist/helpers/password.js +41 -11
  179. package/dist/helpers/password.js.map +1 -0
  180. package/dist/helpers/production-mode.d.cts +12 -0
  181. package/dist/helpers/production-mode.d.ts +9 -3
  182. package/dist/helpers/production-mode.js +72 -45
  183. package/dist/helpers/production-mode.js.map +1 -0
  184. package/dist/hooks/use-async-callback.d.cts +6 -0
  185. package/dist/hooks/use-async-callback.d.ts +6 -3
  186. package/dist/hooks/use-async-callback.js +72 -30
  187. package/dist/hooks/use-async-callback.js.map +1 -0
  188. package/dist/hooks/use-async-external-store.d.cts +7 -0
  189. package/dist/hooks/use-async-external-store.d.ts +5 -2
  190. package/dist/hooks/use-async-external-store.js +47 -19
  191. package/dist/hooks/use-async-external-store.js.map +1 -0
  192. package/dist/hooks/use-hash.d.cts +3 -0
  193. package/dist/hooks/use-hash.d.ts +3 -1
  194. package/dist/hooks/use-hash.js +41 -8
  195. package/dist/hooks/use-hash.js.map +1 -0
  196. package/dist/hooks/use-strict-memo.d.cts +8 -0
  197. package/dist/hooks/use-strict-memo.d.ts +3 -1
  198. package/dist/hooks/use-strict-memo.js +78 -131
  199. package/dist/hooks/use-strict-memo.js.map +1 -0
  200. package/dist/index.d.cts +30 -0
  201. package/dist/index.d.ts +30 -4
  202. package/dist/index.js +42 -4
  203. package/dist/index.js.map +1 -0
  204. package/dist/interface/adminInterface.d.cts +94 -0
  205. package/dist/interface/adminInterface.d.ts +38 -15
  206. package/dist/interface/adminInterface.js +269 -174
  207. package/dist/interface/adminInterface.js.map +1 -0
  208. package/dist/interface/clientInterface.d.cts +260 -0
  209. package/dist/interface/clientInterface.d.ts +25 -18
  210. package/dist/interface/clientInterface.js +2054 -995
  211. package/dist/interface/clientInterface.js.map +1 -0
  212. package/dist/interface/crud/contact-channels.d.cts +180 -0
  213. package/dist/interface/crud/contact-channels.d.ts +30 -25
  214. package/dist/interface/crud/contact-channels.js +101 -59
  215. package/dist/interface/crud/contact-channels.js.map +1 -0
  216. package/dist/interface/crud/current-user.d.cts +205 -0
  217. package/dist/interface/crud/current-user.d.ts +17 -12
  218. package/dist/interface/crud/current-user.js +86 -56
  219. package/dist/interface/crud/current-user.js.map +1 -0
  220. package/dist/interface/crud/email-templates.d.cts +84 -0
  221. package/dist/interface/crud/email-templates.d.ts +24 -19
  222. package/dist/interface/crud/email-templates.js +77 -37
  223. package/dist/interface/crud/email-templates.js.map +1 -0
  224. package/dist/interface/crud/emails.d.cts +69 -0
  225. package/dist/interface/crud/emails.d.ts +12 -7
  226. package/dist/interface/crud/emails.js +54 -12
  227. package/dist/interface/crud/emails.js.map +1 -0
  228. package/dist/interface/crud/internal-api-keys.d.cts +139 -0
  229. package/dist/interface/crud/internal-api-keys.d.ts +22 -17
  230. package/dist/interface/crud/internal-api-keys.js +92 -54
  231. package/dist/interface/crud/internal-api-keys.js.map +1 -0
  232. package/dist/interface/crud/oauth.d.cts +34 -0
  233. package/dist/interface/crud/oauth.d.ts +16 -11
  234. package/dist/interface/crud/oauth.js +48 -14
  235. package/dist/interface/crud/oauth.js.map +1 -0
  236. package/dist/interface/crud/project-api-keys.d.cts +196 -0
  237. package/dist/interface/crud/project-api-keys.d.ts +18 -10
  238. package/dist/interface/crud/project-api-keys.js +121 -74
  239. package/dist/interface/crud/project-api-keys.js.map +1 -0
  240. package/dist/interface/crud/project-permissions.d.cts +160 -0
  241. package/dist/interface/crud/project-permissions.d.ts +38 -33
  242. package/dist/interface/crud/project-permissions.js +148 -90
  243. package/dist/interface/crud/project-permissions.js.map +1 -0
  244. package/dist/interface/crud/projects.d.cts +640 -0
  245. package/dist/interface/crud/projects.d.ts +36 -31
  246. package/dist/interface/crud/projects.js +218 -156
  247. package/dist/interface/crud/projects.js.map +1 -0
  248. package/dist/interface/crud/sessions.d.cts +149 -0
  249. package/dist/interface/crud/sessions.d.ts +21 -16
  250. package/dist/interface/crud/sessions.js +86 -50
  251. package/dist/interface/crud/sessions.js.map +1 -0
  252. package/dist/interface/crud/svix-token.d.cts +26 -0
  253. package/dist/interface/crud/svix-token.d.ts +14 -9
  254. package/dist/interface/crud/svix-token.js +46 -12
  255. package/dist/interface/crud/svix-token.js.map +1 -0
  256. package/dist/interface/crud/team-invitation-details.d.cts +30 -0
  257. package/dist/interface/crud/team-invitation-details.d.ts +12 -7
  258. package/dist/interface/crud/team-invitation-details.js +57 -15
  259. package/dist/interface/crud/team-invitation-details.js.map +1 -0
  260. package/dist/interface/crud/team-invitation.d.cts +49 -0
  261. package/dist/interface/crud/team-invitation.d.ts +13 -8
  262. package/dist/interface/crud/team-invitation.js +69 -27
  263. package/dist/interface/crud/team-invitation.js.map +1 -0
  264. package/dist/interface/crud/team-member-profiles.d.cts +229 -0
  265. package/dist/interface/crud/team-member-profiles.d.ts +20 -15
  266. package/dist/interface/crud/team-member-profiles.js +95 -49
  267. package/dist/interface/crud/team-member-profiles.js.map +1 -0
  268. package/dist/interface/crud/team-memberships.d.cts +74 -0
  269. package/dist/interface/crud/team-memberships.d.ts +22 -17
  270. package/dist/interface/crud/team-memberships.js +85 -45
  271. package/dist/interface/crud/team-memberships.js.map +1 -0
  272. package/dist/interface/crud/team-permissions.d.cts +168 -0
  273. package/dist/interface/crud/team-permissions.d.ts +38 -33
  274. package/dist/interface/crud/team-permissions.js +149 -91
  275. package/dist/interface/crud/team-permissions.js.map +1 -0
  276. package/dist/interface/crud/teams.d.cts +298 -0
  277. package/dist/interface/crud/teams.d.ts +45 -40
  278. package/dist/interface/crud/teams.js +177 -119
  279. package/dist/interface/crud/teams.js.map +1 -0
  280. package/dist/interface/crud/users.d.cts +469 -0
  281. package/dist/interface/crud/users.d.ts +31 -26
  282. package/dist/interface/crud/users.js +172 -118
  283. package/dist/interface/crud/users.js.map +1 -0
  284. package/dist/interface/serverInterface.d.cts +128 -0
  285. package/dist/interface/serverInterface.d.ts +29 -17
  286. package/dist/interface/serverInterface.js +506 -339
  287. package/dist/interface/serverInterface.js.map +1 -0
  288. package/dist/interface/webhooks.d.cts +292 -0
  289. package/dist/interface/webhooks.d.ts +6 -3
  290. package/dist/interface/webhooks.js +45 -15
  291. package/dist/interface/webhooks.js.map +1 -0
  292. package/dist/known-errors.d.cts +444 -0
  293. package/dist/known-errors.d.ts +12 -9
  294. package/dist/known-errors.js +1088 -561
  295. package/dist/known-errors.js.map +1 -0
  296. package/dist/schema-fields.d.cts +163 -0
  297. package/dist/schema-fields.d.ts +116 -114
  298. package/dist/schema-fields.js +593 -427
  299. package/dist/schema-fields.js.map +1 -0
  300. package/dist/sessions.d.cts +109 -0
  301. package/dist/sessions.d.ts +6 -3
  302. package/dist/sessions.js +201 -172
  303. package/dist/sessions.js.map +1 -0
  304. package/dist/utils/api-keys.d.cts +24 -0
  305. package/dist/utils/api-keys.d.ts +5 -4
  306. package/dist/utils/api-keys.js +106 -66
  307. package/dist/utils/api-keys.js.map +1 -0
  308. package/dist/utils/arrays.d.cts +18 -0
  309. package/dist/utils/arrays.d.ts +15 -13
  310. package/dist/utils/arrays.js +101 -168
  311. package/dist/utils/arrays.js.map +1 -0
  312. package/dist/utils/base64.d.cts +4 -0
  313. package/dist/utils/base64.d.ts +4 -2
  314. package/dist/utils/base64.js +41 -20
  315. package/dist/utils/base64.js.map +1 -0
  316. package/dist/utils/booleans.d.cts +6 -0
  317. package/dist/utils/booleans.d.ts +6 -4
  318. package/dist/utils/booleans.js +35 -27
  319. package/dist/utils/booleans.js.map +1 -0
  320. package/dist/utils/browser-compat.d.cts +8 -0
  321. package/dist/utils/browser-compat.d.ts +3 -1
  322. package/dist/utils/browser-compat.js +45 -16
  323. package/dist/utils/browser-compat.js.map +1 -0
  324. package/dist/utils/bytes.d.cts +15 -0
  325. package/dist/utils/bytes.d.ts +15 -13
  326. package/dist/utils/bytes.js +182 -270
  327. package/dist/utils/bytes.js.map +1 -0
  328. package/dist/utils/caches.d.cts +98 -0
  329. package/dist/utils/caches.d.ts +17 -14
  330. package/dist/utils/caches.js +188 -193
  331. package/dist/utils/caches.js.map +1 -0
  332. package/dist/utils/compile-time.d.cts +8 -0
  333. package/dist/utils/compile-time.d.ts +3 -1
  334. package/dist/utils/compile-time.js +35 -10
  335. package/dist/utils/compile-time.js.map +1 -0
  336. package/dist/utils/crypto.d.cts +8 -0
  337. package/dist/utils/crypto.d.ts +4 -2
  338. package/dist/utils/crypto.js +49 -21
  339. package/dist/utils/crypto.js.map +1 -0
  340. package/dist/utils/dates.d.cts +15 -0
  341. package/dist/utils/dates.d.ts +6 -4
  342. package/dist/utils/dates.js +83 -105
  343. package/dist/utils/dates.js.map +1 -0
  344. package/dist/utils/dom.d.cts +3 -0
  345. package/dist/utils/dom.d.ts +3 -1
  346. package/dist/utils/dom.js +35 -7
  347. package/dist/utils/dom.js.map +1 -0
  348. package/dist/utils/env.d.cts +9 -0
  349. package/dist/utils/env.d.ts +6 -4
  350. package/dist/utils/env.js +70 -43
  351. package/dist/utils/env.js.map +1 -0
  352. package/dist/utils/errors.d.cts +223 -0
  353. package/dist/utils/errors.d.ts +14 -11
  354. package/dist/utils/errors.js +148 -126
  355. package/dist/utils/errors.js.map +1 -0
  356. package/dist/utils/fs.d.cts +7 -0
  357. package/dist/utils/fs.d.ts +5 -3
  358. package/dist/utils/fs.js +70 -27
  359. package/dist/utils/fs.js.map +1 -0
  360. package/dist/utils/functions.d.cts +4 -0
  361. package/dist/utils/functions.d.ts +4 -2
  362. package/dist/utils/functions.js +35 -18
  363. package/dist/utils/functions.js.map +1 -0
  364. package/dist/utils/geo.d.cts +22 -0
  365. package/dist/utils/geo.d.ts +6 -3
  366. package/dist/utils/geo.js +39 -9
  367. package/dist/utils/geo.js.map +1 -0
  368. package/dist/utils/globals.d.cts +5 -0
  369. package/dist/utils/globals.d.ts +4 -2
  370. package/dist/utils/globals.js +41 -14
  371. package/dist/utils/globals.js.map +1 -0
  372. package/dist/utils/hashes.d.cts +7 -0
  373. package/dist/utils/hashes.d.ts +7 -5
  374. package/dist/utils/hashes.js +87 -41
  375. package/dist/utils/hashes.js.map +1 -0
  376. package/dist/utils/html.d.cts +4 -0
  377. package/dist/utils/html.d.ts +4 -2
  378. package/dist/utils/html.js +36 -37
  379. package/dist/utils/html.js.map +1 -0
  380. package/dist/utils/http.d.cts +43 -0
  381. package/dist/utils/http.d.ts +6 -4
  382. package/dist/utils/http.js +83 -83
  383. package/dist/utils/http.js.map +1 -0
  384. package/dist/utils/ips.d.cts +6 -0
  385. package/dist/utils/ips.d.ts +6 -4
  386. package/dist/utils/ips.js +48 -35
  387. package/dist/utils/ips.js.map +1 -0
  388. package/dist/utils/json.d.cts +13 -0
  389. package/dist/utils/json.d.ts +9 -6
  390. package/dist/utils/json.js +54 -157
  391. package/dist/utils/json.js.map +1 -0
  392. package/dist/utils/jwt.d.cts +44 -0
  393. package/dist/utils/jwt.d.ts +14 -11
  394. package/dist/utils/jwt.js +119 -84
  395. package/dist/utils/jwt.js.map +1 -0
  396. package/dist/utils/locks.d.cts +15 -0
  397. package/dist/utils/locks.d.ts +3 -2
  398. package/dist/utils/locks.js +76 -56
  399. package/dist/utils/locks.js.map +1 -0
  400. package/dist/utils/maps.d.cts +59 -0
  401. package/dist/utils/maps.d.ts +6 -4
  402. package/dist/utils/maps.js +207 -343
  403. package/dist/utils/maps.js.map +1 -0
  404. package/dist/utils/math.d.cts +6 -0
  405. package/dist/utils/math.d.ts +3 -1
  406. package/dist/utils/math.js +31 -16
  407. package/dist/utils/math.js.map +1 -0
  408. package/dist/utils/node-http.d.cts +15 -0
  409. package/dist/utils/node-http.d.ts +5 -5
  410. package/dist/utils/node-http.js +65 -36
  411. package/dist/utils/node-http.js.map +1 -0
  412. package/dist/utils/numbers.d.cts +5 -0
  413. package/dist/utils/numbers.d.ts +5 -3
  414. package/dist/utils/numbers.js +53 -66
  415. package/dist/utils/numbers.js.map +1 -0
  416. package/dist/utils/oauth.d.cts +8 -0
  417. package/dist/utils/oauth.d.ts +8 -6
  418. package/dist/utils/oauth.js +37 -4
  419. package/dist/utils/oauth.js.map +1 -0
  420. package/dist/utils/objects.d.cts +65 -0
  421. package/dist/utils/objects.d.ts +31 -30
  422. package/dist/utils/objects.js +196 -374
  423. package/dist/utils/objects.js.map +1 -0
  424. package/dist/utils/passkey.d.cts +1 -0
  425. package/dist/utils/passkey.d.ts +1 -1
  426. package/dist/utils/passkey.js +19 -1
  427. package/dist/utils/passkey.js.map +1 -0
  428. package/dist/utils/promises.d.cts +74 -0
  429. package/dist/utils/promises.d.ts +20 -18
  430. package/dist/utils/promises.js +252 -393
  431. package/dist/utils/promises.js.map +1 -0
  432. package/dist/utils/proxies.d.cts +4 -0
  433. package/dist/utils/proxies.d.ts +4 -2
  434. package/dist/utils/proxies.js +150 -161
  435. package/dist/utils/proxies.js.map +1 -0
  436. package/dist/utils/react.d.cts +25 -0
  437. package/dist/utils/react.d.ts +9 -6
  438. package/dist/utils/react.js +88 -134
  439. package/dist/utils/react.js.map +1 -0
  440. package/dist/utils/results.d.cts +78 -0
  441. package/dist/utils/results.d.ts +10 -9
  442. package/dist/utils/results.js +143 -324
  443. package/dist/utils/results.js.map +1 -0
  444. package/dist/utils/sentry.d.cts +5 -0
  445. package/dist/utils/sentry.d.ts +5 -2
  446. package/dist/utils/sentry.js +44 -14
  447. package/dist/utils/sentry.js.map +1 -0
  448. package/dist/utils/stores.d.cts +102 -0
  449. package/dist/utils/stores.d.ts +12 -9
  450. package/dist/utils/stores.js +219 -189
  451. package/dist/utils/stores.js.map +1 -0
  452. package/dist/utils/strings.d.cts +72 -0
  453. package/dist/utils/strings.d.ts +22 -20
  454. package/dist/utils/strings.js +299 -580
  455. package/dist/utils/strings.js.map +1 -0
  456. package/dist/utils/strings.nicify.test.d.cts +2 -0
  457. package/dist/utils/strings.nicify.test.d.ts +2 -1
  458. package/dist/utils/strings.nicify.test.js +168 -158
  459. package/dist/utils/strings.nicify.test.js.map +1 -0
  460. package/dist/utils/types.d.cts +23 -0
  461. package/dist/utils/types.d.ts +8 -6
  462. package/dist/utils/types.js +19 -1
  463. package/dist/utils/types.js.map +1 -0
  464. package/dist/utils/unicode.d.cts +3 -0
  465. package/dist/utils/unicode.d.ts +3 -1
  466. package/dist/utils/unicode.js +34 -21
  467. package/dist/utils/unicode.js.map +1 -0
  468. package/dist/utils/urls.d.cts +20 -0
  469. package/dist/utils/urls.d.ts +10 -8
  470. package/dist/utils/urls.js +76 -165
  471. package/dist/utils/urls.js.map +1 -0
  472. package/dist/utils/uuids.d.cts +4 -0
  473. package/dist/utils/uuids.d.ts +4 -2
  474. package/dist/utils/uuids.js +39 -35
  475. package/dist/utils/uuids.js.map +1 -0
  476. package/package.json +5 -5
@@ -0,0 +1,199 @@
1
+ // src/config/schema.ts
2
+ import * as schemaFields from "../schema-fields";
3
+ import { yupBoolean, yupObject, yupRecord, yupString } from "../schema-fields";
4
+ import { allProviders } from "../utils/oauth";
5
+ import { get, has, isObjectLike, set } from "../utils/objects";
6
+ var configLevels = ["project", "branch", "environment", "organization"];
7
+ var permissionRegex = /^\$?[a-z0-9_:]+$/;
8
+ var projectConfigSchema = yupObject({});
9
+ var branchRbacDefaultPermissions = yupRecord(
10
+ yupString().optional().matches(permissionRegex),
11
+ yupBoolean().isTrue().optional()
12
+ ).optional();
13
+ var branchRbacSchema = yupObject({
14
+ permissions: yupRecord(
15
+ yupString().optional().matches(permissionRegex),
16
+ yupObject({
17
+ description: yupString().optional(),
18
+ scope: yupString().oneOf(["team", "project"]).optional(),
19
+ containedPermissionIds: yupRecord(
20
+ yupString().optional().matches(permissionRegex),
21
+ yupBoolean().isTrue().optional()
22
+ ).optional()
23
+ }).optional()
24
+ ).optional(),
25
+ defaultPermissions: yupObject({
26
+ teamCreator: branchRbacDefaultPermissions,
27
+ teamMember: branchRbacDefaultPermissions,
28
+ signUp: branchRbacDefaultPermissions
29
+ }).optional()
30
+ }).optional();
31
+ var branchApiKeysSchema = yupObject({
32
+ enabled: yupObject({
33
+ team: yupBoolean().optional(),
34
+ user: yupBoolean().optional()
35
+ }).optional()
36
+ }).optional();
37
+ var branchAuthSchema = yupObject({
38
+ allowSignUp: yupBoolean().optional(),
39
+ password: yupObject({
40
+ allowSignIn: yupBoolean().optional()
41
+ }).optional(),
42
+ otp: yupObject({
43
+ allowSignIn: yupBoolean().optional()
44
+ }).optional(),
45
+ passkey: yupObject({
46
+ allowSignIn: yupBoolean().optional()
47
+ }).optional(),
48
+ oauth: yupObject({
49
+ accountMergeStrategy: yupString().oneOf(["link_method", "raise_error", "allow_duplicates"]).optional(),
50
+ providers: yupRecord(
51
+ yupString().optional().matches(permissionRegex),
52
+ yupObject({
53
+ type: yupString().oneOf(allProviders).optional(),
54
+ allowSignIn: yupBoolean().optional(),
55
+ allowConnectedAccounts: yupBoolean().optional()
56
+ }).defined()
57
+ ).optional()
58
+ }).optional()
59
+ }).optional();
60
+ var branchDomain = yupObject({
61
+ allowLocalhost: yupBoolean().optional()
62
+ }).optional();
63
+ var branchConfigSchema = projectConfigSchema.concat(yupObject({
64
+ rbac: branchRbacSchema,
65
+ teams: yupObject({
66
+ createPersonalTeamOnSignUp: yupBoolean().optional(),
67
+ allowClientTeamCreation: yupBoolean().optional()
68
+ }).optional(),
69
+ users: yupObject({
70
+ allowClientUserDeletion: yupBoolean().optional()
71
+ }).optional(),
72
+ apiKeys: branchApiKeysSchema,
73
+ domains: branchDomain,
74
+ auth: branchAuthSchema,
75
+ emails: yupObject({})
76
+ }));
77
+ var environmentConfigSchema = branchConfigSchema.concat(yupObject({
78
+ auth: branchConfigSchema.getNested("auth").concat(yupObject({
79
+ oauth: branchConfigSchema.getNested("auth").getNested("oauth").concat(yupObject({
80
+ providers: yupRecord(
81
+ yupString().optional().matches(permissionRegex),
82
+ yupObject({
83
+ type: yupString().oneOf(allProviders).optional(),
84
+ isShared: yupBoolean().optional(),
85
+ clientId: schemaFields.oauthClientIdSchema.optional(),
86
+ clientSecret: schemaFields.oauthClientSecretSchema.optional(),
87
+ facebookConfigId: schemaFields.oauthFacebookConfigIdSchema.optional(),
88
+ microsoftTenantId: schemaFields.oauthMicrosoftTenantIdSchema.optional(),
89
+ allowSignIn: yupBoolean().optional(),
90
+ allowConnectedAccounts: yupBoolean().optional()
91
+ })
92
+ ).optional()
93
+ }).optional())
94
+ })),
95
+ emails: branchConfigSchema.getNested("emails").concat(yupObject({
96
+ server: yupObject({
97
+ isShared: yupBoolean().optional(),
98
+ host: schemaFields.emailHostSchema.optional().nonEmpty(),
99
+ port: schemaFields.emailPortSchema.optional(),
100
+ username: schemaFields.emailUsernameSchema.optional().nonEmpty(),
101
+ password: schemaFields.emailPasswordSchema.optional().nonEmpty(),
102
+ senderName: schemaFields.emailSenderNameSchema.optional().nonEmpty(),
103
+ senderEmail: schemaFields.emailSenderEmailSchema.optional().nonEmpty()
104
+ })
105
+ }).optional()),
106
+ domains: branchConfigSchema.getNested("domains").concat(yupObject({
107
+ trustedDomains: yupRecord(
108
+ yupString().uuid().optional(),
109
+ yupObject({
110
+ baseUrl: schemaFields.urlSchema.optional(),
111
+ handlerPath: schemaFields.handlerPathSchema.optional()
112
+ })
113
+ ).optional()
114
+ }))
115
+ }));
116
+ var organizationConfigSchema = environmentConfigSchema.concat(yupObject({}));
117
+ var projectConfigDefaults = {};
118
+ var branchConfigDefaults = {};
119
+ var environmentConfigDefaults = {};
120
+ var organizationConfigDefaults = {
121
+ rbac: {
122
+ permissions: (key) => ({}),
123
+ defaultPermissions: {
124
+ teamCreator: {},
125
+ teamMember: {},
126
+ signUp: {}
127
+ }
128
+ },
129
+ apiKeys: {
130
+ enabled: {
131
+ team: false,
132
+ user: false
133
+ }
134
+ },
135
+ teams: {
136
+ createPersonalTeamOnSignUp: false,
137
+ allowClientTeamCreation: false
138
+ },
139
+ users: {
140
+ allowClientUserDeletion: false
141
+ },
142
+ domains: {
143
+ allowLocalhost: false,
144
+ trustedDomains: (key) => ({
145
+ handlerPath: "/handler"
146
+ })
147
+ },
148
+ auth: {
149
+ allowSignUp: true,
150
+ password: {
151
+ allowSignIn: false
152
+ },
153
+ otp: {
154
+ allowSignIn: false
155
+ },
156
+ passkey: {
157
+ allowSignIn: false
158
+ },
159
+ oauth: {
160
+ accountMergeStrategy: "link_method",
161
+ providers: (key) => ({
162
+ allowSignIn: false,
163
+ allowConnectedAccounts: false
164
+ })
165
+ }
166
+ },
167
+ emails: {
168
+ server: {
169
+ isShared: true
170
+ }
171
+ }
172
+ };
173
+ function applyDefaults(defaults, config) {
174
+ const res = { ...typeof defaults === "function" ? {} : defaults };
175
+ for (const [key, mergeValue] of Object.entries(config)) {
176
+ const baseValue = typeof defaults === "function" ? defaults(key) : has(defaults, key) ? get(defaults, key) : void 0;
177
+ if (baseValue !== void 0) {
178
+ if (isObjectLike(baseValue) && isObjectLike(mergeValue)) {
179
+ set(res, key, applyDefaults(baseValue, mergeValue));
180
+ continue;
181
+ }
182
+ }
183
+ set(res, key, mergeValue);
184
+ }
185
+ return res;
186
+ }
187
+ export {
188
+ applyDefaults,
189
+ branchConfigDefaults,
190
+ branchConfigSchema,
191
+ configLevels,
192
+ environmentConfigDefaults,
193
+ environmentConfigSchema,
194
+ organizationConfigDefaults,
195
+ organizationConfigSchema,
196
+ projectConfigDefaults,
197
+ projectConfigSchema
198
+ };
199
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/config/schema.ts"],"sourcesContent":["import * as yup from \"yup\";\nimport * as schemaFields from \"../schema-fields\";\nimport { yupBoolean, yupObject, yupRecord, yupString } from \"../schema-fields\";\nimport { allProviders } from \"../utils/oauth\";\nimport { DeepMerge, get, has, isObjectLike, set } from \"../utils/objects\";\nimport { PrettifyType } from \"../utils/types\";\nimport { NormalizesTo } from \"./format\";\n\n// NOTE: The validation schemas in here are all schematic validators, not sanity-check validators.\n// For more info, see ./README.md\n\n\nexport const configLevels = ['project', 'branch', 'environment', 'organization'] as const;\nexport type ConfigLevel = typeof configLevels[number];\nconst permissionRegex = /^\\$?[a-z0-9_:]+$/;\n\n/**\n * All fields that can be overridden at this level.\n */\nexport const projectConfigSchema = yupObject({});\n\n// --- NEW RBAC Schema ---\nconst branchRbacDefaultPermissions = yupRecord(\n yupString().optional().matches(permissionRegex),\n yupBoolean().isTrue().optional(),\n).optional();\n\nconst branchRbacSchema = yupObject({\n permissions: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupObject({\n description: yupString().optional(),\n scope: yupString().oneOf(['team', 'project']).optional(),\n containedPermissionIds: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupBoolean().isTrue().optional()\n ).optional(),\n }).optional(),\n ).optional(),\n defaultPermissions: yupObject({\n teamCreator: branchRbacDefaultPermissions,\n teamMember: branchRbacDefaultPermissions,\n signUp: branchRbacDefaultPermissions,\n }).optional(),\n}).optional();\n// --- END NEW RBAC Schema ---\n\n// --- NEW API Keys Schema ---\nconst branchApiKeysSchema = yupObject({\n enabled: yupObject({\n team: yupBoolean().optional(),\n user: yupBoolean().optional(),\n }).optional(),\n}).optional();\n// --- END NEW API Keys Schema ---\n\n\nconst branchAuthSchema = yupObject({\n allowSignUp: yupBoolean().optional(),\n password: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n otp: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n passkey: yupObject({\n allowSignIn: yupBoolean().optional(),\n }).optional(),\n oauth: yupObject({\n accountMergeStrategy: yupString().oneOf(['link_method', 'raise_error', 'allow_duplicates']).optional(),\n providers: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupObject({\n type: yupString().oneOf(allProviders).optional(),\n allowSignIn: yupBoolean().optional(),\n allowConnectedAccounts: yupBoolean().optional(),\n }).defined(),\n ).optional(),\n }).optional(),\n}).optional();\n\nconst branchDomain = yupObject({\n allowLocalhost: yupBoolean().optional(),\n}).optional();\n\nexport const branchConfigSchema = projectConfigSchema.concat(yupObject({\n rbac: branchRbacSchema,\n\n teams: yupObject({\n createPersonalTeamOnSignUp: yupBoolean().optional(),\n allowClientTeamCreation: yupBoolean().optional(),\n }).optional(),\n\n users: yupObject({\n allowClientUserDeletion: yupBoolean().optional(),\n }).optional(),\n\n apiKeys: branchApiKeysSchema,\n\n domains: branchDomain,\n\n auth: branchAuthSchema,\n\n emails: yupObject({}),\n}));\n\n\nexport const environmentConfigSchema = branchConfigSchema.concat(yupObject({\n auth: branchConfigSchema.getNested(\"auth\").concat(yupObject({\n oauth: branchConfigSchema.getNested(\"auth\").getNested(\"oauth\").concat(yupObject({\n providers: yupRecord(\n yupString().optional().matches(permissionRegex),\n yupObject({\n type: yupString().oneOf(allProviders).optional(),\n isShared: yupBoolean().optional(),\n clientId: schemaFields.oauthClientIdSchema.optional(),\n clientSecret: schemaFields.oauthClientSecretSchema.optional(),\n facebookConfigId: schemaFields.oauthFacebookConfigIdSchema.optional(),\n microsoftTenantId: schemaFields.oauthMicrosoftTenantIdSchema.optional(),\n allowSignIn: yupBoolean().optional(),\n allowConnectedAccounts: yupBoolean().optional(),\n }),\n ).optional(),\n }).optional()),\n })),\n\n emails: branchConfigSchema.getNested(\"emails\").concat(yupObject({\n server: yupObject({\n isShared: yupBoolean().optional(),\n host: schemaFields.emailHostSchema.optional().nonEmpty(),\n port: schemaFields.emailPortSchema.optional(),\n username: schemaFields.emailUsernameSchema.optional().nonEmpty(),\n password: schemaFields.emailPasswordSchema.optional().nonEmpty(),\n senderName: schemaFields.emailSenderNameSchema.optional().nonEmpty(),\n senderEmail: schemaFields.emailSenderEmailSchema.optional().nonEmpty(),\n }),\n }).optional()),\n\n domains: branchConfigSchema.getNested(\"domains\").concat(yupObject({\n trustedDomains: yupRecord(\n yupString().uuid().optional(),\n yupObject({\n baseUrl: schemaFields.urlSchema.optional(),\n handlerPath: schemaFields.handlerPathSchema.optional(),\n }),\n ).optional(),\n })),\n}));\n\nexport const organizationConfigSchema = environmentConfigSchema.concat(yupObject({}));\n\n\n// Defaults\n// these are objects that are merged together to form the rendered config (see ./README.md)\n// Wherever an object could be used as a value, a function can instead be used to generate the default values on a per-key basis\nexport const projectConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<ProjectConfigStrippedNormalizedOverride>;\n\nexport const branchConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<BranchConfigStrippedNormalizedOverride>;\n\nexport const environmentConfigDefaults = {} satisfies DeepReplaceAllowFunctionsForObjects<EnvironmentConfigStrippedNormalizedOverride>;\n\nexport const organizationConfigDefaults = {\n rbac: {\n permissions: (key: string) => ({}),\n defaultPermissions: {\n teamCreator: {},\n teamMember: {},\n signUp: {},\n },\n },\n\n apiKeys: {\n enabled: {\n team: false,\n user: false,\n },\n },\n\n teams: {\n createPersonalTeamOnSignUp: false,\n allowClientTeamCreation: false,\n },\n\n users: {\n allowClientUserDeletion: false,\n },\n\n domains: {\n allowLocalhost: false,\n trustedDomains: (key: string) => ({\n handlerPath: '/handler',\n }),\n },\n\n auth: {\n allowSignUp: true,\n password: {\n allowSignIn: false,\n },\n otp: {\n allowSignIn: false,\n },\n passkey: {\n allowSignIn: false,\n },\n oauth: {\n accountMergeStrategy: 'link_method',\n providers: (key: string) => ({\n allowSignIn: false,\n allowConnectedAccounts: false,\n }),\n },\n },\n\n emails: {\n server: {\n isShared: true,\n },\n },\n} satisfies DeepReplaceAllowFunctionsForObjects<OrganizationConfigStrippedNormalizedOverride>;\n\nexport type DeepReplaceAllowFunctionsForObjects<T> = T extends object ? { [K in keyof T]: DeepReplaceAllowFunctionsForObjects<T[K]> } | ((arg: keyof T) => DeepReplaceAllowFunctionsForObjects<T[keyof T]>) : T;\nexport type DeepReplaceFunctionsWithObjects<T> = T extends (arg: infer K extends string) => infer R ? DeepReplaceFunctionsWithObjects<Record<K, R>> : (T extends object ? { [K in keyof T]: DeepReplaceFunctionsWithObjects<T[K]> } : T);\nexport type ApplyDefaults<D extends object | ((key: string) => unknown), C extends object> = DeepMerge<DeepReplaceFunctionsWithObjects<D>, C>;\nexport function applyDefaults<D extends object | ((key: string) => unknown), C extends object>(defaults: D, config: C): ApplyDefaults<D, C> {\n const res: any = { ...typeof defaults === 'function' ? {} : defaults };\n for (const [key, mergeValue] of Object.entries(config)) {\n const baseValue = typeof defaults === 'function' ? defaults(key) : (has(defaults, key as any) ? get(defaults, key as any) : undefined);\n if (baseValue !== undefined) {\n if (isObjectLike(baseValue) && isObjectLike(mergeValue)) {\n set(res, key, applyDefaults(baseValue, mergeValue));\n continue;\n }\n }\n set(res, key, mergeValue);\n }\n return res as any;\n}\nundefined?.test(\"applyDefaults\", ({ expect }) => {\n expect(applyDefaults({ a: 1 }, { a: 2 })).toEqual({ a: 2 });\n expect(applyDefaults({ a: { b: 1 } }, { a: { c: 2 } })).toEqual({ a: { b: 1, c: 2 } });\n expect(applyDefaults((key: string) => ({ b: key }), { a: {} })).toEqual({ a: { b: \"a\" } });\n expect(applyDefaults({ a: (key: string) => ({ b: key }) }, { a: { c: { d: 1 } } })).toEqual({ a: { c: { b: \"c\", d: 1 } } });\n});\n\n// Normalized overrides\nexport type ProjectConfigNormalizedOverride = yup.InferType<typeof projectConfigSchema>;\nexport type BranchConfigNormalizedOverride = yup.InferType<typeof branchConfigSchema>;\nexport type EnvironmentConfigNormalizedOverride = yup.InferType<typeof environmentConfigSchema>;\nexport type OrganizationConfigNormalizedOverride = yup.InferType<typeof organizationConfigSchema>;\n\n// Normalized overrides, without the properties that may be overridden still\nexport type ProjectConfigStrippedNormalizedOverride = Omit<ProjectConfigNormalizedOverride,\n | keyof BranchConfigNormalizedOverride\n | keyof EnvironmentConfigNormalizedOverride\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type BranchConfigStrippedNormalizedOverride = Omit<BranchConfigNormalizedOverride,\n | keyof EnvironmentConfigNormalizedOverride\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type EnvironmentConfigStrippedNormalizedOverride = Omit<EnvironmentConfigNormalizedOverride,\n | keyof OrganizationConfigNormalizedOverride\n>;\nexport type OrganizationConfigStrippedNormalizedOverride = OrganizationConfigNormalizedOverride;\n\n// Overrides\nexport type ProjectConfigOverride = NormalizesTo<ProjectConfigNormalizedOverride>;\nexport type BranchConfigOverride = NormalizesTo<BranchConfigNormalizedOverride>;\nexport type EnvironmentConfigOverride = NormalizesTo<EnvironmentConfigNormalizedOverride>;\nexport type OrganizationConfigOverride = NormalizesTo<OrganizationConfigNormalizedOverride>;\n\n// Incomplete configs\nexport type ProjectIncompleteConfig = ProjectConfigNormalizedOverride;\nexport type BranchIncompleteConfig = ProjectIncompleteConfig & BranchConfigNormalizedOverride;\nexport type EnvironmentIncompleteConfig = BranchIncompleteConfig & EnvironmentConfigNormalizedOverride;\nexport type OrganizationIncompleteConfig = EnvironmentIncompleteConfig & OrganizationConfigNormalizedOverride;\n\n// Rendered configs\nexport type ProjectRenderedConfig = PrettifyType<ApplyDefaults<typeof projectConfigDefaults, ProjectConfigStrippedNormalizedOverride>>;\nexport type BranchRenderedConfig = PrettifyType<ProjectRenderedConfig & ApplyDefaults<typeof branchConfigDefaults, BranchConfigStrippedNormalizedOverride>>;\nexport type EnvironmentRenderedConfig = PrettifyType<BranchRenderedConfig & ApplyDefaults<typeof environmentConfigDefaults, EnvironmentConfigStrippedNormalizedOverride>>;\nexport type OrganizationRenderedConfig = PrettifyType<EnvironmentRenderedConfig & ApplyDefaults<typeof organizationConfigDefaults, OrganizationConfigStrippedNormalizedOverride>>;\n"],"mappings":"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","names":[]}
@@ -0,0 +1,60 @@
1
+ // src/crud.tsx
2
+ import { yupObject, yupString } from "./schema-fields";
3
+ import { filterUndefined } from "./utils/objects";
4
+ function createCrud(options) {
5
+ const docs = options.docs ?? {};
6
+ const client = {
7
+ createSchema: options.clientCreateSchema,
8
+ createDocs: docs.clientCreate,
9
+ readSchema: options.clientReadSchema,
10
+ readDocs: docs.clientRead,
11
+ listDocs: docs.clientList,
12
+ updateSchema: options.clientUpdateSchema,
13
+ updateDocs: docs.clientUpdate,
14
+ deleteSchema: options.clientDeleteSchema,
15
+ deleteDocs: docs.clientDelete
16
+ };
17
+ const serverOverrides = filterUndefined({
18
+ createSchema: options.serverCreateSchema,
19
+ createDocs: docs.serverCreate,
20
+ readSchema: options.serverReadSchema,
21
+ readDocs: docs.serverRead,
22
+ listDocs: docs.serverList,
23
+ updateSchema: options.serverUpdateSchema,
24
+ updateDocs: docs.serverUpdate,
25
+ deleteSchema: options.serverDeleteSchema,
26
+ deleteDocs: docs.serverDelete
27
+ });
28
+ const server = {
29
+ ...client,
30
+ ...serverOverrides
31
+ };
32
+ const adminOverrides = filterUndefined({
33
+ createSchema: options.adminCreateSchema,
34
+ createDocs: docs.adminCreate,
35
+ readSchema: options.adminReadSchema,
36
+ readDocs: docs.adminRead,
37
+ listDocs: docs.adminList,
38
+ updateSchema: options.adminUpdateSchema,
39
+ updateDocs: docs.adminUpdate,
40
+ deleteSchema: options.adminDeleteSchema,
41
+ deleteDocs: docs.adminDelete
42
+ });
43
+ const admin = {
44
+ ...server,
45
+ ...adminOverrides
46
+ };
47
+ return {
48
+ client,
49
+ server,
50
+ admin,
51
+ hasCreate: !!admin.createSchema,
52
+ hasRead: !!admin.readSchema,
53
+ hasUpdate: !!admin.updateSchema,
54
+ hasDelete: !!admin.deleteSchema
55
+ };
56
+ }
57
+ export {
58
+ createCrud
59
+ };
60
+ //# sourceMappingURL=crud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"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\nundefined?.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":";AACA,SAAS,WAAW,iBAAiB;AACrC,SAAS,uBAAuB;AA4HzB,SAAS,WAAiD,SAAiF;AAChJ,QAAM,OAAO,QAAQ,QAAQ,CAAC;AAC9B,QAAM,SAAS;AAAA,IACb,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,IAEjB,YAAY,QAAQ;AAAA,IACpB,UAAU,KAAK;AAAA,IACf,UAAU,KAAK;AAAA,IAEf,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,IAEjB,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,EACnB;AAEA,QAAM,kBAAkB,gBAAgB;AAAA,IACtC,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,IAEjB,YAAY,QAAQ;AAAA,IACpB,UAAU,KAAK;AAAA,IACf,UAAU,KAAK;AAAA,IAEf,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,IAEjB,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,EACnB,CAAC;AACD,QAAM,SAAS;AAAA,IACb,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAEA,QAAM,iBAAiB,gBAAgB;AAAA,IACrC,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,IAEjB,YAAY,QAAQ;AAAA,IACpB,UAAU,KAAK;AAAA,IACf,UAAU,KAAK;AAAA,IAEf,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,IAEjB,cAAc,QAAQ;AAAA,IACtB,YAAY,KAAK;AAAA,EACnB,CAAC;AACD,QAAM,QAAQ;AAAA,IACZ,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IAEA,WAAW,CAAC,CAAC,MAAM;AAAA,IACnB,SAAS,CAAC,CAAC,MAAM;AAAA,IACjB,WAAW,CAAC,CAAC,MAAM;AAAA,IACnB,WAAW,CAAC,CAAC,MAAM;AAAA,EACrB;AACF;","names":[]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=global.d.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,17 @@
1
+ // src/helpers/password.ts
2
+ import { KnownErrors } from "..";
3
+ var minLength = 8;
4
+ var maxLength = 70;
5
+ function getPasswordError(password) {
6
+ if (password.length < minLength) {
7
+ return new KnownErrors.PasswordTooShort(minLength);
8
+ }
9
+ if (password.length > maxLength) {
10
+ return new KnownErrors.PasswordTooLong(maxLength);
11
+ }
12
+ return void 0;
13
+ }
14
+ export {
15
+ getPasswordError
16
+ };
17
+ //# sourceMappingURL=password.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"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":";AAAA,SAAS,mBAAmB;AAE5B,IAAM,YAAY;AAClB,IAAM,YAAY;AAEX,SAAS,iBAAiB,UAAyE;AACxG,MAAI,SAAS,SAAS,WAAW;AAC/B,WAAO,IAAI,YAAY,iBAAiB,SAAS;AAAA,EACnD;AAEA,MAAI,SAAS,SAAS,WAAW;AAC/B,WAAO,IAAI,YAAY,gBAAgB,SAAS;AAAA,EAClD;AAEA,SAAO;AACT;","names":[]}
@@ -0,0 +1,50 @@
1
+ // src/helpers/production-mode.ts
2
+ import { StackAssertionError, captureError } from "../utils/errors";
3
+ import { isLocalhost } from "../utils/urls";
4
+ function getProductionModeErrors(project) {
5
+ const errors = [];
6
+ const domainsFixUrl = `/projects/${project.id}/domains`;
7
+ if (project.config.allow_localhost) {
8
+ errors.push({
9
+ message: "Localhost is not allowed in production mode, turn off 'Allow localhost' in project settings",
10
+ relativeFixUrl: domainsFixUrl
11
+ });
12
+ }
13
+ for (const { domain } of project.config.domains) {
14
+ let url;
15
+ try {
16
+ url = new URL(domain);
17
+ } catch (e) {
18
+ captureError("production-mode-domain-not-valid", new StackAssertionError("Domain was somehow not a valid URL; we should've caught this when setting the domain in the first place", {
19
+ domain,
20
+ projectId: project
21
+ }));
22
+ errors.push({
23
+ message: "Trusted domain is not a valid URL: " + domain,
24
+ relativeFixUrl: domainsFixUrl
25
+ });
26
+ continue;
27
+ }
28
+ if (isLocalhost(url)) {
29
+ errors.push({
30
+ message: "Localhost domains are not allowed to be trusted in production mode: " + domain,
31
+ relativeFixUrl: domainsFixUrl
32
+ });
33
+ } else if (url.hostname.match(/^\d+(\.\d+)*$/)) {
34
+ errors.push({
35
+ message: "Direct IPs are not valid for trusted domains in production mode: " + domain,
36
+ relativeFixUrl: domainsFixUrl
37
+ });
38
+ } else if (url.protocol !== "https:") {
39
+ errors.push({
40
+ message: "Trusted domains should be HTTPS: " + domain,
41
+ relativeFixUrl: domainsFixUrl
42
+ });
43
+ }
44
+ }
45
+ return errors;
46
+ }
47
+ export {
48
+ getProductionModeErrors
49
+ };
50
+ //# sourceMappingURL=production-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/helpers/production-mode.ts"],"sourcesContent":["import { ProjectsCrud } from \"../interface/crud/projects\";\nimport { StackAssertionError, captureError } from \"../utils/errors\";\nimport { isLocalhost } from \"../utils/urls\";\n\nexport type ProductionModeError = {\n message: string,\n relativeFixUrl: `/${string}`,\n};\n\nexport function getProductionModeErrors(project: ProjectsCrud[\"Admin\"][\"Read\"]): ProductionModeError[] {\n const errors: ProductionModeError[] = [];\n const domainsFixUrl = `/projects/${project.id}/domains` as const;\n\n if (project.config.allow_localhost) {\n errors.push({\n message: \"Localhost is not allowed in production mode, turn off 'Allow localhost' in project settings\",\n relativeFixUrl: domainsFixUrl,\n });\n }\n\n for (const { domain } of project.config.domains) {\n let url;\n try {\n url = new URL(domain);\n } catch (e) {\n captureError(\"production-mode-domain-not-valid\", new StackAssertionError(\"Domain was somehow not a valid URL; we should've caught this when setting the domain in the first place\", {\n domain,\n projectId: project\n }));\n errors.push({\n message: \"Trusted domain is not a valid URL: \" + domain,\n relativeFixUrl: domainsFixUrl,\n });\n continue;\n }\n\n if (isLocalhost(url)) {\n errors.push({\n message: \"Localhost domains are not allowed to be trusted in production mode: \" + domain,\n relativeFixUrl: domainsFixUrl,\n });\n } else if (url.hostname.match(/^\\d+(\\.\\d+)*$/)) {\n errors.push({\n message: \"Direct IPs are not valid for trusted domains in production mode: \" + domain,\n relativeFixUrl: domainsFixUrl,\n });\n } else if (url.protocol !== \"https:\") {\n errors.push({\n message: \"Trusted domains should be HTTPS: \" + domain,\n relativeFixUrl: domainsFixUrl,\n });\n }\n }\n\n return errors;\n}\n"],"mappings":";AACA,SAAS,qBAAqB,oBAAoB;AAClD,SAAS,mBAAmB;AAOrB,SAAS,wBAAwB,SAA+D;AACrG,QAAM,SAAgC,CAAC;AACvC,QAAM,gBAAgB,aAAa,QAAQ,EAAE;AAE7C,MAAI,QAAQ,OAAO,iBAAiB;AAClC,WAAO,KAAK;AAAA,MACV,SAAS;AAAA,MACT,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,aAAW,EAAE,OAAO,KAAK,QAAQ,OAAO,SAAS;AAC/C,QAAI;AACJ,QAAI;AACF,YAAM,IAAI,IAAI,MAAM;AAAA,IACtB,SAAS,GAAG;AACV,mBAAa,oCAAoC,IAAI,oBAAoB,2GAA2G;AAAA,QAClL;AAAA,QACA,WAAW;AAAA,MACb,CAAC,CAAC;AACF,aAAO,KAAK;AAAA,QACV,SAAS,wCAAwC;AAAA,QACjD,gBAAgB;AAAA,MAClB,CAAC;AACD;AAAA,IACF;AAEA,QAAI,YAAY,GAAG,GAAG;AACpB,aAAO,KAAK;AAAA,QACV,SAAS,yEAAyE;AAAA,QAClF,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH,WAAW,IAAI,SAAS,MAAM,eAAe,GAAG;AAC9C,aAAO,KAAK;AAAA,QACV,SAAS,sEAAsE;AAAA,QAC/E,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH,WAAW,IAAI,aAAa,UAAU;AACpC,aAAO,KAAK;AAAA,QACV,SAAS,sCAAsC;AAAA,QAC/C,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;","names":[]}
@@ -0,0 +1,38 @@
1
+ // src/hooks/use-async-callback.tsx
2
+ import React from "react";
3
+ import { captureError } from "../utils/errors";
4
+ function useAsyncCallback(callback, deps) {
5
+ const [error, setError] = React.useState(void 0);
6
+ const [loadingCount, setLoadingCount] = React.useState(0);
7
+ const cb = React.useCallback(
8
+ async (...args) => {
9
+ setLoadingCount((c) => c + 1);
10
+ try {
11
+ return await callback(...args);
12
+ } catch (e) {
13
+ setError(e);
14
+ throw e;
15
+ } finally {
16
+ setLoadingCount((c) => c - 1);
17
+ }
18
+ },
19
+ deps
20
+ );
21
+ return [cb, loadingCount > 0, error];
22
+ }
23
+ function useAsyncCallbackWithLoggedError(callback, deps) {
24
+ const [newCallback, loading] = useAsyncCallback(async (...args) => {
25
+ try {
26
+ return await callback(...args);
27
+ } catch (e) {
28
+ captureError("async-callback", e);
29
+ throw e;
30
+ }
31
+ }, deps);
32
+ return [newCallback, loading];
33
+ }
34
+ export {
35
+ useAsyncCallback,
36
+ useAsyncCallbackWithLoggedError
37
+ };
38
+ //# sourceMappingURL=use-async-callback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/hooks/use-async-callback.tsx"],"sourcesContent":["import React from \"react\";\nimport { captureError } from \"../utils/errors\";\n\nexport function useAsyncCallback<A extends any[], R>(\n callback: (...args: A) => Promise<R>,\n deps: React.DependencyList\n): [cb: (...args: A) => Promise<R>, loading: boolean, error: unknown | undefined] {\n const [error, setError] = React.useState<unknown | undefined>(undefined);\n const [loadingCount, setLoadingCount] = React.useState(0);\n\n const cb = React.useCallback(\n async (...args: A) => {\n setLoadingCount((c) => c + 1);\n try {\n return await callback(...args);\n } catch (e) {\n setError(e);\n throw e;\n } finally {\n setLoadingCount((c) => c - 1);\n }\n },\n deps,\n );\n\n return [cb, loadingCount > 0, error];\n}\n\nexport function useAsyncCallbackWithLoggedError<A extends any[], R>(\n callback: (...args: A) => Promise<R>,\n deps: React.DependencyList\n): [cb: (...args: A) => Promise<R>, loading: boolean] {\n const [newCallback, loading] = useAsyncCallback<A, R>(async (...args) => {\n try {\n return await callback(...args);\n } catch (e) {\n captureError(\"async-callback\", e);\n throw e;\n }\n }, deps);\n\n return [newCallback, loading];\n}\n"],"mappings":";AAAA,OAAO,WAAW;AAClB,SAAS,oBAAoB;AAEtB,SAAS,iBACd,UACA,MACgF;AAChF,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAA8B,MAAS;AACvE,QAAM,CAAC,cAAc,eAAe,IAAI,MAAM,SAAS,CAAC;AAExD,QAAM,KAAK,MAAM;AAAA,IACf,UAAU,SAAY;AACpB,sBAAgB,CAAC,MAAM,IAAI,CAAC;AAC5B,UAAI;AACF,eAAO,MAAM,SAAS,GAAG,IAAI;AAAA,MAC/B,SAAS,GAAG;AACV,iBAAS,CAAC;AACV,cAAM;AAAA,MACR,UAAE;AACA,wBAAgB,CAAC,MAAM,IAAI,CAAC;AAAA,MAC9B;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAEA,SAAO,CAAC,IAAI,eAAe,GAAG,KAAK;AACrC;AAEO,SAAS,gCACd,UACA,MACoD;AACpD,QAAM,CAAC,aAAa,OAAO,IAAI,iBAAuB,UAAU,SAAS;AACvE,QAAI;AACF,aAAO,MAAM,SAAS,GAAG,IAAI;AAAA,IAC/B,SAAS,GAAG;AACV,mBAAa,kBAAkB,CAAC;AAChC,YAAM;AAAA,IACR;AAAA,EACF,GAAG,IAAI;AAEP,SAAO,CAAC,aAAa,OAAO;AAC9B;","names":[]}
@@ -0,0 +1,23 @@
1
+ // src/hooks/use-async-external-store.tsx
2
+ import { useEffect, useState } from "react";
3
+ import { AsyncResult } from "../utils/results";
4
+ function useAsyncExternalStore(subscribe) {
5
+ const [isAvailable, setIsAvailable] = useState(false);
6
+ const [value, setValue] = useState();
7
+ useEffect(() => {
8
+ const unsubscribe = subscribe((value2) => {
9
+ setValue(() => value2);
10
+ setIsAvailable(() => true);
11
+ });
12
+ return unsubscribe;
13
+ }, [subscribe]);
14
+ if (isAvailable) {
15
+ return AsyncResult.ok(value);
16
+ } else {
17
+ return AsyncResult.pending();
18
+ }
19
+ }
20
+ export {
21
+ useAsyncExternalStore
22
+ };
23
+ //# sourceMappingURL=use-async-external-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/hooks/use-async-external-store.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { AsyncResult } from \"../utils/results\";\n\nexport function useAsyncExternalStore<T>(\n subscribe: (callback: (t: T) => void) => (() => void),\n): AsyncResult<T, never> & { status: \"ok\" | \"pending\" } {\n // sure, the \"sync\" in useSyncExternalStore refers to \"synchronize a store\" and not \"sync/async\", but it's too good of a name to pass up on\n\n const [isAvailable, setIsAvailable] = useState(false);\n const [value, setValue] = useState<T>();\n useEffect(() => {\n const unsubscribe = subscribe((value: T) => {\n setValue(() => value);\n setIsAvailable(() => true);\n });\n return unsubscribe;\n }, [subscribe]);\n\n if (isAvailable) {\n return AsyncResult.ok(value as T);\n } else {\n return AsyncResult.pending();\n }\n}\n"],"mappings":";AAAA,SAAS,WAAW,gBAAgB;AACpC,SAAS,mBAAmB;AAErB,SAAS,sBACd,WACsD;AAGtD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAY;AACtC,YAAU,MAAM;AACd,UAAM,cAAc,UAAU,CAACA,WAAa;AAC1C,eAAS,MAAMA,MAAK;AACpB,qBAAe,MAAM,IAAI;AAAA,IAC3B,CAAC;AACD,WAAO;AAAA,EACT,GAAG,CAAC,SAAS,CAAC;AAEd,MAAI,aAAa;AACf,WAAO,YAAY,GAAG,KAAU;AAAA,EAClC,OAAO;AACL,WAAO,YAAY,QAAQ;AAAA,EAC7B;AACF;","names":["value"]}
@@ -0,0 +1,17 @@
1
+ // src/hooks/use-hash.tsx
2
+ import { useSyncExternalStore } from "react";
3
+ import { suspendIfSsr } from "../utils/react";
4
+ var useHash = () => {
5
+ suspendIfSsr("useHash");
6
+ return useSyncExternalStore(
7
+ (onChange) => {
8
+ const interval = setInterval(() => onChange(), 10);
9
+ return () => clearInterval(interval);
10
+ },
11
+ () => window.location.hash.substring(1)
12
+ );
13
+ };
14
+ export {
15
+ useHash
16
+ };
17
+ //# sourceMappingURL=use-hash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/hooks/use-hash.tsx"],"sourcesContent":["import { useSyncExternalStore } from \"react\";\nimport { suspendIfSsr } from \"../utils/react\";\n\nexport const useHash = () => {\n suspendIfSsr(\"useHash\");\n return useSyncExternalStore(\n (onChange) => {\n const interval = setInterval(() => onChange(), 10);\n return () => clearInterval(interval);\n },\n () => window.location.hash.substring(1)\n );\n};\n\n"],"mappings":";AAAA,SAAS,4BAA4B;AACrC,SAAS,oBAAoB;AAEtB,IAAM,UAAU,MAAM;AAC3B,eAAa,SAAS;AACtB,SAAO;AAAA,IACL,CAAC,aAAa;AACZ,YAAM,WAAW,YAAY,MAAM,SAAS,GAAG,EAAE;AACjD,aAAO,MAAM,cAAc,QAAQ;AAAA,IACrC;AAAA,IACA,MAAM,OAAO,SAAS,KAAK,UAAU,CAAC;AAAA,EACxC;AACF;","names":[]}
@@ -0,0 +1,61 @@
1
+ // src/hooks/use-strict-memo.tsx
2
+ import { useId, useInsertionEffect } from "react";
3
+ import { Result } from "../utils/results";
4
+ var cached = /* @__PURE__ */ new Map();
5
+ function unwrapFromInner(dependencies, inner) {
6
+ if (dependencies.length === 0 !== "isNotNestedMap" in inner) {
7
+ return Result.error(void 0);
8
+ }
9
+ if ("isNotNestedMap" in inner) {
10
+ if (dependencies.length === 0) {
11
+ return Result.ok(inner.value);
12
+ } else {
13
+ return Result.error(void 0);
14
+ }
15
+ } else {
16
+ if (dependencies.length === 0) {
17
+ return Result.error(void 0);
18
+ } else {
19
+ const [key, ...rest] = dependencies;
20
+ const newInner = inner.get(key);
21
+ if (!newInner) {
22
+ return Result.error(void 0);
23
+ }
24
+ return unwrapFromInner(rest, newInner);
25
+ }
26
+ }
27
+ }
28
+ function wrapToInner(dependencies, value) {
29
+ if (dependencies.length === 0) {
30
+ return { isNotNestedMap: true, value };
31
+ }
32
+ const [key, ...rest] = dependencies;
33
+ const inner = wrapToInner(rest, value);
34
+ const isObject = typeof key === "object" && key !== null;
35
+ const isUnregisteredSymbol = typeof key === "symbol" && Symbol.keyFor(key) === void 0;
36
+ const isWeak = isObject || isUnregisteredSymbol;
37
+ const mapType = isWeak ? WeakMap : Map;
38
+ return new mapType([[key, inner]]);
39
+ }
40
+ function useStrictMemo(callback, dependencies) {
41
+ const id = useId();
42
+ useInsertionEffect(() => {
43
+ return () => {
44
+ cached.delete(id);
45
+ };
46
+ }, [id]);
47
+ const c = cached.get(id);
48
+ if (c) {
49
+ const unwrapped = unwrapFromInner(dependencies, c);
50
+ if (unwrapped.status === "ok") {
51
+ return unwrapped.data;
52
+ }
53
+ }
54
+ const value = callback();
55
+ cached.set(id, wrapToInner(dependencies, value));
56
+ return value;
57
+ }
58
+ export {
59
+ useStrictMemo
60
+ };
61
+ //# sourceMappingURL=use-strict-memo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/hooks/use-strict-memo.tsx"],"sourcesContent":["import { useId, useInsertionEffect, useMemo } from \"react\";\nimport { Result } from \"../utils/results\";\n\ntype CacheInner = Map<unknown, CacheInner> | WeakMap<WeakKey, CacheInner> | { isNotNestedMap: true, value: any };\n\nconst cached = new Map<string, CacheInner>();\n\nfunction unwrapFromInner(dependencies: any[], inner: CacheInner): Result<any, void> {\n if ((dependencies.length === 0) !== (\"isNotNestedMap\" in inner)) {\n return Result.error(undefined);\n }\n if (\"isNotNestedMap\" in inner) {\n if (dependencies.length === 0) {\n return Result.ok(inner.value);\n } else {\n return Result.error(undefined);\n }\n } else {\n if (dependencies.length === 0) {\n return Result.error(undefined);\n } else {\n const [key, ...rest] = dependencies;\n const newInner = inner.get(key);\n if (!newInner) {\n return Result.error(undefined);\n }\n return unwrapFromInner(rest, newInner);\n }\n }\n}\nundefined?.test(\"unwrapFromInner\", ({ expect }) => {\n // Test with empty dependencies and non-nested map\n const nonNestedMap = { isNotNestedMap: true, value: \"test\" } as CacheInner;\n const result1 = unwrapFromInner([], nonNestedMap);\n expect(result1.status).toBe(\"ok\");\n if (result1.status === \"ok\") {\n expect(result1.data).toBe(\"test\");\n }\n\n // Test with non-empty dependencies and non-nested map (should error)\n expect(unwrapFromInner([\"key\"], nonNestedMap).status).toBe(\"error\");\n\n // Test with empty dependencies and nested map (should error)\n const nestedMap = new Map([[\"key\", { isNotNestedMap: true, value: \"test\" } as CacheInner]]) as CacheInner;\n expect(unwrapFromInner([], nestedMap).status).toBe(\"error\");\n\n // Test with matching dependencies and nested map\n const result2 = unwrapFromInner([\"key\"], nestedMap);\n expect(result2.status).toBe(\"ok\");\n if (result2.status === \"ok\") {\n expect(result2.data).toBe(\"test\");\n }\n\n // Test with non-matching dependencies and nested map\n expect(unwrapFromInner([\"wrongKey\"], nestedMap).status).toBe(\"error\");\n\n // Test with deeply nested map\n const deeplyNestedMap = new Map([\n [\"key1\", new Map([\n [\"key2\", { isNotNestedMap: true, value: \"nested\" } as CacheInner]\n ]) as CacheInner]\n ]) as CacheInner;\n\n const result3 = unwrapFromInner([\"key1\", \"key2\"], deeplyNestedMap);\n expect(result3.status).toBe(\"ok\");\n if (result3.status === \"ok\") {\n expect(result3.data).toBe(\"nested\");\n }\n\n // Test with partial match in deeply nested map\n expect(unwrapFromInner([\"key1\", \"wrongKey\"], deeplyNestedMap).status).toBe(\"error\");\n});\n\nfunction wrapToInner(dependencies: any[], value: any): CacheInner {\n if (dependencies.length === 0) {\n return { isNotNestedMap: true, value };\n }\n const [key, ...rest] = dependencies;\n const inner = wrapToInner(rest, value);\n\n const isObject = (typeof key === \"object\" && key !== null);\n const isUnregisteredSymbol = (typeof key === \"symbol\" && Symbol.keyFor(key) === undefined);\n const isWeak = isObject || isUnregisteredSymbol;\n const mapType = isWeak ? WeakMap : Map;\n\n return new mapType([[key, inner]]);\n}\nundefined?.test(\"wrapToInner\", ({ expect }) => {\n // Test with empty dependencies\n const emptyResult = wrapToInner([], \"test\");\n expect(emptyResult).toEqual({ isNotNestedMap: true, value: \"test\" });\n\n // Test with single string dependency\n const singleResult = wrapToInner([\"key\"], \"test\");\n expect(singleResult instanceof Map).toBe(true);\n // Need to cast to access Map methods\n const singleMap = singleResult as Map<unknown, CacheInner>;\n expect(singleMap.get(\"key\")).toEqual({ isNotNestedMap: true, value: \"test\" });\n\n // Test with multiple string dependencies\n const multiResult = wrapToInner([\"key1\", \"key2\"], \"test\");\n expect(multiResult instanceof Map).toBe(true);\n // Need to cast to access Map methods\n const multiMap = multiResult as Map<unknown, CacheInner>;\n const innerMap = multiMap.get(\"key1\") as Map<unknown, CacheInner>;\n expect(innerMap instanceof Map).toBe(true);\n expect(innerMap.get(\"key2\")).toEqual({ isNotNestedMap: true, value: \"test\" });\n\n // Test with object dependency (should use WeakMap)\n const obj = { test: true };\n const objResult = wrapToInner([obj], \"test\");\n expect(objResult instanceof WeakMap).toBe(true);\n // Need to cast to access WeakMap methods\n const objMap = objResult as WeakMap<WeakKey, CacheInner>;\n expect(objMap.get(obj)).toEqual({ isNotNestedMap: true, value: \"test\" });\n\n // Test with unregistered symbol dependency (should use WeakMap)\n const symbolObj = Symbol(\"test\");\n const symbolResult = wrapToInner([symbolObj], \"test\");\n expect(symbolResult instanceof WeakMap).toBe(true);\n // Need to cast to access WeakMap methods\n const symbolMap = symbolResult as WeakMap<WeakKey, CacheInner>;\n expect(symbolMap.get(symbolObj as unknown as object)).toEqual({ isNotNestedMap: true, value: \"test\" });\n\n // Test with registered symbol dependency (should use Map)\n const registeredSymbol = Symbol.for(\"test\");\n const registeredSymbolResult = wrapToInner([registeredSymbol], \"test\");\n expect(registeredSymbolResult instanceof Map).toBe(true);\n // Need to cast to access Map methods\n const registeredSymbolMap = registeredSymbolResult as Map<unknown, CacheInner>;\n expect(registeredSymbolMap.get(registeredSymbol)).toEqual({ isNotNestedMap: true, value: \"test\" });\n});\n\n/**\n * Like memo, but minimizes recomputation of the value at all costs (instead of useMemo which recomputes whenever the renderer feels like it).\n *\n * The most recent value will be kept from garbage collection until one of the dependencies becomes unreachable. This may be true even after the component no longer renders. Be wary of memory leaks.\n */\nexport function useStrictMemo<T>(callback: () => T, dependencies: any[]): T {\n const id = useId();\n useInsertionEffect(() => {\n return () => {\n cached.delete(id);\n };\n }, [id]);\n\n const c = cached.get(id);\n if (c) {\n const unwrapped = unwrapFromInner(dependencies, c);\n if (unwrapped.status === \"ok\") {\n return unwrapped.data;\n }\n }\n const value = callback();\n cached.set(id, wrapToInner(dependencies, value));\n return value;\n}\n"],"mappings":";AAAA,SAAS,OAAO,0BAAmC;AACnD,SAAS,cAAc;AAIvB,IAAM,SAAS,oBAAI,IAAwB;AAE3C,SAAS,gBAAgB,cAAqB,OAAsC;AAClF,MAAK,aAAa,WAAW,MAAQ,oBAAoB,OAAQ;AAC/D,WAAO,OAAO,MAAM,MAAS;AAAA,EAC/B;AACA,MAAI,oBAAoB,OAAO;AAC7B,QAAI,aAAa,WAAW,GAAG;AAC7B,aAAO,OAAO,GAAG,MAAM,KAAK;AAAA,IAC9B,OAAO;AACL,aAAO,OAAO,MAAM,MAAS;AAAA,IAC/B;AAAA,EACF,OAAO;AACL,QAAI,aAAa,WAAW,GAAG;AAC7B,aAAO,OAAO,MAAM,MAAS;AAAA,IAC/B,OAAO;AACL,YAAM,CAAC,KAAK,GAAG,IAAI,IAAI;AACvB,YAAM,WAAW,MAAM,IAAI,GAAG;AAC9B,UAAI,CAAC,UAAU;AACb,eAAO,OAAO,MAAM,MAAS;AAAA,MAC/B;AACA,aAAO,gBAAgB,MAAM,QAAQ;AAAA,IACvC;AAAA,EACF;AACF;AA4CA,SAAS,YAAY,cAAqB,OAAwB;AAChE,MAAI,aAAa,WAAW,GAAG;AAC7B,WAAO,EAAE,gBAAgB,MAAM,MAAM;AAAA,EACvC;AACA,QAAM,CAAC,KAAK,GAAG,IAAI,IAAI;AACvB,QAAM,QAAQ,YAAY,MAAM,KAAK;AAErC,QAAM,WAAY,OAAO,QAAQ,YAAY,QAAQ;AACrD,QAAM,uBAAwB,OAAO,QAAQ,YAAY,OAAO,OAAO,GAAG,MAAM;AAChF,QAAM,SAAS,YAAY;AAC3B,QAAM,UAAU,SAAS,UAAU;AAEnC,SAAO,IAAI,QAAQ,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC;AACnC;AAoDO,SAAS,cAAiB,UAAmB,cAAwB;AAC1E,QAAM,KAAK,MAAM;AACjB,qBAAmB,MAAM;AACvB,WAAO,MAAM;AACX,aAAO,OAAO,EAAE;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,EAAE,CAAC;AAEP,QAAM,IAAI,OAAO,IAAI,EAAE;AACvB,MAAI,GAAG;AACL,UAAM,YAAY,gBAAgB,cAAc,CAAC;AACjD,QAAI,UAAU,WAAW,MAAM;AAC7B,aAAO,UAAU;AAAA,IACnB;AAAA,EACF;AACA,QAAM,QAAQ,SAAS;AACvB,SAAO,IAAI,IAAI,YAAY,cAAc,KAAK,CAAC;AAC/C,SAAO;AACT;","names":[]}
@@ -0,0 +1,22 @@
1
+ // src/index.ts
2
+ import {
3
+ StackAdminInterface
4
+ } from "./interface/adminInterface";
5
+ import {
6
+ StackClientInterface
7
+ } from "./interface/clientInterface";
8
+ import {
9
+ StackServerInterface
10
+ } from "./interface/serverInterface";
11
+ import {
12
+ KnownError,
13
+ KnownErrors
14
+ } from "./known-errors";
15
+ export {
16
+ KnownError,
17
+ KnownErrors,
18
+ StackAdminInterface,
19
+ StackClientInterface,
20
+ StackServerInterface
21
+ };
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export {\n StackAdminInterface\n} from \"./interface/adminInterface\";\nexport {\n StackClientInterface\n} from \"./interface/clientInterface\";\nexport {\n StackServerInterface\n} from \"./interface/serverInterface\";\nexport {\n KnownError,\n KnownErrors\n} from \"./known-errors\";\n\n"],"mappings":";AAAA;AAAA,EACE;AAAA,OACK;AACP;AAAA,EACE;AAAA,OACK;AACP;AAAA,EACE;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;","names":[]}