over-zero 0.0.31 → 0.0.33

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 (254) hide show
  1. package/cli.cjs +3 -0
  2. package/dist/cjs/cli.cjs +228 -190
  3. package/dist/cjs/cli.js +60 -27
  4. package/dist/cjs/cli.js.map +1 -1
  5. package/dist/cjs/cli.native.js +277 -228
  6. package/dist/cjs/cli.native.js.map +1 -1
  7. package/dist/cjs/createPermissions.js.map +1 -1
  8. package/dist/cjs/createPermissions.native.js.map +1 -1
  9. package/dist/cjs/createZeroClient.cjs +21 -14
  10. package/dist/cjs/createZeroClient.js +18 -10
  11. package/dist/cjs/createZeroClient.js.map +1 -1
  12. package/dist/cjs/createZeroClient.native.js +48 -9
  13. package/dist/cjs/createZeroClient.native.js.map +1 -1
  14. package/dist/cjs/createZeroServer.cjs +3 -2
  15. package/dist/cjs/createZeroServer.js +2 -2
  16. package/dist/cjs/createZeroServer.js.map +1 -1
  17. package/dist/cjs/createZeroServer.native.js +4 -2
  18. package/dist/cjs/createZeroServer.native.js.map +1 -1
  19. package/dist/cjs/helpers/batchQuery.js.map +1 -1
  20. package/dist/cjs/helpers/batchQuery.native.js.map +1 -1
  21. package/dist/cjs/helpers/createMutators.js.map +1 -1
  22. package/dist/cjs/helpers/createMutators.native.js.map +1 -1
  23. package/dist/cjs/helpers/didRunPermissionCheck.js.map +1 -1
  24. package/dist/cjs/helpers/didRunPermissionCheck.native.js.map +1 -1
  25. package/dist/cjs/helpers/ensureLoggedIn.js.map +1 -1
  26. package/dist/cjs/helpers/ensureLoggedIn.native.js.map +1 -1
  27. package/dist/cjs/helpers/getQueryOrMutatorAuthData.js.map +1 -1
  28. package/dist/cjs/helpers/getQueryOrMutatorAuthData.native.js.map +1 -1
  29. package/dist/cjs/helpers/mutatorContext.js.map +1 -1
  30. package/dist/cjs/helpers/mutatorContext.native.js.map +1 -1
  31. package/dist/cjs/helpers/prettyFormatZeroQuery.js.map +1 -1
  32. package/dist/cjs/helpers/prettyFormatZeroQuery.native.js.map +1 -1
  33. package/dist/cjs/helpers/useZeroDebug.js.map +1 -1
  34. package/dist/cjs/helpers/useZeroDebug.native.js.map +1 -1
  35. package/dist/cjs/index.cjs +1 -0
  36. package/dist/cjs/index.js +1 -0
  37. package/dist/cjs/index.js.map +1 -1
  38. package/dist/cjs/index.native.js +1 -0
  39. package/dist/cjs/index.native.js.map +1 -1
  40. package/dist/cjs/mutations.js.map +1 -1
  41. package/dist/cjs/mutations.native.js.map +1 -1
  42. package/dist/cjs/{builder.cjs → queryRegistry.cjs} +12 -10
  43. package/dist/cjs/{queryBuilder.js → queryRegistry.js} +13 -11
  44. package/dist/cjs/queryRegistry.js.map +6 -0
  45. package/dist/cjs/{queryBuilder.native.js → queryRegistry.native.js} +13 -12
  46. package/dist/cjs/queryRegistry.native.js.map +1 -0
  47. package/dist/cjs/serverWhere.js.map +1 -1
  48. package/dist/cjs/serverWhere.native.js.map +1 -1
  49. package/dist/cjs/state.cjs +1 -4
  50. package/dist/cjs/state.js +1 -4
  51. package/dist/cjs/state.js.map +1 -1
  52. package/dist/cjs/state.native.js +1 -2
  53. package/dist/cjs/state.native.js.map +1 -1
  54. package/dist/cjs/where.js.map +1 -1
  55. package/dist/cjs/where.native.js.map +1 -1
  56. package/dist/cjs/zql.js.map +1 -1
  57. package/dist/cjs/zql.native.js.map +1 -1
  58. package/dist/esm/cli.js +61 -28
  59. package/dist/esm/cli.js.map +1 -1
  60. package/dist/esm/cli.mjs +227 -189
  61. package/dist/esm/cli.mjs.map +1 -1
  62. package/dist/esm/cli.native.js +276 -227
  63. package/dist/esm/cli.native.js.map +1 -1
  64. package/dist/esm/createPermissions.js.map +1 -1
  65. package/dist/esm/createPermissions.mjs.map +1 -1
  66. package/dist/esm/createPermissions.native.js.map +1 -1
  67. package/dist/esm/createZeroClient.js +18 -9
  68. package/dist/esm/createZeroClient.js.map +1 -1
  69. package/dist/esm/createZeroClient.mjs +21 -14
  70. package/dist/esm/createZeroClient.mjs.map +1 -1
  71. package/dist/esm/createZeroClient.native.js +48 -9
  72. package/dist/esm/createZeroClient.native.js.map +1 -1
  73. package/dist/esm/createZeroServer.js +2 -2
  74. package/dist/esm/createZeroServer.js.map +1 -1
  75. package/dist/esm/createZeroServer.mjs +3 -2
  76. package/dist/esm/createZeroServer.mjs.map +1 -1
  77. package/dist/esm/createZeroServer.native.js +4 -2
  78. package/dist/esm/createZeroServer.native.js.map +1 -1
  79. package/dist/esm/helpers/batchQuery.js.map +1 -1
  80. package/dist/esm/helpers/batchQuery.mjs.map +1 -1
  81. package/dist/esm/helpers/batchQuery.native.js.map +1 -1
  82. package/dist/esm/helpers/createMutators.js.map +1 -1
  83. package/dist/esm/helpers/createMutators.mjs.map +1 -1
  84. package/dist/esm/helpers/createMutators.native.js.map +1 -1
  85. package/dist/esm/helpers/didRunPermissionCheck.js.map +1 -1
  86. package/dist/esm/helpers/didRunPermissionCheck.mjs.map +1 -1
  87. package/dist/esm/helpers/didRunPermissionCheck.native.js.map +1 -1
  88. package/dist/esm/helpers/ensureLoggedIn.js.map +1 -1
  89. package/dist/esm/helpers/ensureLoggedIn.mjs.map +1 -1
  90. package/dist/esm/helpers/ensureLoggedIn.native.js.map +1 -1
  91. package/dist/esm/helpers/getQueryOrMutatorAuthData.js.map +1 -1
  92. package/dist/esm/helpers/getQueryOrMutatorAuthData.mjs.map +1 -1
  93. package/dist/esm/helpers/getQueryOrMutatorAuthData.native.js.map +1 -1
  94. package/dist/esm/helpers/mutatorContext.js.map +1 -1
  95. package/dist/esm/helpers/mutatorContext.mjs.map +1 -1
  96. package/dist/esm/helpers/mutatorContext.native.js.map +1 -1
  97. package/dist/esm/helpers/prettyFormatZeroQuery.js.map +1 -1
  98. package/dist/esm/helpers/prettyFormatZeroQuery.mjs.map +1 -1
  99. package/dist/esm/helpers/prettyFormatZeroQuery.native.js.map +1 -1
  100. package/dist/esm/helpers/useZeroDebug.js.map +1 -1
  101. package/dist/esm/helpers/useZeroDebug.mjs.map +1 -1
  102. package/dist/esm/helpers/useZeroDebug.native.js.map +1 -1
  103. package/dist/esm/index.js +1 -0
  104. package/dist/esm/index.js.map +1 -1
  105. package/dist/esm/index.mjs +1 -0
  106. package/dist/esm/index.mjs.map +1 -1
  107. package/dist/esm/index.native.js +1 -0
  108. package/dist/esm/index.native.js.map +1 -1
  109. package/dist/esm/mutations.js.map +1 -1
  110. package/dist/esm/mutations.mjs.map +1 -1
  111. package/dist/esm/mutations.native.js.map +1 -1
  112. package/dist/esm/queryRegistry.js +12 -0
  113. package/dist/esm/queryRegistry.js.map +6 -0
  114. package/dist/esm/queryRegistry.mjs +9 -0
  115. package/dist/esm/queryRegistry.mjs.map +1 -0
  116. package/dist/esm/queryRegistry.native.js +9 -0
  117. package/dist/esm/queryRegistry.native.js.map +1 -0
  118. package/dist/esm/serverWhere.js.map +1 -1
  119. package/dist/esm/serverWhere.mjs.map +1 -1
  120. package/dist/esm/serverWhere.native.js.map +1 -1
  121. package/dist/esm/state.js +1 -4
  122. package/dist/esm/state.js.map +1 -1
  123. package/dist/esm/state.mjs +1 -4
  124. package/dist/esm/state.mjs.map +1 -1
  125. package/dist/esm/state.native.js +1 -2
  126. package/dist/esm/state.native.js.map +1 -1
  127. package/dist/esm/where.js.map +1 -1
  128. package/dist/esm/where.mjs.map +1 -1
  129. package/dist/esm/where.native.js.map +1 -1
  130. package/dist/esm/zql.js.map +1 -1
  131. package/dist/esm/zql.mjs.map +1 -1
  132. package/dist/esm/zql.native.js.map +1 -1
  133. package/package.json +4 -4
  134. package/src/cli.ts +99 -79
  135. package/src/createPermissions.ts +8 -6
  136. package/src/createZeroClient.tsx +47 -17
  137. package/src/createZeroServer.ts +21 -15
  138. package/src/helpers/batchQuery.ts +2 -1
  139. package/src/helpers/createMutators.ts +3 -1
  140. package/src/helpers/didRunPermissionCheck.ts +1 -0
  141. package/src/helpers/ensureLoggedIn.ts +3 -1
  142. package/src/helpers/getQueryOrMutatorAuthData.ts +2 -1
  143. package/src/helpers/mutatorContext.ts +1 -0
  144. package/src/helpers/prettyFormatZeroQuery.ts +2 -1
  145. package/src/helpers/useZeroDebug.ts +3 -1
  146. package/src/index.ts +1 -0
  147. package/src/mutations.ts +2 -1
  148. package/src/queryRegistry.ts +12 -0
  149. package/src/serverWhere.ts +3 -2
  150. package/src/state.ts +2 -2
  151. package/src/types.ts +10 -9
  152. package/src/where.ts +3 -1
  153. package/src/zql.ts +1 -0
  154. package/types/createPermissions.d.ts +1 -1
  155. package/types/createPermissions.d.ts.map +1 -1
  156. package/types/createZeroClient.d.ts +8 -6
  157. package/types/createZeroClient.d.ts.map +1 -1
  158. package/types/createZeroServer.d.ts +4 -3
  159. package/types/createZeroServer.d.ts.map +1 -1
  160. package/types/helpers/batchQuery.d.ts.map +1 -1
  161. package/types/helpers/createMutators.d.ts.map +1 -1
  162. package/types/helpers/didRunPermissionCheck.d.ts.map +1 -1
  163. package/types/helpers/ensureLoggedIn.d.ts.map +1 -1
  164. package/types/helpers/getQueryOrMutatorAuthData.d.ts.map +1 -1
  165. package/types/helpers/mutatorContext.d.ts.map +1 -1
  166. package/types/helpers/prettyFormatZeroQuery.d.ts.map +1 -1
  167. package/types/helpers/useZeroDebug.d.ts.map +1 -1
  168. package/types/index.d.ts +1 -0
  169. package/types/index.d.ts.map +1 -1
  170. package/types/mutations.d.ts +1 -1
  171. package/types/mutations.d.ts.map +1 -1
  172. package/types/queryRegistry.d.ts +3 -0
  173. package/types/queryRegistry.d.ts.map +1 -0
  174. package/types/serverWhere.d.ts +1 -1
  175. package/types/serverWhere.d.ts.map +1 -1
  176. package/types/state.d.ts.map +1 -1
  177. package/types/types.d.ts.map +1 -1
  178. package/types/where.d.ts +1 -1
  179. package/types/where.d.ts.map +1 -1
  180. package/types/zql.d.ts.map +1 -1
  181. package/dist/cjs/builder.js +0 -26
  182. package/dist/cjs/builder.js.map +0 -6
  183. package/dist/cjs/builder.native.js +0 -35
  184. package/dist/cjs/builder.native.js.map +0 -1
  185. package/dist/cjs/helpers/context.cjs +0 -40
  186. package/dist/cjs/helpers/context.js +0 -36
  187. package/dist/cjs/helpers/context.js.map +0 -6
  188. package/dist/cjs/helpers/context.native.js +0 -43
  189. package/dist/cjs/helpers/context.native.js.map +0 -1
  190. package/dist/cjs/helpers/queryContext.cjs +0 -40
  191. package/dist/cjs/helpers/queryContext.js +0 -36
  192. package/dist/cjs/helpers/queryContext.js.map +0 -6
  193. package/dist/cjs/helpers/queryContext.native.js +0 -43
  194. package/dist/cjs/helpers/queryContext.native.js.map +0 -1
  195. package/dist/cjs/helpers/queryOrMutatorAuthData.cjs +0 -0
  196. package/dist/cjs/helpers/queryOrMutatorAuthData.js +0 -1
  197. package/dist/cjs/helpers/queryOrMutatorAuthData.js.map +0 -6
  198. package/dist/cjs/helpers/queryOrMutatorAuthData.native.js +0 -2
  199. package/dist/cjs/helpers/queryOrMutatorAuthData.native.js.map +0 -1
  200. package/dist/cjs/helpers/queryOrMutatorContext.cjs +0 -0
  201. package/dist/cjs/helpers/queryOrMutatorContext.js +0 -1
  202. package/dist/cjs/helpers/queryOrMutatorContext.js.map +0 -6
  203. package/dist/cjs/helpers/queryOrMutatorContext.native.js +0 -2
  204. package/dist/cjs/helpers/queryOrMutatorContext.native.js.map +0 -1
  205. package/dist/cjs/query.cjs +0 -34
  206. package/dist/cjs/query.js +0 -28
  207. package/dist/cjs/query.js.map +0 -6
  208. package/dist/cjs/query.native.js +0 -39
  209. package/dist/cjs/query.native.js.map +0 -1
  210. package/dist/cjs/queryBuilder.cjs +0 -31
  211. package/dist/cjs/queryBuilder.js.map +0 -6
  212. package/dist/cjs/queryBuilder.native.js.map +0 -1
  213. package/dist/esm/builder.js +0 -10
  214. package/dist/esm/builder.js.map +0 -6
  215. package/dist/esm/builder.mjs +0 -8
  216. package/dist/esm/builder.mjs.map +0 -1
  217. package/dist/esm/builder.native.js +0 -9
  218. package/dist/esm/builder.native.js.map +0 -1
  219. package/dist/esm/helpers/context.js +0 -20
  220. package/dist/esm/helpers/context.js.map +0 -6
  221. package/dist/esm/helpers/context.mjs +0 -15
  222. package/dist/esm/helpers/context.mjs.map +0 -1
  223. package/dist/esm/helpers/context.native.js +0 -15
  224. package/dist/esm/helpers/context.native.js.map +0 -1
  225. package/dist/esm/helpers/queryContext.js +0 -20
  226. package/dist/esm/helpers/queryContext.js.map +0 -6
  227. package/dist/esm/helpers/queryContext.mjs +0 -15
  228. package/dist/esm/helpers/queryContext.mjs.map +0 -1
  229. package/dist/esm/helpers/queryContext.native.js +0 -15
  230. package/dist/esm/helpers/queryContext.native.js.map +0 -1
  231. package/dist/esm/helpers/queryOrMutatorAuthData.js +0 -1
  232. package/dist/esm/helpers/queryOrMutatorAuthData.js.map +0 -6
  233. package/dist/esm/helpers/queryOrMutatorAuthData.mjs +0 -2
  234. package/dist/esm/helpers/queryOrMutatorAuthData.mjs.map +0 -1
  235. package/dist/esm/helpers/queryOrMutatorAuthData.native.js +0 -2
  236. package/dist/esm/helpers/queryOrMutatorAuthData.native.js.map +0 -1
  237. package/dist/esm/helpers/queryOrMutatorContext.js +0 -1
  238. package/dist/esm/helpers/queryOrMutatorContext.js.map +0 -6
  239. package/dist/esm/helpers/queryOrMutatorContext.mjs +0 -2
  240. package/dist/esm/helpers/queryOrMutatorContext.mjs.map +0 -1
  241. package/dist/esm/helpers/queryOrMutatorContext.native.js +0 -2
  242. package/dist/esm/helpers/queryOrMutatorContext.native.js.map +0 -1
  243. package/dist/esm/query.js +0 -13
  244. package/dist/esm/query.js.map +0 -6
  245. package/dist/esm/query.mjs +0 -11
  246. package/dist/esm/query.mjs.map +0 -1
  247. package/dist/esm/query.native.js +0 -13
  248. package/dist/esm/query.native.js.map +0 -1
  249. package/dist/esm/queryBuilder.js +0 -10
  250. package/dist/esm/queryBuilder.js.map +0 -6
  251. package/dist/esm/queryBuilder.mjs +0 -8
  252. package/dist/esm/queryBuilder.mjs.map +0 -1
  253. package/dist/esm/queryBuilder.native.js +0 -9
  254. package/dist/esm/queryBuilder.native.js.map +0 -1
