on-zero 0.7.10 → 0.8.0

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 (546) hide show
  1. package/{readme.md → README.md} +172 -231
  2. package/dist/cjs/cli.cjs +5 -2
  3. package/dist/cjs/cli.native.js +5 -2
  4. package/dist/cjs/cli.native.js.map +1 -1
  5. package/dist/cjs/combineZeroClients.cjs +2 -2
  6. package/dist/cjs/combineZeroClients.native.js +6 -6
  7. package/dist/cjs/combineZeroClients.native.js.map +1 -1
  8. package/dist/cjs/config.cjs +30 -0
  9. package/dist/cjs/config.native.js +33 -0
  10. package/dist/cjs/config.native.js.map +1 -0
  11. package/dist/cjs/createPermissions.cjs +2 -2
  12. package/dist/cjs/createPermissions.native.js +17 -27
  13. package/dist/cjs/createPermissions.native.js.map +1 -1
  14. package/dist/cjs/createUseQuery.cjs +3 -3
  15. package/dist/cjs/createUseQuery.native.js +4 -4
  16. package/dist/cjs/createUseQuery.native.js.map +1 -1
  17. package/dist/cjs/createUseQueryDirect.cjs +4 -3
  18. package/dist/cjs/createUseQueryDirect.native.js +14 -18
  19. package/dist/cjs/createUseQueryDirect.native.js.map +1 -1
  20. package/dist/cjs/createZeroClient.cjs +29 -9
  21. package/dist/cjs/createZeroClient.connection.test.cjs +11 -0
  22. package/dist/cjs/createZeroClient.connection.test.native.js +14 -7
  23. package/dist/cjs/createZeroClient.connection.test.native.js.map +1 -1
  24. package/dist/cjs/createZeroClient.native.js +58 -32
  25. package/dist/cjs/createZeroClient.native.js.map +1 -1
  26. package/dist/cjs/createZeroClient.recovery.test.cjs +90 -3
  27. package/dist/cjs/createZeroClient.recovery.test.native.js +109 -19
  28. package/dist/cjs/createZeroClient.recovery.test.native.js.map +1 -1
  29. package/dist/cjs/generate-helpers.cjs +70 -17
  30. package/dist/cjs/generate-helpers.native.js +110 -23
  31. package/dist/cjs/generate-helpers.native.js.map +1 -1
  32. package/dist/cjs/generate-layout.cjs +586 -0
  33. package/dist/cjs/generate-layout.native.js +1275 -0
  34. package/dist/cjs/generate-layout.native.js.map +1 -0
  35. package/dist/cjs/generate-lite.cjs +295 -27
  36. package/dist/cjs/generate-lite.native.js +854 -102
  37. package/dist/cjs/generate-lite.native.js.map +1 -1
  38. package/dist/cjs/generate-lite.test.cjs +433 -41
  39. package/dist/cjs/generate-lite.test.native.js +446 -41
  40. package/dist/cjs/generate-lite.test.native.js.map +1 -1
  41. package/dist/cjs/generate.cjs +172 -94
  42. package/dist/cjs/generate.native.js +324 -148
  43. package/dist/cjs/generate.native.js.map +1 -1
  44. package/dist/cjs/generate.test.cjs +362 -45
  45. package/dist/cjs/generate.test.native.js +374 -45
  46. package/dist/cjs/generate.test.native.js.map +1 -1
  47. package/dist/cjs/helpers/NullToOptional.cjs +18 -0
  48. package/dist/cjs/helpers/NullToOptional.native.js +21 -0
  49. package/dist/cjs/helpers/NullToOptional.native.js.map +1 -0
  50. package/dist/cjs/helpers/asyncContext.cjs +128 -0
  51. package/dist/cjs/helpers/asyncContext.native.js +87 -0
  52. package/dist/cjs/helpers/asyncContext.native.js.map +1 -0
  53. package/dist/cjs/helpers/batchQuery.cjs +2 -2
  54. package/dist/cjs/helpers/batchQuery.native.js +2 -2
  55. package/dist/cjs/helpers/batchQuery.native.js.map +1 -1
  56. package/dist/cjs/helpers/createMutators.cjs +7 -4
  57. package/dist/cjs/helpers/createMutators.native.js +12 -9
  58. package/dist/cjs/helpers/createMutators.native.js.map +1 -1
  59. package/dist/cjs/helpers/createMutators.test.native.js +2 -2
  60. package/dist/cjs/helpers/createMutators.test.native.js.map +1 -1
  61. package/dist/cjs/helpers/ellipsis.cjs +35 -0
  62. package/dist/cjs/helpers/ellipsis.native.js +38 -0
  63. package/dist/cjs/helpers/ellipsis.native.js.map +1 -0
  64. package/dist/cjs/helpers/emitter.cjs +99 -0
  65. package/dist/cjs/helpers/emitter.native.js +125 -0
  66. package/dist/cjs/helpers/emitter.native.js.map +1 -0
  67. package/dist/cjs/helpers/ensure.cjs +33 -0
  68. package/dist/cjs/helpers/ensure.native.js +37 -0
  69. package/dist/cjs/helpers/ensure.native.js.map +1 -0
  70. package/dist/cjs/helpers/ensureLoggedIn.cjs +2 -2
  71. package/dist/cjs/helpers/ensureLoggedIn.native.js +3 -3
  72. package/dist/cjs/helpers/ensureLoggedIn.native.js.map +1 -1
  73. package/dist/cjs/helpers/errors.cjs +40 -0
  74. package/dist/cjs/helpers/errors.native.js +152 -0
  75. package/dist/cjs/helpers/errors.native.js.map +1 -0
  76. package/dist/cjs/helpers/getCurrentComponentStack.cjs +71 -0
  77. package/dist/cjs/helpers/getCurrentComponentStack.native.js +93 -0
  78. package/dist/cjs/helpers/getCurrentComponentStack.native.js.map +1 -0
  79. package/dist/cjs/helpers/globalValue.cjs +39 -0
  80. package/dist/cjs/helpers/globalValue.native.js +42 -0
  81. package/dist/cjs/helpers/globalValue.native.js.map +1 -0
  82. package/dist/cjs/helpers/mapObject.cjs +36 -0
  83. package/dist/cjs/helpers/mapObject.native.js +39 -0
  84. package/dist/cjs/helpers/mapObject.native.js.map +1 -0
  85. package/dist/cjs/helpers/mutationLifecycle.cjs +251 -0
  86. package/dist/cjs/helpers/mutationLifecycle.native.js +392 -0
  87. package/dist/cjs/helpers/mutationLifecycle.native.js.map +1 -0
  88. package/dist/cjs/helpers/mutationLifecycle.test.cjs +174 -0
  89. package/dist/cjs/helpers/mutationLifecycle.test.native.js +182 -0
  90. package/dist/cjs/helpers/mutationLifecycle.test.native.js.map +1 -0
  91. package/dist/cjs/helpers/mutatorContext.cjs +3 -3
  92. package/dist/cjs/helpers/mutatorContext.native.js +5 -5
  93. package/dist/cjs/helpers/mutatorContext.native.js.map +1 -1
  94. package/dist/cjs/helpers/platform.cjs +31 -0
  95. package/dist/cjs/helpers/platform.native.js +33 -0
  96. package/dist/cjs/helpers/platform.native.js.map +1 -0
  97. package/dist/cjs/helpers/prettyFormatZeroQuery.cjs +2 -2
  98. package/dist/cjs/helpers/prettyFormatZeroQuery.native.js +7 -7
  99. package/dist/cjs/helpers/prettyFormatZeroQuery.native.js.map +1 -1
  100. package/dist/cjs/helpers/queryContext.cjs +2 -2
  101. package/dist/cjs/helpers/queryContext.native.js +4 -4
  102. package/dist/cjs/helpers/queryContext.native.js.map +1 -1
  103. package/dist/cjs/helpers/recoverZeroClient.cjs +14 -15
  104. package/dist/cjs/helpers/recoverZeroClient.native.js +26 -23
  105. package/dist/cjs/helpers/recoverZeroClient.native.js.map +1 -1
  106. package/dist/cjs/helpers/recoverZeroClient.test.cjs +10 -8
  107. package/dist/cjs/helpers/recoverZeroClient.test.native.js +17 -21
  108. package/dist/cjs/helpers/recoverZeroClient.test.native.js.map +1 -1
  109. package/dist/cjs/helpers/sleep.cjs +34 -0
  110. package/dist/cjs/helpers/sleep.native.js +39 -0
  111. package/dist/cjs/helpers/sleep.native.js.map +1 -0
  112. package/dist/cjs/helpers/time.cjs +47 -0
  113. package/dist/cjs/helpers/time.native.js +80 -0
  114. package/dist/cjs/helpers/time.native.js.map +1 -0
  115. package/dist/cjs/helpers/tuple.cjs +18 -0
  116. package/dist/cjs/helpers/tuple.native.js +21 -0
  117. package/dist/cjs/helpers/tuple.native.js.map +1 -0
  118. package/dist/cjs/helpers/useMutation.native.js +5 -5
  119. package/dist/cjs/helpers/useMutation.native.js.map +1 -1
  120. package/dist/cjs/helpers/useMutation.test.native.js +1 -1
  121. package/dist/cjs/helpers/useMutation.test.native.js.map +1 -1
  122. package/dist/cjs/helpers/useZeroDebug.cjs +2 -2
  123. package/dist/cjs/helpers/useZeroDebug.native.js +7 -8
  124. package/dist/cjs/helpers/useZeroDebug.native.js.map +1 -1
  125. package/dist/cjs/index.cjs +9 -1
  126. package/dist/cjs/index.native.js +8 -0
  127. package/dist/cjs/index.native.js.map +1 -1
  128. package/dist/cjs/instanceRegistry.cjs +16 -4
  129. package/dist/cjs/instanceRegistry.native.js +56 -6
  130. package/dist/cjs/instanceRegistry.native.js.map +1 -1
  131. package/dist/cjs/multi.cjs +34 -13
  132. package/dist/cjs/multi.native.js +39 -17
  133. package/dist/cjs/multi.native.js.map +1 -1
  134. package/dist/cjs/multiInstance.test.cjs +6 -2
  135. package/dist/cjs/multiInstance.test.native.js +13 -9
  136. package/dist/cjs/multiInstance.test.native.js.map +1 -1
  137. package/dist/cjs/multiInstanceNested.test.native.js +10 -10
  138. package/dist/cjs/multiInstanceNested.test.native.js.map +1 -1
  139. package/dist/cjs/multiPartition.test.cjs +85 -36
  140. package/dist/cjs/multiPartition.test.native.js +102 -39
  141. package/dist/cjs/multiPartition.test.native.js.map +1 -1
  142. package/dist/cjs/mutations.cjs +2 -2
  143. package/dist/cjs/mutations.native.js +4 -4
  144. package/dist/cjs/mutations.native.js.map +1 -1
  145. package/dist/cjs/mutations.test.native.js +3 -3
  146. package/dist/cjs/mutations.test.native.js.map +1 -1
  147. package/dist/cjs/provideZero.hydration.test.cjs +3 -3
  148. package/dist/cjs/provideZero.hydration.test.native.js +4 -4
  149. package/dist/cjs/provideZero.hydration.test.native.js.map +1 -1
  150. package/dist/cjs/run.cjs +1 -1
  151. package/dist/cjs/run.native.js +3 -3
  152. package/dist/cjs/run.native.js.map +1 -1
  153. package/dist/cjs/server.cjs +20 -16
  154. package/dist/cjs/server.native.js +50 -57
  155. package/dist/cjs/server.native.js.map +1 -1
  156. package/dist/cjs/server.test.cjs +129 -6
  157. package/dist/cjs/server.test.native.js +141 -10
  158. package/dist/cjs/server.test.native.js.map +1 -1
  159. package/dist/cjs/serverWhere.test.native.js +3 -3
  160. package/dist/cjs/serverWhere.test.native.js.map +1 -1
  161. package/dist/cjs/state.cjs +2 -2
  162. package/dist/cjs/state.native.js +10 -10
  163. package/dist/cjs/state.native.js.map +1 -1
  164. package/dist/cjs/usePermission.test.native.js +3 -3
  165. package/dist/cjs/usePermission.test.native.js.map +1 -1
  166. package/dist/cjs/useQuery.empty.test.cjs +3 -3
  167. package/dist/cjs/useQuery.empty.test.native.js +6 -6
  168. package/dist/cjs/useQuery.empty.test.native.js.map +1 -1
  169. package/dist/cjs/useQuery.ssr.test.native.js +2 -2
  170. package/dist/cjs/useQuery.ssr.test.native.js.map +1 -1
  171. package/dist/cjs/vite-plugin.cjs +7 -8
  172. package/dist/cjs/vite-plugin.native.js +11 -11
  173. package/dist/cjs/vite-plugin.native.js.map +1 -1
  174. package/dist/cjs/where.cjs +3 -3
  175. package/dist/cjs/where.native.js +4 -4
  176. package/dist/cjs/where.native.js.map +1 -1
  177. package/dist/esm/cli.mjs +6 -3
  178. package/dist/esm/cli.mjs.map +1 -1
  179. package/dist/esm/cli.native.js +6 -3
  180. package/dist/esm/cli.native.js.map +1 -1
  181. package/dist/esm/combineZeroClients.mjs +1 -1
  182. package/dist/esm/combineZeroClients.mjs.map +1 -1
  183. package/dist/esm/combineZeroClients.native.js +5 -5
  184. package/dist/esm/combineZeroClients.native.js.map +1 -1
  185. package/dist/esm/config.mjs +5 -0
  186. package/dist/esm/config.mjs.map +1 -0
  187. package/dist/esm/config.native.js +5 -0
  188. package/dist/esm/config.native.js.map +1 -0
  189. package/dist/esm/createPermissions.mjs +1 -1
  190. package/dist/esm/createPermissions.mjs.map +1 -1
  191. package/dist/esm/createPermissions.native.js +16 -26
  192. package/dist/esm/createPermissions.native.js.map +1 -1
  193. package/dist/esm/createUseQuery.mjs +2 -2
  194. package/dist/esm/createUseQuery.mjs.map +1 -1
  195. package/dist/esm/createUseQuery.native.js +3 -3
  196. package/dist/esm/createUseQuery.native.js.map +1 -1
  197. package/dist/esm/createUseQueryDirect.mjs +2 -1
  198. package/dist/esm/createUseQueryDirect.mjs.map +1 -1
  199. package/dist/esm/createUseQueryDirect.native.js +12 -16
  200. package/dist/esm/createUseQueryDirect.native.js.map +1 -1
  201. package/dist/esm/createZeroClient.connection.test.mjs +11 -0
  202. package/dist/esm/createZeroClient.connection.test.mjs.map +1 -1
  203. package/dist/esm/createZeroClient.connection.test.native.js +14 -7
  204. package/dist/esm/createZeroClient.connection.test.native.js.map +1 -1
  205. package/dist/esm/createZeroClient.mjs +25 -5
  206. package/dist/esm/createZeroClient.mjs.map +1 -1
  207. package/dist/esm/createZeroClient.native.js +54 -28
  208. package/dist/esm/createZeroClient.native.js.map +1 -1
  209. package/dist/esm/createZeroClient.recovery.test.mjs +90 -3
  210. package/dist/esm/createZeroClient.recovery.test.mjs.map +1 -1
  211. package/dist/esm/createZeroClient.recovery.test.native.js +109 -19
  212. package/dist/esm/createZeroClient.recovery.test.native.js.map +1 -1
  213. package/dist/esm/generate-helpers.mjs +70 -18
  214. package/dist/esm/generate-helpers.mjs.map +1 -1
  215. package/dist/esm/generate-helpers.native.js +110 -24
  216. package/dist/esm/generate-helpers.native.js.map +1 -1
  217. package/dist/esm/generate-layout.mjs +560 -0
  218. package/dist/esm/generate-layout.mjs.map +1 -0
  219. package/dist/esm/generate-layout.native.js +1246 -0
  220. package/dist/esm/generate-layout.native.js.map +1 -0
  221. package/dist/esm/generate-lite.mjs +296 -28
  222. package/dist/esm/generate-lite.mjs.map +1 -1
  223. package/dist/esm/generate-lite.native.js +855 -103
  224. package/dist/esm/generate-lite.native.js.map +1 -1
  225. package/dist/esm/generate-lite.test.mjs +434 -42
  226. package/dist/esm/generate-lite.test.mjs.map +1 -1
  227. package/dist/esm/generate-lite.test.native.js +447 -42
  228. package/dist/esm/generate-lite.test.native.js.map +1 -1
  229. package/dist/esm/generate.mjs +172 -96
  230. package/dist/esm/generate.mjs.map +1 -1
  231. package/dist/esm/generate.native.js +324 -150
  232. package/dist/esm/generate.native.js.map +1 -1
  233. package/dist/esm/generate.test.mjs +366 -49
  234. package/dist/esm/generate.test.mjs.map +1 -1
  235. package/dist/esm/generate.test.native.js +378 -49
  236. package/dist/esm/generate.test.native.js.map +1 -1
  237. package/dist/esm/helpers/NullToOptional.mjs +2 -0
  238. package/dist/esm/helpers/NullToOptional.mjs.map +1 -0
  239. package/dist/esm/helpers/NullToOptional.native.js +2 -0
  240. package/dist/esm/helpers/NullToOptional.native.js.map +1 -0
  241. package/dist/esm/helpers/asyncContext.mjs +102 -0
  242. package/dist/esm/helpers/asyncContext.mjs.map +1 -0
  243. package/dist/esm/helpers/asyncContext.native.js +58 -0
  244. package/dist/esm/helpers/asyncContext.native.js.map +1 -0
  245. package/dist/esm/helpers/batchQuery.mjs +1 -1
  246. package/dist/esm/helpers/batchQuery.native.js +1 -1
  247. package/dist/esm/helpers/createMutators.mjs +5 -2
  248. package/dist/esm/helpers/createMutators.mjs.map +1 -1
  249. package/dist/esm/helpers/createMutators.native.js +10 -7
  250. package/dist/esm/helpers/createMutators.native.js.map +1 -1
  251. package/dist/esm/helpers/createMutators.test.native.js +2 -2
  252. package/dist/esm/helpers/createMutators.test.native.js.map +1 -1
  253. package/dist/esm/helpers/ellipsis.mjs +10 -0
  254. package/dist/esm/helpers/ellipsis.mjs.map +1 -0
  255. package/dist/esm/helpers/ellipsis.native.js +10 -0
  256. package/dist/esm/helpers/ellipsis.native.js.map +1 -0
  257. package/dist/esm/helpers/emitter.mjs +72 -0
  258. package/dist/esm/helpers/emitter.mjs.map +1 -0
  259. package/dist/esm/helpers/emitter.native.js +95 -0
  260. package/dist/esm/helpers/emitter.native.js.map +1 -0
  261. package/dist/esm/helpers/ensure.mjs +8 -0
  262. package/dist/esm/helpers/ensure.mjs.map +1 -0
  263. package/dist/esm/helpers/ensure.native.js +9 -0
  264. package/dist/esm/helpers/ensure.native.js.map +1 -0
  265. package/dist/esm/helpers/ensureLoggedIn.mjs +1 -1
  266. package/dist/esm/helpers/ensureLoggedIn.mjs.map +1 -1
  267. package/dist/esm/helpers/ensureLoggedIn.native.js +2 -2
  268. package/dist/esm/helpers/ensureLoggedIn.native.js.map +1 -1
  269. package/dist/esm/helpers/errors.mjs +14 -0
  270. package/dist/esm/helpers/errors.mjs.map +1 -0
  271. package/dist/esm/helpers/errors.native.js +123 -0
  272. package/dist/esm/helpers/errors.native.js.map +1 -0
  273. package/dist/esm/helpers/getCurrentComponentStack.mjs +35 -0
  274. package/dist/esm/helpers/getCurrentComponentStack.mjs.map +1 -0
  275. package/dist/esm/helpers/getCurrentComponentStack.native.js +54 -0
  276. package/dist/esm/helpers/getCurrentComponentStack.native.js.map +1 -0
  277. package/dist/esm/helpers/globalValue.mjs +14 -0
  278. package/dist/esm/helpers/globalValue.mjs.map +1 -0
  279. package/dist/esm/helpers/globalValue.native.js +14 -0
  280. package/dist/esm/helpers/globalValue.native.js.map +1 -0
  281. package/dist/esm/helpers/mapObject.mjs +11 -0
  282. package/dist/esm/helpers/mapObject.mjs.map +1 -0
  283. package/dist/esm/helpers/mapObject.native.js +11 -0
  284. package/dist/esm/helpers/mapObject.native.js.map +1 -0
  285. package/dist/esm/helpers/mutationLifecycle.mjs +221 -0
  286. package/dist/esm/helpers/mutationLifecycle.mjs.map +1 -0
  287. package/dist/esm/helpers/mutationLifecycle.native.js +359 -0
  288. package/dist/esm/helpers/mutationLifecycle.native.js.map +1 -0
  289. package/dist/esm/helpers/mutationLifecycle.test.mjs +175 -0
  290. package/dist/esm/helpers/mutationLifecycle.test.mjs.map +1 -0
  291. package/dist/esm/helpers/mutationLifecycle.test.native.js +180 -0
  292. package/dist/esm/helpers/mutationLifecycle.test.native.js.map +1 -0
  293. package/dist/esm/helpers/mutatorContext.mjs +1 -1
  294. package/dist/esm/helpers/mutatorContext.native.js +4 -4
  295. package/dist/esm/helpers/mutatorContext.native.js.map +1 -1
  296. package/dist/esm/helpers/platform.mjs +5 -0
  297. package/dist/esm/helpers/platform.mjs.map +1 -0
  298. package/dist/esm/helpers/platform.native.js +4 -0
  299. package/dist/esm/helpers/platform.native.js.map +1 -0
  300. package/dist/esm/helpers/prettyFormatZeroQuery.mjs +1 -1
  301. package/dist/esm/helpers/prettyFormatZeroQuery.native.js +6 -6
  302. package/dist/esm/helpers/prettyFormatZeroQuery.native.js.map +1 -1
  303. package/dist/esm/helpers/queryContext.mjs +1 -1
  304. package/dist/esm/helpers/queryContext.native.js +3 -3
  305. package/dist/esm/helpers/queryContext.native.js.map +1 -1
  306. package/dist/esm/helpers/recoverZeroClient.mjs +14 -15
  307. package/dist/esm/helpers/recoverZeroClient.mjs.map +1 -1
  308. package/dist/esm/helpers/recoverZeroClient.native.js +26 -23
  309. package/dist/esm/helpers/recoverZeroClient.native.js.map +1 -1
  310. package/dist/esm/helpers/recoverZeroClient.test.mjs +8 -6
  311. package/dist/esm/helpers/recoverZeroClient.test.mjs.map +1 -1
  312. package/dist/esm/helpers/recoverZeroClient.test.native.js +15 -19
  313. package/dist/esm/helpers/recoverZeroClient.test.native.js.map +1 -1
  314. package/dist/esm/helpers/sleep.mjs +9 -0
  315. package/dist/esm/helpers/sleep.mjs.map +1 -0
  316. package/dist/esm/helpers/sleep.native.js +11 -0
  317. package/dist/esm/helpers/sleep.native.js.map +1 -0
  318. package/dist/esm/helpers/time.mjs +22 -0
  319. package/dist/esm/helpers/time.mjs.map +1 -0
  320. package/dist/esm/helpers/time.native.js +52 -0
  321. package/dist/esm/helpers/time.native.js.map +1 -0
  322. package/dist/esm/helpers/tuple.mjs +2 -0
  323. package/dist/esm/helpers/tuple.mjs.map +1 -0
  324. package/dist/esm/helpers/tuple.native.js +2 -0
  325. package/dist/esm/helpers/tuple.native.js.map +1 -0
  326. package/dist/esm/helpers/useMutation.native.js +5 -5
  327. package/dist/esm/helpers/useMutation.native.js.map +1 -1
  328. package/dist/esm/helpers/useMutation.test.native.js +1 -1
  329. package/dist/esm/helpers/useMutation.test.native.js.map +1 -1
  330. package/dist/esm/helpers/useZeroDebug.mjs +1 -1
  331. package/dist/esm/helpers/useZeroDebug.mjs.map +1 -1
  332. package/dist/esm/helpers/useZeroDebug.native.js +6 -7
  333. package/dist/esm/helpers/useZeroDebug.native.js.map +1 -1
  334. package/dist/esm/index.js +3 -1
  335. package/dist/esm/index.js.map +1 -1
  336. package/dist/esm/index.mjs +3 -1
  337. package/dist/esm/index.mjs.map +1 -1
  338. package/dist/esm/index.native.js +3 -1
  339. package/dist/esm/index.native.js.map +1 -1
  340. package/dist/esm/instanceRegistry.mjs +13 -2
  341. package/dist/esm/instanceRegistry.mjs.map +1 -1
  342. package/dist/esm/instanceRegistry.native.js +53 -4
  343. package/dist/esm/instanceRegistry.native.js.map +1 -1
  344. package/dist/esm/multi.mjs +33 -12
  345. package/dist/esm/multi.mjs.map +1 -1
  346. package/dist/esm/multi.native.js +38 -16
  347. package/dist/esm/multi.native.js.map +1 -1
  348. package/dist/esm/multiInstance.test.mjs +5 -1
  349. package/dist/esm/multiInstance.test.mjs.map +1 -1
  350. package/dist/esm/multiInstance.test.native.js +12 -8
  351. package/dist/esm/multiInstance.test.native.js.map +1 -1
  352. package/dist/esm/multiInstanceNested.test.native.js +10 -10
  353. package/dist/esm/multiInstanceNested.test.native.js.map +1 -1
  354. package/dist/esm/multiPartition.test.mjs +86 -37
  355. package/dist/esm/multiPartition.test.mjs.map +1 -1
  356. package/dist/esm/multiPartition.test.native.js +103 -40
  357. package/dist/esm/multiPartition.test.native.js.map +1 -1
  358. package/dist/esm/mutations.mjs +1 -1
  359. package/dist/esm/mutations.mjs.map +1 -1
  360. package/dist/esm/mutations.native.js +3 -3
  361. package/dist/esm/mutations.native.js.map +1 -1
  362. package/dist/esm/mutations.test.native.js +3 -3
  363. package/dist/esm/mutations.test.native.js.map +1 -1
  364. package/dist/esm/provideZero.hydration.test.mjs +1 -1
  365. package/dist/esm/provideZero.hydration.test.mjs.map +1 -1
  366. package/dist/esm/provideZero.hydration.test.native.js +2 -2
  367. package/dist/esm/provideZero.hydration.test.native.js.map +1 -1
  368. package/dist/esm/run.mjs +1 -1
  369. package/dist/esm/run.mjs.map +1 -1
  370. package/dist/esm/run.native.js +3 -3
  371. package/dist/esm/run.native.js.map +1 -1
  372. package/dist/esm/server.mjs +20 -15
  373. package/dist/esm/server.mjs.map +1 -1
  374. package/dist/esm/server.native.js +50 -56
  375. package/dist/esm/server.native.js.map +1 -1
  376. package/dist/esm/server.test.mjs +130 -7
  377. package/dist/esm/server.test.mjs.map +1 -1
  378. package/dist/esm/server.test.native.js +142 -11
  379. package/dist/esm/server.test.native.js.map +1 -1
  380. package/dist/esm/serverWhere.test.mjs.map +1 -1
  381. package/dist/esm/serverWhere.test.native.js +3 -3
  382. package/dist/esm/serverWhere.test.native.js.map +1 -1
  383. package/dist/esm/state.mjs +1 -1
  384. package/dist/esm/state.mjs.map +1 -1
  385. package/dist/esm/state.native.js +9 -9
  386. package/dist/esm/state.native.js.map +1 -1
  387. package/dist/esm/usePermission.test.native.js +3 -3
  388. package/dist/esm/usePermission.test.native.js.map +1 -1
  389. package/dist/esm/useQuery.empty.test.mjs +1 -1
  390. package/dist/esm/useQuery.empty.test.mjs.map +1 -1
  391. package/dist/esm/useQuery.empty.test.native.js +4 -4
  392. package/dist/esm/useQuery.empty.test.native.js.map +1 -1
  393. package/dist/esm/useQuery.ssr.test.native.js +2 -2
  394. package/dist/esm/useQuery.ssr.test.native.js.map +1 -1
  395. package/dist/esm/vite-plugin.mjs +7 -8
  396. package/dist/esm/vite-plugin.mjs.map +1 -1
  397. package/dist/esm/vite-plugin.native.js +11 -11
  398. package/dist/esm/vite-plugin.native.js.map +1 -1
  399. package/dist/esm/where.mjs +1 -1
  400. package/dist/esm/where.mjs.map +1 -1
  401. package/dist/esm/where.native.js +2 -2
  402. package/dist/esm/where.native.js.map +1 -1
  403. package/package.json +18 -6
  404. package/src/cli.ts +11 -3
  405. package/src/combineZeroClients.tsx +18 -10
  406. package/src/config.ts +72 -0
  407. package/src/createPermissions.ts +3 -4
  408. package/src/createUseQuery.tsx +8 -8
  409. package/src/createUseQueryDirect.tsx +11 -10
  410. package/src/createZeroClient.authData.test.tsx +1 -1
  411. package/src/createZeroClient.connection.test.tsx +13 -2
  412. package/src/createZeroClient.recovery.test.tsx +100 -4
  413. package/src/createZeroClient.tsx +87 -30
  414. package/src/generate-helpers.ts +108 -31
  415. package/src/generate-layout.ts +841 -0
  416. package/src/generate-lite.test.ts +421 -42
  417. package/src/generate-lite.ts +479 -43
  418. package/src/generate.test.ts +552 -90
  419. package/src/generate.ts +360 -163
  420. package/src/helpers/NullToOptional.ts +5 -0
  421. package/src/helpers/asyncContext.native.ts +90 -0
  422. package/src/helpers/asyncContext.ts +159 -0
  423. package/src/helpers/batchQuery.ts +2 -2
  424. package/src/helpers/createMutators.ts +11 -8
  425. package/src/helpers/ellipsis.ts +9 -0
  426. package/src/helpers/emitter.tsx +106 -0
  427. package/src/helpers/ensure.ts +10 -0
  428. package/src/helpers/ensureLoggedIn.ts +1 -2
  429. package/src/helpers/errors.ts +13 -0
  430. package/src/helpers/getCurrentComponentStack.ts +56 -0
  431. package/src/helpers/globalValue.ts +40 -0
  432. package/src/helpers/mapObject.ts +14 -0
  433. package/src/helpers/mutationLifecycle.test.ts +180 -0
  434. package/src/helpers/mutationLifecycle.ts +313 -0
  435. package/src/helpers/mutatorContext.ts +3 -3
  436. package/src/helpers/platform.native.ts +2 -0
  437. package/src/helpers/platform.ts +16 -0
  438. package/src/helpers/prettyFormatZeroQuery.ts +2 -2
  439. package/src/helpers/queryContext.ts +2 -2
  440. package/src/helpers/recoverZeroClient.test.ts +23 -21
  441. package/src/helpers/recoverZeroClient.ts +56 -49
  442. package/src/helpers/sleep.ts +8 -0
  443. package/src/helpers/time.ts +51 -0
  444. package/src/helpers/tuple.ts +1 -0
  445. package/src/helpers/useMutation.tsx +3 -3
  446. package/src/helpers/useZeroDebug.ts +3 -3
  447. package/src/index.ts +13 -1
  448. package/src/instanceRegistry.ts +19 -6
  449. package/src/multi.ts +75 -31
  450. package/src/multiInstance.test.tsx +31 -13
  451. package/src/multiInstanceNested.test.tsx +2 -2
  452. package/src/multiPartition.test.ts +62 -27
  453. package/src/mutations.ts +10 -10
  454. package/src/provideZero.hydration.test.tsx +1 -1
  455. package/src/resolveQuery.ts +2 -2
  456. package/src/run.ts +7 -7
  457. package/src/server.test.ts +117 -18
  458. package/src/server.ts +70 -43
  459. package/src/serverWhere.ts +2 -2
  460. package/src/state.ts +2 -2
  461. package/src/types.ts +47 -6
  462. package/src/useQuery.empty.test.tsx +3 -3
  463. package/src/useQuery.ssr.test.ts +1 -1
  464. package/src/vite-plugin.ts +12 -9
  465. package/src/where.ts +6 -7
  466. package/src/zeroRunner.ts +2 -2
  467. package/types/combineZeroClients.d.ts +11 -5
  468. package/types/combineZeroClients.d.ts.map +1 -1
  469. package/types/config.d.ts +62 -0
  470. package/types/config.d.ts.map +1 -0
  471. package/types/createPermissions.d.ts.map +1 -1
  472. package/types/createUseQuery.d.ts.map +1 -1
  473. package/types/createUseQueryDirect.d.ts +1 -1
  474. package/types/createUseQueryDirect.d.ts.map +1 -1
  475. package/types/createZeroClient.d.ts +22 -12
  476. package/types/createZeroClient.d.ts.map +1 -1
  477. package/types/createZeroClient.recovery.test.d.ts.map +1 -1
  478. package/types/generate-helpers.d.ts +17 -2
  479. package/types/generate-helpers.d.ts.map +1 -1
  480. package/types/generate-layout.d.ts +26 -0
  481. package/types/generate-layout.d.ts.map +1 -0
  482. package/types/generate-lite.d.ts +29 -1
  483. package/types/generate-lite.d.ts.map +1 -1
  484. package/types/generate.d.ts +20 -0
  485. package/types/generate.d.ts.map +1 -1
  486. package/types/helpers/NullToOptional.d.ts +6 -0
  487. package/types/helpers/NullToOptional.d.ts.map +1 -0
  488. package/types/helpers/asyncContext.d.ts +15 -0
  489. package/types/helpers/asyncContext.d.ts.map +1 -0
  490. package/types/helpers/asyncContext.native.d.ts +8 -0
  491. package/types/helpers/asyncContext.native.d.ts.map +1 -0
  492. package/types/helpers/createMutators.d.ts +2 -1
  493. package/types/helpers/createMutators.d.ts.map +1 -1
  494. package/types/helpers/ellipsis.d.ts +2 -0
  495. package/types/helpers/ellipsis.d.ts.map +1 -0
  496. package/types/helpers/emitter.d.ts +21 -0
  497. package/types/helpers/emitter.d.ts.map +1 -0
  498. package/types/helpers/ensure.d.ts +2 -0
  499. package/types/helpers/ensure.d.ts.map +1 -0
  500. package/types/helpers/ensureLoggedIn.d.ts.map +1 -1
  501. package/types/helpers/errors.d.ts +7 -0
  502. package/types/helpers/errors.d.ts.map +1 -0
  503. package/types/helpers/getCurrentComponentStack.d.ts +2 -0
  504. package/types/helpers/getCurrentComponentStack.d.ts.map +1 -0
  505. package/types/helpers/globalValue.d.ts +23 -0
  506. package/types/helpers/globalValue.d.ts.map +1 -0
  507. package/types/helpers/mapObject.d.ts +4 -0
  508. package/types/helpers/mapObject.d.ts.map +1 -0
  509. package/types/helpers/mutationLifecycle.d.ts +44 -0
  510. package/types/helpers/mutationLifecycle.d.ts.map +1 -0
  511. package/types/helpers/mutationLifecycle.test.d.ts +2 -0
  512. package/types/helpers/mutationLifecycle.test.d.ts.map +1 -0
  513. package/types/helpers/platform.d.ts +3 -0
  514. package/types/helpers/platform.d.ts.map +1 -0
  515. package/types/helpers/platform.native.d.ts +3 -0
  516. package/types/helpers/platform.native.d.ts.map +1 -0
  517. package/types/helpers/recoverZeroClient.d.ts +13 -9
  518. package/types/helpers/recoverZeroClient.d.ts.map +1 -1
  519. package/types/helpers/sleep.d.ts +2 -0
  520. package/types/helpers/sleep.d.ts.map +1 -0
  521. package/types/helpers/time.d.ts +28 -0
  522. package/types/helpers/time.d.ts.map +1 -0
  523. package/types/helpers/tuple.d.ts +2 -0
  524. package/types/helpers/tuple.d.ts.map +1 -0
  525. package/types/index.d.ts +3 -1
  526. package/types/index.d.ts.map +1 -1
  527. package/types/instanceRegistry.d.ts +1 -0
  528. package/types/instanceRegistry.d.ts.map +1 -1
  529. package/types/multi.d.ts +23 -1
  530. package/types/multi.d.ts.map +1 -1
  531. package/types/mutations.d.ts +1 -1
  532. package/types/mutations.d.ts.map +1 -1
  533. package/types/run.d.ts.map +1 -1
  534. package/types/server.d.ts +12 -8
  535. package/types/server.d.ts.map +1 -1
  536. package/types/state.d.ts +1 -1
  537. package/types/state.d.ts.map +1 -1
  538. package/types/types.d.ts +23 -1
  539. package/types/types.d.ts.map +1 -1
  540. package/types/vite-plugin.d.ts.map +1 -1
  541. package/types/where.d.ts.map +1 -1
  542. package/lint/ssr-guards.js +0 -165
  543. package/test-fixtures/server-return-types.ts +0 -58
  544. package/test-fixtures/tsconfig.json +0 -13
  545. package/tsconfig.json +0 -26
  546. package/vitest.config.ts +0 -8
