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.
Files changed (110) hide show
  1. package/dist/cjs/createZeroClient.cjs +44 -11
  2. package/dist/cjs/createZeroClient.native.js +54 -17
  3. package/dist/cjs/createZeroClient.native.js.map +1 -1
  4. package/dist/cjs/createZeroClient.recovery.test.cjs +49 -0
  5. package/dist/cjs/createZeroClient.recovery.test.native.js +53 -0
  6. package/dist/cjs/createZeroClient.recovery.test.native.js.map +1 -1
  7. package/dist/cjs/generate-helpers.cjs +28 -0
  8. package/dist/cjs/generate-helpers.native.js +36 -0
  9. package/dist/cjs/generate-helpers.native.js.map +1 -1
  10. package/dist/cjs/generate-layout.cjs +62 -53
  11. package/dist/cjs/generate-layout.native.js +62 -54
  12. package/dist/cjs/generate-layout.native.js.map +1 -1
  13. package/dist/cjs/generate-lite.cjs +28 -0
  14. package/dist/cjs/generate-lite.native.js +89 -33
  15. package/dist/cjs/generate-lite.native.js.map +1 -1
  16. package/dist/cjs/generate-lite.test.cjs +46 -0
  17. package/dist/cjs/generate-lite.test.native.js +46 -0
  18. package/dist/cjs/generate-lite.test.native.js.map +1 -1
  19. package/dist/cjs/generate.cjs +237 -243
  20. package/dist/cjs/generate.native.js +352 -353
  21. package/dist/cjs/generate.native.js.map +1 -1
  22. package/dist/cjs/generate.test.cjs +35 -0
  23. package/dist/cjs/generate.test.native.js +35 -0
  24. package/dist/cjs/generate.test.native.js.map +1 -1
  25. package/dist/cjs/helpers/createMutators.cjs +2 -1
  26. package/dist/cjs/helpers/createMutators.native.js +3 -1
  27. package/dist/cjs/helpers/createMutators.native.js.map +1 -1
  28. package/dist/cjs/helpers/recoverZeroClient.cjs +8 -2
  29. package/dist/cjs/helpers/recoverZeroClient.native.js +10 -2
  30. package/dist/cjs/helpers/recoverZeroClient.native.js.map +1 -1
  31. package/dist/cjs/helpers/recoverZeroClient.test.cjs +53 -0
  32. package/dist/cjs/helpers/recoverZeroClient.test.native.js +55 -0
  33. package/dist/cjs/helpers/recoverZeroClient.test.native.js.map +1 -1
  34. package/dist/cjs/native-typescript.cjs +190 -0
  35. package/dist/cjs/native-typescript.native.js +255 -0
  36. package/dist/cjs/native-typescript.native.js.map +1 -0
  37. package/dist/esm/createZeroClient.mjs +44 -11
  38. package/dist/esm/createZeroClient.mjs.map +1 -1
  39. package/dist/esm/createZeroClient.native.js +54 -17
  40. package/dist/esm/createZeroClient.native.js.map +1 -1
  41. package/dist/esm/createZeroClient.recovery.test.mjs +50 -1
  42. package/dist/esm/createZeroClient.recovery.test.mjs.map +1 -1
  43. package/dist/esm/createZeroClient.recovery.test.native.js +54 -1
  44. package/dist/esm/createZeroClient.recovery.test.native.js.map +1 -1
  45. package/dist/esm/generate-helpers.mjs +27 -1
  46. package/dist/esm/generate-helpers.mjs.map +1 -1
  47. package/dist/esm/generate-helpers.native.js +35 -1
  48. package/dist/esm/generate-helpers.native.js.map +1 -1
  49. package/dist/esm/generate-layout.mjs +52 -54
  50. package/dist/esm/generate-layout.mjs.map +1 -1
  51. package/dist/esm/generate-layout.native.js +52 -55
  52. package/dist/esm/generate-layout.native.js.map +1 -1
  53. package/dist/esm/generate-lite.mjs +29 -1
  54. package/dist/esm/generate-lite.mjs.map +1 -1
  55. package/dist/esm/generate-lite.native.js +90 -34
  56. package/dist/esm/generate-lite.native.js.map +1 -1
  57. package/dist/esm/generate-lite.test.mjs +46 -0
  58. package/dist/esm/generate-lite.test.mjs.map +1 -1
  59. package/dist/esm/generate-lite.test.native.js +46 -0
  60. package/dist/esm/generate-lite.test.native.js.map +1 -1
  61. package/dist/esm/generate.mjs +238 -244
  62. package/dist/esm/generate.mjs.map +1 -1
  63. package/dist/esm/generate.native.js +353 -354
  64. package/dist/esm/generate.native.js.map +1 -1
  65. package/dist/esm/generate.test.mjs +35 -0
  66. package/dist/esm/generate.test.mjs.map +1 -1
  67. package/dist/esm/generate.test.native.js +35 -0
  68. package/dist/esm/generate.test.native.js.map +1 -1
  69. package/dist/esm/helpers/createMutators.mjs +2 -1
  70. package/dist/esm/helpers/createMutators.mjs.map +1 -1
  71. package/dist/esm/helpers/createMutators.native.js +3 -1
  72. package/dist/esm/helpers/createMutators.native.js.map +1 -1
  73. package/dist/esm/helpers/recoverZeroClient.mjs +8 -2
  74. package/dist/esm/helpers/recoverZeroClient.mjs.map +1 -1
  75. package/dist/esm/helpers/recoverZeroClient.native.js +10 -2
  76. package/dist/esm/helpers/recoverZeroClient.native.js.map +1 -1
  77. package/dist/esm/helpers/recoverZeroClient.test.mjs +53 -0
  78. package/dist/esm/helpers/recoverZeroClient.test.mjs.map +1 -1
  79. package/dist/esm/helpers/recoverZeroClient.test.native.js +55 -0
  80. package/dist/esm/helpers/recoverZeroClient.test.native.js.map +1 -1
  81. package/dist/esm/index.native.js.map +1 -1
  82. package/dist/esm/native-typescript.mjs +164 -0
  83. package/dist/esm/native-typescript.mjs.map +1 -0
  84. package/dist/esm/native-typescript.native.js +226 -0
  85. package/dist/esm/native-typescript.native.js.map +1 -0
  86. package/package.json +4 -3
  87. package/src/createZeroClient.recovery.test.tsx +56 -1
  88. package/src/createZeroClient.tsx +54 -15
  89. package/src/generate-helpers.ts +79 -0
  90. package/src/generate-layout.ts +64 -108
  91. package/src/generate-lite.test.ts +49 -0
  92. package/src/generate-lite.ts +44 -0
  93. package/src/generate.test.ts +52 -0
  94. package/src/generate.ts +313 -366
  95. package/src/helpers/createMutators.ts +14 -3
  96. package/src/helpers/recoverZeroClient.test.ts +50 -0
  97. package/src/helpers/recoverZeroClient.ts +12 -2
  98. package/src/native-typescript.ts +176 -0
  99. package/types/createZeroClient.d.ts.map +1 -1
  100. package/types/generate-helpers.d.ts +13 -0
  101. package/types/generate-helpers.d.ts.map +1 -1
  102. package/types/generate-layout.d.ts +2 -1
  103. package/types/generate-layout.d.ts.map +1 -1
  104. package/types/generate-lite.d.ts +1 -0
  105. package/types/generate-lite.d.ts.map +1 -1
  106. package/types/generate.d.ts.map +1 -1
  107. package/types/helpers/createMutators.d.ts.map +1 -1
  108. package/types/helpers/recoverZeroClient.d.ts.map +1 -1
  109. package/types/native-typescript.d.ts +11 -0
  110. 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 { CRUD_MUTATION_NAMES, formatObjectKey, generateAggregatesFile, generateGroupedQueriesFile, generateInstancesFile, generateModelsFile, generateReadmeFile, generateSyncedMutationsFile, generateSyncedQueriesFile, generateTablesFile, generateTypesFile, parseColumnType, parseTypeString, shouldSkipObjectKey } from "./generate-helpers.native.js";
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 = "6";
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 cachedHash = generateCache[filePath];
115
- if (cachedHash === contentHash && existsSync(filePath)) {
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(ts, files, dir) {
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
- program,
187
- checker,
188
- // resolve a type annotation node to a ts.Type
189
- resolveType(node) {
131
+ project,
132
+ async resolveType(node) {
190
133
  try {
191
- return checker.getTypeFromTypeNode(node);
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
- // convert a resolved type to valibot code
197
- typeToValibot(type) {
198
- return tsTypeToValibot(ts, checker, type);
140
+ async typeToValibot(type) {
141
+ return tsTypeToValibot(project, type);
199
142
  }
200
143
  };
201
144
  }
202
- function resolveParamType(ts, resolver, sourceFile, exportName, paramIndex) {
203
- var result = null;
204
- ts.forEachChild(sourceFile, function (node) {
145
+ async function resolveParamType(resolver, sourceFile, exportName, paramIndex) {
146
+ var typeNode = null;
147
+ sourceFile.forEachChild(function (node) {
205
148
  var _node_modifiers;
206
- if (result) return;
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
- result = resolver.resolveType(param.type);
160
+ typeNode = param.type;
218
161
  }
219
162
  }
220
163
  });
221
- return result;
164
+ return typeNode ? resolver.resolveType(typeNode) : null;
222
165
  }
223
- function readMutationsCall(ts, call) {
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(ts, resolver, sourceFile) {
269
- var resolved = /* @__PURE__ */new Map();
270
- ts.forEachChild(sourceFile, function (node) {
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(node)) return;
273
- if (!((_node_modifiers = node.modifiers) === null || _node_modifiers === void 0 ? void 0 : _node_modifiers.some(function (m) {
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 = node.declarationList.declarations[0];
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(ts, decl.initializer);
225
+ } = readMutationsCall(decl.initializer);
283
226
  if (!handlersArg) return;
284
- var _iteratorNormalCompletion = true,
285
- _didIteratorError = false,
286
- _iteratorError = void 0;
227
+ var _iteratorNormalCompletion2 = true,
228
+ _didIteratorError2 = false,
229
+ _iteratorError2 = void 0;
287
230
  try {
288
- for (var _iterator = handlersArg.properties[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
289
- var prop = _step.value;
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 name = (_prop_name = prop.name) === null || _prop_name === void 0 ? void 0 : _prop_name.getText(sourceFile);
293
- if (!name) continue;
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
- var expanded = resolver.resolveType(typeNode);
307
- if (expanded) {
308
- resolved.set(name, expanded);
309
- }
249
+ nodes.set(name2, typeNode);
310
250
  }
311
251
  } catch (err) {
312
- _didIteratorError = true;
313
- _iteratorError = err;
252
+ _didIteratorError2 = true;
253
+ _iteratorError2 = err;
314
254
  } finally {
315
255
  try {
316
- if (!_iteratorNormalCompletion && _iterator.return != null) {
317
- _iterator.return();
256
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
257
+ _iterator2.return();
318
258
  }
319
259
  } finally {
320
- if (_didIteratorError) {
321
- throw _iteratorError;
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(ts, sourceFile, content, fileName, silent, typeToValibot, resolvedTypes, resolvedTypeToValibot) {
292
+ function extractMutationsFromModel(sourceFile, content, fileName, silent, typeToValibot, resolvedValibot) {
329
293
  var mutateNode = null;
330
- ts.forEachChild(sourceFile, function (node) {
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(ts, call);
321
+ } = readMutationsCall(call);
358
322
  var hasCRUD = hasTable && crud;
359
323
  var columns = {};
360
324
  var primaryKeys = [];
361
325
  if (hasCRUD) {
362
- extractSchemaColumns(ts, sourceFile, columns, primaryKeys);
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 && resolvedTypes && resolvedTypeToValibot) {
406
- var resolvedType = resolvedTypes.get(name);
407
- if (resolvedType) {
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(ts, sourceFile, columns, primaryKeys) {
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
- ts.forEachChild(node, visit);
466
+ node.forEachChild(visit);
505
467
  }
506
468
  visit(sourceFile);
507
469
  }
508
- function getInstantiatedPropertyType(checker, parent, name) {
509
- var resolveProperty = Reflect.get(checker, "getTypeOfPropertyOfType");
510
- if (typeof resolveProperty !== "function") return void 0;
511
- return Reflect.apply(resolveProperty, checker, [parent, name]);
512
- }
513
- function tsTypeToValibot(ts, checker, type, seen) {
514
- var _checker_isArrayType, _checker_isArrayLikeType;
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(t) {
522
- return tsTypeToValibot(ts, checker, t, seen);
478
+ var recurse = function recurse2(value) {
479
+ return tsTypeToValibot(project, value, seen);
523
480
  };
524
- if (flags & ts.TypeFlags.String) return "v.string()";
525
- if (flags & ts.TypeFlags.Number) return "v.number()";
526
- if (flags & ts.TypeFlags.Boolean) return "v.boolean()";
527
- if (flags & ts.TypeFlags.Void || flags & ts.TypeFlags.Undefined) return "v.void_()";
528
- if (flags & ts.TypeFlags.Null) return "v.null_()";
529
- if (flags & ts.TypeFlags.Any || flags & ts.TypeFlags.Unknown) return "v.unknown()";
530
- if (flags & ts.TypeFlags.Never) return "v.never()";
531
- if (flags & ts.TypeFlags.TemplateLiteral) return "v.string()";
532
- if (flags & ts.TypeFlags.Object && (((_checker_isArrayType = checker.isArrayType) === null || _checker_isArrayType === void 0 ? void 0 : _checker_isArrayType.call(checker, type)) || ((_checker_isArrayLikeType = checker.isArrayLikeType) === null || _checker_isArrayLikeType === void 0 ? void 0 : _checker_isArrayLikeType.call(checker, type)))) {
533
- var _ref;
534
- var _checker_getTypeArguments, _type_getNumberIndexType;
535
- var typeArgs = (_ref = (_checker_getTypeArguments = checker.getTypeArguments) === null || _checker_getTypeArguments === void 0 ? void 0 : _checker_getTypeArguments.call(checker, type)) !== null && _ref !== void 0 ? _ref : [];
536
- var elementType = typeArgs.length === 1 ? typeArgs[0] : (_type_getNumberIndexType = type.getNumberIndexType) === null || _type_getNumberIndexType === void 0 ? void 0 : _type_getNumberIndexType.call(type);
537
- return `v.array(${elementType ? recurse(elementType) : "v.unknown()"})`;
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 (flags & ts.TypeFlags.StringLiteral) {
497
+ if (type.isStringLiteralType()) {
540
498
  return `v.literal(${JSON.stringify(type.value)})`;
541
499
  }
542
- if (flags & ts.TypeFlags.NumberLiteral) {
500
+ if (type.isNumberLiteralType()) {
543
501
  return `v.literal(${type.value})`;
544
502
  }
545
- if (flags & ts.TypeFlags.BooleanLiteral) {
546
- var name = type.intrinsicName;
547
- return `v.literal(${name === "true"})`;
503
+ if (type.isBooleanLiteralType()) {
504
+ return `v.literal(${type.value})`;
548
505
  }
549
- if (type.isUnion()) {
550
- var members = type.types;
551
- var hasNull = members.some(function (t) {
552
- return t.getFlags() & ts.TypeFlags.Null;
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 (t) {
555
- return t.getFlags() & (ts.TypeFlags.Undefined | ts.TypeFlags.Void);
511
+ var hasUndefined = members.some(function (member) {
512
+ return member.flags & (TypeFlags.Undefined | TypeFlags.Void);
556
513
  });
557
- var rest = members.filter(function (t) {
558
- return !(t.getFlags() & (ts.TypeFlags.Null | ts.TypeFlags.Undefined | ts.TypeFlags.Void));
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 (t) {
561
- return t.getFlags() & ts.TypeFlags.BooleanLiteral;
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(function (t) {
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(parent, prop2) {
577
- var _prop_declarations;
578
- var instantiated = getInstantiatedPropertyType(checker, parent, prop2.getName());
579
- if (instantiated) return instantiated;
580
- if (prop2.valueDeclaration) return checker.getTypeOfSymbolAtLocation(prop2, prop2.valueDeclaration);
581
- if ((_prop_declarations = prop2.declarations) === null || _prop_declarations === void 0 ? void 0 : _prop_declarations[0]) return checker.getTypeOfSymbolAtLocation(prop2, prop2.declarations[0]);
582
- return checker.getDeclaredTypeOfSymbol(prop2);
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
- if (type.isIntersection()) {
585
- var props = type.getProperties();
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 _iteratorNormalCompletion = true,
589
- _didIteratorError = false,
590
- _iteratorError = void 0;
543
+ var _iteratorNormalCompletion2 = true,
544
+ _didIteratorError2 = false,
545
+ _iteratorError2 = void 0;
591
546
  try {
592
- for (var _iterator = props[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
593
- var prop = _step.value;
594
- var name1 = prop.getName();
595
- if (shouldSkipObjectKey(name1)) continue;
596
- var propType = resolveSymbolType(type, prop);
597
- var isOptional = !!(prop.getFlags() & ts.SymbolFlags.Optional);
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(name1)}: ${val}`);
557
+ entries.push(`${formatObjectKey(name)}: ${val}`);
603
558
  }
604
559
  } catch (err) {
605
- _didIteratorError = true;
606
- _iteratorError = err;
560
+ _didIteratorError2 = true;
561
+ _iteratorError2 = err;
607
562
  } finally {
608
563
  try {
609
- if (!_iteratorNormalCompletion && _iterator.return != null) {
610
- _iterator.return();
564
+ if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
565
+ _iterator2.return();
611
566
  }
612
567
  } finally {
613
- if (_didIteratorError) {
614
- throw _iteratorError;
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
- var props1 = type.getProperties();
624
- if (props1.length > 0 && (type.getFlags() & ts.TypeFlags.Object || type.objectFlags)) {
625
- var _type_objectFlags;
626
- var objectFlags = (_type_objectFlags = type.objectFlags) !== null && _type_objectFlags !== void 0 ? _type_objectFlags : 0;
627
- if (objectFlags & ts.ObjectFlags.Reference) {
628
- var _typeRef_typeArguments;
629
- var typeRef = type;
630
- var symbol = type.getSymbol();
631
- var name2 = symbol === null || symbol === void 0 ? void 0 : symbol.getName();
632
- if ((name2 === "Array" || name2 === "ReadonlyArray") && ((_typeRef_typeArguments = typeRef.typeArguments) === null || _typeRef_typeArguments === void 0 ? void 0 : _typeRef_typeArguments.length) === 1) {
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
- if (objectFlags & ts.ObjectFlags.Tuple) {
637
- var typeRef1 = type;
638
- var typeArgs1 = typeRef1.typeArguments || [];
639
- return `v.tuple([${typeArgs1.map(function (t) {
640
- return recurse(t);
641
- }).join(", ")}])`;
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
- var entries1 = [];
644
- var _iteratorNormalCompletion1 = true,
645
- _didIteratorError1 = false,
646
- _iteratorError1 = void 0;
609
+ } catch (err) {
610
+ _didIteratorError = true;
611
+ _iteratorError = err;
612
+ } finally {
647
613
  try {
648
- for (var _iterator1 = props1[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
649
- var prop1 = _step1.value;
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
- try {
665
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
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 ts = await import("typescript");
843
- var layout = discoverDataLayout(ts, resolve(options.dir), options.config ? resolve(options.config) : void 0);
844
- return dataMembershipFromLayout(layout);
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(ts, baseDir, options.config ? resolve(options.config) : void 0);
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 = ts.createSourceFile(relationsPath, readFileSync(relationsPath, "utf8"), ts.ScriptTarget.Latest, true);
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
- ts.forEachChild(node, visit);
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 ts = await import("typescript");
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 && existsSync(resolve(generatedDir, "models.ts"))) {
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 content2 = readFileSync(filePath2, "utf-8");
1032
- var sourceFile2 = ts.createSourceFile(filePath2, content2, ts.ScriptTarget.Latest, true);
1033
- ts.forEachChild(sourceFile2, function (node) {
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
- var valibotCode = typeToValibot(paramType);
1053
- if (!valibotCode && params.length > 0 && params[0].type) {
1054
- var resolver = getQueryResolver();
1055
- var resolverSourceFile = resolver.program.getSourceFile(filePath2);
1056
- if (resolverSourceFile) {
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
- mutationFiles.push({
1151
- path: filePath,
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 resolverSourceFile = modelResolver.program.getSourceFile(filePath2);
1239
- if (!resolverSourceFile) return "continue";
1240
- var resolvedTypes = resolveMutationParamTypes(ts, modelResolver, resolverSourceFile);
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 sourceFile2 = ts.createSourceFile(filePath2, content2, ts.ScriptTarget.Latest, true);
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 ts = await import("typescript");
1364
- var layout = discoverDataLayout(ts, baseDir, options.config ? resolve(options.config) : void 0);
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,