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
@@ -1,6 +1,9 @@
1
- import { describe, expect, test } from 'vitest'
1
+ import { runInNewContext } from 'node:vm'
2
+
3
+ import { afterEach, describe, expect, test, vi } from 'vitest'
2
4
 
3
5
  import { generateLite } from './generate-lite'
6
+
4
7
  import type { LiteParseFn, LiteParsedFile } from './generate-lite'
5
8
 
6
9
  // minimal hand-rolled "parser" backed by a lookup table. the real caller
@@ -19,15 +22,19 @@ function makeParse(table: Record<string, LiteParsedFile>): LiteParseFn {
19
22
 
20
23
  const DIR = '/proj/src/data'
21
24
 
25
+ afterEach(() => {
26
+ vi.restoreAllMocks()
27
+ })
28
+
22
29
  describe('generateLite', () => {
23
30
  test('emits models.ts, syncedMutations.ts, and README.md from inline types', () => {
24
31
  const files: Record<string, string> = {
25
- [`${DIR}/models/todo.ts`]: '// fake source, parser returns fixture',
26
- [`${DIR}/models/user.ts`]: '// fake source, parser returns fixture',
32
+ [`${DIR}/todo.ts`]: '// fake source, parser returns fixture',
33
+ [`${DIR}/user.ts`]: '// fake source, parser returns fixture',
27
34
  }
28
35
 
29
36
  const fixtures: Record<string, LiteParsedFile> = {
30
- [`${DIR}/models/todo.ts`]: {
37
+ [`${DIR}/todo.ts`]: {
31
38
  mutations: [
32
39
  {
33
40
  modelName: 'todo',
@@ -46,7 +53,7 @@ describe('generateLite', () => {
46
53
  ],
47
54
  queries: [],
48
55
  },
49
- [`${DIR}/models/user.ts`]: {
56
+ [`${DIR}/user.ts`]: {
50
57
  mutations: [
51
58
  {
52
59
  modelName: 'user',
@@ -73,14 +80,17 @@ describe('generateLite', () => {
73
80
  // output file set
74
81
  expect(Object.keys(result.files).sort()).toEqual([
75
82
  'README.md',
83
+ 'groupedQueries.ts',
84
+ 'instances.ts',
76
85
  'models.ts',
77
86
  'syncedMutations.ts',
87
+ 'syncedQueries.ts',
78
88
  ])
79
89
 
80
90
  // models.ts: aliases the user import without changing the model key
81
91
  const models = result.files['models.ts']!
82
- expect(models).toContain("import * as todo from '../models/todo'")
83
- expect(models).toContain("import * as userPublic from '../models/user'")
92
+ expect(models).toContain("import * as todo from '../todo'")
93
+ expect(models).toContain("import * as userPublic from '../user'")
84
94
  expect(models).toContain('user: userPublic,')
85
95
  expect(models).not.toContain('\n userPublic,')
86
96
  expect(models).toContain('export const models = {')
@@ -103,12 +113,12 @@ describe('generateLite', () => {
103
113
 
104
114
  test('parses newline-separated mutation object types', () => {
105
115
  const files: Record<string, string> = {
106
- [`${DIR}/models/agentEvent.ts`]: '// fake',
107
- [`${DIR}/models/deployment.ts`]: '// fake',
116
+ [`${DIR}/agentEvent.ts`]: '// fake',
117
+ [`${DIR}/deployment.ts`]: '// fake',
108
118
  }
109
119
 
110
120
  const fixtures: Record<string, LiteParsedFile> = {
111
- [`${DIR}/models/agentEvent.ts`]: {
121
+ [`${DIR}/agentEvent.ts`]: {
112
122
  mutations: [
113
123
  {
114
124
  modelName: 'agentEvent',
@@ -127,7 +137,7 @@ describe('generateLite', () => {
127
137
  ],
128
138
  queries: [],
129
139
  },
130
- [`${DIR}/models/deployment.ts`]: {
140
+ [`${DIR}/deployment.ts`]: {
131
141
  mutations: [
132
142
  {
133
143
  modelName: 'deployment',
@@ -167,11 +177,11 @@ describe('generateLite', () => {
167
177
 
168
178
  test('parses object intersections and skips index signatures', () => {
169
179
  const files: Record<string, string> = {
170
- [`${DIR}/models/agent.ts`]: '// fake',
180
+ [`${DIR}/agent.ts`]: '// fake',
171
181
  }
172
182
 
173
183
  const fixtures: Record<string, LiteParsedFile> = {
174
- [`${DIR}/models/agent.ts`]: {
184
+ [`${DIR}/agent.ts`]: {
175
185
  mutations: [
176
186
  {
177
187
  modelName: 'agent',
@@ -211,11 +221,11 @@ describe('generateLite', () => {
211
221
 
212
222
  test('falls back to v.unknown() for type references', () => {
213
223
  const files: Record<string, string> = {
214
- [`${DIR}/models/post.ts`]: '// fake',
224
+ [`${DIR}/post.ts`]: `export const allPosts = () => zql.post`,
215
225
  }
216
226
 
217
227
  const fixtures: Record<string, LiteParsedFile> = {
218
- [`${DIR}/models/post.ts`]: {
228
+ [`${DIR}/post.ts`]: {
219
229
  mutations: [
220
230
  {
221
231
  modelName: 'post',
@@ -253,11 +263,11 @@ describe('generateLite', () => {
253
263
 
254
264
  test('uses v.unknown() for explicitly unknown mutation params', () => {
255
265
  const files: Record<string, string> = {
256
- [`${DIR}/models/project.ts`]: '// fake',
266
+ [`${DIR}/project.ts`]: '// fake',
257
267
  }
258
268
 
259
269
  const fixtures: Record<string, LiteParsedFile> = {
260
- [`${DIR}/models/project.ts`]: {
270
+ [`${DIR}/project.ts`]: {
261
271
  mutations: [
262
272
  {
263
273
  modelName: 'project',
@@ -280,16 +290,11 @@ describe('generateLite', () => {
280
290
 
281
291
  test('emits query files with v.unknown() fallback for references', () => {
282
292
  const files: Record<string, string> = {
283
- [`${DIR}/models/post.ts`]: '// fake',
284
- [`${DIR}/queries/post.ts`]: '// fake',
293
+ [`${DIR}/post.ts`]: '// fake',
285
294
  }
286
295
 
287
296
  const fixtures: Record<string, LiteParsedFile> = {
288
- [`${DIR}/models/post.ts`]: {
289
- mutations: [],
290
- queries: [],
291
- },
292
- [`${DIR}/queries/post.ts`]: {
297
+ [`${DIR}/post.ts`]: {
293
298
  mutations: [],
294
299
  queries: [
295
300
  // no-arg query → void
@@ -323,7 +328,8 @@ describe('generateLite', () => {
323
328
  expect(result.files['syncedQueries.ts']).toBeDefined()
324
329
 
325
330
  const grouped = result.files['groupedQueries.ts']!
326
- expect(grouped).toContain("export * as post from '../queries/post'")
331
+ expect(grouped).toContain("import * as postSource from '../post'")
332
+ expect(grouped).toContain('postById: postSource.postById')
327
333
 
328
334
  const synced = result.files['syncedQueries.ts']!
329
335
  expect(synced).toContain('allPosts: defineQuery(() => Queries.post.allPosts())')
@@ -345,11 +351,11 @@ describe('generateLite', () => {
345
351
 
346
352
  test('emits types.ts and tables.ts when a model declares a schema inline', () => {
347
353
  const files: Record<string, string> = {
348
- [`${DIR}/models/task.ts`]: '// fake',
354
+ [`${DIR}/task.ts`]: '// fake',
349
355
  }
350
356
 
351
357
  const fixtures: Record<string, LiteParsedFile> = {
352
- [`${DIR}/models/task.ts`]: {
358
+ [`${DIR}/task.ts`]: {
353
359
  mutations: [
354
360
  {
355
361
  modelName: 'task',
@@ -385,7 +391,7 @@ describe('generateLite', () => {
385
391
  expect(types).toContain('export type Task = TableInsertRow<typeof schema.task>')
386
392
 
387
393
  const tables = result.files['tables.ts']!
388
- expect(tables).toContain("export { schema as task } from '../models/task'")
394
+ expect(tables).toContain("export { schema as task } from '../task'")
389
395
 
390
396
  // crud validators emitted in syncedMutations.ts
391
397
  const synced = result.files['syncedMutations.ts']!
@@ -396,18 +402,18 @@ describe('generateLite', () => {
396
402
  expect(result.mutationCount).toBe(3)
397
403
  })
398
404
 
399
- test('ignores nested files and non-ts files inside the models directory', () => {
405
+ test('ignores private files inside a namespace folder', () => {
400
406
  const files: Record<string, string> = {
401
- [`${DIR}/models/post.ts`]: '// fake',
402
- [`${DIR}/models/README.md`]: 'not a model',
403
- [`${DIR}/models/helpers/util.ts`]: 'nested should be ignored',
404
- [`${DIR}/models/post.d.ts`]: 'declaration file, ignored',
405
- [`${DIR}/models/post.test.ts`]: 'test file, ignored',
406
- [`${DIR}/models/post.spec.ts`]: 'spec file, ignored',
407
+ [`${DIR}/post/mutations.ts`]: '// fake',
408
+ [`${DIR}/post/README.md`]: 'not a model',
409
+ [`${DIR}/post/helpers/util.ts`]: 'private helper, ignored',
410
+ [`${DIR}/post/post.d.ts`]: 'declaration file, ignored',
411
+ [`${DIR}/post/post.test.ts`]: 'test file, ignored',
412
+ [`${DIR}/post/post.spec.ts`]: 'spec file, ignored',
407
413
  }
408
414
 
409
415
  const fixtures: Record<string, LiteParsedFile> = {
410
- [`${DIR}/models/post.ts`]: {
416
+ [`${DIR}/post/mutations.ts`]: {
411
417
  mutations: [{ modelName: 'post', handlers: [], schema: null }],
412
418
  queries: [],
413
419
  },
@@ -421,20 +427,20 @@ describe('generateLite', () => {
421
427
 
422
428
  expect(result.modelCount).toBe(1)
423
429
  const models = result.files['models.ts']!
424
- expect(models).toContain("import * as post from '../models/post'")
430
+ expect(models).toContain("import * as post from '../post/mutations'")
425
431
  expect(models).not.toContain('util')
426
432
  expect(models).not.toContain('README')
427
433
  expect(models).not.toContain('post.test')
428
434
  expect(models).not.toContain('post.spec')
429
435
  })
430
436
 
431
- test('infers mutations/ directory when present', () => {
437
+ test('supports a split namespace folder', () => {
432
438
  const files: Record<string, string> = {
433
- [`${DIR}/mutations/post.ts`]: '// fake',
439
+ [`${DIR}/post/mutations.ts`]: '// fake',
434
440
  }
435
441
 
436
442
  const fixtures: Record<string, LiteParsedFile> = {
437
- [`${DIR}/mutations/post.ts`]: {
443
+ [`${DIR}/post/mutations.ts`]: {
438
444
  mutations: [
439
445
  {
440
446
  modelName: 'post',
@@ -452,8 +458,381 @@ describe('generateLite', () => {
452
458
  parse: makeParse(fixtures),
453
459
  })
454
460
 
455
- // should use mutations dir path in re-exports
456
461
  const models = result.files['models.ts']!
457
- expect(models).toContain("from '../mutations/post'")
462
+ expect(models).toContain("from '../post/mutations'")
463
+ })
464
+
465
+ test('derives single-file namespaces from data exports', () => {
466
+ const files = {
467
+ [`${DIR}/server.ts`]: `export const serverRows = () => zql.server`,
468
+ [`${DIR}/types.ts`]: `export const formatRow = (value: string) => value`,
469
+ }
470
+ const result = generateLite({
471
+ files,
472
+ dir: DIR,
473
+ parse: makeParse({
474
+ [`${DIR}/server.ts`]: {
475
+ mutations: [],
476
+ queries: [{ name: 'serverRows', paramTypeText: null }],
477
+ },
478
+ [`${DIR}/types.ts`]: {
479
+ mutations: [],
480
+ queries: [],
481
+ },
482
+ }),
483
+ })
484
+
485
+ expect(result.modelCount).toBe(1)
486
+ expect(result.queryCount).toBe(1)
487
+ })
488
+
489
+ test('warns once and ignores an unparseable non-data file', () => {
490
+ const warn = vi.spyOn(console, 'warn').mockImplementation(() => {})
491
+ const result = generateLite({
492
+ files: {
493
+ [`${DIR}/server.ts`]: `export const serverRows = () => zql.server`,
494
+ [`${DIR}/types.ts`]: `export type Broken = {`,
495
+ },
496
+ dir: DIR,
497
+ parse: (source, path) => {
498
+ if (path.endsWith('/types.ts')) throw new Error('parse failed')
499
+ return {
500
+ mutations: [],
501
+ queries: source.includes('zql.server')
502
+ ? [{ name: 'serverRows', paramTypeText: null }]
503
+ : [],
504
+ }
505
+ },
506
+ })
507
+
508
+ expect(result.modelCount).toBe(1)
509
+ expect(warn).toHaveBeenCalledOnce()
510
+ expect(warn).toHaveBeenCalledWith(
511
+ '[on-zero] ignoring data/types.ts: no recognized data exports'
512
+ )
513
+ warn.mockRestore()
514
+ })
515
+
516
+ test('rejects the removed top-level layout', () => {
517
+ expect(() =>
518
+ generateLite({
519
+ files: { [`${DIR}/queries/post.ts`]: '// fake' },
520
+ dir: DIR,
521
+ parse: makeParse({}),
522
+ })
523
+ ).toThrow(/removed top-level queries\/ layout/)
524
+ })
525
+
526
+ test('derives scoped related-table closure from lite metadata', () => {
527
+ const files = {
528
+ [`${DIR}/on-zero.config.ts`]: `export default defineConfig({ instances: { project: { scope: 'projectId' } } })`,
529
+ [`${DIR}/project/message/queries.ts`]: `export const messages = () => zql.message.related('comments')`,
530
+ [`${DIR}/project/message/mutations.ts`]: '// fake mutation',
531
+ ['/proj/src/database/relations.ts']: '// fake relations',
532
+ ['/proj/src/database/schema.ts']: '// fake tables',
533
+ }
534
+ const empty = { mutations: [], queries: [] }
535
+ const result = generateLite({
536
+ files,
537
+ dir: DIR,
538
+ parse: makeParse({
539
+ [`${DIR}/on-zero.config.ts`]: {
540
+ ...empty,
541
+ dataConfig: { instances: { project: { scope: 'projectId' } } },
542
+ },
543
+ [`${DIR}/project/message/queries.ts`]: {
544
+ ...empty,
545
+ queries: [
546
+ {
547
+ name: 'messages',
548
+ paramTypeText: null,
549
+ relatedPaths: [['comments', 'author']],
550
+ },
551
+ ],
552
+ },
553
+ [`${DIR}/project/message/mutations.ts`]: {
554
+ ...empty,
555
+ mutations: [
556
+ {
557
+ modelName: 'message',
558
+ handlers: [],
559
+ schema: {
560
+ tableName: 'message',
561
+ primaryKeys: ['id'],
562
+ columns: [
563
+ { name: 'id', builderText: 'string()' },
564
+ { name: 'projectId', builderText: 'string()' },
565
+ ],
566
+ },
567
+ },
568
+ ],
569
+ },
570
+ '/proj/src/database/relations.ts': {
571
+ ...empty,
572
+ relations: [
573
+ { sourceTable: 'message', name: 'comments', targetTable: 'comment' },
574
+ { sourceTable: 'comment', name: 'author', targetTable: 'userPublic' },
575
+ ],
576
+ },
577
+ '/proj/src/database/schema.ts': {
578
+ ...empty,
579
+ tables: [
580
+ { name: 'comment', columns: ['id', 'projectId'] },
581
+ { name: 'userPublic', columns: ['id', 'projectId'] },
582
+ ],
583
+ },
584
+ }),
585
+ })
586
+
587
+ expect(result.files['instances.ts']).toContain(
588
+ 'syncTables: ["comment","message","userPublic"]'
589
+ )
590
+ // the returned membership mirrors what instances.ts serializes, so hosts
591
+ // read it structurally instead of re-parsing the emitted source
592
+ const instance = result.instances.find((entry) => entry.name === 'project')
593
+ expect(instance?.syncTables).toEqual(['comment', 'message', 'userPublic'])
594
+ expect(instance?.supportTables).toEqual([])
595
+ })
596
+
597
+ test('derives fileless support tables through parsed mutation helpers', () => {
598
+ const files = {
599
+ [`${DIR}/post.ts`]: '// namespace',
600
+ [`${DIR}/helpers/writeAudit.ts`]: '// helper',
601
+ [`${DIR}/helpers/readSettings.ts`]: '// nested helper',
602
+ }
603
+ const empty = { mutations: [], queries: [] }
604
+ const result = generateLite({
605
+ files,
606
+ dir: DIR,
607
+ parse: makeParse({
608
+ [`${DIR}/post.ts`]: {
609
+ ...empty,
610
+ mutations: [{ modelName: 'post', handlers: [], schema: null }],
611
+ imports: ['./helpers/writeAudit'],
612
+ supportTables: ['post'],
613
+ },
614
+ [`${DIR}/helpers/writeAudit.ts`]: {
615
+ ...empty,
616
+ imports: ['./readSettings'],
617
+ supportTables: ['audit'],
618
+ },
619
+ [`${DIR}/helpers/readSettings.ts`]: {
620
+ ...empty,
621
+ supportTables: ['settings'],
622
+ },
623
+ }),
624
+ })
625
+ const runnable = result.files['instances.ts']!.replace(
626
+ "import { schema } from './schema'",
627
+ ''
628
+ )
629
+ .replace("import * as groupedQueries from './groupedQueries'", '')
630
+ .replace("import { models } from './models'", '')
631
+ .replace('export const instances =', 'globalThis.instances =')
632
+ .replace(/: string/g, '')
633
+ .replace(' as const', '')
634
+ const context = {
635
+ groupedQueries: {},
636
+ models: { post: {} },
637
+ schema: {},
638
+ } as { instances?: Record<string, { supportTables: string[] }> }
639
+
640
+ runInNewContext(runnable, context)
641
+
642
+ expect(context.instances?.default?.supportTables).toEqual(['audit', 'settings'])
643
+ })
644
+
645
+ test('includes a fileless support table in every lite instance that uses it', () => {
646
+ const files = {
647
+ [`${DIR}/on-zero.config.ts`]: `export default defineConfig({ instances: { control: { dir: './planes/control', supportTables: ['manual'] }, project: { scope: 'projectId' } } })`,
648
+ [`${DIR}/planes/control/account.ts`]: '// control namespace',
649
+ [`${DIR}/project/message.ts`]: '// project namespace',
650
+ ['/proj/src/database/schema.ts']: '// table columns',
651
+ }
652
+ const empty = { mutations: [], queries: [] }
653
+
654
+ const result = generateLite({
655
+ files,
656
+ dir: DIR,
657
+ parse: makeParse({
658
+ [`${DIR}/on-zero.config.ts`]: {
659
+ ...empty,
660
+ dataConfig: {
661
+ instances: {
662
+ control: { dir: './planes/control', supportTables: ['manual'] },
663
+ project: { scope: 'projectId' },
664
+ },
665
+ },
666
+ },
667
+ [`${DIR}/planes/control/account.ts`]: {
668
+ ...empty,
669
+ mutations: [{ modelName: 'account', handlers: [], schema: null }],
670
+ supportTables: ['audit'],
671
+ },
672
+ [`${DIR}/project/message.ts`]: {
673
+ ...empty,
674
+ mutations: [
675
+ {
676
+ modelName: 'message',
677
+ handlers: [],
678
+ schema: {
679
+ tableName: 'message',
680
+ primaryKeys: ['id'],
681
+ columns: [
682
+ { name: 'id', builderText: 'string()' },
683
+ { name: 'projectId', builderText: 'string()' },
684
+ ],
685
+ },
686
+ },
687
+ ],
688
+ supportTables: ['audit'],
689
+ },
690
+ '/proj/src/database/schema.ts': {
691
+ ...empty,
692
+ tables: [{ name: 'message', columns: ['id', 'projectId'] }],
693
+ },
694
+ }),
695
+ })
696
+ const runnable = result.files['instances.ts']!.replace(
697
+ "import { schema } from './schema'",
698
+ ''
699
+ )
700
+ .replace("import * as groupedQueries from './groupedQueries'", '')
701
+ .replace("import { models } from './models'", '')
702
+ .replace('export const instances =', 'globalThis.instances =')
703
+ .replace(/: string/g, '')
704
+ .replace(' as const', '')
705
+ const context = {
706
+ groupedQueries: {},
707
+ models: { account: {}, message: {} },
708
+ schema: {},
709
+ } as { instances?: Record<string, { supportTables: string[] }> }
710
+
711
+ runInNewContext(runnable, context)
712
+
713
+ expect(context.instances?.control?.supportTables).toEqual(['audit', 'manual'])
714
+ expect(context.instances?.project?.supportTables).toEqual(['audit'])
715
+ })
716
+
717
+ test('keeps a configured default lite instance at the data root', () => {
718
+ const files = {
719
+ [`${DIR}/on-zero.config.ts`]: `export default defineConfig({ instances: { default: { dir: '.', supportTables: ['accountRepo', 'usageLedger'] }, project: { scope: 'projectId' } } })`,
720
+ [`${DIR}/account.ts`]: '// control namespace',
721
+ [`${DIR}/project/message.ts`]: '// project namespace',
722
+ }
723
+ const empty = { mutations: [], queries: [] }
724
+ const result = generateLite({
725
+ files,
726
+ dir: DIR,
727
+ parse: makeParse({
728
+ [`${DIR}/on-zero.config.ts`]: {
729
+ ...empty,
730
+ dataConfig: {
731
+ instances: {
732
+ default: { dir: '.', supportTables: ['accountRepo', 'usageLedger'] },
733
+ project: { scope: 'projectId' },
734
+ },
735
+ },
736
+ },
737
+ [`${DIR}/account.ts`]: {
738
+ ...empty,
739
+ queries: [{ name: 'accounts', paramTypeText: null }],
740
+ },
741
+ [`${DIR}/project/message.ts`]: {
742
+ ...empty,
743
+ mutations: [
744
+ {
745
+ modelName: 'message',
746
+ handlers: [],
747
+ schema: {
748
+ tableName: 'message',
749
+ primaryKeys: ['id'],
750
+ columns: [
751
+ { name: 'id', builderText: 'string()' },
752
+ { name: 'projectId', builderText: 'string()' },
753
+ ],
754
+ },
755
+ },
756
+ ],
757
+ },
758
+ }),
759
+ })
760
+ const runnable = result.files['instances.ts']!.replace(
761
+ "import { schema } from './schema'",
762
+ ''
763
+ )
764
+ .replace("import * as groupedQueries from './groupedQueries'", '')
765
+ .replace("import { models } from './models'", '')
766
+ .replace('export const instances =', 'globalThis.instances =')
767
+ .replace(/: string/g, '')
768
+ .replace(' as const', '')
769
+ const context = {
770
+ groupedQueries: {},
771
+ models: { message: {} },
772
+ schema: {},
773
+ } as { instances?: Record<string, { supportTables: string[] }> }
774
+
775
+ runInNewContext(runnable, context)
776
+
777
+ expect(context.instances?.default?.supportTables).toEqual([
778
+ 'accountRepo',
779
+ 'usageLedger',
780
+ ])
781
+ expect(context.instances?.project?.supportTables).toEqual([])
782
+ })
783
+
784
+ test('rejects missing configured directories and instance.ts remnants', () => {
785
+ const empty = { mutations: [], queries: [] }
786
+ expect(() =>
787
+ generateLite({
788
+ files: {
789
+ [`${DIR}/on-zero.config.ts`]: `export default defineConfig({ instances: { project: {} } })`,
790
+ },
791
+ dir: DIR,
792
+ parse: makeParse({
793
+ [`${DIR}/on-zero.config.ts`]: {
794
+ ...empty,
795
+ dataConfig: { instances: { project: {} } },
796
+ },
797
+ }),
798
+ })
799
+ ).toThrow(/instance 'project' directory does not exist/)
800
+
801
+ expect(() =>
802
+ generateLite({
803
+ files: {
804
+ [`${DIR}/on-zero.config.ts`]: `export default defineConfig({ instances: { control: { dir: './shared' }, project: { dir: './shared' } } })`,
805
+ [`${DIR}/shared/account.ts`]: '// namespace',
806
+ },
807
+ dir: DIR,
808
+ parse: makeParse({
809
+ [`${DIR}/on-zero.config.ts`]: {
810
+ ...empty,
811
+ dataConfig: {
812
+ instances: {
813
+ control: { dir: './shared' },
814
+ project: { dir: './shared' },
815
+ },
816
+ },
817
+ },
818
+ }),
819
+ })
820
+ ).toThrow(/instances 'control' and 'project' resolve to the same directory/)
821
+
822
+ expect(() =>
823
+ generateLite({
824
+ files: {
825
+ [`${DIR}/post.ts`]: '// namespace',
826
+ [`${DIR}/project/instance.ts`]: `export default defineInstance({})`,
827
+ },
828
+ dir: DIR,
829
+ parse: makeParse({
830
+ [`${DIR}/post.ts`]: {
831
+ ...empty,
832
+ mutations: [{ modelName: 'post', handlers: [], schema: null }],
833
+ },
834
+ }),
835
+ })
836
+ ).toThrow(/uses removed instance\.ts configuration/)
458
837
  })
459
838
  })