on-zero 0.1.39 → 0.1.41

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 (84) hide show
  1. package/dist/cjs/createUseQuery.cjs +3 -2
  2. package/dist/cjs/createUseQuery.js +2 -2
  3. package/dist/cjs/createUseQuery.js.map +1 -1
  4. package/dist/cjs/createUseQuery.native.js +3 -2
  5. package/dist/cjs/createUseQuery.native.js.map +1 -1
  6. package/dist/cjs/createZeroClient.cjs +28 -5
  7. package/dist/cjs/createZeroClient.js +19 -4
  8. package/dist/cjs/createZeroClient.js.map +1 -1
  9. package/dist/cjs/createZeroClient.native.js +29 -5
  10. package/dist/cjs/createZeroClient.native.js.map +1 -1
  11. package/dist/cjs/createZeroServer.cjs +5 -2
  12. package/dist/cjs/createZeroServer.js +5 -2
  13. package/dist/cjs/createZeroServer.js.map +1 -1
  14. package/dist/cjs/createZeroServer.native.js +5 -2
  15. package/dist/cjs/createZeroServer.native.js.map +1 -1
  16. package/dist/cjs/generate.cjs +458 -39
  17. package/dist/cjs/generate.js +485 -31
  18. package/dist/cjs/generate.js.map +2 -2
  19. package/dist/cjs/generate.native.js +812 -51
  20. package/dist/cjs/generate.native.js.map +1 -1
  21. package/dist/cjs/generate.test.cjs +251 -0
  22. package/dist/cjs/generate.test.js +252 -0
  23. package/dist/cjs/generate.test.js.map +1 -1
  24. package/dist/cjs/generate.test.native.js +251 -0
  25. package/dist/cjs/generate.test.native.js.map +1 -1
  26. package/dist/cjs/helpers/createMutators.cjs +21 -8
  27. package/dist/cjs/helpers/createMutators.js +16 -6
  28. package/dist/cjs/helpers/createMutators.js.map +1 -1
  29. package/dist/cjs/helpers/createMutators.native.js +28 -10
  30. package/dist/cjs/helpers/createMutators.native.js.map +1 -1
  31. package/dist/esm/createUseQuery.js +3 -3
  32. package/dist/esm/createUseQuery.js.map +1 -1
  33. package/dist/esm/createUseQuery.mjs +4 -3
  34. package/dist/esm/createUseQuery.mjs.map +1 -1
  35. package/dist/esm/createUseQuery.native.js +4 -3
  36. package/dist/esm/createUseQuery.native.js.map +1 -1
  37. package/dist/esm/createZeroClient.js +19 -4
  38. package/dist/esm/createZeroClient.js.map +1 -1
  39. package/dist/esm/createZeroClient.mjs +28 -5
  40. package/dist/esm/createZeroClient.mjs.map +1 -1
  41. package/dist/esm/createZeroClient.native.js +29 -5
  42. package/dist/esm/createZeroClient.native.js.map +1 -1
  43. package/dist/esm/createZeroServer.js +5 -2
  44. package/dist/esm/createZeroServer.js.map +1 -1
  45. package/dist/esm/createZeroServer.mjs +5 -2
  46. package/dist/esm/createZeroServer.mjs.map +1 -1
  47. package/dist/esm/createZeroServer.native.js +5 -2
  48. package/dist/esm/createZeroServer.native.js.map +1 -1
  49. package/dist/esm/generate.js +486 -32
  50. package/dist/esm/generate.js.map +2 -2
  51. package/dist/esm/generate.mjs +459 -40
  52. package/dist/esm/generate.mjs.map +1 -1
  53. package/dist/esm/generate.native.js +813 -52
  54. package/dist/esm/generate.native.js.map +1 -1
  55. package/dist/esm/generate.test.js +252 -0
  56. package/dist/esm/generate.test.js.map +1 -1
  57. package/dist/esm/generate.test.mjs +251 -0
  58. package/dist/esm/generate.test.mjs.map +1 -1
  59. package/dist/esm/generate.test.native.js +251 -0
  60. package/dist/esm/generate.test.native.js.map +1 -1
  61. package/dist/esm/helpers/createMutators.js +6 -4
  62. package/dist/esm/helpers/createMutators.js.map +1 -1
  63. package/dist/esm/helpers/createMutators.mjs +6 -4
  64. package/dist/esm/helpers/createMutators.mjs.map +1 -1
  65. package/dist/esm/helpers/createMutators.native.js +13 -6
  66. package/dist/esm/helpers/createMutators.native.js.map +1 -1
  67. package/package.json +2 -2
  68. package/readme.md +110 -2
  69. package/src/createUseQuery.tsx +15 -6
  70. package/src/createZeroClient.tsx +42 -6
  71. package/src/createZeroServer.ts +9 -0
  72. package/src/generate.test.ts +340 -0
  73. package/src/generate.ts +863 -43
  74. package/src/helpers/createMutators.ts +22 -8
  75. package/types/createUseQuery.d.ts +2 -1
  76. package/types/createUseQuery.d.ts.map +1 -1
  77. package/types/createZeroClient.d.ts +10 -1
  78. package/types/createZeroClient.d.ts.map +1 -1
  79. package/types/createZeroServer.d.ts +7 -1
  80. package/types/createZeroServer.d.ts.map +1 -1
  81. package/types/generate.d.ts +1 -0
  82. package/types/generate.d.ts.map +1 -1
  83. package/types/helpers/createMutators.d.ts +3 -1
  84. package/types/helpers/createMutators.d.ts.map +1 -1
