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.
- package/cli.cjs +3 -0
- package/dist/cjs/cli.cjs +228 -190
- package/dist/cjs/cli.js +60 -27
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/cli.native.js +277 -228
- package/dist/cjs/cli.native.js.map +1 -1
- package/dist/cjs/createPermissions.js.map +1 -1
- package/dist/cjs/createPermissions.native.js.map +1 -1
- package/dist/cjs/createZeroClient.cjs +21 -14
- package/dist/cjs/createZeroClient.js +18 -10
- package/dist/cjs/createZeroClient.js.map +1 -1
- package/dist/cjs/createZeroClient.native.js +48 -9
- package/dist/cjs/createZeroClient.native.js.map +1 -1
- package/dist/cjs/createZeroServer.cjs +3 -2
- package/dist/cjs/createZeroServer.js +2 -2
- package/dist/cjs/createZeroServer.js.map +1 -1
- package/dist/cjs/createZeroServer.native.js +4 -2
- package/dist/cjs/createZeroServer.native.js.map +1 -1
- package/dist/cjs/helpers/batchQuery.js.map +1 -1
- package/dist/cjs/helpers/batchQuery.native.js.map +1 -1
- package/dist/cjs/helpers/createMutators.js.map +1 -1
- package/dist/cjs/helpers/createMutators.native.js.map +1 -1
- package/dist/cjs/helpers/didRunPermissionCheck.js.map +1 -1
- package/dist/cjs/helpers/didRunPermissionCheck.native.js.map +1 -1
- package/dist/cjs/helpers/ensureLoggedIn.js.map +1 -1
- package/dist/cjs/helpers/ensureLoggedIn.native.js.map +1 -1
- package/dist/cjs/helpers/getQueryOrMutatorAuthData.js.map +1 -1
- package/dist/cjs/helpers/getQueryOrMutatorAuthData.native.js.map +1 -1
- package/dist/cjs/helpers/mutatorContext.js.map +1 -1
- package/dist/cjs/helpers/mutatorContext.native.js.map +1 -1
- package/dist/cjs/helpers/prettyFormatZeroQuery.js.map +1 -1
- package/dist/cjs/helpers/prettyFormatZeroQuery.native.js.map +1 -1
- package/dist/cjs/helpers/useZeroDebug.js.map +1 -1
- package/dist/cjs/helpers/useZeroDebug.native.js.map +1 -1
- package/dist/cjs/index.cjs +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.native.js +1 -0
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/mutations.js.map +1 -1
- package/dist/cjs/mutations.native.js.map +1 -1
- package/dist/cjs/{builder.cjs → queryRegistry.cjs} +12 -10
- package/dist/cjs/{queryBuilder.js → queryRegistry.js} +13 -11
- package/dist/cjs/queryRegistry.js.map +6 -0
- package/dist/cjs/{queryBuilder.native.js → queryRegistry.native.js} +13 -12
- package/dist/cjs/queryRegistry.native.js.map +1 -0
- package/dist/cjs/serverWhere.js.map +1 -1
- package/dist/cjs/serverWhere.native.js.map +1 -1
- package/dist/cjs/state.cjs +1 -4
- package/dist/cjs/state.js +1 -4
- package/dist/cjs/state.js.map +1 -1
- package/dist/cjs/state.native.js +1 -2
- package/dist/cjs/state.native.js.map +1 -1
- package/dist/cjs/where.js.map +1 -1
- package/dist/cjs/where.native.js.map +1 -1
- package/dist/cjs/zql.js.map +1 -1
- package/dist/cjs/zql.native.js.map +1 -1
- package/dist/esm/cli.js +61 -28
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/cli.mjs +227 -189
- package/dist/esm/cli.mjs.map +1 -1
- package/dist/esm/cli.native.js +276 -227
- package/dist/esm/cli.native.js.map +1 -1
- package/dist/esm/createPermissions.js.map +1 -1
- package/dist/esm/createPermissions.mjs.map +1 -1
- package/dist/esm/createPermissions.native.js.map +1 -1
- package/dist/esm/createZeroClient.js +18 -9
- package/dist/esm/createZeroClient.js.map +1 -1
- package/dist/esm/createZeroClient.mjs +21 -14
- package/dist/esm/createZeroClient.mjs.map +1 -1
- package/dist/esm/createZeroClient.native.js +48 -9
- package/dist/esm/createZeroClient.native.js.map +1 -1
- package/dist/esm/createZeroServer.js +2 -2
- package/dist/esm/createZeroServer.js.map +1 -1
- package/dist/esm/createZeroServer.mjs +3 -2
- package/dist/esm/createZeroServer.mjs.map +1 -1
- package/dist/esm/createZeroServer.native.js +4 -2
- package/dist/esm/createZeroServer.native.js.map +1 -1
- package/dist/esm/helpers/batchQuery.js.map +1 -1
- package/dist/esm/helpers/batchQuery.mjs.map +1 -1
- package/dist/esm/helpers/batchQuery.native.js.map +1 -1
- package/dist/esm/helpers/createMutators.js.map +1 -1
- package/dist/esm/helpers/createMutators.mjs.map +1 -1
- package/dist/esm/helpers/createMutators.native.js.map +1 -1
- package/dist/esm/helpers/didRunPermissionCheck.js.map +1 -1
- package/dist/esm/helpers/didRunPermissionCheck.mjs.map +1 -1
- package/dist/esm/helpers/didRunPermissionCheck.native.js.map +1 -1
- package/dist/esm/helpers/ensureLoggedIn.js.map +1 -1
- package/dist/esm/helpers/ensureLoggedIn.mjs.map +1 -1
- package/dist/esm/helpers/ensureLoggedIn.native.js.map +1 -1
- package/dist/esm/helpers/getQueryOrMutatorAuthData.js.map +1 -1
- package/dist/esm/helpers/getQueryOrMutatorAuthData.mjs.map +1 -1
- package/dist/esm/helpers/getQueryOrMutatorAuthData.native.js.map +1 -1
- package/dist/esm/helpers/mutatorContext.js.map +1 -1
- package/dist/esm/helpers/mutatorContext.mjs.map +1 -1
- package/dist/esm/helpers/mutatorContext.native.js.map +1 -1
- package/dist/esm/helpers/prettyFormatZeroQuery.js.map +1 -1
- package/dist/esm/helpers/prettyFormatZeroQuery.mjs.map +1 -1
- package/dist/esm/helpers/prettyFormatZeroQuery.native.js.map +1 -1
- package/dist/esm/helpers/useZeroDebug.js.map +1 -1
- package/dist/esm/helpers/useZeroDebug.mjs.map +1 -1
- package/dist/esm/helpers/useZeroDebug.native.js.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +1 -0
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +1 -0
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/mutations.js.map +1 -1
- package/dist/esm/mutations.mjs.map +1 -1
- package/dist/esm/mutations.native.js.map +1 -1
- package/dist/esm/queryRegistry.js +12 -0
- package/dist/esm/queryRegistry.js.map +6 -0
- package/dist/esm/queryRegistry.mjs +9 -0
- package/dist/esm/queryRegistry.mjs.map +1 -0
- package/dist/esm/queryRegistry.native.js +9 -0
- package/dist/esm/queryRegistry.native.js.map +1 -0
- package/dist/esm/serverWhere.js.map +1 -1
- package/dist/esm/serverWhere.mjs.map +1 -1
- package/dist/esm/serverWhere.native.js.map +1 -1
- package/dist/esm/state.js +1 -4
- package/dist/esm/state.js.map +1 -1
- package/dist/esm/state.mjs +1 -4
- package/dist/esm/state.mjs.map +1 -1
- package/dist/esm/state.native.js +1 -2
- package/dist/esm/state.native.js.map +1 -1
- package/dist/esm/where.js.map +1 -1
- package/dist/esm/where.mjs.map +1 -1
- package/dist/esm/where.native.js.map +1 -1
- package/dist/esm/zql.js.map +1 -1
- package/dist/esm/zql.mjs.map +1 -1
- package/dist/esm/zql.native.js.map +1 -1
- package/package.json +4 -4
- package/src/cli.ts +99 -79
- package/src/createPermissions.ts +8 -6
- package/src/createZeroClient.tsx +47 -17
- package/src/createZeroServer.ts +21 -15
- package/src/helpers/batchQuery.ts +2 -1
- package/src/helpers/createMutators.ts +3 -1
- package/src/helpers/didRunPermissionCheck.ts +1 -0
- package/src/helpers/ensureLoggedIn.ts +3 -1
- package/src/helpers/getQueryOrMutatorAuthData.ts +2 -1
- package/src/helpers/mutatorContext.ts +1 -0
- package/src/helpers/prettyFormatZeroQuery.ts +2 -1
- package/src/helpers/useZeroDebug.ts +3 -1
- package/src/index.ts +1 -0
- package/src/mutations.ts +2 -1
- package/src/queryRegistry.ts +12 -0
- package/src/serverWhere.ts +3 -2
- package/src/state.ts +2 -2
- package/src/types.ts +10 -9
- package/src/where.ts +3 -1
- package/src/zql.ts +1 -0
- package/types/createPermissions.d.ts +1 -1
- package/types/createPermissions.d.ts.map +1 -1
- package/types/createZeroClient.d.ts +8 -6
- package/types/createZeroClient.d.ts.map +1 -1
- package/types/createZeroServer.d.ts +4 -3
- package/types/createZeroServer.d.ts.map +1 -1
- package/types/helpers/batchQuery.d.ts.map +1 -1
- package/types/helpers/createMutators.d.ts.map +1 -1
- package/types/helpers/didRunPermissionCheck.d.ts.map +1 -1
- package/types/helpers/ensureLoggedIn.d.ts.map +1 -1
- package/types/helpers/getQueryOrMutatorAuthData.d.ts.map +1 -1
- package/types/helpers/mutatorContext.d.ts.map +1 -1
- package/types/helpers/prettyFormatZeroQuery.d.ts.map +1 -1
- package/types/helpers/useZeroDebug.d.ts.map +1 -1
- package/types/index.d.ts +1 -0
- package/types/index.d.ts.map +1 -1
- package/types/mutations.d.ts +1 -1
- package/types/mutations.d.ts.map +1 -1
- package/types/queryRegistry.d.ts +3 -0
- package/types/queryRegistry.d.ts.map +1 -0
- package/types/serverWhere.d.ts +1 -1
- package/types/serverWhere.d.ts.map +1 -1
- package/types/state.d.ts.map +1 -1
- package/types/types.d.ts.map +1 -1
- package/types/where.d.ts +1 -1
- package/types/where.d.ts.map +1 -1
- package/types/zql.d.ts.map +1 -1
- package/dist/cjs/builder.js +0 -26
- package/dist/cjs/builder.js.map +0 -6
- package/dist/cjs/builder.native.js +0 -35
- package/dist/cjs/builder.native.js.map +0 -1
- package/dist/cjs/helpers/context.cjs +0 -40
- package/dist/cjs/helpers/context.js +0 -36
- package/dist/cjs/helpers/context.js.map +0 -6
- package/dist/cjs/helpers/context.native.js +0 -43
- package/dist/cjs/helpers/context.native.js.map +0 -1
- package/dist/cjs/helpers/queryContext.cjs +0 -40
- package/dist/cjs/helpers/queryContext.js +0 -36
- package/dist/cjs/helpers/queryContext.js.map +0 -6
- package/dist/cjs/helpers/queryContext.native.js +0 -43
- package/dist/cjs/helpers/queryContext.native.js.map +0 -1
- package/dist/cjs/helpers/queryOrMutatorAuthData.cjs +0 -0
- package/dist/cjs/helpers/queryOrMutatorAuthData.js +0 -1
- package/dist/cjs/helpers/queryOrMutatorAuthData.js.map +0 -6
- package/dist/cjs/helpers/queryOrMutatorAuthData.native.js +0 -2
- package/dist/cjs/helpers/queryOrMutatorAuthData.native.js.map +0 -1
- package/dist/cjs/helpers/queryOrMutatorContext.cjs +0 -0
- package/dist/cjs/helpers/queryOrMutatorContext.js +0 -1
- package/dist/cjs/helpers/queryOrMutatorContext.js.map +0 -6
- package/dist/cjs/helpers/queryOrMutatorContext.native.js +0 -2
- package/dist/cjs/helpers/queryOrMutatorContext.native.js.map +0 -1
- package/dist/cjs/query.cjs +0 -34
- package/dist/cjs/query.js +0 -28
- package/dist/cjs/query.js.map +0 -6
- package/dist/cjs/query.native.js +0 -39
- package/dist/cjs/query.native.js.map +0 -1
- package/dist/cjs/queryBuilder.cjs +0 -31
- package/dist/cjs/queryBuilder.js.map +0 -6
- package/dist/cjs/queryBuilder.native.js.map +0 -1
- package/dist/esm/builder.js +0 -10
- package/dist/esm/builder.js.map +0 -6
- package/dist/esm/builder.mjs +0 -8
- package/dist/esm/builder.mjs.map +0 -1
- package/dist/esm/builder.native.js +0 -9
- package/dist/esm/builder.native.js.map +0 -1
- package/dist/esm/helpers/context.js +0 -20
- package/dist/esm/helpers/context.js.map +0 -6
- package/dist/esm/helpers/context.mjs +0 -15
- package/dist/esm/helpers/context.mjs.map +0 -1
- package/dist/esm/helpers/context.native.js +0 -15
- package/dist/esm/helpers/context.native.js.map +0 -1
- package/dist/esm/helpers/queryContext.js +0 -20
- package/dist/esm/helpers/queryContext.js.map +0 -6
- package/dist/esm/helpers/queryContext.mjs +0 -15
- package/dist/esm/helpers/queryContext.mjs.map +0 -1
- package/dist/esm/helpers/queryContext.native.js +0 -15
- package/dist/esm/helpers/queryContext.native.js.map +0 -1
- package/dist/esm/helpers/queryOrMutatorAuthData.js +0 -1
- package/dist/esm/helpers/queryOrMutatorAuthData.js.map +0 -6
- package/dist/esm/helpers/queryOrMutatorAuthData.mjs +0 -2
- package/dist/esm/helpers/queryOrMutatorAuthData.mjs.map +0 -1
- package/dist/esm/helpers/queryOrMutatorAuthData.native.js +0 -2
- package/dist/esm/helpers/queryOrMutatorAuthData.native.js.map +0 -1
- package/dist/esm/helpers/queryOrMutatorContext.js +0 -1
- package/dist/esm/helpers/queryOrMutatorContext.js.map +0 -6
- package/dist/esm/helpers/queryOrMutatorContext.mjs +0 -2
- package/dist/esm/helpers/queryOrMutatorContext.mjs.map +0 -1
- package/dist/esm/helpers/queryOrMutatorContext.native.js +0 -2
- package/dist/esm/helpers/queryOrMutatorContext.native.js.map +0 -1
- package/dist/esm/query.js +0 -13
- package/dist/esm/query.js.map +0 -6
- package/dist/esm/query.mjs +0 -11
- package/dist/esm/query.mjs.map +0 -1
- package/dist/esm/query.native.js +0 -13
- package/dist/esm/query.native.js.map +0 -1
- package/dist/esm/queryBuilder.js +0 -10
- package/dist/esm/queryBuilder.js.map +0 -6
- package/dist/esm/queryBuilder.mjs +0 -8
- package/dist/esm/queryBuilder.mjs.map +0 -1
- package/dist/esm/queryBuilder.native.js +0 -9
- package/dist/esm/queryBuilder.native.js.map +0 -1
package/cli.cjs
ADDED
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
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
name
|
|
166
|
-
|
|
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
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
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
|
|
257
|
-
const
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
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
|
-
|
|
286
|
+
import * as v from 'valibot'
|
|
287
|
+
${sortedFiles.map(file => `import * as ${file}Queries from '../queries/${file}'`).join(`
|
|
263
288
|
`)}
|
|
264
289
|
`,
|
|
265
|
-
|
|
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
|
-
|
|
285
|
-
}` : `(arg) => {
|
|
286
|
-
|
|
287
|
-
}`;
|
|
288
|
-
return `
|
|
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
|
-
|
|
293
|
-
|
|
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\` -
|
|
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
|
-
|
|
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"),
|
|
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(),
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
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
|
|
257
|
-
const
|
|
258
|
-
|
|
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 =
|
|
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
|
-
|
|
283
|
+
import * as v from 'valibot'
|
|
284
|
+
${sortedFiles.map((file) => `import * as ${file}Queries from '../queries/${file}'`).join(`
|
|
263
285
|
`)}
|
|
264
|
-
`,
|
|
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
|
-
|
|
283
|
-
}` : `(arg) => {
|
|
284
|
-
|
|
285
|
-
}`;
|
|
286
|
-
return `
|
|
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
|
-
|
|
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\` -
|
|
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
|
-
|
|
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\`:
|