on-zero 0.16.17 → 0.16.19
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/dist/cjs/createZeroClient.cjs +44 -11
- package/dist/cjs/createZeroClient.native.js +54 -17
- package/dist/cjs/createZeroClient.native.js.map +1 -1
- package/dist/cjs/createZeroClient.recovery.test.cjs +49 -0
- package/dist/cjs/createZeroClient.recovery.test.native.js +53 -0
- package/dist/cjs/createZeroClient.recovery.test.native.js.map +1 -1
- package/dist/cjs/generate-helpers.cjs +28 -0
- package/dist/cjs/generate-helpers.native.js +36 -0
- package/dist/cjs/generate-helpers.native.js.map +1 -1
- package/dist/cjs/generate-layout.cjs +62 -53
- package/dist/cjs/generate-layout.native.js +62 -54
- package/dist/cjs/generate-layout.native.js.map +1 -1
- package/dist/cjs/generate-lite.cjs +28 -0
- package/dist/cjs/generate-lite.native.js +89 -33
- package/dist/cjs/generate-lite.native.js.map +1 -1
- package/dist/cjs/generate-lite.test.cjs +46 -0
- package/dist/cjs/generate-lite.test.native.js +46 -0
- package/dist/cjs/generate-lite.test.native.js.map +1 -1
- package/dist/cjs/generate.cjs +237 -243
- package/dist/cjs/generate.native.js +352 -353
- package/dist/cjs/generate.native.js.map +1 -1
- package/dist/cjs/generate.test.cjs +35 -0
- package/dist/cjs/generate.test.native.js +35 -0
- package/dist/cjs/generate.test.native.js.map +1 -1
- package/dist/cjs/helpers/createMutators.cjs +2 -1
- package/dist/cjs/helpers/createMutators.native.js +3 -1
- package/dist/cjs/helpers/createMutators.native.js.map +1 -1
- package/dist/cjs/helpers/recoverZeroClient.cjs +8 -2
- package/dist/cjs/helpers/recoverZeroClient.native.js +10 -2
- package/dist/cjs/helpers/recoverZeroClient.native.js.map +1 -1
- package/dist/cjs/helpers/recoverZeroClient.test.cjs +53 -0
- package/dist/cjs/helpers/recoverZeroClient.test.native.js +55 -0
- package/dist/cjs/helpers/recoverZeroClient.test.native.js.map +1 -1
- package/dist/cjs/native-typescript.cjs +190 -0
- package/dist/cjs/native-typescript.native.js +255 -0
- package/dist/cjs/native-typescript.native.js.map +1 -0
- package/dist/esm/createZeroClient.mjs +44 -11
- package/dist/esm/createZeroClient.mjs.map +1 -1
- package/dist/esm/createZeroClient.native.js +54 -17
- package/dist/esm/createZeroClient.native.js.map +1 -1
- package/dist/esm/createZeroClient.recovery.test.mjs +50 -1
- package/dist/esm/createZeroClient.recovery.test.mjs.map +1 -1
- package/dist/esm/createZeroClient.recovery.test.native.js +54 -1
- package/dist/esm/createZeroClient.recovery.test.native.js.map +1 -1
- package/dist/esm/generate-helpers.mjs +27 -1
- package/dist/esm/generate-helpers.mjs.map +1 -1
- package/dist/esm/generate-helpers.native.js +35 -1
- package/dist/esm/generate-helpers.native.js.map +1 -1
- package/dist/esm/generate-layout.mjs +52 -54
- package/dist/esm/generate-layout.mjs.map +1 -1
- package/dist/esm/generate-layout.native.js +52 -55
- package/dist/esm/generate-layout.native.js.map +1 -1
- package/dist/esm/generate-lite.mjs +29 -1
- package/dist/esm/generate-lite.mjs.map +1 -1
- package/dist/esm/generate-lite.native.js +90 -34
- package/dist/esm/generate-lite.native.js.map +1 -1
- package/dist/esm/generate-lite.test.mjs +46 -0
- package/dist/esm/generate-lite.test.mjs.map +1 -1
- package/dist/esm/generate-lite.test.native.js +46 -0
- package/dist/esm/generate-lite.test.native.js.map +1 -1
- package/dist/esm/generate.mjs +238 -244
- package/dist/esm/generate.mjs.map +1 -1
- package/dist/esm/generate.native.js +353 -354
- package/dist/esm/generate.native.js.map +1 -1
- package/dist/esm/generate.test.mjs +35 -0
- package/dist/esm/generate.test.mjs.map +1 -1
- package/dist/esm/generate.test.native.js +35 -0
- package/dist/esm/generate.test.native.js.map +1 -1
- package/dist/esm/helpers/createMutators.mjs +2 -1
- package/dist/esm/helpers/createMutators.mjs.map +1 -1
- package/dist/esm/helpers/createMutators.native.js +3 -1
- package/dist/esm/helpers/createMutators.native.js.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.mjs +8 -2
- package/dist/esm/helpers/recoverZeroClient.mjs.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.native.js +10 -2
- package/dist/esm/helpers/recoverZeroClient.native.js.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.test.mjs +53 -0
- package/dist/esm/helpers/recoverZeroClient.test.mjs.map +1 -1
- package/dist/esm/helpers/recoverZeroClient.test.native.js +55 -0
- package/dist/esm/helpers/recoverZeroClient.test.native.js.map +1 -1
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/native-typescript.mjs +164 -0
- package/dist/esm/native-typescript.mjs.map +1 -0
- package/dist/esm/native-typescript.native.js +226 -0
- package/dist/esm/native-typescript.native.js.map +1 -0
- package/package.json +4 -3
- package/src/createZeroClient.recovery.test.tsx +56 -1
- package/src/createZeroClient.tsx +54 -15
- package/src/generate-helpers.ts +79 -0
- package/src/generate-layout.ts +64 -108
- package/src/generate-lite.test.ts +49 -0
- package/src/generate-lite.ts +44 -0
- package/src/generate.test.ts +52 -0
- package/src/generate.ts +313 -366
- package/src/helpers/createMutators.ts +14 -3
- package/src/helpers/recoverZeroClient.test.ts +50 -0
- package/src/helpers/recoverZeroClient.ts +12 -2
- package/src/native-typescript.ts +176 -0
- package/types/createZeroClient.d.ts.map +1 -1
- package/types/generate-helpers.d.ts +13 -0
- package/types/generate-helpers.d.ts.map +1 -1
- package/types/generate-layout.d.ts +2 -1
- package/types/generate-layout.d.ts.map +1 -1
- package/types/generate-lite.d.ts +1 -0
- package/types/generate-lite.d.ts.map +1 -1
- package/types/generate.d.ts.map +1 -1
- package/types/helpers/createMutators.d.ts.map +1 -1
- package/types/helpers/recoverZeroClient.d.ts.map +1 -1
- package/types/native-typescript.d.ts +11 -0
- package/types/native-typescript.d.ts.map +1 -0
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
import { createHash } from "crypto";
|
|
2
2
|
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "fs";
|
|
3
3
|
import { basename, dirname, resolve } from "path";
|
|
4
|
-
import
|
|
4
|
+
import * as ts from "typescript/unstable/ast";
|
|
5
|
+
import { ObjectFlags, SymbolFlags, TypeFlags } from "typescript/unstable/async";
|
|
6
|
+
import { CRUD_MUTATION_NAMES, formatObjectKey, generateAggregatesFile, generateGroupedQueriesFile, generateInstancesFile, generateModelsFile, generateReadmeFile, generateSyncedMutationsFile, generateSyncedQueriesFile, generateTablesFile, generateTypesFile, parseColumnType, parseTypeString, renderDrizzleZeroSqliteSchemaModule, shouldSkipObjectKey } from "./generate-helpers.native.js";
|
|
5
7
|
import { discoverDataLayout, namespaceImportPath } from "./generate-layout.native.js";
|
|
8
|
+
import { collectTypeScriptSourcePaths, createNativeTypeScriptProject } from "./native-typescript.native.js";
|
|
6
9
|
var hash = function hash2(s) {
|
|
7
10
|
return createHash("sha256").update(s).digest("hex");
|
|
8
11
|
};
|
|
9
|
-
var GENERATOR_CACHE_VERSION = "
|
|
12
|
+
var GENERATOR_CACHE_VERSION = "7";
|
|
10
13
|
var isGeneratorSourceFile = function isGeneratorSourceFile2(name) {
|
|
11
14
|
return name.endsWith(".ts") && !name.endsWith(".d.ts") && !name.endsWith(".test.ts") && !name.endsWith(".spec.ts");
|
|
12
15
|
};
|
|
@@ -111,99 +114,39 @@ function saveCache() {
|
|
|
111
114
|
}
|
|
112
115
|
function writeFileIfChanged(filePath, content) {
|
|
113
116
|
var contentHash = hash(content);
|
|
114
|
-
var
|
|
115
|
-
|
|
117
|
+
var onDisk = null;
|
|
118
|
+
try {
|
|
119
|
+
onDisk = readFileSync(filePath, "utf-8");
|
|
120
|
+
} catch (unused) {}
|
|
121
|
+
if (onDisk !== null && hash(onDisk) === contentHash) {
|
|
122
|
+
generateCache[filePath] = contentHash;
|
|
116
123
|
return false;
|
|
117
124
|
}
|
|
118
125
|
writeFileSync(filePath, content, "utf-8");
|
|
119
126
|
generateCache[filePath] = contentHash;
|
|
120
127
|
return true;
|
|
121
128
|
}
|
|
122
|
-
function createTypeResolver(
|
|
123
|
-
var configPath = ts.findConfigFile(dir, ts.sys.fileExists, "tsconfig.json");
|
|
124
|
-
var compilerOptions = {
|
|
125
|
-
target: ts.ScriptTarget.Latest,
|
|
126
|
-
module: ts.ModuleKind.ESNext,
|
|
127
|
-
moduleResolution: ts.ModuleResolutionKind.Bundler,
|
|
128
|
-
strict: false,
|
|
129
|
-
skipLibCheck: true,
|
|
130
|
-
noEmit: true
|
|
131
|
-
};
|
|
132
|
-
if (configPath) {
|
|
133
|
-
var configFile = ts.readConfigFile(configPath, ts.sys.readFile);
|
|
134
|
-
if (configFile.config) {
|
|
135
|
-
var parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, dirname(configPath));
|
|
136
|
-
compilerOptions = {
|
|
137
|
-
...compilerOptions,
|
|
138
|
-
...parsed.options
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
var fileMap = /* @__PURE__ */new Map();
|
|
143
|
-
var _iteratorNormalCompletion = true,
|
|
144
|
-
_didIteratorError = false,
|
|
145
|
-
_iteratorError = void 0;
|
|
146
|
-
try {
|
|
147
|
-
for (var _iterator = files[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
148
|
-
var f = _step.value;
|
|
149
|
-
fileMap.set(f.path, f.content);
|
|
150
|
-
}
|
|
151
|
-
} catch (err) {
|
|
152
|
-
_didIteratorError = true;
|
|
153
|
-
_iteratorError = err;
|
|
154
|
-
} finally {
|
|
155
|
-
try {
|
|
156
|
-
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
157
|
-
_iterator.return();
|
|
158
|
-
}
|
|
159
|
-
} finally {
|
|
160
|
-
if (_didIteratorError) {
|
|
161
|
-
throw _iteratorError;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
var host = ts.createCompilerHost(compilerOptions);
|
|
166
|
-
var originalGetSourceFile = host.getSourceFile.bind(host);
|
|
167
|
-
host.getSourceFile = function (fileName, languageVersion, onError) {
|
|
168
|
-
var content = fileMap.get(fileName);
|
|
169
|
-
if (content !== void 0) {
|
|
170
|
-
return ts.createSourceFile(fileName, content, languageVersion, true);
|
|
171
|
-
}
|
|
172
|
-
return originalGetSourceFile(fileName, languageVersion, onError);
|
|
173
|
-
};
|
|
174
|
-
host.fileExists = function (fileName) {
|
|
175
|
-
return fileMap.has(fileName) || ts.sys.fileExists(fileName);
|
|
176
|
-
};
|
|
177
|
-
host.readFile = function (fileName) {
|
|
178
|
-
var _fileMap_get;
|
|
179
|
-
return (_fileMap_get = fileMap.get(fileName)) !== null && _fileMap_get !== void 0 ? _fileMap_get : ts.sys.readFile(fileName);
|
|
180
|
-
};
|
|
181
|
-
var program = ts.createProgram(files.map(function (f2) {
|
|
182
|
-
return f2.path;
|
|
183
|
-
}), compilerOptions, host);
|
|
184
|
-
var checker = program.getTypeChecker();
|
|
129
|
+
function createTypeResolver(project) {
|
|
185
130
|
return {
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
// resolve a type annotation node to a ts.Type
|
|
189
|
-
resolveType(node) {
|
|
131
|
+
project,
|
|
132
|
+
async resolveType(node) {
|
|
190
133
|
try {
|
|
191
|
-
|
|
134
|
+
var _ref;
|
|
135
|
+
return (_ref = await project.checker.getTypeFromTypeNode(node)) !== null && _ref !== void 0 ? _ref : null;
|
|
192
136
|
} catch (unused) {
|
|
193
137
|
return null;
|
|
194
138
|
}
|
|
195
139
|
},
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
return tsTypeToValibot(ts, checker, type);
|
|
140
|
+
async typeToValibot(type) {
|
|
141
|
+
return tsTypeToValibot(project, type);
|
|
199
142
|
}
|
|
200
143
|
};
|
|
201
144
|
}
|
|
202
|
-
function resolveParamType(
|
|
203
|
-
var
|
|
204
|
-
|
|
145
|
+
async function resolveParamType(resolver, sourceFile, exportName, paramIndex) {
|
|
146
|
+
var typeNode = null;
|
|
147
|
+
sourceFile.forEachChild(function (node) {
|
|
205
148
|
var _node_modifiers;
|
|
206
|
-
if (
|
|
149
|
+
if (typeNode) return;
|
|
207
150
|
if (!ts.isVariableStatement(node)) return;
|
|
208
151
|
if (!((_node_modifiers = node.modifiers) === null || _node_modifiers === void 0 ? void 0 : _node_modifiers.some(function (m) {
|
|
209
152
|
return m.kind === ts.SyntaxKind.ExportKeyword;
|
|
@@ -214,13 +157,13 @@ function resolveParamType(ts, resolver, sourceFile, exportName, paramIndex) {
|
|
|
214
157
|
if (decl.initializer && ts.isArrowFunction(decl.initializer)) {
|
|
215
158
|
var param = decl.initializer.parameters[paramIndex];
|
|
216
159
|
if (param === null || param === void 0 ? void 0 : param.type) {
|
|
217
|
-
|
|
160
|
+
typeNode = param.type;
|
|
218
161
|
}
|
|
219
162
|
}
|
|
220
163
|
});
|
|
221
|
-
return
|
|
164
|
+
return typeNode ? resolver.resolveType(typeNode) : null;
|
|
222
165
|
}
|
|
223
|
-
function readMutationsCall(
|
|
166
|
+
function readMutationsCall(call) {
|
|
224
167
|
var args = call.arguments;
|
|
225
168
|
if (args.length < 2) {
|
|
226
169
|
var only = args[0];
|
|
@@ -265,32 +208,32 @@ function readMutationsCall(ts, call) {
|
|
|
265
208
|
handlersArg: handlers && ts.isObjectLiteralExpression(handlers) ? handlers : null
|
|
266
209
|
};
|
|
267
210
|
}
|
|
268
|
-
function resolveMutationParamTypes(
|
|
269
|
-
var
|
|
270
|
-
|
|
211
|
+
async function resolveMutationParamTypes(resolver, sourceFile) {
|
|
212
|
+
var nodes = /* @__PURE__ */new Map();
|
|
213
|
+
sourceFile.forEachChild(function (node2) {
|
|
271
214
|
var _node_modifiers;
|
|
272
|
-
if (!ts.isVariableStatement(
|
|
273
|
-
if (!((_node_modifiers =
|
|
215
|
+
if (!ts.isVariableStatement(node2)) return;
|
|
216
|
+
if (!((_node_modifiers = node2.modifiers) === null || _node_modifiers === void 0 ? void 0 : _node_modifiers.some(function (m) {
|
|
274
217
|
return m.kind === ts.SyntaxKind.ExportKeyword;
|
|
275
218
|
}))) return;
|
|
276
|
-
var decl =
|
|
219
|
+
var decl = node2.declarationList.declarations[0];
|
|
277
220
|
if (!decl || !ts.isVariableDeclaration(decl)) return;
|
|
278
221
|
if (decl.name.getText(sourceFile) !== "mutate") return;
|
|
279
222
|
if (!decl.initializer || !ts.isCallExpression(decl.initializer)) return;
|
|
280
223
|
var {
|
|
281
224
|
handlersArg
|
|
282
|
-
} = readMutationsCall(
|
|
225
|
+
} = readMutationsCall(decl.initializer);
|
|
283
226
|
if (!handlersArg) return;
|
|
284
|
-
var
|
|
285
|
-
|
|
286
|
-
|
|
227
|
+
var _iteratorNormalCompletion2 = true,
|
|
228
|
+
_didIteratorError2 = false,
|
|
229
|
+
_iteratorError2 = void 0;
|
|
287
230
|
try {
|
|
288
|
-
for (var
|
|
289
|
-
var prop =
|
|
231
|
+
for (var _iterator2 = handlersArg.properties[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
|
232
|
+
var prop = _step2.value;
|
|
290
233
|
var _prop_name;
|
|
291
234
|
if (!ts.isPropertyAssignment(prop) && !ts.isMethodDeclaration(prop)) continue;
|
|
292
|
-
var
|
|
293
|
-
if (!
|
|
235
|
+
var name2 = (_prop_name = prop.name) === null || _prop_name === void 0 ? void 0 : _prop_name.getText(sourceFile);
|
|
236
|
+
if (!name2) continue;
|
|
294
237
|
var params = null;
|
|
295
238
|
if (ts.isPropertyAssignment(prop)) {
|
|
296
239
|
var init = prop.initializer;
|
|
@@ -303,31 +246,52 @@ function resolveMutationParamTypes(ts, resolver, sourceFile) {
|
|
|
303
246
|
if (!params || params.length < 2) continue;
|
|
304
247
|
var typeNode = params[1].type;
|
|
305
248
|
if (!typeNode) continue;
|
|
306
|
-
|
|
307
|
-
if (expanded) {
|
|
308
|
-
resolved.set(name, expanded);
|
|
309
|
-
}
|
|
249
|
+
nodes.set(name2, typeNode);
|
|
310
250
|
}
|
|
311
251
|
} catch (err) {
|
|
312
|
-
|
|
313
|
-
|
|
252
|
+
_didIteratorError2 = true;
|
|
253
|
+
_iteratorError2 = err;
|
|
314
254
|
} finally {
|
|
315
255
|
try {
|
|
316
|
-
if (!
|
|
317
|
-
|
|
256
|
+
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
|
|
257
|
+
_iterator2.return();
|
|
318
258
|
}
|
|
319
259
|
} finally {
|
|
320
|
-
if (
|
|
321
|
-
throw
|
|
260
|
+
if (_didIteratorError2) {
|
|
261
|
+
throw _iteratorError2;
|
|
322
262
|
}
|
|
323
263
|
}
|
|
324
264
|
}
|
|
325
265
|
});
|
|
266
|
+
var resolved = /* @__PURE__ */new Map();
|
|
267
|
+
var _iteratorNormalCompletion = true,
|
|
268
|
+
_didIteratorError = false,
|
|
269
|
+
_iteratorError = void 0;
|
|
270
|
+
try {
|
|
271
|
+
for (var _iterator = nodes[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
272
|
+
var [name, node] = _step.value;
|
|
273
|
+
var expanded = await resolver.resolveType(node);
|
|
274
|
+
if (expanded) resolved.set(name, expanded);
|
|
275
|
+
}
|
|
276
|
+
} catch (err) {
|
|
277
|
+
_didIteratorError = true;
|
|
278
|
+
_iteratorError = err;
|
|
279
|
+
} finally {
|
|
280
|
+
try {
|
|
281
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
282
|
+
_iterator.return();
|
|
283
|
+
}
|
|
284
|
+
} finally {
|
|
285
|
+
if (_didIteratorError) {
|
|
286
|
+
throw _iteratorError;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
326
290
|
return resolved;
|
|
327
291
|
}
|
|
328
|
-
function extractMutationsFromModel(
|
|
292
|
+
function extractMutationsFromModel(sourceFile, content, fileName, silent, typeToValibot, resolvedValibot) {
|
|
329
293
|
var mutateNode = null;
|
|
330
|
-
|
|
294
|
+
sourceFile.forEachChild(function (node) {
|
|
331
295
|
var _node_modifiers;
|
|
332
296
|
if (!ts.isVariableStatement(node)) return;
|
|
333
297
|
if (!((_node_modifiers = node.modifiers) === null || _node_modifiers === void 0 ? void 0 : _node_modifiers.some(function (m) {
|
|
@@ -354,12 +318,12 @@ function extractMutationsFromModel(ts, sourceFile, content, fileName, silent, ty
|
|
|
354
318
|
hasTable,
|
|
355
319
|
crud,
|
|
356
320
|
handlersArg
|
|
357
|
-
} = readMutationsCall(
|
|
321
|
+
} = readMutationsCall(call);
|
|
358
322
|
var hasCRUD = hasTable && crud;
|
|
359
323
|
var columns = {};
|
|
360
324
|
var primaryKeys = [];
|
|
361
325
|
if (hasCRUD) {
|
|
362
|
-
extractSchemaColumns(
|
|
326
|
+
extractSchemaColumns(sourceFile, columns, primaryKeys);
|
|
363
327
|
}
|
|
364
328
|
var custom = [];
|
|
365
329
|
if (handlersArg) {
|
|
@@ -402,11 +366,9 @@ function extractMutationsFromModel(ts, sourceFile, content, fileName, silent, ty
|
|
|
402
366
|
continue;
|
|
403
367
|
}
|
|
404
368
|
var valibotCode = typeToValibot(paramType);
|
|
405
|
-
if (!valibotCode &&
|
|
406
|
-
var
|
|
407
|
-
|
|
408
|
-
valibotCode = resolvedTypeToValibot(resolvedType);
|
|
409
|
-
}
|
|
369
|
+
if (!valibotCode && resolvedValibot) {
|
|
370
|
+
var _resolvedValibot_get;
|
|
371
|
+
valibotCode = (_resolvedValibot_get = resolvedValibot.get(name)) !== null && _resolvedValibot_get !== void 0 ? _resolvedValibot_get : null;
|
|
410
372
|
}
|
|
411
373
|
custom.push({
|
|
412
374
|
name,
|
|
@@ -437,7 +399,7 @@ function extractMutationsFromModel(ts, sourceFile, content, fileName, silent, ty
|
|
|
437
399
|
custom
|
|
438
400
|
};
|
|
439
401
|
}
|
|
440
|
-
function extractSchemaColumns(
|
|
402
|
+
function extractSchemaColumns(sourceFile, columns, primaryKeys) {
|
|
441
403
|
function visit(node) {
|
|
442
404
|
if (ts.isCallExpression(node)) {
|
|
443
405
|
var text = node.expression.getText(sourceFile);
|
|
@@ -501,64 +463,59 @@ function extractSchemaColumns(ts, sourceFile, columns, primaryKeys) {
|
|
|
501
463
|
}
|
|
502
464
|
}
|
|
503
465
|
}
|
|
504
|
-
|
|
466
|
+
node.forEachChild(visit);
|
|
505
467
|
}
|
|
506
468
|
visit(sourceFile);
|
|
507
469
|
}
|
|
508
|
-
function
|
|
509
|
-
var
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
if (!seen) seen = /* @__PURE__ */new Set();
|
|
516
|
-
var flags = type.getFlags();
|
|
517
|
-
if (flags & (ts.TypeFlags.Object | ts.TypeFlags.Intersection)) {
|
|
518
|
-
if (seen.has(type)) return "v.unknown()";
|
|
519
|
-
seen.add(type);
|
|
470
|
+
async function tsTypeToValibot(project, type) {
|
|
471
|
+
var seen = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : /* @__PURE__ */new Set();
|
|
472
|
+
var checker = project.checker;
|
|
473
|
+
var flags = type.flags;
|
|
474
|
+
if (flags & (TypeFlags.Object | TypeFlags.Intersection)) {
|
|
475
|
+
if (seen.has(type.id)) return "v.unknown()";
|
|
476
|
+
seen.add(type.id);
|
|
520
477
|
}
|
|
521
|
-
var recurse = function recurse2(
|
|
522
|
-
return tsTypeToValibot(
|
|
478
|
+
var recurse = function recurse2(value) {
|
|
479
|
+
return tsTypeToValibot(project, value, seen);
|
|
523
480
|
};
|
|
524
|
-
if (flags &
|
|
525
|
-
if (flags &
|
|
526
|
-
if (flags &
|
|
527
|
-
if (flags &
|
|
528
|
-
if (flags &
|
|
529
|
-
if (flags &
|
|
530
|
-
if (flags &
|
|
531
|
-
if (flags &
|
|
532
|
-
if (flags &
|
|
533
|
-
var
|
|
534
|
-
var
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
481
|
+
if (flags & TypeFlags.String) return "v.string()";
|
|
482
|
+
if (flags & TypeFlags.Number) return "v.number()";
|
|
483
|
+
if (flags & TypeFlags.Boolean) return "v.boolean()";
|
|
484
|
+
if (flags & TypeFlags.Void || flags & TypeFlags.Undefined) return "v.void_()";
|
|
485
|
+
if (flags & TypeFlags.Null) return "v.null_()";
|
|
486
|
+
if (flags & TypeFlags.Any || flags & TypeFlags.Unknown) return "v.unknown()";
|
|
487
|
+
if (flags & TypeFlags.Never) return "v.never()";
|
|
488
|
+
if (flags & TypeFlags.TemplateLiteral) return "v.string()";
|
|
489
|
+
if (flags & TypeFlags.Object && (await checker.isArrayLikeType(type))) {
|
|
490
|
+
var typeArgs = type.isTypeReference() ? await checker.getTypeArguments(type) : [];
|
|
491
|
+
var indexInfo = (await checker.getIndexInfosOfType(type)).find(function (info) {
|
|
492
|
+
return Boolean(info.keyType.flags & TypeFlags.Number);
|
|
493
|
+
});
|
|
494
|
+
var elementType = typeArgs.length === 1 ? typeArgs[0] : indexInfo === null || indexInfo === void 0 ? void 0 : indexInfo.valueType;
|
|
495
|
+
return `v.array(${elementType ? await recurse(elementType) : "v.unknown()"})`;
|
|
538
496
|
}
|
|
539
|
-
if (
|
|
497
|
+
if (type.isStringLiteralType()) {
|
|
540
498
|
return `v.literal(${JSON.stringify(type.value)})`;
|
|
541
499
|
}
|
|
542
|
-
if (
|
|
500
|
+
if (type.isNumberLiteralType()) {
|
|
543
501
|
return `v.literal(${type.value})`;
|
|
544
502
|
}
|
|
545
|
-
if (
|
|
546
|
-
|
|
547
|
-
return `v.literal(${name === "true"})`;
|
|
503
|
+
if (type.isBooleanLiteralType()) {
|
|
504
|
+
return `v.literal(${type.value})`;
|
|
548
505
|
}
|
|
549
|
-
if (type.
|
|
550
|
-
var members = type.
|
|
551
|
-
var hasNull = members.some(function (
|
|
552
|
-
return
|
|
506
|
+
if (type.isUnionType()) {
|
|
507
|
+
var members = await type.getTypes();
|
|
508
|
+
var hasNull = members.some(function (member) {
|
|
509
|
+
return member.flags & TypeFlags.Null;
|
|
553
510
|
});
|
|
554
|
-
var hasUndefined = members.some(function (
|
|
555
|
-
return
|
|
511
|
+
var hasUndefined = members.some(function (member) {
|
|
512
|
+
return member.flags & (TypeFlags.Undefined | TypeFlags.Void);
|
|
556
513
|
});
|
|
557
|
-
var rest = members.filter(function (
|
|
558
|
-
return !(
|
|
514
|
+
var rest = members.filter(function (member) {
|
|
515
|
+
return !(member.flags & (TypeFlags.Null | TypeFlags.Undefined | TypeFlags.Void));
|
|
559
516
|
});
|
|
560
|
-
if (rest.length === 2 && rest.every(function (
|
|
561
|
-
return
|
|
517
|
+
if (rest.length === 2 && rest.every(function (member) {
|
|
518
|
+
return member.flags & TypeFlags.BooleanLiteral;
|
|
562
519
|
})) {
|
|
563
520
|
var inner = "v.boolean()";
|
|
564
521
|
if (hasNull) inner = `v.nullable(${inner})`;
|
|
@@ -566,52 +523,50 @@ function tsTypeToValibot(ts, checker, type, seen) {
|
|
|
566
523
|
return inner;
|
|
567
524
|
}
|
|
568
525
|
if (rest.length === 0) return "v.unknown()";
|
|
569
|
-
var inner1 = rest.length === 1 ? recurse(rest[0]) : `v.union([${rest.map(
|
|
570
|
-
return recurse(t);
|
|
571
|
-
}).join(", ")}])`;
|
|
526
|
+
var inner1 = rest.length === 1 ? await recurse(rest[0]) : `v.union([${(await Promise.all(rest.map(recurse))).join(", ")}])`;
|
|
572
527
|
if (hasNull) inner1 = `v.nullable(${inner1})`;
|
|
573
528
|
if (hasUndefined) inner1 = `v.optional(${inner1})`;
|
|
574
529
|
return inner1;
|
|
575
530
|
}
|
|
576
|
-
var resolveSymbolType = function resolveSymbolType2(
|
|
577
|
-
var
|
|
578
|
-
var
|
|
579
|
-
if (
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
return checker.
|
|
531
|
+
var resolveSymbolType = async function resolveSymbolType2(property) {
|
|
532
|
+
var _property_valueDeclaration;
|
|
533
|
+
var symbolType = await checker.getTypeOfSymbol(property);
|
|
534
|
+
if (symbolType && !symbolType.isErrorType()) return symbolType;
|
|
535
|
+
var declaration = (_property_valueDeclaration = property.valueDeclaration) !== null && _property_valueDeclaration !== void 0 ? _property_valueDeclaration : property.declarations[0];
|
|
536
|
+
var node = declaration ? await declaration.resolve(project) : void 0;
|
|
537
|
+
if (node) return checker.getTypeOfSymbolAtLocation(property, node);
|
|
538
|
+
return checker.getDeclaredTypeOfSymbol(property);
|
|
583
539
|
};
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
if (props.length === 0) return "v.object({})";
|
|
540
|
+
var objectToValibot = async function objectToValibot2(props2) {
|
|
541
|
+
if (props2.length === 0) return "v.object({})";
|
|
587
542
|
var entries = [];
|
|
588
|
-
var
|
|
589
|
-
|
|
590
|
-
|
|
543
|
+
var _iteratorNormalCompletion2 = true,
|
|
544
|
+
_didIteratorError2 = false,
|
|
545
|
+
_iteratorError2 = void 0;
|
|
591
546
|
try {
|
|
592
|
-
for (var
|
|
593
|
-
var prop =
|
|
594
|
-
var
|
|
595
|
-
if (shouldSkipObjectKey(
|
|
596
|
-
var propType = resolveSymbolType(
|
|
597
|
-
var isOptional =
|
|
598
|
-
var val = recurse(propType);
|
|
547
|
+
for (var _iterator2 = props2[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
|
|
548
|
+
var prop = _step2.value;
|
|
549
|
+
var name = prop.name;
|
|
550
|
+
if (shouldSkipObjectKey(name)) continue;
|
|
551
|
+
var propType = await resolveSymbolType(prop);
|
|
552
|
+
var isOptional = Boolean(prop.flags & SymbolFlags.Optional);
|
|
553
|
+
var val = await recurse(propType);
|
|
599
554
|
if (isOptional && !val.startsWith("v.optional(")) {
|
|
600
555
|
val = `v.optional(${val})`;
|
|
601
556
|
}
|
|
602
|
-
entries.push(`${formatObjectKey(
|
|
557
|
+
entries.push(`${formatObjectKey(name)}: ${val}`);
|
|
603
558
|
}
|
|
604
559
|
} catch (err) {
|
|
605
|
-
|
|
606
|
-
|
|
560
|
+
_didIteratorError2 = true;
|
|
561
|
+
_iteratorError2 = err;
|
|
607
562
|
} finally {
|
|
608
563
|
try {
|
|
609
|
-
if (!
|
|
610
|
-
|
|
564
|
+
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
|
|
565
|
+
_iterator2.return();
|
|
611
566
|
}
|
|
612
567
|
} finally {
|
|
613
|
-
if (
|
|
614
|
-
throw
|
|
568
|
+
if (_didIteratorError2) {
|
|
569
|
+
throw _iteratorError2;
|
|
615
570
|
}
|
|
616
571
|
}
|
|
617
572
|
}
|
|
@@ -619,70 +574,51 @@ function tsTypeToValibot(ts, checker, type, seen) {
|
|
|
619
574
|
return `v.object({
|
|
620
575
|
${entries.join(",\n ")},
|
|
621
576
|
})`;
|
|
577
|
+
};
|
|
578
|
+
if (type.isIntersectionType()) {
|
|
579
|
+
return objectToValibot(await checker.getPropertiesOfType(type));
|
|
622
580
|
}
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
var
|
|
630
|
-
var
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
return `v.array(${recurse(typeRef.typeArguments[0])})`;
|
|
581
|
+
if (type.isTupleType()) {
|
|
582
|
+
var typeArgs1 = await checker.getTypeArguments(type);
|
|
583
|
+
return `v.tuple([${(await Promise.all(typeArgs1.map(recurse))).join(", ")}])`;
|
|
584
|
+
}
|
|
585
|
+
if (type.isObjectType()) {
|
|
586
|
+
if (type.objectFlags & ObjectFlags.Reference && type.isTypeReference()) {
|
|
587
|
+
var symbol = await type.getSymbol();
|
|
588
|
+
var typeArgs2 = await checker.getTypeArguments(type);
|
|
589
|
+
if (((symbol === null || symbol === void 0 ? void 0 : symbol.name) === "Array" || (symbol === null || symbol === void 0 ? void 0 : symbol.name) === "ReadonlyArray") && typeArgs2.length === 1) {
|
|
590
|
+
return `v.array(${await recurse(typeArgs2[0])})`;
|
|
634
591
|
}
|
|
635
592
|
}
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
593
|
+
var props = await checker.getPropertiesOfType(type);
|
|
594
|
+
if (props.length > 0) return objectToValibot(props);
|
|
595
|
+
}
|
|
596
|
+
var _iteratorNormalCompletion = true,
|
|
597
|
+
_didIteratorError = false,
|
|
598
|
+
_iteratorError = void 0;
|
|
599
|
+
try {
|
|
600
|
+
for (var _iterator = (await checker.getIndexInfosOfType(type))[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
|
601
|
+
var indexInfo1 = _step.value;
|
|
602
|
+
if (indexInfo1.keyType.flags & TypeFlags.String) {
|
|
603
|
+
return `v.record(v.string(), ${await recurse(indexInfo1.valueType)})`;
|
|
604
|
+
}
|
|
605
|
+
if (indexInfo1.keyType.flags & TypeFlags.Number) {
|
|
606
|
+
return `v.record(v.number(), ${await recurse(indexInfo1.valueType)})`;
|
|
607
|
+
}
|
|
642
608
|
}
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
609
|
+
} catch (err) {
|
|
610
|
+
_didIteratorError = true;
|
|
611
|
+
_iteratorError = err;
|
|
612
|
+
} finally {
|
|
647
613
|
try {
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
var name3 = prop1.getName();
|
|
651
|
-
if (shouldSkipObjectKey(name3)) continue;
|
|
652
|
-
var propType1 = resolveSymbolType(type, prop1);
|
|
653
|
-
var isOptional1 = !!(prop1.getFlags() & ts.SymbolFlags.Optional);
|
|
654
|
-
var val1 = recurse(propType1);
|
|
655
|
-
if (isOptional1 && !val1.startsWith("v.optional(")) {
|
|
656
|
-
val1 = `v.optional(${val1})`;
|
|
657
|
-
}
|
|
658
|
-
entries1.push(`${formatObjectKey(name3)}: ${val1}`);
|
|
614
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
615
|
+
_iterator.return();
|
|
659
616
|
}
|
|
660
|
-
} catch (err) {
|
|
661
|
-
_didIteratorError1 = true;
|
|
662
|
-
_iteratorError1 = err;
|
|
663
617
|
} finally {
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
_iterator1.return();
|
|
667
|
-
}
|
|
668
|
-
} finally {
|
|
669
|
-
if (_didIteratorError1) {
|
|
670
|
-
throw _iteratorError1;
|
|
671
|
-
}
|
|
618
|
+
if (_didIteratorError) {
|
|
619
|
+
throw _iteratorError;
|
|
672
620
|
}
|
|
673
621
|
}
|
|
674
|
-
if (entries1.length === 0) return "v.object({})";
|
|
675
|
-
return `v.object({
|
|
676
|
-
${entries1.join(",\n ")},
|
|
677
|
-
})`;
|
|
678
|
-
}
|
|
679
|
-
var stringIndex = type.getStringIndexType();
|
|
680
|
-
if (stringIndex) {
|
|
681
|
-
return `v.record(v.string(), ${recurse(stringIndex)})`;
|
|
682
|
-
}
|
|
683
|
-
var numberIndex = type.getNumberIndexType();
|
|
684
|
-
if (numberIndex) {
|
|
685
|
-
return `v.record(v.number(), ${recurse(numberIndex)})`;
|
|
686
622
|
}
|
|
687
623
|
return "v.unknown()";
|
|
688
624
|
}
|
|
@@ -838,16 +774,33 @@ function dataMembershipFromLayout(layout) {
|
|
|
838
774
|
}))].sort()
|
|
839
775
|
};
|
|
840
776
|
}
|
|
777
|
+
async function loadGeneratorProject(baseDir) {
|
|
778
|
+
var sourcePaths = collectTypeScriptSourcePaths([baseDir, resolve(dirname(baseDir), "database")]);
|
|
779
|
+
return createNativeTypeScriptProject(baseDir, sourcePaths);
|
|
780
|
+
}
|
|
841
781
|
async function deriveDataMembership(options) {
|
|
842
|
-
var
|
|
843
|
-
var
|
|
844
|
-
|
|
782
|
+
var baseDir = resolve(options.dir);
|
|
783
|
+
var project = await loadGeneratorProject(baseDir);
|
|
784
|
+
try {
|
|
785
|
+
var layout = discoverDataLayout(project, baseDir, options.config ? resolve(options.config) : void 0);
|
|
786
|
+
return dataMembershipFromLayout(layout);
|
|
787
|
+
} finally {
|
|
788
|
+
await project.close();
|
|
789
|
+
}
|
|
845
790
|
}
|
|
846
791
|
async function generateDrizzleSchemaInputFile(options) {
|
|
792
|
+
var baseDir = resolve(options.dir);
|
|
793
|
+
var project = await loadGeneratorProject(baseDir);
|
|
794
|
+
try {
|
|
795
|
+
return generateDrizzleSchemaInputFileWithProject(options, project);
|
|
796
|
+
} finally {
|
|
797
|
+
await project.close();
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
async function generateDrizzleSchemaInputFileWithProject(options, project) {
|
|
847
801
|
var _layout_metadataPaths_find;
|
|
848
|
-
var ts = await import("typescript");
|
|
849
802
|
var baseDir = resolve(options.dir);
|
|
850
|
-
var layout = discoverDataLayout(
|
|
803
|
+
var layout = discoverDataLayout(project, baseDir, options.config ? resolve(options.config) : void 0);
|
|
851
804
|
var tableNames = dataMembershipFromLayout(layout).allTables;
|
|
852
805
|
var relationsPath = (_layout_metadataPaths_find = layout.metadataPaths.find(function (path) {
|
|
853
806
|
return basename(path) === "relations.ts" && dirname(path) === resolve(dirname(baseDir), "database");
|
|
@@ -856,11 +809,11 @@ async function generateDrizzleSchemaInputFile(options) {
|
|
|
856
809
|
});
|
|
857
810
|
var relationEntries = [];
|
|
858
811
|
if (relationsPath) {
|
|
859
|
-
var source =
|
|
812
|
+
var source = project.sourceFile(relationsPath);
|
|
860
813
|
var included = new Set(tableNames);
|
|
861
814
|
var visit = function visit1(node) {
|
|
862
815
|
if (!ts.isCallExpression(node) || node.expression.getText(source) !== "defineRelations") {
|
|
863
|
-
|
|
816
|
+
node.forEachChild(visit);
|
|
864
817
|
return;
|
|
865
818
|
}
|
|
866
819
|
var factory = node.arguments[1];
|
|
@@ -934,6 +887,14 @@ ${relations.map(function (relation) {
|
|
|
934
887
|
return ["// auto-generated from the on-zero data layout", `import { defineRelations } from 'drizzle-orm'`, `import * as schema from ${schemaImportPath}`, "", `export { ${tableNames.join(", ")} } from ${schemaImportPath}`, `export const relations = defineRelations(schema, (r) => ({`, ...relationEntries, `}))`, ""].join("\n");
|
|
935
888
|
}
|
|
936
889
|
async function generate(options) {
|
|
890
|
+
var project = await loadGeneratorProject(resolve(options.dir));
|
|
891
|
+
try {
|
|
892
|
+
return await generateWithProject(options, project);
|
|
893
|
+
} finally {
|
|
894
|
+
await project.close();
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
async function generateWithProject(options, project) {
|
|
937
898
|
var {
|
|
938
899
|
dir,
|
|
939
900
|
after,
|
|
@@ -949,13 +910,44 @@ async function generate(options) {
|
|
|
949
910
|
});
|
|
950
911
|
}
|
|
951
912
|
loadCache();
|
|
952
|
-
var
|
|
953
|
-
var layout = discoverDataLayout(ts, baseDir, config ? resolve(config) : void 0);
|
|
913
|
+
var layout = discoverDataLayout(project, baseDir, config ? resolve(config) : void 0);
|
|
954
914
|
var metadataHash = hash(layout.metadataPaths.map(function (path) {
|
|
955
915
|
return `${path}\0${readFileSync(path, "utf8")}`;
|
|
956
916
|
}).join("\0"));
|
|
917
|
+
var databaseSchemaPath = resolve(dirname(baseDir), "database/schema.ts");
|
|
918
|
+
var needsSqliteZeroSchema = existsSync(databaseSchemaPath);
|
|
957
919
|
var inputHash = hash(`${hashInputTree(layout.sourceRoots, generatedDir)}\0${metadataHash}`);
|
|
958
|
-
if (!force && generateCache.__generatorVersion === GENERATOR_CACHE_VERSION && generateCache.__inputHash === inputHash &&
|
|
920
|
+
if (!force && generateCache.__generatorVersion === GENERATOR_CACHE_VERSION && generateCache.__inputHash === inputHash &&
|
|
921
|
+
// the input hash deliberately skips the generated directory, so it cannot
|
|
922
|
+
// notice that the outputs themselves moved. existence is not correctness
|
|
923
|
+
// either: a checkout, merge or revert leaves every file present and stale.
|
|
924
|
+
// confirm the bytes on disk still match what the cache says it wrote there
|
|
925
|
+
// before skipping the build, or the fast path serves someone else's output.
|
|
926
|
+
//
|
|
927
|
+
// a consumer that formats generated output after this runs never hits the
|
|
928
|
+
// fast path again, because the cache holds the bytes written here and disk
|
|
929
|
+
// holds the formatted ones. soot does exactly that, `on-zero generate &&
|
|
930
|
+
// generate-instance-tables && oxfmt src/data/generated/`, and the number is
|
|
931
|
+
// already taken: 2.50s median before, 3.69s after, four warm runs each in
|
|
932
|
+
// one checkout with only the pin swapped, so about 1.2 seconds or 47
|
|
933
|
+
// percent on this step. the full three-command script went 2.65s to 3.14s
|
|
934
|
+
// with a spread that swallows most of it.
|
|
935
|
+
//
|
|
936
|
+
// the shape matters more than the number. this is not a cache that hits
|
|
937
|
+
// less often, it is a cache that never hits, so the cost does not degrade
|
|
938
|
+
// gracefully and grows with the generated output rather than staying at
|
|
939
|
+
// 1.2s. correct and slower beats fast and stale, which is why it is written
|
|
940
|
+
// this way, but if generate time ever becomes the complaint, record the
|
|
941
|
+
// hash after the consumer's formatter runs rather than weakening this.
|
|
942
|
+
Object.entries(generateCache).every(function (param) {
|
|
943
|
+
var [cachedPath, cachedHash] = param;
|
|
944
|
+
if (!cachedPath.startsWith(generatedDir)) return true;
|
|
945
|
+
try {
|
|
946
|
+
return hash(readFileSync(cachedPath, "utf-8")) === cachedHash;
|
|
947
|
+
} catch (unused) {
|
|
948
|
+
return false;
|
|
949
|
+
}
|
|
950
|
+
}) && existsSync(resolve(generatedDir, "models.ts")) && (!needsSqliteZeroSchema || existsSync(resolve(generatedDir, "schema.ts")))) {
|
|
959
951
|
var _counts_modelCount, _counts_schemaCount, _counts_queryCount, _counts_mutationCount;
|
|
960
952
|
var counts = {};
|
|
961
953
|
try {
|
|
@@ -995,6 +987,24 @@ async function generate(options) {
|
|
|
995
987
|
return module.name;
|
|
996
988
|
}))), writeFileIfChanged(resolve(generatedDir, "tables.ts"), generateTablesFile(schemaModules))] : []), writeFileIfChanged(resolve(generatedDir, "README.md"), generateReadmeFile())];
|
|
997
989
|
var filesChanged = writeResults.filter(Boolean).length;
|
|
990
|
+
if (needsSqliteZeroSchema) {
|
|
991
|
+
var membership = dataMembershipFromLayout(layout);
|
|
992
|
+
var drizzleSchema = await generateDrizzleSchemaInputFileWithProject({
|
|
993
|
+
dir: baseDir,
|
|
994
|
+
schemaImportPath: "../../database/schema",
|
|
995
|
+
config
|
|
996
|
+
}, project);
|
|
997
|
+
var sqliteSchema = renderDrizzleZeroSqliteSchemaModule({
|
|
998
|
+
importPath: "./drizzleSchema",
|
|
999
|
+
tableNames: membership.allTables
|
|
1000
|
+
});
|
|
1001
|
+
if (writeFileIfChanged(resolve(generatedDir, "drizzleSchema.ts"), drizzleSchema)) {
|
|
1002
|
+
filesChanged++;
|
|
1003
|
+
}
|
|
1004
|
+
if (writeFileIfChanged(resolve(generatedDir, "schema.ts"), sqliteSchema)) {
|
|
1005
|
+
filesChanged++;
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
998
1008
|
var queryCount = 0;
|
|
999
1009
|
var mutationCount = 0;
|
|
1000
1010
|
var typeToValibot = function typeToValibot2(paramType) {
|
|
@@ -1005,32 +1015,17 @@ async function generate(options) {
|
|
|
1005
1015
|
}
|
|
1006
1016
|
};
|
|
1007
1017
|
var allQueries = [];
|
|
1008
|
-
var queryResolver = null;
|
|
1009
|
-
var getQueryResolver = function getQueryResolver2() {
|
|
1010
|
-
if (!queryResolver) {
|
|
1011
|
-
var allFiles2 = [...new Set(layout.namespaces.flatMap(function (namespace2) {
|
|
1012
|
-
return namespace2.sourcePaths;
|
|
1013
|
-
}))].map(function (path) {
|
|
1014
|
-
return {
|
|
1015
|
-
path,
|
|
1016
|
-
content: readFileSync(path, "utf-8")
|
|
1017
|
-
};
|
|
1018
|
-
});
|
|
1019
|
-
queryResolver = createTypeResolver(ts, allFiles2, baseDir);
|
|
1020
|
-
}
|
|
1021
|
-
return queryResolver;
|
|
1022
|
-
};
|
|
1023
1018
|
var _iteratorNormalCompletion = true,
|
|
1024
1019
|
_didIteratorError = false,
|
|
1025
1020
|
_iteratorError = void 0;
|
|
1026
1021
|
try {
|
|
1027
|
-
var _loop = function () {
|
|
1022
|
+
var _loop = async function () {
|
|
1028
1023
|
var namespace2 = _step.value;
|
|
1029
1024
|
var filePath2 = namespace2.queryPath;
|
|
1030
1025
|
try {
|
|
1031
|
-
var
|
|
1032
|
-
var
|
|
1033
|
-
|
|
1026
|
+
var sourceFile2 = project.sourceFile(filePath2);
|
|
1027
|
+
var candidates = [];
|
|
1028
|
+
sourceFile2.forEachChild(function (node) {
|
|
1034
1029
|
if (ts.isVariableStatement(node)) {
|
|
1035
1030
|
var _node_modifiers;
|
|
1036
1031
|
var exportModifier = (_node_modifiers = node.modifiers) === null || _node_modifiers === void 0 ? void 0 : _node_modifiers.find(function (m) {
|
|
@@ -1042,6 +1037,8 @@ async function generate(options) {
|
|
|
1042
1037
|
var name = declaration.name.getText(sourceFile2);
|
|
1043
1038
|
if (["mutate", "permission", "schema", "where"].includes(name)) return;
|
|
1044
1039
|
if (declaration.initializer && ts.isArrowFunction(declaration.initializer)) {
|
|
1040
|
+
var _ref;
|
|
1041
|
+
var _params_;
|
|
1045
1042
|
var params = declaration.initializer.parameters;
|
|
1046
1043
|
var paramType = "void";
|
|
1047
1044
|
if (params.length > 0) {
|
|
@@ -1049,38 +1046,59 @@ async function generate(options) {
|
|
|
1049
1046
|
var param = params[0];
|
|
1050
1047
|
paramType = ((_param_type = param.type) === null || _param_type === void 0 ? void 0 : _param_type.getText(sourceFile2)) || "unknown";
|
|
1051
1048
|
}
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
var resolvedType = resolveParamType(ts, resolver, resolverSourceFile, name, 0);
|
|
1058
|
-
if (resolvedType) {
|
|
1059
|
-
valibotCode = resolver.typeToValibot(resolvedType);
|
|
1060
|
-
}
|
|
1061
|
-
}
|
|
1062
|
-
}
|
|
1063
|
-
if (valibotCode) {
|
|
1064
|
-
allQueries.push({
|
|
1065
|
-
name,
|
|
1066
|
-
params: paramType,
|
|
1067
|
-
valibotCode,
|
|
1068
|
-
sourceFile: namespace2.name,
|
|
1069
|
-
importPath: namespaceImportPath(baseDir, filePath2)
|
|
1070
|
-
});
|
|
1071
|
-
} else if (!silent && paramType !== "void") {
|
|
1072
|
-
console.error(`\u2717 ${name}: could not resolve type "${paramType}"`);
|
|
1073
|
-
}
|
|
1049
|
+
candidates.push({
|
|
1050
|
+
name,
|
|
1051
|
+
paramType,
|
|
1052
|
+
typeNode: (_ref = (_params_ = params[0]) === null || _params_ === void 0 ? void 0 : _params_.type) !== null && _ref !== void 0 ? _ref : null
|
|
1053
|
+
});
|
|
1074
1054
|
}
|
|
1075
1055
|
}
|
|
1076
1056
|
});
|
|
1057
|
+
var resolver = createTypeResolver(project.projectForFile(filePath2));
|
|
1058
|
+
var _iteratorNormalCompletion4 = true,
|
|
1059
|
+
_didIteratorError4 = false,
|
|
1060
|
+
_iteratorError4 = void 0;
|
|
1061
|
+
try {
|
|
1062
|
+
for (var _iterator4 = candidates[Symbol.iterator](), _step12; !(_iteratorNormalCompletion4 = (_step12 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
|
|
1063
|
+
var candidate = _step12.value;
|
|
1064
|
+
var valibotCode = typeToValibot(candidate.paramType);
|
|
1065
|
+
if (!valibotCode && candidate.typeNode) {
|
|
1066
|
+
var resolvedType = await resolveParamType(resolver, sourceFile2, candidate.name, 0);
|
|
1067
|
+
if (resolvedType) valibotCode = await resolver.typeToValibot(resolvedType);
|
|
1068
|
+
}
|
|
1069
|
+
if (valibotCode) {
|
|
1070
|
+
allQueries.push({
|
|
1071
|
+
name: candidate.name,
|
|
1072
|
+
params: candidate.paramType,
|
|
1073
|
+
valibotCode,
|
|
1074
|
+
sourceFile: namespace2.name,
|
|
1075
|
+
importPath: namespaceImportPath(baseDir, filePath2)
|
|
1076
|
+
});
|
|
1077
|
+
} else if (!silent && candidate.paramType !== "void") {
|
|
1078
|
+
console.error(`\u2717 ${candidate.name}: could not resolve type "${candidate.paramType}"`);
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1081
|
+
} catch (err) {
|
|
1082
|
+
_didIteratorError4 = true;
|
|
1083
|
+
_iteratorError4 = err;
|
|
1084
|
+
} finally {
|
|
1085
|
+
try {
|
|
1086
|
+
if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
|
|
1087
|
+
_iterator4.return();
|
|
1088
|
+
}
|
|
1089
|
+
} finally {
|
|
1090
|
+
if (_didIteratorError4) {
|
|
1091
|
+
throw _iteratorError4;
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1094
|
+
}
|
|
1077
1095
|
} catch (err) {
|
|
1078
1096
|
if (!silent) console.error(`Error processing ${filePath2}:`, err);
|
|
1079
1097
|
}
|
|
1080
1098
|
};
|
|
1081
1099
|
for (var _iterator = layout.namespaces.filter(function (namespace2) {
|
|
1082
1100
|
return namespace2.queryPath !== null;
|
|
1083
|
-
})[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) _loop();
|
|
1101
|
+
})[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) await _loop();
|
|
1084
1102
|
} catch (err) {
|
|
1085
1103
|
_didIteratorError = true;
|
|
1086
1104
|
_iteratorError = err;
|
|
@@ -1135,7 +1153,6 @@ async function generate(options) {
|
|
|
1135
1153
|
if (aggregatesChanged) filesChanged++;
|
|
1136
1154
|
}
|
|
1137
1155
|
var allModelMutations = [];
|
|
1138
|
-
var mutationFiles = [];
|
|
1139
1156
|
var unresolvedModels = [];
|
|
1140
1157
|
var _iteratorNormalCompletion1 = true,
|
|
1141
1158
|
_didIteratorError1 = false,
|
|
@@ -1147,13 +1164,8 @@ async function generate(options) {
|
|
|
1147
1164
|
var fileBaseName = namespace.name;
|
|
1148
1165
|
try {
|
|
1149
1166
|
var content = readFileSync(filePath, "utf-8");
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
content,
|
|
1153
|
-
baseName: fileBaseName
|
|
1154
|
-
});
|
|
1155
|
-
var sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, true);
|
|
1156
|
-
var result = extractMutationsFromModel(ts, sourceFile, content, filePath, !!silent, typeToValibot);
|
|
1167
|
+
var sourceFile = project.sourceFile(filePath);
|
|
1168
|
+
var result = extractMutationsFromModel(sourceFile, content, filePath, !!silent, typeToValibot);
|
|
1157
1169
|
if (result) {
|
|
1158
1170
|
result.modelName = fileBaseName;
|
|
1159
1171
|
allModelMutations.push(result);
|
|
@@ -1186,62 +1198,44 @@ async function generate(options) {
|
|
|
1186
1198
|
}
|
|
1187
1199
|
}
|
|
1188
1200
|
if (unresolvedModels.length > 0) {
|
|
1189
|
-
var collectTsFiles = function collectTsFiles1(dir2) {
|
|
1190
|
-
var results = [];
|
|
1191
|
-
var _iteratorNormalCompletion4 = true,
|
|
1192
|
-
_didIteratorError4 = false,
|
|
1193
|
-
_iteratorError4 = void 0;
|
|
1194
|
-
try {
|
|
1195
|
-
for (var _iterator4 = readdirSync(dir2, {
|
|
1196
|
-
withFileTypes: true
|
|
1197
|
-
})[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
|
|
1198
|
-
var entry = _step4.value;
|
|
1199
|
-
var fullPath = resolve(dir2, entry.name);
|
|
1200
|
-
if (entry.isDirectory() && entry.name !== "node_modules") {
|
|
1201
|
-
results.push(...collectTsFiles(fullPath));
|
|
1202
|
-
} else if (entry.isFile() && isGeneratorSourceFile(entry.name)) {
|
|
1203
|
-
results.push({
|
|
1204
|
-
path: fullPath,
|
|
1205
|
-
content: readFileSync(fullPath, "utf-8")
|
|
1206
|
-
});
|
|
1207
|
-
}
|
|
1208
|
-
}
|
|
1209
|
-
} catch (err) {
|
|
1210
|
-
_didIteratorError4 = true;
|
|
1211
|
-
_iteratorError4 = err;
|
|
1212
|
-
} finally {
|
|
1213
|
-
try {
|
|
1214
|
-
if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
|
|
1215
|
-
_iterator4.return();
|
|
1216
|
-
}
|
|
1217
|
-
} finally {
|
|
1218
|
-
if (_didIteratorError4) {
|
|
1219
|
-
throw _iteratorError4;
|
|
1220
|
-
}
|
|
1221
|
-
}
|
|
1222
|
-
}
|
|
1223
|
-
return results;
|
|
1224
|
-
};
|
|
1225
|
-
var allFiles = [...new Map(layout.sourceRoots.flatMap(collectTsFiles).map(function (file) {
|
|
1226
|
-
return [file.path, file];
|
|
1227
|
-
})).values()];
|
|
1228
|
-
var modelResolver = createTypeResolver(ts, allFiles, baseDir);
|
|
1229
1201
|
var _iteratorNormalCompletion2 = true,
|
|
1230
1202
|
_didIteratorError2 = false,
|
|
1231
1203
|
_iteratorError2 = void 0;
|
|
1232
1204
|
try {
|
|
1233
|
-
var _loop1 = function () {
|
|
1205
|
+
var _loop1 = async function () {
|
|
1234
1206
|
var {
|
|
1235
1207
|
baseName,
|
|
1236
1208
|
filePath: filePath2
|
|
1237
1209
|
} = _step2.value;
|
|
1238
|
-
var
|
|
1239
|
-
|
|
1240
|
-
var resolvedTypes = resolveMutationParamTypes(
|
|
1210
|
+
var sourceFile2 = project.sourceFile(filePath2);
|
|
1211
|
+
var modelResolver = createTypeResolver(project.projectForFile(filePath2));
|
|
1212
|
+
var resolvedTypes = await resolveMutationParamTypes(modelResolver, sourceFile2);
|
|
1241
1213
|
if (resolvedTypes.size === 0) return "continue";
|
|
1214
|
+
var resolvedValibot = /* @__PURE__ */new Map();
|
|
1215
|
+
var _iteratorNormalCompletion4 = true,
|
|
1216
|
+
_didIteratorError4 = false,
|
|
1217
|
+
_iteratorError4 = void 0;
|
|
1218
|
+
try {
|
|
1219
|
+
for (var _iterator4 = resolvedTypes[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
|
|
1220
|
+
var [name, type] = _step4.value;
|
|
1221
|
+
resolvedValibot.set(name, await modelResolver.typeToValibot(type));
|
|
1222
|
+
}
|
|
1223
|
+
} catch (err) {
|
|
1224
|
+
_didIteratorError4 = true;
|
|
1225
|
+
_iteratorError4 = err;
|
|
1226
|
+
} finally {
|
|
1227
|
+
try {
|
|
1228
|
+
if (!_iteratorNormalCompletion4 && _iterator4.return != null) {
|
|
1229
|
+
_iterator4.return();
|
|
1230
|
+
}
|
|
1231
|
+
} finally {
|
|
1232
|
+
if (_didIteratorError4) {
|
|
1233
|
+
throw _iteratorError4;
|
|
1234
|
+
}
|
|
1235
|
+
}
|
|
1236
|
+
}
|
|
1242
1237
|
var content2 = readFileSync(filePath2, "utf-8");
|
|
1243
|
-
var
|
|
1244
|
-
var result2 = extractMutationsFromModel(ts, sourceFile2, content2, filePath2, !!silent, typeToValibot, resolvedTypes, modelResolver.typeToValibot);
|
|
1238
|
+
var result2 = extractMutationsFromModel(sourceFile2, content2, filePath2, !!silent, typeToValibot, resolvedValibot);
|
|
1245
1239
|
if (result2) {
|
|
1246
1240
|
result2.modelName = baseName;
|
|
1247
1241
|
var idx = allModelMutations.findIndex(function (m) {
|
|
@@ -1250,7 +1244,7 @@ async function generate(options) {
|
|
|
1250
1244
|
if (idx >= 0) allModelMutations[idx] = result2;
|
|
1251
1245
|
}
|
|
1252
1246
|
};
|
|
1253
|
-
for (var _iterator2 = unresolvedModels[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) _loop1();
|
|
1247
|
+
for (var _iterator2 = unresolvedModels[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) await _loop1();
|
|
1254
1248
|
} catch (err) {
|
|
1255
1249
|
_didIteratorError2 = true;
|
|
1256
1250
|
_iteratorError2 = err;
|
|
@@ -1360,8 +1354,13 @@ ${event} ${path}`);
|
|
|
1360
1354
|
}, debounce);
|
|
1361
1355
|
};
|
|
1362
1356
|
var databaseDir = resolve(dirname(baseDir), "database");
|
|
1363
|
-
var
|
|
1364
|
-
var layout
|
|
1357
|
+
var project = await loadGeneratorProject(baseDir);
|
|
1358
|
+
var layout;
|
|
1359
|
+
try {
|
|
1360
|
+
layout = discoverDataLayout(project, baseDir, options.config ? resolve(options.config) : void 0);
|
|
1361
|
+
} finally {
|
|
1362
|
+
await project.close();
|
|
1363
|
+
}
|
|
1365
1364
|
var watcher = chokidar.watch([... /* @__PURE__ */new Set([...layout.sourceRoots, ...(existsSync(databaseDir) ? [databaseDir] : [])])], {
|
|
1366
1365
|
persistent: true,
|
|
1367
1366
|
ignoreInitial: true,
|