@@ -0,0 +1,5 @@
1
+ export type NullToOptional<T> = {
2
+ [K in keyof T as null extends T[K] ? K : never]?: Exclude<T[K], null> | undefined | null
3
+ } & {
4
+ [K in keyof T as null extends T[K] ? never : K]: T[K]
5
+ }
@@ -0,0 +1,90 @@
1
+ interface AsyncContext<T> {
2
+ get(): T | undefined
3
+ run<R>(value: T, fn: () => R | Promise<R>): Promise<R>
4
+ }
5
+
6
+ export function setupAsyncLocalStorage(_AsyncLocalStorage: unknown): void {}
7
+
8
+ // react native implementation - no node:async_hooks available
9
+ export function createAsyncContext<T>(): AsyncContext<T> {
10
+ let currentContext: T | undefined
11
+ const contextStack: (T | undefined)[] = []
12
+
13
+ return {
14
+ get(): T | undefined {
15
+ return currentContext
16
+ },
17
+ async run<R>(value: T, fn: () => R | Promise<R>): Promise<R> {
18
+ const prevContext = currentContext
19
+ currentContext = value
20
+ contextStack.push(prevContext)
21
+
22
+ // store original Promise methods
23
+ const OriginalPromise = Promise
24
+ const OriginalThen = OriginalPromise.prototype.then
25
+ const OriginalCatch = OriginalPromise.prototype.catch
26
+ const OriginalFinally = OriginalPromise.prototype.finally
27
+
28
+ function wrapCallback(
29
+ callback: Function | undefined | null,
30
+ context: T | undefined
31
+ ): Function | undefined | null {
32
+ if (!callback) return callback
33
+ return (...args: any[]) => {
34
+ const prevContext = currentContext
35
+ currentContext = context
36
+ try {
37
+ return callback(...args)
38
+ } finally {
39
+ currentContext = prevContext
40
+ }
41
+ }
42
+ }
43
+
44
+ // patch Promise methods to capture and restore context
45
+ // eslint-disable-next-line no-then-property -- intentional patching for context propagation
46
+ OriginalPromise.prototype.then = function (
47
+ this: Promise<any>,
48
+ onFulfilled?: any,
49
+ onRejected?: any
50
+ ): Promise<any> {
51
+ const context = currentContext
52
+ return OriginalThen.call(
53
+ this,
54
+ wrapCallback(onFulfilled, context) as any,
55
+ wrapCallback(onRejected, context) as any
56
+ )
57
+ }
58
+
59
+ OriginalPromise.prototype.catch = function (
60
+ this: Promise<any>,
61
+ onRejected?: any
62
+ ): Promise<any> {
63
+ const context = currentContext
64
+ return OriginalCatch.call(this, wrapCallback(onRejected, context) as any)
65
+ }
66
+
67
+ OriginalPromise.prototype.finally = function (
68
+ this: Promise<any>,
69
+ onFinally?: any
70
+ ): Promise<any> {
71
+ const context = currentContext
72
+ return OriginalFinally.call(this, wrapCallback(onFinally, context) as any)
73
+ }
74
+
75
+ try {
76
+ const result = await fn()
77
+ return result
78
+ } finally {
79
+ // restore original Promise methods
80
+ // eslint-disable-next-line no-then-property -- restoring original methods
81
+ OriginalPromise.prototype.then = OriginalThen
82
+ OriginalPromise.prototype.catch = OriginalCatch
83
+ OriginalPromise.prototype.finally = OriginalFinally
84
+
85
+ contextStack.pop()
86
+ currentContext = prevContext
87
+ }
88
+ },
89
+ }
90
+ }
@@ -0,0 +1,159 @@
1
+ import { IS_SERVER_RUNTIME } from './platform'
2
+
3
+ interface AsyncContext<T> {
4
+ get(): T | undefined
5
+ run<R>(value: T, fn: () => R | Promise<R>): Promise<R>
6
+ }
7
+
8
+ interface NodeAsyncLocalStorage<T> {
9
+ getStore(): T | undefined
10
+ run<R>(store: T, callback: () => R): R
11
+ }
12
+
13
+ interface AsyncLocalStorageConstructor {
14
+ new <T>(): NodeAsyncLocalStorage<T>
15
+ }
16
+
17
+ let nodeAsyncLocalStorageCache: AsyncLocalStorageConstructor | null = null
18
+ let configuredAsyncLocalStorage: AsyncLocalStorageConstructor | null = null
19
+
20
+ // hide from vite/esbuild static analysis to avoid browser compat warning
21
+ const nodeModuleId = ['node', 'async_hooks'].join(':')
22
+
23
+ export function setupAsyncLocalStorage(
24
+ AsyncLocalStorage: AsyncLocalStorageConstructor | null
25
+ ): void {
26
+ configuredAsyncLocalStorage = AsyncLocalStorage
27
+ }
28
+
29
+ async function getNodeAsyncLocalStorage(): Promise<AsyncLocalStorageConstructor | null> {
30
+ if (!nodeAsyncLocalStorageCache) {
31
+ try {
32
+ const module = await import(/* @vite-ignore */ nodeModuleId)
33
+ nodeAsyncLocalStorageCache =
34
+ module.AsyncLocalStorage as AsyncLocalStorageConstructor
35
+ } catch {
36
+ return null
37
+ }
38
+ }
39
+ return nodeAsyncLocalStorageCache
40
+ }
41
+
42
+ export function createAsyncContext<T>(): AsyncContext<T> {
43
+ if (IS_SERVER_RUNTIME) {
44
+ let storage: NodeAsyncLocalStorage<T> | null = null
45
+
46
+ const storageReady = Promise.resolve(configuredAsyncLocalStorage)
47
+ .then((AsyncLocalStorage) => AsyncLocalStorage || getNodeAsyncLocalStorage())
48
+ .then((AsyncLocalStorage) => {
49
+ if (AsyncLocalStorage && !storage) {
50
+ storage = new AsyncLocalStorage<T>()
51
+ }
52
+ })
53
+
54
+ return {
55
+ get(): T | undefined {
56
+ if (!storage) {
57
+ throw new Error(`AsyncContext storage not initialized`)
58
+ }
59
+ return storage.getStore()
60
+ },
61
+
62
+ async run<R>(value: T, fn: () => R | Promise<R>): Promise<R> {
63
+ if (!storage) {
64
+ await storageReady
65
+ }
66
+ if (!storage) {
67
+ throw new Error(`AsyncContext storage unavailable in server runtime`)
68
+ }
69
+ return storage.run(value, fn)
70
+ },
71
+ }
72
+ } else {
73
+ // browser implementation using promise patching
74
+ return createBrowserAsyncContext<T>()
75
+ }
76
+ }
77
+
78
+ function createBrowserAsyncContext<T>(): AsyncContext<T> {
79
+ let currentContext: T | undefined
80
+ const contextStack: (T | undefined)[] = []
81
+
82
+ return {
83
+ get(): T | undefined {
84
+ return currentContext
85
+ },
86
+ async run<R>(value: T, fn: () => R | Promise<R>): Promise<R> {
87
+ const prevContext = currentContext
88
+ currentContext = value
89
+ contextStack.push(prevContext)
90
+
91
+ // store original Promise methods
92
+ const OriginalPromise = Promise
93
+ const OriginalThen = OriginalPromise.prototype.then
94
+ const OriginalCatch = OriginalPromise.prototype.catch
95
+ const OriginalFinally = OriginalPromise.prototype.finally
96
+
97
+ function wrapCallback(
98
+ callback: Function | undefined | null,
99
+ context: T | undefined
100
+ ): Function | undefined | null {
101
+ if (!callback) return callback
102
+ return (...args: any[]) => {
103
+ const prevContext = currentContext
104
+ currentContext = context
105
+ try {
106
+ return callback(...args)
107
+ } finally {
108
+ currentContext = prevContext
109
+ }
110
+ }
111
+ }
112
+
113
+ // patch Promise methods to capture and restore context
114
+ // eslint-disable-next-line no-then-property -- intentional patching for context propagation
115
+ OriginalPromise.prototype.then = function (
116
+ this: Promise<any>,
117
+ onFulfilled?: any,
118
+ onRejected?: any
119
+ ): Promise<any> {
120
+ const context = currentContext
121
+ return OriginalThen.call(
122
+ this,
123
+ wrapCallback(onFulfilled, context) as any,
124
+ wrapCallback(onRejected, context) as any
125
+ )
126
+ }
127
+
128
+ OriginalPromise.prototype.catch = function (
129
+ this: Promise<any>,
130
+ onRejected?: any
131
+ ): Promise<any> {
132
+ const context = currentContext
133
+ return OriginalCatch.call(this, wrapCallback(onRejected, context) as any)
134
+ }
135
+
136
+ OriginalPromise.prototype.finally = function (
137
+ this: Promise<any>,
138
+ onFinally?: any
139
+ ): Promise<any> {
140
+ const context = currentContext
141
+ return OriginalFinally.call(this, wrapCallback(onFinally, context) as any)
142
+ }
143
+
144
+ try {
145
+ const result = await fn()
146
+ return result
147
+ } finally {
148
+ // restore original Promise methods
149
+ // eslint-disable-next-line no-then-property -- restoring original methods
150
+ OriginalPromise.prototype.then = OriginalThen
151
+ OriginalPromise.prototype.catch = OriginalCatch
152
+ OriginalPromise.prototype.finally = OriginalFinally
153
+
154
+ contextStack.pop()
155
+ currentContext = prevContext
156
+ }
157
+ },
158
+ }
159
+ }
@@ -1,4 +1,4 @@
1
- import { sleep } from '@take-out/helpers'
1
+ import { sleep } from './sleep'
2
2
 