package/cli.cjs ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ // needs to be here before build so it links in
3
+ require('./dist/cjs/cli.cjs')
package/dist/cjs/cli.cjs CHANGED
@@ -21,11 +21,11 @@ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
21
21
  value: mod,
22
22
  enumerable: !0
23
23
  }) : target, mod));
24
- var import_model = require("@sinclair/typebox-codegen/model"),
24
+ var import_node_fs = require("node:fs"),
25
+ import_node_path = require("node:path"),
26
+ import_model = require("@sinclair/typebox-codegen/model"),
25
27
  import_typescript = require("@sinclair/typebox-codegen/typescript"),
26
28
  import_citty = require("citty"),
27
- import_node_fs = require("node:fs"),
28
- import_node_path = require("node:path"),
29
29
  ts = __toESM(require("typescript"), 1);
30
30
  function writeFileIfChanged(filePath, content) {
31
31
  try {
@@ -34,184 +34,187 @@ function writeFileIfChanged(filePath, content) {
34
34
  return (0, import_node_fs.writeFileSync)(filePath, content, "utf-8"), !0;
35
35
  }
36
36
  const generateQueries = (0, import_citty.defineCommand)({
37
- meta: {
38
- name: "generate-queries",
39
- description: "Generate server-side query validators from TypeScript query functions"
40
- },
41
- args: {
42
- dir: {
43
- type: "positional",
44
- description: "Directory containing query files",
45
- required: !1,
46
- default: "."
47
- }
48
- },
49
- async run({
50
- args
51
- }) {
52
- const dir = (0, import_node_path.resolve)(args.dir),
53
- {
54
- readdirSync: readdirSync2,
55
- writeFileSync: writeFileSync2
56
- } = await import("node:fs"),
57
- files = readdirSync2(dir).filter(f => f.endsWith(".ts")),
58
- allQueries = [],
59
- results = await Promise.all(files.map(async file => {
60
- const filePath = (0, import_node_path.resolve)(dir, file),
61
- queries = [];
62
- try {
63
- const content = (0, import_node_fs.readFileSync)(filePath, "utf-8"),
64
- sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, !0);
65
- ts.forEachChild(sourceFile, node => {
66
- if (ts.isVariableStatement(node)) {
67
- if (!node.modifiers?.find(m => m.kind === ts.SyntaxKind.ExportKeyword)) return;
68
- const declaration = node.declarationList.declarations[0];
69
- if (!declaration || !ts.isVariableDeclaration(declaration)) return;
70
- const name = declaration.name.getText(sourceFile);
71
- if (declaration.initializer && ts.isArrowFunction(declaration.initializer)) {
72
- const params = declaration.initializer.parameters;
73
- let paramType = "void";
74
- params.length > 0 && (paramType = params[0].type?.getText(sourceFile) || "unknown");
75
- try {
76
- const typeString = `type QueryParams = ${paramType}`,
77
- model = import_typescript.TypeScriptToModel.Generate(typeString),
78
- valibotCode = import_model.ModelToValibot.Generate(model);
79
- queries.push({
80
- name,
81
- params: paramType,
82
- valibotCode
83
- });
84
- } catch (err) {
85
- console.error(`\u2717 ${name}: ${err}`);
37
+ meta: {
38
+ name: "generate-queries",
39
+ description: "Generate server-side query validators from TypeScript query functions"
40
+ },
41
+ args: {
42
+ dir: {
43
+ type: "positional",
44
+ description: "Directory containing query files",
45
+ required: !1,
46
+ default: "."
47
+ }
48
+ },
49
+ async run({
50
+ args
51
+ }) {
52
+ const dir = (0, import_node_path.resolve)(args.dir),
53
+ {
54
+ readdirSync: readdirSync2,
55
+ writeFileSync: writeFileSync2
56
+ } = await import("node:fs"),
57
+ files = readdirSync2(dir).filter(f => f.endsWith(".ts")),
58
+ allQueries = [],
59
+ results = await Promise.all(files.map(async file => {
60
+ const filePath = (0, import_node_path.resolve)(dir, file),
61
+ queries = [];
62
+ try {
63
+ const content = (0, import_node_fs.readFileSync)(filePath, "utf-8"),
64
+ sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, !0);
65
+ ts.forEachChild(sourceFile, node => {
66
+ if (ts.isVariableStatement(node)) {
67
+ if (!node.modifiers?.find(m => m.kind === ts.SyntaxKind.ExportKeyword)) return;
68
+ const declaration = node.declarationList.declarations[0];
69
+ if (!declaration || !ts.isVariableDeclaration(declaration)) return;
70
+ const name = declaration.name.getText(sourceFile);
71
+ if (declaration.initializer && ts.isArrowFunction(declaration.initializer)) {
72
+ const params = declaration.initializer.parameters;
73
+ let paramType = "void";
74
+ params.length > 0 && (paramType = params[0].type?.getText(sourceFile) || "unknown");
75
+ try {
76
+ const typeString = `type QueryParams = ${paramType}`,
77
+ model = import_typescript.TypeScriptToModel.Generate(typeString),
78
+ valibotCode = import_model.ModelToValibot.Generate(model);
79
+ queries.push({
80
+ name,
81
+ params: paramType,
82
+ valibotCode
83
+ });
84
+ } catch (err) {
85
+ console.error(`\u2717 ${name}: ${err}`);
86
+ }
86
87
  }
87
88
  }
88
- }
89
- });
90
- } catch (err) {
91
- console.error(`Error processing ${file}:`, err);
92
- }
93
- return queries;
94
- }));
95
- allQueries.push(...results.flat()), console.info(`\u2713 ${allQueries.length} query validators`);
96
- }
97
- });
98
- const generate = (0, import_citty.defineCommand)({
99
- meta: {
100
- name: "generate",
101
- description: "Generate models, types, tables, and query validators"
102
- },
103
- args: {
104
- dir: {
105
- type: "positional",
106
- description: "Base directory (defaults to src/data)",
107
- required: !1,
108
- default: "src/data"
89
+ });
90
+ } catch (err) {
91
+ console.error(`Error processing ${file}:`, err);
92
+ }
93
+ return queries;
94
+ }));
95
+ allQueries.push(...results.flat()), console.info(`\u2713 ${allQueries.length} query validators`);
96
+ }
97
+ }),
98
+ generate = (0, import_citty.defineCommand)({
99
+ meta: {
100
+ name: "generate",
101
+ description: "Generate models, types, tables, and query validators"
109
102
  },
110
- watch: {
111
- type: "boolean",
112
- description: "Watch for changes and regenerate",
113
- required: !1,
114
- default: !1
103
+ args: {
104
+ dir: {
105
+ type: "positional",
106
+ description: "Base directory (defaults to src/data)",
107
+ required: !1,
108
+ default: "src/data"
109
+ },
110
+ watch: {
111
+ type: "boolean",
112
+ description: "Watch for changes and regenerate",
113
+ required: !1,
114
+ default: !1
115
+ },
116
+ after: {
117
+ type: "string",
118
+ description: "Command to run after generation completes",
119
+ required: !1
120
+ }
115
121
  },
116
- after: {
117
- type: "string",
118
- description: "Command to run after generation completes",
119
- required: !1
120
- }
121
- },
122
- async run({
123
- args
124
- }) {
125
- const baseDir = (0, import_node_path.resolve)(args.dir),
126
- modelsDir = (0, import_node_path.resolve)(baseDir, "models"),
127
- generatedDir = (0, import_node_path.resolve)(baseDir, "generated"),
128
- queriesDir = (0, import_node_path.resolve)(baseDir, "queries"),
129
- runGenerate = async () => {
130
- (0, import_node_fs.existsSync)(generatedDir) || (0, import_node_fs.mkdirSync)(generatedDir, {
131
- recursive: !0
132
- });
133
- const allModelFiles = (0, import_node_fs.readdirSync)(modelsDir).filter(f => f.endsWith(".ts")).sort(),
134
- filesWithSchema = (await Promise.all(allModelFiles.map(async f => ({
135
- file: f,
136
- hasSchema: (0, import_node_fs.readFileSync)((0, import_node_path.resolve)(modelsDir, f), "utf-8").includes("export const schema = table(")
137
- })))).filter(c => c.hasSchema).map(c => c.file),
138
- [modelsOutput, typesOutput, tablesOutput, readmeOutput] = await Promise.all([Promise.resolve(generateModelsFile(allModelFiles)), Promise.resolve(generateTypesFile(filesWithSchema)), Promise.resolve(generateTablesFile(filesWithSchema)), Promise.resolve(generateReadmeFile())]),
139
- filesChanged = (await Promise.all([Promise.resolve(writeFileIfChanged((0, import_node_path.resolve)(generatedDir, "models.ts"), modelsOutput)), Promise.resolve(writeFileIfChanged((0, import_node_path.resolve)(generatedDir, "types.ts"), typesOutput)), Promise.resolve(writeFileIfChanged((0, import_node_path.resolve)(generatedDir, "tables.ts"), tablesOutput)), Promise.resolve(writeFileIfChanged((0, import_node_path.resolve)(generatedDir, "README.md"), readmeOutput))])).filter(Boolean).length;
140
- if (filesChanged > 0 && console.info(` \u{1F4DD} Updated ${filesChanged} file(s)`), (0, import_node_fs.existsSync)(queriesDir)) {
141
- const queryFiles = (0, import_node_fs.readdirSync)(queriesDir).filter(f => f.endsWith(".ts")),
142
- allQueries = (await Promise.all(queryFiles.map(async file => {
143
- const filePath = (0, import_node_path.resolve)(queriesDir, file),
144
- fileBaseName = (0, import_node_path.basename)(file, ".ts"),
145
- queries = [];
146
- try {
147
- const content = (0, import_node_fs.readFileSync)(filePath, "utf-8"),
148
- sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, !0);
149
- ts.forEachChild(sourceFile, node => {
150
- if (ts.isVariableStatement(node)) {
151
- if (!node.modifiers?.find(m => m.kind === ts.SyntaxKind.ExportKeyword)) return;
152
- const declaration = node.declarationList.declarations[0];
153
- if (!declaration || !ts.isVariableDeclaration(declaration)) return;
154
- const name = declaration.name.getText(sourceFile);
155
- if (name === "permission") return;
156
- if (declaration.initializer && ts.isArrowFunction(declaration.initializer)) {
157
- const params = declaration.initializer.parameters;
158
- let paramType = "void";
159
- params.length > 0 && (paramType = params[0].type?.getText(sourceFile) || "unknown");
160
- try {
161
- const typeString = `type QueryParams = ${paramType}`,
162
- model = import_typescript.TypeScriptToModel.Generate(typeString),
163
- valibotCode = import_model.ModelToValibot.Generate(model);
164
- queries.push({
165
- name,
166
- params: paramType,
167
- valibotCode,
168
- sourceFile: fileBaseName
169
- });
170
- } catch (err) {
171
- console.error(`\u2717 ${name}: ${err}`);
122
+ async run({
123
+ args
124
+ }) {
125
+ const baseDir = (0, import_node_path.resolve)(args.dir),
126
+ modelsDir = (0, import_node_path.resolve)(baseDir, "models"),
127
+ generatedDir = (0, import_node_path.resolve)(baseDir, "generated"),
128
+ queriesDir = (0, import_node_path.resolve)(baseDir, "queries"),
129
+ runGenerate = async () => {
130
+ (0, import_node_fs.existsSync)(generatedDir) || (0, import_node_fs.mkdirSync)(generatedDir, {
131
+ recursive: !0
132
+ });
133
+ const allModelFiles = (0, import_node_fs.readdirSync)(modelsDir).filter(f => f.endsWith(".ts")).sort(),
134
+ filesWithSchema = (await Promise.all(allModelFiles.map(async f => ({
135
+ file: f,
136
+ hasSchema: (0, import_node_fs.readFileSync)((0, import_node_path.resolve)(modelsDir, f), "utf-8").includes("export const schema = table(")
137
+ })))).filter(c => c.hasSchema).map(c => c.file),
138
+ [modelsOutput, typesOutput, tablesOutput, readmeOutput] = await Promise.all([Promise.resolve(generateModelsFile(allModelFiles)), Promise.resolve(generateTypesFile(filesWithSchema)), Promise.resolve(generateTablesFile(filesWithSchema)), Promise.resolve(generateReadmeFile())]),
139
+ filesChanged = (await Promise.all([Promise.resolve(writeFileIfChanged((0, import_node_path.resolve)(generatedDir, "models.ts"), modelsOutput)), Promise.resolve(writeFileIfChanged((0, import_node_path.resolve)(generatedDir, "types.ts"), typesOutput)), Promise.resolve(writeFileIfChanged((0, import_node_path.resolve)(generatedDir, "tables.ts"), tablesOutput)), Promise.resolve(writeFileIfChanged((0, import_node_path.resolve)(generatedDir, "README.md"), readmeOutput))])).filter(Boolean).length;
140
+ if (filesChanged > 0 && console.info(` \u{1F4DD} Updated ${filesChanged} file(s)`), (0, import_node_fs.existsSync)(queriesDir)) {
141
+ const queryFiles = (0, import_node_fs.readdirSync)(queriesDir).filter(f => f.endsWith(".ts")),
142
+ allQueries = (await Promise.all(queryFiles.map(async file => {
143
+ const filePath = (0, import_node_path.resolve)(queriesDir, file),
144
+ fileBaseName = (0, import_node_path.basename)(file, ".ts"),
145
+ queries = [];
146
+ try {
147
+ const content = (0, import_node_fs.readFileSync)(filePath, "utf-8"),
148
+ sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, !0);
149
+ ts.forEachChild(sourceFile, node => {
150
+ if (ts.isVariableStatement(node)) {
151
+ if (!node.modifiers?.find(m => m.kind === ts.SyntaxKind.ExportKeyword)) return;
152
+ const declaration = node.declarationList.declarations[0];
153
+ if (!declaration || !ts.isVariableDeclaration(declaration)) return;
154
+ const name = declaration.name.getText(sourceFile);
155
+ if (name === "permission") return;
156
+ if (declaration.initializer && ts.isArrowFunction(declaration.initializer)) {
157
+ const params = declaration.initializer.parameters;
158
+ let paramType = "void";
159
+ params.length > 0 && (paramType = params[0].type?.getText(sourceFile) || "unknown");
160
+ try {
161
+ const typeString = `type QueryParams = ${paramType}`,
162
+ model = import_typescript.TypeScriptToModel.Generate(typeString),
163
+ valibotCode = import_model.ModelToValibot.Generate(model);
164
+ queries.push({
165
+ name,
166
+ params: paramType,
167
+ valibotCode,
168
+ sourceFile: fileBaseName
169
+ });
170
+ } catch (err) {
171
+ console.error(`\u2717 ${name}: ${err}`);
172
+ }
172
173
  }
173
174
  }
174
- }
175
- });
176
- } catch (err) {
177
- console.error(`Error processing ${file}:`, err);
178
- }
179
- return queries;
180
- }))).flat(),
181
- queriesOutput = generateQueriesFile(allQueries);
182
- writeFileIfChanged((0, import_node_path.resolve)(generatedDir, "queries.ts"), queriesOutput) && console.info(" \u{1F4DD} Updated queries.ts"), console.info(`\u2713 ${allModelFiles.length} models (${filesWithSchema.length} schemas), ${allQueries.length} queries`);
183
- } else console.info(`\u2713 ${allModelFiles.length} models (${filesWithSchema.length} schemas)`);
184
- if (args.after) try {
185
- const {
186
- execSync
187
- } = await import("node:child_process");
188
- execSync(args.after, {
189
- stdio: "inherit"
190
- });
191
- } catch (err) {
192
- console.error(`Error running after command: ${err}`);
193
- }
194
- };
195
- if (await runGenerate(), args.watch) {
196
- console.info(`
175
+ });
176
+ } catch (err) {
177
+ console.error(`Error processing ${file}:`, err);
178
+ }
179
+ return queries;
180
+ }))).flat(),
181
+ clientQueriesOutput = generateClientQueriesFile(allQueries),
182
+ serverQueriesOutput = generateServerQueriesFile(allQueries),
183
+ clientChanged = writeFileIfChanged((0, import_node_path.resolve)(generatedDir, "queries.client.ts"), clientQueriesOutput),
184
+ serverChanged = writeFileIfChanged((0, import_node_path.resolve)(generatedDir, "queries.server.ts"), serverQueriesOutput);
185
+ clientChanged && console.info(" \u{1F4DD} Updated queries.client.ts"), serverChanged && console.info(" \u{1F4DD} Updated queries.server.ts"), console.info(`\u2713 ${allModelFiles.length} models (${filesWithSchema.length} schemas), ${allQueries.length} queries`);
186
+ } else console.info(`\u2713 ${allModelFiles.length} models (${filesWithSchema.length} schemas)`);
187
+ if (args.after) try {
188
+ const {
189
+ execSync
190
+ } = await import("node:child_process");
191
+ execSync(args.after, {
192
+ stdio: "inherit"
193
+ });
194
+ } catch (err) {
195
+ console.error(`Error running after command: ${err}`);
196
+ }
197
+ };
198
+ if (await runGenerate(), args.watch) {
199
+ console.info(`
197
200
  \u{1F440} watching...
198
201
  `);
199
- const chokidar = await import("chokidar");
200
- let debounceTimer = null;
201
- const debouncedRegenerate = (path, event) => {
202
- debounceTimer && clearTimeout(debounceTimer), console.info(`
202
+ const chokidar = await import("chokidar");
203
+ let debounceTimer = null;
204
+ const debouncedRegenerate = (path, event) => {
205
+ debounceTimer && clearTimeout(debounceTimer), console.info(`
203
206
  ${event} ${path}`), debounceTimer = setTimeout(() => {
204
- runGenerate();
205
- }, 1e3);
206
- },
207
- watcher = chokidar.watch([modelsDir, queriesDir], {
208
- persistent: !0,
209
- ignoreInitial: !0
210
- });
211
- watcher.on("change", path => debouncedRegenerate(path, "\u{1F4DD}")), watcher.on("add", path => debouncedRegenerate(path, "\u2795")), watcher.on("unlink", path => debouncedRegenerate(path, "\u{1F5D1}\uFE0F ")), await new Promise(() => {});
207
+ runGenerate();
208
+ }, 1e3);
209
+ },
210
+ watcher = chokidar.watch([modelsDir, queriesDir], {
211
+ persistent: !0,
212
+ ignoreInitial: !0
213
+ });
214
+ watcher.on("change", path => debouncedRegenerate(path, "\u{1F4DD}")), watcher.on("add", path => debouncedRegenerate(path, "\u2795")), watcher.on("unlink", path => debouncedRegenerate(path, "\u{1F5D1}\uFE0F ")), await new Promise(() => {});
215
+ }
212
216
  }
213
- }
214
- });
217
+ });
215
218
  function generateModelsFile(modelFiles) {
216
219
  const modelNames = modelFiles.map(f => (0, import_node_path.basename)(f, ".ts")).sort(),
217
220
  getImportName = name => name === "user" ? "userPublic" : name,
@@ -253,16 +256,38 @@ ${modelNames.map(name => `export { schema as ${getExportName(name)} } from '../m
253
256
  `)}
254
257
  `;
255
258
  }
256
- function generateQueriesFile(queries) {
257
- const sortedQueries = [...queries].sort((a, b) => a.name.localeCompare(b.name)),
258
- queryByFile = /* @__PURE__ */new Map();
259
- for (const q of sortedQueries) queryByFile.has(q.sourceFile) || queryByFile.set(q.sourceFile, []), queryByFile.get(q.sourceFile).push(q);
260
- const imports = `import * as v from 'valibot'
259
+ function generateClientQueriesFile(queries) {
260
+ const sortedFiles = [...new Set(queries.map(q => q.sourceFile))].sort(),
261
+ imports = sortedFiles.map(file => `import * as ${file}Queries from '../queries/${file}'`).join(`
262
+ `),
263
+ namespaces = sortedFiles.map(file => ` ${file}: ${file}Queries,`).join(`
264
+ `);
265
+ return `/**
266
+ * auto-generated by: over-zero generate
267
+ *
268
+ * client-side query references for minification-safe query identity.
269
+ * this file re-exports all query modules - while this breaks tree-shaking,
270
+ * queries are typically small and few in number even in larger apps.
271
+ */
272
+ ${imports}
273
+
274
+ export const clientQueries = {
275
+ ${namespaces}
276
+ }
277
+ `;
278
+ }
279
+ function generateServerQueriesFile(queries) {
280
+ const queryByFile = /* @__PURE__ */new Map();
281
+ for (const q of queries) queryByFile.has(q.sourceFile) || queryByFile.set(q.sourceFile, []), queryByFile.get(q.sourceFile).push(q);
282
+ const sortedFiles = Array.from(queryByFile.keys()).sort(),
283
+ imports = `// auto-generated by: over-zero generate
284
+ // server-side syncedQuery wrappers with validators
261
285
  import { syncedQuery } from '@rocicorp/zero'
262
- ${Array.from(queryByFile.keys()).sort().map(file => `import * as ${file}Queries from '../queries/${file}'`).join(`
286
+ import * as v from 'valibot'
287
+ ${sortedFiles.map(file => `import * as ${file}Queries from '../queries/${file}'`).join(`
263
288
  `)}
264
289
  `,
265
- syncedQueries = sortedQueries.map(q => {
290
+ syncedQueryDefs = [...queries].sort((a, b) => a.name.localeCompare(b.name)).map(q => {
266
291
  const lines = q.valibotCode.split(`
267
292
  `).filter(l => l.trim()),
268
293
  schemaLineIndex = lines.findIndex(l => l.startsWith("export const QueryParams"));
@@ -280,17 +305,30 @@ ${Array.from(queryByFile.keys()).sort().map(file => `import * as ${file}Queries
280
305
  `);
281
306
  }
282
307
  const wrappedValidator = validatorDef === "v.void()" ? "v.parser(v.tuple([]))" : `v.parser(v.tuple([${validatorDef}]))`,
308
+ namespacedName = `${q.sourceFile}.${q.name}`,
283
309
  queryFn = validatorDef === "v.void()" ? `() => {
284
- return ${q.sourceFile}Queries.${q.name}()
285
- }` : `(arg) => {
286
- return ${q.sourceFile}Queries.${q.name}(arg)
287
- }`;
288
- return `export const ${q.name} = syncedQuery('${q.name}', ${wrappedValidator}, ${queryFn})`;
310
+ return ${q.sourceFile}Queries.${q.name}()
311
+ }` : `(arg) => {
312
+ return ${q.sourceFile}Queries.${q.name}(arg)
313
+ }`;
314
+ return `const ${q.name}Synced = syncedQuery('${namespacedName}', ${wrappedValidator}, ${queryFn})`;
289
315
  }).join(`
290
316
 
317
+ `),
318
+ namespaces = sortedFiles.map(file => {
319
+ const queryEntries = queryByFile.get(file).sort((a, b) => a.name.localeCompare(b.name)).map(q => ` ${q.name}: ${q.name}Synced,`).join(`
291
320
  `);
292
- return imports + `
293
- ` + syncedQueries + `
321
+ return ` ${file}: {
322
+ ${queryEntries}
323
+ },`;
324
+ }).join(`
325
+ `);
326
+ return `${imports}
327
+ ${syncedQueryDefs}
328
+
329
+ export const serverQueries = {
330
+ ${namespaces}
331
+ }
294
332
  `;
295
333
  }
296
334
  function generateReadmeFile() {
@@ -303,7 +341,8 @@ this folder is auto-generated by over-zero. do not edit files here directly.
303
341
  - \`models.ts\` - exports all models from ../models
304
342
  - \`types.ts\` - typescript types derived from table schemas
305
343
  - \`tables.ts\` - exports table schemas for type inference
306
- - \`queries.ts\` - synced query definitions with validators
344
+ - \`queries.client.ts\` - namespaced query references for client setup
345
+ - \`queries.server.ts\` - namespaced syncedQuery wrappers for server setup
307
346
 
308
347
  ## usage guidelines
309
348
 
@@ -311,16 +350,15 @@ this folder is auto-generated by over-zero. do not edit files here directly.
311
350
 
312
351
  ### queries
313
352
 
314
- don't import queries from this folder on the client. instead, import from \`../queries/\`:
353
+ write your queries as plain functions in \`../queries/\` and import them directly:
315
354
 
316
355
  \`\`\`ts
317
- // \u274C bad - don't import from generated
318
- import { channelMessages } from '~/data/generated/queries'
319
-
320
356
  // \u2705 good - import from queries
321
357
  import { channelMessages } from '~/data/queries/message'
322
358
  \`\`\`
323
359
 
360
+ the generated query files are only used internally by zero client/server setup.
361
+
324
362
  ### types
325
363
 
326
364
  you can import types from this folder, but prefer re-exporting from \`../types.ts\`:
package/dist/cjs/cli.js CHANGED
@@ -18,7 +18,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
18
18
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: !0 }) : target,
19
19
  mod
20
20
  ));
21
- var import_model = require("@sinclair/typebox-codegen/model"), import_typescript = require("@sinclair/typebox-codegen/typescript"), import_citty = require("citty"), import_node_fs = require("node:fs"), import_node_path = require("node:path"), ts = __toESM(require("typescript"), 1);
21
+ var import_node_fs = require("node:fs"), import_node_path = require("node:path"), import_model = require("@sinclair/typebox-codegen/model"), import_typescript = require("@sinclair/typebox-codegen/typescript"), import_citty = require("citty"), ts = __toESM(require("typescript"), 1);
22
22
  function writeFileIfChanged(filePath, content) {
23
23
  try {
24
24
  if ((0, import_node_fs.existsSync)(filePath) && (0, import_node_fs.readFileSync)(filePath, "utf-8") === content)
@@ -80,8 +80,7 @@ const generateQueries = (0, import_citty.defineCommand)({
80
80
  );
81
81
  allQueries.push(...results.flat()), console.info(`\u2713 ${allQueries.length} query validators`);
82
82
  }
83
- });
84
- const generate = (0, import_citty.defineCommand)({
83
+ }), generate = (0, import_citty.defineCommand)({
85
84
  meta: {
86
85
  name: "generate",
87
86
  description: "Generate models, types, tables, and query validators"
@@ -177,11 +176,14 @@ const generate = (0, import_citty.defineCommand)({
177
176
  }
178
177
  return queries;
179
178
  })
180
- )).flat(), queriesOutput = generateQueriesFile(allQueries);
181
- writeFileIfChanged(
182
- (0, import_node_path.resolve)(generatedDir, "queries.ts"),
183
- queriesOutput
184
- ) && console.info(" \u{1F4DD} Updated queries.ts"), console.info(
179
+ )).flat(), clientQueriesOutput = generateClientQueriesFile(allQueries), serverQueriesOutput = generateServerQueriesFile(allQueries), clientChanged = writeFileIfChanged(
180
+ (0, import_node_path.resolve)(generatedDir, "queries.client.ts"),
181
+ clientQueriesOutput
182
+ ), serverChanged = writeFileIfChanged(
183
+ (0, import_node_path.resolve)(generatedDir, "queries.server.ts"),
184
+ serverQueriesOutput
185
+ );
186
+ clientChanged && console.info(" \u{1F4DD} Updated queries.client.ts"), serverChanged && console.info(" \u{1F4DD} Updated queries.server.ts"), console.info(
185
187
  `\u2713 ${allModelFiles.length} models (${filesWithSchema.length} schemas), ${allQueries.length} queries`
186
188
  );
187
189
  } else
@@ -253,15 +255,35 @@ ${modelNames.map((name) => `export { schema as ${getExportName(name)} } from '..
253
255
  `)}
254
256
  `;
255
257
  }
256
- function generateQueriesFile(queries) {
257
- const sortedQueries = [...queries].sort((a, b) => a.name.localeCompare(b.name)), queryByFile = /* @__PURE__ */ new Map();
258
- for (const q of sortedQueries)
258
+ function generateClientQueriesFile(queries) {
259
+ const sortedFiles = [...new Set(queries.map((q) => q.sourceFile))].sort(), imports = sortedFiles.map((file) => `import * as ${file}Queries from '../queries/${file}'`).join(`
260
+ `), namespaces = sortedFiles.map((file) => ` ${file}: ${file}Queries,`).join(`
261
+ `);
262
+ return `/**
263
+ * auto-generated by: over-zero generate
264
+ *
265
+ * client-side query references for minification-safe query identity.
266
+ * this file re-exports all query modules - while this breaks tree-shaking,
267
+ * queries are typically small and few in number even in larger apps.
268
+ */
269
+ ${imports}
270
+
271
+ export const clientQueries = {
272
+ ${namespaces}
273
+ }
274
+ `;
275
+ }
276
+ function generateServerQueriesFile(queries) {
277
+ const queryByFile = /* @__PURE__ */ new Map();
278
+ for (const q of queries)
259
279
  queryByFile.has(q.sourceFile) || queryByFile.set(q.sourceFile, []), queryByFile.get(q.sourceFile).push(q);
260
- const imports = `import * as v from 'valibot'
280
+ const sortedFiles = Array.from(queryByFile.keys()).sort(), imports = `// auto-generated by: over-zero generate
281
+ // server-side syncedQuery wrappers with validators
261
282
  import { syncedQuery } from '@rocicorp/zero'
262
- ${Array.from(queryByFile.keys()).sort().map((file) => `import * as ${file}Queries from '../queries/${file}'`).join(`
283
+ import * as v from 'valibot'
284
+ ${sortedFiles.map((file) => `import * as ${file}Queries from '../queries/${file}'`).join(`
263
285
  `)}
264
- `, syncedQueries = sortedQueries.map((q) => {
286
+ `, syncedQueryDefs = [...queries].sort((a, b) => a.name.localeCompare(b.name)).map((q) => {
265
287
  const lines = q.valibotCode.split(`
266
288
  `).filter((l) => l.trim()), schemaLineIndex = lines.findIndex(
267
289
  (l) => l.startsWith("export const QueryParams")
@@ -278,17 +300,28 @@ ${Array.from(queryByFile.keys()).sort().map((file) => `import * as ${file}Querie
278
300
  validatorDef = schemaLines.join(`
279
301
  `);
280
302
  }
281
- const wrappedValidator = validatorDef === "v.void()" ? "v.parser(v.tuple([]))" : `v.parser(v.tuple([${validatorDef}]))`, queryFn = validatorDef === "v.void()" ? `() => {
282
- return ${q.sourceFile}Queries.${q.name}()
283
- }` : `(arg) => {
284
- return ${q.sourceFile}Queries.${q.name}(arg)
285
- }`;
286
- return `export const ${q.name} = syncedQuery('${q.name}', ${wrappedValidator}, ${queryFn})`;
303
+ const wrappedValidator = validatorDef === "v.void()" ? "v.parser(v.tuple([]))" : `v.parser(v.tuple([${validatorDef}]))`, namespacedName = `${q.sourceFile}.${q.name}`, queryFn = validatorDef === "v.void()" ? `() => {
304
+ return ${q.sourceFile}Queries.${q.name}()
305
+ }` : `(arg) => {
306
+ return ${q.sourceFile}Queries.${q.name}(arg)
307
+ }`;
308
+ return `const ${q.name}Synced = syncedQuery('${namespacedName}', ${wrappedValidator}, ${queryFn})`;
287
309
  }).join(`
288
310
 
311
+ `), namespaces = sortedFiles.map((file) => {
312
+ const queryEntries = queryByFile.get(file).sort((a, b) => a.name.localeCompare(b.name)).map((q) => ` ${q.name}: ${q.name}Synced,`).join(`
313
+ `);
314
+ return ` ${file}: {
315
+ ${queryEntries}
316
+ },`;
317
+ }).join(`
289
318
  `);
290
- return imports + `
291
- ` + syncedQueries + `
319
+ return `${imports}
320
+ ${syncedQueryDefs}
321
+
322
+ export const serverQueries = {
323
+ ${namespaces}
324
+ }
292
325
  `;
293
326
  }
294
327
  function generateReadmeFile() {
@@ -301,7 +334,8 @@ this folder is auto-generated by over-zero. do not edit files here directly.
301
334
  - \`models.ts\` - exports all models from ../models
302
335
  - \`types.ts\` - typescript types derived from table schemas
303
336
  - \`tables.ts\` - exports table schemas for type inference
304
- - \`queries.ts\` - synced query definitions with validators
337
+ - \`queries.client.ts\` - namespaced query references for client setup
338
+ - \`queries.server.ts\` - namespaced syncedQuery wrappers for server setup
305
339
 
306
340
  ## usage guidelines
307
341
 
@@ -309,16 +343,15 @@ this folder is auto-generated by over-zero. do not edit files here directly.
309
343
 
310
344
  ### queries
311
345
 
312
- don't import queries from this folder on the client. instead, import from \`../queries/\`:
346
+ write your queries as plain functions in \`../queries/\` and import them directly:
313
347
 
314
348
  \`\`\`ts
315
- // \u274C bad - don't import from generated
316
- import { channelMessages } from '~/data/generated/queries'
317
-
318
349
  // \u2705 good - import from queries
319
350
  import { channelMessages } from '~/data/queries/message'
320
351
  \`\`\`
321
352
 
353
+ the generated query files are only used internally by zero client/server setup.
354
+
322
355
  ### types
323
356
 
324
357
  you can import types from this folder, but prefer re-exporting from \`../types.ts\`: