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 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
- switch (column.dataType) {
2218
- case "boolean":
2219
- baseType = "Boolean";
2220
- break;
2221
- case "json":
2222
- if (column.columnType === "PgGeometryObject") {
2223
- baseType = "PgGeometryObject";
2224
- customScalars.add("PgGeometryObject");
2225
- } else {
2226
- baseType = "JSON";
2227
- customScalars.add("JSON");
2228
- }
2229
- break;
2230
- case "date":
2231
- baseType = "Date";
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
- } else {
2249
- baseType = "String";
2250
- }
2251
- break;
2252
- case "bigint":
2253
- baseType = "BigInt";
2254
- customScalars.add("BigInt");
2255
- break;
2256
- case "number":
2257
- 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)) {
2258
- baseType = "Int";
2259
- } else {
2260
- baseType = "Float";
2261
- }
2262
- break;
2263
- case "buffer":
2264
- baseType = "[Int!]";
2265
- break;
2266
- case "array":
2267
- if (column.columnType === "PgVector") {
2268
- baseType = "[Float!]";
2269
- } else if (column.columnType === "PgGeometry") {
2270
- baseType = "[Float!]";
2271
- } else {
2272
- const scalarName = `${capitalize(tableName)}${capitalize(
2273
- columnName
2274
- )}Array`;
2275
- baseType = scalarName;
2276
- customScalars.add(scalarName);
2277
- }
2278
- break;
2279
- case "custom":
2280
- default:
2281
- if (column.columnType) {
2282
- baseType = column.columnType;
2283
- customScalars.add(column.columnType);
2284
- } else {
2285
- const customScalarName = `${capitalize(tableName)}${capitalize(
2286
- columnName
2287
- )}`;
2288
- baseType = customScalarName;
2289
- customScalars.add(customScalarName);
2290
- }
2291
- break;
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
- ` insert${typeName}(values: [${typeName}InsertInput!]!): [${typeName}!]!`
2568
+ ` ${tableName}InsertMany(values: [${typeName}InsertInput!]!): [${typeName}!]!`
2516
2569
  );
2517
2570
  mutationFields.push(
2518
- ` update${typeName}(where: ${typeName}Filters, set: ${typeName}UpdateInput!): [${typeName}!]!`
2571
+ ` ${tableName}UpdateMany(where: ${typeName}Filters, set: ${typeName}UpdateInput!): [${typeName}!]!`
2519
2572
  );
2520
2573
  mutationFields.push(
2521
- ` delete${typeName}(where: ${typeName}Filters): [${typeName}!]!`
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] = async (parent, args, context, info) => {
2740
- try {
2741
- const { where, orderBy, limit, offset } = args;
2742
- const parsedInfo = (0, import_graphql_parse_resolve_info4.parseResolveInfo)(info, {
2743
- deep: true
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
- mutations[`insert${capitalizedName}`] = async (parent, args, context, info) => {
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 result = await db.insert(tableInfo.table).values(remappedValues).returning();
2829
- return result;
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[`update${capitalizedName}`] = async (parent, args, context, info) => {
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 result = await query.returning();
2850
- return result;
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[`delete${capitalizedName}`] = async (parent, args, context, info) => {
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: {