@@ -154,6 +154,7 @@ this folder is auto-generated by on-zero. do not edit files here directly.
154
154
  - \`tables.ts\` - exports table schemas for type inference
155
155
  - \`groupedQueries.ts\` - namespaced query re-exports for client setup
156
156
  - \`syncedQueries.ts\` - namespaced syncedQuery wrappers for server setup
157
+ - \`syncedMutations.ts\` - valibot validators for mutation args (server auto-validation)
157
158
 
158
159
  ## usage guidelines
159
160
 
@@ -250,27 +251,11 @@ import * as Queries from './groupedQueries'
250
251
  return a.name.localeCompare(b.name);
251
252
  }),
252
253
  queryDefs = fileQueries.map(function (q2) {
253
- var lines = q2.valibotCode.split(`
254
- `).filter(function (l) {
255
- return l.trim();
256
- }),
257
- schemaLineIndex = lines.findIndex(function (l) {
258
- return l.startsWith("export const QueryParams");
259
- }),
260
- validatorDef = "";
261
- if (schemaLineIndex !== -1) {
262
- for (var schemaLines = [], openBraces = 0, started = !1, i = schemaLineIndex; i < lines.length; i++) {
263
- var line = lines[i],
264
- cleaned = started ? line : line.replace("export const QueryParams = ", "");
265
- if (schemaLines.push(cleaned), started = !0, openBraces += (cleaned.match(/\{/g) || []).length, openBraces -= (cleaned.match(/\}/g) || []).length, openBraces += (cleaned.match(/\(/g) || []).length, openBraces -= (cleaned.match(/\)/g) || []).length, openBraces === 0 && schemaLines.length > 0) break;
266
- }
267
- validatorDef = schemaLines.join(`
268
- `);
269
- }
254
+ var validatorDef = q2.valibotCode.trim();
270
255
  if (q2.params === "void" || !validatorDef) return ` ${q2.name}: defineQuery(() => Queries.${file}.${q2.name}()),`;
271
256
  var indentedValidator = validatorDef.split(`
272
- `).map(function (line2, i2) {
273
- return i2 === 0 ? line2 : ` ${line2}`;
257
+ `).map(function (line, i) {
258
+ return i === 0 ? line : ` ${line}`;
274
259
  }).join(`
275
260
  `);
276
261
  return ` ${q2.name}: defineQuery(
@@ -297,6 +282,631 @@ ${queriesObject}
297
282
  })
298
283
  `;
299
284
  }
