drizzle-graphql-plus 0.8.19 → 0.8.21
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 +225 -115
- package/index.cjs.map +1 -1
- package/index.js +225 -115
- package/index.js.map +1 -1
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -2264,86 +2264,92 @@ var allowedNameChars2 = /^[a-zA-Z0-9_]+$/;
|
|
|
2264
2264
|
var customScalars = /* @__PURE__ */ new Set();
|
|
2265
2265
|
var enumDefinitions = /* @__PURE__ */ new Map();
|
|
2266
2266
|
var requiredFieldFilters = /* @__PURE__ */ new Set();
|
|
2267
|
+
var foreignKeyTypes = /* @__PURE__ */ new Map();
|
|
2267
2268
|
var columnToSDL = (column, columnName, tableName, forceNullable = false) => {
|
|
2268
2269
|
let baseType;
|
|
2269
2270
|
if (column.customGraphqlType) {
|
|
2270
2271
|
baseType = column.customGraphqlType;
|
|
2271
2272
|
} else {
|
|
2272
|
-
|
|
2273
|
-
|
|
2274
|
-
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
baseType = "
|
|
2279
|
-
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
customScalars.add("Date");
|
|
2288
|
-
break;
|
|
2289
|
-
case "string":
|
|
2290
|
-
if (column.enumValues?.length) {
|
|
2291
|
-
const enumName = `${capitalize(tableName)}${capitalize(
|
|
2292
|
-
columnName
|
|
2293
|
-
)}Enum`;
|
|
2294
|
-
baseType = enumName;
|
|
2295
|
-
if (!enumDefinitions.has(enumName)) {
|
|
2296
|
-
enumDefinitions.set(enumName, {
|
|
2297
|
-
name: enumName,
|
|
2298
|
-
values: column.enumValues.map(
|
|
2299
|
-
(e, index) => allowedNameChars2.test(e) ? e : `Option${index}`
|
|
2300
|
-
)
|
|
2301
|
-
});
|
|
2273
|
+
const foreignKeyType = foreignKeyTypes.get(`${tableName}.${columnName}`);
|
|
2274
|
+
if (foreignKeyType) {
|
|
2275
|
+
baseType = foreignKeyType;
|
|
2276
|
+
} else {
|
|
2277
|
+
switch (column.dataType) {
|
|
2278
|
+
case "boolean":
|
|
2279
|
+
baseType = "Boolean";
|
|
2280
|
+
break;
|
|
2281
|
+
case "json":
|
|
2282
|
+
if (column.columnType === "PgGeometryObject") {
|
|
2283
|
+
baseType = "PgGeometryObject";
|
|
2284
|
+
customScalars.add("PgGeometryObject");
|
|
2285
|
+
} else {
|
|
2286
|
+
baseType = "JSON";
|
|
2287
|
+
customScalars.add("JSON");
|
|
2302
2288
|
}
|
|
2303
|
-
|
|
2304
|
-
|
|
2305
|
-
|
|
2306
|
-
|
|
2307
|
-
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
|
|
2312
|
-
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
|
|
2317
|
-
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
|
|
2323
|
-
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2334
|
-
|
|
2335
|
-
|
|
2336
|
-
|
|
2337
|
-
|
|
2338
|
-
|
|
2339
|
-
|
|
2340
|
-
|
|
2341
|
-
|
|
2342
|
-
|
|
2343
|
-
|
|
2344
|
-
|
|
2345
|
-
|
|
2346
|
-
|
|
2289
|
+
break;
|
|
2290
|
+
case "date":
|
|
2291
|
+
baseType = "Date";
|
|
2292
|
+
customScalars.add("Date");
|
|
2293
|
+
break;
|
|
2294
|
+
case "string":
|
|
2295
|
+
if (column.enumValues?.length) {
|
|
2296
|
+
const enumName = `${capitalize(tableName)}${capitalize(
|
|
2297
|
+
columnName
|
|
2298
|
+
)}Enum`;
|
|
2299
|
+
baseType = enumName;
|
|
2300
|
+
if (!enumDefinitions.has(enumName)) {
|
|
2301
|
+
enumDefinitions.set(enumName, {
|
|
2302
|
+
name: enumName,
|
|
2303
|
+
values: column.enumValues.map(
|
|
2304
|
+
(e, index) => allowedNameChars2.test(e) ? e : `Option${index}`
|
|
2305
|
+
)
|
|
2306
|
+
});
|
|
2307
|
+
}
|
|
2308
|
+
} else {
|
|
2309
|
+
baseType = "String";
|
|
2310
|
+
}
|
|
2311
|
+
break;
|
|
2312
|
+
case "bigint":
|
|
2313
|
+
baseType = "BigInt";
|
|
2314
|
+
customScalars.add("BigInt");
|
|
2315
|
+
break;
|
|
2316
|
+
case "number":
|
|
2317
|
+
if (is7(column, PgInteger2) || is7(column, PgSerial2) || is7(column, MySqlInt2) || is7(column, MySqlSerial2) || is7(column, SQLiteInteger2)) {
|
|
2318
|
+
baseType = "Int";
|
|
2319
|
+
} else {
|
|
2320
|
+
baseType = "Float";
|
|
2321
|
+
}
|
|
2322
|
+
break;
|
|
2323
|
+
case "buffer":
|
|
2324
|
+
baseType = "[Int!]";
|
|
2325
|
+
break;
|
|
2326
|
+
case "array":
|
|
2327
|
+
if (column.columnType === "PgVector") {
|
|
2328
|
+
baseType = "[Float!]";
|
|
2329
|
+
} else if (column.columnType === "PgGeometry") {
|
|
2330
|
+
baseType = "[Float!]";
|
|
2331
|
+
} else {
|
|
2332
|
+
const scalarName = `${capitalize(tableName)}${capitalize(
|
|
2333
|
+
columnName
|
|
2334
|
+
)}Array`;
|
|
2335
|
+
baseType = scalarName;
|
|
2336
|
+
customScalars.add(scalarName);
|
|
2337
|
+
}
|
|
2338
|
+
break;
|
|
2339
|
+
case "custom":
|
|
2340
|
+
default:
|
|
2341
|
+
if (column.columnType) {
|
|
2342
|
+
baseType = column.columnType;
|
|
2343
|
+
customScalars.add(column.columnType);
|
|
2344
|
+
} else {
|
|
2345
|
+
const customScalarName = `${capitalize(tableName)}${capitalize(
|
|
2346
|
+
columnName
|
|
2347
|
+
)}`;
|
|
2348
|
+
baseType = customScalarName;
|
|
2349
|
+
customScalars.add(customScalarName);
|
|
2350
|
+
}
|
|
2351
|
+
break;
|
|
2352
|
+
}
|
|
2347
2353
|
}
|
|
2348
2354
|
}
|
|
2349
2355
|
if (!forceNullable && column.notNull) {
|
|
@@ -2400,6 +2406,53 @@ var generateTypeDefs = (tables, relations) => {
|
|
|
2400
2406
|
customScalars.clear();
|
|
2401
2407
|
enumDefinitions.clear();
|
|
2402
2408
|
requiredFieldFilters.clear();
|
|
2409
|
+
foreignKeyTypes.clear();
|
|
2410
|
+
for (const [tableName, tableRelations] of Object.entries(relations)) {
|
|
2411
|
+
const tableInfo = tables[tableName];
|
|
2412
|
+
if (!tableInfo)
|
|
2413
|
+
continue;
|
|
2414
|
+
for (const [relationName, relationInfo] of Object.entries(tableRelations)) {
|
|
2415
|
+
const relation = relationInfo.relation;
|
|
2416
|
+
if (!is7(relation, One2))
|
|
2417
|
+
continue;
|
|
2418
|
+
const config = relation.config;
|
|
2419
|
+
if (!config?.fields || !config?.references)
|
|
2420
|
+
continue;
|
|
2421
|
+
const referencedTableName = relationInfo.targetTableName;
|
|
2422
|
+
const referencedTable = tables[referencedTableName];
|
|
2423
|
+
if (!referencedTable)
|
|
2424
|
+
continue;
|
|
2425
|
+
for (let i = 0; i < config.fields.length; i++) {
|
|
2426
|
+
const field = config.fields[i];
|
|
2427
|
+
const reference = config.references[i];
|
|
2428
|
+
if (!field || !reference)
|
|
2429
|
+
continue;
|
|
2430
|
+
const fieldColumnName = field.name;
|
|
2431
|
+
const referenceColumnName = reference.name;
|
|
2432
|
+
const foreignKeyColumn = Object.values(tableInfo.columns).find(
|
|
2433
|
+
(col) => col.name === fieldColumnName
|
|
2434
|
+
);
|
|
2435
|
+
const referencedColumn = Object.values(referencedTable.columns).find(
|
|
2436
|
+
(col) => col.name === referenceColumnName
|
|
2437
|
+
);
|
|
2438
|
+
if (!foreignKeyColumn || !referencedColumn)
|
|
2439
|
+
continue;
|
|
2440
|
+
const foreignKeyPropertyName = Object.keys(tableInfo.columns).find(
|
|
2441
|
+
(key) => tableInfo.columns[key] === foreignKeyColumn
|
|
2442
|
+
);
|
|
2443
|
+
if (!foreignKeyPropertyName)
|
|
2444
|
+
continue;
|
|
2445
|
+
const referencedCustomType = referencedColumn.customGraphqlType;
|
|
2446
|
+
const foreignKeyHasCustomType = !!foreignKeyColumn.customGraphqlType;
|
|
2447
|
+
if (referencedCustomType && !foreignKeyHasCustomType) {
|
|
2448
|
+
foreignKeyTypes.set(
|
|
2449
|
+
`${tableName}.${foreignKeyPropertyName}`,
|
|
2450
|
+
referencedCustomType
|
|
2451
|
+
);
|
|
2452
|
+
}
|
|
2453
|
+
}
|
|
2454
|
+
}
|
|
2455
|
+
}
|
|
2403
2456
|
for (const [tableName, tableInfo] of Object.entries(tables)) {
|
|
2404
2457
|
const typeName = capitalize(tableName);
|
|
2405
2458
|
const fields = [];
|
|
@@ -2555,7 +2608,7 @@ var generateQueryTypeDefs = (tables) => {
|
|
|
2555
2608
|
for (const tableName of Object.keys(tables)) {
|
|
2556
2609
|
const typeName = capitalize(tableName);
|
|
2557
2610
|
queryFields.push(
|
|
2558
|
-
` ${tableName}(where: ${typeName}Filters, orderBy: ${typeName}OrderBy, limit: Int, offset: Int): [${typeName}!]!`
|
|
2611
|
+
` ${tableName}FindMany(where: ${typeName}Filters, orderBy: ${typeName}OrderBy, limit: Int, offset: Int): [${typeName}!]!`
|
|
2559
2612
|
);
|
|
2560
2613
|
}
|
|
2561
2614
|
return `type Query {
|
|
@@ -2567,13 +2620,13 @@ var generateMutationTypeDefs = (tables) => {
|
|
|
2567
2620
|
for (const tableName of Object.keys(tables)) {
|
|
2568
2621
|
const typeName = capitalize(tableName);
|
|
2569
2622
|
mutationFields.push(
|
|
2570
|
-
`
|
|
2623
|
+
` ${tableName}InsertMany(values: [${typeName}InsertInput!]!): [${typeName}!]!`
|
|
2571
2624
|
);
|
|
2572
2625
|
mutationFields.push(
|
|
2573
|
-
`
|
|
2626
|
+
` ${tableName}UpdateMany(where: ${typeName}Filters, set: ${typeName}UpdateInput!): [${typeName}!]!`
|
|
2574
2627
|
);
|
|
2575
2628
|
mutationFields.push(
|
|
2576
|
-
`
|
|
2629
|
+
` ${tableName}DeleteMany(where: ${typeName}Filters): [${typeName}!]!`
|
|
2577
2630
|
);
|
|
2578
2631
|
}
|
|
2579
2632
|
return `type Mutation {
|
|
@@ -2801,6 +2854,41 @@ var extractRelationsParams2 = (relationMap, tables, tableName, fields) => {
|
|
|
2801
2854
|
}
|
|
2802
2855
|
return Object.keys(args).length > 0 ? args : void 0;
|
|
2803
2856
|
};
|
|
2857
|
+
var createQueryResolver = (queryBase, tableInfo, tables, relations) => {
|
|
2858
|
+
return async (parent, args, context, info) => {
|
|
2859
|
+
try {
|
|
2860
|
+
const { where, orderBy, limit, offset } = args;
|
|
2861
|
+
const parsedInfo = parseResolveInfo4(info, {
|
|
2862
|
+
deep: true
|
|
2863
|
+
});
|
|
2864
|
+
const allFields = {};
|
|
2865
|
+
if (parsedInfo.fieldsByTypeName) {
|
|
2866
|
+
for (const fields of Object.values(parsedInfo.fieldsByTypeName)) {
|
|
2867
|
+
Object.assign(allFields, fields);
|
|
2868
|
+
}
|
|
2869
|
+
}
|
|
2870
|
+
const result = await queryBase.findMany({
|
|
2871
|
+
columns: extractSelectedColumns(allFields, tableInfo),
|
|
2872
|
+
offset,
|
|
2873
|
+
limit,
|
|
2874
|
+
orderBy: buildOrderByClause(tableInfo, orderBy),
|
|
2875
|
+
where: buildWhereClause(tableInfo, where),
|
|
2876
|
+
with: extractRelationsParams2(
|
|
2877
|
+
relations,
|
|
2878
|
+
tables,
|
|
2879
|
+
tableInfo.name,
|
|
2880
|
+
allFields
|
|
2881
|
+
)
|
|
2882
|
+
});
|
|
2883
|
+
return result;
|
|
2884
|
+
} catch (e) {
|
|
2885
|
+
if (typeof e === "object" && e !== null && "message" in e) {
|
|
2886
|
+
throw new GraphQLError6(String(e.message));
|
|
2887
|
+
}
|
|
2888
|
+
throw e;
|
|
2889
|
+
}
|
|
2890
|
+
};
|
|
2891
|
+
};
|
|
2804
2892
|
var generateQueries = (db, tables, relations) => {
|
|
2805
2893
|
const queries = {};
|
|
2806
2894
|
for (const [tableName, tableInfo] of Object.entries(tables)) {
|
|
@@ -2810,34 +2898,12 @@ var generateQueries = (db, tables, relations) => {
|
|
|
2810
2898
|
`Drizzle-GraphQL Error: Table ${tableName} not found in drizzle instance. Did you forget to pass schema to drizzle constructor?`
|
|
2811
2899
|
);
|
|
2812
2900
|
}
|
|
2813
|
-
queries[tableName] =
|
|
2814
|
-
|
|
2815
|
-
|
|
2816
|
-
|
|
2817
|
-
|
|
2818
|
-
|
|
2819
|
-
const allFields = {};
|
|
2820
|
-
if (parsedInfo.fieldsByTypeName) {
|
|
2821
|
-
for (const fields of Object.values(parsedInfo.fieldsByTypeName)) {
|
|
2822
|
-
Object.assign(allFields, fields);
|
|
2823
|
-
}
|
|
2824
|
-
}
|
|
2825
|
-
const result = await queryBase.findMany({
|
|
2826
|
-
columns: extractSelectedColumns(allFields, tableInfo),
|
|
2827
|
-
offset,
|
|
2828
|
-
limit,
|
|
2829
|
-
orderBy: buildOrderByClause(tableInfo, orderBy),
|
|
2830
|
-
where: buildWhereClause(tableInfo, where),
|
|
2831
|
-
with: extractRelationsParams2(relations, tables, tableName, allFields)
|
|
2832
|
-
});
|
|
2833
|
-
return result;
|
|
2834
|
-
} catch (e) {
|
|
2835
|
-
if (typeof e === "object" && e !== null && "message" in e) {
|
|
2836
|
-
throw new GraphQLError6(String(e.message));
|
|
2837
|
-
}
|
|
2838
|
-
throw e;
|
|
2839
|
-
}
|
|
2840
|
-
};
|
|
2901
|
+
queries[`${tableName}FindMany`] = createQueryResolver(
|
|
2902
|
+
queryBase,
|
|
2903
|
+
tableInfo,
|
|
2904
|
+
tables,
|
|
2905
|
+
relations
|
|
2906
|
+
);
|
|
2841
2907
|
}
|
|
2842
2908
|
return queries;
|
|
2843
2909
|
};
|
|
@@ -2885,11 +2951,31 @@ var buildWhereClause2 = (tableInfo, where) => {
|
|
|
2885
2951
|
return conditions[0];
|
|
2886
2952
|
return and3(...conditions);
|
|
2887
2953
|
};
|
|
2888
|
-
var generateMutations = (db, tables) => {
|
|
2954
|
+
var generateMutations = (db, tables, relations) => {
|
|
2889
2955
|
const mutations = {};
|
|
2890
2956
|
for (const [tableName, tableInfo] of Object.entries(tables)) {
|
|
2891
2957
|
const capitalizedName = capitalize(tableName);
|
|
2892
|
-
|
|
2958
|
+
const queryBase = db.query[tableName];
|
|
2959
|
+
if (!queryBase) {
|
|
2960
|
+
throw new Error(
|
|
2961
|
+
`Drizzle-GraphQL Error: Table ${tableName} not found in drizzle instance. Did you forget to pass schema to drizzle constructor?`
|
|
2962
|
+
);
|
|
2963
|
+
}
|
|
2964
|
+
const primaryKeyColumn = Object.values(tableInfo.columns).find(
|
|
2965
|
+
(col) => col.primary || col.name === "id"
|
|
2966
|
+
);
|
|
2967
|
+
if (!primaryKeyColumn) {
|
|
2968
|
+
throw new Error(
|
|
2969
|
+
`Drizzle-GraphQL Error: Table ${tableName} does not have a primary key column`
|
|
2970
|
+
);
|
|
2971
|
+
}
|
|
2972
|
+
const queryResolver = createQueryResolver(
|
|
2973
|
+
queryBase,
|
|
2974
|
+
tableInfo,
|
|
2975
|
+
tables,
|
|
2976
|
+
relations
|
|
2977
|
+
);
|
|
2978
|
+
mutations[`${tableName}InsertMany`] = async (parent, args, context, info) => {
|
|
2893
2979
|
try {
|
|
2894
2980
|
const { values } = args;
|
|
2895
2981
|
if (!values || values.length === 0) {
|
|
@@ -2899,8 +2985,20 @@ var generateMutations = (db, tables) => {
|
|
|
2899
2985
|
values,
|
|
2900
2986
|
tableInfo.table
|
|
2901
2987
|
);
|
|
2902
|
-
const
|
|
2903
|
-
|
|
2988
|
+
const insertedRows = await db.insert(tableInfo.table).values(remappedValues).returning();
|
|
2989
|
+
const insertedIds = insertedRows.map(
|
|
2990
|
+
(row) => row[primaryKeyColumn.name]
|
|
2991
|
+
);
|
|
2992
|
+
return queryResolver(
|
|
2993
|
+
parent,
|
|
2994
|
+
{
|
|
2995
|
+
where: {
|
|
2996
|
+
[primaryKeyColumn.name]: { inArray: insertedIds }
|
|
2997
|
+
}
|
|
2998
|
+
},
|
|
2999
|
+
context,
|
|
3000
|
+
info
|
|
3001
|
+
);
|
|
2904
3002
|
} catch (e) {
|
|
2905
3003
|
if (typeof e === "object" && e !== null && "message" in e) {
|
|
2906
3004
|
throw new GraphQLError7(String(e.message));
|
|
@@ -2908,7 +3006,7 @@ var generateMutations = (db, tables) => {
|
|
|
2908
3006
|
throw e;
|
|
2909
3007
|
}
|
|
2910
3008
|
};
|
|
2911
|
-
mutations[
|
|
3009
|
+
mutations[`${tableName}UpdateMany`] = async (parent, args, context, info) => {
|
|
2912
3010
|
try {
|
|
2913
3011
|
const { where, set } = args;
|
|
2914
3012
|
if (!set || Object.keys(set).length === 0) {
|
|
@@ -2920,8 +3018,20 @@ var generateMutations = (db, tables) => {
|
|
|
2920
3018
|
if (whereClause) {
|
|
2921
3019
|
query = query.where(whereClause);
|
|
2922
3020
|
}
|
|
2923
|
-
const
|
|
2924
|
-
|
|
3021
|
+
const updatedRows = await query.returning();
|
|
3022
|
+
const updatedIds = updatedRows.map(
|
|
3023
|
+
(row) => row[primaryKeyColumn.name]
|
|
3024
|
+
);
|
|
3025
|
+
return queryResolver(
|
|
3026
|
+
parent,
|
|
3027
|
+
{
|
|
3028
|
+
where: {
|
|
3029
|
+
[primaryKeyColumn.name]: { inArray: updatedIds }
|
|
3030
|
+
}
|
|
3031
|
+
},
|
|
3032
|
+
context,
|
|
3033
|
+
info
|
|
3034
|
+
);
|
|
2925
3035
|
} catch (e) {
|
|
2926
3036
|
if (typeof e === "object" && e !== null && "message" in e) {
|
|
2927
3037
|
throw new GraphQLError7(String(e.message));
|
|
@@ -2929,7 +3039,7 @@ var generateMutations = (db, tables) => {
|
|
|
2929
3039
|
throw e;
|
|
2930
3040
|
}
|
|
2931
3041
|
};
|
|
2932
|
-
mutations[
|
|
3042
|
+
mutations[`${tableName}DeleteMany`] = async (parent, args, context, info) => {
|
|
2933
3043
|
try {
|
|
2934
3044
|
const { where } = args;
|
|
2935
3045
|
const whereClause = buildWhereClause2(tableInfo, where);
|
|
@@ -2970,7 +3080,7 @@ var buildSchemaSDL = (db, config) => {
|
|
|
2970
3080
|
typeDefsArray.push(generateMutationTypeDefs(tables));
|
|
2971
3081
|
const typeDefs = typeDefsArray.join("\n\n");
|
|
2972
3082
|
const queries = generateQueries(db, tables, relations);
|
|
2973
|
-
const mutations = generateMutations(db, tables);
|
|
3083
|
+
const mutations = generateMutations(db, tables, relations);
|
|
2974
3084
|
return {
|
|
2975
3085
|
typeDefs,
|
|
2976
3086
|
resolvers: {
|