over-zero 0.0.32 → 0.0.34

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 +224 -205
  3. package/dist/cjs/cli.js +57 -40
  4. package/dist/cjs/cli.js.map +1 -1
  5. package/dist/cjs/cli.native.js +270 -248
  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 +6 -3
  10. package/dist/cjs/createZeroClient.js +11 -4
  11. package/dist/cjs/createZeroClient.js.map +1 -1
  12. package/dist/cjs/createZeroClient.native.js +40 -5
  13. package/dist/cjs/createZeroClient.native.js.map +1 -1
  14. package/dist/cjs/createZeroServer.cjs +5 -3
  15. package/dist/cjs/createZeroServer.js +8 -3
  16. package/dist/cjs/createZeroServer.js.map +1 -1
  17. package/dist/cjs/createZeroServer.native.js +39 -3
  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 +58 -41
  59. package/dist/esm/cli.js.map +1 -1
  60. package/dist/esm/cli.mjs +223 -204
  61. package/dist/esm/cli.mjs.map +1 -1
  62. package/dist/esm/cli.native.js +269 -247
  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 +11 -3
  68. package/dist/esm/createZeroClient.js.map +1 -1
  69. package/dist/esm/createZeroClient.mjs +6 -3
  70. package/dist/esm/createZeroClient.mjs.map +1 -1
  71. package/dist/esm/createZeroClient.native.js +40 -5
  72. package/dist/esm/createZeroClient.native.js.map +1 -1
  73. package/dist/esm/createZeroServer.js +8 -3
  74. package/dist/esm/createZeroServer.js.map +1 -1
  75. package/dist/esm/createZeroServer.mjs +5 -3
  76. package/dist/esm/createZeroServer.mjs.map +1 -1
  77. package/dist/esm/createZeroServer.native.js +39 -3
  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 +119 -122
  135. package/src/createPermissions.ts +8 -6
  136. package/src/createZeroClient.tsx +37 -15
  137. package/src/createZeroServer.ts +30 -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 +5 -3
  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