285
+ function createTypeResolver(ts, files, dir) {
286
+ var configPath = ts.findConfigFile(dir, ts.sys.fileExists, "tsconfig.json"),
287
+ compilerOptions = {
288
+ target: ts.ScriptTarget.Latest,
289
+ module: ts.ModuleKind.ESNext,
290
+ moduleResolution: ts.ModuleResolutionKind.Bundler,
291
+ strict: !1,
292
+ skipLibCheck: !0,
293
+ noEmit: !0
294
+ };
295
+ if (configPath) {
296
+ var configFile = ts.readConfigFile(configPath, ts.sys.readFile);
297
+ if (configFile.config) {
298
+ var parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, (0, import_path.dirname)(configPath));
299
+ compilerOptions = {
300
+ ...compilerOptions,
301
+ ...parsed.options
302
+ };
303
+ }
304
+ }
305
+ var fileMap = /* @__PURE__ */new Map(),
306
+ _iteratorNormalCompletion = !0,
307
+ _didIteratorError = !1,
308
+ _iteratorError = void 0;
309
+ try {
310
+ for (var _iterator = files[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
311
+ var f = _step.value;
312
+ fileMap.set(f.path, f.content);
313
+ }
314
+ } catch (err) {
315
+ _didIteratorError = !0, _iteratorError = err;
316
+ } finally {
317
+ try {
318
+ !_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
319
+ } finally {
320
+ if (_didIteratorError) throw _iteratorError;
321
+ }
322
+ }
323
+ var host = ts.createCompilerHost(compilerOptions),
324
+ originalGetSourceFile = host.getSourceFile.bind(host);
325
+ host.getSourceFile = function (fileName, languageVersion, onError) {
326
+ var content = fileMap.get(fileName);
327
+ return content !== void 0 ? ts.createSourceFile(fileName, content, languageVersion, !0) : originalGetSourceFile(fileName, languageVersion, onError);
328
+ }, host.fileExists = function (fileName) {
329
+ return fileMap.has(fileName) || ts.sys.fileExists(fileName);
330
+ }, host.readFile = function (fileName) {
331
+ var _fileMap_get;
332
+ return (_fileMap_get = fileMap.get(fileName)) !== null && _fileMap_get !== void 0 ? _fileMap_get : ts.sys.readFile(fileName);
333
+ };
334
+ var program = ts.createProgram(files.map(function (f2) {
335
+ return f2.path;
336
+ }), compilerOptions, host),
337
+ checker = program.getTypeChecker();
338
+ return {
339
+ program,
340
+ checker,
341
+ // resolve a type annotation node to a ts.Type
342
+ resolveType(node) {
343
+ try {
344
+ return checker.getTypeFromTypeNode(node);
345
+ } catch {
346
+ return null;
347
+ }
348
+ },
349
+ // convert a resolved type to valibot code
350
+ typeToValibot(type) {
351
+ return tsTypeToValibot(ts, checker, type);
352
+ }
353
+ };
354
+ }
355
+ function resolveParamType(ts, resolver, sourceFile, exportName, paramIndex) {
356
+ var result = null;
357
+ return ts.forEachChild(sourceFile, function (node) {
358
+ var _node_modifiers;
359
+ if (!result && ts.isVariableStatement(node) && !((_node_modifiers = node.modifiers) === null || _node_modifiers === void 0) && _node_modifiers.some(function (m) {
360
+ return m.kind === ts.SyntaxKind.ExportKeyword;
361
+ })) {
362
+ var decl = node.declarationList.declarations[0];
363
+ if (!(!decl || !ts.isVariableDeclaration(decl)) && decl.name.getText(sourceFile) === exportName && decl.initializer && ts.isArrowFunction(decl.initializer)) {
364
+ var param = decl.initializer.parameters[paramIndex];
365
+ param?.type && (result = resolver.resolveType(param.type));
366
+ }
367
+ }
368
+ }), result;
369
+ }
370
+ function resolveMutationParamTypes(ts, resolver, sourceFile) {
371
+ var resolved = /* @__PURE__ */new Map();
372
+ return ts.forEachChild(sourceFile, function (node) {
373
+ var _node_modifiers;
374
+ if (ts.isVariableStatement(node) && !((_node_modifiers = node.modifiers) === null || _node_modifiers === void 0) && _node_modifiers.some(function (m) {
375
+ return m.kind === ts.SyntaxKind.ExportKeyword;
376
+ })) {
377
+ var decl = node.declarationList.declarations[0];
378
+ if (!(!decl || !ts.isVariableDeclaration(decl)) && decl.name.getText(sourceFile) === "mutate" && !(!decl.initializer || !ts.isCallExpression(decl.initializer))) {
379
+ for (var args = decl.initializer.arguments, handlersArg = null, i = args.length - 1; i >= 0; i--) if (ts.isObjectLiteralExpression(args[i])) {
380
+ handlersArg = args[i];
381
+ break;
382
+ }
383
+ if (handlersArg) {
384
+ var _iteratorNormalCompletion = !0,
385
+ _didIteratorError = !1,
386
+ _iteratorError = void 0;
387
+ try {
388
+ for (var _iterator = handlersArg.properties[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
389
+ var prop = _step.value,
390
+ _prop_name;
391
+ if (!(!ts.isPropertyAssignment(prop) && !ts.isMethodDeclaration(prop))) {
392
+ var name = (_prop_name = prop.name) === null || _prop_name === void 0 ? void 0 : _prop_name.getText(sourceFile);
393
+ if (name) {
394
+ var params = null;
395
+ if (ts.isPropertyAssignment(prop)) {
396
+ var init = prop.initializer;
397
+ (ts.isArrowFunction(init) || ts.isFunctionExpression(init)) && (params = init.parameters);
398
+ } else ts.isMethodDeclaration(prop) && (params = prop.parameters);
399
+ if (!(!params || params.length < 2)) {
400
+ var typeNode = params[1].type;
401
+ if (typeNode) {
402
+ var expanded = resolver.resolveType(typeNode);
403
+ expanded && resolved.set(name, expanded);
404
+ }
405
+ }
406
+ }
407
+ }
408
+ }
409
+ } catch (err) {
410
+ _didIteratorError = !0, _iteratorError = err;
411
+ } finally {
412
+ try {
413
+ !_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
414
+ } finally {
415
+ if (_didIteratorError) throw _iteratorError;
416
+ }
417
+ }
418
+ }
419
+ }
420
+ }
421
+ }), resolved;
422
+ }
423
+ function extractMutationsFromModel(ts, sourceFile, content, _fileName, silent, typeToValibot, resolvedTypes, resolvedTypeToValibot) {
424
+ var mutateNode = null;
425
+ if (ts.forEachChild(sourceFile, function (node) {
426
+ var _node_modifiers;
427
+ if (ts.isVariableStatement(node) && !((_node_modifiers = node.modifiers) === null || _node_modifiers === void 0) && _node_modifiers.some(function (m) {
428
+ return m.kind === ts.SyntaxKind.ExportKeyword;
429
+ })) {
430
+ var decl = node.declarationList.declarations[0];
431
+ !decl || !ts.isVariableDeclaration(decl) || decl.name.getText(sourceFile) === "mutate" && decl.initializer && ts.isCallExpression(decl.initializer) && (mutateNode = decl.initializer);
432
+ }
433
+ }), !mutateNode) return null;
434
+ var call = mutateNode,
435
+ args = call.arguments,
436
+ hasCRUD = args.length >= 2,
437
+ handlersArg = null;
438
+ args.length === 1 && ts.isObjectLiteralExpression(args[0]) ? handlersArg = args[0] : args.length === 3 && ts.isObjectLiteralExpression(args[2]) && (handlersArg = args[2]);
439
+ var columns = {},
440
+ primaryKeys = [];
441
+ hasCRUD && extractSchemaColumns(ts, sourceFile, columns, primaryKeys);
442
+ var custom = [];
443
+ if (handlersArg) {
444
+ var _iteratorNormalCompletion = !0,
445
+ _didIteratorError = !1,
446
+ _iteratorError = void 0;
447
+ try {
448
+ for (var _iterator = handlersArg.properties[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
449
+ var prop = _step.value,
450
+ _prop_name,
451
+ _secondParam_type;
452
+ if (!(!ts.isPropertyAssignment(prop) && !ts.isMethodDeclaration(prop))) {
453
+ var name = (_prop_name = prop.name) === null || _prop_name === void 0 ? void 0 : _prop_name.getText(sourceFile);
454
+ if (name) {
455
+ var params = null;
456
+ if (ts.isPropertyAssignment(prop)) {
457
+ var init = prop.initializer;
458
+ (ts.isArrowFunction(init) || ts.isFunctionExpression(init)) && (params = init.parameters);
459
+ } else ts.isMethodDeclaration(prop) && (params = prop.parameters);
460
+ if (params) {
461
+ if (params.length < 2) {
462
+ custom.push({
463
+ name,
464
+ paramType: "void",
465
+ valibotCode: ""
466
+ });
467
+ continue;
468
+ }
469
+ var secondParam = params[1],
470
+ paramType = ((_secondParam_type = secondParam.type) === null || _secondParam_type === void 0 ? void 0 : _secondParam_type.getText(sourceFile)) || "unknown";
471
+ if (paramType === "unknown") {
472
+ custom.push({
473
+ name,
474
+ paramType: "unknown",
475
+ valibotCode: ""
476
+ });
477
+ continue;
478
+ }
479
+ var valibotCode = typeToValibot(paramType);
480
+ if (!valibotCode && resolvedTypes && resolvedTypeToValibot) {
481
+ var resolvedType = resolvedTypes.get(name);
482
+ resolvedType && (valibotCode = resolvedTypeToValibot(resolvedType));
483
+ }
484
+ custom.push({
485
+ name,
486
+ paramType,
487
+ valibotCode: valibotCode || ""
488
+ });
489
+ }
490
+ }
491
+ }
492
+ }
493
+ } catch (err) {
494
+ _didIteratorError = !0, _iteratorError = err;
495
+ } finally {
496
+ try {
497
+ !_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
498
+ } finally {
499
+ if (_didIteratorError) throw _iteratorError;
500
+ }
501
+ }
502
+ }
503
+ return {
504
+ modelName: "",
505
+ hasCRUD,
506
+ columns,
507
+ primaryKeys,
508
+ custom
509
+ };
510
+ }
511
+ function extractSchemaColumns(ts, sourceFile, columns, primaryKeys) {
512
+ function visit(node) {
513
+ if (ts.isCallExpression(node)) {
514
+ var text = node.expression.getText(sourceFile);
515
+ if (text.endsWith(".primaryKey")) {
516
+ var _iteratorNormalCompletion = !0,
517
+ _didIteratorError = !1,
518
+ _iteratorError = void 0;
519
+ try {
520
+ for (var _iterator = node.arguments[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
521
+ var arg = _step.value;
522
+ ts.isStringLiteral(arg) && primaryKeys.push(arg.text);
523
+ }
524
+ } catch (err) {
525
+ _didIteratorError = !0, _iteratorError = err;
526
+ } finally {
527
+ try {
528
+ !_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
529
+ } finally {
530
+ if (_didIteratorError) throw _iteratorError;
531
+ }
532
+ }
533
+ }
534
+ if (text.endsWith(".columns") && node.arguments.length === 1) {
535
+ var obj = node.arguments[0];
536
+ if (ts.isObjectLiteralExpression(obj)) {
537
+ var _iteratorNormalCompletion1 = !0,
538
+ _didIteratorError1 = !1,
539
+ _iteratorError1 = void 0;
540
+ try {
541
+ for (var _iterator1 = obj.properties[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = !0) {
542
+ var prop = _step1.value,
543
+ _prop_name;
544
+ if (ts.isPropertyAssignment(prop)) {
545
+ var colName = (_prop_name = prop.name) === null || _prop_name === void 0 ? void 0 : _prop_name.getText(sourceFile);
546
+ if (colName) {
547
+ var initText = prop.initializer.getText(sourceFile),
548
+ colType = parseColumnType(initText);
549
+ columns[colName] = colType;
550
+ }
551
+ }
552
+ }
553
+ } catch (err) {
554
+ _didIteratorError1 = !0, _iteratorError1 = err;
555
+ } finally {
556
+ try {
557
+ !_iteratorNormalCompletion1 && _iterator1.return != null && _iterator1.return();
558
+ } finally {
559
+ if (_didIteratorError1) throw _iteratorError1;
560
+ }
561
+ }
562
+ }
563
+ }
564
+ }
565
+ ts.forEachChild(node, visit);
566
+ }
567
+ visit(sourceFile);
568
+ }
569
+ function parseColumnType(initText) {
570
+ var optional = initText.includes(".optional()"),
571
+ type = "string";
572
+ return initText.startsWith("number(") ? type = "number" : initText.startsWith("boolean(") ? type = "boolean" : initText.startsWith("json(") || initText.startsWith("json<") ? type = "json" : initText.startsWith("enumeration(") && (type = "enum"), {
573
+ type,
574
+ optional
575
+ };
576
+ }
577
+ function columnTypeToValibot(col) {
578
+ var base;
579
+ switch (col.type) {
580
+ case "string":
581
+ base = "v.string()";
582
+ break;
583
+ case "number":
584
+ base = "v.number()";
585
+ break;
586
+ case "boolean":
587
+ base = "v.boolean()";
588
+ break;
589
+ case "json":
590
+ base = "v.unknown()";
591
+ break;
592
+ case "enum":
593
+ base = "v.string()";
594
+ break;
595
+ default:
596
+ base = "v.unknown()";
597
+ }
598
+ return col.optional ? `v.optional(v.nullable(${base}))` : base;
599
+ }
600
+ function schemaColumnsToValibot(columns, primaryKeys, mode) {
601
+ var entries = [];
602
+ if (mode === "delete") {
603
+ var _iteratorNormalCompletion = !0,
604
+ _didIteratorError = !1,
605
+ _iteratorError = void 0;
606
+ try {
607
+ for (var _iterator = primaryKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
608
+ var pk = _step.value,
609
+ col = columns[pk];
610
+ col && entries.push(`${pk}: ${columnTypeToValibot({
611
+ ...col,
612
+ optional: !1
613
+ })}`);
614
+ }
615
+ } catch (err) {
616
+ _didIteratorError = !0, _iteratorError = err;
617
+ } finally {
618
+ try {
619
+ !_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
620
+ } finally {
621
+ if (_didIteratorError) throw _iteratorError;
622
+ }
623
+ }
624
+ } else if (mode === "update") {
625
+ var _iteratorNormalCompletion1 = !0,
626
+ _didIteratorError1 = !1,
627
+ _iteratorError1 = void 0;
628
+ try {
629
+ for (var _iterator1 = Object.entries(columns)[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = !0) {
630
+ var [name, col1] = _step1.value,
631
+ isPK = primaryKeys.includes(name);
632
+ isPK ? entries.push(`${name}: ${columnTypeToValibot({
633
+ ...col1,
634
+ optional: !1
635
+ })}`) : entries.push(`${name}: ${columnTypeToValibot({
636
+ ...col1,
637
+ optional: !0
638
+ })}`);
639
+ }
640
+ } catch (err) {
641
+ _didIteratorError1 = !0, _iteratorError1 = err;
642
+ } finally {
643
+ try {
644
+ !_iteratorNormalCompletion1 && _iterator1.return != null && _iterator1.return();
645
+ } finally {
646
+ if (_didIteratorError1) throw _iteratorError1;
647
+ }
648
+ }
649
+ } else {
650
+ var _iteratorNormalCompletion2 = !0,
651
+ _didIteratorError2 = !1,
652
+ _iteratorError2 = void 0;
653
+ try {
654
+ for (var _iterator2 = Object.entries(columns)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = !0) {
655
+ var [name1, col2] = _step2.value;
656
+ entries.push(`${name1}: ${columnTypeToValibot(col2)}`);
657
+ }
658
+ } catch (err) {
659
+ _didIteratorError2 = !0, _iteratorError2 = err;
660
+ } finally {
661
+ try {
662
+ !_iteratorNormalCompletion2 && _iterator2.return != null && _iterator2.return();
663
+ } finally {
664
+ if (_didIteratorError2) throw _iteratorError2;
665
+ }
666
+ }
667
+ }
668
+ return `v.object({
669
+ ${entries.join(`,
670
+ `)},
671
+ })`;
672
+ }
673
+ function generateSyncedMutationsFile(modelMutations) {
674
+ var sorted = [...modelMutations].sort(function (a, b) {
675
+ return a.modelName.localeCompare(b.modelName);
676
+ }),
677
+ modelDefs = sorted.map(function (model) {
678
+ var entries = [];
679
+ if (model.hasCRUD && Object.keys(model.columns).length > 0) for (var _loop = function (_i2, _iter2) {
680
+ var mode = _iter2[_i2],
681
+ hasCustomOverride = model.custom.some(function (m) {
682
+ return m.name === mode;
683
+ });
684
+ if (hasCustomOverride) {
685
+ var customMut = model.custom.find(function (m) {
686
+ return m.name === mode;
687
+ });
688
+ customMut.valibotCode ? entries.push(` ${mode}: ${extractValibotExpression(customMut.valibotCode)},`) : entries.push(` ${mode}: ${schemaColumnsToValibot(model.columns, model.primaryKeys, mode)},`);
689
+ } else entries.push(` ${mode}: ${schemaColumnsToValibot(model.columns, model.primaryKeys, mode)},`);
690
+ }, _i = 0, _iter = ["insert", "update", "delete"]; _i < _iter.length; _i++) _loop(_i, _iter);
691
+ var _iteratorNormalCompletion = !0,
692
+ _didIteratorError = !1,
693
+ _iteratorError = void 0;
694
+ try {
695
+ for (var _iterator = model.custom[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
696
+ var mut = _step.value;
697
+ if (!(model.hasCRUD && ["insert", "update", "delete", "upsert"].includes(mut.name))) {
698
+ if (mut.paramType === "void" || !mut.valibotCode) {
699
+ entries.push(` ${mut.name}: v.void_(),`);
700
+ continue;
701
+ }
702
+ entries.push(` ${mut.name}: ${extractValibotExpression(mut.valibotCode)},`);
703
+ }
704
+ }
705
+ } catch (err) {
706
+ _didIteratorError = !0, _iteratorError = err;
707
+ } finally {
708
+ try {
709
+ !_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
710
+ } finally {
711
+ if (_didIteratorError) throw _iteratorError;
712
+ }
713
+ }
714
+ return ` ${model.modelName}: {
715
+ ${entries.join(`
716
+ `)}
717
+ },`;
718
+ }).join(`
719
+ `);
720
+ return `// auto-generated by: on-zero generate
721
+ // mutation validators derived from model schemas and handler types
722
+ import * as v from 'valibot'
723
+
724
+ export const mutationValidators = {
725
+ ${modelDefs}
726
+ }
727
+ `;
728
+ }
729
+ function extractValibotExpression(valibotCode) {
730
+ return valibotCode.trim() || "v.unknown()";
731
+ }
732
+ function parseTypeString(type) {
733
+ if (type = type.trim(), type === "string") return "v.string()";
734
+ if (type === "number") return "v.number()";
735
+ if (type === "boolean") return "v.boolean()";
736
+ if (type === "void" || type === "undefined") return "v.void_()";
737
+ if (type === "null") return "v.null_()";
738
+ if (type === "any" || type === "unknown") return "v.unknown()";
739
+ if (type.startsWith("{") && type.endsWith("}")) {
740
+ var inner = type.slice(1, -1).trim();
741
+ if (!inner) return "v.object({})";
742
+ var normalized = inner.replace(/\n/g, "; ").replace(/;\s*;/g, ";"),
743
+ entries = [],
744
+ _iteratorNormalCompletion = !0,
745
+ _didIteratorError = !1,
746
+ _iteratorError = void 0;
747
+ try {
748
+ for (var _iterator = normalized.split(";")[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
749
+ var part = _step.value,
750
+ trimmed = part.trim().replace(/,\s*$/, "");
751
+ if (trimmed) {
752
+ var match = trimmed.match(/^(?:readonly\s+)?(\w+)(\?)?:\s*(.+)$/);
753
+ if (match) {
754
+ var [, name, opt, typeStr] = match,
755
+ parsed = parseTypeString(typeStr.trim());
756
+ if (!parsed) return null;
757
+ var val = parsed;
758
+ opt && (val = `v.optional(${val})`), entries.push(`${name}: ${val}`);
759
+ }
760
+ }
761
+ }
762
+ } catch (err) {
763
+ _didIteratorError = !0, _iteratorError = err;
764
+ } finally {
765
+ try {
766
+ !_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
767
+ } finally {
768
+ if (_didIteratorError) throw _iteratorError;
769
+ }
770
+ }
771
+ return entries.length === 0 ? "v.object({})" : `v.object({
772
+ ${entries.join(`,
773
+ `)},
774
+ })`;
775
+ }
776
+ if (type.endsWith("[]")) {
777
+ var inner1 = parseTypeString(type.slice(0, -2).trim());
778
+ return inner1 ? `v.array(${inner1})` : null;
779
+ }
780
+ return null;
781
+ }
782
+ function tsTypeToValibot(ts, checker, type, seen) {
783
+ seen || (seen = /* @__PURE__ */new Set());
784
+ var flags = type.getFlags();
785
+ if (flags & (ts.TypeFlags.Object | ts.TypeFlags.Intersection)) {
786
+ if (seen.has(type)) return "v.unknown()";
787
+ seen.add(type);
788
+ }
789
+ var recurse = function (t) {
790
+ return tsTypeToValibot(ts, checker, t, seen);
791
+ };
792
+ if (flags & ts.TypeFlags.String) return "v.string()";
793
+ if (flags & ts.TypeFlags.Number) return "v.number()";
794
+ if (flags & ts.TypeFlags.Boolean) return "v.boolean()";
795
+ if (flags & ts.TypeFlags.Void || flags & ts.TypeFlags.Undefined) return "v.void_()";
796
+ if (flags & ts.TypeFlags.Null) return "v.null_()";
797
+ if (flags & ts.TypeFlags.Any || flags & ts.TypeFlags.Unknown) return "v.unknown()";
798
+ if (flags & ts.TypeFlags.Never) return "v.never()";
799
+ if (flags & ts.TypeFlags.StringLiteral) return `v.literal(${JSON.stringify(type.value)})`;
800
+ if (flags & ts.TypeFlags.NumberLiteral) return `v.literal(${type.value})`;
801
+ if (flags & ts.TypeFlags.BooleanLiteral) {
802
+ var name = type.intrinsicName;
803
+ return `v.literal(${name === "true"})`;
804
+ }
805
+ if (type.isUnion()) {
806
+ var members = type.types,
807
+ hasNull = members.some(function (t) {
808
+ return t.getFlags() & ts.TypeFlags.Null;
809
+ }),
810
+ hasUndefined = members.some(function (t) {
811
+ return t.getFlags() & (ts.TypeFlags.Undefined | ts.TypeFlags.Void);
812
+ }),
813
+ rest = members.filter(function (t) {
814
+ return !(t.getFlags() & (ts.TypeFlags.Null | ts.TypeFlags.Undefined | ts.TypeFlags.Void));
815
+ });
816
+ if (rest.length === 2 && rest.every(function (t) {
817
+ return t.getFlags() & ts.TypeFlags.BooleanLiteral;
818
+ })) {
819
+ var inner = "v.boolean()";
820
+ return hasNull && (inner = `v.nullable(${inner})`), hasUndefined && (inner = `v.optional(${inner})`), inner;
821
+ }
822
+ if (rest.length === 0) return "v.unknown()";
823
+ var inner1 = rest.length === 1 ? recurse(rest[0]) : `v.union([${rest.map(function (t) {
824
+ return recurse(t);
825
+ }).join(", ")}])`;
826
+ return hasNull && (inner1 = `v.nullable(${inner1})`), hasUndefined && (inner1 = `v.optional(${inner1})`), inner1;
827
+ }
828
+ var resolveSymbolType = function (prop2) {
829
+ var _prop_declarations;
830
+ return prop2.valueDeclaration ? checker.getTypeOfSymbolAtLocation(prop2, prop2.valueDeclaration) : !((_prop_declarations = prop2.declarations) === null || _prop_declarations === void 0) && _prop_declarations[0] ? checker.getTypeOfSymbolAtLocation(prop2, prop2.declarations[0]) : checker.getDeclaredTypeOfSymbol(prop2);
831
+ };
832
+ if (type.isIntersection()) {
833
+ var props = type.getProperties();
834
+ if (props.length === 0) return "v.object({})";
835
+ var entries = [],
836
+ _iteratorNormalCompletion = !0,
837
+ _didIteratorError = !1,
838
+ _iteratorError = void 0;
839
+ try {
840
+ for (var _iterator = props[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
841
+ var prop = _step.value,
842
+ propType = resolveSymbolType(prop),
843
+ isOptional = !!(prop.getFlags() & ts.SymbolFlags.Optional),
844
+ val = recurse(propType);
845
+ isOptional && !val.startsWith("v.optional(") && (val = `v.optional(${val})`), entries.push(`${prop.getName()}: ${val}`);
846
+ }
847
+ } catch (err) {
848
+ _didIteratorError = !0, _iteratorError = err;
849
+ } finally {
850
+ try {
851
+ !_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
852
+ } finally {
853
+ if (_didIteratorError) throw _iteratorError;
854
+ }
855
+ }
856
+ return `v.object({
857
+ ${entries.join(`,
858
+ `)},
859
+ })`;
860
+ }
861
+ var props1 = type.getProperties();
862
+ if (props1.length > 0 && (type.getFlags() & ts.TypeFlags.Object || type.objectFlags)) {
863
+ var _type_objectFlags,
864
+ objectFlags = (_type_objectFlags = type.objectFlags) !== null && _type_objectFlags !== void 0 ? _type_objectFlags : 0;
865
+ if (objectFlags & ts.ObjectFlags.Reference) {
866
+ var _typeRef_typeArguments,
867
+ typeRef = type,
868
+ symbol = type.getSymbol(),
869
+ name1 = symbol?.getName();
870
+ if ((name1 === "Array" || name1 === "ReadonlyArray") && ((_typeRef_typeArguments = typeRef.typeArguments) === null || _typeRef_typeArguments === void 0 ? void 0 : _typeRef_typeArguments.length) === 1) return `v.array(${recurse(typeRef.typeArguments[0])})`;
871
+ }
872
+ if (objectFlags & ts.ObjectFlags.Tuple) {
873
+ var typeRef1 = type,
874
+ typeArgs = typeRef1.typeArguments || [];
875
+ return `v.tuple([${typeArgs.map(function (t) {
876
+ return recurse(t);
877
+ }).join(", ")}])`;
878
+ }
879
+ var entries1 = [],
880
+ _iteratorNormalCompletion1 = !0,
881
+ _didIteratorError1 = !1,
882
+ _iteratorError1 = void 0;
883
+ try {
884
+ for (var _iterator1 = props1[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = !0) {
885
+ var prop1 = _step1.value,
886
+ propType1 = resolveSymbolType(prop1),
887
+ isOptional1 = !!(prop1.getFlags() & ts.SymbolFlags.Optional),
888
+ val1 = recurse(propType1);
889
+ isOptional1 && !val1.startsWith("v.optional(") && (val1 = `v.optional(${val1})`), entries1.push(`${prop1.getName()}: ${val1}`);
890
+ }
891
+ } catch (err) {
892
+ _didIteratorError1 = !0, _iteratorError1 = err;
893
+ } finally {
894
+ try {
895
+ !_iteratorNormalCompletion1 && _iterator1.return != null && _iterator1.return();
896
+ } finally {
897
+ if (_didIteratorError1) throw _iteratorError1;
898
+ }
899
+ }
900
+ return entries1.length === 0 ? "v.object({})" : `v.object({
901
+ ${entries1.join(`,
902
+ `)},
903
+ })`;
904
+ }
905
+ var stringIndex = type.getStringIndexType();
906
+ if (stringIndex) return `v.record(v.string(), ${recurse(stringIndex)})`;
907
+ var numberIndex = type.getNumberIndexType();
908
+ return numberIndex ? `v.record(v.number(), ${recurse(numberIndex)})` : "v.unknown()";
909
+ }
300
910
  async function generate(options) {
301
911
  var {
302
912
  dir,
@@ -318,31 +928,48 @@ async function generate(options) {
318
928
  }),
319
929
  writeResults = [writeFileIfChanged((0, import_path.resolve)(generatedDir, "models.ts"), generateModelsFile(allModelFiles)), writeFileIfChanged((0, import_path.resolve)(generatedDir, "types.ts"), generateTypesFile(filesWithSchema)), writeFileIfChanged((0, import_path.resolve)(generatedDir, "tables.ts"), generateTablesFile(filesWithSchema)), writeFileIfChanged((0, import_path.resolve)(generatedDir, "README.md"), generateReadmeFile())],
320
930
  filesChanged = writeResults.filter(Boolean).length,
321
- queryCount = 0;
931
+ queryCount = 0,
932
+ mutationCount = 0,
933
+ ts = await import("typescript"),
934
+ typeToValibot = function (paramType) {
935
+ try {
936
+ return parseTypeString(paramType.trim());
937
+ } catch {
938
+ return null;
939
+ }
940
+ };
322
941
  if ((0, import_fs.existsSync)(queriesDir)) {
323
- var ts = await import("typescript"),
324
- {
325
- ModelToValibot
326
- } = await import("@sinclair/typebox-codegen/model/index.js"),
327
- {
328
- TypeScriptToModel
329
- } = await import("@sinclair/typebox-codegen/typescript/index.js"),
330
- queryFiles = (0, import_fs.readdirSync)(queriesDir).filter(function (f) {
942
+ var queryFiles = (0, import_fs.readdirSync)(queriesDir).filter(function (f) {
331
943
  return f.endsWith(".ts");
332
944
  }),
333
945
  allQueries = [],
946
+ queryResolver = null,
947
+ getQueryResolver = function () {
948
+ if (!queryResolver) {
949
+ var allFiles2 = (0, import_fs.readdirSync)(queriesDir).filter(function (f) {
950
+ return f.endsWith(".ts");
951
+ }).map(function (f) {
952
+ return {
953
+ path: (0, import_path.resolve)(queriesDir, f),
954
+ content: (0, import_fs.readFileSync)((0, import_path.resolve)(queriesDir, f), "utf-8")
955
+ };
956
+ });
957
+ queryResolver = createTypeResolver(ts, allFiles2, queriesDir);
958
+ }
959
+ return queryResolver;
960
+ },
334
961
  _iteratorNormalCompletion = !0,
335
962
  _didIteratorError = !1,
336
963
  _iteratorError = void 0;
337
964
  try {
338
965
  for (var _loop = function () {
339
- var file = _step.value,
340
- filePath = (0, import_path.resolve)(queriesDir, file),
341
- fileBaseName = (0, import_path.basename)(file, ".ts");
966
+ var file2 = _step.value,
967
+ filePath2 = (0, import_path.resolve)(queriesDir, file2),
968
+ fileBaseName2 = (0, import_path.basename)(file2, ".ts");
342
969
  try {
343
- var content = (0, import_fs.readFileSync)(filePath, "utf-8"),
344
- sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, !0);
345
- ts.forEachChild(sourceFile, function (node) {
970
+ var content2 = (0, import_fs.readFileSync)(filePath2, "utf-8"),
971
+ sourceFile2 = ts.createSourceFile(filePath2, content2, ts.ScriptTarget.Latest, !0);
972
+ ts.forEachChild(sourceFile2, function (node) {
346
973
  if (ts.isVariableStatement(node)) {
347
974
  var _node_modifiers,
348
975
  exportModifier = (_node_modifiers = node.modifiers) === null || _node_modifiers === void 0 ? void 0 : _node_modifiers.find(function (m) {
@@ -351,7 +978,7 @@ async function generate(options) {
351
978
  if (!exportModifier) return;
352
979
  var declaration = node.declarationList.declarations[0];
353
980
  if (!declaration || !ts.isVariableDeclaration(declaration)) return;
354
- var name = declaration.name.getText(sourceFile);
981
+ var name = declaration.name.getText(sourceFile2);
355
982
  if (name === "permission") return;
356
983
  if (declaration.initializer && ts.isArrowFunction(declaration.initializer)) {
357
984
  var params = declaration.initializer.parameters,
@@ -359,26 +986,28 @@ async function generate(options) {
359
986
  if (params.length > 0) {
360
987
  var _param_type,
361
988
  param = params[0];
362
- paramType = ((_param_type = param.type) === null || _param_type === void 0 ? void 0 : _param_type.getText(sourceFile)) || "unknown";
989
+ paramType = ((_param_type = param.type) === null || _param_type === void 0 ? void 0 : _param_type.getText(sourceFile2)) || "unknown";
363
990
  }
364
- try {
365
- var typeString = `type QueryParams = ${paramType}`,
366
- model = TypeScriptToModel.Generate(typeString),
367
- valibotCode = ModelToValibot.Generate(model);
368
- allQueries.push({
369
- name,
370
- params: paramType,
371
- valibotCode,
372
- sourceFile: fileBaseName
373
- });
374
- } catch (err) {
375
- silent || console.error(`\u2717 ${name}: ${err}`);
991
+ var valibotCode = typeToValibot(paramType);
992
+ if (!valibotCode && params.length > 0 && params[0].type) {
993
+ var resolver = getQueryResolver(),
994
+ resolverSourceFile = resolver.program.getSourceFile(filePath2);
995
+ if (resolverSourceFile) {
996
+ var resolvedType = resolveParamType(ts, resolver, resolverSourceFile, name, 0);
997
+ resolvedType && (valibotCode = resolver.typeToValibot(resolvedType));
998
+ }
376
999
  }
1000
+ valibotCode ? allQueries.push({
1001
+ name,
1002
+ params: paramType,
1003
+ valibotCode,
1004
+ sourceFile: fileBaseName2
1005
+ }) : !silent && paramType !== "void" && console.error(`\u2717 ${name}: could not resolve type "${paramType}"`);
377
1006
  }
378
1007
  }
379
1008
  });
380
1009
  } catch (err) {
381
- silent || console.error(`Error processing ${file}:`, err);
1010
+ silent || console.error(`Error processing ${file2}:`, err);
382
1011
  }
383
1012
  }, _iterator = queryFiles[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) _loop();
384
1013
  } catch (err) {
@@ -395,7 +1024,138 @@ async function generate(options) {
395
1024
  syncedChanged = writeFileIfChanged((0, import_path.resolve)(generatedDir, "syncedQueries.ts"), generateSyncedQueriesFile(allQueries));
396
1025
  groupedChanged && filesChanged++, syncedChanged && filesChanged++;
397
1026
  }
398
- if (filesChanged > 0 && !silent && console.info(`\u2713 ${allModelFiles.length} models (${filesWithSchema.length} schemas)${queryCount ? `, ${queryCount} queries` : ""}`), filesChanged > 0 && after) {
1027
+ var allModelMutations = [],
1028
+ mutationFiles = [],
1029
+ unresolvedModels = [],
1030
+ _iteratorNormalCompletion1 = !0,
1031
+ _didIteratorError1 = !1,
1032
+ _iteratorError1 = void 0;
1033
+ try {
1034
+ for (var _iterator1 = allModelFiles[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = !0) {
1035
+ var file = _step1.value,
1036
+ filePath = (0, import_path.resolve)(modelsDir, file),
1037
+ fileBaseName = (0, import_path.basename)(file, ".ts");
1038
+ try {
1039
+ var content = (0, import_fs.readFileSync)(filePath, "utf-8");
1040
+ if (!content.includes("export const mutate")) continue;
1041
+ mutationFiles.push({
1042
+ path: filePath,
1043
+ content,
1044
+ baseName: fileBaseName
1045
+ });
1046
+ var sourceFile = ts.createSourceFile(filePath, content, ts.ScriptTarget.Latest, !0),
1047
+ result = extractMutationsFromModel(ts, sourceFile, content, filePath, !!silent, typeToValibot);
1048
+ if (result) {
1049
+ result.modelName = fileBaseName, allModelMutations.push(result);
1050
+ var hasUnresolved = result.custom.some(function (m) {
1051
+ return m.paramType !== "void" && m.paramType !== "unknown" && !m.valibotCode;
1052
+ });
1053
+ hasUnresolved && unresolvedModels.push({
1054
+ baseName: fileBaseName,
1055
+ filePath
1056
+ });
1057
+ }
1058
+ } catch (err) {
1059
+ silent || console.error(`Error extracting mutations from ${file}:`, err);
1060
+ }
1061
+ }
1062
+ } catch (err) {
1063
+ _didIteratorError1 = !0, _iteratorError1 = err;
1064
+ } finally {
1065
+ try {
1066
+ !_iteratorNormalCompletion1 && _iterator1.return != null && _iterator1.return();
1067
+ } finally {
1068
+ if (_didIteratorError1) throw _iteratorError1;
1069
+ }
1070
+ }
1071
+ if (unresolvedModels.length > 0) {
1072
+ var collectTsFiles = function (dir2) {
1073
+ var results = [],
1074
+ _iteratorNormalCompletion4 = !0,
1075
+ _didIteratorError4 = !1,
1076
+ _iteratorError4 = void 0;
1077
+ try {
1078
+ for (var _iterator4 = (0, import_fs.readdirSync)(dir2, {
1079
+ withFileTypes: !0
1080
+ })[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = !0) {
1081
+ var entry = _step4.value,
1082
+ fullPath = (0, import_path.resolve)(dir2, entry.name);
1083
+ entry.isDirectory() && entry.name !== "node_modules" ? results.push(...collectTsFiles(fullPath)) : entry.isFile() && entry.name.endsWith(".ts") && !entry.name.endsWith(".d.ts") && results.push({
1084
+ path: fullPath,
1085
+ content: (0, import_fs.readFileSync)(fullPath, "utf-8")
1086
+ });
1087
+ }
1088
+ } catch (err) {
1089
+ _didIteratorError4 = !0, _iteratorError4 = err;
1090
+ } finally {
1091
+ try {
1092
+ !_iteratorNormalCompletion4 && _iterator4.return != null && _iterator4.return();
1093
+ } finally {
1094
+ if (_didIteratorError4) throw _iteratorError4;
1095
+ }
1096
+ }
1097
+ return results;
1098
+ },
1099
+ allFiles = collectTsFiles(baseDir),
1100
+ modelResolver = createTypeResolver(ts, allFiles, baseDir),
1101
+ _iteratorNormalCompletion2 = !0,
1102
+ _didIteratorError2 = !1,
1103
+ _iteratorError2 = void 0;
1104
+ try {
1105
+ for (var _loop1 = function () {
1106
+ var {
1107
+ baseName,
1108
+ filePath: filePath2
1109
+ } = _step2.value,
1110
+ resolverSourceFile = modelResolver.program.getSourceFile(filePath2);
1111
+ if (!resolverSourceFile) return "continue";
1112
+ var resolvedTypes = resolveMutationParamTypes(ts, modelResolver, resolverSourceFile);
1113
+ if (resolvedTypes.size === 0) return "continue";
1114
+ var content2 = (0, import_fs.readFileSync)(filePath2, "utf-8"),
1115
+ sourceFile2 = ts.createSourceFile(filePath2, content2, ts.ScriptTarget.Latest, !0),
1116
+ result2 = extractMutationsFromModel(ts, sourceFile2, content2, filePath2, !!silent, typeToValibot, resolvedTypes, modelResolver.typeToValibot);
1117
+ if (result2) {
1118
+ result2.modelName = baseName;
1119
+ var idx = allModelMutations.findIndex(function (m) {
1120
+ return m.modelName === baseName;
1121
+ });
1122
+ idx >= 0 && (allModelMutations[idx] = result2);
1123
+ }
1124
+ }, _iterator2 = unresolvedModels[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = !0) _loop1();
1125
+ } catch (err) {
1126
+ _didIteratorError2 = !0, _iteratorError2 = err;
1127
+ } finally {
1128
+ try {
1129
+ !_iteratorNormalCompletion2 && _iterator2.return != null && _iterator2.return();
1130
+ } finally {
1131
+ if (_didIteratorError2) throw _iteratorError2;
1132
+ }
1133
+ }
1134
+ }
1135
+ var _iteratorNormalCompletion3 = !0,
1136
+ _didIteratorError3 = !1,
1137
+ _iteratorError3 = void 0;
1138
+ try {
1139
+ for (var _loop2 = function () {
1140
+ var model = _step3.value;
1141
+ model.hasCRUD && (mutationCount += 3), mutationCount += model.custom.filter(function (m) {
1142
+ return !model.hasCRUD || !["insert", "update", "delete", "upsert"].includes(m.name);
1143
+ }).length;
1144
+ }, _iterator3 = allModelMutations[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = !0) _loop2();
1145
+ } catch (err) {
1146
+ _didIteratorError3 = !0, _iteratorError3 = err;
1147
+ } finally {
1148
+ try {
1149
+ !_iteratorNormalCompletion3 && _iterator3.return != null && _iterator3.return();
1150
+ } finally {
1151
+ if (_didIteratorError3) throw _iteratorError3;
1152
+ }
1153
+ }
1154
+ if (allModelMutations.length > 0) {
1155
+ var mutationsChanged = writeFileIfChanged((0, import_path.resolve)(generatedDir, "syncedMutations.ts"), generateSyncedMutationsFile(allModelMutations));
1156
+ mutationsChanged && filesChanged++;
1157
+ }
1158
+ if (filesChanged > 0 && !silent && console.info(`\u2713 ${allModelFiles.length} models (${filesWithSchema.length} schemas)${queryCount ? `, ${queryCount} queries` : ""}${mutationCount ? `, ${mutationCount} mutations` : ""}`), filesChanged > 0 && after) {
399
1159
  var {
400
1160
  execSync
401
1161
  } = await import("child_process");
@@ -415,7 +1175,8 @@ async function generate(options) {
415
1175
  filesChanged,
416
1176
  modelCount: allModelFiles.length,
417
1177
  schemaCount: filesWithSchema.length,
418
- queryCount
1178
+ queryCount,
1179
+ mutationCount
419
1180
  };
420
1181
  }
421
1182
  async function watch(options) {