over-zero 0.0.10 → 0.0.11

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 (392) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/{build/schema.cjs → builder.cjs} +10 -7
  3. package/dist/cjs/{helpers/zeroEmitter.js → builder.js} +11 -7
  4. package/dist/cjs/builder.js.map +6 -0
  5. package/dist/cjs/builder.native.js +35 -0
  6. package/dist/cjs/builder.native.js.map +1 -0
  7. package/dist/cjs/cli.cjs +299 -0
  8. package/dist/cjs/cli.js +292 -0
  9. package/dist/cjs/cli.js.map +6 -0
  10. package/dist/cjs/cli.native.js +386 -0
  11. package/dist/cjs/cli.native.js.map +1 -0
  12. package/dist/cjs/createPermissions.cjs +22 -56
  13. package/dist/cjs/createPermissions.js +22 -64
  14. package/dist/cjs/createPermissions.js.map +1 -1
  15. package/dist/cjs/createPermissions.native.js +61 -87
  16. package/dist/cjs/createPermissions.native.js.map +1 -6
  17. package/dist/cjs/createZeroClient.cjs +41 -21
  18. package/dist/cjs/createZeroClient.js +23 -16
  19. package/dist/cjs/createZeroClient.js.map +1 -1
  20. package/dist/cjs/createZeroClient.native.js +139 -81
  21. package/dist/cjs/createZeroClient.native.js.map +1 -6
  22. package/dist/cjs/createZeroServer.cjs +40 -34
  23. package/dist/cjs/createZeroServer.js +35 -27
  24. package/dist/cjs/createZeroServer.js.map +2 -2
  25. package/dist/cjs/createZeroServer.native.js +119 -77
  26. package/dist/cjs/createZeroServer.native.js.map +1 -6
  27. package/dist/cjs/helpers/batchQuery.native.js +25 -18
  28. package/dist/cjs/helpers/batchQuery.native.js.map +1 -6
  29. package/dist/cjs/helpers/context.js.map +1 -1
  30. package/dist/cjs/helpers/context.native.js +20 -19
  31. package/dist/cjs/helpers/context.native.js.map +1 -6
  32. package/dist/cjs/helpers/createMutators.cjs +2 -2
  33. package/dist/cjs/helpers/createMutators.js +2 -2
  34. package/dist/cjs/helpers/createMutators.js.map +1 -1
  35. package/dist/cjs/helpers/createMutators.native.js +52 -41
  36. package/dist/cjs/helpers/createMutators.native.js.map +1 -6
  37. package/dist/cjs/helpers/didRunPermissionCheck.native.js +27 -22
  38. package/dist/cjs/helpers/didRunPermissionCheck.native.js.map +1 -6
  39. package/dist/cjs/helpers/ensureLoggedIn.cjs +2 -2
  40. package/dist/cjs/helpers/ensureLoggedIn.js +2 -2
  41. package/dist/cjs/helpers/ensureLoggedIn.js.map +1 -1
  42. package/dist/cjs/helpers/ensureLoggedIn.native.js +25 -18
  43. package/dist/cjs/helpers/ensureLoggedIn.native.js.map +1 -6
  44. package/dist/cjs/helpers/getQueryOrMutatorAuthData.cjs +30 -0
  45. package/dist/cjs/{build/schema.native.js → helpers/getQueryOrMutatorAuthData.js} +9 -13
  46. package/dist/cjs/helpers/getQueryOrMutatorAuthData.js.map +6 -0
  47. package/dist/cjs/helpers/getQueryOrMutatorAuthData.native.js +33 -0
  48. package/dist/cjs/helpers/getQueryOrMutatorAuthData.native.js.map +1 -0
  49. package/dist/cjs/helpers/mutatorContext.cjs +40 -0
  50. package/dist/cjs/helpers/mutatorContext.js +36 -0
  51. package/dist/cjs/helpers/mutatorContext.js.map +6 -0
  52. package/dist/cjs/helpers/mutatorContext.native.js +43 -0
  53. package/dist/cjs/helpers/mutatorContext.native.js.map +1 -0
  54. package/dist/cjs/helpers/prettyFormatZeroQuery.native.js +102 -82
  55. package/dist/cjs/helpers/prettyFormatZeroQuery.native.js.map +1 -6
  56. package/dist/cjs/helpers/queryContext.cjs +40 -0
  57. package/dist/cjs/helpers/{getDidRunPermissionCheck.native.js → queryContext.js} +21 -13
  58. package/dist/cjs/helpers/queryContext.js.map +6 -0
  59. package/dist/cjs/helpers/queryContext.native.js +43 -0
  60. package/dist/cjs/helpers/queryContext.native.js.map +1 -0
  61. package/dist/cjs/helpers/queryOrMutatorAuthData.js +1 -0
  62. package/dist/cjs/helpers/queryOrMutatorAuthData.native.js +2 -0
  63. package/dist/cjs/helpers/queryOrMutatorContext.js +1 -0
  64. package/dist/cjs/helpers/queryOrMutatorContext.native.js +2 -0
  65. package/dist/cjs/helpers/useZeroDebug.native.js +63 -50
  66. package/dist/cjs/helpers/useZeroDebug.native.js.map +1 -6
  67. package/dist/cjs/index.cjs +3 -2
  68. package/dist/cjs/index.js +3 -2
  69. package/dist/cjs/index.js.map +1 -1
  70. package/dist/cjs/index.native.js +21 -26
  71. package/dist/cjs/index.native.js.map +1 -6
  72. package/dist/cjs/mutations.cjs +1 -1
  73. package/dist/cjs/mutations.js +1 -1
  74. package/dist/cjs/mutations.js.map +1 -1
  75. package/dist/cjs/mutations.native.js +33 -28
  76. package/dist/cjs/mutations.native.js.map +1 -6
  77. package/dist/cjs/query.cjs +34 -0
  78. package/dist/cjs/{helpers/zeroEmitter.native.js → query.js} +13 -11
  79. package/dist/cjs/query.js.map +6 -0
  80. package/dist/cjs/query.native.js +39 -0
  81. package/dist/cjs/query.native.js.map +1 -0
  82. package/dist/cjs/{helpers/getDidRunPermissionCheck.cjs → queryBuilder.cjs} +10 -6
  83. package/dist/cjs/{build/schema.js → queryBuilder.js} +11 -7
  84. package/dist/cjs/queryBuilder.js.map +6 -0
  85. package/dist/cjs/queryBuilder.native.js +35 -0
  86. package/dist/cjs/queryBuilder.native.js.map +1 -0
  87. package/dist/cjs/server.native.js +13 -12
  88. package/dist/cjs/server.native.js.map +1 -6
  89. package/dist/cjs/state.cjs +52 -0
  90. package/dist/cjs/state.js +40 -0
  91. package/dist/cjs/state.js.map +6 -0
  92. package/dist/cjs/state.native.js +55 -0
  93. package/dist/cjs/state.native.js.map +1 -0
  94. package/dist/cjs/types.native.js +9 -5
  95. package/dist/cjs/types.native.js.map +1 -6
  96. package/dist/cjs/where.cjs +9 -2
  97. package/dist/cjs/where.js +8 -2
  98. package/dist/cjs/where.js.map +2 -2
  99. package/dist/cjs/where.native.js +29 -19
  100. package/dist/cjs/where.native.js.map +1 -6
  101. package/dist/cjs/{helpers/zeroEmitter.cjs → zql.cjs} +10 -6
  102. package/dist/cjs/{helpers/getDidRunPermissionCheck.js → zql.js} +11 -6
  103. package/dist/cjs/zql.js.map +6 -0
  104. package/dist/cjs/zql.native.js +35 -0
  105. package/dist/cjs/zql.native.js.map +1 -0
  106. package/dist/esm/builder.js +10 -0
  107. package/dist/esm/builder.js.map +6 -0
  108. package/dist/esm/builder.mjs +8 -0
  109. package/dist/esm/builder.mjs.map +1 -0
  110. package/dist/esm/builder.native.js +9 -0
  111. package/dist/esm/builder.native.js.map +1 -0
  112. package/dist/esm/cli.js +278 -0
  113. package/dist/esm/cli.js.map +6 -0
  114. package/dist/esm/cli.mjs +278 -0
  115. package/dist/esm/cli.mjs.map +1 -0
  116. package/dist/esm/cli.native.js +362 -0
  117. package/dist/esm/cli.native.js.map +1 -0
  118. package/dist/esm/createPermissions.js +21 -64
  119. package/dist/esm/createPermissions.js.map +1 -1
  120. package/dist/esm/createPermissions.mjs +20 -54
  121. package/dist/esm/createPermissions.mjs.map +1 -1
  122. package/dist/esm/createPermissions.native.js +26 -66
  123. package/dist/esm/createPermissions.native.js.map +1 -1
  124. package/dist/esm/createZeroClient.js +24 -16
  125. package/dist/esm/createZeroClient.js.map +1 -1
  126. package/dist/esm/createZeroClient.mjs +40 -20
  127. package/dist/esm/createZeroClient.mjs.map +1 -1
  128. package/dist/esm/createZeroClient.native.js +56 -25
  129. package/dist/esm/createZeroClient.native.js.map +1 -1
  130. package/dist/esm/createZeroServer.js +36 -19
  131. package/dist/esm/createZeroServer.js.map +1 -1
  132. package/dist/esm/createZeroServer.mjs +35 -18
  133. package/dist/esm/createZeroServer.mjs.map +1 -1
  134. package/dist/esm/createZeroServer.native.js +43 -23
  135. package/dist/esm/createZeroServer.native.js.map +1 -1
  136. package/dist/esm/helpers/context.js.map +1 -1
  137. package/dist/esm/helpers/context.mjs.map +1 -1
  138. package/dist/esm/helpers/context.native.js.map +1 -1
  139. package/dist/esm/helpers/createMutators.js +1 -1
  140. package/dist/esm/helpers/createMutators.mjs +1 -1
  141. package/dist/esm/helpers/createMutators.native.js +1 -1
  142. package/dist/esm/helpers/ensureLoggedIn.js +2 -2
  143. package/dist/esm/helpers/ensureLoggedIn.js.map +1 -1
  144. package/dist/esm/helpers/ensureLoggedIn.mjs +2 -2
  145. package/dist/esm/helpers/ensureLoggedIn.mjs.map +1 -1
  146. package/dist/esm/helpers/ensureLoggedIn.native.js +2 -2
  147. package/dist/esm/helpers/ensureLoggedIn.native.js.map +1 -1
  148. package/dist/esm/helpers/getQueryOrMutatorAuthData.js +9 -0
  149. package/dist/esm/helpers/getQueryOrMutatorAuthData.js.map +6 -0
  150. package/dist/esm/helpers/getQueryOrMutatorAuthData.mjs +7 -0
  151. package/dist/esm/helpers/getQueryOrMutatorAuthData.mjs.map +1 -0
  152. package/dist/esm/helpers/getQueryOrMutatorAuthData.native.js +7 -0
  153. package/dist/esm/helpers/getQueryOrMutatorAuthData.native.js.map +1 -0
  154. package/dist/esm/helpers/mutatorContext.js +20 -0
  155. package/dist/esm/helpers/mutatorContext.js.map +6 -0
  156. package/dist/esm/helpers/mutatorContext.mjs +15 -0
  157. package/dist/esm/helpers/mutatorContext.mjs.map +1 -0
  158. package/dist/esm/helpers/mutatorContext.native.js +15 -0
  159. package/dist/esm/helpers/mutatorContext.native.js.map +1 -0
  160. package/dist/esm/helpers/queryContext.js +20 -0
  161. package/dist/esm/helpers/queryContext.js.map +6 -0
  162. package/dist/esm/helpers/queryContext.mjs +15 -0
  163. package/dist/esm/helpers/queryContext.mjs.map +1 -0
  164. package/dist/esm/helpers/queryContext.native.js +15 -0
  165. package/dist/esm/helpers/queryContext.native.js.map +1 -0
  166. package/dist/esm/helpers/queryOrMutatorAuthData.js +1 -0
  167. package/dist/esm/helpers/queryOrMutatorAuthData.mjs +2 -0
  168. package/dist/esm/helpers/queryOrMutatorAuthData.native.js +2 -0
  169. package/dist/esm/helpers/queryOrMutatorContext.js +1 -0
  170. package/dist/esm/helpers/queryOrMutatorContext.mjs +2 -0
  171. package/dist/esm/helpers/queryOrMutatorContext.mjs.map +1 -0
  172. package/dist/esm/helpers/queryOrMutatorContext.native.js +2 -0
  173. package/dist/esm/helpers/queryOrMutatorContext.native.js.map +1 -0
  174. package/dist/esm/index.js +3 -2
  175. package/dist/esm/index.js.map +1 -1
  176. package/dist/esm/index.mjs +3 -2
  177. package/dist/esm/index.mjs.map +1 -1
  178. package/dist/esm/index.native.js +3 -2
  179. package/dist/esm/index.native.js.map +1 -1
  180. package/dist/esm/mutations.js +1 -1
  181. package/dist/esm/mutations.js.map +1 -1
  182. package/dist/esm/mutations.mjs +1 -1
  183. package/dist/esm/mutations.mjs.map +1 -1
  184. package/dist/esm/mutations.native.js +1 -1
  185. package/dist/esm/mutations.native.js.map +1 -1
  186. package/dist/esm/query.js +13 -0
  187. package/dist/esm/query.js.map +6 -0
  188. package/dist/esm/query.mjs +11 -0
  189. package/dist/esm/query.mjs.map +1 -0
  190. package/dist/esm/query.native.js +13 -0
  191. package/dist/esm/query.native.js.map +1 -0
  192. package/dist/esm/queryBuilder.js +10 -0
  193. package/dist/esm/queryBuilder.js.map +6 -0
  194. package/dist/esm/queryBuilder.mjs +8 -0
  195. package/dist/esm/queryBuilder.mjs.map +1 -0
  196. package/dist/esm/queryBuilder.native.js +9 -0
  197. package/dist/esm/queryBuilder.native.js.map +1 -0
  198. package/dist/esm/state.js +24 -0
  199. package/dist/esm/state.js.map +6 -0
  200. package/dist/esm/state.mjs +25 -0
  201. package/dist/esm/state.mjs.map +1 -0
  202. package/dist/esm/state.native.js +25 -0
  203. package/dist/esm/state.native.js.map +1 -0
  204. package/dist/esm/where.js +9 -2
  205. package/dist/esm/where.js.map +2 -2
  206. package/dist/esm/where.mjs +9 -2
  207. package/dist/esm/where.mjs.map +1 -1
  208. package/dist/esm/where.native.js +10 -2
  209. package/dist/esm/where.native.js.map +1 -1
  210. package/dist/esm/zql.js +10 -0
  211. package/dist/esm/zql.js.map +6 -0
  212. package/dist/esm/zql.mjs +8 -0
  213. package/dist/esm/zql.mjs.map +1 -0
  214. package/dist/esm/zql.native.js +9 -0
  215. package/dist/esm/zql.native.js.map +1 -0
  216. package/package.json +13 -3
  217. package/readme.md +460 -13
  218. package/src/cli.ts +511 -0
  219. package/src/createPermissions.ts +21 -123
  220. package/src/createZeroClient.tsx +107 -23
  221. package/src/createZeroServer.ts +64 -29
  222. package/src/helpers/createMutators.ts +1 -1
  223. package/src/helpers/ensureLoggedIn.ts +2 -2
  224. package/src/helpers/getQueryOrMutatorAuthData.ts +11 -0
  225. package/src/helpers/{context.ts → mutatorContext.ts} +2 -6
  226. package/src/index.ts +3 -2
  227. package/src/mutations.ts +1 -1
  228. package/src/state.ts +32 -0
  229. package/src/types.ts +11 -5
  230. package/src/where.ts +33 -8
  231. package/src/zql.ts +9 -0
  232. package/types/builder.d.ts +3 -0
  233. package/types/builder.d.ts.map +1 -0
  234. package/types/cli.d.ts +3 -0
  235. package/types/cli.d.ts.map +1 -0
  236. package/types/createPermissions.d.ts +3 -27
  237. package/types/createPermissions.d.ts.map +1 -1
  238. package/types/createZeroClient.d.ts +16 -4
  239. package/types/createZeroClient.d.ts.map +1 -1
  240. package/types/createZeroServer.d.ts +33 -6
  241. package/types/createZeroServer.d.ts.map +1 -1
  242. package/types/helpers/context.d.ts.map +1 -1
  243. package/types/helpers/getQueryOrMutatorAuthData.d.ts +3 -0
  244. package/types/helpers/getQueryOrMutatorAuthData.d.ts.map +1 -0
  245. package/types/helpers/mutatorContext.d.ts +5 -0
  246. package/types/helpers/mutatorContext.d.ts.map +1 -0
  247. package/types/helpers/queryContext.d.ts +5 -0
  248. package/types/helpers/queryContext.d.ts.map +1 -0
  249. package/types/index.d.ts +3 -2
  250. package/types/index.d.ts.map +1 -1
  251. package/types/state.d.ts +8 -0
  252. package/types/state.d.ts.map +1 -0
  253. package/types/types.d.ts +5 -4
  254. package/types/types.d.ts.map +1 -1
  255. package/types/where.d.ts +3 -2
  256. package/types/where.d.ts.map +1 -1
  257. package/types/zql.d.ts +3 -0
  258. package/types/zql.d.ts.map +1 -0
  259. package/dist/cjs/build/readPermissions.cjs +0 -51
  260. package/dist/cjs/build/readPermissions.js +0 -48
  261. package/dist/cjs/build/readPermissions.js.map +0 -6
  262. package/dist/cjs/build/readPermissions.native.js +0 -56
  263. package/dist/cjs/build/readPermissions.native.js.map +0 -6
  264. package/dist/cjs/build/schema.js.map +0 -6
  265. package/dist/cjs/build/schema.native.js.map +0 -6
  266. package/dist/cjs/createClient.cjs +0 -89
  267. package/dist/cjs/createClient.js +0 -76
  268. package/dist/cjs/createClient.js.map +0 -6
  269. package/dist/cjs/createClient.native.js +0 -81
  270. package/dist/cjs/createClient.native.js.map +0 -6
  271. package/dist/cjs/createMutations.cjs +0 -50
  272. package/dist/cjs/createMutations.js +0 -43
  273. package/dist/cjs/createMutations.js.map +0 -6
  274. package/dist/cjs/createMutations.native.js +0 -50
  275. package/dist/cjs/createMutations.native.js.map +0 -6
  276. package/dist/cjs/createServer.cjs +0 -92
  277. package/dist/cjs/createServer.js +0 -71
  278. package/dist/cjs/createServer.js.map +0 -6
  279. package/dist/cjs/createServer.native.js +0 -75
  280. package/dist/cjs/createServer.native.js.map +0 -6
  281. package/dist/cjs/createZero.cjs +0 -128
  282. package/dist/cjs/createZero.js +0 -107
  283. package/dist/cjs/createZero.js.map +0 -6
  284. package/dist/cjs/createZero.native.js +0 -115
  285. package/dist/cjs/createZero.native.js.map +0 -6
  286. package/dist/cjs/helpers/clearZeroDatabase.cjs +0 -57
  287. package/dist/cjs/helpers/clearZeroDatabase.js +0 -57
  288. package/dist/cjs/helpers/clearZeroDatabase.js.map +0 -6
  289. package/dist/cjs/helpers/clearZeroDatabase.native.js +0 -71
  290. package/dist/cjs/helpers/clearZeroDatabase.native.js.map +0 -6
  291. package/dist/cjs/helpers/getAuthData.js +0 -1
  292. package/dist/cjs/helpers/getAuthData.native.js +0 -2
  293. package/dist/cjs/helpers/getDidRunPermissionCheck.js.map +0 -6
  294. package/dist/cjs/helpers/getDidRunPermissionCheck.native.js.map +0 -6
  295. package/dist/cjs/helpers/setupZeroClientGlobalEffects.cjs +0 -40
  296. package/dist/cjs/helpers/setupZeroClientGlobalEffects.js +0 -36
  297. package/dist/cjs/helpers/setupZeroClientGlobalEffects.js.map +0 -6
  298. package/dist/cjs/helpers/setupZeroClientGlobalEffects.native.js +0 -36
  299. package/dist/cjs/helpers/setupZeroClientGlobalEffects.native.js.map +0 -6
  300. package/dist/cjs/helpers/useAuthData.js +0 -1
  301. package/dist/cjs/helpers/useAuthData.native.js +0 -2
  302. package/dist/cjs/helpers/useZDB.cjs +0 -70
  303. package/dist/cjs/helpers/useZDB.js +0 -51
  304. package/dist/cjs/helpers/useZDB.js.map +0 -6
  305. package/dist/cjs/helpers/useZDB.native.js +0 -68
  306. package/dist/cjs/helpers/useZDB.native.js.map +0 -6
  307. package/dist/cjs/helpers/zeroEmitter.js.map +0 -6
  308. package/dist/cjs/helpers/zeroEmitter.native.js.map +0 -6
  309. package/dist/esm/build/readPermissions.js +0 -36
  310. package/dist/esm/build/readPermissions.js.map +0 -6
  311. package/dist/esm/build/readPermissions.mjs +0 -28
  312. package/dist/esm/build/readPermissions.mjs.map +0 -1
  313. package/dist/esm/build/readPermissions.native.js +0 -34
  314. package/dist/esm/build/readPermissions.native.js.map +0 -1
  315. package/dist/esm/build/schema.js +0 -7
  316. package/dist/esm/build/schema.js.map +0 -6
  317. package/dist/esm/build/schema.mjs +0 -4
  318. package/dist/esm/build/schema.mjs.map +0 -1
  319. package/dist/esm/build/schema.native.js +0 -4
  320. package/dist/esm/build/schema.native.js.map +0 -1
  321. package/dist/esm/createClient.js +0 -68
  322. package/dist/esm/createClient.js.map +0 -6
  323. package/dist/esm/createClient.mjs +0 -66
  324. package/dist/esm/createClient.mjs.map +0 -1
  325. package/dist/esm/createClient.native.js +0 -74
  326. package/dist/esm/createClient.native.js.map +0 -1
  327. package/dist/esm/createMutations.js +0 -27
  328. package/dist/esm/createMutations.js.map +0 -6
  329. package/dist/esm/createMutations.mjs +0 -27
  330. package/dist/esm/createMutations.mjs.map +0 -1
  331. package/dist/esm/createMutations.native.js +0 -29
  332. package/dist/esm/createMutations.native.js.map +0 -1
  333. package/dist/esm/createServer.js +0 -54
  334. package/dist/esm/createServer.js.map +0 -6
  335. package/dist/esm/createServer.mjs +0 -58
  336. package/dist/esm/createServer.mjs.map +0 -1
  337. package/dist/esm/createServer.native.js +0 -61
  338. package/dist/esm/createServer.native.js.map +0 -1
  339. package/dist/esm/createZero.js +0 -99
  340. package/dist/esm/createZero.js.map +0 -6
  341. package/dist/esm/createZero.mjs +0 -105
  342. package/dist/esm/createZero.mjs.map +0 -1
  343. package/dist/esm/createZero.native.js +0 -119
  344. package/dist/esm/createZero.native.js.map +0 -1
  345. package/dist/esm/helpers/clearZeroDatabase.js +0 -42
  346. package/dist/esm/helpers/clearZeroDatabase.js.map +0 -6
  347. package/dist/esm/helpers/clearZeroDatabase.mjs +0 -34
  348. package/dist/esm/helpers/clearZeroDatabase.mjs.map +0 -1
  349. package/dist/esm/helpers/clearZeroDatabase.native.js +0 -50
  350. package/dist/esm/helpers/clearZeroDatabase.native.js.map +0 -1
  351. package/dist/esm/helpers/getAuthData.js +0 -1
  352. package/dist/esm/helpers/getAuthData.js.map +0 -6
  353. package/dist/esm/helpers/getAuthData.mjs +0 -2
  354. package/dist/esm/helpers/getAuthData.native.js +0 -2
  355. package/dist/esm/helpers/getDidRunPermissionCheck.js +0 -5
  356. package/dist/esm/helpers/getDidRunPermissionCheck.js.map +0 -6
  357. package/dist/esm/helpers/getDidRunPermissionCheck.mjs +0 -4
  358. package/dist/esm/helpers/getDidRunPermissionCheck.mjs.map +0 -1
  359. package/dist/esm/helpers/getDidRunPermissionCheck.native.js +0 -6
  360. package/dist/esm/helpers/getDidRunPermissionCheck.native.js.map +0 -1
  361. package/dist/esm/helpers/setupZeroClientGlobalEffects.js +0 -40
  362. package/dist/esm/helpers/setupZeroClientGlobalEffects.js.map +0 -6
  363. package/dist/esm/helpers/setupZeroClientGlobalEffects.mjs +0 -41
  364. package/dist/esm/helpers/setupZeroClientGlobalEffects.mjs.map +0 -1
  365. package/dist/esm/helpers/setupZeroClientGlobalEffects.native.js +0 -41
  366. package/dist/esm/helpers/setupZeroClientGlobalEffects.native.js.map +0 -1
  367. package/dist/esm/helpers/useAuthData.js +0 -1
  368. package/dist/esm/helpers/useAuthData.js.map +0 -6
  369. package/dist/esm/helpers/useAuthData.mjs +0 -2
  370. package/dist/esm/helpers/useAuthData.native.js +0 -2
  371. package/dist/esm/helpers/useZDB.js +0 -38
  372. package/dist/esm/helpers/useZDB.js.map +0 -6
  373. package/dist/esm/helpers/useZDB.mjs +0 -47
  374. package/dist/esm/helpers/useZDB.mjs.map +0 -1
  375. package/dist/esm/helpers/useZDB.native.js +0 -55
  376. package/dist/esm/helpers/useZDB.native.js.map +0 -1
  377. package/dist/esm/helpers/zeroEmitter.js +0 -6
  378. package/dist/esm/helpers/zeroEmitter.js.map +0 -6
  379. package/dist/esm/helpers/zeroEmitter.mjs +0 -4
  380. package/dist/esm/helpers/zeroEmitter.mjs.map +0 -1
  381. package/dist/esm/helpers/zeroEmitter.native.js +0 -4
  382. package/dist/esm/helpers/zeroEmitter.native.js.map +0 -1
  383. /package/dist/cjs/helpers/{getAuthData.cjs → queryOrMutatorAuthData.cjs} +0 -0
  384. /package/dist/cjs/helpers/{getAuthData.js.map → queryOrMutatorAuthData.js.map} +0 -0
  385. /package/dist/{esm/helpers/getAuthData.mjs.map → cjs/helpers/queryOrMutatorAuthData.native.js.map} +0 -0
  386. /package/dist/cjs/helpers/{useAuthData.cjs → queryOrMutatorContext.cjs} +0 -0
  387. /package/dist/cjs/helpers/{getAuthData.native.js.map → queryOrMutatorContext.js.map} +0 -0
  388. /package/dist/{esm/helpers/getAuthData.native.js.map → cjs/helpers/queryOrMutatorContext.native.js.map} +0 -0
  389. /package/dist/{cjs/helpers/useAuthData.js.map → esm/helpers/queryOrMutatorAuthData.js.map} +0 -0
  390. /package/dist/esm/helpers/{useAuthData.mjs.map → queryOrMutatorAuthData.mjs.map} +0 -0
  391. /package/dist/esm/helpers/{useAuthData.native.js.map → queryOrMutatorAuthData.native.js.map} +0 -0
  392. /package/dist/{cjs/helpers/useAuthData.native.js.map → esm/helpers/queryOrMutatorContext.js.map} +0 -0