+ groupedQueriesOutput = generateGroupedQueriesFile(allQueries),
182
+ syncedQueriesOutput = generateSyncedQueriesFile(allQueries),
183
+ groupedChanged = writeFileIfChanged((0, import_node_path.resolve)(generatedDir, "groupedQueries.ts"), groupedQueriesOutput),
184
+ syncedChanged = writeFileIfChanged((0, import_node_path.resolve)(generatedDir, "syncedQueries.ts"), syncedQueriesOutput);
185
+ groupedChanged && console.info(" \u{1F4DD} Updated groupedQueries.ts"), syncedChanged && console.info(" \u{1F4DD} Updated syncedQueries.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,44 +256,60 @@ ${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'
261
- import { syncedQuery } from '@rocicorp/zero'
262
- ${Array.from(queryByFile.keys()).sort().map(file => `import * as ${file}Queries from '../queries/${file}'`).join(`
259
+ function generateGroupedQueriesFile(queries) {
260
+ return `/**
261
+ * auto-generated by: over-zero generate
262
+ *
263
+ * grouped query re-exports for minification-safe query identity.
264
+ * this file re-exports all query modules - while this breaks tree-shaking,
265
+ * queries are typically small and few in number even in larger apps.
266
+ */
267
+ ${[...new Set(queries.map(q => q.sourceFile))].sort().map(file => `export * as ${file} from '../queries/${file}'`).join(`
263
268
  `)}
269
+ `;
270
+ }
271
+ function generateSyncedQueriesFile(queries) {
272
+ const queryByFile = /* @__PURE__ */new Map();
273
+ for (const q of queries) queryByFile.has(q.sourceFile) || queryByFile.set(q.sourceFile, []), queryByFile.get(q.sourceFile).push(q);
274
+ const sortedFiles = Array.from(queryByFile.keys()).sort(),
275
+ imports = `// auto-generated by: over-zero generate
276
+ // server-side syncedQuery wrappers with validators
277
+ import { syncedQuery } from '@rocicorp/zero'
278
+ import * as v from 'valibot'
279
+ import * as Queries from './groupedQueries'
264
280
  `,
265
- syncedQueries = sortedQueries.map(q => {
266
- const lines = q.valibotCode.split(`
281
+ namespaceExports = sortedFiles.map(file => {
282
+ const queryDefs = queryByFile.get(file).sort((a, b) => a.name.localeCompare(b.name)).map(q => {
283
+ const lines = q.valibotCode.split(`
267
284
  `).filter(l => l.trim()),
268
- schemaLineIndex = lines.findIndex(l => l.startsWith("export const QueryParams"));
269
- let validatorDef = "v.void()";
270
- if (schemaLineIndex !== -1) {
271
- const schemaLines = [];
272
- let openBraces = 0,
273
- started = !1;
274
- for (let i = schemaLineIndex; i < lines.length; i++) {
275
- const line = lines[i],
276
- cleaned = started ? line : line.replace("export const QueryParams = ", "");
277
- if (schemaLines.push(cleaned), started = !0, openBraces += (cleaned.match(/\{/g) || []).length, openBraces -= (cleaned.match(/\}/g) || []).length, openBraces += (cleaned.match(/\(/g) || []).length, openBraces -= (cleaned.match(/\)/g) || []).length, openBraces === 0 && schemaLines.length > 0) break;
285
+ schemaLineIndex = lines.findIndex(l => l.startsWith("export const QueryParams"));
286
+ let validatorDef = "v.void()";
287
+ if (schemaLineIndex !== -1) {
288
+ const schemaLines = [];
289
+ let openBraces = 0,
290
+ started = !1;
291
+ for (let i = schemaLineIndex; i < lines.length; i++) {
292
+ const line = lines[i],
293
+ cleaned = started ? line : line.replace("export const QueryParams = ", "");
294
+ if (schemaLines.push(cleaned), started = !0, openBraces += (cleaned.match(/\{/g) || []).length, openBraces -= (cleaned.match(/\}/g) || []).length, openBraces += (cleaned.match(/\(/g) || []).length, openBraces -= (cleaned.match(/\)/g) || []).length, openBraces === 0 && schemaLines.length > 0) break;
295
+ }
296
+ validatorDef = schemaLines.join(`
297
+ `);
278
298
  }
279
- validatorDef = schemaLines.join(`
299
+ const wrappedValidator = validatorDef === "v.void()" ? "v.parser(v.tuple([]))" : `v.parser(v.tuple([${validatorDef}]))`,
300
+ namespacedName = `${q.sourceFile}.${q.name}`,
301
+ queryFn = validatorDef === "v.void()" ? `() => Queries.${file}.${q.name}()` : `(arg) => Queries.${file}.${q.name}(arg)`;
302
+ return ` ${q.name}: syncedQuery('${namespacedName}', ${wrappedValidator}, ${queryFn}),`;
303
+ }).join(`
280
304
  `);
281
- }
282
- const wrappedValidator = validatorDef === "v.void()" ? "v.parser(v.tuple([]))" : `v.parser(v.tuple([${validatorDef}]))`,
283
- queryFn = validatorDef === "v.void()" ? `() => {
284
- return ${q.sourceFile}Queries.${q.name}()
285
- }` : `(arg) => {
286
- return ${q.sourceFile}Queries.${q.name}(arg)
305
+ return `export const ${file} = {
306
+ ${queryDefs}
287
307
  }`;
288
- return `export const ${q.name} = syncedQuery('${q.name}', ${wrappedValidator}, ${queryFn})`;
289
308
  }).join(`
290
309
 
291
310
  `);
292
- return imports + `
293
- ` + syncedQueries + `
311
+ return `${imports}
312
+ ${namespaceExports}
294
313
  `;
295
314
  }
296
315
  function generateReadmeFile() {
@@ -303,7 +322,8 @@ this folder is auto-generated by over-zero. do not edit files here directly.
303
322
  - \`models.ts\` - exports all models from ../models
304
323
  - \`types.ts\` - typescript types derived from table schemas
305
324
  - \`tables.ts\` - exports table schemas for type inference
306
- - \`queries.ts\` - synced query definitions with validators
325
+ - \`groupedQueries.ts\` - namespaced query re-exports for client setup
326
+ - \`syncedQueries.ts\` - namespaced syncedQuery wrappers for server setup
307
327
 
308
328
  ## usage guidelines
309
329
 
@@ -311,16 +331,15 @@ this folder is auto-generated by over-zero. do not edit files here directly.
311
331
 
312
332
  ### queries
313
333
 
314
- don't import queries from this folder on the client. instead, import from \`../queries/\`:
334
+ write your queries as plain functions in \`../queries/\` and import them directly:
315
335
 
316
336
  \`\`\`ts
317
- // \u274C bad - don't import from generated
318
- import { channelMessages } from '~/data/generated/queries'
319
-
320
337
  // \u2705 good - import from queries
321
338
  import { channelMessages } from '~/data/queries/message'
322
339
  \`\`\`
323
340
 
341
+ the generated query files are only used internally by zero client/server setup.
342
+
324
343
  ### types
325
344
 
326
345
  you can import types from this folder, but prefer re-exporting from \`../types.ts\`: