on-zero 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/generate-helpers.cjs +309 -0
- package/dist/cjs/generate-helpers.native.js +451 -0
- package/dist/cjs/generate-helpers.native.js.map +1 -0
- package/dist/cjs/generate-lite.cjs +150 -0
- package/dist/cjs/generate-lite.native.js +269 -0
- package/dist/cjs/generate-lite.native.js.map +1 -0
- package/dist/cjs/generate-lite.test.cjs +229 -0
- package/dist/cjs/generate-lite.test.native.js +234 -0
- package/dist/cjs/generate-lite.test.native.js.map +1 -0
- package/dist/cjs/generate.cjs +16 -285
- package/dist/cjs/generate.native.js +18 -432
- package/dist/cjs/generate.native.js.map +1 -1
- package/dist/esm/generate-helpers.mjs +272 -0
- package/dist/esm/generate-helpers.mjs.map +1 -0
- package/dist/esm/generate-helpers.native.js +411 -0
- package/dist/esm/generate-helpers.native.js.map +1 -0
- package/dist/esm/generate-lite.mjs +127 -0
- package/dist/esm/generate-lite.mjs.map +1 -0
- package/dist/esm/generate-lite.native.js +243 -0
- package/dist/esm/generate-lite.native.js.map +1 -0
- package/dist/esm/generate-lite.test.mjs +230 -0
- package/dist/esm/generate-lite.test.mjs.map +1 -0
- package/dist/esm/generate-lite.test.native.js +232 -0
- package/dist/esm/generate-lite.test.native.js.map +1 -0
- package/dist/esm/generate.mjs +6 -275
- package/dist/esm/generate.mjs.map +1 -1
- package/dist/esm/generate.native.js +9 -423
- package/dist/esm/generate.native.js.map +1 -1
- package/package.json +7 -2
- package/src/generate-helpers.ts +440 -0
- package/src/generate-lite.test.ts +310 -0
- package/src/generate-lite.ts +333 -0
- package/src/generate.ts +23 -415
- package/types/generate-helpers.d.ts +42 -0
- package/types/generate-helpers.d.ts.map +1 -0
- package/types/generate-lite.d.ts +40 -0
- package/types/generate-lite.d.ts.map +1 -0
- package/types/generate-lite.test.d.ts +2 -0
- package/types/generate-lite.test.d.ts.map +1 -0
- package/types/generate.d.ts +1 -6
- package/types/generate.d.ts.map +1 -1
|
@@ -41,6 +41,7 @@ module.exports = __toCommonJS(generate_exports);
|
|
|
41
41
|
var import_crypto = require("crypto"),
|
|
42
42
|
import_fs = require("fs"),
|
|
43
43
|
import_path = require("path"),
|
|
44
|
+
import_generate_helpers = require("./generate-helpers.native.js"),
|
|
44
45
|
hash = function (s) {
|
|
45
46
|
return (0, import_crypto.createHash)("sha256").update(s).digest("hex");
|
|
46
47
|
},
|
|
@@ -79,209 +80,6 @@ function writeFileIfChanged(filePath, content) {
|
|
|
79
80
|
cachedHash = generateCache[filePath];
|
|
80
81
|
return cachedHash === contentHash && (0, import_fs.existsSync)(filePath) ? !1 : ((0, import_fs.writeFileSync)(filePath, content, "utf-8"), generateCache[filePath] = contentHash, !0);
|
|
81
82
|
}
|
|
82
|
-
function generateModelsFile(modelFiles, modelsDirName) {
|
|
83
|
-
var modelNames = modelFiles.map(function (f) {
|
|
84
|
-
return (0, import_path.basename)(f, ".ts");
|
|
85
|
-
}).sort(),
|
|
86
|
-
getImportName = function (name) {
|
|
87
|
-
return name === "user" ? "userPublic" : name;
|
|
88
|
-
},
|
|
89
|
-
imports = modelNames.map(function (name) {
|
|
90
|
-
return `import * as ${getImportName(name)} from '../${modelsDirName}/${name}'`;
|
|
91
|
-
}).join(`
|
|
92
|
-
`),
|
|
93
|
-
sortedByImportName = [...modelNames].sort(function (a, b) {
|
|
94
|
-
return getImportName(a).localeCompare(getImportName(b));
|
|
95
|
-
}),
|
|
96
|
-
modelsObj = `export const models = {
|
|
97
|
-
${sortedByImportName.map(function (name) {
|
|
98
|
-
return ` ${getImportName(name)},`;
|
|
99
|
-
}).join(`
|
|
100
|
-
`)}
|
|
101
|
-
}`;
|
|
102
|
-
return `// auto-generated by: on-zero generate
|
|
103
|
-
${imports}
|
|
104
|
-
|
|
105
|
-
${modelsObj}
|
|
106
|
-
`;
|
|
107
|
-
}
|
|
108
|
-
function generateTypesFile(modelFiles) {
|
|
109
|
-
var modelNames = modelFiles.map(function (f) {
|
|
110
|
-
return (0, import_path.basename)(f, ".ts");
|
|
111
|
-
}).sort(),
|
|
112
|
-
getSchemaName = function (name) {
|
|
113
|
-
return name === "user" ? "userPublic" : name;
|
|
114
|
-
},
|
|
115
|
-
typeExports = modelNames.map(function (name) {
|
|
116
|
-
var pascalName = name.charAt(0).toUpperCase() + name.slice(1),
|
|
117
|
-
schemaName = getSchemaName(name);
|
|
118
|
-
return `export type ${pascalName} = TableInsertRow<typeof schema.${schemaName}>
|
|
119
|
-
export type ${pascalName}Update = TableUpdateRow<typeof schema.${schemaName}>`;
|
|
120
|
-
}).join(`
|
|
121
|
-
|
|
122
|
-
`);
|
|
123
|
-
return `import type { TableInsertRow, TableUpdateRow } from 'on-zero'
|
|
124
|
-
import type * as schema from './tables'
|
|
125
|
-
|
|
126
|
-
${typeExports}
|
|
127
|
-
`;
|
|
128
|
-
}
|
|
129
|
-
function generateTablesFile(modelFiles, modelsDirName) {
|
|
130
|
-
var modelNames = modelFiles.map(function (f) {
|
|
131
|
-
return (0, import_path.basename)(f, ".ts");
|
|
132
|
-
}).sort(),
|
|
133
|
-
getExportName = function (name) {
|
|
134
|
-
return name === "user" ? "userPublic" : name;
|
|
135
|
-
},
|
|
136
|
-
exports = modelNames.map(function (name) {
|
|
137
|
-
return `export { schema as ${getExportName(name)} } from '../${modelsDirName}/${name}'`;
|
|
138
|
-
}).join(`
|
|
139
|
-
`);
|
|
140
|
-
return `// auto-generated by: on-zero generate
|
|
141
|
-
|
|
142
|
-
${exports}
|
|
143
|
-
`;
|
|
144
|
-
}
|
|
145
|
-
function generateReadmeFile() {
|
|
146
|
-
return `# generated
|
|
147
|
-
|
|
148
|
-
this folder is auto-generated by on-zero. do not edit files here directly.
|
|
149
|
-
|
|
150
|
-
## what's generated
|
|
151
|
-
|
|
152
|
-
- \`models.ts\` - exports all models from ../models
|
|
153
|
-
- \`types.ts\` - typescript types derived from table schemas
|
|
154
|
-
- \`tables.ts\` - exports table schemas for type inference
|
|
155
|
-
- \`groupedQueries.ts\` - namespaced query re-exports for client setup
|
|
156
|
-
- \`syncedQueries.ts\` - namespaced syncedQuery wrappers for server setup
|
|
157
|
-
- \`syncedMutations.ts\` - valibot validators for mutation args (server auto-validation)
|
|
158
|
-
|
|
159
|
-
## usage guidelines
|
|
160
|
-
|
|
161
|
-
**do not import generated files outside of the data folder.**
|
|
162
|
-
|
|
163
|
-
### queries
|
|
164
|
-
|
|
165
|
-
write your queries as plain functions in \`../queries/\` and import them directly:
|
|
166
|
-
|
|
167
|
-
\`\`\`ts
|
|
168
|
-
// \u2705 good - import from queries
|
|
169
|
-
import { channelMessages } from '~/data/queries/message'
|
|
170
|
-
\`\`\`
|
|
171
|
-
|
|
172
|
-
the generated query files are only used internally by zero client/server setup.
|
|
173
|
-
|
|
174
|
-
### types
|
|
175
|
-
|
|
176
|
-
you can import types from this folder, but prefer re-exporting from \`../types.ts\`:
|
|
177
|
-
|
|
178
|
-
\`\`\`ts
|
|
179
|
-
// \u274C okay but not preferred
|
|
180
|
-
import type { Message } from '~/data/generated/types'
|
|
181
|
-
|
|
182
|
-
// \u2705 better - re-export from types.ts
|
|
183
|
-
import type { Message } from '~/data/types'
|
|
184
|
-
\`\`\`
|
|
185
|
-
|
|
186
|
-
## regeneration
|
|
187
|
-
|
|
188
|
-
files are regenerated when you run:
|
|
189
|
-
|
|
190
|
-
\`\`\`bash
|
|
191
|
-
bun on-zero generate
|
|
192
|
-
\`\`\`
|
|
193
|
-
|
|
194
|
-
or in watch mode:
|
|
195
|
-
|
|
196
|
-
\`\`\`bash
|
|
197
|
-
bun on-zero generate --watch
|
|
198
|
-
\`\`\`
|
|
199
|
-
|
|
200
|
-
## more info
|
|
201
|
-
|
|
202
|
-
see the [on-zero readme](./node_modules/on-zero/README.md) for full documentation.
|
|
203
|
-
`;
|
|
204
|
-
}
|
|
205
|
-
function generateGroupedQueriesFile(queries) {
|
|
206
|
-
var sortedFiles = [...new Set(queries.map(function (q) {
|
|
207
|
-
return q.sourceFile;
|
|
208
|
-
}))].sort(),
|
|
209
|
-
exports = sortedFiles.map(function (file) {
|
|
210
|
-
return `export * as ${file} from '../queries/${file}'`;
|
|
211
|
-
}).join(`
|
|
212
|
-
`);
|
|
213
|
-
return `/**
|
|
214
|
-
* auto-generated by: on-zero generate
|
|
215
|
-
*
|
|
216
|
-
* grouped query re-exports for minification-safe query identity.
|
|
217
|
-
* this file re-exports all query modules - while this breaks tree-shaking,
|
|
218
|
-
* queries are typically small and few in number even in larger apps.
|
|
219
|
-
*/
|
|
220
|
-
${exports}
|
|
221
|
-
`;
|
|
222
|
-
}
|
|
223
|
-
function generateSyncedQueriesFile(queries) {
|
|
224
|
-
var queryByFile = /* @__PURE__ */new Map(),
|
|
225
|
-
_iteratorNormalCompletion = !0,
|
|
226
|
-
_didIteratorError = !1,
|
|
227
|
-
_iteratorError = void 0;
|
|
228
|
-
try {
|
|
229
|
-
for (var _iterator = queries[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
|
|
230
|
-
var q = _step.value;
|
|
231
|
-
queryByFile.has(q.sourceFile) || queryByFile.set(q.sourceFile, []), queryByFile.get(q.sourceFile).push(q);
|
|
232
|
-
}
|
|
233
|
-
} catch (err) {
|
|
234
|
-
_didIteratorError = !0, _iteratorError = err;
|
|
235
|
-
} finally {
|
|
236
|
-
try {
|
|
237
|
-
!_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
|
|
238
|
-
} finally {
|
|
239
|
-
if (_didIteratorError) throw _iteratorError;
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
var sortedFiles = Array.from(queryByFile.keys()).sort(),
|
|
243
|
-
imports = `// auto-generated by: on-zero generate
|
|
244
|
-
// server-side query definitions with validators
|
|
245
|
-
import { defineQuery, defineQueries } from '@rocicorp/zero'
|
|
246
|
-
import * as v from 'valibot'
|
|
247
|
-
import * as Queries from './groupedQueries'
|
|
248
|
-
`,
|
|
249
|
-
namespaceDefs = sortedFiles.map(function (file) {
|
|
250
|
-
var fileQueries = queryByFile.get(file).sort(function (a, b) {
|
|
251
|
-
return a.name.localeCompare(b.name);
|
|
252
|
-
}),
|
|
253
|
-
queryDefs = fileQueries.map(function (q2) {
|
|
254
|
-
var validatorDef = q2.valibotCode.trim();
|
|
255
|
-
if (q2.params === "void" || !validatorDef) return ` ${q2.name}: defineQuery(() => Queries.${file}.${q2.name}()),`;
|
|
256
|
-
var indentedValidator = validatorDef.split(`
|
|
257
|
-
`).map(function (line, i) {
|
|
258
|
-
return i === 0 ? line : ` ${line}`;
|
|
259
|
-
}).join(`
|
|
260
|
-
`);
|
|
261
|
-
return ` ${q2.name}: defineQuery(
|
|
262
|
-
${indentedValidator},
|
|
263
|
-
({ args }) => Queries.${file}.${q2.name}(args)
|
|
264
|
-
),`;
|
|
265
|
-
}).join(`
|
|
266
|
-
`);
|
|
267
|
-
return `const ${file} = {
|
|
268
|
-
${queryDefs}
|
|
269
|
-
}`;
|
|
270
|
-
}).join(`
|
|
271
|
-
|
|
272
|
-
`),
|
|
273
|
-
queriesObject = sortedFiles.map(function (file) {
|
|
274
|
-
return ` ${file},`;
|
|
275
|
-
}).join(`
|
|
276
|
-
`);
|
|
277
|
-
return `${imports}
|
|
278
|
-
${namespaceDefs}
|
|
279
|
-
|
|
280
|
-
export const queries = defineQueries({
|
|
281
|
-
${queriesObject}
|
|
282
|
-
})
|
|
283
|
-
`;
|
|
284
|
-
}
|
|
285
83
|
function createTypeResolver(ts, files, dir) {
|
|
286
84
|
var configPath = ts.findConfigFile(dir, ts.sys.fileExists, "tsconfig.json"),
|
|
287
85
|
compilerOptions = {
|
|
@@ -551,7 +349,7 @@ function extractSchemaColumns(ts, sourceFile, columns, primaryKeys) {
|
|
|
551
349
|
var colName = (_prop_name = prop.name) === null || _prop_name === void 0 ? void 0 : _prop_name.getText(sourceFile);
|
|
552
350
|
if (colName) {
|
|
553
351
|
var initText = prop.initializer.getText(sourceFile),
|
|
554
|
-
colType = parseColumnType(initText);
|
|
352
|
+
colType = (0, import_generate_helpers.parseColumnType)(initText);
|
|
555
353
|
columns[colName] = colType;
|
|
556
354
|
}
|
|
557
355
|
}
|
|
@@ -572,224 +370,6 @@ function extractSchemaColumns(ts, sourceFile, columns, primaryKeys) {
|
|
|
572
370
|
}
|
|
573
371
|
visit(sourceFile);
|
|
574
372
|
}
|
|
575
|
-
function parseColumnType(initText) {
|
|
576
|
-
var optional = initText.includes(".optional()"),
|
|
577
|
-
type = "string";
|
|
578
|
-
return initText.startsWith("number(") ? type = "number" : initText.startsWith("boolean(") ? type = "boolean" : initText.startsWith("json(") || initText.startsWith("json<") ? type = "json" : initText.startsWith("enumeration(") && (type = "enum"), {
|
|
579
|
-
type,
|
|
580
|
-
optional,
|
|
581
|
-
customType: void 0
|
|
582
|
-
};
|
|
583
|
-
}
|
|
584
|
-
function columnTypeToValibot(col) {
|
|
585
|
-
var base = "v.string()";
|
|
586
|
-
switch (col.type) {
|
|
587
|
-
case "string":
|
|
588
|
-
base = "v.string()";
|
|
589
|
-
break;
|
|
590
|
-
case "number":
|
|
591
|
-
base = "v.number()";
|
|
592
|
-
break;
|
|
593
|
-
case "boolean":
|
|
594
|
-
base = "v.boolean()";
|
|
595
|
-
break;
|
|
596
|
-
case "json":
|
|
597
|
-
base = "v.unknown()";
|
|
598
|
-
break;
|
|
599
|
-
case "enum":
|
|
600
|
-
base = "v.string()";
|
|
601
|
-
break;
|
|
602
|
-
}
|
|
603
|
-
return col.optional ? `v.optional(v.nullable(${base}))` : base;
|
|
604
|
-
}
|
|
605
|
-
function shouldSkipObjectKey(name) {
|
|
606
|
-
return name.startsWith("__@");
|
|
607
|
-
}
|
|
608
|
-
function formatObjectKey(name) {
|
|
609
|
-
return /^[$A-Z_a-z][$\w]*$/.test(name) ? name : JSON.stringify(name);
|
|
610
|
-
}
|
|
611
|
-
function schemaColumnsToValibot(columns, primaryKeys, mode) {
|
|
612
|
-
var entries = [];
|
|
613
|
-
if (mode === "delete") {
|
|
614
|
-
var _iteratorNormalCompletion = !0,
|
|
615
|
-
_didIteratorError = !1,
|
|
616
|
-
_iteratorError = void 0;
|
|
617
|
-
try {
|
|
618
|
-
for (var _iterator = primaryKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
|
|
619
|
-
var pk = _step.value,
|
|
620
|
-
col = columns[pk];
|
|
621
|
-
col && entries.push(`${formatObjectKey(pk)}: ${columnTypeToValibot({
|
|
622
|
-
...col,
|
|
623
|
-
optional: !1
|
|
624
|
-
})}`);
|
|
625
|
-
}
|
|
626
|
-
} catch (err) {
|
|
627
|
-
_didIteratorError = !0, _iteratorError = err;
|
|
628
|
-
} finally {
|
|
629
|
-
try {
|
|
630
|
-
!_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
|
|
631
|
-
} finally {
|
|
632
|
-
if (_didIteratorError) throw _iteratorError;
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
} else if (mode === "update") {
|
|
636
|
-
var _iteratorNormalCompletion1 = !0,
|
|
637
|
-
_didIteratorError1 = !1,
|
|
638
|
-
_iteratorError1 = void 0;
|
|
639
|
-
try {
|
|
640
|
-
for (var _iterator1 = Object.entries(columns)[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = !0) {
|
|
641
|
-
var [name, col1] = _step1.value,
|
|
642
|
-
isPK = primaryKeys.includes(name);
|
|
643
|
-
isPK ? entries.push(`${formatObjectKey(name)}: ${columnTypeToValibot({
|
|
644
|
-
...col1,
|
|
645
|
-
optional: !1
|
|
646
|
-
})}`) : entries.push(`${formatObjectKey(name)}: ${columnTypeToValibot({
|
|
647
|
-
...col1,
|
|
648
|
-
optional: !0
|
|
649
|
-
})}`);
|
|
650
|
-
}
|
|
651
|
-
} catch (err) {
|
|
652
|
-
_didIteratorError1 = !0, _iteratorError1 = err;
|
|
653
|
-
} finally {
|
|
654
|
-
try {
|
|
655
|
-
!_iteratorNormalCompletion1 && _iterator1.return != null && _iterator1.return();
|
|
656
|
-
} finally {
|
|
657
|
-
if (_didIteratorError1) throw _iteratorError1;
|
|
658
|
-
}
|
|
659
|
-
}
|
|
660
|
-
} else {
|
|
661
|
-
var _iteratorNormalCompletion2 = !0,
|
|
662
|
-
_didIteratorError2 = !1,
|
|
663
|
-
_iteratorError2 = void 0;
|
|
664
|
-
try {
|
|
665
|
-
for (var _iterator2 = Object.entries(columns)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = !0) {
|
|
666
|
-
var [name1, col2] = _step2.value;
|
|
667
|
-
entries.push(`${formatObjectKey(name1)}: ${columnTypeToValibot(col2)}`);
|
|
668
|
-
}
|
|
669
|
-
} catch (err) {
|
|
670
|
-
_didIteratorError2 = !0, _iteratorError2 = err;
|
|
671
|
-
} finally {
|
|
672
|
-
try {
|
|
673
|
-
!_iteratorNormalCompletion2 && _iterator2.return != null && _iterator2.return();
|
|
674
|
-
} finally {
|
|
675
|
-
if (_didIteratorError2) throw _iteratorError2;
|
|
676
|
-
}
|
|
677
|
-
}
|
|
678
|
-
}
|
|
679
|
-
return `v.object({
|
|
680
|
-
${entries.join(`,
|
|
681
|
-
`)},
|
|
682
|
-
})`;
|
|
683
|
-
}
|
|
684
|
-
function generateSyncedMutationsFile(modelMutations) {
|
|
685
|
-
var sorted = [...modelMutations].sort(function (a, b) {
|
|
686
|
-
return a.modelName.localeCompare(b.modelName);
|
|
687
|
-
}),
|
|
688
|
-
modelDefs = sorted.map(function (model) {
|
|
689
|
-
var entries = [];
|
|
690
|
-
if (model.hasCRUD && Object.keys(model.columns).length > 0) for (var _loop = function (_i2, _iter2) {
|
|
691
|
-
var mode = _iter2[_i2],
|
|
692
|
-
hasCustomOverride = model.custom.some(function (m) {
|
|
693
|
-
return m.name === mode;
|
|
694
|
-
});
|
|
695
|
-
if (hasCustomOverride) {
|
|
696
|
-
var customMut = model.custom.find(function (m) {
|
|
697
|
-
return m.name === mode;
|
|
698
|
-
});
|
|
699
|
-
customMut.valibotCode ? entries.push(` ${mode}: ${extractValibotExpression(customMut.valibotCode)},`) : entries.push(` ${mode}: ${schemaColumnsToValibot(model.columns, model.primaryKeys, mode)},`);
|
|
700
|
-
} else entries.push(` ${mode}: ${schemaColumnsToValibot(model.columns, model.primaryKeys, mode)},`);
|
|
701
|
-
}, _i = 0, _iter = ["insert", "update", "delete"]; _i < _iter.length; _i++) _loop(_i, _iter);
|
|
702
|
-
var _iteratorNormalCompletion = !0,
|
|
703
|
-
_didIteratorError = !1,
|
|
704
|
-
_iteratorError = void 0;
|
|
705
|
-
try {
|
|
706
|
-
for (var _iterator = model.custom[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
|
|
707
|
-
var mut = _step.value;
|
|
708
|
-
if (!(model.hasCRUD && ["insert", "update", "delete", "upsert"].includes(mut.name))) {
|
|
709
|
-
if (mut.paramType === "void" || !mut.valibotCode) {
|
|
710
|
-
entries.push(` ${mut.name}: v.void_(),`);
|
|
711
|
-
continue;
|
|
712
|
-
}
|
|
713
|
-
entries.push(` ${mut.name}: ${extractValibotExpression(mut.valibotCode)},`);
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
} catch (err) {
|
|
717
|
-
_didIteratorError = !0, _iteratorError = err;
|
|
718
|
-
} finally {
|
|
719
|
-
try {
|
|
720
|
-
!_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
|
|
721
|
-
} finally {
|
|
722
|
-
if (_didIteratorError) throw _iteratorError;
|
|
723
|
-
}
|
|
724
|
-
}
|
|
725
|
-
return ` ${model.modelName}: {
|
|
726
|
-
${entries.join(`
|
|
727
|
-
`)}
|
|
728
|
-
},`;
|
|
729
|
-
}).join(`
|
|
730
|
-
`);
|
|
731
|
-
return `// auto-generated by: on-zero generate
|
|
732
|
-
// mutation validators derived from model schemas and handler types
|
|
733
|
-
import * as v from 'valibot'
|
|
734
|
-
|
|
735
|
-
export const mutationValidators = {
|
|
736
|
-
${modelDefs}
|
|
737
|
-
}
|
|
738
|
-
`;
|
|
739
|
-
}
|
|
740
|
-
function extractValibotExpression(valibotCode) {
|
|
741
|
-
return valibotCode.trim() || "v.unknown()";
|
|
742
|
-
}
|
|
743
|
-
function parseTypeString(type) {
|
|
744
|
-
if (type = type.trim(), type === "string") return "v.string()";
|
|
745
|
-
if (type === "number") return "v.number()";
|
|
746
|
-
if (type === "boolean") return "v.boolean()";
|
|
747
|
-
if (type === "void" || type === "undefined") return "v.void_()";
|
|
748
|
-
if (type === "null") return "v.null_()";
|
|
749
|
-
if (type === "any" || type === "unknown") return "v.unknown()";
|
|
750
|
-
if (type.startsWith("{") && type.endsWith("}")) {
|
|
751
|
-
var inner = type.slice(1, -1).trim();
|
|
752
|
-
if (!inner) return "v.object({})";
|
|
753
|
-
var normalized = inner.replace(/\n/g, "; ").replace(/;\s*;/g, ";"),
|
|
754
|
-
entries = [],
|
|
755
|
-
_iteratorNormalCompletion = !0,
|
|
756
|
-
_didIteratorError = !1,
|
|
757
|
-
_iteratorError = void 0;
|
|
758
|
-
try {
|
|
759
|
-
for (var _iterator = normalized.split(";")[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
|
|
760
|
-
var part = _step.value,
|
|
761
|
-
trimmed = part.trim().replace(/,\s*$/, "");
|
|
762
|
-
if (trimmed) {
|
|
763
|
-
var match = trimmed.match(/^(?:readonly\s+)?(\w+)(\?)?:\s*(.+)$/);
|
|
764
|
-
if (match) {
|
|
765
|
-
var [, name, opt, typeStr] = match,
|
|
766
|
-
parsed = parseTypeString(typeStr.trim());
|
|
767
|
-
if (!parsed) return null;
|
|
768
|
-
var val = parsed;
|
|
769
|
-
opt && (val = `v.optional(${val})`), entries.push(`${formatObjectKey(name)}: ${val}`);
|
|
770
|
-
}
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
} catch (err) {
|
|
774
|
-
_didIteratorError = !0, _iteratorError = err;
|
|
775
|
-
} finally {
|
|
776
|
-
try {
|
|
777
|
-
!_iteratorNormalCompletion && _iterator.return != null && _iterator.return();
|
|
778
|
-
} finally {
|
|
779
|
-
if (_didIteratorError) throw _iteratorError;
|
|
780
|
-
}
|
|
781
|
-
}
|
|
782
|
-
return entries.length === 0 ? "v.object({})" : `v.object({
|
|
783
|
-
${entries.join(`,
|
|
784
|
-
`)},
|
|
785
|
-
})`;
|
|
786
|
-
}
|
|
787
|
-
if (type.endsWith("[]")) {
|
|
788
|
-
var inner1 = parseTypeString(type.slice(0, -2).trim());
|
|
789
|
-
return inner1 ? `v.array(${inner1})` : null;
|
|
790
|
-
}
|
|
791
|
-
return null;
|
|
792
|
-
}
|
|
793
373
|
function tsTypeToValibot(ts, checker, type, seen) {
|
|
794
374
|
seen || (seen = /* @__PURE__ */new Set());
|
|
795
375
|
var flags = type.getFlags();
|
|
@@ -851,11 +431,11 @@ function tsTypeToValibot(ts, checker, type, seen) {
|
|
|
851
431
|
for (var _iterator = props[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = !0) {
|
|
852
432
|
var prop = _step.value,
|
|
853
433
|
name1 = prop.getName();
|
|
854
|
-
if (!shouldSkipObjectKey(name1)) {
|
|
434
|
+
if (!(0, import_generate_helpers.shouldSkipObjectKey)(name1)) {
|
|
855
435
|
var propType = resolveSymbolType(prop),
|
|
856
436
|
isOptional = !!(prop.getFlags() & ts.SymbolFlags.Optional),
|
|
857
437
|
val = recurse(propType);
|
|
858
|
-
isOptional && !val.startsWith("v.optional(") && (val = `v.optional(${val})`), entries.push(`${formatObjectKey(name1)}: ${val}`);
|
|
438
|
+
isOptional && !val.startsWith("v.optional(") && (val = `v.optional(${val})`), entries.push(`${(0, import_generate_helpers.formatObjectKey)(name1)}: ${val}`);
|
|
859
439
|
}
|
|
860
440
|
}
|
|
861
441
|
} catch (err) {
|
|
@@ -898,11 +478,11 @@ function tsTypeToValibot(ts, checker, type, seen) {
|
|
|
898
478
|
for (var _iterator1 = props1[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = !0) {
|
|
899
479
|
var prop1 = _step1.value,
|
|
900
480
|
name3 = prop1.getName();
|
|
901
|
-
if (!shouldSkipObjectKey(name3)) {
|
|
481
|
+
if (!(0, import_generate_helpers.shouldSkipObjectKey)(name3)) {
|
|
902
482
|
var propType1 = resolveSymbolType(prop1),
|
|
903
483
|
isOptional1 = !!(prop1.getFlags() & ts.SymbolFlags.Optional),
|
|
904
484
|
val1 = recurse(propType1);
|
|
905
|
-
isOptional1 && !val1.startsWith("v.optional(") && (val1 = `v.optional(${val1})`), entries1.push(`${formatObjectKey(name3)}: ${val1}`);
|
|
485
|
+
isOptional1 && !val1.startsWith("v.optional(") && (val1 = `v.optional(${val1})`), entries1.push(`${(0, import_generate_helpers.formatObjectKey)(name3)}: ${val1}`);
|
|
906
486
|
}
|
|
907
487
|
}
|
|
908
488
|
} catch (err) {
|
|
@@ -1045,18 +625,24 @@ async function generate(options) {
|
|
|
1045
625
|
filesWithSchema = allModelFiles.filter(function (f) {
|
|
1046
626
|
return (0, import_fs.readFileSync)((0, import_path.resolve)(modelsDir, f), "utf-8").includes("export const schema = table(");
|
|
1047
627
|
}),
|
|
1048
|
-
|
|
628
|
+
allModelNames = allModelFiles.map(function (f) {
|
|
629
|
+
return (0, import_path.basename)(f, ".ts");
|
|
630
|
+
}),
|
|
631
|
+
schemaModelNames = filesWithSchema.map(function (f) {
|
|
632
|
+
return (0, import_path.basename)(f, ".ts");
|
|
633
|
+
}),
|
|
634
|
+
writeResults = [writeFileIfChanged((0, import_path.resolve)(generatedDir, "models.ts"), (0, import_generate_helpers.generateModelsFile)(allModelNames, modelsDirName)),
|
|
1049
635
|
// only generate types.ts and tables.ts when model files define schemas.
|
|
1050
636
|
// when using drizzle-zero CLI for schema generation, these files are
|
|
1051
637
|
// managed externally and should not be overwritten.
|
|
1052
|
-
...(filesWithSchema.length > 0 ? [writeFileIfChanged((0, import_path.resolve)(generatedDir, "types.ts"), generateTypesFile(
|
|
638
|
+
...(filesWithSchema.length > 0 ? [writeFileIfChanged((0, import_path.resolve)(generatedDir, "types.ts"), (0, import_generate_helpers.generateTypesFile)(schemaModelNames)), writeFileIfChanged((0, import_path.resolve)(generatedDir, "tables.ts"), (0, import_generate_helpers.generateTablesFile)(schemaModelNames, modelsDirName))] : []), writeFileIfChanged((0, import_path.resolve)(generatedDir, "README.md"), (0, import_generate_helpers.generateReadmeFile)())],
|
|
1053
639
|
filesChanged = writeResults.filter(Boolean).length,
|
|
1054
640
|
queryCount = 0,
|
|
1055
641
|
mutationCount = 0,
|
|
1056
642
|
ts = await import("typescript"),
|
|
1057
643
|
typeToValibot = function (paramType) {
|
|
1058
644
|
try {
|
|
1059
|
-
return parseTypeString(paramType.trim());
|
|
645
|
+
return (0, import_generate_helpers.parseTypeString)(paramType.trim());
|
|
1060
646
|
} catch {
|
|
1061
647
|
return null;
|
|
1062
648
|
}
|
|
@@ -1143,8 +729,8 @@ async function generate(options) {
|
|
|
1143
729
|
}
|
|
1144
730
|
}
|
|
1145
731
|
queryCount = allQueries.length;
|
|
1146
|
-
var groupedChanged = writeFileIfChanged((0, import_path.resolve)(generatedDir, "groupedQueries.ts"), generateGroupedQueriesFile(allQueries)),
|
|
1147
|
-
syncedChanged = writeFileIfChanged((0, import_path.resolve)(generatedDir, "syncedQueries.ts"), generateSyncedQueriesFile(allQueries));
|
|
732
|
+
var groupedChanged = writeFileIfChanged((0, import_path.resolve)(generatedDir, "groupedQueries.ts"), (0, import_generate_helpers.generateGroupedQueriesFile)(allQueries)),
|
|
733
|
+
syncedChanged = writeFileIfChanged((0, import_path.resolve)(generatedDir, "syncedQueries.ts"), (0, import_generate_helpers.generateSyncedQueriesFile)(allQueries));
|
|
1148
734
|
groupedChanged && filesChanged++, syncedChanged && filesChanged++;
|
|
1149
735
|
}
|
|
1150
736
|
var allModelMutations = [],
|
|
@@ -1274,7 +860,7 @@ async function generate(options) {
|
|
|
1274
860
|
}
|
|
1275
861
|
}
|
|
1276
862
|
if (allModelMutations.length > 0) {
|
|
1277
|
-
var mutationsChanged = writeFileIfChanged((0, import_path.resolve)(generatedDir, "syncedMutations.ts"), generateSyncedMutationsFile(allModelMutations));
|
|
863
|
+
var mutationsChanged = writeFileIfChanged((0, import_path.resolve)(generatedDir, "syncedMutations.ts"), (0, import_generate_helpers.generateSyncedMutationsFile)(allModelMutations));
|
|
1278
864
|
mutationsChanged && filesChanged++;
|
|
1279
865
|
}
|
|
1280
866
|
if (filesChanged > 0 && !silent && console.info(`\u2713 ${allModelFiles.length} models (${filesWithSchema.length} schemas)${queryCount ? `, ${queryCount} queries` : ""}${mutationCount ? `, ${mutationCount} mutations` : ""}`), filesChanged > 0 && after) {
|