package/readme.md CHANGED
@@ -1,20 +1,467 @@
1
1
  # over-zero
2
2
 
3
- This library is small suite of helpers we extracted after using Zero across a
4
- few production apps.
3
+ <img src="./over-zero.svg" width="120" alt="over-zero" />
5
4
 
6
- It's main feature is allowing you to define a `models/*` directory where you can
7
- define each zero **table** alongside its **permissions** and **mutations** in an
8
- intuitive and simple way.
5
+ helpers for building offline-first apps with [zero](https://zero.rocicorp.dev)
9
6
 
10
- It also provides `createZero` and `createZeroServer` which return helpers for
11
- your that make a variety of common client and server patterns simpler.
7
+ ## what it does
12
8
 
13
- Within models, you can automatically define CRUD-style mutations which apply
14
- permissions defined using simple `where` and `mutations` helper functions. You
15
- can then use your permissions in custom mutators with the `can` helper function.
9
+ over-zero provides three integrated systems on top of zero:
16
10
 
17
- For permissions, you get a handy `usePermission` helper for client.
11
+ **queries** - plain functions that become synced queries **mutations** -
12
+ server-validated operations with auto-generated crud **permissions** -
13
+ composable access control checked at runtime
18
14
 
19
- On the server, you get helpers to run one-off queries and mutations using
20
- standard Zero APIs, and a helper to simplify setting up your `/push` endpoint.
15
+ the package handles schema setup, type generation, and react integration. models
16
+ live alongside their permissions and mutations. queries are just functions that
17
+ use a global `zql` builder.
18
+
19
+ ## queries
20
+
21
+ write plain functions. they become synced queries automatically.
22
+
23
+ ```ts
24
+ // src/data/queries/notification.ts
25
+ import { zql, where } from 'over-zero'
26
+
27
+ const permission = where('notification', (q, auth) => {
28
+ return q.cmp('userId', auth?.id || '')
29
+ })
30
+
31
+ export const latestNotifications = (props: {
32
+ userId: string
33
+ serverId: string
34
+ }) => {
35
+ return zql.notification
36
+ .where(permission)
37
+ .where('userId', props.userId)
38
+ .where('serverId', props.serverId)
39
+ .orderBy('createdAt', 'desc')
40
+ .limit(20)
41
+ }
42
+ ```
43
+
44
+ zql is just the normal Zero query builder based on your typed schema.
45
+
46
+ use them:
47
+
48
+ ```tsx
49
+ const [data, state] = useQuery(latestNotifications, { userId, serverId })
50
+ ```
51
+
52
+ the function name becomes the query name. `useQuery` detects plain functions,
53
+ creates a cached `SyncedQuery` per function, and calls it with your params.
54
+
55
+ ### query permissions
56
+
57
+ define permissions inline using `where()`:
58
+
59
+ ```ts
60
+ const permission = where('channel', (q, auth) => {
61
+ if (auth?.role === 'admin') return true
62
+
63
+ return q.and(
64
+ q.cmp('deleted', '!=', true),
65
+ q.or(
66
+ q.cmp('private', false),
67
+ q.exists('role', (r) =>
68
+ r.whereExists('member', (m) => m.where('id', auth?.id))
69
+ )
70
+ )
71
+ )
72
+ })
73
+ ```
74
+
75
+ then use in queries:
76
+
77
+ ```ts
78
+ export const channelById = (props: { channelId: string }) => {
79
+ return zql.channel
80
+ .where(permission)
81
+ .where('id', props.channelId)
82
+ .one()
83
+ }
84
+ ```
85
+
86
+ permissions execute server-side only. on the client they automatically pass.
87
+ the `where()` helper automatically accesses auth data from `queryContext()` or
88
+ `mutatorContext()` so you don't need to pass it manually.
89
+
90
+ ## mutations
91
+
92
+ define schema, permissions, and mutations together:
93
+
94
+ ```ts
95
+ // src/data/models/message.ts
96
+ import { table, mutations, where } from 'over-zero'
97
+
98
+ export const schema = table('message')
99
+ .columns({
100
+ id: string(),
101
+ content: string(),
102
+ authorId: string(),
103
+ channelId: string(),
104
+ createdAt: number(),
105
+ })
106
+ .primaryKey('id')
107
+
108
+ export const permissions = where('message', (q, auth) => {
109
+ return q.cmp('authorId', auth?.id || '')
110
+ })
111
+
112
+ // CRUD migrations with permissions by passing schema + permissions:
113
+ export const mutate = mutations(schema, permissions, {
114
+ async send(ctx, props: { content: string; channelId: string }) {
115
+ await ctx.can(permissions, props)
116
+
117
+ await ctx.tx.mutate.message.insert({
118
+ id: randomId(),
119
+ content: props.content,
120
+ channelId: props.channelId,
121
+ authorId: ctx.authData!.id,
122
+ createdAt: Date.now(),
123
+ })
124
+
125
+ if (ctx.server) {
126
+ ctx.server.asyncTasks.push(async () => {
127
+ await ctx.server.actions.sendNotification(props)
128
+ })
129
+ }
130
+ },
131
+ })
132
+ ```
133
+
134
+ call mutations from react:
135
+
136
+ ```tsx
137
+ await zero.mutate.message.send({ content: 'hello', channelId: 'ch-1' })
138
+ ```
139
+
140
+ the second argument (`permissions`) enables auto-generated crud that checks
141
+ permissions:
142
+
143
+ ```tsx
144
+ zero.mutate.message.insert(message)
145
+ zero.mutate.message.update(message)
146
+ zero.mutate.message.delete(message)
147
+ zero.mutate.message.upsert(message)
148
+ ```
149
+
150
+ ## permissions
151
+
152
+ permissions use the `where()` helper to create Zero `ExpressionBuilder` conditions:
153
+
154
+ ```ts
155
+ export const permissions = where('channel', (q, auth) => {
156
+ if (auth?.role === 'admin') return true
157
+
158
+ return q.or(
159
+ q.cmp('public', true),
160
+ q.exists('members', (m) => m.where('userId', auth?.id)),
161
+ )
162
+ })
163
+ ```
164
+
165
+ the `where()` helper automatically gets auth data from `queryContext()` or
166
+ `mutatorContext()`, so you don't manually pass it. permissions only execute
167
+ server-side - on the client they automatically pass.
168
+
169
+ **for queries:** define permissions inline as a constant in query files:
170
+
171
+ ```ts
172
+ // src/data/queries/channel.ts
173
+ const permission = where('channel', (q, auth) => {
174
+ return q.cmp('userId', auth?.id || '')
175
+ })
176
+
177
+ export const myChannels = () => {
178
+ return zql.channel.where(permission)
179
+ }
180
+ ```
181
+
182
+ **for mutations:** define permissions in model files for CRUD operations:
183
+
184
+ ```ts
185
+ // src/data/models/message.ts
186
+ export const permissions = where('message', (q, auth) => {
187
+ return q.cmp('authorId', auth?.id || '')
188
+ })
189
+ ```
190
+
191
+ CRUD mutations automatically apply them, but for custom mutations use `can()`:
192
+
193
+ ```ts
194
+ await ctx.can(permissions, messageId)
195
+ ```
196
+
197
+ check permissions in React with `usePermission()`:
198
+
199
+ ```tsx
200
+ const canEdit = usePermission('message', messageId)
201
+ ```
202
+
203
+ ## generation
204
+
205
+ `over-zero` has a CLI that auto-generates glue files that wire up your models,
206
+ queries, and types.
207
+
208
+ ### cli commands
209
+
210
+ **`over-zero generate [dir]`**
211
+
212
+ generates all files needed to connect your models and queries:
213
+
214
+ - `models.ts` - aggregates all model files into a single import
215
+ - `types.ts` - generates TypeScript types from table schemas
216
+ - `tables.ts` - exports table schemas (separate to avoid circular types)
217
+ - `queries.ts` - generates synced query definitions with valibot validators
218
+
219
+ **options:**
220
+
221
+ - `dir` - base directory containing `models/` and `queries/` folders (default:
222
+ `src/data`)
223
+ - `--watch` - watch for changes and regenerate automatically
224
+ - `--after` - command to run after generation completes
225
+
226
+ **examples:**
227
+
228
+ ```bash
229
+ # generate once
230
+ bun over-zero generate
231
+
232
+ # generate and watch
233
+ bun over-zero generate --watch
234
+
235
+ # custom directory
236
+ bun over-zero generate ./app/data
237
+
238
+ # run linter after generation
239
+ bun over-zero generate --after "bun lint:fix"
240
+ ```
241
+
242
+ **`over-zero generate-queries <dir>`**
243
+
244
+ generates query validators from TypeScript query functions. this is included in
245
+ `generate` but can be run standalone.
246
+
247
+ - parses exported arrow functions from `.ts` files in the queries directory
248
+ - extracts parameter types using TypeScript compiler API
249
+ - generates valibot schemas using typebox-codegen
250
+
251
+ **example:**
252
+
253
+ ```bash
254
+ bun over-zero generate-queries src/data/queries
255
+ ```
256
+
257
+ ### what gets generated
258
+
259
+ **models.ts:**
260
+
261
+ ```ts
262
+ import * as channel from '~/data/models/channel'
263
+ import * as message from '~/data/models/message'
264
+
265
+ export const models = {
266
+ channel,
267
+ message,
268
+ }
269
+ ```
270
+
271
+ **types.ts:**
272
+
273
+ ```ts
274
+ import type { TableInsertRow, TableUpdateRow } from 'over-zero'
275
+ import type * as schema from '../tables'
276
+
277
+ export type Channel = TableInsertRow<typeof schema.channel>
278
+ export type ChannelUpdate = TableUpdateRow<typeof schema.channel>
279
+ ```
280
+
281
+ **tables.ts:**
282
+
283
+ ```ts
284
+ export { schema as channel } from '~/data/models/channel'
285
+ export { schema as message } from '~/data/models/message'
286
+ ```
287
+
288
+ **queries.ts:**
289
+
290
+ ```ts
291
+ import * as v from 'valibot'
292
+ import { syncedQuery } from '@rocicorp/zero'
293
+ import * as messageQueries from '../queries/message'
294
+
295
+ export const latestMessages = syncedQuery(
296
+ 'latestMessages',
297
+ v.parser(
298
+ v.tuple([
299
+ v.object({
300
+ channelId: v.string(),
301
+ limit: v.optional(v.number()),
302
+ }),
303
+ ]),
304
+ ),
305
+ (arg) => {
306
+ return messageQueries.latestMessages(arg)
307
+ },
308
+ )
309
+ ```
310
+
311
+ ### how it works
312
+
313
+ the generator:
314
+
315
+ 1. scans `models/` for files with `export const schema = table(...)`
316
+ 2. scans `queries/` for exported arrow functions
317
+ 3. parses TypeScript AST to extract parameter types
318
+ 4. converts types to valibot schemas using typebox-codegen
319
+ 5. wraps query functions in `syncedQuery()` with validators
320
+ 6. handles special cases (void params, user → userPublic mapping)
321
+ 7. groups query imports by source file
322
+
323
+ queries with no parameters get wrapped in `v.parser(v.tuple([]))` while queries
324
+ with params get validators like `v.parser(v.tuple([v.object({ ... })]))`.
325
+
326
+ exports named `permission` are automatically skipped during query generation.
327
+
328
+ ## setup
329
+
330
+ client:
331
+
332
+ ```tsx
333
+ import { createZeroClient } from 'over-zero'
334
+ import { schema } from './data/schema'
335
+ import { models } from './data/models'
336
+
337
+ export const { ProvideZero, useQuery, zero } = createZeroClient({
338
+ schema,
339
+ models,
340
+ })
341
+
342
+ // in your app root
343
+ <ProvideZero
344
+ server="http://localhost:4848"
345
+ userID={user.id}
346
+ auth={jwtToken}
347
+ authData={{ id: user.id, email: user.email, role: user.role }}
348
+ >
349
+ <App />
350
+ </ProvideZero>
351
+ ```
352
+
353
+ server:
354
+
355
+ ```ts
356
+ import { createZeroServer } from 'over-zero/server'
357
+
358
+ export const zeroServer = createZeroServer({
359
+ schema,
360
+ models,
361
+ database: process.env.DATABASE_URL,
362
+ createServerActions: () => ({
363
+ sendEmail: async (to, subject, body) => { ... }
364
+ })
365
+ })
366
+
367
+ // in your api endpoint
368
+ app.post('/api/zero/push', async (req) => {
369
+ const authData = await getAuthFromRequest(req)
370
+ const { response } = await zeroServer.handleMutationRequest({
371
+ authData,
372
+ request: req
373
+ })
374
+ return response
375
+ })
376
+ ```
377
+
378
+ type augmentation:
379
+
380
+ ```ts
381
+ // src/zero/types.ts
382
+ import type { schema } from '~/data/schema'
383
+ import type { AuthData } from './auth'
384
+
385
+ declare module 'over-zero' {
386
+ interface Config {
387
+ schema: typeof schema
388
+ authData: AuthData
389
+ }
390
+ }
391
+ ```
392
+
393
+ ## mutation context
394
+
395
+ every mutation receives `MutatorContext` as first argument:
396
+
397
+ ```ts
398
+ type MutatorContext = {
399
+ tx: Transaction // database transaction
400
+ authData: AuthData | null // current user
401
+ environment: 'server' | 'client' // where executing
402
+ can: (where, obj) => Promise<void> // permission checker
403
+ server?: {
404
+ actions: ServerActions // async server functions
405
+ asyncTasks: AsyncAction[] // run after transaction
406
+ }
407
+ }
408
+ ```
409
+
410
+ use it:
411
+
412
+ ```ts
413
+ export const mutate = mutations(schema, permissions, {
414
+ async archive(ctx, { messageId }) {
415
+ await ctx.can(permissions, messageId)
416
+ await ctx.tx.mutate.message.update({ id: messageId, archived: true })
417
+
418
+ ctx.server?.asyncTasks.push(async () => {
419
+ await ctx.server.actions.indexForSearch(messageId)
420
+ })
421
+ },
422
+ })
423
+ ```
424
+
425
+ ## patterns
426
+
427
+ **client-side optimistic updates:**
428
+
429
+ ```ts
430
+ zero.mutate.message.update(message).client
431
+ ```
432
+
433
+ **wait for server confirmation:**
434
+
435
+ ```ts
436
+ const result = await zero.mutate.message.update(message).server
437
+ ```
438
+
439
+ **server-only mutations:**
440
+
441
+ ```ts
442
+ await zeroServer.mutate(async (tx, mutators) => {
443
+ await mutators.user.insert(tx, user)
444
+ })
445
+ ```
446
+
447
+ **one-off queries:**
448
+
449
+ ```ts
450
+ const user = await zeroServer.query((q) => q.user.where('id', userId).one())
451
+ ```
452
+
453
+ **batch processing:**
454
+
455
+ ```ts
456
+ import { batchQuery } from 'over-zero'
457
+
458
+ await batchQuery(
459
+ zql.message.where('processed', false),
460
+ async (messages) => {
461
+ for (const msg of messages) {
462
+ await processMessage(msg)
463
+ }
464
+ },
465
+ { chunk: 100, pause: 50 },
466
+ )
467
+ ```