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.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
- switch (column.dataType) {
2273
- case "boolean":
2274
- baseType = "Boolean";
2275
- break;
2276
- case "json":
2277
- if (column.columnType === "PgGeometryObject") {
2278
- baseType = "PgGeometryObject";
2279
- customScalars.add("PgGeometryObject");
2280
- } else {
2281
- baseType = "JSON";
2282
- customScalars.add("JSON");
2283
- }
2284
- break;
2285
- case "date":
2286
- baseType = "Date";
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
- } else {
2304
- baseType = "String";
2305
- }
2306
- break;
2307
- case "bigint":
2308
- baseType = "BigInt";
2309
- customScalars.add("BigInt");
2310
- break;
2311
- case "number":
2312
- if (is7(column, PgInteger2) || is7(column, PgSerial2) || is7(column, MySqlInt2) || is7(column, MySqlSerial2) || is7(column, SQLiteInteger2)) {
2313
- baseType = "Int";
2314
- } else {
2315
- baseType = "Float";
2316
- }
2317
- break;
2318
- case "buffer":
2319
- baseType = "[Int!]";
2320
- break;
2321
- case "array":
2322
- if (column.columnType === "PgVector") {
2323
- baseType = "[Float!]";
2324
- } else if (column.columnType === "PgGeometry") {
2325
- baseType = "[Float!]";
2326
- } else {
2327
- const scalarName = `${capitalize(tableName)}${capitalize(
2328
- columnName
2329
- )}Array`;
2330
- baseType = scalarName;
2331
- customScalars.add(scalarName);
2332
- }
2333
- break;
2334
- case "custom":
2335
- default:
2336
- if (column.columnType) {
2337
- baseType = column.columnType;
2338
- customScalars.add(column.columnType);
2339
- } else {
2340
- const customScalarName = `${capitalize(tableName)}${capitalize(
2341
- columnName
2342
- )}`;
2343
- baseType = customScalarName;
2344
- customScalars.add(customScalarName);
2345
- }
2346
- break;
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
- ` insert${typeName}(values: [${typeName}InsertInput!]!): [${typeName}!]!`
2623
+ ` ${tableName}InsertMany(values: [${typeName}InsertInput!]!): [${typeName}!]!`
2571
2624
  );
2572
2625
  mutationFields.push(
2573
- ` update${typeName}(where: ${typeName}Filters, set: ${typeName}UpdateInput!): [${typeName}!]!`
2626
+ ` ${tableName}UpdateMany(where: ${typeName}Filters, set: ${typeName}UpdateInput!): [${typeName}!]!`
2574
2627
  );
2575
2628
  mutationFields.push(
2576
- ` delete${typeName}(where: ${typeName}Filters): [${typeName}!]!`
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] = async (parent, args, context, info) => {
2814
- try {
2815
- const { where, orderBy, limit, offset } = args;
2816
- const parsedInfo = parseResolveInfo4(info, {
2817
- deep: true
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
- mutations[`insert${capitalizedName}`] = async (parent, args, context, info) => {
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 result = await db.insert(tableInfo.table).values(remappedValues).returning();
2903
- return result;
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[`update${capitalizedName}`] = async (parent, args, context, info) => {
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 result = await query.returning();
2924
- return result;
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[`delete${capitalizedName}`] = async (parent, args, context, info) => {
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: {