{"version":3,"file":"index.mjs","names":["makeDefaultName","packagejson.version","createYoga","nativeCreateYoga"],"sources":["../lib/types/rumbleError.ts","../lib/helpers/asserts.ts","../lib/helpers/mapNullFieldsToUndefined.ts","../package.json","../lib/helpers/mergeFilters.ts","../lib/helpers/sqlTypes/types.ts","../lib/helpers/sqlTypes/distinctValuesFromSQLType.ts","../lib/helpers/tableHelpers.ts","../lib/abilityBuilder.ts","../lib/args/orderArg.ts","../lib/enum.ts","../lib/helpers/sqlTypes/mapSQLTypeToTSType.ts","../lib/args/whereArg.ts","../lib/client/client.ts","../lib/context.ts","../lib/helpers/protoMapper.ts","../lib/countQuery.ts","../lib/helpers/sofaOpenAPIWebhookDocs.ts","../lib/helpers/sqlTypes/mapDrizzleTypeToGraphQlType.ts","../lib/helpers/determineDialectFromSchema.ts","../lib/search.ts","../lib/object.ts","../lib/pubsub.ts","../lib/query.ts","../lib/args/whereArgsImplementer.ts","../lib/runtimeFiltersPlugin/filterTypes.ts","../lib/runtimeFiltersPlugin/runtimeFiltersPlugin.ts","../lib/schemaBuilder.ts","../lib/rumble.ts"],"sourcesContent":["import { GraphQLError } from \"graphql\";\n/**\n * An error that gets raised by rumble whenever something does not go according to plan.\n * Mostly internals, configuration errors or other unexpected things.\n */\nexport class RumbleError extends Error {\n  constructor(message: string) {\n    super(message);\n    this.name = \"RumbleError\";\n  }\n}\n\n/**\n * An error that gets raised by rumble whenever an error occurs in a resolver, containing\n * information safely exposeable to the user.\n * E.g. the assert helpers issue these.\n */\nexport class RumbleErrorSafe extends GraphQLError {}\n","import { RumbleErrorSafe } from \"../types/rumbleError\";\n\n/**\n *\n * Helper function to map a drizzle findFirst query result,\n * which may be optional, to a correct drizzle type.\n *\n * @throws RumbleError\n *\n * @example\n *\n * ```ts\n * schemaBuilder.queryFields((t) => {\n   return {\n     findFirstUser: t.drizzleField({\n       type: UserRef,\n       resolve: (query, root, args, ctx, info) => {\n         return (\n           db.query.users\n             .findFirst({\n               ...query,\n               where: ctx.abilities.users.filter(\"read\").single.where,\n             })\n             // note that we need to manually raise an error if the value is not found\n             .then(assertFindFirstExists)\n         );\n       },\n     }),\n   };\n });\n * ```\n */\nexport const assertFindFirstExists = <T>(value: T | undefined): T => {\n  if (!value) {\n    throw new RumbleErrorSafe(\"Value not found but required (findFirst)\");\n  }\n  return value;\n};\n\n/**\n *\n * Helper function to map a drizzle findFirst query result,\n * which may be optional, to a correct drizzle type.\n *\n * @throws RumbleError\n *\n * @example\n *\n * ```ts\n  schemaBuilder.mutationFields((t) => {\n    return {\n      updateUsername: t.drizzleField({\n        type: UserRef,\n        args: {\n          userId: t.arg.int({ required: true }),\n          newName: t.arg.string({ required: true }),\n        },\n        resolve: (query, root, args, ctx, info) => {\n          return db\n            .update(schema.users)\n            .set({\n              name: args.newName,\n            })\n            .where(\n              and(\n                eq(schema.users.id, args.userId),\n                ctx.abilities.users.filter(\"update\").single.where\n              )\n            )\n            .returning({ id: schema.users.id, name: schema.users.name })\n        // note that we need to manually raise an error if the value is not found\n            .then(assertFirstEntryExists);\n        },\n      }),\n    };\n  });\n * ```\n */\nexport const assertFirstEntryExists = <T>(value: T[]): T => {\n  const v = value.at(0);\n  if (!v)\n    throw new RumbleErrorSafe(\"Value not found but required (firstEntry)\");\n  return v;\n};\n","/**\n * Helper to map null fields to undefined\n * @param obj The object to map\n * @returns The mapped object with all fields of 'null' transformed to 'undefined'\n * \n * This becomes useful for update mutations where you do not want to pass null (unset value in db)\n * but undefined (do not touch value in db) in case of a value not beeing set in the args of said mutation\n * @example\n * ```ts\n *  updateUser: t.drizzleField({\n      type: User,\n      args: {\n        id: t.arg.string({ required: true }),\n        email: t.arg.string(),\n        lastName: t.arg.string(),\n        firstName: t.arg.string(),\n      },\n      resolve: async (query, root, args, ctx, info) => {\n        const mappedArgs = mapNullFieldsToUndefined(args);\n        const user = await db.transaction(async (tx) => {\n          const user = await tx\n            .update(schema.user)\n            .set({\n\n              // email: args.email ?? undefined,\n              // lastName: args.lastName ?? undefined,\n              // firstName: args.firstName ?? undefined,\n\n              // becomes this\n\n              email: mappedArgs.email,\n              lastName: mappedArgs.lastName,\n              firstName: mappedArgs.firstName,\n            })\n            .returning()\n            .then(assertFirstEntryExists);\n          return user;\n        });\n\n        pubsub.updated(user.id);\n\n        return db.query.user\n          .findFirst(\n            query(\n              ctx.abilities.user.filter('read').merge(\n                {\n                  where: { id: user.id },\n                }\n              1).query.single,\n            ),\n          )\n          .then(assertFindFirstExists);\n      },\n    }),\n * \n * \n * ```\n */\nexport function mapNullFieldsToUndefined<T extends object>(obj: T) {\n  return Object.fromEntries(\n    Object.entries(obj).map(([key, value]) => [\n      key,\n      value === null ? undefined : value,\n    ]),\n  ) as {\n    [K in keyof T]: T[K] extends null ? undefined : Exclude<T[K], null>;\n  };\n}\n","","import { toMerged } from \"es-toolkit\";\n\nexport function mergeFilters<\n  FilterA extends Record<string, any>,\n  FilterB extends Record<string, any>,\n>(\n  filterA?: Partial<FilterA>,\n  filterB?: Partial<FilterB>,\n  mode: \"AND\" | \"OR\" = \"AND\",\n) {\n  const where =\n    filterA?.where && filterB?.where\n      ? mode === \"OR\"\n        ? { OR: [filterA.where, filterB.where] }\n        : { AND: [filterA.where, filterB.where] }\n      : (filterA?.where ?? filterB?.where);\n\n  const columns =\n    filterA?.columns || filterB?.columns\n      ? new Set(\n          [\n            Object.entries(filterA?.columns ?? {}),\n            Object.entries(filterB?.columns ?? {}),\n          ]\n            .flat()\n            .filter(([, v]) => v === true)\n            .map(([k]) => k),\n        )\n          .entries()\n          .reduce(\n            (acc, [key]) => {\n              acc[key] = true;\n              return acc;\n            },\n            {} as Record<string, true>,\n          )\n      : undefined;\n\n  const extras =\n    filterA?.extras || filterB?.extras\n      ? toMerged(filterA?.extras ?? {}, filterB?.extras ?? {})\n      : undefined;\n\n  const orderBy =\n    filterA?.orderBy || filterB?.orderBy\n      ? toMerged(filterA?.orderBy ?? {}, filterB?.orderBy ?? {})\n      : undefined;\n\n  const limit =\n    mode === \"OR\"\n      ? filterA?.limit === undefined || filterB?.limit === undefined\n        ? undefined\n        : Math.max(filterA.limit, filterB.limit)\n      : filterA?.limit || filterB?.limit\n        ? Math.min(filterA?.limit ?? Infinity, filterB?.limit ?? Infinity)\n        : undefined;\n\n  const offset =\n    mode === \"OR\"\n      ? filterA?.offset === undefined || filterB?.offset === undefined\n        ? undefined\n        : Math.min(filterA.offset, filterB.offset)\n      : filterA?.offset || filterB?.offset\n        ? Math.min(filterA?.offset ?? Infinity, filterB?.offset ?? Infinity)\n        : undefined;\n\n  const with_ =\n    filterA?.with || filterB?.with\n      ? toMerged(filterA?.with ?? {}, filterB?.with ?? {})\n      : undefined;\n\n  return {\n    where,\n    columns,\n    extras,\n    orderBy,\n    limit,\n    offset,\n    with: with_,\n  } as unknown as FilterA & FilterB;\n}\n","import { RumbleError } from \"../../types/rumbleError\";\n\nconst intLikeSQLTypeStrings = [\n  \"serial\",\n  \"int\",\n  \"integer\",\n  \"tinyint\",\n  \"smallint\",\n  \"mediumint\",\n] as const;\n\nexport function isIntLikeSQLTypeString(\n  sqlType: string,\n): sqlType is (typeof intLikeSQLTypeStrings)[number] {\n  return intLikeSQLTypeStrings.includes(sqlType as any);\n}\n\nconst floatLikeSQLTypeStrings = [\n  \"real\",\n  \"decimal\",\n  \"double\",\n  \"float\",\n  \"numeric\",\n] as const;\n\nexport function isFloatLikeSQLTypeString(\n  sqlType: string,\n): sqlType is (typeof floatLikeSQLTypeStrings)[number] {\n  return floatLikeSQLTypeStrings.includes(sqlType as any);\n}\n\nconst stringLikeSQLTypeStrings = [\n  \"string\",\n  \"text\",\n  \"varchar\",\n  \"char\",\n  \"text(256)\",\n] as const;\n\nexport function isStringLikeSQLTypeString(\n  sqlType: string,\n): sqlType is (typeof stringLikeSQLTypeStrings)[number] {\n  return stringLikeSQLTypeStrings.includes(sqlType as any);\n}\n\nconst IDLikeSQLTypeStrings = [\"uuid\"] as const;\n\nexport function isIDLikeSQLTypeString(\n  sqlType: string,\n): sqlType is (typeof IDLikeSQLTypeStrings)[number] {\n  return IDLikeSQLTypeStrings.includes(sqlType as any);\n}\n\nconst booleanSQLTypeStrings = [\"boolean\"] as const;\n\nexport function isBooleanSQLTypeString(\n  sqlType: string,\n): sqlType is (typeof booleanSQLTypeStrings)[number] {\n  return booleanSQLTypeStrings.includes(sqlType as any);\n}\n\nconst dateTimeLikeSQLTypeStrings = [\"timestamp\", \"datetime\"] as const;\n\nexport function isDateTimeLikeSQLTypeString(\n  sqlType: string,\n): sqlType is (typeof dateTimeLikeSQLTypeStrings)[number] {\n  return dateTimeLikeSQLTypeStrings.includes(sqlType as any);\n}\n\nconst dateLikeSQLTypeStrings = [\"date\"] as const;\n\nexport function isDateLikeSQLTypeString(\n  sqlType: string,\n): sqlType is (typeof dateLikeSQLTypeStrings)[number] {\n  return dateLikeSQLTypeStrings.includes(sqlType as any);\n}\n\nconst jsonLikeSQLTypeStrings = [\"json\", \"jsonb\"] as const;\n\nexport function isJSONLikeSQLTypeString(\n  sqlType: string,\n): sqlType is (typeof jsonLikeSQLTypeStrings)[number] {\n  return jsonLikeSQLTypeStrings.includes(sqlType as any);\n}\n\nconst possibleSQLTypesStrings = [\n  ...intLikeSQLTypeStrings,\n  ...floatLikeSQLTypeStrings,\n  ...stringLikeSQLTypeStrings,\n  ...IDLikeSQLTypeStrings,\n  ...booleanSQLTypeStrings,\n  ...dateTimeLikeSQLTypeStrings,\n  ...dateLikeSQLTypeStrings,\n  ...jsonLikeSQLTypeStrings,\n] as const;\n\nexport type PossibleSQLType = (typeof possibleSQLTypesStrings)[number];\n\nexport const UnknownTypeRumbleError = (\n  sqlType: string,\n  additionalInfo?: string,\n) =>\n  new RumbleError(\n    `RumbleError: Unknown SQL type '${sqlType}'. Please open an issue (https://github.com/m1212e/rumble/issues) so it can be added. (${additionalInfo})`,\n  );\n","import {\n  isBooleanSQLTypeString,\n  isDateLikeSQLTypeString,\n  isDateTimeLikeSQLTypeString,\n  isFloatLikeSQLTypeString,\n  isIDLikeSQLTypeString,\n  isIntLikeSQLTypeString,\n  isJSONLikeSQLTypeString,\n  isStringLikeSQLTypeString,\n  type PossibleSQLType,\n  UnknownTypeRumbleError,\n} from \"./types\";\n\nexport function createDistinctValuesFromSQLType(sqlType: PossibleSQLType): {\n  value1: any;\n  value2: any;\n} {\n  if (isIntLikeSQLTypeString(sqlType)) {\n    return {\n      value1: 1,\n      value2: 2,\n    };\n  }\n\n  if (isFloatLikeSQLTypeString(sqlType)) {\n    return {\n      value1: 1.1,\n      value2: 2.2,\n    };\n  }\n\n  if (isStringLikeSQLTypeString(sqlType)) {\n    return {\n      value1: \"a\",\n      value2: \"b\",\n    };\n  }\n\n  if (isIDLikeSQLTypeString(sqlType)) {\n    return {\n      value1: \"fba31870-5528-42d7-b27e-2e5ee657aea5\",\n      value2: \"fc65db81-c2d1-483d-8a25-a30e2cf6e02d\",\n    };\n  }\n\n  if (isBooleanSQLTypeString(sqlType)) {\n    return {\n      value1: true,\n      value2: false,\n    };\n  }\n\n  if (isDateTimeLikeSQLTypeString(sqlType)) {\n    return {\n      value1: new Date(2022, 1, 1),\n      value2: new Date(2022, 1, 2),\n    };\n  }\n\n  if (isDateLikeSQLTypeString(sqlType)) {\n    return {\n      value1: new Date(2022, 1, 1),\n      value2: new Date(2022, 1, 2),\n    };\n  }\n\n  if (isJSONLikeSQLTypeString(sqlType)) {\n    return {\n      value1: { a: 1 },\n      value2: { b: 2 },\n    };\n  }\n\n  throw UnknownTypeRumbleError(sqlType, \"Distinct\");\n}\n","import {\n  type Column,\n  getTableColumns,\n  getTableName,\n  is,\n  isTable,\n  type Many,\n  type One,\n  type Table,\n} from \"drizzle-orm\";\nimport type { DrizzleInstance } from \"../types/drizzleInstanceType\";\nimport { RumbleError } from \"../types/rumbleError\";\n\ntype RelationEntry = {\n  /** TS-level key in db._.relations (i.e. the export name) */\n  name: string;\n  /** runtime DB table name as returned by getTableName(table) */\n  dbName: string;\n  /** the underlying drizzle Table object */\n  table: any;\n  /** columns map for the table */\n  columns: Record<string, Column>;\n  /** primary key columns, keyed by column ts-name */\n  primaryKey: Record<string, Column>;\n  /** named relations record (one/many) for this table */\n  relations: Record<string, One<any, any> | Many<any>>;\n  /**\n   * The raw entry from db._.relations — preserved for callers that previously\n   * read `foundRelation` off tableHelper().\n   */\n  foundRelation: any;\n};\n\ntype TableIndex = {\n  byTsName: Map<string, RelationEntry>;\n  byDbName: Map<string, RelationEntry>;\n  byTableRef: Map<any, RelationEntry>;\n};\n\nconst indexCache = new WeakMap<object, TableIndex>();\n\nfunction buildIndex<DB extends DrizzleInstance>(db: DB): TableIndex {\n  const byTsName = new Map<string, RelationEntry>();\n  const byDbName = new Map<string, RelationEntry>();\n  const byTableRef = new Map<any, RelationEntry>();\n\n  for (const [tsName, rawEntry] of Object.entries(db._.relations ?? {})) {\n    const entry = rawEntry as any;\n    const tableObj = entry.table;\n    if (!tableObj) continue;\n\n    const columns = (\n      isTable(tableObj) ? getTableColumns(tableObj as Table) : {}\n    ) as Record<string, Column>;\n\n    const primaryKey = Object.fromEntries(\n      Object.entries(columns).filter(([, col]) => (col as any).primary),\n    ) as Record<string, Column>;\n\n    const dbName = isTable(tableObj)\n      ? (getTableName(tableObj as Table) as string)\n      : ((entry.name as string) ?? tsName);\n\n    const resolved: RelationEntry = {\n      name: entry.name ?? tsName,\n      dbName,\n      table: tableObj,\n      columns,\n      primaryKey,\n      relations: entry.relations ?? {},\n      foundRelation: entry,\n    };\n\n    byTsName.set(resolved.name, resolved);\n    byDbName.set(resolved.dbName, resolved);\n    byTableRef.set(tableObj, resolved);\n  }\n\n  return { byTsName, byDbName, byTableRef };\n}\n\nfunction getIndex<DB extends DrizzleInstance>(db: DB): TableIndex {\n  let idx = indexCache.get(db as unknown as object);\n  if (!idx) {\n    idx = buildIndex(db);\n    indexCache.set(db as unknown as object, idx);\n  }\n  return idx;\n}\n\nexport function tableHelper<\n  DB extends DrizzleInstance,\n  TableIdentifier extends\n    | string\n    | DB[\"_\"][\"relations\"][keyof DB[\"_\"][\"relations\"]],\n>({ db, table }: { db: DB; table: TableIdentifier }) {\n  const idx = getIndex(db);\n\n  let entry: RelationEntry | undefined;\n\n  if (typeof table === \"string\") {\n    // Lookup by TS-level relation name first (the common case), then by DB name.\n    entry = idx.byTsName.get(table) ?? idx.byDbName.get(table);\n  } else if (table && typeof table === \"object\") {\n    const t = table as any;\n\n    // Case 1: caller passed an entry from db._.relations directly:resolve by\n    // table identity via its `.table` property.\n    if (t.table) {\n      entry = idx.byTableRef.get(t.table);\n      if (!entry && t.name) {\n        entry = idx.byTsName.get(t.name) ?? idx.byDbName.get(t.name);\n      }\n    }\n\n    // Case 2: caller passed a raw Table object: resolve by identity.\n    if (!entry) {\n      entry = idx.byTableRef.get(t);\n    }\n\n    // Case 3: last resort lookup via the public getTableName() helper.\n    if (!entry && isTable(t)) {\n      const dbName = getTableName(t as Table) as string;\n      entry = idx.byDbName.get(dbName);\n    }\n  }\n\n  if (!entry) {\n    throw new RumbleError(\n      `Could not find schema for ${JSON.stringify(\n        typeof table === \"string\" ? table : \"<table-object>\",\n      )}`,\n    );\n  }\n\n  return {\n    columns: entry.columns,\n    primaryKey: entry.primaryKey,\n    relations: entry.relations,\n    dbName: entry.dbName,\n    tsName: entry.name,\n    table: entry.table,\n    foundRelation: entry.foundRelation,\n  };\n}\n\n/**\n * Looks up a relation entry by its TS-level name — i.e. the key in\n * db._.relations, which is also what `Relation.targetTableName` carries.\n * Prefer this for cross-relation navigation over re-resolving via the raw\n * `targetTable` object.\n */\nexport function tableHelperByTsName<DB extends DrizzleInstance>(\n  db: DB,\n  tsName: string,\n) {\n  return tableHelper({ db, table: tsName });\n}\n\nexport { is };\n","import type { Span } from \"@opentelemetry/api\";\nimport { relationsFilterToSQL } from \"drizzle-orm\";\nimport { debounce } from \"es-toolkit\";\nimport { lazy } from \"./helpers/lazy\";\nimport { mergeFilters } from \"./helpers/mergeFilters\";\nimport { createDistinctValuesFromSQLType } from \"./helpers/sqlTypes/distinctValuesFromSQLType\";\nimport { tableHelper } from \"./helpers/tableHelpers\";\nimport type {\n  Filter,\n  FilterPrefetchCombo,\n  Prefetch,\n} from \"./runtimeFiltersPlugin/filterTypes\";\nimport type {\n  DrizzleInstance,\n  DrizzleQueryFunction,\n  DrizzleQueryFunctionInput,\n  DrizzleTableValueType,\n} from \"./types/drizzleInstanceType\";\nimport { RumbleError } from \"./types/rumbleError\";\nimport type {\n  CustomRumblePothosConfig,\n  RumbleInput,\n} from \"./types/rumbleInput\";\n\n//TODO: optimize this for v8 & refactor\n\nexport type AbilityBuilderType<\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n  typeof createAbilityBuilder<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >\n>;\n\n/**\n * Static, non changing query filter input type for a specific table\n */\ntype StaticQueryFilter<\n  DB extends DrizzleInstance,\n  Table extends keyof DrizzleQueryFunction<DB>,\n  Filter extends DrizzleQueryFunctionInput<DB, Table>,\n> = Filter;\n\n/**\n * Dynamic, context based query filter input type for a specific table\n */\ntype DynamicQueryFilter<\n  DB extends DrizzleInstance,\n  Table extends keyof DrizzleQueryFunction<DB>,\n  Filter extends DrizzleQueryFunctionInput<DB, Table>,\n  Context,\n> = (\n  context: Context,\n) => StaticQueryFilter<DB, Table, Filter> | undefined | \"allow\";\n\n/**\n * Combined query filter type for a specific table. May be static or dynamic.\n */\ntype QueryFilter<\n  DB extends DrizzleInstance,\n  Table extends keyof DrizzleQueryFunction<DB>,\n  Filter extends DrizzleQueryFunctionInput<DB, Table>,\n  Context,\n> =\n  | StaticQueryFilter<DB, Table, Filter>\n  | DynamicQueryFilter<DB, Table, Filter, Context>;\n\nfunction isDynamicQueryFilter<\n  DB extends DrizzleInstance,\n  Table extends keyof DrizzleQueryFunction<DB>,\n  Filter extends DrizzleQueryFunctionInput<DB, Table>,\n  Context,\n>(\n  filter: QueryFilter<DB, Table, Filter, Context>,\n): filter is DynamicQueryFilter<DB, Table, Filter, Context> {\n  return (\n    typeof filter === \"function\" && filter.constructor.name !== \"AsyncFunction\"\n  );\n}\n\nfunction isStaticQueryFilter<\n  DB extends DrizzleInstance,\n  Table extends keyof DrizzleQueryFunction<DB>,\n  Filter extends DrizzleQueryFunctionInput<DB, Table>,\n  Context,\n>(\n  filter: QueryFilter<DB, Table, Filter, Context>,\n): filter is StaticQueryFilter<DB, Table, Filter> {\n  return typeof filter !== \"function\";\n}\n\nconst nothingRegisteredWarningLogger = debounce(\n  (model: string, action: string) => {\n    console.warn(`\nWarning! No abilities have been registered for\n\n    ${model}/${action}\n\nbut has been accessed. This will block everything. If this is intended, you can ignore this warning. If not, please ensure that you register the ability in your ability builder.\n`);\n  },\n  1000,\n);\n\nexport const createAbilityBuilder = <\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n>({\n  db,\n  actions,\n  defaultLimit,\n  otel,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig>) => {\n  type TableNames = keyof DrizzleQueryFunction<DB>;\n\n  let hasBeenBuilt = false;\n\n  const createBuilderForTable = <TableName extends TableNames>() => {\n    const queryFilters = new Map<\n      Action,\n      | QueryFilter<\n          DB,\n          TableName,\n          DrizzleQueryFunctionInput<DB, TableName>,\n          UserContext\n        >[]\n      | \"unrestricted\"\n    >();\n\n    const runtimeFilters = new Map<\n      Action,\n      //TODO add a run all helper\n      FilterPrefetchCombo<UserContext, any, any>[]\n    >();\n\n    // we want to init all possible runtime filters since we want to ensure\n    // that the implementaiton helpers pass an object by reference when creating\n    // the implementation, instead of a copy like it would be the case with undefined\n    for (const action of actions!) {\n      if (!runtimeFilters.has(action)) {\n        runtimeFilters.set(action, []);\n      }\n    }\n\n    return {\n      /**\n       * Allows to perform a specific action on a specific entity\n       */\n      allow: (action: Action | Action[]) => {\n        if (hasBeenBuilt) {\n          throw new RumbleError(\n            \"You can't call allow() after the ability builder has been built. Please ensure that you register all abilities before accessing them.\",\n          );\n        }\n\n        const actions = Array.isArray(action) ? action : [action];\n        // Track which actions this specific allow() call initialized as \"unrestricted\",\n        // so .when() can distinguish chained use (allow().when()) from a later separate call\n        // that finds a pre-existing \"unrestricted\" from a prior bare allow().\n        const setUnrestrictedByThisCall = new Set<(typeof actions)[number]>();\n        for (const action of actions) {\n          let filters = queryFilters.get(action);\n          if (!filters) {\n            filters = \"unrestricted\";\n            queryFilters.set(action, filters);\n            setUnrestrictedByThisCall.add(action);\n          }\n        }\n\n        return {\n          /**\n           * Restricts the allowed actions to a filter\n           * @example\n           * ```ts\n           * abilityBuilder.users.allow([\"read\", \"update\", \"delete\"]).when(({ userId }) => ({\n           *    where: {\n           *      id: userId,\n           *    },\n           *  }));\n           * ```\n           */\n          when: (\n            queryFilter: QueryFilter<\n              DB,\n              TableName,\n              DrizzleQueryFunctionInput<DB, TableName>,\n              UserContext\n            >,\n          ) => {\n            for (const action of actions) {\n              if (queryFilters.get(action) === \"unrestricted\") {\n                if (setUnrestrictedByThisCall.has(action)) {\n                  // Chained directly on this allow() call — override unrestricted with specific filter\n                  queryFilters.set(action, []);\n                } else {\n                  // A previous separate bare allow() already set unrestricted\n                  //  skip this filter\n                  continue;\n                }\n              }\n              const filters = queryFilters.get(action)!;\n              (filters as Exclude<typeof filters, \"unrestricted\">).push(\n                queryFilter,\n              );\n            }\n          },\n        };\n      },\n      /**\n       * Allows to register an application level filter to restrict some results\n       * which were returned by a query\n       */\n      filter: (action: Action | Action[]) => {\n        const actions = Array.isArray(action) ? action : [action];\n        return {\n          /**\n           * Allows to register an application level prefetch to fetch some data\n           * which could be useful for later filtering the results. The prefetch\n           * function will be called with the user context but unlike the actual\n           * filter function, it will not have access to the result of the query\n           * and therefore can be run in parallel with underlying query resolver.\n           * A typical use case is to fetch some data which is not directly\n           * related to the query but to the context only. So e.g. fetching the\n           * user's permissions from an external system and then later applying\n           * the filter based on those permissions.\n           */\n          prefetch: <PrefetchReturnType>(\n            prefetch: Prefetch<UserContext, PrefetchReturnType>,\n          ) => {\n            return {\n              /**\n               * The actual filter function to apply. Returns the allowed values\n               */\n              by: (\n                explicitFilter: Filter<\n                  UserContext,\n                  DrizzleTableValueType<DB, TableName>,\n                  PrefetchReturnType\n                >,\n              ) => {\n                for (const action of actions) {\n                  // we initialized all possible actions when creating the builder\n                  runtimeFilters.get(action)!.push({\n                    filter: explicitFilter,\n                    prefetch: prefetch,\n                  });\n                }\n              },\n            };\n          },\n          /**\n           * The actual filter function to apply. Returns the allowed values\n           */\n          by: (\n            explicitFilter: Filter<\n              UserContext,\n              DrizzleTableValueType<DB, TableName>\n            >,\n          ) => {\n            for (const action of actions) {\n              // we initialized all possible actions when creating the builder\n              runtimeFilters.get(action)!.push({\n                filter: explicitFilter as Filter<UserContext, any, any>,\n              });\n            }\n          },\n        };\n      },\n      _: {\n        runtimeFilters,\n        queryFilters,\n      },\n    };\n  };\n\n  const buildersPerTable = Object.fromEntries(\n    (Object.keys(db.query) as TableNames[]).map((tableName) => [\n      tableName,\n      createBuilderForTable<typeof tableName>(),\n    ]),\n  ) as {\n    [key in TableNames]: ReturnType<typeof createBuilderForTable<key>>;\n  };\n\n  return {\n    ...buildersPerTable,\n    /**\n     * @internal\n     * @ignore\n     */\n    _: {\n      registeredFilters({\n        action,\n        table,\n      }: {\n        table: TableNames;\n        action: Action;\n      }) {\n        return (buildersPerTable[table] as any)._.runtimeFilters.get(\n          action,\n        )! as Filter<UserContext, DrizzleTableValueType<DB, TableNames>>[];\n      },\n      build() {\n        const createFilterForTable = <TableName extends TableNames>(\n          tableName: TableName,\n        ) => {\n          const queryFilters = buildersPerTable[tableName]._.queryFilters;\n\n          const simpleQueryFilters = Object.fromEntries(\n            actions!.map((action) => {\n              const filters = queryFilters.get(action);\n\n              if (!filters || filters === \"unrestricted\") return [action, []];\n\n              return [action, filters.filter(isStaticQueryFilter)];\n            }),\n          ) as {\n            [key in Action]: StaticQueryFilter<\n              DB,\n              TableName,\n              DrizzleQueryFunctionInput<DB, TableName>\n            >[];\n          };\n\n          const dynamicQueryFilters = Object.fromEntries(\n            actions!.map((action) => {\n              const filters = queryFilters.get(action);\n\n              if (!filters || filters === \"unrestricted\") return [action, []];\n\n              return [action, filters.filter(isDynamicQueryFilter)];\n            }),\n          ) as {\n            [key in Action]: DynamicQueryFilter<\n              DB,\n              TableName,\n              DrizzleQueryFunctionInput<DB, TableName>,\n              UserContext\n            >[];\n          };\n\n          const tableSchema = tableHelper({\n            db,\n            table: tableName,\n          });\n\n          if (Object.keys(tableSchema.primaryKey).length === 0) {\n            throw new RumbleError(\n              `No primary key found for entity ${tableName.toString()}`,\n            );\n          }\n\n          const primaryKeyField: any = Object.values(tableSchema.primaryKey)[0];\n          // we want a filter that excludes everything\n          const distinctValues = createDistinctValuesFromSQLType(\n            primaryKeyField.getSQLType() as any,\n          );\n\n          const blockEverythingFilter = {\n            where: {\n              AND: [\n                {\n                  [primaryKeyField.name]: distinctValues.value1,\n                },\n                {\n                  [primaryKeyField.name]: distinctValues.value2,\n                },\n              ],\n            },\n          };\n\n          /**\n           * Packs the filters into a response object that can be applied for queries by the user\n           */\n          function transformToResponse(\n            queryFilters?: DrizzleQueryFunctionInput<DB, TableName>,\n          ) {\n            const internalTransformer = (\n              filters?: DrizzleQueryFunctionInput<DB, TableName>,\n              mergedLimit?: number,\n            ) => {\n              const limit = lazy(() => {\n                if (\n                  // got a merge injection\n                  mergedLimit !== undefined\n                ) {\n                  if (!filters?.limit) {\n                    // there is not ability limit\n                    return mergedLimit;\n                  }\n\n                  if ((filters.limit as number) > mergedLimit) {\n                    // there is an ability limit and it is higher that the injected merge limit\n                    return mergedLimit;\n                  }\n                }\n\n                let limit = filters?.limit as number | undefined;\n\n                if (\n                  defaultLimit &&\n                  (limit === undefined || limit > defaultLimit)\n                ) {\n                  limit = defaultLimit;\n                }\n\n                // ensure that null is converted to undefined\n                return limit ?? undefined;\n              });\n\n              const sqlTransformedWhere = lazy(() => {\n                const casing = (db._ as any).session?.dialect?.casing;\n\n                return filters?.where\n                  ? relationsFilterToSQL(\n                      tableSchema.foundRelation.table,\n                      filters.where,\n                      tableSchema.relations,\n                      db._.relations,\n                      casing,\n                    )\n                  : undefined;\n              });\n\n              // we acutally need to define multiple return objects since we do not want to use delete for\n              // performance reasons and an undefined columns field on a drizzle filter will prevent any\n              // column from being selected at all\n              if (filters?.columns) {\n                return {\n                  /**\n                   * Query filters for the drizzle query API.\n                   * @example\n                   * ```ts\n                   * author: t.relation(\"author\", {\n                   *  query: (_args, ctx) => ctx.abilities.users.filter(\"read\").query.single,\n                   * }),\n                   * ´´´\n                   */\n                  query: {\n                    /**\n                     * For find first calls\n                     */\n                    single: {\n                      extras: filters?.extras,\n                      where: filters?.where,\n                      columns: filters?.columns,\n                    } as Pick<\n                      NonNullable<\n                        NonNullable<\n                          Parameters<DB[\"query\"][TableName][\"findFirst\"]>[0]\n                        >\n                      >,\n                      \"columns\" | \"where\"\n                    >,\n                    /**\n                     * For find many calls\n                     */\n                    many: {\n                      extras: filters?.extras,\n                      where: filters?.where,\n                      columns: filters?.columns,\n                      get limit() {\n                        return limit();\n                      },\n                    } as Pick<\n                      NonNullable<\n                        NonNullable<\n                          Parameters<DB[\"query\"][TableName][\"findMany\"]>[0]\n                        >\n                      >,\n                      \"columns\" | \"where\" | \"limit\"\n                    >,\n                  },\n                  /**\n                   * Query filters for the drizzle SQL API as used in e.g. updates.\n                   * @example\n                   *\n                   * ```ts\n                   * await db\n                   *\t.update(schema.users)\n                   *\t.set({\n                   *\t  name: args.newName,\n                   * \t})\n                   *\t.where(\n                   *\t  and(\n                   *\t    eq(schema.users.id, args.userId),\n                   *\t    ctx.abilities.users.filter(\"update\").sql.where,\n                   *\t  ),\n                   *\t);\n                   * ```\n                   *\n                   */\n                  sql: {\n                    get where() {\n                      return sqlTransformedWhere();\n                    },\n                  },\n                };\n              } else {\n                return {\n                  /**\n                   * Query filters for the drizzle query API.\n                   * @example\n                   * ```ts\n                   * author: t.relation(\"author\", {\n                   *  query: (_args, ctx) => ctx.abilities.users.filter(\"read\").query.single,\n                   * }),\n                   * ´´´\n                   */\n                  query: {\n                    /**\n                     * For find first calls\n                     */\n                    single: {\n                      extras: filters?.extras,\n                      where: filters?.where,\n                    } as Pick<\n                      NonNullable<\n                        NonNullable<\n                          Parameters<DB[\"query\"][TableName][\"findFirst\"]>[0]\n                        >\n                      >,\n                      \"where\"\n                    >,\n                    /**\n                     * For find many calls\n                     */\n                    many: {\n                      extras: filters?.extras,\n                      where: filters?.where,\n                      get limit() {\n                        return limit();\n                      },\n                    } as Pick<\n                      NonNullable<\n                        NonNullable<\n                          Parameters<DB[\"query\"][TableName][\"findMany\"]>[0]\n                        >\n                      >,\n                      \"where\" | \"limit\"\n                    >,\n                  },\n                  /**\n                   * Query filters for the drizzle SQL API as used in e.g. updates.\n                   * @example\n                   *\n                   * ```ts\n                   * await db\n                   *\t.update(schema.users)\n                   *\t.set({\n                   *\t  name: args.newName,\n                   * \t})\n                   *\t.where(\n                   *\t  and(\n                   *\t    eq(schema.users.id, args.userId),\n                   *\t    ctx.abilities.users.filter(\"update\").sql.where,\n                   *\t  ),\n                   *\t);\n                   * ```\n                   *\n                   */\n                  sql: {\n                    get where() {\n                      return sqlTransformedWhere();\n                    },\n                  },\n                };\n              }\n            };\n\n            const ret = internalTransformer(queryFilters);\n\n            /**\n             * Merges the current query filters with the provided filters for this call only\n             */\n            function merge(\n              p: NonNullable<DrizzleQueryFunctionInput<DB, TableName>>,\n            ) {\n              const merged = mergeFilters(ret.query.many, p);\n              return internalTransformer(\n                merged,\n                // in case the user wants to inject a limit, we need to ensure that it is applied\n                // and not the potential default limit will be used\n                // this is important for functions of the default query pagination implementation\n                p.limit as number | undefined,\n              );\n            }\n\n            (ret as any).merge = merge;\n\n            return ret as typeof ret & {\n              merge: typeof merge;\n            };\n          }\n\n          return {\n            withContext: (userContext: UserContext) => {\n              return {\n                filter: (action: Action) => {\n                  const assembleAbilities = (span?: Span) => {\n                    const filters = queryFilters.get(action);\n\n                    // in case we have a wildcard ability, skip the rest and return no filters at all\n                    if (filters === \"unrestricted\") {\n                      span?.setAttribute(\"abilities.status\", \"unrestricted\");\n                      return transformToResponse();\n                    }\n\n                    // if nothing has been allowed, block everything\n                    if (!filters) {\n                      span?.setAttribute(\n                        \"abilities.status\",\n                        \"blocked_everything\",\n                      );\n                      nothingRegisteredWarningLogger(\n                        tableName.toString(),\n                        action,\n                      );\n                      return transformToResponse(blockEverythingFilter);\n                    }\n\n                    // run all dynamic filters\n                    const dynamicResults = new Array<\n                      DrizzleQueryFunctionInput<DB, TableName>\n                    >(dynamicQueryFilters[action].length);\n                    let filtersReturned = 0;\n                    for (\n                      let i = 0;\n                      i < dynamicQueryFilters[action].length;\n                      i++\n                    ) {\n                      const func = dynamicQueryFilters[action][i];\n                      const result = func(userContext);\n                      // if one of the dynamic filters returns \"allow\", we want to allow everything\n                      if (result === \"allow\") {\n                        return transformToResponse();\n                      }\n                      // if nothing is returned, nothing is allowed by this filter\n                      if (result === undefined) continue;\n\n                      dynamicResults[filtersReturned++] = result;\n                    }\n                    dynamicResults.length = filtersReturned;\n\n                    span?.setAttribute(\n                      \"abilities.dynamic\",\n                      dynamicResults.length,\n                    );\n                    span?.setAttribute(\n                      \"abilities.static\",\n                      simpleQueryFilters[action].length,\n                    );\n\n                    const allQueryFilters = [\n                      ...simpleQueryFilters[action],\n                      ...dynamicResults,\n                    ];\n\n                    span?.setAttribute(\n                      \"abilities.total\",\n                      allQueryFilters.length,\n                    );\n\n                    // if we don't have any permitted filters then block everything\n                    if (allQueryFilters.length === 0) {\n                      span?.setAttribute(\n                        \"abilities.status\",\n                        \"blocked_everything\",\n                      );\n\n                      return transformToResponse(blockEverythingFilter);\n                    }\n\n                    const mergedFilters =\n                      allQueryFilters.length === 1\n                        ? allQueryFilters[0]\n                        : allQueryFilters.reduce((a, b) => {\n                            return mergeFilters(a, b, \"OR\");\n                          });\n\n                    span?.setAttribute(\"abilities.status\", \"applied\");\n                    return transformToResponse(mergedFilters as any);\n                  };\n\n                  if (otel?.enabled && otel.tracer) {\n                    return otel.tracer.startActiveSpan(\n                      `prepare_query_abilities_${action}`,\n                      (span) => {\n                        try {\n                          return assembleAbilities(span);\n                        } finally {\n                          span.end();\n                        }\n                      },\n                    );\n                  } else {\n                    return assembleAbilities();\n                  }\n                },\n              };\n            },\n          };\n        };\n\n        const abilitiesPerTable = Object.fromEntries(\n          (Object.keys(db.query) as TableNames[]).map((tableName) => [\n            tableName,\n            createFilterForTable(tableName),\n          ]),\n        ) as {\n          [key in TableNames]: ReturnType<typeof createFilterForTable<key>>;\n        };\n\n        hasBeenBuilt = true;\n\n        return (ctx: UserContext) => {\n          return Object.fromEntries(\n            (Object.keys(abilitiesPerTable) as TableNames[]).map(\n              (tableName) => [\n                tableName,\n                abilitiesPerTable[tableName].withContext(ctx),\n              ],\n            ),\n          ) as {\n            [key in TableNames]: ReturnType<\n              ReturnType<typeof createFilterForTable<key>>[\"withContext\"]\n            >;\n          };\n        };\n      },\n    },\n  };\n};\n","import { toCamelCase } from \"drizzle-orm/casing\";\nimport { capitalize } from \"es-toolkit\";\nimport { lazy } from \"../helpers/lazy\";\nimport { tableHelper } from \"../helpers/tableHelpers\";\nimport type {\n  DrizzleInstance,\n  DrizzleQueryFunction,\n} from \"../types/drizzleInstanceType\";\nimport type {\n  CustomRumblePothosConfig,\n  RumbleInput,\n} from \"../types/rumbleInput\";\nimport type { SchemaBuilderType } from \"../types/schemaBuilderType\";\n\nexport type OrderArgImplementerType<\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n  typeof createOrderArgImplementer<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >\n>;\n\nconst makeDefaultName = (dbName: string) =>\n  `${capitalize(toCamelCase(dbName.toString()))}OrderInputArgument`;\n\nexport const createOrderArgImplementer = <\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n>({\n  db,\n  schemaBuilder,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n  schemaBuilder: SchemaBuilderType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >;\n}) => {\n  const referenceStorage = new Map<string, any>();\n\n  const sortingParameterEnumRef = lazy(() =>\n    schemaBuilder.enumType(\"SortingParameter\", {\n      values: [\"asc\", \"desc\"] as const,\n    }),\n  );\n\n  const orderArgImplementer = <\n    RefName extends string,\n    TableName extends keyof DrizzleQueryFunction<DB>,\n  >({\n    table,\n    refName,\n    dbName,\n  }: Partial<{\n    table: TableName;\n    refName: RefName | undefined;\n    dbName: string;\n  }> &\n    (\n      | {\n          table: TableName;\n        }\n      | {\n          dbName: string;\n        }\n    )) => {\n    const tableSchema = tableHelper({\n      db,\n      table: dbName ?? table!,\n    });\n\n    const inputTypeName = refName ?? makeDefaultName(tableSchema.tsName);\n\n    let ret: ReturnType<typeof implement> | undefined =\n      referenceStorage.get(inputTypeName);\n    if (ret) {\n      return ret;\n    }\n\n    const implement = () => {\n      return schemaBuilder.inputType(inputTypeName, {\n        fields: (t) => {\n          const fields = Object.entries(tableSchema.columns).reduce(\n            (acc, [key]) => {\n              acc[key] = t.field({\n                type: sortingParameterEnumRef(),\n                required: false,\n              });\n\n              return acc;\n            },\n            {} as Record<\n              keyof typeof tableSchema.columns,\n              ReturnType<typeof t.field>\n            >,\n          );\n\n          const relations = Object.entries(tableSchema.relations ?? {}).reduce(\n            (acc, [key, value]) => {\n              const targetTsName = (value as any).targetTableName as string;\n              const relationSchema = tableHelper({\n                db,\n                table: targetTsName,\n              });\n              const referenceModel = orderArgImplementer({\n                dbName: relationSchema.dbName,\n              });\n\n              acc[key] = t.field({\n                type: referenceModel,\n                required: false,\n              });\n\n              return acc;\n            },\n            {} as Record<\n              keyof typeof tableSchema.columns,\n              ReturnType<typeof t.field>\n            >,\n          );\n\n          return {\n            ...fields,\n            ...relations,\n          };\n        },\n      });\n    };\n\n    ret = implement();\n    referenceStorage.set(inputTypeName, ret);\n    return ret;\n  };\n\n  return orderArgImplementer;\n};\n","import { type Column, is } from \"drizzle-orm\";\nimport { toCamelCase } from \"drizzle-orm/casing\";\nimport {\n  isPgEnum,\n  type PgEnum,\n  PgEnumColumn,\n  type PgEnumObject,\n  PgEnumObjectColumn,\n} from \"drizzle-orm/pg-core\";\nimport { capitalize } from \"es-toolkit\";\nimport type { DrizzleInstance } from \"./types/drizzleInstanceType\";\nimport { RumbleError } from \"./types/rumbleError\";\nimport type {\n  CustomRumblePothosConfig,\n  RumbleInput,\n} from \"./types/rumbleInput\";\nimport type { SchemaBuilderType } from \"./types/schemaBuilderType\";\n\n/**\n * Checks if a column is a Postgres enum column\n */\nexport function isEnumSchema(\n  schemaType: any,\n): schemaType is PgEnumColumn<any> | PgEnumObjectColumn<any> {\n  // TODO: make this compatible with other db drivers\n  return is(schemaType, PgEnumColumn) || is(schemaType, PgEnumObjectColumn);\n}\n\n// TODO make this compatible with other db drivers\ntype EnumTypes = PgEnum<any> | PgEnumObject<any>;\n\nexport type NonEnumFields<T> = {\n  [K in keyof T as T[K] extends EnumTypes ? never : K]: T[K];\n};\n\n/**\n * Picks the keys of a schema object that are pgEnum definitions\n */\nexport type EnumFieldKeys<S> = keyof {\n  [K in keyof S as S[K] extends EnumTypes ? K : never]: S[K];\n};\n\n/**\n * Fallback value tuple used whenever the concrete enum members cannot be\n * recovered from the drizzle types (e.g. an object-enum whose values were\n * widened to `string`, or a `tsName` that does not resolve against `Schema`).\n */\ntype UnknownEnumValues = readonly [string, ...string[]];\n\n/**\n * Extracts the literal value tuple carried by a drizzle enum definition.\n */\ntype EnumValuesOf<E> =\n  E extends PgEnum<infer V>\n    ? V\n    : E extends PgEnumObject<infer O>\n      ? ReadonlyArray<O[keyof O] & string>\n      : UnknownEnumValues;\n\n/**\n * The GraphQL enum member union for a single `enum_(...)` call, resolved from\n * whichever of the three per-call generics the caller populated (`tsName` /\n * `enum` / `enumColumn`). The unused generics default to `never`, so\n * `[X] extends [never]` tells us which identification form was used.\n *\n * Anything we can't recover from the drizzle types (an object-enum widened to\n * `string`, or a `tsName` that doesn't resolve against `Schema`) falls back to\n * `string`, matching Pothos' own enum member type.\n */\ntype EnumMembers<Schema, TsName, EnumArg, EnumColumn> = [EnumColumn] extends [\n  never,\n]\n  ? [EnumArg] extends [never]\n    ? [TsName] extends [never]\n      ? string\n      : TsName extends keyof Schema\n        ? EnumValuesOf<Schema[TsName]>[number]\n        : string\n    : EnumValuesOf<EnumArg>[number]\n  : EnumColumn extends { enumValues: infer CV extends UnknownEnumValues }\n    ? CV[number]\n    : string;\n\n/**\n * The strongly typed Pothos enum ref returned by a single `enum_(...)` call.\n *\n * Kept as a named, exported alias on purpose: the `.d.ts` emitter prints type\n * aliases by reference rather than expanding their bodies, so the (otherwise\n * very deep) `SchemaBuilder` / `EnumRef` types never get inlined into the\n * declaration output. Two details keep this printable without the emitter\n * recursing: referencing `SchemaBuilderType<...>` (a named alias) rather than\n * `typeof schemaBuilder` (a value), and inlining the member resolution so the\n * cyclic drizzle `Schema[TsName]` access never surfaces as its own symbol.\n */\nexport type EnumImplementationRef<\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n  Schema,\n  TsName,\n  EnumArg,\n  EnumColumn,\n> =\n  SchemaBuilderType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  > extends PothosSchemaTypes.SchemaBuilder<infer Types>\n    ? PothosSchemaTypes.EnumRef<\n        Types,\n        EnumMembers<Schema, TsName, EnumArg, EnumColumn>\n      >\n    : never;\n\nexport type EnumImplementerType<\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n  AvailableEnums extends string,\n  Schema extends Record<string, any> = Record<string, any>,\n> = ReturnType<\n  typeof createEnumImplementer<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig,\n    AvailableEnums,\n    Schema\n  >\n>;\n\nexport const createEnumImplementer = <\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n  AvailableEnums extends string,\n  Schema extends Record<string, any> = Record<string, any>,\n>({\n  schema,\n  schemaBuilder,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n  schemaBuilder: SchemaBuilderType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >;\n}) => {\n  const referenceStorage = new Map<string, any>();\n\n  /**\n   * Registers a Postgres enum as a GraphQL enum type.\n   *\n   * You can identify the enum in three ways:\n   * - `tsName`: the exported TypeScript identifier from your schema module. This is the\n   *   most typesafe form, only valid enum keys autocomplete, typos are caught at compile time.\n   * - `enum`: pass the pgEnum object directly.\n   * - `enumColumn`: pass a column that uses the enum.\n   *\n   * Use `refName` to override the auto-generated GraphQL type name.\n   */\n  const enumImplementer = <\n    TsName extends AvailableEnums = never,\n    EnumArg extends PgEnum<any> | PgEnumObject<any> = never,\n    EnumColumn extends Column = never,\n    RefName extends string = string,\n  >(\n    args: {\n      refName?: RefName;\n    } & (\n      | { tsName: TsName; enum?: never; enumColumn?: never }\n      | { enum: EnumArg; tsName?: never; enumColumn?: never }\n      | { enumColumn: EnumColumn; tsName?: never; enum?: never }\n    ),\n  ): EnumImplementationRef<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig,\n    Schema,\n    TsName,\n    EnumArg,\n    EnumColumn\n  > => {\n    const { refName } = args;\n    const tsName = (args as { tsName?: string }).tsName;\n    const enumObjectArg = (args as { enum?: PgEnum<any> | PgEnumObject<any> })\n      .enum;\n    const enumColumn = (args as { enumColumn?: Column }).enumColumn;\n\n    let enumObject: PgEnum<any> | PgEnumObject<any> | undefined = enumObjectArg;\n\n    if (tsName) {\n      const candidate = (schema as Record<string, unknown>)[tsName];\n      if (!candidate || !isPgEnum(candidate as any)) {\n        throw new RumbleError(\n          `Could not find a pgEnum exported as ${JSON.stringify(\n            tsName,\n          )} in the provided schema. ` +\n            `Make sure the identifier exists and refers to a value created with \\`pgEnum(...)\\`.`,\n        );\n      }\n      enumObject = candidate as PgEnum<any> | PgEnumObject<any>;\n    }\n\n    if (!enumObject && !enumColumn) {\n      throw new RumbleError(\n        `Could not determine enum structure! Pass one of 'tsName' (requires \\`schema\\` on rumble()), ` +\n          `'enum' (the pgEnum object), or 'enumColumn' (a column that uses the enum).`,\n      );\n    }\n\n    let enumSchemaName: string | undefined;\n    let enumValues: any[] | undefined;\n\n    if (enumObject) {\n      enumSchemaName = enumObject.enumName;\n      enumValues = enumObject.enumValues as unknown as any[];\n    } else if (enumColumn) {\n      const pgEnum = (enumColumn as any).enum as\n        | PgEnum<any>\n        | PgEnumObject<any>\n        | undefined;\n\n      if (!pgEnum) {\n        throw new RumbleError(\n          `Could not find enum definition on column. Make sure the column is a pgEnum column.`,\n        );\n      }\n\n      enumSchemaName = pgEnum.enumName;\n      enumValues = enumColumn.enumValues as unknown as any[];\n    }\n\n    if (!enumSchemaName || !enumValues) {\n      throw new RumbleError(\"Could not determine enum structure!\");\n    }\n\n    const graphqlImplementationName =\n      refName ?? `${capitalize(toCamelCase(enumSchemaName))}Enum`;\n\n    // The runtime always produces a plain Pothos enum ref; the strong typing\n    // lives entirely in the (explicit, named) return type, so we cast on the\n    // way out. The named return alias is what keeps the `.d.ts` emitter from\n    // recursing on the inlined SchemaBuilder/EnumRef types.\n    type Ret = EnumImplementationRef<\n      UserContext,\n      DB,\n      RequestEvent,\n      Action,\n      PothosConfig,\n      Schema,\n      TsName,\n      EnumArg,\n      EnumColumn\n    >;\n\n    const cached = referenceStorage.get(graphqlImplementationName);\n    if (cached) {\n      return cached as Ret;\n    }\n\n    const ret = schemaBuilder.enumType(graphqlImplementationName, {\n      values: enumValues,\n    });\n    referenceStorage.set(graphqlImplementationName, ret);\n    return ret as unknown as Ret;\n  };\n\n  return enumImplementer;\n};\n","import {\n  isBooleanSQLTypeString,\n  isDateLikeSQLTypeString,\n  isDateTimeLikeSQLTypeString,\n  isFloatLikeSQLTypeString,\n  isIDLikeSQLTypeString,\n  isIntLikeSQLTypeString,\n  isJSONLikeSQLTypeString,\n  isStringLikeSQLTypeString,\n  type PossibleSQLType,\n  UnknownTypeRumbleError,\n} from \"./types\";\n\nexport function mapSQLTypeToGraphQLType({\n  sqlType,\n  fieldName,\n}: {\n  sqlType: PossibleSQLType;\n  fieldName?: string;\n}):\n  | \"Int\"\n  | \"Float\"\n  | \"String\"\n  | \"ID\"\n  | \"Boolean\"\n  | \"DateTime\"\n  | \"Date\"\n  | \"JSON\" {\n  let ret:\n    | \"Int\"\n    | \"Float\"\n    | \"String\"\n    | \"ID\"\n    | \"Boolean\"\n    | \"DateTime\"\n    | \"Date\"\n    | \"JSON\"\n    | undefined;\n\n  if (isIntLikeSQLTypeString(sqlType)) {\n    ret = \"Int\";\n  }\n\n  if (isFloatLikeSQLTypeString(sqlType)) {\n    ret = \"Float\";\n  }\n\n  if (isStringLikeSQLTypeString(sqlType)) {\n    if (\n      fieldName &&\n      (fieldName.toLowerCase().endsWith(\"_id\") ||\n        fieldName.toLowerCase().endsWith(\"id\"))\n    ) {\n      ret = \"ID\";\n    } else {\n      ret = \"String\";\n    }\n  }\n\n  if (isIDLikeSQLTypeString(sqlType)) {\n    ret = \"ID\";\n  }\n\n  if (isBooleanSQLTypeString(sqlType)) {\n    ret = \"Boolean\";\n  }\n\n  if (isDateTimeLikeSQLTypeString(sqlType)) {\n    ret = \"DateTime\";\n  }\n\n  if (isDateLikeSQLTypeString(sqlType)) {\n    ret = \"Date\";\n  }\n\n  if (isJSONLikeSQLTypeString(sqlType)) {\n    ret = \"JSON\";\n  }\n\n  if (ret !== undefined) {\n    return ret;\n  }\n\n  throw UnknownTypeRumbleError(sqlType, \"SQL to GQL\");\n}\n","import { toCamelCase } from \"drizzle-orm/casing\";\nimport { capitalize } from \"es-toolkit\";\nimport { type EnumImplementerType, isEnumSchema } from \"../enum\";\nimport { mapSQLTypeToGraphQLType } from \"../helpers/sqlTypes/mapSQLTypeToTSType\";\nimport type { PossibleSQLType } from \"../helpers/sqlTypes/types\";\nimport { tableHelper } from \"../helpers/tableHelpers\";\nimport type {\n  DrizzleInstance,\n  DrizzleQueryFunction,\n} from \"../types/drizzleInstanceType\";\nimport { RumbleError } from \"../types/rumbleError\";\nimport type {\n  CustomRumblePothosConfig,\n  RumbleInput,\n} from \"../types/rumbleInput\";\nimport type { SchemaBuilderType } from \"../types/schemaBuilderType\";\n\n// TODO: in general, several of the filter methods should be more\n// restrictive in case of explicitly allowed columns\n// search, order and filter should be restricted to allowed cols\n// and should completely ignore other fields since one might be ably\n// to narrow down and guess the actual values behind forbidden columns by\n// using the provided args. This way one could guess, e.g. secrets which are forbidden by\n// the column abilitiy settings but will be respected in searches, etc.\n\nexport type WhereArgImplementerType<\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n  typeof createWhereArgImplementer<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >\n>;\n\nconst makeDefaultName = (dbName: string) =>\n  `${capitalize(toCamelCase(dbName.toString()))}WhereInputArgument`;\n\nexport const createWhereArgImplementer = <\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n>({\n  db,\n  schemaBuilder,\n  enumImplementer,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n  enumImplementer: EnumImplementerType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig,\n    any\n  >;\n  schemaBuilder: SchemaBuilderType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >;\n}) => {\n  const referenceStorage = new Map<string, any>();\n\n  const whereArgImplementer = <\n    TableName extends keyof DrizzleQueryFunction<DB>,\n    RefName extends string,\n  >({\n    table,\n    refName,\n    dbName,\n  }: Partial<{\n    table: TableName;\n    refName: RefName | undefined;\n    dbName: string;\n  }> &\n    (\n      | {\n          table: TableName;\n        }\n      | {\n          dbName: string;\n        }\n    )) => {\n    const tableSchema = tableHelper({\n      db,\n      table: dbName ?? table!,\n    });\n\n    const inputTypeName = refName ?? makeDefaultName(tableSchema.tsName);\n\n    let ret: ReturnType<typeof implement> | undefined =\n      referenceStorage.get(inputTypeName);\n    if (ret) {\n      return ret;\n    }\n\n    const implement = () => {\n      return schemaBuilder.inputType(inputTypeName, {\n        fields: (t) => {\n          const mapSQLTypeStringToInputPothosType = (\n            sqlType: PossibleSQLType,\n            fieldName: string,\n          ) => {\n            const gqlType = mapSQLTypeToGraphQLType({\n              sqlType,\n              fieldName,\n            });\n            switch (gqlType) {\n              case \"Int\":\n                return t.field({ type: \"IntWhereInputArgument\" });\n              case \"String\":\n                return t.field({ type: \"StringWhereInputArgument\" });\n              case \"Boolean\":\n                return t.boolean({ required: false });\n              case \"Date\":\n                return t.field({\n                  type: \"DateWhereInputArgument\",\n                });\n              case \"DateTime\":\n                return t.field({\n                  type: \"DateWhereInputArgument\",\n                });\n              case \"Float\":\n                return t.field({\n                  type: \"FloatWhereInputArgument\",\n                });\n              case \"ID\":\n                return t.id({ required: false });\n              case \"JSON\":\n                return t.field({\n                  type: \"JSON\",\n                  required: false,\n                });\n              default:\n                throw new RumbleError(\n                  `Unsupported argument type ${gqlType} for column ${sqlType}`,\n                );\n            }\n          };\n          const fields = Object.entries(tableSchema.columns).reduce(\n            (acc, [key, value]) => {\n              if (isEnumSchema(value)) {\n                const enumImpl = enumImplementer({\n                  enumColumn: value,\n                });\n\n                acc[key] = t.field({\n                  type: enumImpl,\n                  required: false,\n                });\n              } else {\n                acc[key] = mapSQLTypeStringToInputPothosType(\n                  value.getSQLType() as PossibleSQLType,\n                  key,\n                );\n              }\n\n              return acc;\n            },\n            {} as Record<\n              keyof typeof tableSchema.columns,\n              ReturnType<typeof mapSQLTypeStringToInputPothosType>\n            >,\n          );\n\n          const relations = Object.entries(tableSchema.relations ?? {}).reduce(\n            (acc, [key, value]) => {\n              // `targetTableName` is the publicly typed TS-key of the target\n              // relation in db._.relations, prefer it over re-resolving via\n              // the `targetTable` object.\n              const targetTsName = (value as any).targetTableName as string;\n              const relationSchema = tableHelper({\n                db,\n                table: targetTsName,\n              });\n              const referenceModel = whereArgImplementer({\n                dbName: relationSchema.dbName,\n              });\n\n              acc[key] = t.field({\n                type: referenceModel,\n                required: false,\n              });\n\n              return acc;\n            },\n            {} as Record<\n              keyof typeof tableSchema.columns,\n              ReturnType<typeof mapSQLTypeStringToInputPothosType>\n            >,\n          );\n\n          return {\n            ...fields,\n            ...relations,\n          };\n        },\n      });\n    };\n\n    ret = implement();\n    referenceStorage.set(inputTypeName, ret);\n    return ret;\n  };\n\n  return whereArgImplementer;\n};\n","import type { DrizzleInstance } from \"../types/drizzleInstanceType\";\nimport type {\n  CustomRumblePothosConfig,\n  RumbleInput,\n} from \"../types/rumbleInput\";\nimport type { SchemaBuilderType } from \"../types/schemaBuilderType\";\nimport { generateFromSchema } from \"./generate/generate\";\n\nexport const clientCreatorImplementer = <\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n>({\n  builtSchema,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n  builtSchema: () => ReturnType<\n    SchemaBuilderType<\n      UserContext,\n      DB,\n      RequestEvent,\n      Action,\n      PothosConfig\n    >[\"toSchema\"]\n  >;\n}) => {\n  const clientCreator = async ({\n    apiUrl,\n    outputPath,\n    rumbleImportPath,\n    useExternalUrqlClient,\n    removeExisting,\n    forceReactivity,\n    autoIncludeIdField = false,\n  }: {\n    /**\n     * Path to the output directory where the client files will be generated.\n     */\n    outputPath: string;\n    /**\n     * The base URL of the Rumble API.\n     */\n    apiUrl?: string;\n    /**\n     * The import path for the rumble library, defaults to \"@m1212e/rumble/client\".\n     */\n    rumbleImportPath?: string;\n    /**\n     * Set this to use an external urql client exported from a module.\n     * If a string, uses the provided path to the urql client for importing the client.\n     * If false, creates a new urql client with the provided apiUrl.\n     */\n    useExternalUrqlClient?: string;\n    /**\n     * Whether to remove existing generated files in the output directory before generating new ones.\n     */\n    removeExisting?: boolean;\n    /**\n     * Whether to force reactivity for generated queries and mutations. This will prevent the actual response fields of the awaited response from being populated\n     * and requires you to subscribe to the response to access the data. Useful to prevent forgetting to subscribe to the response to utilize reactive data.\n     */\n    forceReactivity?: boolean;\n    /**\n     * Whether to automatically include the `id` field in generated queries and mutations.\n     * This might be helpful to ensure that caching works correctly since all object will always be identifiable by their `id`.\n     * Can be set to `true` to always include the `id` field, or to `false` to never include it.\n     * Can also be set to a string to include a custom named field as Id field in case you have a different naming convention like `_id`.\n     *\n     * @default false\n     */\n    autoIncludeIdField?: boolean | string;\n  }) => {\n    if (process.env.NODE_ENV !== \"development\") {\n      console.warn(\n        `Running rumble client generation in non development mode. Are you sure this is correct? Called with arguments: ${JSON.stringify(\n          {\n            outputPath,\n            apiUrl,\n            rumbleImportPath,\n            useExternalUrqlClient,\n            removeExisting,\n          },\n        )}`,\n      );\n    }\n    const schema = builtSchema();\n    await generateFromSchema({\n      schema,\n      outputPath,\n      rumbleImportPath,\n      apiUrl,\n      useExternalUrqlClient,\n      removeExisting,\n      forceReactivity,\n      autoIncludeIdField,\n    });\n  };\n\n  return clientCreator;\n};\n","import type { AbilityBuilderType } from \"./abilityBuilder\";\nimport { lazy } from \"./helpers/lazy\";\nimport type { DrizzleInstance } from \"./types/drizzleInstanceType\";\nimport type {\n  CustomRumblePothosConfig,\n  RumbleInput,\n} from \"./types/rumbleInput\";\n\nexport type ContextFunctionType<\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n  typeof createContextFunction<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >\n>;\n\nexport type ContextType<\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n> = Awaited<\n  ReturnType<\n    ContextFunctionType<UserContext, DB, RequestEvent, Action, PothosConfig>\n  >\n>;\n\nexport const createContextFunction = <\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n>({\n  context: makeUserContext,\n  abilityBuilder,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n  abilityBuilder: AbilityBuilderType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >;\n}) => {\n  const builtAbilityBuilder = lazy(() => abilityBuilder._.build());\n\n  return async (req: RequestEvent) => {\n    const userContext = makeUserContext\n      ? await makeUserContext(req)\n      : ({} as UserContext);\n\n    return {\n      ...userContext,\n      abilities: builtAbilityBuilder()(userContext),\n    };\n  };\n};\n","export function deepSetProto(\n  obj: any,\n  proto = Object.prototype,\n  seen = new WeakSet(),\n) {\n  if (obj === null || typeof obj !== \"object\") return;\n  if (seen.has(obj)) return;\n  seen.add(obj);\n  Object.setPrototypeOf(obj, proto);\n  for (const key of Object.keys(obj)) {\n    deepSetProto(obj[key], proto, seen);\n  }\n}\n","import { count } from \"drizzle-orm\";\nimport pluralize from \"pluralize\";\nimport type { WhereArgImplementerType } from \"./args/whereArg\";\nimport { assertFirstEntryExists } from \"./helpers/asserts\";\nimport { mapNullFieldsToUndefined } from \"./helpers/mapNullFieldsToUndefined\";\nimport { deepSetProto } from \"./helpers/protoMapper\";\nimport { tableHelper } from \"./helpers/tableHelpers\";\nimport type { MakePubSubInstanceType } from \"./pubsub\";\nimport type {\n  DrizzleInstance,\n  DrizzleQueryFunction,\n} from \"./types/drizzleInstanceType\";\nimport { RumbleErrorSafe } from \"./types/rumbleError\";\nimport type {\n  CustomRumblePothosConfig,\n  RumbleInput,\n} from \"./types/rumbleInput\";\nimport type { SchemaBuilderType } from \"./types/schemaBuilderType\";\n\nexport const createCountQueryImplementer = <\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n  Schema extends Record<string, any>,\n>({\n  db,\n  schemaBuilder,\n  whereArgImplementer,\n  makePubSubInstance,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig, Schema> & {\n  schemaBuilder: SchemaBuilderType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >;\n  whereArgImplementer: WhereArgImplementerType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >;\n  makePubSubInstance: MakePubSubInstanceType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >;\n}) => {\n  return <TableName extends keyof DrizzleQueryFunction<DB>>({\n    table,\n    listAction = \"read\" as Action,\n    isAllowed,\n  }: {\n    /**\n     * The table for which to implement the count query\n     */\n    table: TableName;\n    /**\n     * Which action should be used for listing many entities\n     * @default \"read\"\n     */\n    listAction?: Action;\n    /**\n     * Optional function to check if the query is allowed\n     */\n    isAllowed?: (context: UserContext) => boolean | Promise<boolean>;\n  }) => {\n    const WhereArg = whereArgImplementer({\n      table: table,\n    });\n    const { registerOnInstance } = makePubSubInstance({ table: table });\n\n    const tableSchema = tableHelper({\n      db,\n      table,\n    });\n\n    return schemaBuilder.queryFields((t) => {\n      return {\n        [`${pluralize.plural(table.toString())}Count`]: t.field({\n          type: \"Int\",\n          nullable: false,\n          smartSubscription: true,\n          description: `Count all ${pluralize.plural(table.toString())}`,\n          subscribe: (subscriptions, _root, _args, _ctx, _info) => {\n            registerOnInstance({\n              instance: subscriptions,\n              action: \"created\",\n            });\n            registerOnInstance({\n              instance: subscriptions,\n              action: \"removed\",\n            });\n          },\n          args: {\n            where: t.arg({ type: WhereArg, required: false }),\n          },\n          resolve: async (_root, args, ctx, _info) => {\n            if (isAllowed && !(await isAllowed(ctx))) {\n              throw new RumbleErrorSafe(\"Not allowed to perform this action\");\n            }\n\n            deepSetProto(args);\n\n            return (db as any)\n              .select({ count: count() })\n              .from(tableSchema.table)\n              .where(\n                ctx.abilities[table]\n                  .filter(listAction)\n                  .merge(mapNullFieldsToUndefined(args) as any).sql.where,\n              )\n              .then(assertFirstEntryExists)\n              .then((r: any) => r.count);\n          },\n        }),\n      };\n    });\n  };\n};\n","import type { useSofa } from \"sofa-api\";\n\nexport const sofaOpenAPIWebhookDocs: NonNullable<\n  Parameters<typeof useSofa>[0][\"openAPI\"]\n> = {\n  paths: {\n    \"/webhook\": {\n      post: {\n        operationId: \"webhook_create\",\n        description: \"Creates a webhook subscription.\",\n        tags: [],\n        parameters: [],\n        requestBody: {\n          content: {\n            \"application/json\": {\n              schema: {\n                $ref: \"#/components/schemas/WebhookCreateBody\",\n              },\n            },\n          },\n        },\n        responses: {\n          \"200\": {\n            description: \"\",\n            content: {\n              \"application/json\": {\n                schema: {\n                  $ref: \"#/components/schemas/WebhookDetailResponse\",\n                },\n              },\n            },\n          },\n        },\n      },\n    },\n    \"/webhook/{id}\": {\n      post: {\n        operationId: \"webhook_update\",\n        description: \"Updates a webhook subscription.\",\n        parameters: [\n          {\n            name: \"id\",\n            in: \"path\",\n            description: \"The ID of the webhook to update\",\n            required: true,\n            schema: {\n              type: \"string\",\n            },\n          } as any,\n        ],\n        requestBody: {\n          content: {\n            \"application/json\": {\n              schema: {\n                $ref: \"#/components/schemas/WebhookCreateBody\",\n              },\n            },\n          },\n        },\n        responses: {\n          \"200\": {\n            description: \"\",\n            content: {\n              \"application/json\": {\n                schema: {\n                  $ref: \"#/components/schemas/WebhookDetailResponse\",\n                },\n              },\n            },\n          },\n        },\n      },\n      delete: {\n        operationId: \"webhook_delete\",\n        description: \"Removes a webhook subscription.\",\n        tags: [],\n        parameters: [\n          {\n            name: \"id\",\n            in: \"path\",\n            description: \"The ID of the webhook to delete\",\n            required: true,\n            schema: {\n              type: \"string\",\n            },\n          } as any,\n        ],\n        responses: {\n          \"200\": {\n            description: \"\",\n            content: {\n              \"application/json\": {\n                schema: {\n                  $ref: \"#/components/schemas/WebhookDetailResponse\",\n                },\n              },\n            },\n          },\n        },\n      },\n    },\n  },\n  components: {\n    schemas: {\n      WebhookCreateBody: {\n        type: \"object\",\n        properties: {\n          subscription: {\n            description:\n              \"The subscription to subscribe to. In many cases, these match the available query IDs without the '_query' suffix. E.g., 'users_query' -> 'users'. See the graphql schema for more details on what subscriptions are available.\",\n            type: \"string\",\n          },\n          variables: {\n            description: \"The variables to pass to the subscription.\",\n            type: \"object\",\n          },\n          url: {\n            description: \"The URL to send the webhook to.\",\n            type: \"string\",\n          },\n        },\n      },\n      WebhookDetailResponse: {\n        type: \"object\",\n        properties: {\n          id: {\n            description:\n              \"The ID of the webhook. Can be used as reference in update or delete calls.\",\n            type: \"string\",\n          },\n        },\n      },\n      DateTime: {\n        type: \"string\",\n        format: \"date-time\",\n      },\n      Date: {\n        type: \"string\",\n        format: \"date\",\n      },\n    },\n  },\n};\n","import type { DrizzleObjectFieldBuilder } from \"@pothos/plugin-drizzle\";\nimport { RumbleError } from \"../../types/rumbleError\";\nimport { mapSQLTypeToGraphQLType } from \"./mapSQLTypeToTSType\";\nimport type { PossibleSQLType } from \"./types\";\n\nexport function buildPothosResponseTypeFromGraphQLType<\n  Builder extends DrizzleObjectFieldBuilder<any, any, any, any>,\n>({\n  builder,\n  sqlType,\n  fieldName,\n  nullable,\n  isArray,\n}: {\n  builder: Builder;\n  sqlType: PossibleSQLType;\n  fieldName: string;\n  nullable: boolean;\n  isArray: boolean;\n}) {\n  const gqlType = mapSQLTypeToGraphQLType({\n    sqlType,\n    fieldName,\n  });\n  switch (gqlType) {\n    case \"Int\":\n      return isArray\n        ? builder.exposeIntList(fieldName, { nullable: nullable as any })\n        : builder.exposeInt(fieldName, { nullable });\n    case \"String\":\n      return isArray\n        ? builder.exposeStringList(fieldName, { nullable: nullable as any })\n        : builder.exposeString(fieldName, { nullable });\n    case \"Boolean\":\n      return isArray\n        ? builder.exposeBooleanList(fieldName, { nullable: nullable as any })\n        : builder.exposeBoolean(fieldName, { nullable });\n    case \"Date\":\n      return builder.field({\n        type: isArray ? [\"Date\"] : \"Date\",\n        resolve: (element: any) => element[fieldName],\n        nullable,\n      });\n    case \"DateTime\":\n      return builder.field({\n        type: isArray ? [\"DateTime\"] : \"DateTime\",\n        resolve: (element: any) => element[fieldName],\n        nullable,\n      });\n    case \"Float\":\n      return isArray\n        ? builder.exposeFloatList(fieldName, { nullable: nullable as any })\n        : builder.exposeFloat(fieldName, { nullable });\n    case \"ID\":\n      return isArray\n        ? builder.exposeIDList(fieldName, { nullable: nullable as any })\n        : builder.exposeID(fieldName, { nullable });\n    case \"JSON\":\n      return builder.field({\n        type: isArray ? [\"JSON\"] : \"JSON\",\n        resolve: (element: any) => element[fieldName],\n        nullable,\n      });\n    default:\n      throw new RumbleError(\n        `Unsupported object type ${gqlType} for column ${fieldName}`,\n      );\n  }\n}\n","import { is } from \"drizzle-orm\";\nimport type { MySqlDatabase } from \"drizzle-orm/mysql-core\";\nimport { MySqlTable } from \"drizzle-orm/mysql-core\";\nimport type { PgAsyncDatabase } from \"drizzle-orm/pg-core\";\nimport { PgTable } from \"drizzle-orm/pg-core\";\nimport type { BaseSQLiteDatabase } from \"drizzle-orm/sqlite-core\";\nimport { SQLiteTable } from \"drizzle-orm/sqlite-core\";\nimport type { DrizzleInstance } from \"../types/drizzleInstanceType\";\n\nexport type DBDialect = \"mysql\" | \"postgres\" | \"sqlite\";\n\nconst dialectCache = new WeakMap<object, DBDialect>();\n\nexport function determineDBDialectFromSchema<DB extends DrizzleInstance>(\n  schema: DB[\"_\"][\"relations\"],\n): DBDialect {\n  const cached = dialectCache.get(schema as unknown as object);\n  if (cached) return cached;\n\n  const found = new Set<DBDialect>();\n\n  for (const table of Object.values(schema).map((t: any) => t.table)) {\n    if (!table || typeof table !== \"object\") {\n      continue;\n    }\n\n    // `is()` survives duplicate drizzle-orm copies in node_modules where\n    // `instanceof` silently returns false against the \"wrong\" class identity.\n    if (is(table, PgTable)) {\n      found.add(\"postgres\");\n    } else if (is(table, MySqlTable)) {\n      found.add(\"mysql\");\n    } else if (is(table, SQLiteTable)) {\n      found.add(\"sqlite\");\n    }\n  }\n\n  const dialects = Array.from(found);\n\n  if (dialects.length === 1) {\n    const only = dialects[0]!;\n    dialectCache.set(schema as unknown as object, only);\n    return only;\n  }\n\n  if (dialects.length === 0) {\n    throw new Error(\"No tables found in schema, could not determine dialect\");\n  }\n\n  throw new Error(`Multiple dialects found in schema: ${dialects.join(\", \")}`);\n}\n\nexport function isPostgresDB<\n  Narrowed extends PgAsyncDatabase<any, any> = PgAsyncDatabase<any, any>,\n>(db: any): db is Narrowed {\n  return determineDBDialectFromSchema(db._.relations) === \"postgres\";\n}\n\nexport function isMySQLDB<\n  Narrowed extends MySqlDatabase<any, any> = MySqlDatabase<any, any>,\n>(db: any): db is Narrowed {\n  return determineDBDialectFromSchema(db._.relations) === \"mysql\";\n}\n\nexport function isSQLiteDB<\n  Narrowed extends BaseSQLiteDatabase<any, any> = BaseSQLiteDatabase<any, any>,\n>(db: any): db is Narrowed {\n  return determineDBDialectFromSchema(db._.relations) === \"sqlite\";\n}\n","import { sql } from \"drizzle-orm\";\nimport { cloneDeep } from \"es-toolkit\";\nimport { isPostgresDB } from \"./helpers/determineDialectFromSchema\";\nimport {\n  isIDLikeSQLTypeString,\n  isStringLikeSQLTypeString,\n} from \"./helpers/sqlTypes/types\";\nimport type { tableHelper } from \"./helpers/tableHelpers\";\nimport type { RumbleInput } from \"./types/rumbleInput\";\n\nexport async function initSearchIfApplicable(\n  input: RumbleInput<any, any, any, any, any, any>,\n) {\n  if (!isPostgresDB(input.db)) {\n    console.info(\n      \"Database dialect is not compatible with search, skipping search initialization. Only PostgreSQL is supported.\",\n    );\n    return;\n  }\n\n  try {\n    await input.db.execute(sql`CREATE EXTENSION IF NOT EXISTS pg_trgm;`);\n  } catch (error) {\n    console.error(\n      \"Failed to create pg_trgm extension. Search functionality may not work. \" +\n        \"Ensure the database user has CREATE privilege or the extension is pre-installed.\",\n      error,\n    );\n    return;\n  }\n  if (input.search?.threshold) {\n    // make absolutely sure the threshold is a number\n    const threshold = Number(input.search.threshold);\n\n    if (threshold < 0 || threshold > 1) {\n      throw new Error(`Search threshold must be between 0 and 1`);\n    }\n\n    const result = await input.db.execute(sql`SELECT current_database()`);\n    const dbName = result.rows[0].current_database;\n\n    await input.db.execute(\n      sql.raw(\n        `ALTER DATABASE ${dbName} SET pg_trgm.similarity_threshold = ${threshold};`,\n      ),\n    );\n  }\n\n  if (input.search?.cpu_operator_cost) {\n    if (typeof input.search.cpu_operator_cost !== \"number\") {\n      throw new Error(`CPU operator cost must be a number`);\n    }\n\n    if (input.search.cpu_operator_cost <= 0) {\n      throw new Error(`CPU operator cost must be a positive number`);\n    }\n  }\n}\n\n/**\n * Performs adjustments to the query args to issue a full text search in case the\n * respective feature is enabled and a search term was provided.\n */\nexport function adjustQueryArgsForSearch({\n  search,\n  args,\n  tableSchema,\n  abilities,\n}: Pick<RumbleInput<any, any, any, any, any, any>, \"search\"> & {\n  //TODO types\n  args: any;\n  tableSchema: ReturnType<typeof tableHelper>;\n  //TODO types\n  abilities: any;\n}) {\n  if (search?.enabled && args.search && args.search.length > 0) {\n    // this prevents columns beeing searched which are not accessible to the user\n    // if the abilities defined the user not to be allowed to read something, we need\n    // to prevent it from beeing included in the search since this could\n    // leak information\n    const columnsToSearch = (\n      abilities.query.many.columns\n        ? Object.entries(tableSchema.columns).filter(\n            ([key]) => abilities.query.many.columns[key],\n          )\n        : Object.entries(tableSchema.columns)\n    ).filter(\n      ([_key, col]) =>\n        isStringLikeSQLTypeString(col.getSQLType()) ||\n        isIDLikeSQLTypeString(col.getSQLType()),\n    );\n\n    const searchParam = sql`${args.search}`;\n\n    args.extras = {\n      search_distance: (table: any) =>\n        sql`${sql.join(\n          columnsToSearch.map(([key]) => {\n            return sql`COALESCE((${table[key]}::TEXT <-> ${searchParam}), 1)`;\n          }),\n          sql.raw(\" + \"),\n        )}`,\n    };\n\n    const originalOrderBy = cloneDeep(args.orderBy);\n    (args as any).orderBy = (table: any) => {\n      const argsOrderBySQL = sql.join(\n        Object.entries(originalOrderBy ?? {}).map(([key, value]) => {\n          // value is \"asc\" or \"desc\"\n          if (value === \"asc\") {\n            return sql`${table[key]} ASC`;\n          } else if (value === \"desc\") {\n            return sql`${table[key]} DESC`;\n          } else {\n            throw new Error(`Invalid value ${value} for orderBy`);\n          }\n        }),\n        sql.raw(\", \"),\n      );\n\n      const searchSQL = sql`search_distance ASC`;\n\n      const ret = originalOrderBy\n        ? sql.join([argsOrderBySQL, searchSQL], sql.raw(\", \"))\n        : searchSQL;\n\n      return ret;\n    };\n\n    const originalWhere = cloneDeep(args.where);\n\n    // this limits the search to the rows which at least match the threshold score\n    (args as any).where = {\n      AND: [\n        originalWhere ?? {},\n        {\n          RAW: (table: any) =>\n            sql`(${sql.join(\n              columnsToSearch.map(([key]) => {\n                return sql`${table[key]} % ${searchParam}`;\n              }),\n              sql.raw(\" OR \"),\n            )})`,\n        },\n      ],\n    };\n  }\n}\n","import type { FieldMap } from \"@pothos/core\";\nimport type { DrizzleObjectFieldBuilder } from \"@pothos/plugin-drizzle\";\nimport { is, One } from \"drizzle-orm\";\nimport { PgColumn } from \"drizzle-orm/pg-core\";\nimport { capitalize } from \"es-toolkit\";\nimport pluralize from \"pluralize\";\nimport type { AbilityBuilderType } from \"./abilityBuilder\";\nimport type { OrderArgImplementerType } from \"./args/orderArg\";\nimport type { WhereArgImplementerType } from \"./args/whereArg\";\nimport { type EnumImplementerType, isEnumSchema } from \"./enum\";\nimport { buildPothosResponseTypeFromGraphQLType } from \"./helpers/sqlTypes/mapDrizzleTypeToGraphQlType\";\nimport type { PossibleSQLType } from \"./helpers/sqlTypes/types\";\nimport { tableHelper } from \"./helpers/tableHelpers\";\nimport type { MakePubSubInstanceType } from \"./pubsub\";\nimport { adjustQueryArgsForSearch } from \"./search\";\nimport type {\n  DrizzleInstance,\n  DrizzleQueryFunction,\n  DrizzleTableValueType,\n} from \"./types/drizzleInstanceType\";\nimport { RumbleError } from \"./types/rumbleError\";\nimport type {\n  CustomRumblePothosConfig,\n  RumbleInput,\n} from \"./types/rumbleInput\";\nimport type { SchemaBuilderType } from \"./types/schemaBuilderType\";\n\n// TODO remove as many as any types as possible here\n\n//TODO this is a bit flaky, we should check if we can determine the config object more reliably\n//TODO maybe a plugin can place some marker field on these objects?\n// like this?\n// if (t instanceof DrizzleObjectOptions) {\n//   return true;\n// }\n\nconst isProbablyAConfigObject = (t: any) => {\n  if (typeof t !== \"object\") {\n    return false;\n  }\n\n  if (\n    Object.keys(t).some((k) =>\n      [\n        \"args\",\n        \"nullable\",\n        \"query\",\n        \"subscribe\",\n        \"description\",\n        \"type\",\n        \"resolve\",\n      ].find((e) => e === k),\n    )\n  )\n    return true;\n  return false;\n};\n\nexport const createObjectImplementer = <\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n  Schema extends Record<string, any>,\n>({\n  db,\n  search,\n  schemaBuilder,\n  makePubSubInstance,\n  whereArgImplementer,\n  orderArgImplementer,\n  enumImplementer,\n  abilityBuilder,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig, Schema> & {\n  schemaBuilder: SchemaBuilderType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >;\n  whereArgImplementer: WhereArgImplementerType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >;\n  orderArgImplementer: OrderArgImplementerType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >;\n  enumImplementer: EnumImplementerType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig,\n    any\n  >;\n  makePubSubInstance: MakePubSubInstanceType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >;\n  abilityBuilder: AbilityBuilderType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >;\n}) => {\n  type SchemaBuilder = SchemaBuilderType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >;\n  return <\n    TableName extends keyof DrizzleQueryFunction<DB>,\n    RefName extends string,\n  >({\n    table,\n    refName,\n    readAction = \"read\" as Action,\n    adjust,\n  }: {\n    /**\n     * The table you want to be used as reference for the object creation.\n     */\n    table: TableName;\n    /**\n     * The name you want this object to have in your graphql schema.\n     * Rumble will create a reasonable default if not specified.\n     */\n    refName?: RefName;\n    /**\n     * The action used for read access to the table.\n     * Defaults to \"read\".\n     */\n    readAction?: Action;\n    /**\n     * A function which can be used to adjust the fields of the object.\n     * You can extend the object by specifying fields that do not exist as\n     * per your db schema, or overwrite existing fields with the same name.\n     * In case you do overwrite, rumble will set proper nullability and\n     * subscription properties if you do not specify them explicitly.\n     */\n    adjust?:\n      | ((\n          t: DrizzleObjectFieldBuilder<\n            SchemaBuilder[\"$inferSchemaTypes\"],\n            SchemaBuilder[\"$inferSchemaTypes\"][\"DrizzleRelations\"][TableName],\n            DrizzleTableValueType<DB, TableName>\n          >,\n        ) => FieldMap)\n      | undefined;\n  }) => {\n    const tableSchema = tableHelper({ db, table });\n\n    if (Object.keys(tableSchema.primaryKey).length === 0) {\n      console.warn(\n        `Could not find primary key for ${table.toString()}. Cannot register subscriptions!`,\n      );\n    }\n    const primaryKey = Object.values(tableSchema.primaryKey)[0];\n\n    const { registerOnInstance } = makePubSubInstance({ table: table });\n\n    return schemaBuilder.drizzleObject(table, {\n      name: refName ?? capitalize(table.toString()),\n      subscribe: (subscriptions, element, _context) => {\n        if (!primaryKey) return;\n        const primaryKeyValue = (element as any)[primaryKey.name];\n        if (!primaryKeyValue) {\n          console.warn(\n            `Could not find primary key value for ${JSON.stringify(\n              element,\n            )}. Cannot register subscription!`,\n          );\n          return;\n        }\n\n        //TODO maybe register non specific update calls aswell?\n        registerOnInstance({\n          instance: subscriptions,\n          action: \"updated\",\n          primaryKeyValue: primaryKeyValue,\n        });\n      },\n      applyFilters: abilityBuilder?._.registeredFilters({\n        table,\n        action: readAction,\n      }),\n      fields: (t) => {\n        const columns = tableSchema.columns;\n\n        // in case the user makes adjustments we want to store away which\n        // pothos function was called with what config\n        // this is mapped to the ref which later can be used to\n        // reference these parameters while iterating over the fields\n        // and checking against the userAdjustments object\n        // this is necessary to e.g. merge nullability info from the database schema\n        // or register subscriptions on relations\n        const configMap = new Map<\n          any,\n          {\n            creatorFunction: (...p: any[]) => any;\n            params: any[];\n            configObject: any;\n          }\n        >();\n        // stores the results of the user adjustments\n        // also stores all the used pothos functions and the configs\n        // provided by the user so we can extend that if necessary\n        const userAdjustments =\n          adjust?.(\n            new Proxy(t, {\n              get: (target, prop, _receiver) => {\n                if (\n                  // we only care for field/relation functions\n                  typeof (target as any)[prop] !== \"function\" ||\n                  prop === \"arg\" ||\n                  prop === \"builder\" ||\n                  prop === \"graphqlKind\" ||\n                  prop === \"kind\" ||\n                  prop === \"listRef\" ||\n                  prop === \"table\" ||\n                  prop === \"typename\" ||\n                  prop === \"variant\" ||\n                  prop.toString().startsWith(\"boolean\") ||\n                  prop.toString().startsWith(\"float\") ||\n                  prop.toString().startsWith(\"id\") ||\n                  prop.toString().startsWith(\"int\") ||\n                  prop.toString().startsWith(\"string\") ||\n                  prop.toString().startsWith(\"expose\")\n                ) {\n                  return (target as any)[prop];\n                }\n\n                return (...params: any[]) => {\n                  const ref = (target as any)[prop](...params);\n                  const configObject = params.find(isProbablyAConfigObject);\n                  if (!configObject)\n                    throw new RumbleError(\n                      \"Expected config object to be passed to adjust field\",\n                    );\n\n                  configMap.set(ref, {\n                    params,\n                    creatorFunction: (target as any)[prop],\n                    configObject,\n                  });\n                  return ref;\n                };\n              },\n            }) as any,\n          ) ?? {};\n\n        const fields = Object.entries(columns).reduce(\n          (acc, [key, column]) => {\n            // in case the user wants to overwrite a field\n            // we want to merge with our stuff in case the user\n            // did not specify it themselves\n            if (userAdjustments[key]) {\n              const { params, creatorFunction, configObject } = configMap.get(\n                userAdjustments[key],\n              )!;\n\n              if (typeof configObject.nullable !== \"boolean\") {\n                configObject.nullable = !column.notNull;\n              }\n\n              userAdjustments[key] = creatorFunction.bind(t)(...params);\n              return acc;\n            }\n\n            // Array columns only exist on Postgres; `dimensions` is a runtime\n            // property of PgColumn instances. Gate via is() so MySQL/SQLite\n            // columns aren't probed for a field they don't have.\n            let isArray = false;\n            if (is(column, PgColumn)) {\n              const dimensions = (column as PgColumn & { dimensions?: number })\n                .dimensions;\n              if (dimensions && dimensions > 0) {\n                if (dimensions !== 1) {\n                  throw new RumbleError(\n                    \"Only one-dimensional arrays are supported for default object implementation\",\n                  );\n                }\n                isArray = true;\n              }\n            }\n\n            if (isEnumSchema(column)) {\n              const enumImpl = enumImplementer({\n                enumColumn: column,\n              });\n\n              acc[key] = t.field({\n                type: isArray ? [enumImpl] : enumImpl,\n                resolve: (element) => (element as any)[key],\n                nullable: !column.notNull,\n              });\n            } else {\n              acc[key] = buildPothosResponseTypeFromGraphQLType({\n                builder: t,\n                sqlType: column.getSQLType() as PossibleSQLType,\n                fieldName: key,\n                nullable: !column.notNull,\n                isArray,\n              });\n            }\n            return acc;\n          },\n          {} as Record<\n            keyof typeof columns,\n            | ReturnType<typeof buildPothosResponseTypeFromGraphQLType>\n            | ReturnType<typeof t.field>\n          >,\n        );\n\n        const relations = Object.entries(tableSchema.relations ?? {}).reduce(\n          (acc, [key, value]) => {\n            const targetTsName = (value as any).targetTableName as string;\n            const relationSchema = tableHelper({\n              db,\n              table: targetTsName,\n            });\n            const WhereArg = whereArgImplementer({\n              dbName: relationSchema.dbName,\n            });\n            const OrderArg = orderArgImplementer({\n              dbName: relationSchema.dbName,\n            });\n            const relationTablePubSub = makePubSubInstance({\n              table: relationSchema.tsName as any,\n            });\n\n            // many relations will return an empty array so we just don't set them nullable\n            let nullable = false;\n            let isMany = true;\n            let filterSpecifier = \"many\";\n            if (is(value, One)) {\n              isMany = false;\n              nullable =\n                value.optional ||\n                !value.sourceColumns.every((column) => column.notNull);\n              filterSpecifier = \"single\";\n            }\n\n            const subscribe = (subscriptions: any, _element: any) => {\n              relationTablePubSub.registerOnInstance({\n                instance: subscriptions,\n                action: \"created\",\n              });\n              relationTablePubSub.registerOnInstance({\n                instance: subscriptions,\n                action: \"removed\",\n              });\n            };\n\n            // in case the user wants to overwrite a field\n            // we want to merge with our stuff in case the user\n            // did not specify it themselves\n            if (userAdjustments[key]) {\n              const { params, creatorFunction, configObject } = configMap.get(\n                userAdjustments[key],\n              )!;\n\n              if (typeof configObject.nullable !== \"boolean\") {\n                configObject.nullable = nullable;\n              }\n\n              if (typeof configObject.subscribe !== \"function\") {\n                configObject.subscribe = subscribe;\n              }\n\n              userAdjustments[key] = creatorFunction.bind(t)(...params);\n              return acc;\n            }\n\n            const args = {\n              where: t.arg({ type: WhereArg, required: false }),\n              orderBy: t.arg({ type: OrderArg, required: false }),\n              ...(isMany\n                ? {\n                    offset: t.arg.int({ required: false }),\n                    limit: t.arg.int({ required: false }),\n                  }\n                : {}),\n              search: t.arg.string({ required: false }),\n            };\n\n            if (!search?.enabled || !isMany) {\n              delete (args as any).search;\n            }\n\n            (acc as any)[key] = t.relation(\n              key as any,\n              {\n                args,\n                subscribe,\n                nullable,\n                description: `Get the ${pluralize.plural(relationSchema.tsName)} related to this ${pluralize.singular(tableSchema.tsName)}`,\n                query: (args: any, ctx: any) => {\n                  // transform null prototyped object\n                  args = JSON.parse(JSON.stringify(args));\n\n                  if (isMany) {\n                    adjustQueryArgsForSearch({\n                      search,\n                      args,\n                      tableSchema: relationSchema,\n                      abilities:\n                        ctx.abilities[relationSchema.tsName].filter(readAction),\n                    });\n                  }\n\n                  const filter = ctx.abilities[relationSchema.tsName]\n                    .filter(readAction)\n                    .merge({\n                      where: args.where,\n                      limit: args.limit,\n                      extras: args.extras,\n                    }).query[filterSpecifier];\n\n                  if (args.offset) {\n                    (filter as any).offset = args.offset;\n                  }\n\n                  if (args.orderBy) {\n                    (filter as any).orderBy = args.orderBy;\n                  }\n\n                  return filter;\n                },\n              } as any,\n            ) as any;\n            return acc;\n          },\n          {} as Record<\n            keyof typeof tableSchema.relations,\n            ReturnType<typeof buildPothosResponseTypeFromGraphQLType>\n          >,\n        );\n\n        if (search?.enabled) {\n          if (fields.search_distance) {\n            throw new Error(\n              \"Reserved field name 'search_distance' found on \" +\n                tableSchema.tsName +\n                \". If search is enabled, the 'search_distance' field is automatically added and cannot be defined manually.\",\n            );\n          }\n\n          fields.search_distance = t.float({\n            description:\n              \"The search distance of the object. If a search is provided, this field will be populated with the search distance.\",\n            nullable: true,\n            resolve: (parent, _args, _ctx, _info) =>\n              (parent as any).search_distance,\n          });\n        }\n\n        return {\n          ...fields,\n          ...relations,\n          ...userAdjustments,\n        };\n      },\n    });\n  };\n};\n","import { createPubSub } from \"graphql-yoga\";\nimport type {\n  DrizzleInstance,\n  DrizzleQueryFunction,\n} from \"./types/drizzleInstanceType\";\nimport type {\n  CustomRumblePothosConfig,\n  RumbleInput,\n} from \"./types/rumbleInput\";\n\ntype PubSubAction = \"created\" | \"removed\" | \"updated\";\n\nconst SUBSCRIPTION_NOTIFIER_RUMBLE_PREFIX = \"RUMBLE_SUBSCRIPTION_NOTIFICATION\";\nconst SUBSCRIPTION_NOTIFIER_REMOVED = \"REMOVED\";\nconst SUBSCRIPTION_NOTIFIER_UPDATED = \"UPDATED\";\nconst SUBSCRIPTION_NOTIFIER_CREATED = \"CREATED\";\n\nexport type MakePubSubInstanceType<\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n  typeof createPubSubInstance<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >\n>[\"makePubSubInstance\"];\n\nexport const createPubSubInstance = <\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n>({\n  subscriptions,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig>) => {\n  const pubsub = subscriptions\n    ? createPubSub(...subscriptions)\n    : createPubSub();\n\n  const makePubSubInstance = <\n    TableName extends keyof DrizzleQueryFunction<DB>,\n  >({\n    table,\n  }: {\n    table: TableName;\n  }) => {\n    type PrimaryKeyType = any;\n\n    function makePubSubKey({\n      action,\n      tableName,\n      primaryKeyValue,\n    }: {\n      tableName: string;\n      action: PubSubAction;\n      primaryKeyValue?: PrimaryKeyType;\n    }) {\n      let actionKey: string;\n\n      switch (action) {\n        case \"created\":\n          actionKey = SUBSCRIPTION_NOTIFIER_CREATED;\n          break;\n        case \"removed\":\n          actionKey = SUBSCRIPTION_NOTIFIER_REMOVED;\n          break;\n        case \"updated\":\n          actionKey = SUBSCRIPTION_NOTIFIER_UPDATED;\n          break;\n        default:\n          throw new Error(`Unknown action: ${action}`);\n      }\n\n      return `${SUBSCRIPTION_NOTIFIER_RUMBLE_PREFIX}/${tableName}${\n        primaryKeyValue ? `/${primaryKeyValue}` : \"\"\n      }/${actionKey}`;\n    }\n\n    // TODO does caching these make sense?\n    return {\n      /**\n       * Call this when you want to register a subscription on an instance to this table\n       */\n      registerOnInstance({\n        instance,\n        action,\n        primaryKeyValue,\n      }: {\n        instance: { register: (id: string) => void };\n        action: PubSubAction;\n        primaryKeyValue?: string;\n      }) {\n        const key = makePubSubKey({\n          tableName: table.toString(),\n          action,\n          primaryKeyValue,\n        });\n        instance.register(key);\n      },\n      /**\n       * Call this when you created an entity of this table\n       */\n      created() {\n        const key = makePubSubKey({\n          tableName: table.toString(),\n          action: \"created\",\n        });\n        return pubsub.publish(key);\n      },\n      /**\n       * Call this when you removed one or more entities of this table\n       */\n      // removed(primaryKeyValue?: PrimaryKeyType | PrimaryKeyType[]) {\n      removed() {\n        const key = makePubSubKey({\n          tableName: table.toString(),\n          action: \"removed\",\n          //TODO would it make sense to use specific sub topics here?\n          // primaryKeyValue,\n        });\n        return pubsub.publish(key);\n      },\n      /**\n       * Call this when you updated one or more entities of this table\n       */\n      updated(primaryKeyValue?: PrimaryKeyType | PrimaryKeyType[]) {\n        const primaryKeys = Array.isArray(primaryKeyValue)\n          ? primaryKeyValue\n          : [primaryKeyValue];\n        const keys = primaryKeys.map((primaryKeyValue) =>\n          makePubSubKey({\n            tableName: table.toString(),\n            action: \"updated\",\n            primaryKeyValue,\n          }),\n        );\n        const uniqueKeys = Array.from(new Set(keys));\n        for (const key of uniqueKeys) {\n          pubsub.publish(key);\n        }\n      },\n    };\n  };\n\n  return {\n    pubsub,\n    makePubSubInstance,\n  };\n};\n","import { sql } from \"drizzle-orm\";\nimport pluralize from \"pluralize\";\nimport type { OrderArgImplementerType } from \"./args/orderArg\";\nimport type { WhereArgImplementerType } from \"./args/whereArg\";\nimport { assertFindFirstExists } from \"./helpers/asserts\";\nimport { isPostgresDB } from \"./helpers/determineDialectFromSchema\";\nimport { mapNullFieldsToUndefined } from \"./helpers/mapNullFieldsToUndefined\";\nimport { deepSetProto } from \"./helpers/protoMapper\";\nimport { tableHelper } from \"./helpers/tableHelpers\";\nimport type { MakePubSubInstanceType } from \"./pubsub\";\nimport { adjustQueryArgsForSearch } from \"./search\";\nimport type {\n  DrizzleInstance,\n  DrizzleQueryFunction,\n} from \"./types/drizzleInstanceType\";\nimport type {\n  CustomRumblePothosConfig,\n  RumbleInput,\n} from \"./types/rumbleInput\";\nimport type { SchemaBuilderType } from \"./types/schemaBuilderType\";\n\nexport const createQueryImplementer = <\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n  Schema extends Record<string, any>,\n>({\n  db,\n  schemaBuilder,\n  search,\n  whereArgImplementer,\n  orderArgImplementer,\n  makePubSubInstance,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig, Schema> & {\n  schemaBuilder: SchemaBuilderType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >;\n  whereArgImplementer: WhereArgImplementerType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >;\n  orderArgImplementer: OrderArgImplementerType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >;\n  makePubSubInstance: MakePubSubInstanceType<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >;\n}) => {\n  return <TableName extends keyof DrizzleQueryFunction<DB>>({\n    table,\n    readAction = \"read\" as Action,\n    listAction = \"read\" as Action,\n  }: {\n    /**\n     * The table for which to implement the query\n     */\n    table: TableName;\n    /**\n     * Which action should be used for reading single entities\n     * @default \"read\"\n     */\n    readAction?: Action;\n    /**\n     * Which action should be used for listing many entities\n     * @default \"read\"\n     */\n    listAction?: Action;\n  }) => {\n    const WhereArg = whereArgImplementer({\n      table: table,\n    });\n    const OrderArg = orderArgImplementer({\n      table: table,\n    });\n    const tableSchema = tableHelper({\n      db,\n      table,\n    });\n    const primaryKeyField = Object.values(tableSchema.primaryKey)[0];\n\n    const { registerOnInstance } = makePubSubInstance({ table: table });\n\n    return schemaBuilder.queryFields((t) => {\n      const manyArgs = {\n        where: t.arg({ type: WhereArg, required: false }),\n        orderBy: t.arg({ type: OrderArg, required: false }),\n        limit: t.arg.int({ required: false }),\n        offset: t.arg.int({ required: false }),\n        search: t.arg.string({ required: false }),\n      };\n\n      if (!search?.enabled) {\n        delete (manyArgs as any).search;\n      }\n\n      return {\n        [pluralize.plural(table.toString())]: t.drizzleField({\n          type: [table],\n          nullable: false,\n          smartSubscription: true,\n          description: `List all ${pluralize.plural(table.toString())}`,\n          subscribe: (subscriptions, _root, _args, _ctx, _info) => {\n            registerOnInstance({\n              instance: subscriptions,\n              action: \"created\",\n            });\n            registerOnInstance({\n              instance: subscriptions,\n              action: \"removed\",\n            });\n          },\n          args: manyArgs,\n          resolve: (query, _root, args, ctx, _info) => {\n            // args does not have Object.prototype as prototype, so we need to set it\n            // otherwise some libraries (like drizzle-orm) might have issues with it\n            deepSetProto(args);\n\n            adjustQueryArgsForSearch({\n              search,\n              args,\n              tableSchema,\n              abilities: ctx.abilities[table].filter(listAction),\n            });\n\n            const mappedArgs = mapNullFieldsToUndefined(args);\n            const filter = ctx.abilities[table]\n              .filter(listAction)\n              .merge(mappedArgs as any).query.many;\n\n            if (mappedArgs.offset) {\n              (filter as any).offset = mappedArgs.offset;\n            }\n\n            if (mappedArgs.orderBy) {\n              (filter as any).orderBy = mappedArgs.orderBy;\n            }\n\n            const queryInstance = query(filter as any);\n\n            if ((filter as any).columns) {\n              queryInstance.columns = (filter as any).columns;\n            }\n\n            if (\n              search?.enabled &&\n              args.search &&\n              args.search.length > 0 &&\n              search?.cpu_operator_cost\n            ) {\n              return db.transaction(async (tx) => {\n                if (isPostgresDB(tx)) {\n                  await tx.execute(\n                    sql.raw(\n                      `SET cpu_operator_cost = ${search.cpu_operator_cost};`,\n                    ),\n                  );\n                } else {\n                  console.info(\n                    \"Database dialect is not postgresql, cannot set cpu_operator_cost.\",\n                  );\n                }\n                return (tx.query as any)[table].findMany(queryInstance);\n              });\n            }\n\n            return (db.query as any)[table].findMany(queryInstance);\n          },\n        }),\n        [pluralize.singular(table.toString())]: t.drizzleField({\n          type: table,\n          nullable: false,\n          smartSubscription: true,\n          description: `Get a single ${pluralize.singular(table.toString())} by ID`,\n          args: {\n            id: t.arg.id({ required: true }),\n          },\n          resolve: (query, _root, args, ctx, _info) => {\n            deepSetProto(args);\n\n            const filter = (ctx.abilities as any)[table]\n              .filter(readAction)\n              .merge({ where: { [primaryKeyField.name]: args.id } })\n              .query.single;\n            const q = query(filter);\n\n            if (filter.columns) {\n              q.columns = filter.columns;\n            }\n\n            return (db.query as any)[table]\n              .findFirst(q)\n              .then(assertFindFirstExists);\n          },\n        }),\n      };\n    });\n  };\n};\n","export type NumberWhereInputArgument = {\n  eq?: number;\n  ne?: number;\n  gt?: number;\n  gte?: number;\n  lt?: number;\n  lte?: number;\n  in?: number[];\n  notIn?: number[];\n  like?: string;\n  ilike?: string;\n  notLike?: string;\n  notIlike?: string;\n  isNull?: boolean;\n  isNotNull?: boolean;\n  arrayOverlaps?: number[];\n  arrayContained?: number[];\n  arrayContains?: number[];\n  AND?: NumberWhereInputArgument[];\n  OR?: NumberWhereInputArgument[];\n  NOT?: NumberWhereInputArgument;\n};\n\nexport type StringWhereInputArgument = {\n  eq?: string;\n  ne?: string;\n  gt?: string;\n  gte?: string;\n  lt?: string;\n  lte?: string;\n  in?: string[];\n  notIn?: string[];\n  like?: string;\n  ilike?: string;\n  notLike?: string;\n  notIlike?: string;\n  isNull?: boolean;\n  isNotNull?: boolean;\n  arrayOverlaps?: string[];\n  arrayContained?: string[];\n  arrayContains?: string[];\n  AND?: StringWhereInputArgument[];\n  OR?: StringWhereInputArgument[];\n  NOT?: StringWhereInputArgument;\n};\n\nexport type DateWhereInputArgument = {\n  eq?: Date;\n  ne?: Date;\n  gt?: Date;\n  gte?: Date;\n  lt?: Date;\n  lte?: Date;\n  in?: Date[];\n  notIn?: Date[];\n  like?: string;\n  ilike?: string;\n  notLike?: string;\n  notIlike?: string;\n  isNull?: boolean;\n  isNotNull?: boolean;\n  arrayOverlaps?: Date[];\n  arrayContained?: Date[];\n  arrayContains?: Date[];\n  AND?: DateWhereInputArgument[];\n  OR?: DateWhereInputArgument[];\n  NOT?: DateWhereInputArgument;\n};\n\n// TODO: Add proper type for schemaBuilder\n\nexport function implementDefaultWhereInputArgs(schemaBuilder: any) {\n  const IntWhereInputArgument = schemaBuilder\n    .inputRef(\"IntWhereInputArgument\")\n    .implement({\n      fields: (t: any) => ({\n        eq: t.int(),\n        ne: t.int(),\n        gt: t.int(),\n        gte: t.int(),\n        lt: t.int(),\n        lte: t.int(),\n        in: t.intList(),\n        notIn: t.intList(),\n        like: t.string(),\n        ilike: t.string(),\n        notLike: t.string(),\n        notIlike: t.string(),\n        isNull: t.boolean(),\n        isNotNull: t.boolean(),\n        arrayOverlaps: t.intList(),\n        arrayContained: t.intList(),\n        arrayContains: t.intList(),\n        AND: t.field({\n          type: [IntWhereInputArgument],\n        }),\n        OR: t.field({\n          type: [IntWhereInputArgument],\n        }),\n        NOT: t.field({\n          type: IntWhereInputArgument,\n        }),\n      }),\n    });\n\n  const FloatWhereInputArgument = schemaBuilder\n    .inputRef(\"FloatWhereInputArgument\")\n    .implement({\n      fields: (t: any) => ({\n        eq: t.float(),\n        ne: t.float(),\n        gt: t.float(),\n        gte: t.float(),\n        lt: t.float(),\n        lte: t.float(),\n        in: t.floatList(),\n        notIn: t.floatList(),\n        like: t.string(),\n        ilike: t.string(),\n        notLike: t.string(),\n        notIlike: t.string(),\n        isNull: t.boolean(),\n        isNotNull: t.boolean(),\n        arrayOverlaps: t.floatList(),\n        arrayContained: t.floatList(),\n        arrayContains: t.floatList(),\n        AND: t.field({\n          type: [FloatWhereInputArgument],\n        }),\n        OR: t.field({\n          type: [FloatWhereInputArgument],\n        }),\n        NOT: t.field({\n          type: FloatWhereInputArgument,\n        }),\n      }),\n    });\n\n  const StringWhereInputArgument = schemaBuilder\n    .inputRef(\"StringWhereInputArgument\")\n    .implement({\n      fields: (t: any) => ({\n        eq: t.string(),\n        ne: t.string(),\n        gt: t.string(),\n        gte: t.string(),\n        lt: t.string(),\n        lte: t.string(),\n        in: t.stringList(),\n        notIn: t.stringList(),\n        like: t.string(),\n        ilike: t.string(),\n        notLike: t.string(),\n        notIlike: t.string(),\n        isNull: t.boolean(),\n        isNotNull: t.boolean(),\n        arrayOverlaps: t.stringList(),\n        arrayContained: t.stringList(),\n        arrayContains: t.stringList(),\n        AND: t.field({\n          type: [StringWhereInputArgument],\n        }),\n        OR: t.field({\n          type: [StringWhereInputArgument],\n        }),\n        NOT: t.field({\n          type: StringWhereInputArgument,\n        }),\n      }),\n    });\n\n  const DateWhereInputArgument = schemaBuilder\n    .inputRef(\"DateWhereInputArgument\")\n    .implement({\n      fields: (t: any) => ({\n        eq: t.field({ type: \"Date\" }),\n        ne: t.field({ type: \"Date\" }),\n        gt: t.field({ type: \"Date\" }),\n        gte: t.field({ type: \"Date\" }),\n        lt: t.field({ type: \"Date\" }),\n        lte: t.field({ type: \"Date\" }),\n        in: t.field({ type: [\"Date\"] }),\n        notIn: t.field({ type: [\"Date\"] }),\n        like: t.string(),\n        ilike: t.string(),\n        notLike: t.string(),\n        notIlike: t.string(),\n        isNull: t.boolean(),\n        isNotNull: t.boolean(),\n        arrayOverlaps: t.field({ type: [\"Date\"] }),\n        arrayContained: t.field({ type: [\"Date\"] }),\n        arrayContains: t.field({ type: [\"Date\"] }),\n        AND: t.field({\n          type: [DateWhereInputArgument],\n        }),\n        OR: t.field({\n          type: [DateWhereInputArgument],\n        }),\n        NOT: t.field({\n          type: DateWhereInputArgument,\n        }),\n      }),\n    });\n}\n","export type Prefetch<Context, ReturnType> = (params: {\n  context: Context;\n}) => Promise<ReturnType>;\n\nexport type Filter<\n  Context,\n  FilteredEntityType,\n  PrefetchReturnType = never,\n> = (p: {\n  context: Context;\n  entities: FilteredEntityType[];\n  prefetched: PrefetchReturnType;\n}) => FilteredEntityType[] | Promise<FilteredEntityType[]>;\n\nexport type FilterPrefetchCombo<\n  Context,\n  FilteredEntityType,\n  PrefetchReturnType = never,\n> = {\n  filter: Filter<Context, FilteredEntityType, PrefetchReturnType>;\n  prefetch?: Prefetch<Context, PrefetchReturnType>;\n};\n\nexport type ApplyFiltersField<Context, T> =\n  | FilterPrefetchCombo<Context, T>\n  | FilterPrefetchCombo<Context, T>[]\n  | undefined;\n\nexport const pluginName = \"RuntimeFiltersPlugin\" as const;\n","import type { Span, Tracer } from \"@opentelemetry/api\";\nimport SchemaBuilder, {\n  BasePlugin,\n  type PothosOutputFieldConfig,\n  type PothosTypeConfig,\n  type SchemaTypes,\n} from \"@pothos/core\";\nimport type { GraphQLFieldResolver } from \"graphql\";\nimport { type ApplyFiltersField, pluginName } from \"./filterTypes\";\n\nexport const applyFiltersKey = \"applyFilters\";\n\nexport class RuntimeFiltersPlugin<\n  Types extends SchemaTypes,\n> extends BasePlugin<Types> {\n  private tracer?: Tracer;\n  private tracerEnabled?: boolean;\n\n  override onTypeConfig(typeConfig: PothosTypeConfig) {\n    this.tracer = this.builder.options.otel?.tracer;\n    this.tracerEnabled = this.builder.options.otel?.enabled;\n    return typeConfig;\n  }\n\n  override wrapResolve(\n    resolver: GraphQLFieldResolver<unknown, Types[\"Context\"], object>,\n    fieldConfig: PothosOutputFieldConfig<Types>,\n  ): GraphQLFieldResolver<unknown, Types[\"Context\"], object> {\n    return async (parent, args, context, info) => {\n      //TODO: https://github.com/hayes/pothos/discussions/1431#discussioncomment-12974130\n      let filters: ApplyFiltersField<Types[\"Context\"], any> | undefined;\n      const fieldType = fieldConfig?.type as any;\n\n      if (fieldType.kind === \"List\") {\n        filters =\n          fieldType.type?.ref.currentConfig.pothosOptions[applyFiltersKey];\n      } else if (fieldType.kind === \"Object\") {\n        filters = fieldType.ref.currentConfig.pothosOptions[applyFiltersKey];\n      }\n\n      if (!filters || !Array.isArray(filters) || filters.length === 0) {\n        // if no filter should be applied, just continue\n        return resolver(parent, args, context, info);\n      }\n\n      const runFilters = async (span?: Span) => {\n        const allFilters = Array.isArray(filters) ? filters : [filters];\n        span?.setAttribute(\"filters.total\", allFilters.length);\n\n        // TODO: find out if the aggrefagation across relation and then parallel execution is possible\n        const prefetchedFiltersPromises = Promise.all(\n          allFilters.map(async (filter) => {\n            if (filter.prefetch) {\n              const prefetched = await filter.prefetch({ context });\n              return ({\n                context,\n                entities,\n              }: {\n                context: Types[\"Context\"];\n                entities: any;\n              }) => filter.filter({ context, entities, prefetched });\n            }\n            return ({\n              context,\n              entities,\n            }: {\n              context: Types[\"Context\"];\n              entities: any;\n            }) => filter.filter({ context, entities } as any);\n          }),\n        );\n\n        let resolved: any, prefetchedFilters: any;\n\n        if (this.tracer && this.tracerEnabled) {\n          const o = await this.tracer.startActiveSpan(\n            `apply_filters`,\n            async (span) => {\n              try {\n                return await Promise.all([\n                  resolver(parent, args, context, info),\n                  prefetchedFiltersPromises,\n                ]);\n              } finally {\n                span.end();\n              }\n            },\n          );\n          resolved = o[0];\n          prefetchedFilters = o[1];\n        } else {\n          const o = await Promise.all([\n            resolver(parent, args, context, info),\n            prefetchedFiltersPromises,\n          ]);\n          resolved = o[0];\n          prefetchedFilters = o[1];\n        }\n\n        const allowed = Array.from(\n          (\n            await Promise.all(\n              prefetchedFilters.map((f: any) =>\n                f({\n                  context,\n                  entities: Array.isArray(resolved)\n                    ? resolved\n                    : ([resolved] as any),\n                }),\n              ),\n            )\n          ).reduce((acc, val) => {\n            for (const element of val) {\n              acc.add(element);\n            }\n            return acc;\n            // since multiple helpers might return the same entity we use a set to deduplicate\n          }, new Set()),\n        );\n\n        span?.setAttribute(\"filters.allowed\", allowed.length);\n\n        // if the original value was an array, return an array\n        if (Array.isArray(resolved)) {\n          return allowed;\n        }\n\n        // if the original value was a single value, return the first allowed\n        // or null if not allowed\n        return allowed[0] ?? null;\n      };\n\n      if (this.tracer && this.tracerEnabled) {\n        return this.tracer.startActiveSpan(\n          `filter_${fieldConfig.name}`,\n          async (span) => {\n            try {\n              return await runFilters(span);\n            } finally {\n              span.end();\n            }\n          },\n        );\n      } else {\n        return runFilters();\n      }\n    };\n  }\n}\n\nlet registered = false;\nexport function registerRuntimeFiltersPlugin() {\n  if (!registered) {\n    SchemaBuilder.registerPlugin(pluginName, RuntimeFiltersPlugin);\n    registered = true;\n  }\n}\n","import SchemaBuilder from \"@pothos/core\";\nimport DrizzlePlugin from \"@pothos/plugin-drizzle\";\nimport SmartSubscriptionsPlugin, {\n  subscribeOptionsFromIterator,\n} from \"@pothos/plugin-smart-subscriptions\";\nimport TracingPlugin, { isRootField } from \"@pothos/plugin-tracing\";\nimport { createOpenTelemetryWrapper } from \"@pothos/tracing-opentelemetry\";\nimport { getTableColumns, isTable, type Table } from \"drizzle-orm\";\nimport {\n  DateResolver,\n  DateTimeISOResolver,\n  JSONResolver,\n} from \"graphql-scalars\";\nimport type { createPubSub } from \"graphql-yoga\";\nimport {\n  type DateWhereInputArgument,\n  implementDefaultWhereInputArgs,\n  type NumberWhereInputArgument,\n  type StringWhereInputArgument,\n} from \"./args/whereArgsImplementer\";\nimport type { ContextType } from \"./context\";\nimport { pluginName } from \"./runtimeFiltersPlugin/filterTypes\";\nimport { registerRuntimeFiltersPlugin } from \"./runtimeFiltersPlugin/runtimeFiltersPlugin\";\nimport type { DrizzleInstance } from \"./types/drizzleInstanceType\";\nimport type {\n  CustomRumblePothosConfig,\n  RumbleInput,\n} from \"./types/rumbleInput\";\n\nexport const createSchemaBuilder = <\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  Action extends string,\n  PothosConfig extends CustomRumblePothosConfig,\n>({\n  db,\n  disableDefaultObjects,\n  pubsub,\n  pothosConfig,\n  otel,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n  pubsub: ReturnType<typeof createPubSub>;\n}) => {\n  const createSpan =\n    otel?.enabled && otel.tracer\n      ? createOpenTelemetryWrapper(otel.tracer, otel.options)\n      : undefined;\n\n  registerRuntimeFiltersPlugin();\n  const schemaBuilder = new SchemaBuilder<{\n    Context: ContextType<UserContext, DB, RequestEvent, Action, PothosConfig>;\n    DrizzleRelations: DB[\"_\"][\"relations\"];\n    Scalars: {\n      JSON: {\n        Input: unknown;\n        Output: unknown;\n      };\n      Date: {\n        Input: Date;\n        Output: Date;\n      };\n      DateTime: {\n        Input: Date;\n        Output: Date;\n      };\n    };\n    Inputs: {\n      IntWhereInputArgument: NumberWhereInputArgument;\n      FloatWhereInputArgument: NumberWhereInputArgument;\n      StringWhereInputArgument: StringWhereInputArgument;\n      DateWhereInputArgument: DateWhereInputArgument;\n    };\n    DefaultFieldNullability: false;\n  }>({\n    ...pothosConfig,\n    plugins: [\n      pluginName,\n      DrizzlePlugin,\n      SmartSubscriptionsPlugin,\n      TracingPlugin,\n      ...(pothosConfig?.plugins ?? []),\n    ],\n    drizzle: {\n      client: db,\n      relations: db._.relations,\n      getTableConfig(table) {\n        //TODO support composite primary keys\n        const columns = isTable(table)\n          ? Object.values(getTableColumns(table as Table))\n          : [];\n        return {\n          columns,\n          primaryKeys: columns.filter((v: any) => v.primary),\n        } as any;\n      },\n    },\n    smartSubscriptions: {\n      ...subscribeOptionsFromIterator((name, _context) => {\n        return pubsub.subscribe(name);\n      }),\n    },\n    defaultFieldNullability: false,\n    tracing: {\n      default: otel?.enabled ? (config) => isRootField(config) : () => false,\n      wrap: createSpan\n        ? (resolver, options) => createSpan(resolver, options)\n        : (resolver) => resolver,\n    },\n    otel,\n  });\n\n  schemaBuilder.addScalarType(\"JSON\", JSONResolver);\n  schemaBuilder.addScalarType(\"Date\", DateResolver);\n  schemaBuilder.addScalarType(\"DateTime\", DateTimeISOResolver);\n  implementDefaultWhereInputArgs(schemaBuilder);\n\n  if (!disableDefaultObjects?.query) {\n    schemaBuilder.queryType({});\n  }\n\n  if (!disableDefaultObjects?.subscription) {\n    schemaBuilder.subscriptionType({});\n  }\n\n  if (!disableDefaultObjects?.mutation) {\n    schemaBuilder.mutationType({});\n  }\n\n  return { schemaBuilder };\n};\n","import { EnvelopArmorPlugin } from \"@escape.tech/graphql-armor\";\nimport { useDisableIntrospection } from \"@graphql-yoga/plugin-disable-introspection\";\nimport { SpanStatusCode, trace } from \"@opentelemetry/api\";\nimport { AttributeNames, SpanNames } from \"@pothos/tracing-opentelemetry\";\nimport { merge } from \"es-toolkit\";\nimport type { ServerOptions } from \"graphql-ws\";\nimport {\n  createYoga as nativeCreateYoga,\n  type Plugin,\n  type YogaServerOptions,\n} from \"graphql-yoga\";\nimport type { useSofa } from \"sofa-api\";\nimport packagejson from \"../package.json\";\nimport { createAbilityBuilder } from \"./abilityBuilder\";\nimport { createOrderArgImplementer } from \"./args/orderArg\";\nimport { createWhereArgImplementer } from \"./args/whereArg\";\nimport { clientCreatorImplementer } from \"./client/client\";\nimport { createContextFunction } from \"./context\";\nimport { createCountQueryImplementer } from \"./countQuery\";\nimport { createEnumImplementer, type EnumFieldKeys } from \"./enum\";\nimport { lazy } from \"./helpers/lazy\";\nimport { sofaOpenAPIWebhookDocs } from \"./helpers/sofaOpenAPIWebhookDocs\";\nimport { createObjectImplementer } from \"./object\";\nimport { createPubSubInstance } from \"./pubsub\";\nimport { createQueryImplementer } from \"./query\";\nimport { createSchemaBuilder } from \"./schemaBuilder\";\nimport { initSearchIfApplicable } from \"./search\";\nimport type { DrizzleInstance } from \"./types/drizzleInstanceType\";\nimport { RumbleError } from \"./types/rumbleError\";\nimport type {\n  CustomRumblePothosConfig,\n  RumbleInput,\n} from \"./types/rumbleInput\";\n\nexport const rumble = <\n  UserContext extends Record<string, any>,\n  DB extends DrizzleInstance,\n  RequestEvent extends Record<string, any>,\n  PothosConfig extends CustomRumblePothosConfig,\n  Schema extends Record<string, any>,\n  Action extends string = \"read\" | \"update\" | \"delete\",\n>(\n  rumbleInput: RumbleInput<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  > & {\n    schema: Schema;\n  },\n) => {\n  if (!rumbleInput.db._.relations) {\n    throw new RumbleError(`\nrumble could not find any relations in the provided drizzle instance.\nMake sure you import the relations and pass them to the drizzle instance:\n\nexport const db = drizzle(\n  \"postgres://postgres:postgres@localhost:5432/postgres\",\n  {\n    relations, // <--- add this line\n  },\n);\n\n`);\n  }\n\n  if (\n    !rumbleInput.schema ||\n    typeof rumbleInput.schema !== \"object\" ||\n    Object.keys(rumbleInput.schema).length === 0\n  ) {\n    throw new RumbleError(`\nrumble requires the drizzle schema object to be passed when initializing.\nImport your schema module and pass it alongside \\`db\\`:\n\nimport * as schema from \"./db/schema\";\n\nexport const r = rumble({\n  db,\n  schema, // <--- add this line\n});\n\n`);\n  }\n\n  // to be able to iterate over the actions, we populate the actions array in case the user does not\n  if (!rumbleInput.actions) {\n    rumbleInput.actions = [\"read\", \"update\", \"delete\"] as Action[];\n  }\n\n  if (rumbleInput.defaultLimit === undefined) {\n    rumbleInput.defaultLimit = 100;\n  }\n\n  if (rumbleInput.search?.enabled) {\n    initSearchIfApplicable(rumbleInput);\n  }\n\n  if (rumbleInput.otel?.enabled && !rumbleInput.otel.tracer) {\n    rumbleInput.otel.tracer = trace.getTracer(\n      \"@m1212e/rumble\",\n      packagejson.version,\n    );\n  }\n\n  const abilityBuilder = createAbilityBuilder<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >(rumbleInput);\n\n  const context = createContextFunction<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >({\n    ...rumbleInput,\n    abilityBuilder,\n  });\n\n  const { makePubSubInstance, pubsub } = createPubSubInstance<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >({\n    ...rumbleInput,\n  });\n\n  const { schemaBuilder } = createSchemaBuilder<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >({ ...rumbleInput, pubsub });\n\n  const enum_ = createEnumImplementer<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig,\n    EnumFieldKeys<Schema>,\n    Schema\n  >({\n    ...rumbleInput,\n    schemaBuilder,\n  });\n\n  const whereArg = createWhereArgImplementer<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >({\n    ...rumbleInput,\n    schemaBuilder,\n    enumImplementer: enum_,\n  });\n\n  const orderArg = createOrderArgImplementer<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >({\n    ...rumbleInput,\n    schemaBuilder,\n  });\n\n  const object = createObjectImplementer<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig,\n    Schema\n  >({\n    ...rumbleInput,\n    schemaBuilder,\n    makePubSubInstance,\n    whereArgImplementer: whereArg,\n    orderArgImplementer: orderArg,\n    enumImplementer: enum_,\n    abilityBuilder,\n  });\n\n  const query = createQueryImplementer<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig,\n    Schema\n  >({\n    ...rumbleInput,\n    schemaBuilder,\n    whereArgImplementer: whereArg,\n    orderArgImplementer: orderArg,\n    makePubSubInstance,\n  });\n\n  const countQuery = createCountQueryImplementer({\n    ...rumbleInput,\n    schemaBuilder,\n    whereArgImplementer: whereArg,\n    makePubSubInstance,\n  });\n\n  const builtSchema = lazy(() => schemaBuilder.toSchema());\n\n  const createYoga = (\n    args?:\n      | (Omit<YogaServerOptions<RequestEvent, any>, \"schema\" | \"context\"> & {\n          /**\n           * Determines if the API should disclose various things about its structure.\n           * Defaults to `process.env.NODE_ENV === \"development\"`.\n           * If enabled, the api will allow introspection requests, provide the graphiql\n           * explorer and will not apply the additional envelop armor plugin.\n           */\n          enableApiDocs?: boolean;\n          /**\n           * Optional configuration passed to the auto-installed graphql-armor\n           * EnvelopArmorPlugin. Only applied when `enableApiDocs` is false\n           * (i.e. in production). Useful for relaxing the default depth/alias/\n           * directive/token limits when the generated schema legitimately exceeds\n           * them. See https://github.com/Escape-Technologies/graphql-armor for available options.\n           *\n           * @example\n           * createYoga({ armorConfig: { maxDepth: { n: 20 } } })\n           */\n          armorConfig?: Parameters<typeof EnvelopArmorPlugin>[0];\n        })\n      | undefined,\n  ) => {\n    const enableApiDocs =\n      args?.enableApiDocs ?? process?.env?.NODE_ENV === \"development\";\n\n    return nativeCreateYoga<RequestEvent>({\n      ...args,\n      graphiql: enableApiDocs,\n      schema: builtSchema(),\n      context,\n      plugins: [\n        ...(args?.plugins ?? []),\n        ...(enableApiDocs\n          ? []\n          : [useDisableIntrospection(), EnvelopArmorPlugin(args?.armorConfig)]),\n        rumbleInput.otel?.enabled\n          ? ({\n              // TODO: add trace header per default in http response\n              // TODO: Automatic Persisted Queries\n              onExecute: ({ setExecuteFn, executeFn }) => {\n                setExecuteFn((options) =>\n                  rumbleInput.otel!.tracer!.startActiveSpan(\n                    SpanNames.EXECUTE,\n                    {\n                      attributes: {\n                        [AttributeNames.OPERATION_NAME]:\n                          options.operationName ?? \"anonymous\",\n                        [AttributeNames.SOURCE]: options.document,\n                      },\n                    },\n                    async (span) => {\n                      try {\n                        const result = await executeFn(options);\n\n                        if (\n                          result &&\n                          \"errors\" in result &&\n                          result.errors?.length\n                        ) {\n                          for (const error of result.errors) {\n                            span.recordException(error);\n                          }\n                          span.setStatus({ code: SpanStatusCode.ERROR });\n                        }\n\n                        return result;\n                      } catch (error) {\n                        if (error instanceof Error) {\n                          span.recordException(error);\n                        }\n                        span.setStatus({ code: SpanStatusCode.ERROR });\n                        throw error;\n                      } finally {\n                        span.end();\n                      }\n                    },\n                  ),\n                );\n              },\n            } as Plugin)\n          : false,\n      ].filter(Boolean),\n    });\n  };\n\n  const createSofa = async (\n    args: Omit<Parameters<typeof useSofa>[0], \"schema\" | \"context\">,\n  ) => {\n    const { useSofa: useSofaFn } = await import(\"sofa-api\");\n    if (args.openAPI) {\n      merge(args.openAPI, sofaOpenAPIWebhookDocs);\n    }\n    if (args.errorHandler) {\n      const originalHandler = args.errorHandler;\n      args.errorHandler = (errors) => {\n        const span = trace.getActiveSpan();\n\n        for (const error of errors) {\n          span?.recordException(error);\n        }\n        span?.setStatus({ code: SpanStatusCode.ERROR });\n        return originalHandler(errors);\n      };\n    }\n    return useSofaFn({\n      ...args,\n      schema: builtSchema(),\n      context,\n      errorHandler(errors) {\n        const span = trace.getActiveSpan();\n\n        for (const error of errors) {\n          span?.recordException(error);\n        }\n        span?.setStatus({ code: SpanStatusCode.ERROR });\n\n        return new Response(errors[0].message, {\n          status: 500,\n        }) as any;\n      },\n    });\n  };\n\n  const createWs = <\n    Options extends ServerOptions<any, any>,\n    Rest extends unknown[],\n    Return,\n  >(\n    implementation: (options: Options, ...rest: Rest) => Return,\n    args: Omit<Options, \"schema\" | \"context\">,\n    ...rest: Rest\n  ): Return => {\n    return implementation(\n      {\n        ...args,\n        schema: builtSchema(),\n        context,\n      } as Options,\n      ...rest,\n    );\n  };\n\n  const clientCreator = clientCreatorImplementer<\n    UserContext,\n    DB,\n    RequestEvent,\n    Action,\n    PothosConfig\n  >({\n    ...rumbleInput,\n    builtSchema,\n  });\n\n  return {\n    /**\n       * The ability builder. Use it to declare whats allowed for each entity in your DB.\n       *\n       * @example\n       *\n       * ```ts\n       * // users can edit themselves\n       abilityBuilder.users\n         .allow([\"read\", \"update\", \"delete\"])\n         .when(({ userId }) => ({ where: eq(schema.users.id, userId) }));\n\n       // everyone can read posts\n       abilityBuilder.posts.allow(\"read\");\n       *\n       * ```\n       */\n    abilityBuilder,\n    /**\n     * The pothos schema builder. See https://pothos-graphql.dev/docs/plugins/drizzle\n     */\n    schemaBuilder,\n    /**\n     * Creates the native yoga instance. Can be used to run an actual HTTP server.\n     *\n     * @example\n     *\n     * ```ts\n     * import { createServer } from \"node:http\";\n     * const server = createServer(createYoga());\n     * server.listen(3000, () => {\n     *   console.info(\"Visit http://localhost:3000/graphql\");\n     * });\n     * ```\n     * https://the-guild.dev/graphql/yoga-server/docs#server\n     */\n    createYoga,\n    /**\n     * Creates a sofa instance to offer a REST API.\n     *\n     * ```ts\n     * import express from \"express\";\n     *\n     * const app = express();\n     * const sofa = createSofa(...);\n     *\n     * app.use(\"/api\", useSofa({ schema }));\n     * ```\n     * https://the-guild.dev/graphql/sofa-api/docs#usage\n     */\n    createSofa,\n    /**\n     * Creates a WebSocket server handler for GraphQL subscriptions.\n     * Pass the ws implementation function as the first argument and rumble will\n     * inject the schema and context automatically.\n     *\n     * @example\n     *\n     * ```ts\n     * // ws\n     * import { useServer } from \"graphql-ws/use/ws\";\n     * import { WebSocketServer } from \"ws\";\n     * const wss = new WebSocketServer({ port: 4000 });\n     * const disposable = createWs(useServer, { ... }, wss);\n     *\n     * // bun\n     * import { makeHandler } from \"graphql-ws/use/bun\";\n     * Bun.serve({ websocket: createWs(makeHandler, { ... }), ... });\n     * ```\n     */\n    createWs,\n    /**\n     * A function for creating default objects for your schema\n     */\n    object,\n    /**\n     * A function for creating where args to filter entities\n     */\n    whereArg,\n    /**\n     * A function for creating order args to sort entities\n     */\n    orderArg,\n    /**\n     * A function for creating default READ queries.\n     * Make sure the objects for the table you are creating the queries for are implemented\n     */\n    query,\n    /**\n     * A function for creating a pubsub instance for a table. Use this to publish or subscribe events\n     */\n    pubsub: makePubSubInstance,\n    /**\n     * A function to implement enums for graphql usage.\n     * The other helpers use this helper internally so in most cases you do not have to\n     * call this helper directly, unless you need the reference to an enum type\n     */\n    enum_,\n    /**\n     * Create a client to consume a rumble graphql api at the specified location.\n     * Requires GraphQL, does not work with the SOFA REST API.\n     */\n    clientCreator,\n    /**\n     * A function for creating count queries for your tables\n     */\n    countQuery,\n    /**\n     * The generated GraphQL schema. You can use this for example to create a GraphQL server with a different library than Yoga or to generate types with codegen.\n     * When calling this function, the schema will be built for the first time and cached for later usage. So you can call this function multiple times without performance issues.\n     * After calling, you cannot adjust the schema via the schema builder\n     */\n    buildSchema: builtSchema,\n  };\n};\n"],"mappings":"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EACL,YAAY,EACV,MAAM;GACJ,aAAa;GACb,aAAa;GACb,MAAM,CAAC;GACP,YAAY,CAAC;GACb,aAAa,EACX,SAAS,EACP,oBAAoB,EAClB,QAAQ,EACN,MAAM,yCACR,EACF,EACF,EACF;GACA,WAAW,EACT,OAAO;IACL,aAAa;IACb,SAAS,EACP,oBAAoB,EAClB,QAAQ,EACN,MAAM,6CACR,EACF,EACF;GACF,EACF;EACF,EACF;EACA,iBAAiB;GACf,MAAM;IACJ,aAAa;IACb,aAAa;IACb,YAAY,CACV;KACE,MAAM;KACN,IAAI;KACJ,aAAa;KACb,UAAU;KACV,QAAQ,EACN,MAAM,SACR;IACF,CACF;IACA,aAAa,EACX,SAAS,EACP,oBAAoB,EAClB,QAAQ,EACN,MAAM,yCACR,EACF,EACF,EACF;IACA,WAAW,EACT,OAAO;KACL,aAAa;KACb,SAAS,EACP,oBAAoB,EAClB,QAAQ,EACN,MAAM,6CACR,EACF,EACF;IACF,EACF;GACF;GACA,QAAQ;IACN,aAAa;IACb,aAAa;IACb,MAAM,CAAC;IACP,YAAY,CACV;KACE,MAAM;KACN,IAAI;KACJ,aAAa;KACb,UAAU;KACV,QAAQ,EACN,MAAM,SACR;IACF,CACF;IACA,WAAW,EACT,OAAO;KACL,aAAa;KACb,SAAS,EACP,oBAAoB,EAClB,QAAQ,EACN,MAAM,6CACR,EACF,EACF;IACF,EACF;GACF;EACF;CACF;CACA,YAAY,EACV,SAAS;EACP,mBAAmB;GACjB,MAAM;GACN,YAAY;IACV,cAAc;KACZ,aACE;KACF,MAAM;IACR;IACA,WAAW;KACT,aAAa;KACb,MAAM;IACR;IACA,KAAK;KACH,aAAa;KACb,MAAM;IACR;GACF;EACF;EACA,uBAAuB;GACrB,MAAM;GACN,YAAY,EACV,IAAI;IACF,aACE;IACF,MAAM;GACR,EACF;EACF;EACA,UAAU;GACR,MAAM;GACN,QAAQ;EACV;EACA,MAAM;GACJ,MAAM;GACN,QAAQ;EACV;CACF,EACF;AACF;;;ACzIA,SAAgB,uCAEd,EACA,SACA,SACA,WACA,UACA,WAOC;CACD,MA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"}