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.
- package/cli.cjs +3 -0
- package/dist/cjs/cli.cjs +224 -205
- package/dist/cjs/cli.js +57 -40
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/cli.native.js +270 -248
- 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 +6 -3
- package/dist/cjs/createZeroClient.js +11 -4
- package/dist/cjs/createZeroClient.js.map +1 -1
- package/dist/cjs/createZeroClient.native.js +40 -5
- package/dist/cjs/createZeroClient.native.js.map +1 -1
- package/dist/cjs/createZeroServer.cjs +5 -3
- package/dist/cjs/createZeroServer.js +8 -3
- package/dist/cjs/createZeroServer.js.map +1 -1
- package/dist/cjs/createZeroServer.native.js +39 -3
- 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 +58 -41
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/cli.mjs +223 -204
- package/dist/esm/cli.mjs.map +1 -1
- package/dist/esm/cli.native.js +269 -247
- 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 +11 -3
- package/dist/esm/createZeroClient.js.map +1 -1
- package/dist/esm/createZeroClient.mjs +6 -3
- package/dist/esm/createZeroClient.mjs.map +1 -1
- package/dist/esm/createZeroClient.native.js +40 -5
- package/dist/esm/createZeroClient.native.js.map +1 -1
- package/dist/esm/createZeroServer.js +8 -3
- package/dist/esm/createZeroServer.js.map +1 -1
- package/dist/esm/createZeroServer.mjs +5 -3
- package/dist/esm/createZeroServer.mjs.map +1 -1
- package/dist/esm/createZeroServer.native.js +39 -3
- 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 +119 -122
- package/src/createPermissions.ts +8 -6
- package/src/createZeroClient.tsx +37 -15
- package/src/createZeroServer.ts +30 -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 +5 -3
- 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
|
+
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
|
-
|
|
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,44 +256,60 @@ ${modelNames.map(name => `export { schema as ${getExportName(name)} } from '../m
|
|
|
253
256
|
`)}
|
|
254
257
|
`;
|
|
255
258
|
}
|
|
256
|
-
function
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
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
|
-
|
|
266
|
-
const
|
|
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
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
- \`
|
|
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
|
-
|
|
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\`:
|