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.cjs
CHANGED
|
@@ -2209,86 +2209,92 @@ var allowedNameChars2 = /^[a-zA-Z0-9_]+$/;
|
|
|
2209
2209
|
var customScalars = /* @__PURE__ */ new Set();
|
|
2210
2210
|
var enumDefinitions = /* @__PURE__ */ new Map();
|
|
2211
2211
|
var requiredFieldFilters = /* @__PURE__ */ new Set();
|
|
2212
|
+
var foreignKeyTypes = /* @__PURE__ */ new Map();
|
|
2212
2213
|
var columnToSDL = (column, columnName, tableName, forceNullable = false) => {
|
|
2213
2214
|
let baseType;
|
|
2214
2215
|
if (column.customGraphqlType) {
|
|
2215
2216
|
baseType = column.customGraphqlType;
|
|
2216
2217
|
} else {
|
|
2217
|
-
|
|
2218
|
-
|
|
2219
|
-
|
|
2220
|
-
|
|
2221
|
-
|
|
2222
|
-
|
|
2223
|
-
baseType = "
|
|
2224
|
-
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2229
|
-
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
customScalars.add("Date");
|
|
2233
|
-
break;
|
|
2234
|
-
case "string":
|
|
2235
|
-
if (column.enumValues?.length) {
|
|
2236
|
-
const enumName = `${capitalize(tableName)}${capitalize(
|
|
2237
|
-
columnName
|
|
2238
|
-
)}Enum`;
|
|
2239
|
-
baseType = enumName;
|
|
2240
|
-
if (!enumDefinitions.has(enumName)) {
|
|
2241
|
-
enumDefinitions.set(enumName, {
|
|
2242
|
-
name: enumName,
|
|
2243
|
-
values: column.enumValues.map(
|
|
2244
|
-
(e, index) => allowedNameChars2.test(e) ? e : `Option${index}`
|
|
2245
|
-
)
|
|
2246
|
-
});
|
|
2218
|
+
const foreignKeyType = foreignKeyTypes.get(`${tableName}.${columnName}`);
|
|
2219
|
+
if (foreignKeyType) {
|
|
2220
|
+
baseType = foreignKeyType;
|
|
2221
|
+
} else {
|
|
2222
|
+
switch (column.dataType) {
|
|
2223
|
+
case "boolean":
|
|
2224
|
+
baseType = "Boolean";
|
|
2225
|
+
break;
|
|
2226
|
+
case "json":
|
|
2227
|
+
if (column.columnType === "PgGeometryObject") {
|
|
2228
|
+
baseType = "PgGeometryObject";
|
|
2229
|
+
customScalars.add("PgGeometryObject");
|
|
2230
|
+
} else {
|
|
2231
|
+
baseType = "JSON";
|
|
2232
|
+
customScalars.add("JSON");
|
|
2247
2233
|
}
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2270
|
-
|
|
2271
|
-
|
|
2272
|
-
|
|
2273
|
-
|
|
2274
|
-
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
|
|
2281
|
-
|
|
2282
|
-
|
|
2283
|
-
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
2290
|
-
|
|
2291
|
-
|
|
2234
|
+
break;
|
|
2235
|
+
case "date":
|
|
2236
|
+
baseType = "Date";
|
|
2237
|
+
customScalars.add("Date");
|
|
2238
|
+
break;
|
|
2239
|
+
case "string":
|
|
2240
|
+
if (column.enumValues?.length) {
|
|
2241
|
+
const enumName = `${capitalize(tableName)}${capitalize(
|
|
2242
|
+
columnName
|
|
2243
|
+
)}Enum`;
|
|
2244
|
+
baseType = enumName;
|
|
2245
|
+
if (!enumDefinitions.has(enumName)) {
|
|
2246
|
+
enumDefinitions.set(enumName, {
|
|
2247
|
+
name: enumName,
|
|
2248
|
+
values: column.enumValues.map(
|
|
2249
|
+
(e, index) => allowedNameChars2.test(e) ? e : `Option${index}`
|
|
2250
|
+
)
|
|
2251
|
+
});
|
|
2252
|
+
}
|
|
2253
|
+
} else {
|
|
2254
|
+
baseType = "String";
|
|
2255
|
+
}
|
|
2256
|
+
break;
|
|
2257
|
+
case "bigint":
|
|
2258
|
+
baseType = "BigInt";
|
|
2259
|
+
customScalars.add("BigInt");
|
|
2260
|
+
break;
|
|
2261
|
+
case "number":
|
|
2262
|
+
if ((0, import_drizzle_orm8.is)(column, import_pg_core4.PgInteger) || (0, import_drizzle_orm8.is)(column, import_pg_core4.PgSerial) || (0, import_drizzle_orm8.is)(column, import_mysql_core4.MySqlInt) || (0, import_drizzle_orm8.is)(column, import_mysql_core4.MySqlSerial) || (0, import_drizzle_orm8.is)(column, import_sqlite_core4.SQLiteInteger)) {
|
|
2263
|
+
baseType = "Int";
|
|
2264
|
+
} else {
|
|
2265
|
+
baseType = "Float";
|
|
2266
|
+
}
|
|
2267
|
+
break;
|
|
2268
|
+
case "buffer":
|
|
2269
|
+
baseType = "[Int!]";
|
|
2270
|
+
break;
|
|
2271
|
+
case "array":
|
|
2272
|
+
if (column.columnType === "PgVector") {
|
|
2273
|
+
baseType = "[Float!]";
|
|
2274
|
+
} else if (column.columnType === "PgGeometry") {
|
|
2275
|
+
baseType = "[Float!]";
|
|
2276
|
+
} else {
|
|
2277
|
+
const scalarName = `${capitalize(tableName)}${capitalize(
|
|
2278
|
+
columnName
|
|
2279
|
+
)}Array`;
|
|
2280
|
+
baseType = scalarName;
|
|
2281
|
+
customScalars.add(scalarName);
|
|
2282
|
+
}
|
|
2283
|
+
break;
|
|
2284
|
+
case "custom":
|
|
2285
|
+
default:
|
|
2286
|
+
if (column.columnType) {
|
|
2287
|
+
baseType = column.columnType;
|
|
2288
|
+
customScalars.add(column.columnType);
|
|
2289
|
+
} else {
|
|
2290
|
+
const customScalarName = `${capitalize(tableName)}${capitalize(
|
|
2291
|
+
columnName
|
|
2292
|
+
)}`;
|
|
2293
|
+
baseType = customScalarName;
|
|
2294
|
+
customScalars.add(customScalarName);
|
|
2295
|
+
}
|
|
2296
|
+
break;
|
|
2297
|
+
}
|
|
2292
2298
|
}
|
|
2293
2299
|
}
|
|
2294
2300
|
if (!forceNullable && column.notNull) {
|
|
@@ -2345,6 +2351,53 @@ var generateTypeDefs = (tables, relations) => {
|
|
|
2345
2351
|
customScalars.clear();
|
|
2346
2352
|
enumDefinitions.clear();
|
|
2347
2353
|
requiredFieldFilters.clear();
|
|
2354
|
+
foreignKeyTypes.clear();
|
|
2355
|
+
for (const [tableName, tableRelations] of Object.entries(relations)) {
|
|
2356
|
+
const tableInfo = tables[tableName];
|
|
2357
|
+
if (!tableInfo)
|
|
2358
|
+
continue;
|
|
2359
|
+
for (const [relationName, relationInfo] of Object.entries(tableRelations)) {
|
|
2360
|
+
const relation = relationInfo.relation;
|
|
2361
|
+
if (!(0, import_drizzle_orm8.is)(relation, import_drizzle_orm8.One))
|
|
2362
|
+
continue;
|
|
2363
|
+
const config = relation.config;
|
|
2364
|
+
if (!config?.fields || !config?.references)
|
|
2365
|
+
continue;
|
|
2366
|
+
const referencedTableName = relationInfo.targetTableName;
|
|
2367
|
+
const referencedTable = tables[referencedTableName];
|
|
2368
|
+
if (!referencedTable)
|
|
2369
|
+
continue;
|
|
2370
|
+
for (let i = 0; i < config.fields.length; i++) {
|
|
2371
|
+
const field = config.fields[i];
|
|
2372
|
+
const reference = config.references[i];
|
|
2373
|
+
if (!field || !reference)
|
|
2374
|
+
continue;
|
|
2375
|
+
const fieldColumnName = field.name;
|
|
2376
|
+
const referenceColumnName = reference.name;
|
|
2377
|
+
const foreignKeyColumn = Object.values(tableInfo.columns).find(
|
|
2378
|
+
(col) => col.name === fieldColumnName
|
|
2379
|
+
);
|
|
2380
|
+
const referencedColumn = Object.values(referencedTable.columns).find(
|
|
2381
|
+
(col) => col.name === referenceColumnName
|
|
2382
|
+
);
|
|
2383
|
+
if (!foreignKeyColumn || !referencedColumn)
|
|
2384
|
+
continue;
|
|
2385
|
+
const foreignKeyPropertyName = Object.keys(tableInfo.columns).find(
|
|
2386
|
+
(key) => tableInfo.columns[key] === foreignKeyColumn
|
|
2387
|
+
);
|
|
2388
|
+
if (!foreignKeyPropertyName)
|
|
2389
|
+
continue;
|
|
2390
|
+
const referencedCustomType = referencedColumn.customGraphqlType;
|
|
2391
|
+
const foreignKeyHasCustomType = !!foreignKeyColumn.customGraphqlType;
|
|
2392
|
+
if (referencedCustomType && !foreignKeyHasCustomType) {
|
|
2393
|
+
foreignKeyTypes.set(
|
|
2394
|
+
`${tableName}.${foreignKeyPropertyName}`,
|
|
2395
|
+
referencedCustomType
|
|
2396
|
+
);
|
|
2397
|
+
}
|
|
2398
|
+
}
|
|
2399
|
+
}
|
|
2400
|
+
}
|
|
2348
2401
|
for (const [tableName, tableInfo] of Object.entries(tables)) {
|
|
2349
2402
|
const typeName = capitalize(tableName);
|
|
2350
2403
|
const fields = [];
|
|
@@ -2500,7 +2553,7 @@ var generateQueryTypeDefs = (tables) => {
|
|
|
2500
2553
|
for (const tableName of Object.keys(tables)) {
|
|
2501
2554
|
const typeName = capitalize(tableName);
|
|
2502
2555
|
queryFields.push(
|
|
2503
|
-
` ${tableName}(where: ${typeName}Filters, orderBy: ${typeName}OrderBy, limit: Int, offset: Int): [${typeName}!]!`
|
|
2556
|
+
` ${tableName}FindMany(where: ${typeName}Filters, orderBy: ${typeName}OrderBy, limit: Int, offset: Int): [${typeName}!]!`
|
|
2504
2557
|
);
|
|
2505
2558
|
}
|
|
2506
2559
|
return `type Query {
|
|
@@ -2512,13 +2565,13 @@ var generateMutationTypeDefs = (tables) => {
|
|
|
2512
2565
|
for (const tableName of Object.keys(tables)) {
|
|
2513
2566
|
const typeName = capitalize(tableName);
|
|
2514
2567
|
mutationFields.push(
|
|
2515
|
-
`
|
|
2568
|
+
` ${tableName}InsertMany(values: [${typeName}InsertInput!]!): [${typeName}!]!`
|
|
2516
2569
|
);
|
|
2517
2570
|
mutationFields.push(
|
|
2518
|
-
`
|
|
2571
|
+
` ${tableName}UpdateMany(where: ${typeName}Filters, set: ${typeName}UpdateInput!): [${typeName}!]!`
|
|
2519
2572
|
);
|
|
2520
2573
|
mutationFields.push(
|
|
2521
|
-
`
|
|
2574
|
+
` ${tableName}DeleteMany(where: ${typeName}Filters): [${typeName}!]!`
|
|
2522
2575
|
);
|
|
2523
2576
|
}
|
|
2524
2577
|
return `type Mutation {
|
|
@@ -2727,6 +2780,41 @@ var extractRelationsParams2 = (relationMap, tables, tableName, fields) => {
|
|
|
2727
2780
|
}
|
|
2728
2781
|
return Object.keys(args).length > 0 ? args : void 0;
|
|
2729
2782
|
};
|
|
2783
|
+
var createQueryResolver = (queryBase, tableInfo, tables, relations) => {
|
|
2784
|
+
return async (parent, args, context, info) => {
|
|
2785
|
+
try {
|
|
2786
|
+
const { where, orderBy, limit, offset } = args;
|
|
2787
|
+
const parsedInfo = (0, import_graphql_parse_resolve_info4.parseResolveInfo)(info, {
|
|
2788
|
+
deep: true
|
|
2789
|
+
});
|
|
2790
|
+
const allFields = {};
|
|
2791
|
+
if (parsedInfo.fieldsByTypeName) {
|
|
2792
|
+
for (const fields of Object.values(parsedInfo.fieldsByTypeName)) {
|
|
2793
|
+
Object.assign(allFields, fields);
|
|
2794
|
+
}
|
|
2795
|
+
}
|
|
2796
|
+
const result = await queryBase.findMany({
|
|
2797
|
+
columns: extractSelectedColumns(allFields, tableInfo),
|
|
2798
|
+
offset,
|
|
2799
|
+
limit,
|
|
2800
|
+
orderBy: buildOrderByClause(tableInfo, orderBy),
|
|
2801
|
+
where: buildWhereClause(tableInfo, where),
|
|
2802
|
+
with: extractRelationsParams2(
|
|
2803
|
+
relations,
|
|
2804
|
+
tables,
|
|
2805
|
+
tableInfo.name,
|
|
2806
|
+
allFields
|
|
2807
|
+
)
|
|
2808
|
+
});
|
|
2809
|
+
return result;
|
|
2810
|
+
} catch (e) {
|
|
2811
|
+
if (typeof e === "object" && e !== null && "message" in e) {
|
|
2812
|
+
throw new import_graphql8.GraphQLError(String(e.message));
|
|
2813
|
+
}
|
|
2814
|
+
throw e;
|
|
2815
|
+
}
|
|
2816
|
+
};
|
|
2817
|
+
};
|
|
2730
2818
|
var generateQueries = (db, tables, relations) => {
|
|
2731
2819
|
const queries = {};
|
|
2732
2820
|
for (const [tableName, tableInfo] of Object.entries(tables)) {
|
|
@@ -2736,34 +2824,12 @@ var generateQueries = (db, tables, relations) => {
|
|
|
2736
2824
|
`Drizzle-GraphQL Error: Table ${tableName} not found in drizzle instance. Did you forget to pass schema to drizzle constructor?`
|
|
2737
2825
|
);
|
|
2738
2826
|
}
|
|
2739
|
-
queries[tableName] =
|
|
2740
|
-
|
|
2741
|
-
|
|
2742
|
-
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
const allFields = {};
|
|
2746
|
-
if (parsedInfo.fieldsByTypeName) {
|
|
2747
|
-
for (const fields of Object.values(parsedInfo.fieldsByTypeName)) {
|
|
2748
|
-
Object.assign(allFields, fields);
|
|
2749
|
-
}
|
|
2750
|
-
}
|
|
2751
|
-
const result = await queryBase.findMany({
|
|
2752
|
-
columns: extractSelectedColumns(allFields, tableInfo),
|
|
2753
|
-
offset,
|
|
2754
|
-
limit,
|
|
2755
|
-
orderBy: buildOrderByClause(tableInfo, orderBy),
|
|
2756
|
-
where: buildWhereClause(tableInfo, where),
|
|
2757
|
-
with: extractRelationsParams2(relations, tables, tableName, allFields)
|
|
2758
|
-
});
|
|
2759
|
-
return result;
|
|
2760
|
-
} catch (e) {
|
|
2761
|
-
if (typeof e === "object" && e !== null && "message" in e) {
|
|
2762
|
-
throw new import_graphql8.GraphQLError(String(e.message));
|
|
2763
|
-
}
|
|
2764
|
-
throw e;
|
|
2765
|
-
}
|
|
2766
|
-
};
|
|
2827
|
+
queries[`${tableName}FindMany`] = createQueryResolver(
|
|
2828
|
+
queryBase,
|
|
2829
|
+
tableInfo,
|
|
2830
|
+
tables,
|
|
2831
|
+
relations
|
|
2832
|
+
);
|
|
2767
2833
|
}
|
|
2768
2834
|
return queries;
|
|
2769
2835
|
};
|
|
@@ -2811,11 +2877,31 @@ var buildWhereClause2 = (tableInfo, where) => {
|
|
|
2811
2877
|
return conditions[0];
|
|
2812
2878
|
return (0, import_drizzle_orm10.and)(...conditions);
|
|
2813
2879
|
};
|
|
2814
|
-
var generateMutations = (db, tables) => {
|
|
2880
|
+
var generateMutations = (db, tables, relations) => {
|
|
2815
2881
|
const mutations = {};
|
|
2816
2882
|
for (const [tableName, tableInfo] of Object.entries(tables)) {
|
|
2817
2883
|
const capitalizedName = capitalize(tableName);
|
|
2818
|
-
|
|
2884
|
+
const queryBase = db.query[tableName];
|
|
2885
|
+
if (!queryBase) {
|
|
2886
|
+
throw new Error(
|
|
2887
|
+
`Drizzle-GraphQL Error: Table ${tableName} not found in drizzle instance. Did you forget to pass schema to drizzle constructor?`
|
|
2888
|
+
);
|
|
2889
|
+
}
|
|
2890
|
+
const primaryKeyColumn = Object.values(tableInfo.columns).find(
|
|
2891
|
+
(col) => col.primary || col.name === "id"
|
|
2892
|
+
);
|
|
2893
|
+
if (!primaryKeyColumn) {
|
|
2894
|
+
throw new Error(
|
|
2895
|
+
`Drizzle-GraphQL Error: Table ${tableName} does not have a primary key column`
|
|
2896
|
+
);
|
|
2897
|
+
}
|
|
2898
|
+
const queryResolver = createQueryResolver(
|
|
2899
|
+
queryBase,
|
|
2900
|
+
tableInfo,
|
|
2901
|
+
tables,
|
|
2902
|
+
relations
|
|
2903
|
+
);
|
|
2904
|
+
mutations[`${tableName}InsertMany`] = async (parent, args, context, info) => {
|
|
2819
2905
|
try {
|
|
2820
2906
|
const { values } = args;
|
|
2821
2907
|
if (!values || values.length === 0) {
|
|
@@ -2825,8 +2911,20 @@ var generateMutations = (db, tables) => {
|
|
|
2825
2911
|
values,
|
|
2826
2912
|
tableInfo.table
|
|
2827
2913
|
);
|
|
2828
|
-
const
|
|
2829
|
-
|
|
2914
|
+
const insertedRows = await db.insert(tableInfo.table).values(remappedValues).returning();
|
|
2915
|
+
const insertedIds = insertedRows.map(
|
|
2916
|
+
(row) => row[primaryKeyColumn.name]
|
|
2917
|
+
);
|
|
2918
|
+
return queryResolver(
|
|
2919
|
+
parent,
|
|
2920
|
+
{
|
|
2921
|
+
where: {
|
|
2922
|
+
[primaryKeyColumn.name]: { inArray: insertedIds }
|
|
2923
|
+
}
|
|
2924
|
+
},
|
|
2925
|
+
context,
|
|
2926
|
+
info
|
|
2927
|
+
);
|
|
2830
2928
|
} catch (e) {
|
|
2831
2929
|
if (typeof e === "object" && e !== null && "message" in e) {
|
|
2832
2930
|
throw new import_graphql9.GraphQLError(String(e.message));
|
|
@@ -2834,7 +2932,7 @@ var generateMutations = (db, tables) => {
|
|
|
2834
2932
|
throw e;
|
|
2835
2933
|
}
|
|
2836
2934
|
};
|
|
2837
|
-
mutations[
|
|
2935
|
+
mutations[`${tableName}UpdateMany`] = async (parent, args, context, info) => {
|
|
2838
2936
|
try {
|
|
2839
2937
|
const { where, set } = args;
|
|
2840
2938
|
if (!set || Object.keys(set).length === 0) {
|
|
@@ -2846,8 +2944,20 @@ var generateMutations = (db, tables) => {
|
|
|
2846
2944
|
if (whereClause) {
|
|
2847
2945
|
query = query.where(whereClause);
|
|
2848
2946
|
}
|
|
2849
|
-
const
|
|
2850
|
-
|
|
2947
|
+
const updatedRows = await query.returning();
|
|
2948
|
+
const updatedIds = updatedRows.map(
|
|
2949
|
+
(row) => row[primaryKeyColumn.name]
|
|
2950
|
+
);
|
|
2951
|
+
return queryResolver(
|
|
2952
|
+
parent,
|
|
2953
|
+
{
|
|
2954
|
+
where: {
|
|
2955
|
+
[primaryKeyColumn.name]: { inArray: updatedIds }
|
|
2956
|
+
}
|
|
2957
|
+
},
|
|
2958
|
+
context,
|
|
2959
|
+
info
|
|
2960
|
+
);
|
|
2851
2961
|
} catch (e) {
|
|
2852
2962
|
if (typeof e === "object" && e !== null && "message" in e) {
|
|
2853
2963
|
throw new import_graphql9.GraphQLError(String(e.message));
|
|
@@ -2855,7 +2965,7 @@ var generateMutations = (db, tables) => {
|
|
|
2855
2965
|
throw e;
|
|
2856
2966
|
}
|
|
2857
2967
|
};
|
|
2858
|
-
mutations[
|
|
2968
|
+
mutations[`${tableName}DeleteMany`] = async (parent, args, context, info) => {
|
|
2859
2969
|
try {
|
|
2860
2970
|
const { where } = args;
|
|
2861
2971
|
const whereClause = buildWhereClause2(tableInfo, where);
|
|
@@ -2896,7 +3006,7 @@ var buildSchemaSDL = (db, config) => {
|
|
|
2896
3006
|
typeDefsArray.push(generateMutationTypeDefs(tables));
|
|
2897
3007
|
const typeDefs = typeDefsArray.join("\n\n");
|
|
2898
3008
|
const queries = generateQueries(db, tables, relations);
|
|
2899
|
-
const mutations = generateMutations(db, tables);
|
|
3009
|
+
const mutations = generateMutations(db, tables, relations);
|
|
2900
3010
|
return {
|
|
2901
3011
|
typeDefs,
|
|
2902
3012
|
resolvers: {
|