3
3
  import type { Query, Row } from '@rocicorp/zero'
4
4
 
@@ -18,7 +18,7 @@ export function createBatchQuery(server: ServerWithQuery) {
18
18
  chunk: number
19
19
  pause?: number
20
20
  stopAfter?: number
21
- } = { chunk: 20 },
21
+ } = { chunk: 20 }
22
22
  ) {
23
23
  let hasMore = true
24
24
  let last: Item | null = null
@@ -1,7 +1,7 @@
1
- import { mapObject, time } from '@take-out/helpers'
2
-
3
1
  import { getAuthData } from '../state'
2
+ import { mapObject } from './mapObject'
4
3
  import { runWithContext } from './mutatorContext'
4
+ import { time } from './time'
5
5
 
6
6
  import type {
7
7
  AuthData,
@@ -26,6 +26,7 @@ export function createMutators<Models extends GenericModels>({
26
26
  authData,
27
27
  createServerActions,
28
28
  enqueueTask = () => {},
29
+ enqueueAction = () => {},
29
30
  can,
30
31
  models,
31
32
  validateMutation,
@@ -37,6 +38,7 @@ export function createMutators<Models extends GenericModels>({
37
38
  can: Can
38
39
  models: Models
39
40
  enqueueTask?: NonNullable<MutatorContext['server']>['enqueueTask']
41
+ enqueueAction?: NonNullable<MutatorContext['server']>['enqueueAction']
40
42
  createServerActions?: () => Record<string, any>
41
43
  validateMutation?: ValidateMutationFn
42
44
  /** valibot schemas keyed by model.mutationName, auto-validates args before running */
@@ -65,6 +67,7 @@ export function createMutators<Models extends GenericModels>({
65
67
  ? ({
66
68
  actions: serverActions || {},
67
69
  enqueueTask,
70
+ enqueueAction,
68
71
  } as MutatorContext['server'])
69
72
  : undefined,
70
73
  }
@@ -80,7 +83,7 @@ export function createMutators<Models extends GenericModels>({
80
83
 
81
84
  function withDevelopmentLogging<Args extends any[]>(
82
85
  name: string,
83
- fn: (...args: Args) => Promise<void>,
86
+ fn: (...args: Args) => Promise<void>
84
87
  ) {
85
88
  if (process.env.NODE_ENV !== 'development' && !process.env.IS_TESTING) {
86
89
  return fn
@@ -131,7 +134,7 @@ export function createMutators<Models extends GenericModels>({
131
134
  fn: (...args: Args) => Promise<void>,
132
135
  // don't want this too high - zero runs mutations in order and waits for the last to finish it seems
133
136
  // so if one mutation gets stuck it will just sit there
134
- timeoutMs: number = time.ms.minutes(1),
137
+ timeoutMs: number = time.ms.minutes(1)
135
138
  ) {
136
139
  return async (...args: Args): Promise<void> => {
137
140
  let timeoutId: ReturnType<typeof setTimeout> | undefined
@@ -152,7 +155,7 @@ export function createMutators<Models extends GenericModels>({
152
155
  function withValidation<Args extends any[]>(
153
156
  tableName: string,
154
157
  mutatorName: string,
155
- fn: (...args: Args) => Promise<void>,
158
+ fn: (...args: Args) => Promise<void>
156
159
  ) {
157
160
  const validator = mutationValidators?.[tableName]?.[mutatorName]
158
161
 
@@ -200,9 +203,9 @@ export function createMutators<Models extends GenericModels>({
200
203
  withValidation(
201
204
  moduleName,
202
205
  name,
203
- withContext((...args: any[]) => getDynamicFn()(...args)),
204
- ),
205
- ),
206
+ withContext((...args: any[]) => getDynamicFn()(...args))
207
+ )
208
+ )
206
209
  )
207
210
  }
208
211
  }
@@ -0,0 +1,9 @@
1
+ export const ellipsis = (str: string, maxLength: number): string => {
2
+ // avoid running replace on huge string if its long
3
+ const shortened = str.length > 500 ? str.slice(0, 500) : str
4
+ const cleaned = shortened.replace(/\s+/g, ' ').trim()
5
+ if (cleaned.length > maxLength) {
6
+ return cleaned.substring(0, maxLength - 3) + '…'
7
+ }
8
+ return cleaned
9
+ }
@@ -0,0 +1,106 @@
1
+ import { dequal } from 'dequal'
2
+ import { useLayoutEffect, useState } from 'react'
3
+
4
+ type EmitterOptions<T> = {
5
+ name: string
6
+ silent?: boolean
7
+ comparator?: (a: T, b: T) => boolean
8
+ }
9
+
10
+ type CreateEmitterOptions<T> = Omit<EmitterOptions<T>, 'name'>
11
+
12
+ export class Emitter<const T> {
13
+ private listeners = new Set<(value: T) => void>()
14
+ value: T
15
+ options?: EmitterOptions<T>
16
+
17
+ constructor(value: T, options?: EmitterOptions<T>) {
18
+ this.value = value
19
+ this.options = options
20
+ }
21
+
22
+ listen = (listener: (value: T) => void): (() => void) => {
23
+ this.listeners.add(listener)
24
+ return () => {
25
+ this.listeners.delete(listener)
26
+ }
27
+ }
28
+
29
+ emit = (next: T): void => {
30
+ if (process.env.NODE_ENV === 'development') {
31
+ setCache(this, next)
32
+ }
33
+ const compare = this.options?.comparator
34
+ if (compare) {
35
+ if (this.value && compare(this.value, next)) {
36
+ return
37
+ }
38
+ } else if (this.value === next && process.env.NODE_ENV === 'development') {
39
+ console.warn(
40
+ `[emitter] ${this.options?.name} no comparator option but received same value`
41
+ )
42
+ }
43
+ this.value = next
44
+ this.listeners.forEach((listener) => listener(next))
45
+ }
46
+ }
47
+
48
+ export function createEmitter<T>(
49
+ name: string,
50
+ defaultValue: T,
51
+ options?: CreateEmitterOptions<T>
52
+ ): Emitter<T> {
53
+ const existing = createOrUpdateCache(name, defaultValue) as T
54
+ return new Emitter(existing || defaultValue, { name, ...options })
55
+ }
56
+
57
+ type EmitterValue<E extends Emitter<any>> = E extends Emitter<infer Value> ? Value : never
58
+
59
+ export function useEmitterValue<E extends Emitter<any>>(
60
+ emitter: E,
61
+ options?: { disable?: boolean }
62
+ ): EmitterValue<E> {
63
+ const disabled = options?.disable
64
+ const [state, setState] = useState<EmitterValue<E>>(() => emitter.value)
65
+
66
+ useLayoutEffect(() => {
67
+ if (disabled) return
68
+
69
+ if (emitter.value !== state) {
70
+ setState(emitter.value)
71
+ }
72
+
73
+ return emitter.listen(setState)
74
+ }, [disabled, emitter])
75
+
76
+ return state
77
+ }
78
+
79
+ const hmrCache =
80
+ process.env.NODE_ENV === 'development'
81
+ ? new Map<string, { originalDefaultValue: unknown; currentValue: unknown }>()
82
+ : null
83
+
84
+ function setCache(emitter: Emitter<any>, value: unknown) {
85
+ const name = emitter.options?.name
86
+ if (!name) return
87
+ const cache = hmrCache?.get(name)
88
+ if (!cache) return
89
+ cache.currentValue = value
90
+ }
91
+
92
+ function createOrUpdateCache(name: string, defaultValueProp: unknown) {
93
+ const existing = hmrCache?.get(name)
94
+ const defaultValue = dequal(existing?.originalDefaultValue, defaultValueProp)
95
+ ? existing?.currentValue
96
+ : defaultValueProp
97
+
98
+ if (!existing) {
99
+ hmrCache?.set(name, {
100
+ originalDefaultValue: defaultValueProp,
101
+ currentValue: defaultValue,
102
+ })
103
+ }
104
+
105
+ return defaultValue
106
+ }
@@ -0,0 +1,10 @@
1
+ import { EnsureError } from './errors'
2
+
3
+ export function ensure<T>(
4
+ value: T,
5
+ msg = ''
6
+ ): asserts value is Exclude<T, null | undefined | false> {
7
+ if (!value) {
8
+ throw new EnsureError(`ensure() invalid: (${value}): ${msg} ${new Error().stack}`)
9
+ }
10
+ }
@@ -1,5 +1,4 @@
1
- import { ensure } from '@take-out/helpers'
2
-
1
+ import { ensure } from './ensure'
3
2
  import { mutatorContext } from './mutatorContext'
4
3
 
5
4
  import type { AuthData } from '../types'
@@ -0,0 +1,13 @@
1
+ export class AbortError extends Error {
2
+ constructor(message = '') {
3
+ super(message)
4
+ this.name = 'AbortError'
5
+ }
6
+ }
7
+
8
+ export class EnsureError extends Error {
9
+ constructor(message: string) {
10
+ super(message)
11
+ this.name = 'EnsureError'
12
+ }
13
+ }
@@ -0,0 +1,56 @@
1
+ import React from 'react'
2
+
3
+ export const getCurrentComponentStack = (format?: 'short'): string => {
4
+ if (process.env.NODE_ENV === 'development') {
5
+ // react 19.1+ exposes captureOwnerStack as a public api
6
+ const captureOwnerStack = (React as Record<string, any>).captureOwnerStack
7
+ const stack = typeof captureOwnerStack === 'function' ? captureOwnerStack() : null
8
+
9
+ if (!stack) return ''
10
+
11
+ if (format === 'short') {
12
+ return formatStackToShort(stack)
13
+ }
14
+
15
+ return stack
16
+ }
17
+
18
+ return `(prod, no stack)`
19
+ }
20
+
21
+ const formatStackToShort = (stack: string): string => {
22
+ if (process.env.NODE_ENV === 'development') {
23
+ const lines = stack
24
+ // huge stack was causing issues
25
+ .slice(0, 6000)
26
+ .split('\n')
27
+
28
+ const componentNames: string[] = []
29
+
30
+ for (const line of lines) {
31
+ // Extract component names from patterns like "at ComponentName ("
32
+ // Also handle cases like "at Route((chat))" or "Route() ("
33
+ const match = line.match(/\s*at\s+([A-Z][a-zA-Z0-9_]*)\s*\(/)
34
+ if (match) {
35
+ const componentName = match[1]
36
+ // Filter out framework internals and keep user components
37
+ if (
38
+ componentName &&
39
+ componentName !== 'Array' &&
40
+ componentName !== 'Root' &&
41
+ componentName !== 'Route'
42
+ ) {
43
+ componentNames.push(componentName)
44
+ if (componentNames.length > 10) {
45
+ // avoid too many
46
+ break
47
+ }
48
+ }
49
+ }
50
+ }
51
+
52
+ return componentNames.join(' < ')
53
+ }
54
+
55
+ return stack
56
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Helper to store a value that's not duplicated within the global context Uses
3
+ * a symbol stored on `globalThis` to achieve it.
4
+ *
5
+ * There's two main uses for this (for us, so far):
6
+ *
7
+ * - in dev mode, HMR re-runs files, but you may want to preserve globals
8
+ *
9
+ * - in published node modules, sometimes Vite or other bundlers can cause
10
+ * duplicate dependencies either through bad setup or heuristics, they may
11
+ * compile a module but then another code path doesn't compile it, so you
12
+ * have duplicate modules. in this case it can be good to just use a
13
+ * globalValue and warn the end-user. because you can't account for ever
14
+ * possible weird configuration, and often fixing that config can be a
15
+ * massive pain in the ass, it's better to retain functionality while
16
+ * warning them so they can fix it at their own pace. this often happens
17
+ * with WeakMaps.
18
+ *
19
+ */
20
+
21
+ export function globalValue<T>(
22
+ key: string,
23
+ factory: () => T,
24
+ opts?: {
25
+ warnMessage?: string
26
+ }
27
+ ): T {
28
+ const symbolKey = Symbol.for(key)
29
+ const g = globalThis as Record<symbol, unknown>
30
+
31
+ if (!g[symbolKey]) {
32
+ g[symbolKey] = factory()
33
+ } else {
34
+ if (opts?.warnMessage) {
35
+ console.warn(`[globalValue] ${opts.warnMessage}`)
36
+ }
37
+ }
38
+
39
+ return g[symbolKey] as T
40
+ }
@@ -0,0 +1,14 @@
1
+ export function mapObject<T extends Record<string, any>, R>(
2
+ obj: T,
3
+ fn: <K extends keyof T>(value: T[K], key: K) => R
4
+ ): { [K in keyof T]: R } {
5
+ const result = {} as { [K in keyof T]: R }
6
+
7
+ for (const key in obj) {
8
+ if (Object.hasOwn(obj, key)) {
9
+ result[key] = fn(obj[key], key)
10
+ }
11
+ }
12
+
13
+ return result
14
+ }