drizzle-graphql-plus 0.8.13 → 0.8.15
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/index.cjs +810 -32
- package/index.cjs.map +1 -1
- package/index.d.cts +57 -2
- package/index.d.ts +57 -2
- package/index.js +829 -30
- package/index.js.map +1 -1
- package/package.json +9 -2
package/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// src/
|
|
1
|
+
// src/buildSchema.ts
|
|
2
2
|
import { is as is6 } from "drizzle-orm";
|
|
3
3
|
import { MySqlDatabase as MySqlDatabase2 } from "drizzle-orm/mysql-core";
|
|
4
4
|
import { PgDatabase as PgDatabase2 } from "drizzle-orm/pg-core";
|
|
@@ -322,6 +322,7 @@ var extractSelectedColumnsFromTree = (tree, table) => {
|
|
|
322
322
|
for (const [subFieldName, subFieldData] of Object.entries(typeFields)) {
|
|
323
323
|
if (tableColumns[subFieldData.name]) {
|
|
324
324
|
selectedColumns.push([subFieldData.name, true]);
|
|
325
|
+
} else {
|
|
325
326
|
}
|
|
326
327
|
}
|
|
327
328
|
}
|
|
@@ -871,20 +872,25 @@ var extractRelationsParamsInner = (relationMap, tables, tableName, typeName, ori
|
|
|
871
872
|
relations
|
|
872
873
|
)) {
|
|
873
874
|
const relTypeName = `${isInitial ? capitalize(tableName) : typeName}${capitalize(relName)}Relation`;
|
|
874
|
-
const
|
|
875
|
+
const relationField = Object.values(baseField).find(
|
|
875
876
|
(field) => field.name === relName
|
|
876
|
-
)
|
|
877
|
-
if (!
|
|
877
|
+
);
|
|
878
|
+
if (!relationField)
|
|
878
879
|
continue;
|
|
880
|
+
const allFields = {};
|
|
881
|
+
if (relationField.fieldsByTypeName) {
|
|
882
|
+
for (const [typeName2, typeFields] of Object.entries(
|
|
883
|
+
relationField.fieldsByTypeName
|
|
884
|
+
)) {
|
|
885
|
+
Object.assign(allFields, typeFields);
|
|
886
|
+
}
|
|
887
|
+
}
|
|
879
888
|
const columns = extractSelectedColumnsFromTree(
|
|
880
|
-
|
|
889
|
+
allFields,
|
|
881
890
|
tables[targetTableName]
|
|
882
891
|
);
|
|
883
892
|
const thisRecord = {};
|
|
884
893
|
thisRecord.columns = columns;
|
|
885
|
-
const relationField = Object.values(baseField).find(
|
|
886
|
-
(e) => e.name === relName
|
|
887
|
-
);
|
|
888
894
|
const relationArgs = relationField?.args;
|
|
889
895
|
const orderBy = relationArgs?.orderBy ? extractOrderBy(tables[targetTableName], relationArgs.orderBy) : void 0;
|
|
890
896
|
const where = relationArgs?.where ? extractFilters(tables[targetTableName], relName, relationArgs?.where) : void 0;
|
|
@@ -953,11 +959,14 @@ var generateSelectArray = (db, tableName, tables, relationMap, orderArgs, filter
|
|
|
953
959
|
const parsedInfo = parseResolveInfo(info, {
|
|
954
960
|
deep: true
|
|
955
961
|
});
|
|
962
|
+
const allFields = {};
|
|
963
|
+
if (parsedInfo.fieldsByTypeName) {
|
|
964
|
+
for (const fields of Object.values(parsedInfo.fieldsByTypeName)) {
|
|
965
|
+
Object.assign(allFields, fields);
|
|
966
|
+
}
|
|
967
|
+
}
|
|
956
968
|
const query = queryBase.findMany({
|
|
957
|
-
columns: extractSelectedColumnsFromTree(
|
|
958
|
-
parsedInfo.fieldsByTypeName[typeName],
|
|
959
|
-
table
|
|
960
|
-
),
|
|
969
|
+
columns: extractSelectedColumnsFromTree(allFields, table),
|
|
961
970
|
offset,
|
|
962
971
|
limit,
|
|
963
972
|
orderBy: orderBy ? extractOrderBy(table, orderBy) : void 0,
|
|
@@ -1011,11 +1020,14 @@ var generateSelectSingle = (db, tableName, tables, relationMap, orderArgs, filte
|
|
|
1011
1020
|
const parsedInfo = parseResolveInfo(info, {
|
|
1012
1021
|
deep: true
|
|
1013
1022
|
});
|
|
1023
|
+
const allFields = {};
|
|
1024
|
+
if (parsedInfo.fieldsByTypeName) {
|
|
1025
|
+
for (const fields of Object.values(parsedInfo.fieldsByTypeName)) {
|
|
1026
|
+
Object.assign(allFields, fields);
|
|
1027
|
+
}
|
|
1028
|
+
}
|
|
1014
1029
|
const query = queryBase.findFirst({
|
|
1015
|
-
columns: extractSelectedColumnsFromTree(
|
|
1016
|
-
parsedInfo.fieldsByTypeName[typeName],
|
|
1017
|
-
table
|
|
1018
|
-
),
|
|
1030
|
+
columns: extractSelectedColumnsFromTree(allFields, table),
|
|
1019
1031
|
offset,
|
|
1020
1032
|
orderBy: orderBy ? extractOrderBy(table, orderBy) : void 0,
|
|
1021
1033
|
where: where ? extractFilters(table, tableName, where) : void 0,
|
|
@@ -1411,11 +1423,14 @@ var generateSelectSingle2 = (db, tableName, tables, relationMap, orderArgs, filt
|
|
|
1411
1423
|
const parsedInfo = parseResolveInfo2(info, {
|
|
1412
1424
|
deep: true
|
|
1413
1425
|
});
|
|
1426
|
+
const allFields = {};
|
|
1427
|
+
if (parsedInfo.fieldsByTypeName) {
|
|
1428
|
+
for (const fields of Object.values(parsedInfo.fieldsByTypeName)) {
|
|
1429
|
+
Object.assign(allFields, fields);
|
|
1430
|
+
}
|
|
1431
|
+
}
|
|
1414
1432
|
const query = queryBase.findFirst({
|
|
1415
|
-
columns: extractSelectedColumnsFromTree(
|
|
1416
|
-
parsedInfo.fieldsByTypeName[typeName],
|
|
1417
|
-
table
|
|
1418
|
-
),
|
|
1433
|
+
columns: extractSelectedColumnsFromTree(allFields, table),
|
|
1419
1434
|
offset,
|
|
1420
1435
|
orderBy: orderBy ? extractOrderBy(table, orderBy) : void 0,
|
|
1421
1436
|
where: where ? extractFilters(table, tableName, where) : void 0,
|
|
@@ -1788,11 +1803,14 @@ var generateSelectArray3 = (db, tableName, tables, relationMap, orderArgs, filte
|
|
|
1788
1803
|
const parsedInfo = parseResolveInfo3(info, {
|
|
1789
1804
|
deep: true
|
|
1790
1805
|
});
|
|
1806
|
+
const allFields = {};
|
|
1807
|
+
if (parsedInfo.fieldsByTypeName) {
|
|
1808
|
+
for (const fields of Object.values(parsedInfo.fieldsByTypeName)) {
|
|
1809
|
+
Object.assign(allFields, fields);
|
|
1810
|
+
}
|
|
1811
|
+
}
|
|
1791
1812
|
const query = queryBase.findMany({
|
|
1792
|
-
columns: extractSelectedColumnsFromTree(
|
|
1793
|
-
parsedInfo.fieldsByTypeName[typeName],
|
|
1794
|
-
table
|
|
1795
|
-
),
|
|
1813
|
+
columns: extractSelectedColumnsFromTree(allFields, table),
|
|
1796
1814
|
offset,
|
|
1797
1815
|
limit,
|
|
1798
1816
|
orderBy: orderBy ? extractOrderBy(table, orderBy) : void 0,
|
|
@@ -1846,11 +1864,14 @@ var generateSelectSingle3 = (db, tableName, tables, relationMap, orderArgs, filt
|
|
|
1846
1864
|
const parsedInfo = parseResolveInfo3(info, {
|
|
1847
1865
|
deep: true
|
|
1848
1866
|
});
|
|
1867
|
+
const allFields = {};
|
|
1868
|
+
if (parsedInfo.fieldsByTypeName) {
|
|
1869
|
+
for (const fields of Object.values(parsedInfo.fieldsByTypeName)) {
|
|
1870
|
+
Object.assign(allFields, fields);
|
|
1871
|
+
}
|
|
1872
|
+
}
|
|
1849
1873
|
const query = queryBase.findFirst({
|
|
1850
|
-
columns: extractSelectedColumnsFromTree(
|
|
1851
|
-
parsedInfo.fieldsByTypeName[typeName],
|
|
1852
|
-
table
|
|
1853
|
-
),
|
|
1874
|
+
columns: extractSelectedColumnsFromTree(allFields, table),
|
|
1854
1875
|
offset,
|
|
1855
1876
|
orderBy: orderBy ? extractOrderBy(table, orderBy) : void 0,
|
|
1856
1877
|
where: where ? extractFilters(table, tableName, where) : void 0,
|
|
@@ -2175,7 +2196,7 @@ var generateSchemaData3 = (db, schema, relationsDepthLimit) => {
|
|
|
2175
2196
|
return { queries, mutations, inputs, interfaces, types: outputs };
|
|
2176
2197
|
};
|
|
2177
2198
|
|
|
2178
|
-
// src/
|
|
2199
|
+
// src/buildSchema.ts
|
|
2179
2200
|
var buildSchema = (db, config) => {
|
|
2180
2201
|
const schema = db._.fullSchema;
|
|
2181
2202
|
if (!schema) {
|
|
@@ -2222,7 +2243,785 @@ var buildSchema = (db, config) => {
|
|
|
2222
2243
|
const outputSchema = new GraphQLSchema(graphQLSchemaConfig);
|
|
2223
2244
|
return { schema: outputSchema, entities: generatorOutput };
|
|
2224
2245
|
};
|
|
2246
|
+
|
|
2247
|
+
// src/buildSchemaSDL/index.ts
|
|
2248
|
+
import { is as is8 } from "drizzle-orm";
|
|
2249
|
+
import { BaseSQLiteDatabase as BaseSQLiteDatabase3 } from "drizzle-orm/sqlite-core";
|
|
2250
|
+
|
|
2251
|
+
// src/buildSchemaSDL/generator/schema.ts
|
|
2252
|
+
import {
|
|
2253
|
+
getTableColumns as getTableColumns3,
|
|
2254
|
+
getTableName,
|
|
2255
|
+
is as is7,
|
|
2256
|
+
Relations as Relations4,
|
|
2257
|
+
createTableRelationsHelpers as createTableRelationsHelpers4,
|
|
2258
|
+
One as One2
|
|
2259
|
+
} from "drizzle-orm";
|
|
2260
|
+
import { MySqlInt as MySqlInt2, MySqlSerial as MySqlSerial2 } from "drizzle-orm/mysql-core";
|
|
2261
|
+
import { PgInteger as PgInteger2, PgSerial as PgSerial2 } from "drizzle-orm/pg-core";
|
|
2262
|
+
import { SQLiteInteger as SQLiteInteger2 } from "drizzle-orm/sqlite-core";
|
|
2263
|
+
var allowedNameChars2 = /^[a-zA-Z0-9_]+$/;
|
|
2264
|
+
var customScalars = /* @__PURE__ */ new Set();
|
|
2265
|
+
var enumDefinitions = /* @__PURE__ */ new Map();
|
|
2266
|
+
var columnToSDL = (column, columnName, tableName, forceNullable = false) => {
|
|
2267
|
+
let baseType;
|
|
2268
|
+
if (column.customGraphqlType) {
|
|
2269
|
+
baseType = column.customGraphqlType;
|
|
2270
|
+
} else {
|
|
2271
|
+
switch (column.dataType) {
|
|
2272
|
+
case "boolean":
|
|
2273
|
+
baseType = "Boolean";
|
|
2274
|
+
break;
|
|
2275
|
+
case "json":
|
|
2276
|
+
if (column.columnType === "PgGeometryObject") {
|
|
2277
|
+
baseType = "PgGeometryObject";
|
|
2278
|
+
customScalars.add("PgGeometryObject");
|
|
2279
|
+
} else {
|
|
2280
|
+
baseType = "JSON";
|
|
2281
|
+
customScalars.add("JSON");
|
|
2282
|
+
}
|
|
2283
|
+
break;
|
|
2284
|
+
case "date":
|
|
2285
|
+
baseType = "Date";
|
|
2286
|
+
customScalars.add("Date");
|
|
2287
|
+
break;
|
|
2288
|
+
case "string":
|
|
2289
|
+
if (column.enumValues?.length) {
|
|
2290
|
+
const enumName = `${capitalize(tableName)}${capitalize(
|
|
2291
|
+
columnName
|
|
2292
|
+
)}Enum`;
|
|
2293
|
+
baseType = enumName;
|
|
2294
|
+
if (!enumDefinitions.has(enumName)) {
|
|
2295
|
+
enumDefinitions.set(enumName, {
|
|
2296
|
+
name: enumName,
|
|
2297
|
+
values: column.enumValues.map(
|
|
2298
|
+
(e, index) => allowedNameChars2.test(e) ? e : `Option${index}`
|
|
2299
|
+
)
|
|
2300
|
+
});
|
|
2301
|
+
}
|
|
2302
|
+
} else {
|
|
2303
|
+
baseType = "String";
|
|
2304
|
+
}
|
|
2305
|
+
break;
|
|
2306
|
+
case "bigint":
|
|
2307
|
+
baseType = "BigInt";
|
|
2308
|
+
customScalars.add("BigInt");
|
|
2309
|
+
break;
|
|
2310
|
+
case "number":
|
|
2311
|
+
if (is7(column, PgInteger2) || is7(column, PgSerial2) || is7(column, MySqlInt2) || is7(column, MySqlSerial2) || is7(column, SQLiteInteger2)) {
|
|
2312
|
+
baseType = "Int";
|
|
2313
|
+
} else {
|
|
2314
|
+
baseType = "Float";
|
|
2315
|
+
}
|
|
2316
|
+
break;
|
|
2317
|
+
case "buffer":
|
|
2318
|
+
baseType = "[Int!]";
|
|
2319
|
+
break;
|
|
2320
|
+
case "array":
|
|
2321
|
+
if (column.columnType === "PgVector") {
|
|
2322
|
+
baseType = "[Float!]";
|
|
2323
|
+
} else if (column.columnType === "PgGeometry") {
|
|
2324
|
+
baseType = "[Float!]";
|
|
2325
|
+
} else {
|
|
2326
|
+
const scalarName = `${capitalize(tableName)}${capitalize(
|
|
2327
|
+
columnName
|
|
2328
|
+
)}Array`;
|
|
2329
|
+
baseType = scalarName;
|
|
2330
|
+
customScalars.add(scalarName);
|
|
2331
|
+
}
|
|
2332
|
+
break;
|
|
2333
|
+
case "custom":
|
|
2334
|
+
default:
|
|
2335
|
+
if (column.columnType) {
|
|
2336
|
+
baseType = column.columnType;
|
|
2337
|
+
customScalars.add(column.columnType);
|
|
2338
|
+
} else {
|
|
2339
|
+
const customScalarName = `${capitalize(tableName)}${capitalize(
|
|
2340
|
+
columnName
|
|
2341
|
+
)}`;
|
|
2342
|
+
baseType = customScalarName;
|
|
2343
|
+
customScalars.add(customScalarName);
|
|
2344
|
+
}
|
|
2345
|
+
break;
|
|
2346
|
+
}
|
|
2347
|
+
}
|
|
2348
|
+
if (!forceNullable && column.notNull && !column.hasDefault && !column.defaultFn) {
|
|
2349
|
+
return `${baseType}!`;
|
|
2350
|
+
}
|
|
2351
|
+
return baseType;
|
|
2352
|
+
};
|
|
2353
|
+
var generateTypes = (db, schema) => {
|
|
2354
|
+
const tables = {};
|
|
2355
|
+
const schemaEntries = Object.entries(schema);
|
|
2356
|
+
const tableEntries = [];
|
|
2357
|
+
for (const [key, value] of schemaEntries) {
|
|
2358
|
+
if (value && typeof value === "object" && "getSQL" in value) {
|
|
2359
|
+
const table = value;
|
|
2360
|
+
const tableName = getTableName(table);
|
|
2361
|
+
const columns = getTableColumns3(table);
|
|
2362
|
+
tables[tableName] = {
|
|
2363
|
+
name: tableName,
|
|
2364
|
+
table,
|
|
2365
|
+
columns
|
|
2366
|
+
};
|
|
2367
|
+
tableEntries.push([tableName, table]);
|
|
2368
|
+
}
|
|
2369
|
+
}
|
|
2370
|
+
const rawRelations = schemaEntries.filter(([key, value]) => is7(value, Relations4)).map(([key, value]) => [
|
|
2371
|
+
tableEntries.find(
|
|
2372
|
+
([tableName, tableValue]) => tableValue === value.table
|
|
2373
|
+
)[0],
|
|
2374
|
+
value
|
|
2375
|
+
]).map(([tableName, relValue]) => [
|
|
2376
|
+
tableName,
|
|
2377
|
+
relValue.config(createTableRelationsHelpers4(tables[tableName].table))
|
|
2378
|
+
]);
|
|
2379
|
+
const namedRelations = Object.fromEntries(
|
|
2380
|
+
rawRelations.map(([relName, config]) => {
|
|
2381
|
+
const namedConfig = Object.fromEntries(
|
|
2382
|
+
Object.entries(config).map(([innerRelName, innerRelValue]) => [
|
|
2383
|
+
innerRelName,
|
|
2384
|
+
{
|
|
2385
|
+
relation: innerRelValue,
|
|
2386
|
+
targetTableName: tableEntries.find(
|
|
2387
|
+
([tableName, tableValue]) => tableValue === innerRelValue.referencedTable
|
|
2388
|
+
)[0]
|
|
2389
|
+
}
|
|
2390
|
+
])
|
|
2391
|
+
);
|
|
2392
|
+
return [relName, namedConfig];
|
|
2393
|
+
})
|
|
2394
|
+
);
|
|
2395
|
+
return { tables, relations: namedRelations };
|
|
2396
|
+
};
|
|
2397
|
+
var generateTypeDefs = (tables, relations) => {
|
|
2398
|
+
const typeDefs = [];
|
|
2399
|
+
customScalars.clear();
|
|
2400
|
+
enumDefinitions.clear();
|
|
2401
|
+
for (const [tableName, tableInfo] of Object.entries(tables)) {
|
|
2402
|
+
const typeName = capitalize(tableName);
|
|
2403
|
+
const fields = [];
|
|
2404
|
+
for (const [columnName, column] of Object.entries(tableInfo.columns)) {
|
|
2405
|
+
const typeStr = columnToSDL(
|
|
2406
|
+
column,
|
|
2407
|
+
columnName,
|
|
2408
|
+
tableName,
|
|
2409
|
+
false
|
|
2410
|
+
);
|
|
2411
|
+
const description = column.customGraphqlDescription;
|
|
2412
|
+
if (description) {
|
|
2413
|
+
fields.push(` """${description}"""`);
|
|
2414
|
+
}
|
|
2415
|
+
fields.push(` ${columnName}: ${typeStr}`);
|
|
2416
|
+
}
|
|
2417
|
+
const tableRelations = relations[tableName];
|
|
2418
|
+
if (tableRelations) {
|
|
2419
|
+
for (const [relationName, relationInfo] of Object.entries(
|
|
2420
|
+
tableRelations
|
|
2421
|
+
)) {
|
|
2422
|
+
const isOne = is7(relationInfo.relation, One2);
|
|
2423
|
+
const targetTableName = relationInfo.targetTableName;
|
|
2424
|
+
const targetTypeName = capitalize(targetTableName);
|
|
2425
|
+
if (isOne) {
|
|
2426
|
+
fields.push(
|
|
2427
|
+
` ${relationName}(where: ${targetTypeName}Filters): ${targetTypeName}`
|
|
2428
|
+
);
|
|
2429
|
+
} else {
|
|
2430
|
+
fields.push(
|
|
2431
|
+
` ${relationName}(where: ${targetTypeName}Filters, orderBy: ${targetTypeName}OrderBy, limit: Int, offset: Int): [${targetTypeName}!]!`
|
|
2432
|
+
);
|
|
2433
|
+
}
|
|
2434
|
+
}
|
|
2435
|
+
}
|
|
2436
|
+
typeDefs.push(`type ${typeName} {
|
|
2437
|
+
${fields.join("\n")}
|
|
2438
|
+
}`);
|
|
2439
|
+
const insertFields = [];
|
|
2440
|
+
for (const [columnName, column] of Object.entries(tableInfo.columns)) {
|
|
2441
|
+
if (column.hasDefault || column.columnType === "SQLiteSerial") {
|
|
2442
|
+
continue;
|
|
2443
|
+
}
|
|
2444
|
+
const typeStr = columnToSDL(
|
|
2445
|
+
column,
|
|
2446
|
+
columnName,
|
|
2447
|
+
tableName,
|
|
2448
|
+
false
|
|
2449
|
+
);
|
|
2450
|
+
const nullableType = typeStr.endsWith("!") ? typeStr.slice(0, -1) : typeStr;
|
|
2451
|
+
insertFields.push(` ${columnName}: ${nullableType}`);
|
|
2452
|
+
}
|
|
2453
|
+
if (insertFields.length > 0) {
|
|
2454
|
+
typeDefs.push(
|
|
2455
|
+
`input ${typeName}InsertInput {
|
|
2456
|
+
${insertFields.join("\n")}
|
|
2457
|
+
}`
|
|
2458
|
+
);
|
|
2459
|
+
}
|
|
2460
|
+
const updateFields = [];
|
|
2461
|
+
for (const [columnName, column] of Object.entries(tableInfo.columns)) {
|
|
2462
|
+
const typeStr = columnToSDL(
|
|
2463
|
+
column,
|
|
2464
|
+
columnName,
|
|
2465
|
+
tableName,
|
|
2466
|
+
true
|
|
2467
|
+
);
|
|
2468
|
+
updateFields.push(` ${columnName}: ${typeStr}`);
|
|
2469
|
+
}
|
|
2470
|
+
typeDefs.push(
|
|
2471
|
+
`input ${typeName}UpdateInput {
|
|
2472
|
+
${updateFields.join("\n")}
|
|
2473
|
+
}`
|
|
2474
|
+
);
|
|
2475
|
+
for (const [columnName, column] of Object.entries(tableInfo.columns)) {
|
|
2476
|
+
const typeStr = columnToSDL(
|
|
2477
|
+
column,
|
|
2478
|
+
columnName,
|
|
2479
|
+
tableName,
|
|
2480
|
+
true
|
|
2481
|
+
);
|
|
2482
|
+
const filterName = `${typeName}${capitalize(columnName)}Filters`;
|
|
2483
|
+
const filterFields = [];
|
|
2484
|
+
filterFields.push(` eq: ${typeStr}`);
|
|
2485
|
+
filterFields.push(` ne: ${typeStr}`);
|
|
2486
|
+
filterFields.push(` lt: ${typeStr}`);
|
|
2487
|
+
filterFields.push(` lte: ${typeStr}`);
|
|
2488
|
+
filterFields.push(` gt: ${typeStr}`);
|
|
2489
|
+
filterFields.push(` gte: ${typeStr}`);
|
|
2490
|
+
filterFields.push(` like: String`);
|
|
2491
|
+
filterFields.push(` notLike: String`);
|
|
2492
|
+
filterFields.push(` ilike: String`);
|
|
2493
|
+
filterFields.push(` notIlike: String`);
|
|
2494
|
+
filterFields.push(` inArray: [${typeStr}!]`);
|
|
2495
|
+
filterFields.push(` notInArray: [${typeStr}!]`);
|
|
2496
|
+
filterFields.push(` isNull: Boolean`);
|
|
2497
|
+
filterFields.push(` isNotNull: Boolean`);
|
|
2498
|
+
const orFilterName = `${typeName}${capitalize(columnName)}FiltersOr`;
|
|
2499
|
+
typeDefs.push(`input ${orFilterName} {
|
|
2500
|
+
${filterFields.join("\n")}
|
|
2501
|
+
}`);
|
|
2502
|
+
filterFields.push(` OR: [${orFilterName}!]`);
|
|
2503
|
+
typeDefs.push(`input ${filterName} {
|
|
2504
|
+
${filterFields.join("\n")}
|
|
2505
|
+
}`);
|
|
2506
|
+
}
|
|
2507
|
+
const whereFields = [];
|
|
2508
|
+
for (const columnName of Object.keys(tableInfo.columns)) {
|
|
2509
|
+
const filterName = `${typeName}${capitalize(columnName)}Filters`;
|
|
2510
|
+
whereFields.push(` ${columnName}: ${filterName}`);
|
|
2511
|
+
}
|
|
2512
|
+
whereFields.push(` OR: [${typeName}FiltersOr!]`);
|
|
2513
|
+
const filtersOrFields = [];
|
|
2514
|
+
for (const columnName of Object.keys(tableInfo.columns)) {
|
|
2515
|
+
const filterName = `${typeName}${capitalize(columnName)}Filters`;
|
|
2516
|
+
filtersOrFields.push(` ${columnName}: ${filterName}`);
|
|
2517
|
+
}
|
|
2518
|
+
typeDefs.push(
|
|
2519
|
+
`input ${typeName}FiltersOr {
|
|
2520
|
+
${filtersOrFields.join("\n")}
|
|
2521
|
+
}`
|
|
2522
|
+
);
|
|
2523
|
+
typeDefs.push(`input ${typeName}Filters {
|
|
2524
|
+
${whereFields.join("\n")}
|
|
2525
|
+
}`);
|
|
2526
|
+
const orderByFields = [];
|
|
2527
|
+
for (const columnName of Object.keys(tableInfo.columns)) {
|
|
2528
|
+
orderByFields.push(` ${columnName}: InnerOrder`);
|
|
2529
|
+
}
|
|
2530
|
+
typeDefs.push(`input ${typeName}OrderBy {
|
|
2531
|
+
${orderByFields.join("\n")}
|
|
2532
|
+
}`);
|
|
2533
|
+
}
|
|
2534
|
+
const allDefs = [];
|
|
2535
|
+
if (customScalars.size > 0) {
|
|
2536
|
+
for (const scalarName of Array.from(customScalars).sort()) {
|
|
2537
|
+
allDefs.push(`scalar ${scalarName}`);
|
|
2538
|
+
}
|
|
2539
|
+
}
|
|
2540
|
+
if (enumDefinitions.size > 0) {
|
|
2541
|
+
for (const enumDef of enumDefinitions.values()) {
|
|
2542
|
+
const valueStrings = enumDef.values.map((v) => ` ${v}`);
|
|
2543
|
+
allDefs.push(`enum ${enumDef.name} {
|
|
2544
|
+
${valueStrings.join("\n")}
|
|
2545
|
+
}`);
|
|
2546
|
+
}
|
|
2547
|
+
}
|
|
2548
|
+
allDefs.push(`enum OrderByDirection {
|
|
2549
|
+
asc
|
|
2550
|
+
desc
|
|
2551
|
+
}`);
|
|
2552
|
+
allDefs.push(`input InnerOrder {
|
|
2553
|
+
direction: OrderByDirection!
|
|
2554
|
+
priority: Int!
|
|
2555
|
+
}`);
|
|
2556
|
+
allDefs.push(...typeDefs);
|
|
2557
|
+
return allDefs.join("\n\n");
|
|
2558
|
+
};
|
|
2559
|
+
var generateQueryTypeDefs = (tables) => {
|
|
2560
|
+
const queryFields = [];
|
|
2561
|
+
for (const tableName of Object.keys(tables)) {
|
|
2562
|
+
const typeName = capitalize(tableName);
|
|
2563
|
+
queryFields.push(
|
|
2564
|
+
` ${tableName}(where: ${typeName}Filters, orderBy: ${typeName}OrderBy, limit: Int, offset: Int): [${typeName}!]!`
|
|
2565
|
+
);
|
|
2566
|
+
}
|
|
2567
|
+
return `type Query {
|
|
2568
|
+
${queryFields.join("\n")}
|
|
2569
|
+
}`;
|
|
2570
|
+
};
|
|
2571
|
+
var generateMutationTypeDefs = (tables) => {
|
|
2572
|
+
const mutationFields = [];
|
|
2573
|
+
for (const tableName of Object.keys(tables)) {
|
|
2574
|
+
const typeName = capitalize(tableName);
|
|
2575
|
+
mutationFields.push(
|
|
2576
|
+
` insert${typeName}(values: [${typeName}InsertInput!]!): [${typeName}!]!`
|
|
2577
|
+
);
|
|
2578
|
+
mutationFields.push(
|
|
2579
|
+
` update${typeName}(where: ${typeName}Filters, set: ${typeName}UpdateInput!): [${typeName}!]!`
|
|
2580
|
+
);
|
|
2581
|
+
mutationFields.push(
|
|
2582
|
+
` delete${typeName}(where: ${typeName}Filters): [${typeName}!]!`
|
|
2583
|
+
);
|
|
2584
|
+
}
|
|
2585
|
+
return `type Mutation {
|
|
2586
|
+
${mutationFields.join("\n")}
|
|
2587
|
+
}`;
|
|
2588
|
+
};
|
|
2589
|
+
|
|
2590
|
+
// src/buildSchemaSDL/generator/queries.ts
|
|
2591
|
+
import {
|
|
2592
|
+
eq as eq2,
|
|
2593
|
+
gt as gt2,
|
|
2594
|
+
gte as gte2,
|
|
2595
|
+
lt as lt2,
|
|
2596
|
+
lte as lte2,
|
|
2597
|
+
ne as ne2,
|
|
2598
|
+
inArray as inArray2,
|
|
2599
|
+
notInArray as notInArray2,
|
|
2600
|
+
like as like2,
|
|
2601
|
+
notLike as notLike2,
|
|
2602
|
+
ilike as ilike2,
|
|
2603
|
+
notIlike as notIlike2,
|
|
2604
|
+
isNull as isNull2,
|
|
2605
|
+
isNotNull as isNotNull2,
|
|
2606
|
+
and as and2,
|
|
2607
|
+
or as or2,
|
|
2608
|
+
asc as asc2,
|
|
2609
|
+
desc as desc2
|
|
2610
|
+
} from "drizzle-orm";
|
|
2611
|
+
import { GraphQLError as GraphQLError6 } from "graphql";
|
|
2612
|
+
import { parseResolveInfo as parseResolveInfo4 } from "graphql-parse-resolve-info";
|
|
2613
|
+
var extractFiltersColumn2 = (column, columnName, operators) => {
|
|
2614
|
+
const entries = Object.entries(operators);
|
|
2615
|
+
if (!entries.length)
|
|
2616
|
+
return void 0;
|
|
2617
|
+
if (operators.OR && operators.OR.length > 0) {
|
|
2618
|
+
if (entries.length > 1) {
|
|
2619
|
+
throw new GraphQLError6(
|
|
2620
|
+
`WHERE ${columnName}: Cannot specify both fields and 'OR' in column operators!`
|
|
2621
|
+
);
|
|
2622
|
+
}
|
|
2623
|
+
const variants2 = [];
|
|
2624
|
+
for (const variant of operators.OR) {
|
|
2625
|
+
const extracted = extractFiltersColumn2(column, columnName, variant);
|
|
2626
|
+
if (extracted)
|
|
2627
|
+
variants2.push(extracted);
|
|
2628
|
+
}
|
|
2629
|
+
return variants2.length ? variants2.length > 1 ? or2(...variants2) : variants2[0] : void 0;
|
|
2630
|
+
}
|
|
2631
|
+
const variants = [];
|
|
2632
|
+
for (const [operatorName, operatorValue] of entries) {
|
|
2633
|
+
if (operatorValue === null || operatorValue === false)
|
|
2634
|
+
continue;
|
|
2635
|
+
switch (operatorName) {
|
|
2636
|
+
case "eq":
|
|
2637
|
+
case "ne":
|
|
2638
|
+
case "gt":
|
|
2639
|
+
case "gte":
|
|
2640
|
+
case "lt":
|
|
2641
|
+
case "lte": {
|
|
2642
|
+
const singleValue = remapFromGraphQLCore(
|
|
2643
|
+
operatorValue,
|
|
2644
|
+
column,
|
|
2645
|
+
columnName
|
|
2646
|
+
);
|
|
2647
|
+
const opMap = { eq: eq2, ne: ne2, gt: gt2, gte: gte2, lt: lt2, lte: lte2 };
|
|
2648
|
+
variants.push(opMap[operatorName](column, singleValue));
|
|
2649
|
+
break;
|
|
2650
|
+
}
|
|
2651
|
+
case "like":
|
|
2652
|
+
case "notLike":
|
|
2653
|
+
case "ilike":
|
|
2654
|
+
case "notIlike": {
|
|
2655
|
+
const opMap = { like: like2, notLike: notLike2, ilike: ilike2, notIlike: notIlike2 };
|
|
2656
|
+
variants.push(opMap[operatorName](column, operatorValue));
|
|
2657
|
+
break;
|
|
2658
|
+
}
|
|
2659
|
+
case "inArray":
|
|
2660
|
+
case "notInArray": {
|
|
2661
|
+
if (!operatorValue.length) {
|
|
2662
|
+
throw new GraphQLError6(
|
|
2663
|
+
`WHERE ${columnName}: Unable to use operator ${operatorName} with an empty array!`
|
|
2664
|
+
);
|
|
2665
|
+
}
|
|
2666
|
+
const arrayValue = operatorValue.map(
|
|
2667
|
+
(val) => remapFromGraphQLCore(val, column, columnName)
|
|
2668
|
+
);
|
|
2669
|
+
const opMap = { inArray: inArray2, notInArray: notInArray2 };
|
|
2670
|
+
variants.push(opMap[operatorName](column, arrayValue));
|
|
2671
|
+
break;
|
|
2672
|
+
}
|
|
2673
|
+
case "isNull":
|
|
2674
|
+
case "isNotNull": {
|
|
2675
|
+
const opMap = { isNull: isNull2, isNotNull: isNotNull2 };
|
|
2676
|
+
variants.push(opMap[operatorName](column));
|
|
2677
|
+
break;
|
|
2678
|
+
}
|
|
2679
|
+
}
|
|
2680
|
+
}
|
|
2681
|
+
return variants.length ? variants.length > 1 ? and2(...variants) : variants[0] : void 0;
|
|
2682
|
+
};
|
|
2683
|
+
var buildWhereClause = (tableInfo, where) => {
|
|
2684
|
+
if (!where || Object.keys(where).length === 0) {
|
|
2685
|
+
return void 0;
|
|
2686
|
+
}
|
|
2687
|
+
if (where.OR && where.OR.length > 0) {
|
|
2688
|
+
if (Object.keys(where).length > 1) {
|
|
2689
|
+
throw new GraphQLError6(
|
|
2690
|
+
`WHERE ${tableInfo.name}: Cannot specify both fields and 'OR' in table filters!`
|
|
2691
|
+
);
|
|
2692
|
+
}
|
|
2693
|
+
const variants = [];
|
|
2694
|
+
for (const variant of where.OR) {
|
|
2695
|
+
const extracted = buildWhereClause(tableInfo, variant);
|
|
2696
|
+
if (extracted)
|
|
2697
|
+
variants.push(extracted);
|
|
2698
|
+
}
|
|
2699
|
+
return variants.length ? variants.length > 1 ? or2(...variants) : variants[0] : void 0;
|
|
2700
|
+
}
|
|
2701
|
+
const conditions = [];
|
|
2702
|
+
for (const [columnName, operators] of Object.entries(where)) {
|
|
2703
|
+
if (columnName === "OR")
|
|
2704
|
+
continue;
|
|
2705
|
+
if (!operators || Object.keys(operators).length === 0)
|
|
2706
|
+
continue;
|
|
2707
|
+
const column = tableInfo.columns[columnName];
|
|
2708
|
+
if (!column)
|
|
2709
|
+
continue;
|
|
2710
|
+
const extracted = extractFiltersColumn2(
|
|
2711
|
+
column,
|
|
2712
|
+
columnName,
|
|
2713
|
+
operators
|
|
2714
|
+
);
|
|
2715
|
+
if (extracted)
|
|
2716
|
+
conditions.push(extracted);
|
|
2717
|
+
}
|
|
2718
|
+
if (conditions.length === 0)
|
|
2719
|
+
return void 0;
|
|
2720
|
+
if (conditions.length === 1)
|
|
2721
|
+
return conditions[0];
|
|
2722
|
+
return and2(...conditions);
|
|
2723
|
+
};
|
|
2724
|
+
var buildOrderByClause = (tableInfo, orderBy) => {
|
|
2725
|
+
if (!orderBy || Object.keys(orderBy).length === 0) {
|
|
2726
|
+
return void 0;
|
|
2727
|
+
}
|
|
2728
|
+
const orderEntries = Object.entries(orderBy).map(([columnName, field]) => ({
|
|
2729
|
+
columnName,
|
|
2730
|
+
...field
|
|
2731
|
+
}));
|
|
2732
|
+
orderEntries.sort((a, b) => a.priority - b.priority);
|
|
2733
|
+
const orderClauses = [];
|
|
2734
|
+
for (const entry of orderEntries) {
|
|
2735
|
+
const column = tableInfo.columns[entry.columnName];
|
|
2736
|
+
if (column) {
|
|
2737
|
+
orderClauses.push(
|
|
2738
|
+
entry.direction === "desc" ? desc2(column) : asc2(column)
|
|
2739
|
+
);
|
|
2740
|
+
}
|
|
2741
|
+
}
|
|
2742
|
+
return orderClauses.length > 0 ? orderClauses : void 0;
|
|
2743
|
+
};
|
|
2744
|
+
var extractSelectedColumns = (fields, tableInfo) => {
|
|
2745
|
+
const columns = {};
|
|
2746
|
+
for (const fieldName of Object.keys(fields)) {
|
|
2747
|
+
if (tableInfo.columns[fieldName]) {
|
|
2748
|
+
columns[fieldName] = true;
|
|
2749
|
+
}
|
|
2750
|
+
}
|
|
2751
|
+
return Object.keys(columns).length > 0 ? columns : {};
|
|
2752
|
+
};
|
|
2753
|
+
var extractRelationsParams2 = (relationMap, tables, tableName, fields) => {
|
|
2754
|
+
const relations = relationMap[tableName];
|
|
2755
|
+
if (!relations)
|
|
2756
|
+
return void 0;
|
|
2757
|
+
const args = {};
|
|
2758
|
+
for (const [relName, { targetTableName, relation }] of Object.entries(
|
|
2759
|
+
relations
|
|
2760
|
+
)) {
|
|
2761
|
+
const relationField = fields[relName];
|
|
2762
|
+
if (!relationField)
|
|
2763
|
+
continue;
|
|
2764
|
+
const allFields = {};
|
|
2765
|
+
if (relationField.fieldsByTypeName) {
|
|
2766
|
+
for (const typeFields of Object.values(relationField.fieldsByTypeName)) {
|
|
2767
|
+
Object.assign(allFields, typeFields);
|
|
2768
|
+
}
|
|
2769
|
+
}
|
|
2770
|
+
const targetTable = tables[targetTableName];
|
|
2771
|
+
if (!targetTable)
|
|
2772
|
+
continue;
|
|
2773
|
+
const thisRecord = {
|
|
2774
|
+
columns: extractSelectedColumns(allFields, targetTable)
|
|
2775
|
+
};
|
|
2776
|
+
const relationArgs = relationField.args;
|
|
2777
|
+
if (relationArgs) {
|
|
2778
|
+
if (relationArgs["where"]) {
|
|
2779
|
+
thisRecord.where = buildWhereClause(
|
|
2780
|
+
targetTable,
|
|
2781
|
+
relationArgs["where"]
|
|
2782
|
+
);
|
|
2783
|
+
}
|
|
2784
|
+
if (relationArgs["orderBy"]) {
|
|
2785
|
+
thisRecord.orderBy = buildOrderByClause(
|
|
2786
|
+
targetTable,
|
|
2787
|
+
relationArgs["orderBy"]
|
|
2788
|
+
);
|
|
2789
|
+
}
|
|
2790
|
+
if (relationArgs["limit"] !== void 0) {
|
|
2791
|
+
thisRecord.limit = relationArgs["limit"];
|
|
2792
|
+
}
|
|
2793
|
+
if (relationArgs["offset"] !== void 0) {
|
|
2794
|
+
thisRecord.offset = relationArgs["offset"];
|
|
2795
|
+
}
|
|
2796
|
+
}
|
|
2797
|
+
const nestedWith = extractRelationsParams2(
|
|
2798
|
+
relationMap,
|
|
2799
|
+
tables,
|
|
2800
|
+
targetTableName,
|
|
2801
|
+
allFields
|
|
2802
|
+
);
|
|
2803
|
+
if (nestedWith) {
|
|
2804
|
+
thisRecord.with = nestedWith;
|
|
2805
|
+
}
|
|
2806
|
+
args[relName] = thisRecord;
|
|
2807
|
+
}
|
|
2808
|
+
return Object.keys(args).length > 0 ? args : void 0;
|
|
2809
|
+
};
|
|
2810
|
+
var generateQueries = (db, tables, relations) => {
|
|
2811
|
+
const queries = {};
|
|
2812
|
+
for (const [tableName, tableInfo] of Object.entries(tables)) {
|
|
2813
|
+
const queryBase = db.query[tableName];
|
|
2814
|
+
if (!queryBase) {
|
|
2815
|
+
throw new Error(
|
|
2816
|
+
`Drizzle-GraphQL Error: Table ${tableName} not found in drizzle instance. Did you forget to pass schema to drizzle constructor?`
|
|
2817
|
+
);
|
|
2818
|
+
}
|
|
2819
|
+
queries[tableName] = async (parent, args, context, info) => {
|
|
2820
|
+
try {
|
|
2821
|
+
const { where, orderBy, limit, offset } = args;
|
|
2822
|
+
const parsedInfo = parseResolveInfo4(info, {
|
|
2823
|
+
deep: true
|
|
2824
|
+
});
|
|
2825
|
+
const allFields = {};
|
|
2826
|
+
if (parsedInfo.fieldsByTypeName) {
|
|
2827
|
+
for (const fields of Object.values(parsedInfo.fieldsByTypeName)) {
|
|
2828
|
+
Object.assign(allFields, fields);
|
|
2829
|
+
}
|
|
2830
|
+
}
|
|
2831
|
+
const result = await queryBase.findMany({
|
|
2832
|
+
columns: extractSelectedColumns(allFields, tableInfo),
|
|
2833
|
+
offset,
|
|
2834
|
+
limit,
|
|
2835
|
+
orderBy: buildOrderByClause(tableInfo, orderBy),
|
|
2836
|
+
where: buildWhereClause(tableInfo, where),
|
|
2837
|
+
with: extractRelationsParams2(relations, tables, tableName, allFields)
|
|
2838
|
+
});
|
|
2839
|
+
return result;
|
|
2840
|
+
} catch (e) {
|
|
2841
|
+
if (typeof e === "object" && e !== null && "message" in e) {
|
|
2842
|
+
throw new GraphQLError6(String(e.message));
|
|
2843
|
+
}
|
|
2844
|
+
throw e;
|
|
2845
|
+
}
|
|
2846
|
+
};
|
|
2847
|
+
}
|
|
2848
|
+
return queries;
|
|
2849
|
+
};
|
|
2850
|
+
|
|
2851
|
+
// src/buildSchemaSDL/generator/mutations.ts
|
|
2852
|
+
import { eq as eq3, and as and3, or as or3 } from "drizzle-orm";
|
|
2853
|
+
import { GraphQLError as GraphQLError7 } from "graphql";
|
|
2854
|
+
var buildWhereClause2 = (tableInfo, where) => {
|
|
2855
|
+
if (!where || Object.keys(where).length === 0) {
|
|
2856
|
+
return void 0;
|
|
2857
|
+
}
|
|
2858
|
+
if (where.OR && where.OR.length > 0) {
|
|
2859
|
+
if (Object.keys(where).length > 1) {
|
|
2860
|
+
throw new GraphQLError7(
|
|
2861
|
+
`WHERE ${tableInfo.name}: Cannot specify both fields and 'OR' in table filters!`
|
|
2862
|
+
);
|
|
2863
|
+
}
|
|
2864
|
+
const variants = [];
|
|
2865
|
+
for (const variant of where.OR) {
|
|
2866
|
+
const extracted = buildWhereClause2(tableInfo, variant);
|
|
2867
|
+
if (extracted)
|
|
2868
|
+
variants.push(extracted);
|
|
2869
|
+
}
|
|
2870
|
+
return variants.length ? variants.length > 1 ? or3(...variants) : variants[0] : void 0;
|
|
2871
|
+
}
|
|
2872
|
+
const conditions = [];
|
|
2873
|
+
for (const [key, value] of Object.entries(where)) {
|
|
2874
|
+
if (key === "OR")
|
|
2875
|
+
continue;
|
|
2876
|
+
if (value === null || value === void 0)
|
|
2877
|
+
continue;
|
|
2878
|
+
const column = tableInfo.columns[key];
|
|
2879
|
+
if (column) {
|
|
2880
|
+
const filters = value;
|
|
2881
|
+
if (typeof filters === "object" && filters.eq !== void 0) {
|
|
2882
|
+
conditions.push(eq3(column, filters.eq));
|
|
2883
|
+
} else if (typeof filters !== "object" || !Array.isArray(filters)) {
|
|
2884
|
+
conditions.push(eq3(column, filters));
|
|
2885
|
+
}
|
|
2886
|
+
}
|
|
2887
|
+
}
|
|
2888
|
+
if (conditions.length === 0)
|
|
2889
|
+
return void 0;
|
|
2890
|
+
if (conditions.length === 1)
|
|
2891
|
+
return conditions[0];
|
|
2892
|
+
return and3(...conditions);
|
|
2893
|
+
};
|
|
2894
|
+
var generateMutations = (db, tables) => {
|
|
2895
|
+
const mutations = {};
|
|
2896
|
+
for (const [tableName, tableInfo] of Object.entries(tables)) {
|
|
2897
|
+
const capitalizedName = capitalize(tableName);
|
|
2898
|
+
mutations[`insert${capitalizedName}`] = async (parent, args, context, info) => {
|
|
2899
|
+
try {
|
|
2900
|
+
const { values } = args;
|
|
2901
|
+
if (!values || values.length === 0) {
|
|
2902
|
+
throw new GraphQLError7("No values provided for insert");
|
|
2903
|
+
}
|
|
2904
|
+
const remappedValues = remapFromGraphQLArrayInput(
|
|
2905
|
+
values,
|
|
2906
|
+
tableInfo.table
|
|
2907
|
+
);
|
|
2908
|
+
const result = await db.insert(tableInfo.table).values(remappedValues).returning();
|
|
2909
|
+
return result;
|
|
2910
|
+
} catch (e) {
|
|
2911
|
+
if (typeof e === "object" && e !== null && "message" in e) {
|
|
2912
|
+
throw new GraphQLError7(String(e.message));
|
|
2913
|
+
}
|
|
2914
|
+
throw e;
|
|
2915
|
+
}
|
|
2916
|
+
};
|
|
2917
|
+
mutations[`update${capitalizedName}`] = async (parent, args, context, info) => {
|
|
2918
|
+
try {
|
|
2919
|
+
const { where, set } = args;
|
|
2920
|
+
if (!set || Object.keys(set).length === 0) {
|
|
2921
|
+
throw new GraphQLError7("No values provided for update");
|
|
2922
|
+
}
|
|
2923
|
+
const remappedSet = remapFromGraphQLSingleInput(set, tableInfo.table);
|
|
2924
|
+
const whereClause = buildWhereClause2(tableInfo, where);
|
|
2925
|
+
let query = db.update(tableInfo.table).set(remappedSet);
|
|
2926
|
+
if (whereClause) {
|
|
2927
|
+
query = query.where(whereClause);
|
|
2928
|
+
}
|
|
2929
|
+
const result = await query.returning();
|
|
2930
|
+
return result;
|
|
2931
|
+
} catch (e) {
|
|
2932
|
+
if (typeof e === "object" && e !== null && "message" in e) {
|
|
2933
|
+
throw new GraphQLError7(String(e.message));
|
|
2934
|
+
}
|
|
2935
|
+
throw e;
|
|
2936
|
+
}
|
|
2937
|
+
};
|
|
2938
|
+
mutations[`delete${capitalizedName}`] = async (parent, args, context, info) => {
|
|
2939
|
+
try {
|
|
2940
|
+
const { where } = args;
|
|
2941
|
+
const whereClause = buildWhereClause2(tableInfo, where);
|
|
2942
|
+
let deleteQuery = db.delete(tableInfo.table);
|
|
2943
|
+
if (whereClause) {
|
|
2944
|
+
deleteQuery = deleteQuery.where(whereClause);
|
|
2945
|
+
}
|
|
2946
|
+
const result = await deleteQuery.returning();
|
|
2947
|
+
return result;
|
|
2948
|
+
} catch (e) {
|
|
2949
|
+
if (typeof e === "object" && e !== null && "message" in e) {
|
|
2950
|
+
throw new GraphQLError7(String(e.message));
|
|
2951
|
+
}
|
|
2952
|
+
throw e;
|
|
2953
|
+
}
|
|
2954
|
+
};
|
|
2955
|
+
}
|
|
2956
|
+
return mutations;
|
|
2957
|
+
};
|
|
2958
|
+
|
|
2959
|
+
// src/buildSchemaSDL/index.ts
|
|
2960
|
+
var buildSchemaSDL = (db, config) => {
|
|
2961
|
+
const schema = db._.fullSchema;
|
|
2962
|
+
if (!schema) {
|
|
2963
|
+
throw new Error(
|
|
2964
|
+
"Drizzle-GraphQL Error: Schema not found in drizzle instance. Make sure you're using drizzle-orm v0.30.9 or above and schema is passed to drizzle constructor!"
|
|
2965
|
+
);
|
|
2966
|
+
}
|
|
2967
|
+
if (!is8(db, BaseSQLiteDatabase3)) {
|
|
2968
|
+
throw new Error(
|
|
2969
|
+
"Drizzle-GraphQL Error: buildSchemaSDL currently only supports SQLite databases"
|
|
2970
|
+
);
|
|
2971
|
+
}
|
|
2972
|
+
const { tables, relations } = generateTypes(db, schema);
|
|
2973
|
+
const typeDefsArray = [];
|
|
2974
|
+
typeDefsArray.push(generateTypeDefs(tables, relations));
|
|
2975
|
+
typeDefsArray.push(generateQueryTypeDefs(tables));
|
|
2976
|
+
if (config?.mutations !== false) {
|
|
2977
|
+
typeDefsArray.push(generateMutationTypeDefs(tables));
|
|
2978
|
+
}
|
|
2979
|
+
const typeDefs = typeDefsArray.join("\n\n");
|
|
2980
|
+
const queries = generateQueries(db, tables, relations);
|
|
2981
|
+
const resolvers = {
|
|
2982
|
+
Query: queries
|
|
2983
|
+
};
|
|
2984
|
+
if (config?.mutations !== false) {
|
|
2985
|
+
const mutations = generateMutations(db, tables);
|
|
2986
|
+
resolvers["Mutation"] = mutations;
|
|
2987
|
+
}
|
|
2988
|
+
return {
|
|
2989
|
+
typeDefs,
|
|
2990
|
+
resolvers
|
|
2991
|
+
};
|
|
2992
|
+
};
|
|
2993
|
+
|
|
2994
|
+
// src/helpers.ts
|
|
2995
|
+
import { getTableName as getTableName2 } from "drizzle-orm";
|
|
2996
|
+
function setCustomGraphQL(table, columnConfig) {
|
|
2997
|
+
for (const [columnName, config] of Object.entries(columnConfig)) {
|
|
2998
|
+
const column = table[columnName];
|
|
2999
|
+
if (!column) {
|
|
3000
|
+
console.warn(
|
|
3001
|
+
`Warning: Column "${columnName}" not found in table "${getTableName2(
|
|
3002
|
+
table
|
|
3003
|
+
)}"`
|
|
3004
|
+
);
|
|
3005
|
+
continue;
|
|
3006
|
+
}
|
|
3007
|
+
if (typeof config === "string") {
|
|
3008
|
+
column.customGraphqlType = config;
|
|
3009
|
+
} else if (config && typeof config === "object") {
|
|
3010
|
+
const fieldConfig = config;
|
|
3011
|
+
column.customGraphqlType = fieldConfig.type;
|
|
3012
|
+
if (fieldConfig.description) {
|
|
3013
|
+
column.customGraphqlDescription = fieldConfig.description;
|
|
3014
|
+
}
|
|
3015
|
+
}
|
|
3016
|
+
}
|
|
3017
|
+
}
|
|
3018
|
+
function setCustomGraphQLTypes(table, columnTypes) {
|
|
3019
|
+
setCustomGraphQL(table, columnTypes);
|
|
3020
|
+
}
|
|
2225
3021
|
export {
|
|
2226
|
-
buildSchema
|
|
3022
|
+
buildSchema,
|
|
3023
|
+
buildSchemaSDL,
|
|
3024
|
+
setCustomGraphQL,
|
|
3025
|
+
setCustomGraphQLTypes
|
|
2227
3026
|
};
|
|
2228
3027
|
//# sourceMappingURL=index.js.map
|