@m1212e/rumble 0.8.4 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../node_modules/graphql/jsutils/isObjectLike.mjs","../node_modules/graphql/jsutils/invariant.mjs","../node_modules/graphql/language/location.mjs","../node_modules/graphql/language/printLocation.mjs","../node_modules/graphql/error/GraphQLError.mjs","../lib/types/rumbleError.ts","../lib/helpers/helper.ts","../lib/helpers/lazy.ts","../lib/helpers/sqlTypes/types.ts","../lib/helpers/sqlTypes/distinctValuesFromSQLType.ts","../lib/helpers/tableHelpers.ts","../lib/abilityBuilder.ts","../lib/context.ts","../lib/helpers/capitalize.ts","../lib/enum.ts","../lib/helpers/sofaOpenAPIWebhookDocs.ts","../lib/object.ts","../lib/helpers/sqlTypes/mapSQLTypeToTSType.ts","../lib/pubsub.ts","../lib/query.ts","../lib/schemaBuilder.ts","../lib/explicitFiltersPlugin/explicitFiltersPlugin.ts","../lib/whereArg.ts","../lib/rumble.ts"],"names":["isObjectLike","value","invariant","condition","message","LineRegExp","getLocation","source","position","lastLineStart","line","match","printLocation","location","printSourceLocation","sourceLocation","firstLineColumnOffset","body","lineIndex","lineOffset","lineNum","columnOffset","columnNum","locationStr","lines","locationLine","subLineIndex","subLineColumnNum","subLines","i","printPrefixedLines","subLine","existingLines","_","padLen","prefix","toNormalizedOptions","args","firstArg","GraphQLError","_GraphQLError","rawArgs","_this$nodes","_nodeLocations$","_ref","nodes","positions","path","originalError","extensions","undefinedIfEmpty","nodeLocations","node","loc","pos","originalExtensions","output","formattedError","array","RumbleError","RumbleErrorSafe","assertFindFirstExists","assertFirstEntryExists","v","applyFilters","filters","entities","context","f","acc","val","lazy","initializer","initialized","UnknownTypeRumbleError","sqlType","additionalInfo","createDistinctValuesFromSQLType","nameSymbol","columnsSymbol","tableHelper","dbName","tsName","table","db","tableSchema","schema","k","key","isSimpleQueryFilter","filter","isFunctionFilter","createAbilityBuilder","actions","defaultLimit","registrators","registeredQueryFilters","registeredFilters","createRegistrator","tableName","action","queryFiltersPerEntity","queryFiltersPerEntityAndAction","queryFilter","explicitFilter","entityKey","userContext","builder","createEntityObject","options","transformToResponse","queryFilters","where","transformedWhere","w","relationsFilterToSQL","limit","columns","r","getBlockEverythingFilter","primaryKeyField","distinctValues","simpleQueryFilters","functionQueryFilters","someWildcardFound","c","allQueryFilters","e","highestLimit","conditionObject","combinedAllowedColumns","accumulatedWhereConditions","o","combinedWhere","createContextFunction","makeUserContext","abilityBuilder","req","capitalizeFirstLetter","isEnumSchema","schemaType","PgEnumColumn","createEnumImplementer","schemaBuilder","referenceStorage","enumColumn","refName","enumSchemaName","enumValues","schemaEnum","enumCol","s","schemaEnumEntry","graphqlImplementationName","toCamelCase","ret","sofaOpenAPIWebhookDocs","mapSQLTypeToGraphQLType","fieldName","isProbablyAConfigObject","createObjectImplementer","makePubSubInstance","argImplementer","enumImplementer","readAction","adjust","primaryKey","registerOnInstance","subscriptions","element","primaryKeyValue","t","mapSQLTypeStringToExposedPothosType","columnName","nullable","gqlType","configMap","userAdjustments","target","prop","params","ref","configObject","fields","creatorFunction","enumImpl","relations","relationSchema","WhereArg","relationTablePubSub","isMany","filterSpecifier","One","subscribe","ctx","SUBSCRIPTION_NOTIFIER_RUMBLE_PREFIX","SUBSCRIPTION_NOTIFIER_REMOVED","SUBSCRIPTION_NOTIFIER_UPDATED","SUBSCRIPTION_NOTIFIER_CREATED","createPubSubInstance","pubsub","createPubSub","makePubSubKey","actionKey","instance","keys","uniqueKeys","createQueryImplementer","listAction","root","info","query","queryInstance","pluginName","explicitFiltersPlugin_default","applyFiltersKey","ManualFiltersPlugin","BasePlugin","resolver","fieldConfig","parent","resolved","allResolvedValues","allFilters","allowed","SchemaBuilder","makeDefaultName","createArgImplementer","inputTypeName","mapSQLTypeStringToInputPothosType","referenceModel","implementDefaultWhereInputArgs","IntWhereInputArgument","FloatWhereInputArgument","StringWhereInputArgument","DateWhereInputArgument","createSchemaBuilder","disableDefaultObjects","pothosConfig","DrizzlePlugin","SmartSubscriptionsPlugin","subscribeOptionsFromIterator","name","JSONResolver","DateResolver","DateTimeISOResolver","rumble","rumbleInput","enum_","arg","object","builtSchema","nativeCreateYoga","useSofa"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Return true if `value` is object-like. A value is object-like if it's not\n * `null` and has a `typeof` result of \"object\".\n */\nexport function isObjectLike(value) {\n return typeof value == 'object' && value !== null;\n}\n","export function invariant(condition, message) {\n const booleanCondition = Boolean(condition);\n\n if (!booleanCondition) {\n throw new Error(\n message != null ? message : 'Unexpected invariant triggered.',\n );\n }\n}\n","import { invariant } from '../jsutils/invariant.mjs';\nconst LineRegExp = /\\r\\n|[\\n\\r]/g;\n/**\n * Represents a location in a Source.\n */\n\n/**\n * Takes a Source and a UTF-8 character offset, and returns the corresponding\n * line and column as a SourceLocation.\n */\nexport function getLocation(source, position) {\n let lastLineStart = 0;\n let line = 1;\n\n for (const match of source.body.matchAll(LineRegExp)) {\n typeof match.index === 'number' || invariant(false);\n\n if (match.index >= position) {\n break;\n }\n\n lastLineStart = match.index + match[0].length;\n line += 1;\n }\n\n return {\n line,\n column: position + 1 - lastLineStart,\n };\n}\n","import { getLocation } from './location.mjs';\n\n/**\n * Render a helpful description of the location in the GraphQL Source document.\n */\nexport function printLocation(location) {\n return printSourceLocation(\n location.source,\n getLocation(location.source, location.start),\n );\n}\n/**\n * Render a helpful description of the location in the GraphQL Source document.\n */\n\nexport function printSourceLocation(source, sourceLocation) {\n const firstLineColumnOffset = source.locationOffset.column - 1;\n const body = ''.padStart(firstLineColumnOffset) + source.body;\n const lineIndex = sourceLocation.line - 1;\n const lineOffset = source.locationOffset.line - 1;\n const lineNum = sourceLocation.line + lineOffset;\n const columnOffset = sourceLocation.line === 1 ? firstLineColumnOffset : 0;\n const columnNum = sourceLocation.column + columnOffset;\n const locationStr = `${source.name}:${lineNum}:${columnNum}\\n`;\n const lines = body.split(/\\r\\n|[\\n\\r]/g);\n const locationLine = lines[lineIndex]; // Special case for minified documents\n\n if (locationLine.length > 120) {\n const subLineIndex = Math.floor(columnNum / 80);\n const subLineColumnNum = columnNum % 80;\n const subLines = [];\n\n for (let i = 0; i < locationLine.length; i += 80) {\n subLines.push(locationLine.slice(i, i + 80));\n }\n\n return (\n locationStr +\n printPrefixedLines([\n [`${lineNum} |`, subLines[0]],\n ...subLines.slice(1, subLineIndex + 1).map((subLine) => ['|', subLine]),\n ['|', '^'.padStart(subLineColumnNum)],\n ['|', subLines[subLineIndex + 1]],\n ])\n );\n }\n\n return (\n locationStr +\n printPrefixedLines([\n // Lines specified like this: [\"prefix\", \"string\"],\n [`${lineNum - 1} |`, lines[lineIndex - 1]],\n [`${lineNum} |`, locationLine],\n ['|', '^'.padStart(columnNum)],\n [`${lineNum + 1} |`, lines[lineIndex + 1]],\n ])\n );\n}\n\nfunction printPrefixedLines(lines) {\n const existingLines = lines.filter(([_, line]) => line !== undefined);\n const padLen = Math.max(...existingLines.map(([prefix]) => prefix.length));\n return existingLines\n .map(([prefix, line]) => prefix.padStart(padLen) + (line ? ' ' + line : ''))\n .join('\\n');\n}\n","import { isObjectLike } from '../jsutils/isObjectLike.mjs';\nimport { getLocation } from '../language/location.mjs';\nimport {\n printLocation,\n printSourceLocation,\n} from '../language/printLocation.mjs';\n\nfunction toNormalizedOptions(args) {\n const firstArg = args[0];\n\n if (firstArg == null || 'kind' in firstArg || 'length' in firstArg) {\n return {\n nodes: firstArg,\n source: args[1],\n positions: args[2],\n path: args[3],\n originalError: args[4],\n extensions: args[5],\n };\n }\n\n return firstArg;\n}\n/**\n * A GraphQLError describes an Error found during the parse, validate, or\n * execute phases of performing a GraphQL operation. In addition to a message\n * and stack trace, it also includes information about the locations in a\n * GraphQL document and/or execution result that correspond to the Error.\n */\n\nexport class GraphQLError extends Error {\n /**\n * An array of `{ line, column }` locations within the source GraphQL document\n * which correspond to this error.\n *\n * Errors during validation often contain multiple locations, for example to\n * point out two things with the same name. Errors during execution include a\n * single location, the field which produced the error.\n *\n * Enumerable, and appears in the result of JSON.stringify().\n */\n\n /**\n * An array describing the JSON-path into the execution response which\n * corresponds to this error. Only included for errors during execution.\n *\n * Enumerable, and appears in the result of JSON.stringify().\n */\n\n /**\n * An array of GraphQL AST Nodes corresponding to this error.\n */\n\n /**\n * The source GraphQL document for the first location of this error.\n *\n * Note that if this Error represents more than one node, the source may not\n * represent nodes after the first node.\n */\n\n /**\n * An array of character offsets within the source GraphQL document\n * which correspond to this error.\n */\n\n /**\n * The original error thrown from a field resolver during execution.\n */\n\n /**\n * Extension fields to add to the formatted error.\n */\n\n /**\n * @deprecated Please use the `GraphQLErrorOptions` constructor overload instead.\n */\n constructor(message, ...rawArgs) {\n var _this$nodes, _nodeLocations$, _ref;\n\n const { nodes, source, positions, path, originalError, extensions } =\n toNormalizedOptions(rawArgs);\n super(message);\n this.name = 'GraphQLError';\n this.path = path !== null && path !== void 0 ? path : undefined;\n this.originalError =\n originalError !== null && originalError !== void 0\n ? originalError\n : undefined; // Compute list of blame nodes.\n\n this.nodes = undefinedIfEmpty(\n Array.isArray(nodes) ? nodes : nodes ? [nodes] : undefined,\n );\n const nodeLocations = undefinedIfEmpty(\n (_this$nodes = this.nodes) === null || _this$nodes === void 0\n ? void 0\n : _this$nodes.map((node) => node.loc).filter((loc) => loc != null),\n ); // Compute locations in the source for the given nodes/positions.\n\n this.source =\n source !== null && source !== void 0\n ? source\n : nodeLocations === null || nodeLocations === void 0\n ? void 0\n : (_nodeLocations$ = nodeLocations[0]) === null ||\n _nodeLocations$ === void 0\n ? void 0\n : _nodeLocations$.source;\n this.positions =\n positions !== null && positions !== void 0\n ? positions\n : nodeLocations === null || nodeLocations === void 0\n ? void 0\n : nodeLocations.map((loc) => loc.start);\n this.locations =\n positions && source\n ? positions.map((pos) => getLocation(source, pos))\n : nodeLocations === null || nodeLocations === void 0\n ? void 0\n : nodeLocations.map((loc) => getLocation(loc.source, loc.start));\n const originalExtensions = isObjectLike(\n originalError === null || originalError === void 0\n ? void 0\n : originalError.extensions,\n )\n ? originalError === null || originalError === void 0\n ? void 0\n : originalError.extensions\n : undefined;\n this.extensions =\n (_ref =\n extensions !== null && extensions !== void 0\n ? extensions\n : originalExtensions) !== null && _ref !== void 0\n ? _ref\n : Object.create(null); // Only properties prescribed by the spec should be enumerable.\n // Keep the rest as non-enumerable.\n\n Object.defineProperties(this, {\n message: {\n writable: true,\n enumerable: true,\n },\n name: {\n enumerable: false,\n },\n nodes: {\n enumerable: false,\n },\n source: {\n enumerable: false,\n },\n positions: {\n enumerable: false,\n },\n originalError: {\n enumerable: false,\n },\n }); // Include (non-enumerable) stack trace.\n\n /* c8 ignore start */\n // FIXME: https://github.com/graphql/graphql-js/issues/2317\n\n if (\n originalError !== null &&\n originalError !== void 0 &&\n originalError.stack\n ) {\n Object.defineProperty(this, 'stack', {\n value: originalError.stack,\n writable: true,\n configurable: true,\n });\n } else if (Error.captureStackTrace) {\n Error.captureStackTrace(this, GraphQLError);\n } else {\n Object.defineProperty(this, 'stack', {\n value: Error().stack,\n writable: true,\n configurable: true,\n });\n }\n /* c8 ignore stop */\n }\n\n get [Symbol.toStringTag]() {\n return 'GraphQLError';\n }\n\n toString() {\n let output = this.message;\n\n if (this.nodes) {\n for (const node of this.nodes) {\n if (node.loc) {\n output += '\\n\\n' + printLocation(node.loc);\n }\n }\n } else if (this.source && this.locations) {\n for (const location of this.locations) {\n output += '\\n\\n' + printSourceLocation(this.source, location);\n }\n }\n\n return output;\n }\n\n toJSON() {\n const formattedError = {\n message: this.message,\n };\n\n if (this.locations != null) {\n formattedError.locations = this.locations;\n }\n\n if (this.path != null) {\n formattedError.path = this.path;\n }\n\n if (this.extensions != null && Object.keys(this.extensions).length > 0) {\n formattedError.extensions = this.extensions;\n }\n\n return formattedError;\n }\n}\n\nfunction undefinedIfEmpty(array) {\n return array === undefined || array.length === 0 ? undefined : array;\n}\n/**\n * See: https://spec.graphql.org/draft/#sec-Errors\n */\n\n/**\n * Prints a GraphQLError to a string, representing useful location information\n * about the error's position in the source.\n *\n * @deprecated Please use `error.toString` instead. Will be removed in v17\n */\nexport function printError(error) {\n return error.toString();\n}\n/**\n * Given a GraphQLError, format it according to the rules described by the\n * Response Format, Errors section of the GraphQL Specification.\n *\n * @deprecated Please use `error.toJSON` instead. Will be removed in v17\n */\n\nexport function formatError(error) {\n return error.toJSON();\n}\n","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\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"RumbleError\";\n\t}\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 type { Filter } from \"../explicitFiltersPlugin/pluginTypes\";\nimport { 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\tif (!value)\n\t\tthrow new RumbleErrorSafe(\"Value not found but required (findFirst)\");\n\treturn 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\tconst v = value.at(0);\n\tif (!v)\n\t\tthrow new RumbleErrorSafe(\"Value not found but required (firstEntry)\");\n\treturn v;\n};\n\n/**\n * A helper to apply a list of filters to a given list of entities.\n * \n * @example\n * \n * ```ts\n * const filtered = await applyFilters({\n filters: abilityBuilder.registeredFilters.posts.update,\n entities: entitiesToFilter,\n context: ctx,\n });\n * ```\n */\nexport const applyFilters = async <Context, T, H extends T>({\n\tfilters,\n\tentities,\n\tcontext,\n}: {\n\tentities: T[];\n\tfilters: Filter<Context, H>[];\n\tcontext: Context;\n}) => {\n\treturn (\n\t\tawait Promise.all(\n\t\t\tfilters.map((f) =>\n\t\t\t\tf({\n\t\t\t\t\tcontext,\n\t\t\t\t\tentities: entities as H[],\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t).reduce((acc, val) => {\n\t\tacc.push(...val);\n\t\treturn acc;\n\t}, []) as T[];\n};\n","/**\n * Creates a lazily initialized function.\n *\n * The returned function will call the initializer function on its first call and\n * store the result. On subsequent calls, it will return the stored result.\n *\n * @param initializer The function to be called for initialization.\n * @returns A function that calls the initializer function on its first call and\n * returns the stored result on subsequent calls.\n */\nexport function lazy<T>(initializer: () => T): () => T {\n\tlet value: T | undefined;\n\tlet initialized = false;\n\n\treturn () => {\n\t\tif (!initialized) {\n\t\t\tvalue = initializer();\n\t\t\tinitialized = true;\n\t\t}\n\t\treturn value!;\n\t};\n}\n","import { RumbleError } from \"../../types/rumbleError\";\n\nexport const possibleSQLTypesStrings = [\n\t\"serial\",\n\t\"int\",\n\t\"integer\",\n\t\"tinyint\",\n\t\"smallint\",\n\t\"mediumint\",\n\t\"real\",\n\t\"decimal\",\n\t\"double\",\n\t\"float\",\n\t\"string\",\n\t\"text\",\n\t\"varchar\",\n\t\"char\",\n\t\"text(256)\",\n\t\"uuid\",\n\t\"boolean\",\n\t\"date\",\n\t\"datetime\",\n\t\"timestamp\",\n\t\"json\",\n] as const;\n\nexport type PossibleSQLType = (typeof possibleSQLTypesStrings)[number];\n\nexport const UnknownTypeRumbleError = (\n\tsqlType: string,\n\tadditionalInfo?: string,\n) =>\n\tnew RumbleError(\n\t\t`RumbleError: Unknown SQL type '${sqlType}'. Please open an issue (https://github.com/m1212e/rumble/issues) so it can be added. (${additionalInfo})`,\n\t);\n","import { type PossibleSQLType, UnknownTypeRumbleError } from \"./types\";\n\nexport function createDistinctValuesFromSQLType(sqlType: PossibleSQLType): {\n\tvalue1: any;\n\tvalue2: any;\n} {\n\tif (\n\t\t[\"serial\", \"int\", \"integer\", \"tinyint\", \"smallint\", \"mediumint\"].includes(\n\t\t\tsqlType,\n\t\t)\n\t) {\n\t\treturn {\n\t\t\tvalue1: 1,\n\t\t\tvalue2: 2,\n\t\t};\n\t}\n\n\tif ([\"real\", \"decimal\", \"double\", \"float\"].includes(sqlType)) {\n\t\treturn {\n\t\t\tvalue1: 1.1,\n\t\t\tvalue2: 2.2,\n\t\t};\n\t}\n\n\tif ([\"string\", \"text\", \"varchar\", \"char\", \"text(256)\"].includes(sqlType)) {\n\t\treturn {\n\t\t\tvalue1: \"a\",\n\t\t\tvalue2: \"b\",\n\t\t};\n\t}\n\n\tif ([\"uuid\"].includes(sqlType)) {\n\t\treturn {\n\t\t\tvalue1: \"fba31870-5528-42d7-b27e-2e5ee657aea5\",\n\t\t\tvalue2: \"fc65db81-c2d1-483d-8a25-a30e2cf6e02d\",\n\t\t};\n\t}\n\n\tif ([\"boolean\"].includes(sqlType)) {\n\t\treturn {\n\t\t\tvalue1: true,\n\t\t\tvalue2: false,\n\t\t};\n\t}\n\n\tif ([\"timestamp\", \"datetime\"].includes(sqlType)) {\n\t\treturn {\n\t\t\tvalue1: new Date(2022, 1, 1),\n\t\t\tvalue2: new Date(2022, 1, 2),\n\t\t};\n\t}\n\n\tif ([\"date\"].includes(sqlType)) {\n\t\treturn {\n\t\t\tvalue1: new Date(2022, 1, 1),\n\t\t\tvalue2: new Date(2022, 1, 2),\n\t\t};\n\t}\n\n\tif ([\"json\"].includes(sqlType)) {\n\t\treturn {\n\t\t\tvalue1: { a: 1 },\n\t\t\tvalue2: { b: 2 },\n\t\t};\n\t}\n\n\tthrow UnknownTypeRumbleError(sqlType, \"Distinct\");\n}\n","import type { Column, Many, One, Table } from \"drizzle-orm\";\nimport type { NonEnumFields } from \"../enum\";\nimport type { GenericDrizzleDbTypeConstraints } from \"../types/genericDrizzleDbType\";\nimport { RumbleError } from \"../types/rumbleError\";\n\nexport type TableIdentifierTSName<DB extends GenericDrizzleDbTypeConstraints> =\n\tkeyof NonEnumFields<NonNullable<DB[\"_\"][\"relations\"][\"schema\"]>>;\n\nconst nameSymbol = Symbol.for(\"drizzle:Name\");\nconst columnsSymbol = Symbol.for(\"drizzle:Columns\");\n\nexport function tableHelper<\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tTSVariable extends TableIdentifierTSName<DB>,\n\tDBVariable extends string,\n\tT extends Table,\n>({\n\tdbName,\n\ttsName,\n\ttable,\n\tdb,\n}: Partial<{\n\ttsName: TSVariable;\n\tdbName: DBVariable;\n\ttable: T;\n}> &\n\t(\n\t\t| {\n\t\t\t\tdbName: DBVariable;\n\t\t }\n\t\t| {\n\t\t\t\ttsName: TSVariable;\n\t\t }\n\t\t| {\n\t\t\t\ttable: T;\n\t\t }\n\t) & { db: DB }) {\n\tlet tableSchema: Table | undefined = table;\n\n\tif (tsName) {\n\t\ttableSchema = db._.relations.schema[tsName as string];\n\t}\n\n\tif (dbName) {\n\t\ttableSchema = Object.values(db._.relations.schema).find(\n\t\t\t(schema: any) => schema[nameSymbol] === dbName,\n\t\t);\n\t}\n\n\tif (!tableSchema) {\n\t\tthrow new RumbleError(\n\t\t\t`Could not find schema for ${JSON.stringify({ tsName, dbName, table: (table as any)?.[nameSymbol] }).toString()}`,\n\t\t);\n\t}\n\n\treturn {\n\t\ttableSchema,\n\t\tcolumns: (tableSchema as any)[columnsSymbol] as Record<string, Column>,\n\t\tget primaryColumns() {\n\t\t\treturn Object.entries((tableSchema as any)[columnsSymbol])\n\t\t\t\t.filter(([k, v]) => (v as Column).primary)\n\t\t\t\t.reduce((acc, [k, v]) => {\n\t\t\t\t\t(acc as any)[k] = v;\n\t\t\t\t\treturn acc;\n\t\t\t\t}, {}) as Record<string, Column>;\n\t\t},\n\t\trelations: db._.relations.config[tsName as string] as\n\t\t\t| {\n\t\t\t\t\t[key: string]: One<any, any> | Many<any, any>;\n\t\t\t }\n\t\t\t| undefined,\n\t\tdbName: (tableSchema as any)[nameSymbol] as string,\n\t\tget tsName() {\n\t\t\treturn Object.entries(db._.relations.schema)\n\t\t\t\t.find(([key, v]) => v === tableSchema)!\n\t\t\t\t.at(0) as string;\n\t\t},\n\t};\n}\n","import { relationsFilterToSQL } from \"drizzle-orm\";\nimport type { Filter } from \"./explicitFiltersPlugin/pluginTypes\";\nimport { lazy } from \"./helpers/lazy\";\nimport { createDistinctValuesFromSQLType } from \"./helpers/sqlTypes/distinctValuesFromSQLType\";\nimport { tableHelper } from \"./helpers/tableHelpers\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport { RumbleError } from \"./types/rumbleError\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\n} from \"./types/rumbleInput\";\n\nexport type AbilityBuilderType<\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n\ttypeof createAbilityBuilder<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>\n>;\n\ntype TableName<DB extends GenericDrizzleDbTypeConstraints> = keyof DB[\"query\"];\n\ntype QueryFilterInput<\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tTableKey extends TableName<DB>,\n> = Parameters<DB[\"query\"][TableKey][\"findMany\"]>[0];\n\ntype SimpleQueryFilter<\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tTableKey extends keyof DB[\"query\"],\n\tFilter extends QueryFilterInput<DB, TableKey>,\n> = Filter;\n\ntype FunctionQueryFilter<\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tTableKey extends keyof DB[\"query\"],\n\tFilter extends QueryFilterInput<DB, TableKey>,\n\tContext,\n> = (context: Context) => Filter | undefined | \"allow\";\n\nfunction isSimpleQueryFilter<\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tTableKey extends keyof DB[\"query\"],\n\tFilter extends QueryFilterInput<DB, TableKey>,\n\tContext,\n>(\n\tfilter: QueryFilter<DB, TableKey, Filter, Context>,\n): filter is SimpleQueryFilter<DB, TableKey, Filter> {\n\treturn typeof filter !== \"function\";\n}\n\ntype QueryFilter<\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tTableName extends keyof DB[\"query\"],\n\tFilter extends QueryFilterInput<DB, TableName>,\n\tContext,\n> =\n\t| SimpleQueryFilter<DB, TableName, Filter>\n\t| FunctionQueryFilter<DB, TableName, Filter, Context>;\n\nfunction isFunctionFilter<\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tTableKey extends keyof DB[\"query\"],\n\tFilter extends QueryFilterInput<DB, TableKey>,\n\tContext,\n>(\n\tfilter: QueryFilter<DB, TableKey, Filter, Context>,\n): filter is FunctionQueryFilter<DB, TableKey, Filter, Context> {\n\treturn (\n\t\ttypeof filter === \"function\" && filter.constructor.name !== \"AsyncFunction\"\n\t);\n}\n\nexport const createAbilityBuilder = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n>({\n\tdb,\n\tactions,\n\tdefaultLimit,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig>) => {\n\tconst registrators: {\n\t\t[key in TableName<DB>]: ReturnType<typeof createRegistrator<key>>;\n\t} = {} as any;\n\n\tconst registeredQueryFilters: {\n\t\t[key in TableName<DB>]: {\n\t\t\t[key in Action]: QueryFilter<DB, key, any, UserContext>[] | \"unspecified\";\n\t\t};\n\t} = {} as any;\n\n\tconst registeredFilters: {\n\t\t[key in TableName<DB>]: {\n\t\t\t//TODO add a run all helper\n\t\t\t[key in Action]: Filter<UserContext, any>[];\n\t\t};\n\t} = {} as any;\n\n\tconst createRegistrator = <TableNameT extends TableName<DB>>(\n\t\ttableName: TableNameT,\n\t) => {\n\t\t// we want to init all possible application level filters since we want to ensure\n\t\t// that the implementaiton helpers pass an object by reference when creating\n\t\t// the implementation, instead of a copy like it would be the case with undefined\n\t\tfor (const action of actions!) {\n\t\t\tif (!registeredFilters[tableName]) {\n\t\t\t\tregisteredFilters[tableName] = {} as any;\n\t\t\t}\n\t\t\tif (!registeredFilters[tableName][action]) {\n\t\t\t\tregisteredFilters[tableName][action] = [];\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\t/**\n\t\t\t * Allows to perform a specific action on a specific entity\n\t\t\t */\n\t\t\tallow: (action: Action | Action[]) => {\n\t\t\t\tlet queryFiltersPerEntity = registeredQueryFilters[tableName];\n\t\t\t\tif (!queryFiltersPerEntity) {\n\t\t\t\t\tqueryFiltersPerEntity = {} as any;\n\t\t\t\t\tregisteredQueryFilters[tableName] = queryFiltersPerEntity;\n\t\t\t\t}\n\n\t\t\t\tconst actions = Array.isArray(action) ? action : [action];\n\t\t\t\tfor (const action of actions) {\n\t\t\t\t\tlet queryFiltersPerEntityAndAction = queryFiltersPerEntity[action];\n\t\t\t\t\tif (!queryFiltersPerEntityAndAction) {\n\t\t\t\t\t\tqueryFiltersPerEntityAndAction = \"unspecified\";\n\t\t\t\t\t\tqueryFiltersPerEntity[action] = queryFiltersPerEntityAndAction;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t/**\n\t\t\t\t\t * Restricts the allowed actions to a filter\n\t\t\t\t\t * @example\n\t\t\t\t\t * ```ts\n\t\t\t\t\t * abilityBuilder.users.allow([\"read\", \"update\", \"delete\"]).when(({ userId }) => ({\n\t\t\t\t\t * where: {\n\t\t\t\t\t * id: userId,\n\t\t\t\t\t * },\n\t\t\t\t\t * }));\n\t\t\t\t\t * ```\n\t\t\t\t\t */\n\t\t\t\t\twhen: (\n\t\t\t\t\t\tqueryFilter: QueryFilter<\n\t\t\t\t\t\t\tDB,\n\t\t\t\t\t\t\tTableNameT,\n\t\t\t\t\t\t\tQueryFilterInput<DB, TableNameT>,\n\t\t\t\t\t\t\tUserContext\n\t\t\t\t\t\t>,\n\t\t\t\t\t) => {\n\t\t\t\t\t\tfor (const action of actions) {\n\t\t\t\t\t\t\tif (queryFiltersPerEntity[action] === \"unspecified\") {\n\t\t\t\t\t\t\t\tqueryFiltersPerEntity[action] = [];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst queryFiltersPerEntityAndAction =\n\t\t\t\t\t\t\t\tqueryFiltersPerEntity[action];\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tqueryFiltersPerEntityAndAction as Exclude<\n\t\t\t\t\t\t\t\t\ttypeof queryFiltersPerEntityAndAction,\n\t\t\t\t\t\t\t\t\t\"unspecified\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t).push(queryFilter);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t\t/**\n\t\t\t * Allows to register an application level filter to restrict some results\n\t\t\t * which were returned by a query\n\t\t\t */\n\t\t\tfilter: (action: Action | Action[]) => {\n\t\t\t\tconst actions = Array.isArray(action) ? action : [action];\n\t\t\t\treturn {\n\t\t\t\t\t/**\n\t\t\t\t\t * The actual filter function to apply. Returns the allowed values\n\t\t\t\t\t */\n\t\t\t\t\tby: (\n\t\t\t\t\t\texplicitFilter: Filter<\n\t\t\t\t\t\t\tUserContext,\n\t\t\t\t\t\t\tNonNullable<\n\t\t\t\t\t\t\t\tAwaited<ReturnType<DB[\"query\"][TableNameT][\"findFirst\"]>>\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t>,\n\t\t\t\t\t) => {\n\t\t\t\t\t\tfor (const action of actions) {\n\t\t\t\t\t\t\tregisteredFilters[tableName][action].push(explicitFilter);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t};\n\n\tfor (const entityKey of Object.keys(db.query) as TableName<DB>[]) {\n\t\tregistrators[entityKey] = createRegistrator(entityKey);\n\t}\n\n\treturn {\n\t\t...registrators,\n\t\t/** @internal */\n\t\tregisteredQueryFilters: registeredQueryFilters,\n\t\t/** @internal */\n\t\tregisteredFilters,\n\t\t/** @internal */\n\t\tbuildWithUserContext: (userContext: UserContext) => {\n\t\t\tconst builder: {\n\t\t\t\t[key in TableName<DB>]: ReturnType<typeof createEntityObject<key>>;\n\t\t\t} = {} as any;\n\n\t\t\tconst createEntityObject = <TableNameT extends TableName<DB>>(\n\t\t\t\ttableName: TableNameT,\n\t\t\t) => {\n\t\t\t\treturn {\n\t\t\t\t\tfilter: <\n\t\t\t\t\t\tInjection extends SimpleQueryFilter<\n\t\t\t\t\t\t\tDB,\n\t\t\t\t\t\t\tTableNameT,\n\t\t\t\t\t\t\tQueryFilterInput<DB, TableNameT>\n\t\t\t\t\t\t>,\n\t\t\t\t\t>(\n\t\t\t\t\t\taction: Action,\n\t\t\t\t\t\toptions?: {\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t * Additional query filters applied only for this call. Useful for injecting one time additional filters\n\t\t\t\t\t\t\t * for e.g. user args in a handler.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tinject?: Injection;\n\t\t\t\t\t\t},\n\t\t\t\t\t) => {\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Packs the filters into a response object that can be applied for queries by the user\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst transformToResponse = <\n\t\t\t\t\t\t\tF extends QueryFilterInput<DB, TableNameT>,\n\t\t\t\t\t\t>(\n\t\t\t\t\t\t\tqueryFilters?: F,\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst where = lazy(() => {\n\t\t\t\t\t\t\t\tif (!queryFilters?.where && !options?.inject?.where) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (options?.inject?.where && queryFilters?.where) {\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tAND: [queryFilters?.where, options?.inject?.where],\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (options?.inject?.where && !queryFilters?.where) {\n\t\t\t\t\t\t\t\t\treturn options?.inject?.where;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (!options?.inject?.where && queryFilters?.where) {\n\t\t\t\t\t\t\t\t\treturn queryFilters?.where;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (!options?.inject?.where && !queryFilters?.where) {\n\t\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst transformedWhere = lazy(() => {\n\t\t\t\t\t\t\t\tconst w = where();\n\t\t\t\t\t\t\t\tif (!w) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst table = tableHelper({\n\t\t\t\t\t\t\t\t\ttsName: tableName,\n\t\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\treturn relationsFilterToSQL(table.tableSchema, w);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst limit = lazy(() => {\n\t\t\t\t\t\t\t\tlet limit =\n\t\t\t\t\t\t\t\t\tqueryFilters?.limit ?? (defaultLimit as undefined | number);\n\n\t\t\t\t\t\t\t\t// only apply limit if neither default limit or ability limit are set\n\t\t\t\t\t\t\t\t// or lower amount is set\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\toptions?.inject?.limit &&\n\t\t\t\t\t\t\t\t\t(!limit || limit > options.inject.limit)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tlimit = options.inject.limit;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tqueryFilters?.limit &&\n\t\t\t\t\t\t\t\t\t(!limit || queryFilters.limit > limit)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tlimit = queryFilters.limit;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// ensure that null is converted to undefined\n\t\t\t\t\t\t\t\treturn limit ?? undefined;\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst columns = lazy(() => {\n\t\t\t\t\t\t\t\tif (!queryFilters?.columns && !options?.inject?.columns) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...queryFilters?.columns,\n\t\t\t\t\t\t\t\t\t...options?.inject?.columns,\n\t\t\t\t\t\t\t\t} as undefined;\n\t\t\t\t\t\t\t\t// we need to type this as undefined because TS would\n\t\t\t\t\t\t\t\t// do some funky stuff with query resolve typing otherwise\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// TODO: strongly type this based on table\n\t\t\t\t\t\t\tconst r = {\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t * Query filters for the drizzle query API.\n\t\t\t\t\t\t\t\t * @example\n\t\t\t\t\t\t\t\t * ```ts\n\t\t\t\t\t\t\t\t * author: t.relation(\"author\", {\n\t\t\t\t\t\t\t\t * query: (_args, ctx) => ctx.abilities.users.filter(\"read\").query.single,\n\t\t\t\t\t\t\t\t * }),\n\t\t\t\t\t\t\t\t * ´´´\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\tquery: {\n\t\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t\t * For find first calls\n\t\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\t\tsingle: {\n\t\t\t\t\t\t\t\t\t\tget where() {\n\t\t\t\t\t\t\t\t\t\t\treturn where();\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tcolumns: columns(),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t\t * For find many calls\n\t\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\t\tmany: {\n\t\t\t\t\t\t\t\t\t\tget where() {\n\t\t\t\t\t\t\t\t\t\t\treturn where();\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tcolumns: columns(),\n\t\t\t\t\t\t\t\t\t\tget limit() {\n\t\t\t\t\t\t\t\t\t\t\treturn limit();\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t * Query filters for the drizzle SQL API as used in e.g. updates.\n\t\t\t\t\t\t\t\t * @example\n\t\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t\t * ```ts\n\t\t\t\t\t\t\t\t * await db\n\t\t\t\t\t\t\t\t *\t.update(schema.users)\n\t\t\t\t\t\t\t\t *\t.set({\n\t\t\t\t\t\t\t\t *\t name: args.newName,\n\t\t\t\t\t\t\t\t * \t})\n\t\t\t\t\t\t\t\t *\t.where(\n\t\t\t\t\t\t\t\t *\t and(\n\t\t\t\t\t\t\t\t *\t eq(schema.users.id, args.userId),\n\t\t\t\t\t\t\t\t *\t ctx.abilities.users.filter(\"update\").sql.where,\n\t\t\t\t\t\t\t\t *\t ),\n\t\t\t\t\t\t\t\t *\t);\n\t\t\t\t\t\t\t\t * ```\n\t\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\tsql: {\n\t\t\t\t\t\t\t\t\tget where() {\n\t\t\t\t\t\t\t\t\t\treturn transformedWhere();\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tcolumns: columns(),\n\t\t\t\t\t\t\t\t\tget limit() {\n\t\t\t\t\t\t\t\t\t\treturn limit();\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// columns can't be set to undefined, drizzle will interpret this\n\t\t\t\t\t\t\t// as: don't return any columns\n\t\t\t\t\t\t\t// therefore we need to delete it\n\t\t\t\t\t\t\tif (!columns()) {\n\t\t\t\t\t\t\t\t// biome-ignore lint/performance/noDelete: we need this to not exist\n\t\t\t\t\t\t\t\tdelete r.sql.columns;\n\t\t\t\t\t\t\t\t// biome-ignore lint/performance/noDelete: we need this to not exist\n\t\t\t\t\t\t\t\tdelete r.query.many.columns;\n\t\t\t\t\t\t\t\t// biome-ignore lint/performance/noDelete: we need this to not exist\n\t\t\t\t\t\t\t\tdelete r.query.single.columns;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn r;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Creates a filter that will never return any result\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst getBlockEverythingFilter = () => {\n\t\t\t\t\t\t\tconst tableSchema = tableHelper({\n\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\ttsName: tableName,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (Object.keys(tableSchema.primaryColumns).length === 0) {\n\t\t\t\t\t\t\t\tthrow new RumbleError(\n\t\t\t\t\t\t\t\t\t`No primary key found for entity ${tableName.toString()}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst primaryKeyField = Object.values(\n\t\t\t\t\t\t\t\ttableSchema.primaryColumns,\n\t\t\t\t\t\t\t)[0];\n\t\t\t\t\t\t\t// we want a filter that excludes everything\n\t\t\t\t\t\t\tconst distinctValues = createDistinctValuesFromSQLType(\n\t\t\t\t\t\t\t\tprimaryKeyField.getSQLType() as any,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t// when the user has no permission for anything, ensure returns nothing\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\twhere: {\n\t\t\t\t\t\t\t\t\tAND: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t[primaryKeyField.name]: distinctValues.value1,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t[primaryKeyField.name]: distinctValues.value2,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tlet queryFiltersPerEntityAndAction =\n\t\t\t\t\t\t\tregisteredQueryFilters?.[tableName]?.[action];\n\n\t\t\t\t\t\t// in case we have a wildcard ability, skip the rest and only apply the injected\n\t\t\t\t\t\t// filters, if any\n\t\t\t\t\t\tif (queryFiltersPerEntityAndAction === \"unspecified\") {\n\t\t\t\t\t\t\treturn transformToResponse();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// if nothing has been allowed, block everything\n\t\t\t\t\t\tif (!queryFiltersPerEntityAndAction) {\n\t\t\t\t\t\t\tqueryFiltersPerEntityAndAction = [getBlockEverythingFilter()];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//TODO: we could maybe improve performance by not filtering at each creation\n\t\t\t\t\t\t// but instead while the user sets the abilities\n\t\t\t\t\t\tconst simpleQueryFilters: SimpleQueryFilter<\n\t\t\t\t\t\t\tDB,\n\t\t\t\t\t\t\tTableNameT,\n\t\t\t\t\t\t\tQueryFilterInput<DB, TableNameT>\n\t\t\t\t\t\t>[] = queryFiltersPerEntityAndAction.filter(isSimpleQueryFilter);\n\n\t\t\t\t\t\tconst functionQueryFilters: ReturnType<\n\t\t\t\t\t\t\tFunctionQueryFilter<\n\t\t\t\t\t\t\t\tDB,\n\t\t\t\t\t\t\t\tTableNameT,\n\t\t\t\t\t\t\t\tQueryFilterInput<DB, TableNameT>,\n\t\t\t\t\t\t\t\tUserContext\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t>[] = queryFiltersPerEntityAndAction\n\t\t\t\t\t\t\t.filter(isFunctionFilter)\n\t\t\t\t\t\t\t.map((queryFilter) => queryFilter(userContext));\n\n\t\t\t\t\t\t//TODO: we could save some work by not running all the filters at each request\n\t\t\t\t\t\t// whenever one already returned \"allowed\"\n\t\t\t\t\t\tconst someWildcardFound = functionQueryFilters.some(\n\t\t\t\t\t\t\t(c) => c === \"allow\",\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tlet allQueryFilters = [\n\t\t\t\t\t\t\t...simpleQueryFilters,\n\t\t\t\t\t\t\t...functionQueryFilters,\n\t\t\t\t\t\t]\n\t\t\t\t\t\t\t// we just ignore the ones who did return undefined, since that evaluates to \"allow nothing\"\n\t\t\t\t\t\t\t.filter((e) => e !== undefined)\n\t\t\t\t\t\t\t// we already checked if we have some wildcard, so we can ignore the wildcard entries from now on\n\t\t\t\t\t\t\t.filter((e) => e !== \"allow\");\n\n\t\t\t\t\t\t// if we don't have any permitted filters and don't have a wildcard, then block everything\n\t\t\t\t\t\tif (!someWildcardFound && allQueryFilters.length === 0) {\n\t\t\t\t\t\t\tallQueryFilters = [getBlockEverythingFilter()];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet highestLimit: number | undefined;\n\t\t\t\t\t\tfor (const conditionObject of allQueryFilters) {\n\t\t\t\t\t\t\tif (conditionObject?.limit) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\thighestLimit === undefined ||\n\t\t\t\t\t\t\t\t\tconditionObject.limit > highestLimit\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\thighestLimit = conditionObject.limit;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet combinedAllowedColumns: Record<string, any> | undefined;\n\t\t\t\t\t\tfor (const conditionObject of [\n\t\t\t\t\t\t\t...allQueryFilters,\n\t\t\t\t\t\t\toptions?.inject,\n\t\t\t\t\t\t]) {\n\t\t\t\t\t\t\tif (conditionObject?.columns) {\n\t\t\t\t\t\t\t\tif (combinedAllowedColumns === undefined) {\n\t\t\t\t\t\t\t\t\tcombinedAllowedColumns = conditionObject.columns;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcombinedAllowedColumns = {\n\t\t\t\t\t\t\t\t\t\t...combinedAllowedColumns,\n\t\t\t\t\t\t\t\t\t\t...conditionObject.columns,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// in case we have a wildcard, we don't want to apply any where conditions\n\t\t\t\t\t\tconst accumulatedWhereConditions = someWildcardFound\n\t\t\t\t\t\t\t? []\n\t\t\t\t\t\t\t: allQueryFilters.filter((o) => o?.where).map((o) => o.where);\n\n\t\t\t\t\t\tconst combinedWhere =\n\t\t\t\t\t\t\taccumulatedWhereConditions.length > 0\n\t\t\t\t\t\t\t\t? { OR: accumulatedWhereConditions }\n\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t//TODO make this actually typesafe\n\t\t\t\t\t\treturn transformToResponse({\n\t\t\t\t\t\t\twhere: combinedWhere,\n\t\t\t\t\t\t\tcolumns: combinedAllowedColumns,\n\t\t\t\t\t\t\tlimit: highestLimit,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\texplicitFilters: (action: Action) => {\n\t\t\t\t\t\treturn registeredFilters[tableName][action];\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tfor (const entityKey of Object.keys(db.query) as TableName<DB>[]) {\n\t\t\t\tbuilder[entityKey] = createEntityObject(entityKey);\n\t\t\t}\n\n\t\t\treturn builder;\n\t\t},\n\t};\n};\n","import type {\n\tAbilityBuilderType,\n\tcreateAbilityBuilder,\n} from \"./abilityBuilder\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\n} from \"./types/rumbleInput\";\n\nexport type ContextFunctionType<\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n\ttypeof createContextFunction<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\tAbilityBuilderType<UserContext, DB, RequestEvent, Action, PothosConfig>\n\t>\n>;\n\nexport type ContextType<\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n> = Awaited<\n\tReturnType<\n\t\tContextFunctionType<UserContext, DB, RequestEvent, Action, PothosConfig>\n\t>\n>;\n\nexport const createContextFunction = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n\tAbilityBuilder extends ReturnType<\n\t\ttypeof createAbilityBuilder<\n\t\t\tUserContext,\n\t\t\tDB,\n\t\t\tRequestEvent,\n\t\t\tAction,\n\t\t\tPothosConfig\n\t\t>\n\t>,\n>({\n\tcontext: makeUserContext,\n\tabilityBuilder,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n\tabilityBuilder: AbilityBuilder;\n}) => {\n\treturn async (req: RequestEvent) => {\n\t\tconst userContext = makeUserContext\n\t\t\t? await makeUserContext(req)\n\t\t\t: ({} as UserContext);\n\t\treturn {\n\t\t\t...userContext,\n\t\t\tabilities: abilityBuilder.buildWithUserContext(userContext),\n\t\t};\n\t};\n};\n","// https://stackoverflow.com/a/1026087/11988368\nexport function capitalizeFirstLetter(val: string) {\n\treturn String(val).charAt(0).toUpperCase() + String(val).slice(1);\n}\n","import { toCamelCase } from \"drizzle-orm/casing\";\nimport { type PgEnum, PgEnumColumn } from \"drizzle-orm/pg-core\";\nimport { capitalizeFirstLetter } from \"./helpers/capitalize\";\nimport { tableHelper } from \"./helpers/tableHelpers\";\nimport type { SchemaBuilderType } from \"./schemaBuilder\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport { RumbleError } from \"./types/rumbleError\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\n} from \"./types/rumbleInput\";\n\n/**\n * Checks if a schema type is an enum\n */\nexport function isEnumSchema(schemaType: any): schemaType is PgEnum<any> {\n\t// TODO make this compatible with other db drivers\n\treturn schemaType instanceof PgEnumColumn;\n}\n\n// TODO make this compatible with other db drivers\ntype EnumTypes = PgEnum<any>;\n\ntype EnumFields<T> = {\n\t[K in keyof T as T[K] extends EnumTypes ? K : never]: T[K];\n};\n\nexport type NonEnumFields<T> = {\n\t[K in keyof T as T[K] extends EnumTypes ? never : K]: T[K];\n};\n\nexport type EnumImplementerType<\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n\ttypeof createEnumImplementer<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\tSchemaBuilderType<UserContext, DB, RequestEvent, Action, PothosConfig>\n\t>\n>;\n\nexport const createEnumImplementer = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n\tSchemaBuilder extends SchemaBuilderType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n>({\n\tdb,\n\tschemaBuilder,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n\tschemaBuilder: SchemaBuilder;\n}) => {\n\tconst referenceStorage = new Map<string, any>();\n\n\tconst enumImplementer = <\n\t\tExplicitEnumVariableName extends keyof EnumFields<\n\t\t\tNonNullable<DB[\"_\"][\"relations\"][\"schema\"]>\n\t\t>,\n\t\tEnumColumn extends EnumTypes,\n\t\tRefName extends string,\n\t>({\n\t\ttsName,\n\t\tenumColumn,\n\t\trefName,\n\t}: Partial<{\n\t\ttsName: ExplicitEnumVariableName;\n\t\tenumColumn: EnumColumn;\n\t\trefName?: RefName | undefined;\n\t}> &\n\t\t(\n\t\t\t| {\n\t\t\t\t\ttsName: ExplicitEnumVariableName;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tenumColumn: EnumColumn;\n\t\t\t }\n\t\t)) => {\n\t\t//TODO check if this can be done typesafe\n\n\t\tlet enumSchemaName: string | undefined;\n\t\tlet enumValues: any[] | undefined;\n\n\t\tif (tsName) {\n\t\t\tconst schemaEnum = db._.relations.schema[tsName as string];\n\n\t\t\tenumSchemaName = tsName.toString();\n\n\t\t\tconst enumCol = Object.values(db._.relations.schema)\n\t\t\t\t.filter((s) => typeof s === \"object\")\n\t\t\t\t.map((s) => Object.values(s[Symbol.for(\"drizzle:Columns\")]))\n\t\t\t\t.flat(2)\n\t\t\t\t.find((s: any) => s.config?.enum === schemaEnum);\n\n\t\t\tif (!enumCol) {\n\t\t\t\tthrow new RumbleError(`Could not find applied enum column for ${tsName.toString()}.\nPlease ensure that you use the enum at least once as a column of a table!`);\n\t\t\t}\n\n\t\t\tenumValues = (enumCol as any).enumValues;\n\t\t} else if (enumColumn) {\n\t\t\tconst schemaEnumEntry = Object.entries(db._.relations.schema).find(\n\t\t\t\t([key, value]) => value === (enumColumn as any).config.enum,\n\t\t\t);\n\n\t\t\tif (!schemaEnumEntry) {\n\t\t\t\tthrow new RumbleError(\n\t\t\t\t\t`Could not find enum in schema for ${enumColumn.name}!`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tenumSchemaName = schemaEnumEntry[0];\n\t\t\tenumValues = enumColumn.enumValues;\n\t\t}\n\n\t\tif (!enumSchemaName || !enumValues) {\n\t\t\tthrow new RumbleError(\"Could not determine enum structure!\");\n\t\t}\n\n\t\tconst graphqlImplementationName =\n\t\t\trefName ?? `${capitalizeFirstLetter(toCamelCase(enumSchemaName))}Enum`;\n\n\t\tlet ret: ReturnType<typeof implement> | undefined = referenceStorage.get(\n\t\t\tgraphqlImplementationName,\n\t\t);\n\t\tif (ret) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tconst implement = () =>\n\t\t\tschemaBuilder.enumType(graphqlImplementationName, {\n\t\t\t\tvalues: enumValues,\n\t\t\t});\n\n\t\tret = implement();\n\t\treferenceStorage.set(graphqlImplementationName, ret);\n\t\treturn ret;\n\t};\n\n\treturn enumImplementer;\n};\n","import type { useSofa } from \"sofa-api\";\n\nexport const sofaOpenAPIWebhookDocs: Parameters<typeof useSofa>[0][\"openAPI\"] =\n\t{\n\t\tpaths: {\n\t\t\t\"/webhook\": {\n\t\t\t\tpost: {\n\t\t\t\t\toperationId: \"webhook_create\",\n\t\t\t\t\tdescription: \"Creates a webhook subscription.\",\n\t\t\t\t\ttags: [],\n\t\t\t\t\tparameters: [],\n\t\t\t\t\trequestBody: {\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t$ref: \"#/components/schemas/WebhookCreateBody\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\t$ref: \"#/components/schemas/WebhookDetailResponse\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"/webhook/{id}\": {\n\t\t\t\tpost: {\n\t\t\t\t\toperationId: \"webhook_update\",\n\t\t\t\t\tdescription: \"Updates a webhook subscription.\",\n\t\t\t\t\tparameters: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: \"id\",\n\t\t\t\t\t\t\tin: \"path\",\n\t\t\t\t\t\t\tdescription: \"The ID of the webhook to update\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} as any,\n\t\t\t\t\t],\n\t\t\t\t\trequestBody: {\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t$ref: \"#/components/schemas/WebhookCreateBody\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\t$ref: \"#/components/schemas/WebhookDetailResponse\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tdelete: {\n\t\t\t\t\toperationId: \"webhook_delete\",\n\t\t\t\t\tdescription: \"Removes a webhook subscription.\",\n\t\t\t\t\ttags: [],\n\t\t\t\t\tparameters: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: \"id\",\n\t\t\t\t\t\t\tin: \"path\",\n\t\t\t\t\t\t\tdescription: \"The ID of the webhook to delete\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} as any,\n\t\t\t\t\t],\n\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\t$ref: \"#/components/schemas/WebhookDetailResponse\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcomponents: {\n\t\t\tschemas: {\n\t\t\t\tWebhookCreateBody: {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tsubscription: {\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\"The subscription to subscribe to. In many cases, these match the available query IDs without the '_query' suffix. E.g., 'findFirstUser_query' -> 'findFirstUser'. See the graphql schema for more details on what subscriptions are available.\",\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvariables: {\n\t\t\t\t\t\t\tdescription: \"The variables to pass to the subscription.\",\n\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\turl: {\n\t\t\t\t\t\t\tdescription: \"The URL to send the webhook to.\",\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tWebhookDetailResponse: {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\"The ID of the webhook. Can be used as reference in update or delete calls.\",\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t};\n","import type { FieldMap, SchemaTypes } from \"@pothos/core\";\nimport type { DrizzleObjectFieldBuilder } from \"@pothos/plugin-drizzle\";\nimport { One, type Table } from \"drizzle-orm\";\nimport type { AbilityBuilderType } from \"./abilityBuilder\";\nimport { type EnumImplementerType, isEnumSchema } from \"./enum\";\nimport { capitalizeFirstLetter } from \"./helpers/capitalize\";\nimport { mapSQLTypeToGraphQLType } from \"./helpers/sqlTypes/mapSQLTypeToTSType\";\nimport type { PossibleSQLType } from \"./helpers/sqlTypes/types\";\nimport {\n\ttype TableIdentifierTSName,\n\ttableHelper,\n} from \"./helpers/tableHelpers\";\nimport type { MakePubSubInstanceType } from \"./pubsub\";\nimport type { SchemaBuilderType } from \"./schemaBuilder\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport { RumbleError } from \"./types/rumbleError\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\n} from \"./types/rumbleInput\";\nimport type { ArgImplementerType } from \"./whereArg\";\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?\nconst isProbablyAConfigObject = (t: any) => {\n\tif (typeof t !== \"object\") {\n\t\treturn false;\n\t}\n\n\tif (\n\t\tObject.keys(t).some((k) =>\n\t\t\t[\n\t\t\t\t\"args\",\n\t\t\t\t\"nullable\",\n\t\t\t\t\"query\",\n\t\t\t\t\"subscribe\",\n\t\t\t\t\"description\",\n\t\t\t\t\"type\",\n\t\t\t\t\"resolve\",\n\t\t\t].find((e) => e === k),\n\t\t)\n\t)\n\t\treturn true;\n\treturn false;\n};\n\nexport const createObjectImplementer = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n\tSchemaBuilder extends SchemaBuilderType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n\tArgImplementer extends ArgImplementerType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n\tEnumImplementer extends EnumImplementerType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n\tMakePubSubInstance extends MakePubSubInstanceType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n\tAbilityBuilderInstance extends AbilityBuilderType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n>({\n\tdb,\n\tschemaBuilder,\n\tmakePubSubInstance,\n\targImplementer,\n\tenumImplementer,\n\tabilityBuilder,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n\tschemaBuilder: SchemaBuilder;\n\targImplementer: ArgImplementer;\n\tenumImplementer: EnumImplementer;\n\tmakePubSubInstance: MakePubSubInstance;\n\tabilityBuilder: AbilityBuilderInstance;\n}) => {\n\treturn <\n\t\tExplicitTableName extends TableIdentifierTSName<DB>,\n\t\tRefName extends string,\n\t>({\n\t\ttable,\n\t\trefName,\n\t\treadAction = \"read\" as Action,\n\t\tadjust,\n\t}: {\n\t\t/**\n\t\t * The table you want to be used as reference for the object creation.\n\t\t */\n\t\ttable: ExplicitTableName;\n\t\t/**\n\t\t * The name you want this object to have in your graphql schema.\n\t\t * Rumble will create a reasonable default if not specified.\n\t\t */\n\t\trefName?: RefName;\n\t\t/**\n\t\t * The action used for read access to the table.\n\t\t * Defaults to \"read\".\n\t\t */\n\t\treadAction?: Action;\n\t\t/**\n\t\t * A function which can be used to adjust the fields of the object.\n\t\t * You can extend the object by specifying fields that do not exist as\n\t\t * per your db schema, or overwrite existing fields with the same name.\n\t\t * In case you do overwrite, rumble will set proper nullability and\n\t\t * subscription properties if you do not specify them explicitly.\n\t\t */\n\t\tadjust?:\n\t\t\t| ((\n\t\t\t\t\tt: DrizzleObjectFieldBuilder<\n\t\t\t\t\t\tSchemaBuilder[\"$inferSchemaTypes\"],\n\t\t\t\t\t\tSchemaBuilder[\"$inferSchemaTypes\"][\"DrizzleRelationsConfig\"][ExplicitTableName],\n\t\t\t\t\t\tNonNullable<\n\t\t\t\t\t\t\tAwaited<ReturnType<DB[\"query\"][ExplicitTableName][\"findFirst\"]>>\n\t\t\t\t\t\t>\n\t\t\t\t\t>,\n\t\t\t ) => FieldMap)\n\t\t\t| undefined;\n\t}) => {\n\t\tconst tableSchema = tableHelper({ db, tsName: table });\n\t\tif (Object.keys(tableSchema.primaryColumns).length === 0) {\n\t\t\tconsole.warn(\n\t\t\t\t`Could not find primary key for ${table.toString()}. Cannot register subscriptions!`,\n\t\t\t);\n\t\t}\n\t\tconst primaryKey = Object.values(tableSchema.primaryColumns)[0];\n\n\t\tconst { registerOnInstance } = makePubSubInstance({ table: table });\n\n\t\treturn schemaBuilder.drizzleObject(table, {\n\t\t\tname: refName ?? capitalizeFirstLetter(table.toString()),\n\t\t\tsubscribe: (subscriptions, element, context) => {\n\t\t\t\tif (!primaryKey) return;\n\t\t\t\tconst primaryKeyValue = (element as any)[primaryKey.name];\n\t\t\t\tif (!primaryKeyValue) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`Could not find primary key value for ${JSON.stringify(\n\t\t\t\t\t\t\telement,\n\t\t\t\t\t\t)}. Cannot register subscription!`,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t//TODO maybe register non specific update calls aswell?\n\t\t\t\tregisterOnInstance({\n\t\t\t\t\tinstance: subscriptions,\n\t\t\t\t\taction: \"updated\",\n\t\t\t\t\tprimaryKeyValue: primaryKeyValue,\n\t\t\t\t});\n\t\t\t},\n\t\t\tapplyFilters:\n\t\t\t\tabilityBuilder?.registeredFilters?.[table as any]?.[readAction],\n\t\t\tfields: (t) => {\n\t\t\t\tconst columns = tableSchema.columns;\n\t\t\t\tconst mapSQLTypeStringToExposedPothosType = <\n\t\t\t\t\tColumn extends keyof typeof columns,\n\t\t\t\t>(\n\t\t\t\t\tsqlType: PossibleSQLType,\n\t\t\t\t\tcolumnName: Column,\n\t\t\t\t\tnullable: boolean,\n\t\t\t\t) => {\n\t\t\t\t\tconst gqlType = mapSQLTypeToGraphQLType({\n\t\t\t\t\t\tsqlType,\n\t\t\t\t\t\tfieldName: columnName,\n\t\t\t\t\t});\n\t\t\t\t\tswitch (gqlType) {\n\t\t\t\t\t\tcase \"Int\":\n\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\treturn t.exposeInt(columnName, { nullable });\n\t\t\t\t\t\tcase \"String\":\n\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\treturn t.exposeString(columnName, { nullable });\n\t\t\t\t\t\tcase \"Boolean\":\n\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\treturn t.exposeBoolean(columnName, { nullable });\n\t\t\t\t\t\tcase \"Date\":\n\t\t\t\t\t\t\treturn t.field({\n\t\t\t\t\t\t\t\ttype: \"Date\",\n\t\t\t\t\t\t\t\tresolve: (element) => (element as any)[columnName] as Date,\n\t\t\t\t\t\t\t\tnullable,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\tcase \"DateTime\":\n\t\t\t\t\t\t\treturn t.field({\n\t\t\t\t\t\t\t\ttype: \"DateTime\",\n\t\t\t\t\t\t\t\tresolve: (element) => (element as any)[columnName] as Date,\n\t\t\t\t\t\t\t\tnullable,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\tcase \"Float\":\n\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\treturn t.exposeFloat(columnName, { nullable });\n\t\t\t\t\t\tcase \"ID\":\n\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\treturn t.exposeID(columnName, { nullable });\n\t\t\t\t\t\tcase \"JSON\":\n\t\t\t\t\t\t\treturn t.field({\n\t\t\t\t\t\t\t\ttype: \"JSON\",\n\t\t\t\t\t\t\t\tresolve: (element) => (element as any)[columnName] as unknown,\n\t\t\t\t\t\t\t\tnullable,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new RumbleError(\n\t\t\t\t\t\t\t\t`Unsupported object type ${gqlType} for column ${columnName}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// in case the user makes adjustments we want to store away which\n\t\t\t\t// pothos function was called with what config\n\t\t\t\t// this is mapped to the ref which later can be used to\n\t\t\t\t// reference these parameters while iterating over the fields\n\t\t\t\t// and checking against the userAdjustments object\n\t\t\t\tconst configMap = new Map<\n\t\t\t\t\tany,\n\t\t\t\t\t{\n\t\t\t\t\t\tcreatorFunction: (...p: any[]) => any;\n\t\t\t\t\t\tparams: any[];\n\t\t\t\t\t\tconfigObject: any;\n\t\t\t\t\t}\n\t\t\t\t>();\n\t\t\t\t// stores the results of the user adjustments\n\t\t\t\t// also stores all the used pothos functions and the configs\n\t\t\t\t// provided by the user so we can extend that if necessary\n\t\t\t\tconst userAdjustments =\n\t\t\t\t\tadjust?.(\n\t\t\t\t\t\tnew Proxy(t, {\n\t\t\t\t\t\t\tget: (target, prop) => {\n\t\t\t\t\t\t\t\tif (typeof (target as any)[prop] === \"function\") {\n\t\t\t\t\t\t\t\t\treturn (...params: any[]) => {\n\t\t\t\t\t\t\t\t\t\tconst ref = (target as any)[prop](...params);\n\t\t\t\t\t\t\t\t\t\tconst configObject = params.find(isProbablyAConfigObject);\n\t\t\t\t\t\t\t\t\t\tif (!configObject)\n\t\t\t\t\t\t\t\t\t\t\tthrow new RumbleError(\n\t\t\t\t\t\t\t\t\t\t\t\t\"Expected config object to be passed to adjust field\",\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\tconfigMap.set(ref, {\n\t\t\t\t\t\t\t\t\t\t\tparams,\n\t\t\t\t\t\t\t\t\t\t\tcreatorFunction: (target as any)[prop],\n\t\t\t\t\t\t\t\t\t\t\tconfigObject,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\treturn ref;\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn (target as any)[prop];\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}) as any,\n\t\t\t\t\t) ?? {};\n\n\t\t\t\tconst fields = Object.entries(columns).reduce(\n\t\t\t\t\t(acc, [key, value]) => {\n\t\t\t\t\t\tif (userAdjustments[key]) {\n\t\t\t\t\t\t\tconst { params, creatorFunction, configObject } = configMap.get(\n\t\t\t\t\t\t\t\tuserAdjustments[key],\n\t\t\t\t\t\t\t)!;\n\n\t\t\t\t\t\t\tif (typeof configObject.nullable !== \"boolean\") {\n\t\t\t\t\t\t\t\tconfigObject.nullable = !value.notNull;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tuserAdjustments[key] = creatorFunction.bind(t)(...params);\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (isEnumSchema(value)) {\n\t\t\t\t\t\t\tconst enumImpl = enumImplementer({\n\t\t\t\t\t\t\t\tenumColumn: value,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tacc[key] = t.field({\n\t\t\t\t\t\t\t\ttype: enumImpl,\n\t\t\t\t\t\t\t\tresolve: (element) => (element as any)[key],\n\t\t\t\t\t\t\t\tnullable: !value.notNull,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tacc[key] = mapSQLTypeStringToExposedPothosType(\n\t\t\t\t\t\t\t\tvalue.getSQLType() as PossibleSQLType,\n\t\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\t\t!value.notNull,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn acc;\n\t\t\t\t\t},\n\t\t\t\t\t{} as Record<\n\t\t\t\t\t\tkeyof typeof columns,\n\t\t\t\t\t\tReturnType<typeof mapSQLTypeStringToExposedPothosType>\n\t\t\t\t\t>,\n\t\t\t\t);\n\n\t\t\t\tconst relations = Object.entries(tableSchema.relations ?? {}).reduce(\n\t\t\t\t\t(acc, [key, value]) => {\n\t\t\t\t\t\tconst relationSchema = tableHelper({\n\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\ttable: value.targetTable as Table,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst WhereArg = argImplementer({\n\t\t\t\t\t\t\tdbName: relationSchema.dbName,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst relationTablePubSub = makePubSubInstance({\n\t\t\t\t\t\t\ttable: relationSchema.tsName as any,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// many relations will return an empty array so we just don't set them nullable\n\t\t\t\t\t\tlet nullable = false;\n\t\t\t\t\t\tlet isMany = true;\n\t\t\t\t\t\tlet filterSpecifier = \"many\";\n\t\t\t\t\t\tif (value instanceof One) {\n\t\t\t\t\t\t\tisMany = false;\n\t\t\t\t\t\t\tnullable = value.optional;\n\t\t\t\t\t\t\tfilterSpecifier = \"single\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst subscribe = (subscriptions: any, element: any) => {\n\t\t\t\t\t\t\trelationTablePubSub.registerOnInstance({\n\t\t\t\t\t\t\t\tinstance: subscriptions,\n\t\t\t\t\t\t\t\taction: \"created\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\trelationTablePubSub.registerOnInstance({\n\t\t\t\t\t\t\t\tinstance: subscriptions,\n\t\t\t\t\t\t\t\taction: \"removed\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (userAdjustments[key]) {\n\t\t\t\t\t\t\tconst { params, creatorFunction, configObject } = configMap.get(\n\t\t\t\t\t\t\t\tuserAdjustments[key],\n\t\t\t\t\t\t\t)!;\n\n\t\t\t\t\t\t\tif (typeof configObject.nullable !== \"boolean\") {\n\t\t\t\t\t\t\t\tconfigObject.nullable = nullable;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (typeof configObject.subscribe !== \"function\") {\n\t\t\t\t\t\t\t\tconfigObject.subscribe = subscribe;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tuserAdjustments[key] = creatorFunction.bind(t)(...params);\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t(acc as any)[key] = t.relation(key, {\n\t\t\t\t\t\t\targs: {\n\t\t\t\t\t\t\t\twhere: t.arg({ type: WhereArg, required: false }),\n\t\t\t\t\t\t\t\t...(isMany\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\toffset: t.arg.int({ required: false }),\n\t\t\t\t\t\t\t\t\t\t\tlimit: t.arg.int({ required: false }),\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsubscribe,\n\t\t\t\t\t\t\tnullable,\n\t\t\t\t\t\t\tquery: (args: any, ctx: any) => {\n\t\t\t\t\t\t\t\t// transform null prototyped object\n\t\t\t\t\t\t\t\t// biome-ignore lint/style/noParameterAssign: Its really not a problem here\n\t\t\t\t\t\t\t\targs = JSON.parse(JSON.stringify(args));\n\t\t\t\t\t\t\t\tconst filter = ctx.abilities[relationSchema.tsName].filter(\n\t\t\t\t\t\t\t\t\treadAction,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tinject: { where: args.where, limit: args.limit },\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t).query[filterSpecifier];\n\n\t\t\t\t\t\t\t\tif (args.offset) {\n\t\t\t\t\t\t\t\t\t(filter as any).offset = args.offset;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn filter;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} as any) as any;\n\t\t\t\t\t\treturn acc;\n\t\t\t\t\t},\n\t\t\t\t\t{} as Record<\n\t\t\t\t\t\tkeyof typeof tableSchema.relations,\n\t\t\t\t\t\tReturnType<typeof mapSQLTypeStringToExposedPothosType>\n\t\t\t\t\t>,\n\t\t\t\t);\n\n\t\t\t\treturn {\n\t\t\t\t\t...fields,\n\t\t\t\t\t...relations,\n\t\t\t\t\t...userAdjustments,\n\t\t\t\t};\n\t\t\t},\n\t\t});\n\t};\n};\n","import type { SchemaBuilderType } from \"../../schemaBuilder\";\nimport type { GenericDrizzleDbTypeConstraints } from \"../../types/genericDrizzleDbType\";\nimport type { CustomRumblePothosConfig } from \"../../types/rumbleInput\";\nimport { type PossibleSQLType, UnknownTypeRumbleError } from \"./types\";\n\nexport function mapSQLTypeToGraphQLType<\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n\tSchemaBuilder extends SchemaBuilderType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n>({ sqlType, fieldName }: { sqlType: PossibleSQLType; fieldName?: string }) {\n\ttype ReturnType = Parameters<\n\t\tParameters<Parameters<SchemaBuilder[\"queryField\"]>[1]>[0][\"field\"]\n\t>[0][\"type\"];\n\n\tlet ret: ReturnType | undefined;\n\n\tif (\n\t\t[\"serial\", \"int\", \"integer\", \"tinyint\", \"smallint\", \"mediumint\"].includes(\n\t\t\tsqlType,\n\t\t)\n\t) {\n\t\tret = \"Int\";\n\t}\n\n\tif ([\"real\", \"decimal\", \"double\", \"float\"].includes(sqlType)) {\n\t\tret = \"Float\";\n\t}\n\n\tif ([\"string\", \"text\", \"varchar\", \"char\", \"text(256)\"].includes(sqlType)) {\n\t\tif (\n\t\t\tfieldName &&\n\t\t\t(fieldName.toLowerCase().endsWith(\"_id\") ||\n\t\t\t\tfieldName.toLowerCase().endsWith(\"id\"))\n\t\t) {\n\t\t\tret = \"ID\";\n\t\t} else {\n\t\t\tret = \"String\";\n\t\t}\n\t}\n\n\tif ([\"uuid\"].includes(sqlType)) {\n\t\tret = \"ID\";\n\t}\n\n\tif ([\"boolean\"].includes(sqlType)) {\n\t\tret = \"Boolean\";\n\t}\n\n\tif ([\"timestamp\", \"datetime\"].includes(sqlType)) {\n\t\tret = \"DateTime\";\n\t}\n\n\tif ([\"date\"].includes(sqlType)) {\n\t\tret = \"Date\";\n\t}\n\n\tif ([\"json\"].includes(sqlType)) {\n\t\tret = \"JSON\";\n\t}\n\n\tif (ret !== undefined) {\n\t\treturn ret;\n\t}\n\n\tthrow UnknownTypeRumbleError(sqlType, \"SQL to GQL\");\n}\n","import type { GetColumnData } from \"drizzle-orm\";\nimport { createPubSub } from \"graphql-yoga\";\nimport type { TableIdentifierTSName } from \"./helpers/tableHelpers\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\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\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n\ttypeof createPubSubInstance<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>\n>[\"makePubSubInstance\"];\n\nexport const createPubSubInstance = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n>({\n\tsubscriptions,\n\tdb,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig>) => {\n\tconst pubsub = subscriptions\n\t\t? createPubSub(...subscriptions)\n\t\t: createPubSub();\n\n\tconst makePubSubInstance = <\n\t\tExplicitTableName extends TableIdentifierTSName<DB>,\n\t>({\n\t\ttable,\n\t}: {\n\t\ttable: ExplicitTableName;\n\t}) => {\n\t\ttype PrimaryKeyType = any;\n\n\t\tfunction makePubSubKey({\n\t\t\taction,\n\t\t\ttableName,\n\t\t\tprimaryKeyValue,\n\t\t}: {\n\t\t\ttableName: string;\n\t\t\taction: PubSubAction;\n\t\t\tprimaryKeyValue?: PrimaryKeyType;\n\t\t}) {\n\t\t\tlet actionKey: string;\n\n\t\t\tswitch (action) {\n\t\t\t\tcase \"created\":\n\t\t\t\t\tactionKey = SUBSCRIPTION_NOTIFIER_CREATED;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"removed\":\n\t\t\t\t\tactionKey = SUBSCRIPTION_NOTIFIER_REMOVED;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"updated\":\n\t\t\t\t\tactionKey = SUBSCRIPTION_NOTIFIER_UPDATED;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown action: ${action}`);\n\t\t\t}\n\n\t\t\treturn `${SUBSCRIPTION_NOTIFIER_RUMBLE_PREFIX}/${tableName}${\n\t\t\t\tprimaryKeyValue ? `/${primaryKeyValue}` : \"\"\n\t\t\t}/${actionKey}`;\n\t\t}\n\n\t\t// TODO does caching these make sense?\n\t\treturn {\n\t\t\t/**\n\t\t\t * Call this when you want to register a subscription on an instance to this table\n\t\t\t */\n\t\t\tregisterOnInstance({\n\t\t\t\tinstance,\n\t\t\t\taction,\n\t\t\t\tprimaryKeyValue,\n\t\t\t}: {\n\t\t\t\tinstance: { register: (id: string) => void };\n\t\t\t\taction: PubSubAction;\n\t\t\t\tprimaryKeyValue?: string;\n\t\t\t}) {\n\t\t\t\tconst key = makePubSubKey({\n\t\t\t\t\ttableName: table.toString(),\n\t\t\t\t\taction,\n\t\t\t\t\tprimaryKeyValue,\n\t\t\t\t});\n\t\t\t\tinstance.register(key);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Call this when you created an entity of this table\n\t\t\t */\n\t\t\tcreated() {\n\t\t\t\tconst key = makePubSubKey({\n\t\t\t\t\ttableName: table.toString(),\n\t\t\t\t\taction: \"created\",\n\t\t\t\t});\n\t\t\t\treturn pubsub.publish(key);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Call this when you removed one or more entities of this table\n\t\t\t */\n\t\t\tremoved(primaryKeyValue?: PrimaryKeyType | PrimaryKeyType[]) {\n\t\t\t\tconst key = makePubSubKey({\n\t\t\t\t\ttableName: table.toString(),\n\t\t\t\t\taction: \"removed\",\n\t\t\t\t\t//TODO would it make sense to use specific sub topics here?\n\t\t\t\t\t// primaryKeyValue,\n\t\t\t\t});\n\t\t\t\treturn pubsub.publish(key);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Call this when you updated one or more entities of this table\n\t\t\t */\n\t\t\tupdated(primaryKeyValue?: PrimaryKeyType | PrimaryKeyType[]) {\n\t\t\t\tconst primaryKeys = Array.isArray(primaryKeyValue)\n\t\t\t\t\t? primaryKeyValue\n\t\t\t\t\t: [primaryKeyValue];\n\t\t\t\tconst keys = primaryKeys.map((primaryKeyValue) =>\n\t\t\t\t\tmakePubSubKey({\n\t\t\t\t\t\ttableName: table.toString(),\n\t\t\t\t\t\taction: \"updated\",\n\t\t\t\t\t\tprimaryKeyValue,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tconst uniqueKeys = Array.from(new Set(keys));\n\t\t\t\tfor (const key of uniqueKeys) {\n\t\t\t\t\tpubsub.publish(key);\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t};\n\n\treturn {\n\t\tpubsub,\n\t\tmakePubSubInstance,\n\t};\n};\n","import { capitalizeFirstLetter } from \"./helpers/capitalize\";\nimport { assertFindFirstExists } from \"./helpers/helper\";\nimport {\n\ttype TableIdentifierTSName,\n\ttableHelper,\n} from \"./helpers/tableHelpers\";\nimport type { MakePubSubInstanceType } from \"./pubsub\";\nimport type { SchemaBuilderType } from \"./schemaBuilder\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\n} from \"./types/rumbleInput\";\nimport type { ArgImplementerType } from \"./whereArg\";\n\nexport const createQueryImplementer = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n\tSchemaBuilder extends SchemaBuilderType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n\tArgImplementer extends ArgImplementerType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n\tMakePubSubInstance extends MakePubSubInstanceType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n>({\n\tdb,\n\tschemaBuilder,\n\targImplementer,\n\tmakePubSubInstance,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n\tschemaBuilder: SchemaBuilder;\n\targImplementer: ArgImplementer;\n\tmakePubSubInstance: MakePubSubInstance;\n}) => {\n\treturn <ExplicitTableName extends TableIdentifierTSName<DB>>({\n\t\ttable,\n\t\treadAction = \"read\" as Action,\n\t\tlistAction = \"read\" as Action,\n\t}: {\n\t\t/**\n\t\t * The table for which to implement the query\n\t\t */\n\t\ttable: ExplicitTableName;\n\t\t/**\n\t\t * Which action should be used for reading single entities\n\t\t * @default \"read\"\n\t\t */\n\t\treadAction?: Action;\n\t\t/**\n\t\t * Which action should be used for listing many entities\n\t\t * @default \"read\"\n\t\t */\n\t\tlistAction?: Action;\n\t}) => {\n\t\tconst WhereArg = argImplementer({\n\t\t\ttable: table,\n\t\t});\n\n\t\tconst { registerOnInstance } = makePubSubInstance({ table: table });\n\n\t\treturn schemaBuilder.queryFields((t) => {\n\t\t\treturn {\n\t\t\t\t[`findMany${capitalizeFirstLetter(table.toString())}`]: t.drizzleField({\n\t\t\t\t\ttype: [table],\n\t\t\t\t\tnullable: false,\n\t\t\t\t\tsmartSubscription: true,\n\t\t\t\t\tsubscribe: (subscriptions, root, args, ctx, info) => {\n\t\t\t\t\t\tregisterOnInstance({\n\t\t\t\t\t\t\tinstance: subscriptions,\n\t\t\t\t\t\t\taction: \"created\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tregisterOnInstance({\n\t\t\t\t\t\t\tinstance: subscriptions,\n\t\t\t\t\t\t\taction: \"removed\",\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\targs: {\n\t\t\t\t\t\twhere: t.arg({ type: WhereArg, required: false }),\n\t\t\t\t\t\tlimit: t.arg.int({ required: false }),\n\t\t\t\t\t\toffset: t.arg.int({ required: false }),\n\t\t\t\t\t},\n\t\t\t\t\tresolve: (query, root, args, ctx, info) => {\n\t\t\t\t\t\t// transform null prototyped object\n\t\t\t\t\t\t// biome-ignore lint/style/noParameterAssign: Its really not a problem here\n\t\t\t\t\t\targs = JSON.parse(JSON.stringify(args));\n\t\t\t\t\t\tconst filter = ctx.abilities[table as any].filter(\n\t\t\t\t\t\t\tlistAction,\n\t\t\t\t\t\t\targs.where || args.limit || args.offset\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\tinject: {\n\t\t\t\t\t\t\t\t\t\t\twhere: args.where,\n\t\t\t\t\t\t\t\t\t\t\tlimit: args.limit,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t).query.many;\n\n\t\t\t\t\t\tif (args.offset) {\n\t\t\t\t\t\t\t(filter as any).offset = args.offset;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst queryInstance = query(filter as any);\n\n\t\t\t\t\t\tif (filter.columns) {\n\t\t\t\t\t\t\tqueryInstance.columns = filter.columns;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn db.query[table as any].findMany(queryInstance);\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\t[`findFirst${capitalizeFirstLetter(table.toString())}`]: t.drizzleField(\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: table,\n\t\t\t\t\t\tnullable: false,\n\t\t\t\t\t\tsmartSubscription: true,\n\t\t\t\t\t\targs: {\n\t\t\t\t\t\t\twhere: t.arg({ type: WhereArg, required: false }),\n\t\t\t\t\t\t},\n\t\t\t\t\t\tresolve: (query, root, args, ctx, info) => {\n\t\t\t\t\t\t\t// transform null prototyped object\n\t\t\t\t\t\t\t// biome-ignore lint/style/noParameterAssign: Its really not a problem here\n\t\t\t\t\t\t\targs = JSON.parse(JSON.stringify(args));\n\t\t\t\t\t\t\tconst filter = ctx.abilities[table as any].filter(\n\t\t\t\t\t\t\t\treadAction,\n\t\t\t\t\t\t\t\targs.where\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\tinject: { where: args.where },\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t).query.single;\n\n\t\t\t\t\t\t\tconst queryInstance = query(filter as any);\n\n\t\t\t\t\t\t\tif (filter.columns) {\n\t\t\t\t\t\t\t\tqueryInstance.columns = filter.columns;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn db.query[table as any]\n\t\t\t\t\t\t\t\t.findFirst(queryInstance)\n\t\t\t\t\t\t\t\t.then(assertFindFirstExists);\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t),\n\t\t\t};\n\t\t});\n\t};\n};\n","import SchemaBuilder from \"@pothos/core\";\nimport DrizzlePlugin from \"@pothos/plugin-drizzle\";\nimport SmartSubscriptionsPlugin, {\n\tsubscribeOptionsFromIterator,\n} from \"@pothos/plugin-smart-subscriptions\";\nimport {\n\tDateResolver,\n\tDateTimeISOResolver,\n\tJSONResolver,\n} from \"graphql-scalars\";\nimport type { createPubSub } from \"graphql-yoga\";\nimport type { ContextType } from \"./context\";\nimport ExplicitChecksPlugin from \"./explicitFiltersPlugin/explicitFiltersPlugin\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\n} from \"./types/rumbleInput\";\nimport {\n\ttype DateWhereInputArgument,\n\timplementDefaultWhereInputArgs,\n\ttype NumberWhereInputArgument,\n\ttype StringWhereInputArgument,\n} from \"./whereArg\";\n\nexport type SchemaBuilderType<\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n\ttypeof createSchemaBuilder<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>\n>[\"schemaBuilder\"];\n\nexport const createSchemaBuilder = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n>({\n\tdb,\n\tdisableDefaultObjects,\n\tpubsub,\n\tpothosConfig,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n\tpubsub: ReturnType<typeof createPubSub>;\n}) => {\n\tconst schemaBuilder = new SchemaBuilder<{\n\t\tContext: ContextType<UserContext, DB, RequestEvent, Action, PothosConfig>;\n\t\tDrizzleRelations: DB[\"_\"][\"relations\"];\n\t\tScalars: {\n\t\t\tJSON: {\n\t\t\t\tInput: unknown;\n\t\t\t\tOutput: unknown;\n\t\t\t};\n\t\t\tDate: {\n\t\t\t\tInput: Date;\n\t\t\t\tOutput: Date;\n\t\t\t};\n\t\t\tDateTime: {\n\t\t\t\tInput: Date;\n\t\t\t\tOutput: Date;\n\t\t\t};\n\t\t};\n\t\tInputs: {\n\t\t\tIntWhereInputArgument: NumberWhereInputArgument;\n\t\t\tFloatWhereInputArgument: NumberWhereInputArgument;\n\t\t\tStringWhereInputArgument: StringWhereInputArgument;\n\t\t\tDateWhereInputArgument: DateWhereInputArgument;\n\t\t};\n\t}>({\n\t\t...pothosConfig,\n\t\tplugins: [\n\t\t\tExplicitChecksPlugin,\n\t\t\tDrizzlePlugin,\n\t\t\tSmartSubscriptionsPlugin,\n\t\t\t...(pothosConfig?.plugins ?? []),\n\t\t],\n\t\tdrizzle: {\n\t\t\tclient: db,\n\t\t\trelations: db._.relations,\n\t\t\tgetTableConfig(table) {\n\t\t\t\t//TODO support composite primary keys\n\t\t\t\treturn {\n\t\t\t\t\tcolumns: Object.values((table as any)[Symbol.for(\"drizzle:Columns\")]),\n\t\t\t\t\tprimaryKeys: Object.values(\n\t\t\t\t\t\t(table as any)[Symbol.for(\"drizzle:Columns\")],\n\t\t\t\t\t).filter((v: any) => v.primary),\n\t\t\t\t} as any;\n\t\t\t},\n\t\t},\n\t\tsmartSubscriptions: {\n\t\t\t...subscribeOptionsFromIterator((name, context) => {\n\t\t\t\treturn pubsub.subscribe(name);\n\t\t\t}),\n\t\t},\n\t});\n\n\tschemaBuilder.addScalarType(\"JSON\", JSONResolver);\n\tschemaBuilder.addScalarType(\"Date\", DateResolver);\n\tschemaBuilder.addScalarType(\"DateTime\", DateTimeISOResolver);\n\timplementDefaultWhereInputArgs(schemaBuilder as any);\n\n\tif (!disableDefaultObjects?.query) {\n\t\tschemaBuilder.queryType({});\n\t}\n\n\tif (!disableDefaultObjects?.subscription) {\n\t\tschemaBuilder.subscriptionType({});\n\t}\n\n\tif (!disableDefaultObjects?.mutation) {\n\t\tschemaBuilder.mutationType({});\n\t}\n\n\treturn { schemaBuilder };\n};\n","import \"./pluginTypes\";\nimport SchemaBuilder, {\n\tBasePlugin,\n\ttype PothosEnumValueConfig,\n\ttype PothosInputFieldConfig,\n\ttype PothosInterfaceTypeConfig,\n\ttype PothosOutputFieldConfig,\n\ttype PothosTypeConfig,\n\ttype PothosUnionTypeConfig,\n\ttype SchemaTypes,\n} from \"@pothos/core\";\nimport type {\n\tGraphQLFieldResolver,\n\tGraphQLSchema,\n\tGraphQLTypeResolver,\n} from \"graphql\";\nimport { applyFilters } from \"../helpers/helper\";\nimport type { ApplyFiltersField } from \"./pluginTypes\";\n\nconst pluginName = \"ManualFiltersPlugin\";\n\nexport default pluginName;\n\nexport const applyFiltersKey = \"applyFilters\";\n\nexport class ManualFiltersPlugin<\n\tTypes extends SchemaTypes,\n> extends BasePlugin<Types> {\n\toverride wrapResolve(\n\t\tresolver: GraphQLFieldResolver<unknown, Types[\"Context\"], object>,\n\t\tfieldConfig: PothosOutputFieldConfig<Types>,\n\t): GraphQLFieldResolver<unknown, Types[\"Context\"], object> {\n\t\treturn async (parent, args, context, info) => {\n\t\t\t//TODO: https://github.com/hayes/pothos/discussions/1431#discussioncomment-12974130\n\t\t\tconst filters: ApplyFiltersField<Types[\"Context\"], any> = (\n\t\t\t\tfieldConfig?.type as any\n\t\t\t).type?.ref.currentConfig.pothosOptions[applyFiltersKey];\n\n\t\t\t// if no filter should be applied, just continue\n\t\t\tif (!filters || !Array.isArray(filters) || filters.length === 0) {\n\t\t\t\treturn resolver(parent, args, context, info);\n\t\t\t}\n\n\t\t\tconst resolved = await resolver(parent, args, context, info);\n\t\t\tconst allResolvedValues = Array.isArray(resolved) ? resolved : [resolved];\n\t\t\tconst allFilters = Array.isArray(filters) ? filters : [filters];\n\n\t\t\tconst allowed = await applyFilters({\n\t\t\t\tfilters: allFilters,\n\t\t\t\tentities: allResolvedValues,\n\t\t\t\tcontext,\n\t\t\t});\n\n\t\t\t// if the original value was an array, return an array\n\t\t\tif (Array.isArray(resolved)) {\n\t\t\t\treturn allowed;\n\t\t\t}\n\n\t\t\t// if the original value was a single value, return the first allowed\n\t\t\t// or null if not allowed\n\t\t\treturn allowed[0] ?? null;\n\t\t};\n\t}\n}\n\nSchemaBuilder.registerPlugin(pluginName, ManualFiltersPlugin);\n","import type { Table } from \"drizzle-orm\";\nimport { toCamelCase } from \"drizzle-orm/casing\";\nimport { type EnumImplementerType, isEnumSchema } from \"./enum\";\nimport { capitalizeFirstLetter } from \"./helpers/capitalize\";\nimport { mapSQLTypeToGraphQLType } from \"./helpers/sqlTypes/mapSQLTypeToTSType\";\nimport type { PossibleSQLType } from \"./helpers/sqlTypes/types\";\nimport {\n\ttype TableIdentifierTSName,\n\ttableHelper,\n} from \"./helpers/tableHelpers\";\nimport type { SchemaBuilderType } from \"./schemaBuilder\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport { RumbleError } from \"./types/rumbleError\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\n} from \"./types/rumbleInput\";\n\nexport type ArgImplementerType<\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n\ttypeof createArgImplementer<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\tSchemaBuilderType<UserContext, DB, RequestEvent, Action, PothosConfig>,\n\t\tEnumImplementerType<UserContext, DB, RequestEvent, Action, PothosConfig>\n\t>\n>;\n\nconst makeDefaultName = (dbName: string) =>\n\t`${capitalizeFirstLetter(toCamelCase(dbName.toString()))}WhereInputArgument`;\n\nexport const createArgImplementer = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n\tSchemaBuilder extends SchemaBuilderType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n\tEnumImplementer extends EnumImplementerType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n>({\n\tdb,\n\tschemaBuilder,\n\tenumImplementer,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n\tenumImplementer: EnumImplementer;\n\tschemaBuilder: SchemaBuilder;\n}) => {\n\tconst referenceStorage = new Map<string, any>();\n\n\tconst argImplementer = <\n\t\tExplicitTableName extends TableIdentifierTSName<DB>,\n\t\tRefName extends string,\n\t>({\n\t\ttable,\n\t\trefName,\n\t\tdbName,\n\t}: Partial<{\n\t\ttable: ExplicitTableName;\n\t\trefName: RefName | undefined;\n\t\tdbName: string;\n\t}> &\n\t\t(\n\t\t\t| {\n\t\t\t\t\ttable: ExplicitTableName;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tdbName: string;\n\t\t\t }\n\t\t)) => {\n\t\tconst tableSchema = tableHelper({\n\t\t\tdb,\n\t\t\tdbName,\n\t\t\ttsName: table!,\n\t\t});\n\n\t\tconst inputTypeName = refName ?? makeDefaultName(tableSchema.tsName);\n\n\t\tlet ret: ReturnType<typeof implement> | undefined =\n\t\t\treferenceStorage.get(inputTypeName);\n\t\tif (ret) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tconst implement = () => {\n\t\t\treturn schemaBuilder.inputType(inputTypeName, {\n\t\t\t\tfields: (t) => {\n\t\t\t\t\tconst mapSQLTypeStringToInputPothosType = (\n\t\t\t\t\t\tsqlType: PossibleSQLType,\n\t\t\t\t\t\tfieldName: string,\n\t\t\t\t\t) => {\n\t\t\t\t\t\tconst gqlType = mapSQLTypeToGraphQLType({\n\t\t\t\t\t\t\tsqlType,\n\t\t\t\t\t\t\tfieldName,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tswitch (gqlType) {\n\t\t\t\t\t\t\tcase \"Int\":\n\t\t\t\t\t\t\t\treturn t.field({ type: \"IntWhereInputArgument\" });\n\t\t\t\t\t\t\tcase \"String\":\n\t\t\t\t\t\t\t\treturn t.field({ type: \"StringWhereInputArgument\" });\n\t\t\t\t\t\t\tcase \"Boolean\":\n\t\t\t\t\t\t\t\treturn t.boolean({ required: false });\n\t\t\t\t\t\t\tcase \"Date\":\n\t\t\t\t\t\t\t\treturn t.field({\n\t\t\t\t\t\t\t\t\ttype: \"DateWhereInputArgument\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcase \"DateTime\":\n\t\t\t\t\t\t\t\treturn t.field({\n\t\t\t\t\t\t\t\t\ttype: \"DateWhereInputArgument\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcase \"Float\":\n\t\t\t\t\t\t\t\treturn t.field({\n\t\t\t\t\t\t\t\t\ttype: \"FloatWhereInputArgument\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcase \"ID\":\n\t\t\t\t\t\t\t\treturn t.id({ required: false });\n\t\t\t\t\t\t\tcase \"JSON\":\n\t\t\t\t\t\t\t\treturn t.field({\n\t\t\t\t\t\t\t\t\ttype: \"JSON\",\n\t\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tthrow new RumbleError(\n\t\t\t\t\t\t\t\t\t`Unsupported argument type ${gqlType} for column ${sqlType}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tconst fields = Object.entries(tableSchema.columns).reduce(\n\t\t\t\t\t\t(acc, [key, value]) => {\n\t\t\t\t\t\t\tif (isEnumSchema(value)) {\n\t\t\t\t\t\t\t\tconst enumImpl = enumImplementer({\n\t\t\t\t\t\t\t\t\tenumColumn: value,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tacc[key] = t.field({\n\t\t\t\t\t\t\t\t\ttype: enumImpl,\n\t\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tacc[key] = mapSQLTypeStringToInputPothosType(\n\t\t\t\t\t\t\t\t\tvalue.getSQLType() as PossibleSQLType,\n\t\t\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{} as Record<\n\t\t\t\t\t\t\tkeyof typeof tableSchema.columns,\n\t\t\t\t\t\t\tReturnType<typeof mapSQLTypeStringToInputPothosType>\n\t\t\t\t\t\t>,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst relations = Object.entries(tableSchema.relations ?? {}).reduce(\n\t\t\t\t\t\t(acc, [key, value]) => {\n\t\t\t\t\t\t\tconst relationSchema = tableHelper({\n\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\ttable: value.targetTable as Table,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst referenceModel = argImplementer({\n\t\t\t\t\t\t\t\tdbName: relationSchema.dbName,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tacc[key] = t.field({\n\t\t\t\t\t\t\t\ttype: referenceModel,\n\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{} as Record<\n\t\t\t\t\t\t\tkeyof typeof tableSchema.columns,\n\t\t\t\t\t\t\tReturnType<typeof mapSQLTypeStringToInputPothosType>\n\t\t\t\t\t\t>,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...fields,\n\t\t\t\t\t\t...relations,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t});\n\t\t};\n\n\t\tret = implement();\n\t\treferenceStorage.set(inputTypeName, ret);\n\t\treturn ret;\n\t};\n\n\treturn argImplementer;\n};\n\nexport type NumberWhereInputArgument = {\n\teq?: number;\n\tne?: number;\n\tgt?: number;\n\tgte?: number;\n\tlt?: number;\n\tlte?: number;\n\tin?: number[];\n\tnotIn?: number[];\n\tlike?: string;\n\tilike?: string;\n\tnotLike?: string;\n\tnotIlike?: string;\n\tisNull?: boolean;\n\tisNotNull?: boolean;\n\tarrayOverlaps?: number[];\n\tarrayContained?: number[];\n\tarrayContains?: number[];\n\tAND?: NumberWhereInputArgument[];\n\tOR?: NumberWhereInputArgument[];\n\tNOT?: NumberWhereInputArgument;\n};\n\nexport type StringWhereInputArgument = {\n\teq?: string;\n\tne?: string;\n\tgt?: string;\n\tgte?: string;\n\tlt?: string;\n\tlte?: string;\n\tin?: string[];\n\tnotIn?: string[];\n\tlike?: string;\n\tilike?: string;\n\tnotLike?: string;\n\tnotIlike?: string;\n\tisNull?: boolean;\n\tisNotNull?: boolean;\n\tarrayOverlaps?: string[];\n\tarrayContained?: string[];\n\tarrayContains?: string[];\n\tAND?: StringWhereInputArgument[];\n\tOR?: StringWhereInputArgument[];\n\tNOT?: StringWhereInputArgument;\n};\n\nexport type DateWhereInputArgument = {\n\teq?: Date;\n\tne?: Date;\n\tgt?: Date;\n\tgte?: Date;\n\tlt?: Date;\n\tlte?: Date;\n\tin?: Date[];\n\tnotIn?: Date[];\n\tlike?: string;\n\tilike?: string;\n\tnotLike?: string;\n\tnotIlike?: string;\n\tisNull?: boolean;\n\tisNotNull?: boolean;\n\tarrayOverlaps?: Date[];\n\tarrayContained?: Date[];\n\tarrayContains?: Date[];\n\tAND?: DateWhereInputArgument[];\n\tOR?: DateWhereInputArgument[];\n\tNOT?: DateWhereInputArgument;\n};\n\nexport function implementDefaultWhereInputArgs<\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n\tT extends SchemaBuilderType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n>(schemaBuilder: T) {\n\tconst IntWhereInputArgument = schemaBuilder\n\t\t.inputRef<NumberWhereInputArgument>(\"IntWhereInputArgument\")\n\t\t.implement({\n\t\t\tfields: (t) => ({\n\t\t\t\teq: t.int(),\n\t\t\t\tne: t.int(),\n\t\t\t\tgt: t.int(),\n\t\t\t\tgte: t.int(),\n\t\t\t\tlt: t.int(),\n\t\t\t\tlte: t.int(),\n\t\t\t\tin: t.intList(),\n\t\t\t\tnotIn: t.intList(),\n\t\t\t\tlike: t.string(),\n\t\t\t\tilike: t.string(),\n\t\t\t\tnotLike: t.string(),\n\t\t\t\tnotIlike: t.string(),\n\t\t\t\tisNull: t.boolean(),\n\t\t\t\tisNotNull: t.boolean(),\n\t\t\t\tarrayOverlaps: t.intList(),\n\t\t\t\tarrayContained: t.intList(),\n\t\t\t\tarrayContains: t.intList(),\n\t\t\t\tAND: t.field({\n\t\t\t\t\ttype: [IntWhereInputArgument],\n\t\t\t\t}),\n\t\t\t\tOR: t.field({\n\t\t\t\t\ttype: [IntWhereInputArgument],\n\t\t\t\t}),\n\t\t\t\tNOT: t.field({\n\t\t\t\t\ttype: IntWhereInputArgument,\n\t\t\t\t}),\n\t\t\t}),\n\t\t});\n\n\tconst FloatWhereInputArgument = schemaBuilder\n\t\t.inputRef<NumberWhereInputArgument>(\"FloatWhereInputArgument\")\n\t\t.implement({\n\t\t\tfields: (t) => ({\n\t\t\t\teq: t.float(),\n\t\t\t\tne: t.float(),\n\t\t\t\tgt: t.float(),\n\t\t\t\tgte: t.float(),\n\t\t\t\tlt: t.float(),\n\t\t\t\tlte: t.float(),\n\t\t\t\tin: t.floatList(),\n\t\t\t\tnotIn: t.floatList(),\n\t\t\t\tlike: t.string(),\n\t\t\t\tilike: t.string(),\n\t\t\t\tnotLike: t.string(),\n\t\t\t\tnotIlike: t.string(),\n\t\t\t\tisNull: t.boolean(),\n\t\t\t\tisNotNull: t.boolean(),\n\t\t\t\tarrayOverlaps: t.floatList(),\n\t\t\t\tarrayContained: t.floatList(),\n\t\t\t\tarrayContains: t.floatList(),\n\t\t\t\tAND: t.field({\n\t\t\t\t\ttype: [FloatWhereInputArgument],\n\t\t\t\t}),\n\t\t\t\tOR: t.field({\n\t\t\t\t\ttype: [FloatWhereInputArgument],\n\t\t\t\t}),\n\t\t\t\tNOT: t.field({\n\t\t\t\t\ttype: FloatWhereInputArgument,\n\t\t\t\t}),\n\t\t\t}),\n\t\t});\n\n\tconst StringWhereInputArgument = schemaBuilder\n\t\t.inputRef<StringWhereInputArgument>(\"StringWhereInputArgument\")\n\t\t.implement({\n\t\t\tfields: (t) => ({\n\t\t\t\teq: t.string(),\n\t\t\t\tne: t.string(),\n\t\t\t\tgt: t.string(),\n\t\t\t\tgte: t.string(),\n\t\t\t\tlt: t.string(),\n\t\t\t\tlte: t.string(),\n\t\t\t\tin: t.stringList(),\n\t\t\t\tnotIn: t.stringList(),\n\t\t\t\tlike: t.string(),\n\t\t\t\tilike: t.string(),\n\t\t\t\tnotLike: t.string(),\n\t\t\t\tnotIlike: t.string(),\n\t\t\t\tisNull: t.boolean(),\n\t\t\t\tisNotNull: t.boolean(),\n\t\t\t\tarrayOverlaps: t.stringList(),\n\t\t\t\tarrayContained: t.stringList(),\n\t\t\t\tarrayContains: t.stringList(),\n\t\t\t\tAND: t.field({\n\t\t\t\t\ttype: [StringWhereInputArgument],\n\t\t\t\t}),\n\t\t\t\tOR: t.field({\n\t\t\t\t\ttype: [StringWhereInputArgument],\n\t\t\t\t}),\n\t\t\t\tNOT: t.field({\n\t\t\t\t\ttype: StringWhereInputArgument,\n\t\t\t\t}),\n\t\t\t}),\n\t\t});\n\n\tconst DateWhereInputArgument = schemaBuilder\n\t\t.inputRef<DateWhereInputArgument>(\"DateWhereInputArgument\")\n\t\t.implement({\n\t\t\tfields: (t) => ({\n\t\t\t\teq: t.field({ type: \"Date\" }),\n\t\t\t\tne: t.field({ type: \"Date\" }),\n\t\t\t\tgt: t.field({ type: \"Date\" }),\n\t\t\t\tgte: t.field({ type: \"Date\" }),\n\t\t\t\tlt: t.field({ type: \"Date\" }),\n\t\t\t\tlte: t.field({ type: \"Date\" }),\n\t\t\t\tin: t.field({ type: [\"Date\"] }),\n\t\t\t\tnotIn: t.field({ type: [\"Date\"] }),\n\t\t\t\tlike: t.string(),\n\t\t\t\tilike: t.string(),\n\t\t\t\tnotLike: t.string(),\n\t\t\t\tnotIlike: t.string(),\n\t\t\t\tisNull: t.boolean(),\n\t\t\t\tisNotNull: t.boolean(),\n\t\t\t\tarrayOverlaps: t.field({ type: [\"Date\"] }),\n\t\t\t\tarrayContained: t.field({ type: [\"Date\"] }),\n\t\t\t\tarrayContains: t.field({ type: [\"Date\"] }),\n\t\t\t\tAND: t.field({\n\t\t\t\t\ttype: [DateWhereInputArgument],\n\t\t\t\t}),\n\t\t\t\tOR: t.field({\n\t\t\t\t\ttype: [DateWhereInputArgument],\n\t\t\t\t}),\n\t\t\t\tNOT: t.field({\n\t\t\t\t\ttype: DateWhereInputArgument,\n\t\t\t\t}),\n\t\t\t}),\n\t\t});\n}\n","import {\n\tcreateYoga as nativeCreateYoga,\n\ttype YogaServerOptions,\n} from \"graphql-yoga\";\nimport { useSofa } from \"sofa-api\";\nimport { createAbilityBuilder } from \"./abilityBuilder\";\nimport { createContextFunction } from \"./context\";\nimport { createEnumImplementer } 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 type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\n} from \"./types/rumbleInput\";\nimport { createArgImplementer } from \"./whereArg\";\n\nexport const rumble = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tPothosConfig extends CustomRumblePothosConfig,\n\tAction extends string = \"read\" | \"update\" | \"delete\",\n>(\n\trumbleInput: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig>,\n) => {\n\t// to be able to iterate over the actions, we populate the actions array in case the user does not\n\tif (!rumbleInput.actions) {\n\t\trumbleInput.actions = [\"read\", \"update\", \"delete\"] as Action[];\n\t}\n\n\tif (rumbleInput.defaultLimit === undefined) {\n\t\trumbleInput.defaultLimit = 100;\n\t}\n\n\tconst abilityBuilder = createAbilityBuilder<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>(rumbleInput);\n\n\tconst context = createContextFunction<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\ttypeof abilityBuilder\n\t>({\n\t\t...rumbleInput,\n\t\tabilityBuilder,\n\t});\n\n\tconst { makePubSubInstance, pubsub } = createPubSubInstance<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>({\n\t\t...rumbleInput,\n\t});\n\n\tconst { schemaBuilder } = createSchemaBuilder<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>({ ...rumbleInput, pubsub });\n\tconst enum_ = createEnumImplementer<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\ttypeof schemaBuilder\n\t>({\n\t\t...rumbleInput,\n\t\tschemaBuilder,\n\t});\n\tconst arg = createArgImplementer<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\ttypeof schemaBuilder,\n\t\ttypeof enum_\n\t>({\n\t\t...rumbleInput,\n\t\tschemaBuilder,\n\t\tenumImplementer: enum_,\n\t});\n\tconst object = createObjectImplementer<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\ttypeof schemaBuilder,\n\t\ttypeof arg,\n\t\ttypeof enum_,\n\t\ttypeof makePubSubInstance,\n\t\ttypeof abilityBuilder\n\t>({\n\t\t...rumbleInput,\n\t\tschemaBuilder,\n\t\tmakePubSubInstance,\n\t\targImplementer: arg,\n\t\tenumImplementer: enum_,\n\t\tabilityBuilder,\n\t});\n\tconst query = createQueryImplementer<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\ttypeof schemaBuilder,\n\t\ttypeof arg,\n\t\ttypeof makePubSubInstance\n\t>({\n\t\t...rumbleInput,\n\t\tschemaBuilder,\n\t\targImplementer: arg,\n\t\tmakePubSubInstance,\n\t});\n\n\tconst builtSchema = lazy(() => schemaBuilder.toSchema());\n\n\tconst createYoga = (\n\t\targs?:\n\t\t\t| Omit<YogaServerOptions<RequestEvent, any>, \"schema\" | \"context\">\n\t\t\t| undefined,\n\t) =>\n\t\tnativeCreateYoga<RequestEvent>({\n\t\t\t...args,\n\t\t\tschema: builtSchema(),\n\t\t\tcontext,\n\t\t});\n\n\tconst createSofa = (\n\t\targs: Omit<Parameters<typeof useSofa>[0], \"schema\" | \"context\">,\n\t) => {\n\t\tif (args.openAPI) {\n\t\t\targs.openAPI = {\n\t\t\t\t...sofaOpenAPIWebhookDocs,\n\t\t\t\t...args.openAPI,\n\t\t\t};\n\t\t}\n\t\treturn useSofa({\n\t\t\t...args,\n\t\t\tschema: builtSchema(),\n\t\t\tcontext,\n\t\t});\n\t};\n\n\treturn {\n\t\t/**\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\t\tabilityBuilder,\n\t\t/**\n\t\t * The pothos schema builder. See https://pothos-graphql.dev/docs/plugins/drizzle\n\t\t */\n\t\tschemaBuilder,\n\t\t/**\n * Creates the native yoga instance. Can be used to run an actual HTTP server.\n * \n * @example\n * \n * ```ts\n\t * \n import { createServer } from \"node:http\";\n\t\t* const server = createServer(createYoga());\n\t\tserver.listen(3000, () => {\n console.info(\"Visit http://localhost:3000/graphql\");\n\t\t\t});\n\t\t\t* ```\n\t * https://the-guild.dev/graphql/yoga-server/docs#server\n */\n\t\tcreateYoga,\n\t\t/**\n\t\t * Creates a sofa instance to offer a REST API.\n\t\t```ts\n\t\timport express from 'express';\n\t\t\n\t\tconst app = express();\n\t\tconst sofa = createSofa(...);\n\t\t\n\t\tapp.use('/api', useSofa({ schema }));\n\t\t```\n\t\t* https://the-guild.dev/graphql/sofa-api/docs#usage\n\t\t */\n\t\tcreateSofa,\n\t\t/**\n\t\t * A function for creating default objects for your schema\n\t\t */\n\t\tobject,\n\t\t/**\n\t\t * A function for creating where args to filter entities\n\t\t */\n\t\targ,\n\t\t/**\n\t\t * A function for creating default READ queries.\n\t\t * Make sure the objects for the table you are creating the queries for are implemented\n\t\t */\n\t\tquery,\n\t\t/**\n\t\t * A function for creating a pubsub instance for a table. Use this to publish or subscribe events\n\t\t */\n\t\tpubsub: makePubSubInstance,\n\t\t/**\n\t\t * A function to implement enums for graphql usage.\n\t\t * The other helpers use this helper internally so in most cases you do not have to\n\t\t * call this helper directly, unless you need the reference to an enum type\n\t\t */\n\t\tenum_,\n\t};\n};\n"]}
1
+ {"version":3,"sources":["../node_modules/graphql/jsutils/isObjectLike.mjs","../node_modules/graphql/jsutils/invariant.mjs","../node_modules/graphql/language/location.mjs","../node_modules/graphql/language/printLocation.mjs","../node_modules/graphql/error/GraphQLError.mjs","../lib/types/rumbleError.ts","../lib/helpers/helper.ts","../lib/helpers/lazy.ts","../lib/helpers/sqlTypes/types.ts","../lib/helpers/sqlTypes/distinctValuesFromSQLType.ts","../lib/helpers/tableHelpers.ts","../lib/abilityBuilder.ts","../lib/context.ts","../lib/helpers/capitalize.ts","../lib/enum.ts","../lib/helpers/sofaOpenAPIWebhookDocs.ts","../lib/helpers/sqlTypes/mapSQLTypeToTSType.ts","../lib/object.ts","../lib/orderArg.ts","../lib/pubsub.ts","../lib/query.ts","../lib/explicitFiltersPlugin/explicitFiltersPlugin.ts","../lib/whereArg.ts","../lib/schemaBuilder.ts","../lib/rumble.ts"],"names":["isObjectLike","value","invariant","condition","message","LineRegExp","getLocation","source","position","lastLineStart","line","match","printLocation","location","printSourceLocation","sourceLocation","firstLineColumnOffset","body","lineIndex","lineOffset","lineNum","columnOffset","columnNum","locationStr","lines","locationLine","subLineIndex","subLineColumnNum","subLines","i","printPrefixedLines","subLine","existingLines","_","padLen","prefix","toNormalizedOptions","args","firstArg","GraphQLError","_GraphQLError","rawArgs","_this$nodes","_nodeLocations$","_ref","nodes","positions","path","originalError","extensions","undefinedIfEmpty","nodeLocations","node","loc","pos","originalExtensions","output","formattedError","array","RumbleError","RumbleErrorSafe","assertFindFirstExists","assertFirstEntryExists","v","applyFilters","filters","entities","context","f","acc","val","lazy","initializer","initialized","UnknownTypeRumbleError","sqlType","additionalInfo","createDistinctValuesFromSQLType","nameSymbol","columnsSymbol","tableHelper","dbName","tsName","table","db","tableSchema","schema","k","key","isSimpleQueryFilter","filter","isFunctionFilter","createAbilityBuilder","actions","defaultLimit","registrators","registeredQueryFilters","registeredFilters","createRegistrator","tableName","action","queryFiltersPerEntity","queryFiltersPerEntityAndAction","queryFilter","explicitFilter","entityKey","userContext","builder","createEntityObject","options","transformToResponse","queryFilters","where","transformedWhere","w","relationsFilterToSQL","limit","columns","r","getBlockEverythingFilter","primaryKeyField","distinctValues","simpleQueryFilters","functionQueryFilters","someWildcardFound","c","allQueryFilters","e","highestLimit","conditionObject","combinedAllowedColumns","accumulatedWhereConditions","o","combinedWhere","createContextFunction","makeUserContext","abilityBuilder","req","capitalizeFirstLetter","isEnumSchema","schemaType","PgEnumColumn","createEnumImplementer","schemaBuilder","referenceStorage","enumColumn","refName","enumSchemaName","enumValues","schemaEnum","enumCol","s","schemaEnumEntry","graphqlImplementationName","toCamelCase","ret","sofaOpenAPIWebhookDocs","mapSQLTypeToGraphQLType","fieldName","isProbablyAConfigObject","createObjectImplementer","makePubSubInstance","whereArgImplementer","orderArgImplementer","enumImplementer","readAction","adjust","primaryKey","registerOnInstance","subscriptions","element","primaryKeyValue","t","mapSQLTypeStringToExposedPothosType","columnName","nullable","gqlType","configMap","userAdjustments","target","prop","params","ref","configObject","fields","creatorFunction","enumImpl","relations","relationSchema","WhereArg","OrderArg","relationTablePubSub","isMany","filterSpecifier","One","subscribe","ctx","makeDefaultName","createOrderArgImplementer","sortingParameterEnumRef","inputTypeName","referenceModel","SUBSCRIPTION_NOTIFIER_RUMBLE_PREFIX","SUBSCRIPTION_NOTIFIER_REMOVED","SUBSCRIPTION_NOTIFIER_UPDATED","SUBSCRIPTION_NOTIFIER_CREATED","createPubSubInstance","pubsub","createPubSub","makePubSubKey","actionKey","instance","keys","uniqueKeys","createQueryImplementer","listAction","plural","root","info","query","queryInstance","singular","pluginName","explicitFiltersPlugin_default","applyFiltersKey","ManualFiltersPlugin","BasePlugin","resolver","fieldConfig","parent","resolved","allResolvedValues","allFilters","allowed","SchemaBuilder","createWhereArgImplementer","mapSQLTypeStringToInputPothosType","implementDefaultWhereInputArgs","IntWhereInputArgument","FloatWhereInputArgument","StringWhereInputArgument","DateWhereInputArgument","createSchemaBuilder","disableDefaultObjects","pothosConfig","DrizzlePlugin","SmartSubscriptionsPlugin","subscribeOptionsFromIterator","name","JSONResolver","DateResolver","DateTimeISOResolver","rumble","rumbleInput","enum_","whereArg","orderArg","object","builtSchema","nativeCreateYoga","useSofa"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Return true if `value` is object-like. A value is object-like if it's not\n * `null` and has a `typeof` result of \"object\".\n */\nexport function isObjectLike(value) {\n return typeof value == 'object' && value !== null;\n}\n","export function invariant(condition, message) {\n const booleanCondition = Boolean(condition);\n\n if (!booleanCondition) {\n throw new Error(\n message != null ? message : 'Unexpected invariant triggered.',\n );\n }\n}\n","import { invariant } from '../jsutils/invariant.mjs';\nconst LineRegExp = /\\r\\n|[\\n\\r]/g;\n/**\n * Represents a location in a Source.\n */\n\n/**\n * Takes a Source and a UTF-8 character offset, and returns the corresponding\n * line and column as a SourceLocation.\n */\nexport function getLocation(source, position) {\n let lastLineStart = 0;\n let line = 1;\n\n for (const match of source.body.matchAll(LineRegExp)) {\n typeof match.index === 'number' || invariant(false);\n\n if (match.index >= position) {\n break;\n }\n\n lastLineStart = match.index + match[0].length;\n line += 1;\n }\n\n return {\n line,\n column: position + 1 - lastLineStart,\n };\n}\n","import { getLocation } from './location.mjs';\n\n/**\n * Render a helpful description of the location in the GraphQL Source document.\n */\nexport function printLocation(location) {\n return printSourceLocation(\n location.source,\n getLocation(location.source, location.start),\n );\n}\n/**\n * Render a helpful description of the location in the GraphQL Source document.\n */\n\nexport function printSourceLocation(source, sourceLocation) {\n const firstLineColumnOffset = source.locationOffset.column - 1;\n const body = ''.padStart(firstLineColumnOffset) + source.body;\n const lineIndex = sourceLocation.line - 1;\n const lineOffset = source.locationOffset.line - 1;\n const lineNum = sourceLocation.line + lineOffset;\n const columnOffset = sourceLocation.line === 1 ? firstLineColumnOffset : 0;\n const columnNum = sourceLocation.column + columnOffset;\n const locationStr = `${source.name}:${lineNum}:${columnNum}\\n`;\n const lines = body.split(/\\r\\n|[\\n\\r]/g);\n const locationLine = lines[lineIndex]; // Special case for minified documents\n\n if (locationLine.length > 120) {\n const subLineIndex = Math.floor(columnNum / 80);\n const subLineColumnNum = columnNum % 80;\n const subLines = [];\n\n for (let i = 0; i < locationLine.length; i += 80) {\n subLines.push(locationLine.slice(i, i + 80));\n }\n\n return (\n locationStr +\n printPrefixedLines([\n [`${lineNum} |`, subLines[0]],\n ...subLines.slice(1, subLineIndex + 1).map((subLine) => ['|', subLine]),\n ['|', '^'.padStart(subLineColumnNum)],\n ['|', subLines[subLineIndex + 1]],\n ])\n );\n }\n\n return (\n locationStr +\n printPrefixedLines([\n // Lines specified like this: [\"prefix\", \"string\"],\n [`${lineNum - 1} |`, lines[lineIndex - 1]],\n [`${lineNum} |`, locationLine],\n ['|', '^'.padStart(columnNum)],\n [`${lineNum + 1} |`, lines[lineIndex + 1]],\n ])\n );\n}\n\nfunction printPrefixedLines(lines) {\n const existingLines = lines.filter(([_, line]) => line !== undefined);\n const padLen = Math.max(...existingLines.map(([prefix]) => prefix.length));\n return existingLines\n .map(([prefix, line]) => prefix.padStart(padLen) + (line ? ' ' + line : ''))\n .join('\\n');\n}\n","import { isObjectLike } from '../jsutils/isObjectLike.mjs';\nimport { getLocation } from '../language/location.mjs';\nimport {\n printLocation,\n printSourceLocation,\n} from '../language/printLocation.mjs';\n\nfunction toNormalizedOptions(args) {\n const firstArg = args[0];\n\n if (firstArg == null || 'kind' in firstArg || 'length' in firstArg) {\n return {\n nodes: firstArg,\n source: args[1],\n positions: args[2],\n path: args[3],\n originalError: args[4],\n extensions: args[5],\n };\n }\n\n return firstArg;\n}\n/**\n * A GraphQLError describes an Error found during the parse, validate, or\n * execute phases of performing a GraphQL operation. In addition to a message\n * and stack trace, it also includes information about the locations in a\n * GraphQL document and/or execution result that correspond to the Error.\n */\n\nexport class GraphQLError extends Error {\n /**\n * An array of `{ line, column }` locations within the source GraphQL document\n * which correspond to this error.\n *\n * Errors during validation often contain multiple locations, for example to\n * point out two things with the same name. Errors during execution include a\n * single location, the field which produced the error.\n *\n * Enumerable, and appears in the result of JSON.stringify().\n */\n\n /**\n * An array describing the JSON-path into the execution response which\n * corresponds to this error. Only included for errors during execution.\n *\n * Enumerable, and appears in the result of JSON.stringify().\n */\n\n /**\n * An array of GraphQL AST Nodes corresponding to this error.\n */\n\n /**\n * The source GraphQL document for the first location of this error.\n *\n * Note that if this Error represents more than one node, the source may not\n * represent nodes after the first node.\n */\n\n /**\n * An array of character offsets within the source GraphQL document\n * which correspond to this error.\n */\n\n /**\n * The original error thrown from a field resolver during execution.\n */\n\n /**\n * Extension fields to add to the formatted error.\n */\n\n /**\n * @deprecated Please use the `GraphQLErrorOptions` constructor overload instead.\n */\n constructor(message, ...rawArgs) {\n var _this$nodes, _nodeLocations$, _ref;\n\n const { nodes, source, positions, path, originalError, extensions } =\n toNormalizedOptions(rawArgs);\n super(message);\n this.name = 'GraphQLError';\n this.path = path !== null && path !== void 0 ? path : undefined;\n this.originalError =\n originalError !== null && originalError !== void 0\n ? originalError\n : undefined; // Compute list of blame nodes.\n\n this.nodes = undefinedIfEmpty(\n Array.isArray(nodes) ? nodes : nodes ? [nodes] : undefined,\n );\n const nodeLocations = undefinedIfEmpty(\n (_this$nodes = this.nodes) === null || _this$nodes === void 0\n ? void 0\n : _this$nodes.map((node) => node.loc).filter((loc) => loc != null),\n ); // Compute locations in the source for the given nodes/positions.\n\n this.source =\n source !== null && source !== void 0\n ? source\n : nodeLocations === null || nodeLocations === void 0\n ? void 0\n : (_nodeLocations$ = nodeLocations[0]) === null ||\n _nodeLocations$ === void 0\n ? void 0\n : _nodeLocations$.source;\n this.positions =\n positions !== null && positions !== void 0\n ? positions\n : nodeLocations === null || nodeLocations === void 0\n ? void 0\n : nodeLocations.map((loc) => loc.start);\n this.locations =\n positions && source\n ? positions.map((pos) => getLocation(source, pos))\n : nodeLocations === null || nodeLocations === void 0\n ? void 0\n : nodeLocations.map((loc) => getLocation(loc.source, loc.start));\n const originalExtensions = isObjectLike(\n originalError === null || originalError === void 0\n ? void 0\n : originalError.extensions,\n )\n ? originalError === null || originalError === void 0\n ? void 0\n : originalError.extensions\n : undefined;\n this.extensions =\n (_ref =\n extensions !== null && extensions !== void 0\n ? extensions\n : originalExtensions) !== null && _ref !== void 0\n ? _ref\n : Object.create(null); // Only properties prescribed by the spec should be enumerable.\n // Keep the rest as non-enumerable.\n\n Object.defineProperties(this, {\n message: {\n writable: true,\n enumerable: true,\n },\n name: {\n enumerable: false,\n },\n nodes: {\n enumerable: false,\n },\n source: {\n enumerable: false,\n },\n positions: {\n enumerable: false,\n },\n originalError: {\n enumerable: false,\n },\n }); // Include (non-enumerable) stack trace.\n\n /* c8 ignore start */\n // FIXME: https://github.com/graphql/graphql-js/issues/2317\n\n if (\n originalError !== null &&\n originalError !== void 0 &&\n originalError.stack\n ) {\n Object.defineProperty(this, 'stack', {\n value: originalError.stack,\n writable: true,\n configurable: true,\n });\n } else if (Error.captureStackTrace) {\n Error.captureStackTrace(this, GraphQLError);\n } else {\n Object.defineProperty(this, 'stack', {\n value: Error().stack,\n writable: true,\n configurable: true,\n });\n }\n /* c8 ignore stop */\n }\n\n get [Symbol.toStringTag]() {\n return 'GraphQLError';\n }\n\n toString() {\n let output = this.message;\n\n if (this.nodes) {\n for (const node of this.nodes) {\n if (node.loc) {\n output += '\\n\\n' + printLocation(node.loc);\n }\n }\n } else if (this.source && this.locations) {\n for (const location of this.locations) {\n output += '\\n\\n' + printSourceLocation(this.source, location);\n }\n }\n\n return output;\n }\n\n toJSON() {\n const formattedError = {\n message: this.message,\n };\n\n if (this.locations != null) {\n formattedError.locations = this.locations;\n }\n\n if (this.path != null) {\n formattedError.path = this.path;\n }\n\n if (this.extensions != null && Object.keys(this.extensions).length > 0) {\n formattedError.extensions = this.extensions;\n }\n\n return formattedError;\n }\n}\n\nfunction undefinedIfEmpty(array) {\n return array === undefined || array.length === 0 ? undefined : array;\n}\n/**\n * See: https://spec.graphql.org/draft/#sec-Errors\n */\n\n/**\n * Prints a GraphQLError to a string, representing useful location information\n * about the error's position in the source.\n *\n * @deprecated Please use `error.toString` instead. Will be removed in v17\n */\nexport function printError(error) {\n return error.toString();\n}\n/**\n * Given a GraphQLError, format it according to the rules described by the\n * Response Format, Errors section of the GraphQL Specification.\n *\n * @deprecated Please use `error.toJSON` instead. Will be removed in v17\n */\n\nexport function formatError(error) {\n return error.toJSON();\n}\n","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\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"RumbleError\";\n\t}\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 type { Filter } from \"../explicitFiltersPlugin/pluginTypes\";\nimport { 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\tif (!value)\n\t\tthrow new RumbleErrorSafe(\"Value not found but required (findFirst)\");\n\treturn 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\tconst v = value.at(0);\n\tif (!v)\n\t\tthrow new RumbleErrorSafe(\"Value not found but required (firstEntry)\");\n\treturn v;\n};\n\n/**\n * A helper to apply a list of filters to a given list of entities.\n * \n * @example\n * \n * ```ts\n * const filtered = await applyFilters({\n filters: abilityBuilder.registeredFilters.posts.update,\n entities: entitiesToFilter,\n context: ctx,\n });\n * ```\n */\nexport const applyFilters = async <Context, T, H extends T>({\n\tfilters,\n\tentities,\n\tcontext,\n}: {\n\tentities: T[];\n\tfilters: Filter<Context, H>[];\n\tcontext: Context;\n}) => {\n\treturn (\n\t\tawait Promise.all(\n\t\t\tfilters.map((f) =>\n\t\t\t\tf({\n\t\t\t\t\tcontext,\n\t\t\t\t\tentities: entities as H[],\n\t\t\t\t}),\n\t\t\t),\n\t\t)\n\t).reduce((acc, val) => {\n\t\tacc.push(...val);\n\t\treturn acc;\n\t}, []) as T[];\n};\n","/**\n * Creates a lazily initialized function.\n *\n * The returned function will call the initializer function on its first call and\n * store the result. On subsequent calls, it will return the stored result.\n *\n * @param initializer The function to be called for initialization.\n * @returns A function that calls the initializer function on its first call and\n * returns the stored result on subsequent calls.\n */\nexport function lazy<T>(initializer: () => T): () => T {\n\tlet value: T | undefined;\n\tlet initialized = false;\n\n\treturn () => {\n\t\tif (!initialized) {\n\t\t\tvalue = initializer();\n\t\t\tinitialized = true;\n\t\t}\n\t\treturn value!;\n\t};\n}\n","import { RumbleError } from \"../../types/rumbleError\";\n\nexport const possibleSQLTypesStrings = [\n\t\"serial\",\n\t\"int\",\n\t\"integer\",\n\t\"tinyint\",\n\t\"smallint\",\n\t\"mediumint\",\n\t\"real\",\n\t\"decimal\",\n\t\"double\",\n\t\"float\",\n\t\"string\",\n\t\"text\",\n\t\"varchar\",\n\t\"char\",\n\t\"text(256)\",\n\t\"uuid\",\n\t\"boolean\",\n\t\"date\",\n\t\"datetime\",\n\t\"timestamp\",\n\t\"json\",\n] as const;\n\nexport type PossibleSQLType = (typeof possibleSQLTypesStrings)[number];\n\nexport const UnknownTypeRumbleError = (\n\tsqlType: string,\n\tadditionalInfo?: string,\n) =>\n\tnew RumbleError(\n\t\t`RumbleError: Unknown SQL type '${sqlType}'. Please open an issue (https://github.com/m1212e/rumble/issues) so it can be added. (${additionalInfo})`,\n\t);\n","import { type PossibleSQLType, UnknownTypeRumbleError } from \"./types\";\n\nexport function createDistinctValuesFromSQLType(sqlType: PossibleSQLType): {\n\tvalue1: any;\n\tvalue2: any;\n} {\n\tif (\n\t\t[\"serial\", \"int\", \"integer\", \"tinyint\", \"smallint\", \"mediumint\"].includes(\n\t\t\tsqlType,\n\t\t)\n\t) {\n\t\treturn {\n\t\t\tvalue1: 1,\n\t\t\tvalue2: 2,\n\t\t};\n\t}\n\n\tif ([\"real\", \"decimal\", \"double\", \"float\"].includes(sqlType)) {\n\t\treturn {\n\t\t\tvalue1: 1.1,\n\t\t\tvalue2: 2.2,\n\t\t};\n\t}\n\n\tif ([\"string\", \"text\", \"varchar\", \"char\", \"text(256)\"].includes(sqlType)) {\n\t\treturn {\n\t\t\tvalue1: \"a\",\n\t\t\tvalue2: \"b\",\n\t\t};\n\t}\n\n\tif ([\"uuid\"].includes(sqlType)) {\n\t\treturn {\n\t\t\tvalue1: \"fba31870-5528-42d7-b27e-2e5ee657aea5\",\n\t\t\tvalue2: \"fc65db81-c2d1-483d-8a25-a30e2cf6e02d\",\n\t\t};\n\t}\n\n\tif ([\"boolean\"].includes(sqlType)) {\n\t\treturn {\n\t\t\tvalue1: true,\n\t\t\tvalue2: false,\n\t\t};\n\t}\n\n\tif ([\"timestamp\", \"datetime\"].includes(sqlType)) {\n\t\treturn {\n\t\t\tvalue1: new Date(2022, 1, 1),\n\t\t\tvalue2: new Date(2022, 1, 2),\n\t\t};\n\t}\n\n\tif ([\"date\"].includes(sqlType)) {\n\t\treturn {\n\t\t\tvalue1: new Date(2022, 1, 1),\n\t\t\tvalue2: new Date(2022, 1, 2),\n\t\t};\n\t}\n\n\tif ([\"json\"].includes(sqlType)) {\n\t\treturn {\n\t\t\tvalue1: { a: 1 },\n\t\t\tvalue2: { b: 2 },\n\t\t};\n\t}\n\n\tthrow UnknownTypeRumbleError(sqlType, \"Distinct\");\n}\n","import type { Column, Many, One, Table } from \"drizzle-orm\";\nimport type { NonEnumFields } from \"../enum\";\nimport type { GenericDrizzleDbTypeConstraints } from \"../types/genericDrizzleDbType\";\nimport { RumbleError } from \"../types/rumbleError\";\n\nexport type TableIdentifierTSName<DB extends GenericDrizzleDbTypeConstraints> =\n\tkeyof NonEnumFields<NonNullable<DB[\"_\"][\"relations\"][\"schema\"]>>;\n\nconst nameSymbol = Symbol.for(\"drizzle:Name\");\nconst columnsSymbol = Symbol.for(\"drizzle:Columns\");\n\nexport function tableHelper<\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tTSVariable extends TableIdentifierTSName<DB>,\n\tDBVariable extends string,\n\tT extends Table,\n>({\n\tdbName,\n\ttsName,\n\ttable,\n\tdb,\n}: Partial<{\n\ttsName: TSVariable;\n\tdbName: DBVariable;\n\ttable: T;\n}> &\n\t(\n\t\t| {\n\t\t\t\tdbName: DBVariable;\n\t\t }\n\t\t| {\n\t\t\t\ttsName: TSVariable;\n\t\t }\n\t\t| {\n\t\t\t\ttable: T;\n\t\t }\n\t) & { db: DB }) {\n\tlet tableSchema: Table | undefined = table;\n\n\tif (tsName) {\n\t\ttableSchema = db._.relations.schema[tsName as string];\n\t}\n\n\tif (dbName) {\n\t\ttableSchema = Object.values(db._.relations.schema).find(\n\t\t\t(schema: any) => schema[nameSymbol] === dbName,\n\t\t);\n\t}\n\n\tif (!tableSchema) {\n\t\tthrow new RumbleError(\n\t\t\t`Could not find schema for ${JSON.stringify({ tsName, dbName, table: (table as any)?.[nameSymbol] }).toString()}`,\n\t\t);\n\t}\n\n\treturn {\n\t\ttableSchema,\n\t\tcolumns: (tableSchema as any)[columnsSymbol] as Record<string, Column>,\n\t\tget primaryColumns() {\n\t\t\treturn Object.entries((tableSchema as any)[columnsSymbol])\n\t\t\t\t.filter(([k, v]) => (v as Column).primary)\n\t\t\t\t.reduce((acc, [k, v]) => {\n\t\t\t\t\t(acc as any)[k] = v;\n\t\t\t\t\treturn acc;\n\t\t\t\t}, {}) as Record<string, Column>;\n\t\t},\n\t\trelations: db._.relations.config[tsName as string] as\n\t\t\t| {\n\t\t\t\t\t[key: string]: One<any, any> | Many<any, any>;\n\t\t\t }\n\t\t\t| undefined,\n\t\tdbName: (tableSchema as any)[nameSymbol] as string,\n\t\tget tsName() {\n\t\t\treturn Object.entries(db._.relations.schema)\n\t\t\t\t.find(([key, v]) => v === tableSchema)!\n\t\t\t\t.at(0) as string;\n\t\t},\n\t};\n}\n","import { relationsFilterToSQL } from \"drizzle-orm\";\nimport type { Filter } from \"./explicitFiltersPlugin/pluginTypes\";\nimport { lazy } from \"./helpers/lazy\";\nimport { createDistinctValuesFromSQLType } from \"./helpers/sqlTypes/distinctValuesFromSQLType\";\nimport { tableHelper } from \"./helpers/tableHelpers\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport { RumbleError } from \"./types/rumbleError\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\n} from \"./types/rumbleInput\";\n\nexport type AbilityBuilderType<\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n\ttypeof createAbilityBuilder<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>\n>;\n\ntype TableName<DB extends GenericDrizzleDbTypeConstraints> = keyof DB[\"query\"];\n\ntype QueryFilterInput<\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tTableKey extends TableName<DB>,\n> = Parameters<DB[\"query\"][TableKey][\"findMany\"]>[0];\n\ntype SimpleQueryFilter<\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tTableKey extends keyof DB[\"query\"],\n\tFilter extends QueryFilterInput<DB, TableKey>,\n> = Filter;\n\ntype FunctionQueryFilter<\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tTableKey extends keyof DB[\"query\"],\n\tFilter extends QueryFilterInput<DB, TableKey>,\n\tContext,\n> = (context: Context) => Filter | undefined | \"allow\";\n\nfunction isSimpleQueryFilter<\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tTableKey extends keyof DB[\"query\"],\n\tFilter extends QueryFilterInput<DB, TableKey>,\n\tContext,\n>(\n\tfilter: QueryFilter<DB, TableKey, Filter, Context>,\n): filter is SimpleQueryFilter<DB, TableKey, Filter> {\n\treturn typeof filter !== \"function\";\n}\n\ntype QueryFilter<\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tTableName extends keyof DB[\"query\"],\n\tFilter extends QueryFilterInput<DB, TableName>,\n\tContext,\n> =\n\t| SimpleQueryFilter<DB, TableName, Filter>\n\t| FunctionQueryFilter<DB, TableName, Filter, Context>;\n\nfunction isFunctionFilter<\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tTableKey extends keyof DB[\"query\"],\n\tFilter extends QueryFilterInput<DB, TableKey>,\n\tContext,\n>(\n\tfilter: QueryFilter<DB, TableKey, Filter, Context>,\n): filter is FunctionQueryFilter<DB, TableKey, Filter, Context> {\n\treturn (\n\t\ttypeof filter === \"function\" && filter.constructor.name !== \"AsyncFunction\"\n\t);\n}\n\nexport const createAbilityBuilder = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n>({\n\tdb,\n\tactions,\n\tdefaultLimit,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig>) => {\n\tconst registrators: {\n\t\t[key in TableName<DB>]: ReturnType<typeof createRegistrator<key>>;\n\t} = {} as any;\n\n\tconst registeredQueryFilters: {\n\t\t[key in TableName<DB>]: {\n\t\t\t[key in Action]: QueryFilter<DB, key, any, UserContext>[] | \"unspecified\";\n\t\t};\n\t} = {} as any;\n\n\tconst registeredFilters: {\n\t\t[key in TableName<DB>]: {\n\t\t\t//TODO add a run all helper\n\t\t\t[key in Action]: Filter<UserContext, any>[];\n\t\t};\n\t} = {} as any;\n\n\tconst createRegistrator = <TableNameT extends TableName<DB>>(\n\t\ttableName: TableNameT,\n\t) => {\n\t\t// we want to init all possible application level filters since we want to ensure\n\t\t// that the implementaiton helpers pass an object by reference when creating\n\t\t// the implementation, instead of a copy like it would be the case with undefined\n\t\tfor (const action of actions!) {\n\t\t\tif (!registeredFilters[tableName]) {\n\t\t\t\tregisteredFilters[tableName] = {} as any;\n\t\t\t}\n\t\t\tif (!registeredFilters[tableName][action]) {\n\t\t\t\tregisteredFilters[tableName][action] = [];\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\t/**\n\t\t\t * Allows to perform a specific action on a specific entity\n\t\t\t */\n\t\t\tallow: (action: Action | Action[]) => {\n\t\t\t\tlet queryFiltersPerEntity = registeredQueryFilters[tableName];\n\t\t\t\tif (!queryFiltersPerEntity) {\n\t\t\t\t\tqueryFiltersPerEntity = {} as any;\n\t\t\t\t\tregisteredQueryFilters[tableName] = queryFiltersPerEntity;\n\t\t\t\t}\n\n\t\t\t\tconst actions = Array.isArray(action) ? action : [action];\n\t\t\t\tfor (const action of actions) {\n\t\t\t\t\tlet queryFiltersPerEntityAndAction = queryFiltersPerEntity[action];\n\t\t\t\t\tif (!queryFiltersPerEntityAndAction) {\n\t\t\t\t\t\tqueryFiltersPerEntityAndAction = \"unspecified\";\n\t\t\t\t\t\tqueryFiltersPerEntity[action] = queryFiltersPerEntityAndAction;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\t/**\n\t\t\t\t\t * Restricts the allowed actions to a filter\n\t\t\t\t\t * @example\n\t\t\t\t\t * ```ts\n\t\t\t\t\t * abilityBuilder.users.allow([\"read\", \"update\", \"delete\"]).when(({ userId }) => ({\n\t\t\t\t\t * where: {\n\t\t\t\t\t * id: userId,\n\t\t\t\t\t * },\n\t\t\t\t\t * }));\n\t\t\t\t\t * ```\n\t\t\t\t\t */\n\t\t\t\t\twhen: (\n\t\t\t\t\t\tqueryFilter: QueryFilter<\n\t\t\t\t\t\t\tDB,\n\t\t\t\t\t\t\tTableNameT,\n\t\t\t\t\t\t\tQueryFilterInput<DB, TableNameT>,\n\t\t\t\t\t\t\tUserContext\n\t\t\t\t\t\t>,\n\t\t\t\t\t) => {\n\t\t\t\t\t\tfor (const action of actions) {\n\t\t\t\t\t\t\tif (queryFiltersPerEntity[action] === \"unspecified\") {\n\t\t\t\t\t\t\t\tqueryFiltersPerEntity[action] = [];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconst queryFiltersPerEntityAndAction =\n\t\t\t\t\t\t\t\tqueryFiltersPerEntity[action];\n\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\tqueryFiltersPerEntityAndAction as Exclude<\n\t\t\t\t\t\t\t\t\ttypeof queryFiltersPerEntityAndAction,\n\t\t\t\t\t\t\t\t\t\"unspecified\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t).push(queryFilter);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t\t/**\n\t\t\t * Allows to register an application level filter to restrict some results\n\t\t\t * which were returned by a query\n\t\t\t */\n\t\t\tfilter: (action: Action | Action[]) => {\n\t\t\t\tconst actions = Array.isArray(action) ? action : [action];\n\t\t\t\treturn {\n\t\t\t\t\t/**\n\t\t\t\t\t * The actual filter function to apply. Returns the allowed values\n\t\t\t\t\t */\n\t\t\t\t\tby: (\n\t\t\t\t\t\texplicitFilter: Filter<\n\t\t\t\t\t\t\tUserContext,\n\t\t\t\t\t\t\tNonNullable<\n\t\t\t\t\t\t\t\tAwaited<ReturnType<DB[\"query\"][TableNameT][\"findFirst\"]>>\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t>,\n\t\t\t\t\t) => {\n\t\t\t\t\t\tfor (const action of actions) {\n\t\t\t\t\t\t\tregisteredFilters[tableName][action].push(explicitFilter);\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t},\n\t\t};\n\t};\n\n\tfor (const entityKey of Object.keys(db.query) as TableName<DB>[]) {\n\t\tregistrators[entityKey] = createRegistrator(entityKey);\n\t}\n\n\treturn {\n\t\t...registrators,\n\t\t/** @internal */\n\t\tregisteredQueryFilters: registeredQueryFilters,\n\t\t/** @internal */\n\t\tregisteredFilters,\n\t\t/** @internal */\n\t\tbuildWithUserContext: (userContext: UserContext) => {\n\t\t\tconst builder: {\n\t\t\t\t[key in TableName<DB>]: ReturnType<typeof createEntityObject<key>>;\n\t\t\t} = {} as any;\n\n\t\t\tconst createEntityObject = <TableNameT extends TableName<DB>>(\n\t\t\t\ttableName: TableNameT,\n\t\t\t) => {\n\t\t\t\treturn {\n\t\t\t\t\tfilter: <\n\t\t\t\t\t\tInjection extends SimpleQueryFilter<\n\t\t\t\t\t\t\tDB,\n\t\t\t\t\t\t\tTableNameT,\n\t\t\t\t\t\t\tQueryFilterInput<DB, TableNameT>\n\t\t\t\t\t\t>,\n\t\t\t\t\t>(\n\t\t\t\t\t\taction: Action,\n\t\t\t\t\t\toptions?: {\n\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t * Additional query filters applied only for this call. Useful for injecting one time additional filters\n\t\t\t\t\t\t\t * for e.g. user args in a handler.\n\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\tinject?: Injection;\n\t\t\t\t\t\t},\n\t\t\t\t\t) => {\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Packs the filters into a response object that can be applied for queries by the user\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst transformToResponse = <\n\t\t\t\t\t\t\tF extends QueryFilterInput<DB, TableNameT>,\n\t\t\t\t\t\t>(\n\t\t\t\t\t\t\tqueryFilters?: F,\n\t\t\t\t\t\t) => {\n\t\t\t\t\t\t\tconst where = lazy(() => {\n\t\t\t\t\t\t\t\tif (!queryFilters?.where && !options?.inject?.where) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (options?.inject?.where && queryFilters?.where) {\n\t\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t\tAND: [queryFilters?.where, options?.inject?.where],\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (options?.inject?.where && !queryFilters?.where) {\n\t\t\t\t\t\t\t\t\treturn options?.inject?.where;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (!options?.inject?.where && queryFilters?.where) {\n\t\t\t\t\t\t\t\t\treturn queryFilters?.where;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (!options?.inject?.where && !queryFilters?.where) {\n\t\t\t\t\t\t\t\t\treturn undefined;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst transformedWhere = lazy(() => {\n\t\t\t\t\t\t\t\tconst w = where();\n\t\t\t\t\t\t\t\tif (!w) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tconst table = tableHelper({\n\t\t\t\t\t\t\t\t\ttsName: tableName,\n\t\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\treturn relationsFilterToSQL(table.tableSchema, w);\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst limit = lazy(() => {\n\t\t\t\t\t\t\t\tlet limit =\n\t\t\t\t\t\t\t\t\tqueryFilters?.limit ?? (defaultLimit as undefined | number);\n\n\t\t\t\t\t\t\t\t// only apply limit if neither default limit or ability limit are set\n\t\t\t\t\t\t\t\t// or lower amount is set\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\toptions?.inject?.limit &&\n\t\t\t\t\t\t\t\t\t(!limit || limit > options.inject.limit)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tlimit = options.inject.limit;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\tqueryFilters?.limit &&\n\t\t\t\t\t\t\t\t\t(!limit || queryFilters.limit > limit)\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\tlimit = queryFilters.limit;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// ensure that null is converted to undefined\n\t\t\t\t\t\t\t\treturn limit ?? undefined;\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst columns = lazy(() => {\n\t\t\t\t\t\t\t\tif (!queryFilters?.columns && !options?.inject?.columns) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\t\t...queryFilters?.columns,\n\t\t\t\t\t\t\t\t\t...options?.inject?.columns,\n\t\t\t\t\t\t\t\t} as undefined;\n\t\t\t\t\t\t\t\t// we need to type this as undefined because TS would\n\t\t\t\t\t\t\t\t// do some funky stuff with query resolve typing otherwise\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t// TODO: strongly type this based on table\n\t\t\t\t\t\t\tconst r = {\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t * Query filters for the drizzle query API.\n\t\t\t\t\t\t\t\t * @example\n\t\t\t\t\t\t\t\t * ```ts\n\t\t\t\t\t\t\t\t * author: t.relation(\"author\", {\n\t\t\t\t\t\t\t\t * query: (_args, ctx) => ctx.abilities.users.filter(\"read\").query.single,\n\t\t\t\t\t\t\t\t * }),\n\t\t\t\t\t\t\t\t * ´´´\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\tquery: {\n\t\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t\t * For find first calls\n\t\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\t\tsingle: {\n\t\t\t\t\t\t\t\t\t\tget where() {\n\t\t\t\t\t\t\t\t\t\t\treturn where();\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tcolumns: columns(),\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t\t * For find many calls\n\t\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\t\tmany: {\n\t\t\t\t\t\t\t\t\t\tget where() {\n\t\t\t\t\t\t\t\t\t\t\treturn where();\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tcolumns: columns(),\n\t\t\t\t\t\t\t\t\t\tget limit() {\n\t\t\t\t\t\t\t\t\t\t\treturn limit();\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t/**\n\t\t\t\t\t\t\t\t * Query filters for the drizzle SQL API as used in e.g. updates.\n\t\t\t\t\t\t\t\t * @example\n\t\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t\t * ```ts\n\t\t\t\t\t\t\t\t * await db\n\t\t\t\t\t\t\t\t *\t.update(schema.users)\n\t\t\t\t\t\t\t\t *\t.set({\n\t\t\t\t\t\t\t\t *\t name: args.newName,\n\t\t\t\t\t\t\t\t * \t})\n\t\t\t\t\t\t\t\t *\t.where(\n\t\t\t\t\t\t\t\t *\t and(\n\t\t\t\t\t\t\t\t *\t eq(schema.users.id, args.userId),\n\t\t\t\t\t\t\t\t *\t ctx.abilities.users.filter(\"update\").sql.where,\n\t\t\t\t\t\t\t\t *\t ),\n\t\t\t\t\t\t\t\t *\t);\n\t\t\t\t\t\t\t\t * ```\n\t\t\t\t\t\t\t\t *\n\t\t\t\t\t\t\t\t */\n\t\t\t\t\t\t\t\tsql: {\n\t\t\t\t\t\t\t\t\tget where() {\n\t\t\t\t\t\t\t\t\t\treturn transformedWhere();\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tcolumns: columns(),\n\t\t\t\t\t\t\t\t\tget limit() {\n\t\t\t\t\t\t\t\t\t\treturn limit();\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// columns can't be set to undefined, drizzle will interpret this\n\t\t\t\t\t\t\t// as: don't return any columns\n\t\t\t\t\t\t\t// therefore we need to delete it\n\t\t\t\t\t\t\tif (!columns()) {\n\t\t\t\t\t\t\t\t// biome-ignore lint/performance/noDelete: we need this to not exist\n\t\t\t\t\t\t\t\tdelete r.sql.columns;\n\t\t\t\t\t\t\t\t// biome-ignore lint/performance/noDelete: we need this to not exist\n\t\t\t\t\t\t\t\tdelete r.query.many.columns;\n\t\t\t\t\t\t\t\t// biome-ignore lint/performance/noDelete: we need this to not exist\n\t\t\t\t\t\t\t\tdelete r.query.single.columns;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn r;\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Creates a filter that will never return any result\n\t\t\t\t\t\t */\n\t\t\t\t\t\tconst getBlockEverythingFilter = () => {\n\t\t\t\t\t\t\tconst tableSchema = tableHelper({\n\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\ttsName: tableName,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tif (Object.keys(tableSchema.primaryColumns).length === 0) {\n\t\t\t\t\t\t\t\tthrow new RumbleError(\n\t\t\t\t\t\t\t\t\t`No primary key found for entity ${tableName.toString()}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst primaryKeyField = Object.values(\n\t\t\t\t\t\t\t\ttableSchema.primaryColumns,\n\t\t\t\t\t\t\t)[0];\n\t\t\t\t\t\t\t// we want a filter that excludes everything\n\t\t\t\t\t\t\tconst distinctValues = createDistinctValuesFromSQLType(\n\t\t\t\t\t\t\t\tprimaryKeyField.getSQLType() as any,\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t// when the user has no permission for anything, ensure returns nothing\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\twhere: {\n\t\t\t\t\t\t\t\t\tAND: [\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t[primaryKeyField.name]: distinctValues.value1,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\t[primaryKeyField.name]: distinctValues.value2,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tlet queryFiltersPerEntityAndAction =\n\t\t\t\t\t\t\tregisteredQueryFilters?.[tableName]?.[action];\n\n\t\t\t\t\t\t// in case we have a wildcard ability, skip the rest and only apply the injected\n\t\t\t\t\t\t// filters, if any\n\t\t\t\t\t\tif (queryFiltersPerEntityAndAction === \"unspecified\") {\n\t\t\t\t\t\t\treturn transformToResponse();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// if nothing has been allowed, block everything\n\t\t\t\t\t\tif (!queryFiltersPerEntityAndAction) {\n\t\t\t\t\t\t\tqueryFiltersPerEntityAndAction = [getBlockEverythingFilter()];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//TODO: we could maybe improve performance by not filtering at each creation\n\t\t\t\t\t\t// but instead while the user sets the abilities\n\t\t\t\t\t\tconst simpleQueryFilters: SimpleQueryFilter<\n\t\t\t\t\t\t\tDB,\n\t\t\t\t\t\t\tTableNameT,\n\t\t\t\t\t\t\tQueryFilterInput<DB, TableNameT>\n\t\t\t\t\t\t>[] = queryFiltersPerEntityAndAction.filter(isSimpleQueryFilter);\n\n\t\t\t\t\t\tconst functionQueryFilters: ReturnType<\n\t\t\t\t\t\t\tFunctionQueryFilter<\n\t\t\t\t\t\t\t\tDB,\n\t\t\t\t\t\t\t\tTableNameT,\n\t\t\t\t\t\t\t\tQueryFilterInput<DB, TableNameT>,\n\t\t\t\t\t\t\t\tUserContext\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t>[] = queryFiltersPerEntityAndAction\n\t\t\t\t\t\t\t.filter(isFunctionFilter)\n\t\t\t\t\t\t\t.map((queryFilter) => queryFilter(userContext));\n\n\t\t\t\t\t\t//TODO: we could save some work by not running all the filters at each request\n\t\t\t\t\t\t// whenever one already returned \"allowed\"\n\t\t\t\t\t\tconst someWildcardFound = functionQueryFilters.some(\n\t\t\t\t\t\t\t(c) => c === \"allow\",\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tlet allQueryFilters = [\n\t\t\t\t\t\t\t...simpleQueryFilters,\n\t\t\t\t\t\t\t...functionQueryFilters,\n\t\t\t\t\t\t]\n\t\t\t\t\t\t\t// we just ignore the ones who did return undefined, since that evaluates to \"allow nothing\"\n\t\t\t\t\t\t\t.filter((e) => e !== undefined)\n\t\t\t\t\t\t\t// we already checked if we have some wildcard, so we can ignore the wildcard entries from now on\n\t\t\t\t\t\t\t.filter((e) => e !== \"allow\");\n\n\t\t\t\t\t\t// if we don't have any permitted filters and don't have a wildcard, then block everything\n\t\t\t\t\t\tif (!someWildcardFound && allQueryFilters.length === 0) {\n\t\t\t\t\t\t\tallQueryFilters = [getBlockEverythingFilter()];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet highestLimit: number | undefined;\n\t\t\t\t\t\tfor (const conditionObject of allQueryFilters) {\n\t\t\t\t\t\t\tif (conditionObject?.limit) {\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\thighestLimit === undefined ||\n\t\t\t\t\t\t\t\t\tconditionObject.limit > highestLimit\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\thighestLimit = conditionObject.limit;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet combinedAllowedColumns: Record<string, any> | undefined;\n\t\t\t\t\t\tfor (const conditionObject of [\n\t\t\t\t\t\t\t...allQueryFilters,\n\t\t\t\t\t\t\toptions?.inject,\n\t\t\t\t\t\t]) {\n\t\t\t\t\t\t\tif (conditionObject?.columns) {\n\t\t\t\t\t\t\t\tif (combinedAllowedColumns === undefined) {\n\t\t\t\t\t\t\t\t\tcombinedAllowedColumns = conditionObject.columns;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcombinedAllowedColumns = {\n\t\t\t\t\t\t\t\t\t\t...combinedAllowedColumns,\n\t\t\t\t\t\t\t\t\t\t...conditionObject.columns,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// in case we have a wildcard, we don't want to apply any where conditions\n\t\t\t\t\t\tconst accumulatedWhereConditions = someWildcardFound\n\t\t\t\t\t\t\t? []\n\t\t\t\t\t\t\t: allQueryFilters.filter((o) => o?.where).map((o) => o.where);\n\n\t\t\t\t\t\tconst combinedWhere =\n\t\t\t\t\t\t\taccumulatedWhereConditions.length > 0\n\t\t\t\t\t\t\t\t? { OR: accumulatedWhereConditions }\n\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t//TODO make this actually typesafe\n\t\t\t\t\t\treturn transformToResponse({\n\t\t\t\t\t\t\twhere: combinedWhere,\n\t\t\t\t\t\t\tcolumns: combinedAllowedColumns,\n\t\t\t\t\t\t\tlimit: highestLimit,\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\texplicitFilters: (action: Action) => {\n\t\t\t\t\t\treturn registeredFilters[tableName][action];\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t};\n\n\t\t\tfor (const entityKey of Object.keys(db.query) as TableName<DB>[]) {\n\t\t\t\tbuilder[entityKey] = createEntityObject(entityKey);\n\t\t\t}\n\n\t\t\treturn builder;\n\t\t},\n\t};\n};\n","import type {\n\tAbilityBuilderType,\n\tcreateAbilityBuilder,\n} from \"./abilityBuilder\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\n} from \"./types/rumbleInput\";\n\nexport type ContextFunctionType<\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n\ttypeof createContextFunction<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\tAbilityBuilderType<UserContext, DB, RequestEvent, Action, PothosConfig>\n\t>\n>;\n\nexport type ContextType<\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n> = Awaited<\n\tReturnType<\n\t\tContextFunctionType<UserContext, DB, RequestEvent, Action, PothosConfig>\n\t>\n>;\n\nexport const createContextFunction = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n\tAbilityBuilder extends ReturnType<\n\t\ttypeof createAbilityBuilder<\n\t\t\tUserContext,\n\t\t\tDB,\n\t\t\tRequestEvent,\n\t\t\tAction,\n\t\t\tPothosConfig\n\t\t>\n\t>,\n>({\n\tcontext: makeUserContext,\n\tabilityBuilder,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n\tabilityBuilder: AbilityBuilder;\n}) => {\n\treturn async (req: RequestEvent) => {\n\t\tconst userContext = makeUserContext\n\t\t\t? await makeUserContext(req)\n\t\t\t: ({} as UserContext);\n\t\treturn {\n\t\t\t...userContext,\n\t\t\tabilities: abilityBuilder.buildWithUserContext(userContext),\n\t\t};\n\t};\n};\n","// https://stackoverflow.com/a/1026087/11988368\nexport function capitalizeFirstLetter(val: string) {\n\treturn String(val).charAt(0).toUpperCase() + String(val).slice(1);\n}\n","import { toCamelCase } from \"drizzle-orm/casing\";\nimport { type PgEnum, PgEnumColumn } from \"drizzle-orm/pg-core\";\nimport { capitalizeFirstLetter } from \"./helpers/capitalize\";\nimport { tableHelper } from \"./helpers/tableHelpers\";\nimport type { SchemaBuilderType } from \"./schemaBuilder\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport { RumbleError } from \"./types/rumbleError\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\n} from \"./types/rumbleInput\";\n\n/**\n * Checks if a schema type is an enum\n */\nexport function isEnumSchema(schemaType: any): schemaType is PgEnum<any> {\n\t// TODO make this compatible with other db drivers\n\treturn schemaType instanceof PgEnumColumn;\n}\n\n// TODO make this compatible with other db drivers\ntype EnumTypes = PgEnum<any>;\n\ntype EnumFields<T> = {\n\t[K in keyof T as T[K] extends EnumTypes ? K : never]: T[K];\n};\n\nexport type NonEnumFields<T> = {\n\t[K in keyof T as T[K] extends EnumTypes ? never : K]: T[K];\n};\n\nexport type EnumImplementerType<\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n\ttypeof createEnumImplementer<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\tSchemaBuilderType<UserContext, DB, RequestEvent, Action, PothosConfig>\n\t>\n>;\n\nexport const createEnumImplementer = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n\tSchemaBuilder extends SchemaBuilderType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n>({\n\tdb,\n\tschemaBuilder,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n\tschemaBuilder: SchemaBuilder;\n}) => {\n\tconst referenceStorage = new Map<string, any>();\n\n\tconst enumImplementer = <\n\t\tExplicitEnumVariableName extends keyof EnumFields<\n\t\t\tNonNullable<DB[\"_\"][\"relations\"][\"schema\"]>\n\t\t>,\n\t\tEnumColumn extends EnumTypes,\n\t\tRefName extends string,\n\t>({\n\t\ttsName,\n\t\tenumColumn,\n\t\trefName,\n\t}: Partial<{\n\t\ttsName: ExplicitEnumVariableName;\n\t\tenumColumn: EnumColumn;\n\t\trefName?: RefName | undefined;\n\t}> &\n\t\t(\n\t\t\t| {\n\t\t\t\t\ttsName: ExplicitEnumVariableName;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tenumColumn: EnumColumn;\n\t\t\t }\n\t\t)) => {\n\t\t//TODO check if this can be done typesafe\n\n\t\tlet enumSchemaName: string | undefined;\n\t\tlet enumValues: any[] | undefined;\n\n\t\tif (tsName) {\n\t\t\tconst schemaEnum = db._.relations.schema[tsName as string];\n\n\t\t\tenumSchemaName = tsName.toString();\n\n\t\t\tconst enumCol = Object.values(db._.relations.schema)\n\t\t\t\t.filter((s) => typeof s === \"object\")\n\t\t\t\t.map((s) => Object.values(s[Symbol.for(\"drizzle:Columns\")]))\n\t\t\t\t.flat(2)\n\t\t\t\t.find((s: any) => s.config?.enum === schemaEnum);\n\n\t\t\tif (!enumCol) {\n\t\t\t\tthrow new RumbleError(`Could not find applied enum column for ${tsName.toString()}.\nPlease ensure that you use the enum at least once as a column of a table!`);\n\t\t\t}\n\n\t\t\tenumValues = (enumCol as any).enumValues;\n\t\t} else if (enumColumn) {\n\t\t\tconst schemaEnumEntry = Object.entries(db._.relations.schema).find(\n\t\t\t\t([key, value]) => value === (enumColumn as any).config.enum,\n\t\t\t);\n\n\t\t\tif (!schemaEnumEntry) {\n\t\t\t\tthrow new RumbleError(\n\t\t\t\t\t`Could not find enum in schema for ${enumColumn.name}!`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tenumSchemaName = schemaEnumEntry[0];\n\t\t\tenumValues = enumColumn.enumValues;\n\t\t}\n\n\t\tif (!enumSchemaName || !enumValues) {\n\t\t\tthrow new RumbleError(\"Could not determine enum structure!\");\n\t\t}\n\n\t\tconst graphqlImplementationName =\n\t\t\trefName ?? `${capitalizeFirstLetter(toCamelCase(enumSchemaName))}Enum`;\n\n\t\tlet ret: ReturnType<typeof implement> | undefined = referenceStorage.get(\n\t\t\tgraphqlImplementationName,\n\t\t);\n\t\tif (ret) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tconst implement = () =>\n\t\t\tschemaBuilder.enumType(graphqlImplementationName, {\n\t\t\t\tvalues: enumValues,\n\t\t\t});\n\n\t\tret = implement();\n\t\treferenceStorage.set(graphqlImplementationName, ret);\n\t\treturn ret;\n\t};\n\n\treturn enumImplementer;\n};\n","import type { useSofa } from \"sofa-api\";\n\nexport const sofaOpenAPIWebhookDocs: Parameters<typeof useSofa>[0][\"openAPI\"] =\n\t{\n\t\tpaths: {\n\t\t\t\"/webhook\": {\n\t\t\t\tpost: {\n\t\t\t\t\toperationId: \"webhook_create\",\n\t\t\t\t\tdescription: \"Creates a webhook subscription.\",\n\t\t\t\t\ttags: [],\n\t\t\t\t\tparameters: [],\n\t\t\t\t\trequestBody: {\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t$ref: \"#/components/schemas/WebhookCreateBody\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\t$ref: \"#/components/schemas/WebhookDetailResponse\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t\"/webhook/{id}\": {\n\t\t\t\tpost: {\n\t\t\t\t\toperationId: \"webhook_update\",\n\t\t\t\t\tdescription: \"Updates a webhook subscription.\",\n\t\t\t\t\tparameters: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: \"id\",\n\t\t\t\t\t\t\tin: \"path\",\n\t\t\t\t\t\t\tdescription: \"The ID of the webhook to update\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} as any,\n\t\t\t\t\t],\n\t\t\t\t\trequestBody: {\n\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t$ref: \"#/components/schemas/WebhookCreateBody\",\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\t$ref: \"#/components/schemas/WebhookDetailResponse\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tdelete: {\n\t\t\t\t\toperationId: \"webhook_delete\",\n\t\t\t\t\tdescription: \"Removes a webhook subscription.\",\n\t\t\t\t\ttags: [],\n\t\t\t\t\tparameters: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tname: \"id\",\n\t\t\t\t\t\t\tin: \"path\",\n\t\t\t\t\t\t\tdescription: \"The ID of the webhook to delete\",\n\t\t\t\t\t\t\trequired: true,\n\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} as any,\n\t\t\t\t\t],\n\t\t\t\t\tresponses: {\n\t\t\t\t\t\t\"200\": {\n\t\t\t\t\t\t\tcontent: {\n\t\t\t\t\t\t\t\t\"application/json\": {\n\t\t\t\t\t\t\t\t\tschema: {\n\t\t\t\t\t\t\t\t\t\t$ref: \"#/components/schemas/WebhookDetailResponse\",\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\tcomponents: {\n\t\t\tschemas: {\n\t\t\t\tWebhookCreateBody: {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tsubscription: {\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\"The subscription to subscribe to. In many cases, these match the available query IDs without the '_query' suffix. E.g., 'findFirstUser_query' -> 'findFirstUser'. See the graphql schema for more details on what subscriptions are available.\",\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\tvariables: {\n\t\t\t\t\t\t\tdescription: \"The variables to pass to the subscription.\",\n\t\t\t\t\t\t\ttype: \"object\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\turl: {\n\t\t\t\t\t\t\tdescription: \"The URL to send the webhook to.\",\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tWebhookDetailResponse: {\n\t\t\t\t\ttype: \"object\",\n\t\t\t\t\tproperties: {\n\t\t\t\t\t\tid: {\n\t\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t\t\"The ID of the webhook. Can be used as reference in update or delete calls.\",\n\t\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t};\n","import type { SchemaBuilderType } from \"../../schemaBuilder\";\nimport type { GenericDrizzleDbTypeConstraints } from \"../../types/genericDrizzleDbType\";\nimport type { CustomRumblePothosConfig } from \"../../types/rumbleInput\";\nimport { type PossibleSQLType, UnknownTypeRumbleError } from \"./types\";\n\nexport function mapSQLTypeToGraphQLType<\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n\tSchemaBuilder extends SchemaBuilderType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n>({ sqlType, fieldName }: { sqlType: PossibleSQLType; fieldName?: string }) {\n\ttype ReturnType = Parameters<\n\t\tParameters<Parameters<SchemaBuilder[\"queryField\"]>[1]>[0][\"field\"]\n\t>[0][\"type\"];\n\n\tlet ret: ReturnType | undefined;\n\n\tif (\n\t\t[\"serial\", \"int\", \"integer\", \"tinyint\", \"smallint\", \"mediumint\"].includes(\n\t\t\tsqlType,\n\t\t)\n\t) {\n\t\tret = \"Int\";\n\t}\n\n\tif ([\"real\", \"decimal\", \"double\", \"float\"].includes(sqlType)) {\n\t\tret = \"Float\";\n\t}\n\n\tif ([\"string\", \"text\", \"varchar\", \"char\", \"text(256)\"].includes(sqlType)) {\n\t\tif (\n\t\t\tfieldName &&\n\t\t\t(fieldName.toLowerCase().endsWith(\"_id\") ||\n\t\t\t\tfieldName.toLowerCase().endsWith(\"id\"))\n\t\t) {\n\t\t\tret = \"ID\";\n\t\t} else {\n\t\t\tret = \"String\";\n\t\t}\n\t}\n\n\tif ([\"uuid\"].includes(sqlType)) {\n\t\tret = \"ID\";\n\t}\n\n\tif ([\"boolean\"].includes(sqlType)) {\n\t\tret = \"Boolean\";\n\t}\n\n\tif ([\"timestamp\", \"datetime\"].includes(sqlType)) {\n\t\tret = \"DateTime\";\n\t}\n\n\tif ([\"date\"].includes(sqlType)) {\n\t\tret = \"Date\";\n\t}\n\n\tif ([\"json\"].includes(sqlType)) {\n\t\tret = \"JSON\";\n\t}\n\n\tif (ret !== undefined) {\n\t\treturn ret;\n\t}\n\n\tthrow UnknownTypeRumbleError(sqlType, \"SQL to GQL\");\n}\n","import type { FieldMap, SchemaTypes } from \"@pothos/core\";\nimport type { DrizzleObjectFieldBuilder } from \"@pothos/plugin-drizzle\";\nimport { One, type Table } from \"drizzle-orm\";\nimport type { AbilityBuilderType } from \"./abilityBuilder\";\nimport { type EnumImplementerType, isEnumSchema } from \"./enum\";\nimport { capitalizeFirstLetter } from \"./helpers/capitalize\";\nimport { mapSQLTypeToGraphQLType } from \"./helpers/sqlTypes/mapSQLTypeToTSType\";\nimport type { PossibleSQLType } from \"./helpers/sqlTypes/types\";\nimport {\n\ttype TableIdentifierTSName,\n\ttableHelper,\n} from \"./helpers/tableHelpers\";\nimport type { OrderArgImplementerType } from \"./orderArg\";\nimport type { MakePubSubInstanceType } from \"./pubsub\";\nimport type { SchemaBuilderType } from \"./schemaBuilder\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport { RumbleError } from \"./types/rumbleError\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\n} from \"./types/rumbleInput\";\nimport type { WhereArgImplementerType } from \"./whereArg\";\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?\nconst isProbablyAConfigObject = (t: any) => {\n\tif (typeof t !== \"object\") {\n\t\treturn false;\n\t}\n\n\tif (\n\t\tObject.keys(t).some((k) =>\n\t\t\t[\n\t\t\t\t\"args\",\n\t\t\t\t\"nullable\",\n\t\t\t\t\"query\",\n\t\t\t\t\"subscribe\",\n\t\t\t\t\"description\",\n\t\t\t\t\"type\",\n\t\t\t\t\"resolve\",\n\t\t\t].find((e) => e === k),\n\t\t)\n\t)\n\t\treturn true;\n\treturn false;\n};\n\nexport const createObjectImplementer = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n\tSchemaBuilder extends SchemaBuilderType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n\tWhereArgImplementer extends WhereArgImplementerType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n\tOrderArgImplementer extends OrderArgImplementerType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n\tEnumImplementer extends EnumImplementerType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n\tMakePubSubInstance extends MakePubSubInstanceType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n\tAbilityBuilderInstance extends AbilityBuilderType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n>({\n\tdb,\n\tschemaBuilder,\n\tmakePubSubInstance,\n\twhereArgImplementer,\n\torderArgImplementer,\n\tenumImplementer,\n\tabilityBuilder,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n\tschemaBuilder: SchemaBuilder;\n\twhereArgImplementer: WhereArgImplementer;\n\torderArgImplementer: OrderArgImplementer;\n\tenumImplementer: EnumImplementer;\n\tmakePubSubInstance: MakePubSubInstance;\n\tabilityBuilder: AbilityBuilderInstance;\n}) => {\n\treturn <\n\t\tExplicitTableName extends TableIdentifierTSName<DB>,\n\t\tRefName extends string,\n\t>({\n\t\ttable,\n\t\trefName,\n\t\treadAction = \"read\" as Action,\n\t\tadjust,\n\t}: {\n\t\t/**\n\t\t * The table you want to be used as reference for the object creation.\n\t\t */\n\t\ttable: ExplicitTableName;\n\t\t/**\n\t\t * The name you want this object to have in your graphql schema.\n\t\t * Rumble will create a reasonable default if not specified.\n\t\t */\n\t\trefName?: RefName;\n\t\t/**\n\t\t * The action used for read access to the table.\n\t\t * Defaults to \"read\".\n\t\t */\n\t\treadAction?: Action;\n\t\t/**\n\t\t * A function which can be used to adjust the fields of the object.\n\t\t * You can extend the object by specifying fields that do not exist as\n\t\t * per your db schema, or overwrite existing fields with the same name.\n\t\t * In case you do overwrite, rumble will set proper nullability and\n\t\t * subscription properties if you do not specify them explicitly.\n\t\t */\n\t\tadjust?:\n\t\t\t| ((\n\t\t\t\t\tt: DrizzleObjectFieldBuilder<\n\t\t\t\t\t\tSchemaBuilder[\"$inferSchemaTypes\"],\n\t\t\t\t\t\tSchemaBuilder[\"$inferSchemaTypes\"][\"DrizzleRelationsConfig\"][ExplicitTableName],\n\t\t\t\t\t\tNonNullable<\n\t\t\t\t\t\t\tAwaited<ReturnType<DB[\"query\"][ExplicitTableName][\"findFirst\"]>>\n\t\t\t\t\t\t>\n\t\t\t\t\t>,\n\t\t\t ) => FieldMap)\n\t\t\t| undefined;\n\t}) => {\n\t\tconst tableSchema = tableHelper({ db, tsName: table });\n\t\tif (Object.keys(tableSchema.primaryColumns).length === 0) {\n\t\t\tconsole.warn(\n\t\t\t\t`Could not find primary key for ${table.toString()}. Cannot register subscriptions!`,\n\t\t\t);\n\t\t}\n\t\tconst primaryKey = Object.values(tableSchema.primaryColumns)[0];\n\n\t\tconst { registerOnInstance } = makePubSubInstance({ table: table });\n\n\t\treturn schemaBuilder.drizzleObject(table, {\n\t\t\tname: refName ?? capitalizeFirstLetter(table.toString()),\n\t\t\tsubscribe: (subscriptions, element, context) => {\n\t\t\t\tif (!primaryKey) return;\n\t\t\t\tconst primaryKeyValue = (element as any)[primaryKey.name];\n\t\t\t\tif (!primaryKeyValue) {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t`Could not find primary key value for ${JSON.stringify(\n\t\t\t\t\t\t\telement,\n\t\t\t\t\t\t)}. Cannot register subscription!`,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t//TODO maybe register non specific update calls aswell?\n\t\t\t\tregisterOnInstance({\n\t\t\t\t\tinstance: subscriptions,\n\t\t\t\t\taction: \"updated\",\n\t\t\t\t\tprimaryKeyValue: primaryKeyValue,\n\t\t\t\t});\n\t\t\t},\n\t\t\tapplyFilters:\n\t\t\t\tabilityBuilder?.registeredFilters?.[table as any]?.[readAction],\n\t\t\tfields: (t) => {\n\t\t\t\tconst columns = tableSchema.columns;\n\t\t\t\tconst mapSQLTypeStringToExposedPothosType = <\n\t\t\t\t\tColumn extends keyof typeof columns,\n\t\t\t\t>(\n\t\t\t\t\tsqlType: PossibleSQLType,\n\t\t\t\t\tcolumnName: Column,\n\t\t\t\t\tnullable: boolean,\n\t\t\t\t) => {\n\t\t\t\t\tconst gqlType = mapSQLTypeToGraphQLType({\n\t\t\t\t\t\tsqlType,\n\t\t\t\t\t\tfieldName: columnName,\n\t\t\t\t\t});\n\t\t\t\t\tswitch (gqlType) {\n\t\t\t\t\t\tcase \"Int\":\n\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\treturn t.exposeInt(columnName, { nullable });\n\t\t\t\t\t\tcase \"String\":\n\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\treturn t.exposeString(columnName, { nullable });\n\t\t\t\t\t\tcase \"Boolean\":\n\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\treturn t.exposeBoolean(columnName, { nullable });\n\t\t\t\t\t\tcase \"Date\":\n\t\t\t\t\t\t\treturn t.field({\n\t\t\t\t\t\t\t\ttype: \"Date\",\n\t\t\t\t\t\t\t\tresolve: (element) => (element as any)[columnName] as Date,\n\t\t\t\t\t\t\t\tnullable,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\tcase \"DateTime\":\n\t\t\t\t\t\t\treturn t.field({\n\t\t\t\t\t\t\t\ttype: \"DateTime\",\n\t\t\t\t\t\t\t\tresolve: (element) => (element as any)[columnName] as Date,\n\t\t\t\t\t\t\t\tnullable,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\tcase \"Float\":\n\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\treturn t.exposeFloat(columnName, { nullable });\n\t\t\t\t\t\tcase \"ID\":\n\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\treturn t.exposeID(columnName, { nullable });\n\t\t\t\t\t\tcase \"JSON\":\n\t\t\t\t\t\t\treturn t.field({\n\t\t\t\t\t\t\t\ttype: \"JSON\",\n\t\t\t\t\t\t\t\tresolve: (element) => (element as any)[columnName] as unknown,\n\t\t\t\t\t\t\t\tnullable,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new RumbleError(\n\t\t\t\t\t\t\t\t`Unsupported object type ${gqlType} for column ${columnName}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// in case the user makes adjustments we want to store away which\n\t\t\t\t// pothos function was called with what config\n\t\t\t\t// this is mapped to the ref which later can be used to\n\t\t\t\t// reference these parameters while iterating over the fields\n\t\t\t\t// and checking against the userAdjustments object\n\t\t\t\tconst configMap = new Map<\n\t\t\t\t\tany,\n\t\t\t\t\t{\n\t\t\t\t\t\tcreatorFunction: (...p: any[]) => any;\n\t\t\t\t\t\tparams: any[];\n\t\t\t\t\t\tconfigObject: any;\n\t\t\t\t\t}\n\t\t\t\t>();\n\t\t\t\t// stores the results of the user adjustments\n\t\t\t\t// also stores all the used pothos functions and the configs\n\t\t\t\t// provided by the user so we can extend that if necessary\n\t\t\t\tconst userAdjustments =\n\t\t\t\t\tadjust?.(\n\t\t\t\t\t\tnew Proxy(t, {\n\t\t\t\t\t\t\tget: (target, prop) => {\n\t\t\t\t\t\t\t\tif (typeof (target as any)[prop] === \"function\") {\n\t\t\t\t\t\t\t\t\treturn (...params: any[]) => {\n\t\t\t\t\t\t\t\t\t\tconst ref = (target as any)[prop](...params);\n\t\t\t\t\t\t\t\t\t\tconst configObject = params.find(isProbablyAConfigObject);\n\t\t\t\t\t\t\t\t\t\tif (!configObject)\n\t\t\t\t\t\t\t\t\t\t\tthrow new RumbleError(\n\t\t\t\t\t\t\t\t\t\t\t\t\"Expected config object to be passed to adjust field\",\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\tconfigMap.set(ref, {\n\t\t\t\t\t\t\t\t\t\t\tparams,\n\t\t\t\t\t\t\t\t\t\t\tcreatorFunction: (target as any)[prop],\n\t\t\t\t\t\t\t\t\t\t\tconfigObject,\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\treturn ref;\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn (target as any)[prop];\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t}) as any,\n\t\t\t\t\t) ?? {};\n\n\t\t\t\tconst fields = Object.entries(columns).reduce(\n\t\t\t\t\t(acc, [key, value]) => {\n\t\t\t\t\t\tif (userAdjustments[key]) {\n\t\t\t\t\t\t\tconst { params, creatorFunction, configObject } = configMap.get(\n\t\t\t\t\t\t\t\tuserAdjustments[key],\n\t\t\t\t\t\t\t)!;\n\n\t\t\t\t\t\t\tif (typeof configObject.nullable !== \"boolean\") {\n\t\t\t\t\t\t\t\tconfigObject.nullable = !value.notNull;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tuserAdjustments[key] = creatorFunction.bind(t)(...params);\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (isEnumSchema(value)) {\n\t\t\t\t\t\t\tconst enumImpl = enumImplementer({\n\t\t\t\t\t\t\t\tenumColumn: value,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tacc[key] = t.field({\n\t\t\t\t\t\t\t\ttype: enumImpl,\n\t\t\t\t\t\t\t\tresolve: (element) => (element as any)[key],\n\t\t\t\t\t\t\t\tnullable: !value.notNull,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tacc[key] = mapSQLTypeStringToExposedPothosType(\n\t\t\t\t\t\t\t\tvalue.getSQLType() as PossibleSQLType,\n\t\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\t\t!value.notNull,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn acc;\n\t\t\t\t\t},\n\t\t\t\t\t{} as Record<\n\t\t\t\t\t\tkeyof typeof columns,\n\t\t\t\t\t\tReturnType<typeof mapSQLTypeStringToExposedPothosType>\n\t\t\t\t\t>,\n\t\t\t\t);\n\n\t\t\t\tconst relations = Object.entries(tableSchema.relations ?? {}).reduce(\n\t\t\t\t\t(acc, [key, value]) => {\n\t\t\t\t\t\tconst relationSchema = tableHelper({\n\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\ttable: value.targetTable as Table,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst WhereArg = whereArgImplementer({\n\t\t\t\t\t\t\tdbName: relationSchema.dbName,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst OrderArg = orderArgImplementer({\n\t\t\t\t\t\t\tdbName: relationSchema.dbName,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tconst relationTablePubSub = makePubSubInstance({\n\t\t\t\t\t\t\ttable: relationSchema.tsName as any,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t// many relations will return an empty array so we just don't set them nullable\n\t\t\t\t\t\tlet nullable = false;\n\t\t\t\t\t\tlet isMany = true;\n\t\t\t\t\t\tlet filterSpecifier = \"many\";\n\t\t\t\t\t\tif (value instanceof One) {\n\t\t\t\t\t\t\tisMany = false;\n\t\t\t\t\t\t\tnullable = value.optional;\n\t\t\t\t\t\t\tfilterSpecifier = \"single\";\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst subscribe = (subscriptions: any, element: any) => {\n\t\t\t\t\t\t\trelationTablePubSub.registerOnInstance({\n\t\t\t\t\t\t\t\tinstance: subscriptions,\n\t\t\t\t\t\t\t\taction: \"created\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\trelationTablePubSub.registerOnInstance({\n\t\t\t\t\t\t\t\tinstance: subscriptions,\n\t\t\t\t\t\t\t\taction: \"removed\",\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tif (userAdjustments[key]) {\n\t\t\t\t\t\t\tconst { params, creatorFunction, configObject } = configMap.get(\n\t\t\t\t\t\t\t\tuserAdjustments[key],\n\t\t\t\t\t\t\t)!;\n\n\t\t\t\t\t\t\tif (typeof configObject.nullable !== \"boolean\") {\n\t\t\t\t\t\t\t\tconfigObject.nullable = nullable;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (typeof configObject.subscribe !== \"function\") {\n\t\t\t\t\t\t\t\tconfigObject.subscribe = subscribe;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tuserAdjustments[key] = creatorFunction.bind(t)(...params);\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t(acc as any)[key] = t.relation(key, {\n\t\t\t\t\t\t\targs: {\n\t\t\t\t\t\t\t\twhere: t.arg({ type: WhereArg, required: false }),\n\t\t\t\t\t\t\t\torderBy: t.arg({ type: OrderArg, required: false }),\n\t\t\t\t\t\t\t\t...(isMany\n\t\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\t\toffset: t.arg.int({ required: false }),\n\t\t\t\t\t\t\t\t\t\t\tlimit: t.arg.int({ required: false }),\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsubscribe,\n\t\t\t\t\t\t\tnullable,\n\t\t\t\t\t\t\tquery: (args: any, ctx: any) => {\n\t\t\t\t\t\t\t\t// transform null prototyped object\n\t\t\t\t\t\t\t\t// biome-ignore lint/style/noParameterAssign: Its really not a problem here\n\t\t\t\t\t\t\t\targs = JSON.parse(JSON.stringify(args));\n\t\t\t\t\t\t\t\tconst filter = ctx.abilities[relationSchema.tsName].filter(\n\t\t\t\t\t\t\t\t\treadAction,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tinject: { where: args.where, limit: args.limit },\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t).query[filterSpecifier];\n\n\t\t\t\t\t\t\t\tif (args.offset) {\n\t\t\t\t\t\t\t\t\t(filter as any).offset = args.offset;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (args.orderBy) {\n\t\t\t\t\t\t\t\t\t(filter as any).orderBy = args.orderBy;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn filter;\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t} as any) as any;\n\t\t\t\t\t\treturn acc;\n\t\t\t\t\t},\n\t\t\t\t\t{} as Record<\n\t\t\t\t\t\tkeyof typeof tableSchema.relations,\n\t\t\t\t\t\tReturnType<typeof mapSQLTypeStringToExposedPothosType>\n\t\t\t\t\t>,\n\t\t\t\t);\n\n\t\t\t\treturn {\n\t\t\t\t\t...fields,\n\t\t\t\t\t...relations,\n\t\t\t\t\t...userAdjustments,\n\t\t\t\t};\n\t\t\t},\n\t\t});\n\t};\n};\n","import type { Table } from \"drizzle-orm\";\nimport { toCamelCase } from \"drizzle-orm/casing\";\nimport { type EnumImplementerType, isEnumSchema } from \"./enum\";\nimport { capitalizeFirstLetter } from \"./helpers/capitalize\";\nimport { lazy } from \"./helpers/lazy\";\nimport { mapSQLTypeToGraphQLType } from \"./helpers/sqlTypes/mapSQLTypeToTSType\";\nimport type { PossibleSQLType } from \"./helpers/sqlTypes/types\";\nimport {\n\ttype TableIdentifierTSName,\n\ttableHelper,\n} from \"./helpers/tableHelpers\";\nimport type { SchemaBuilderType } from \"./schemaBuilder\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\n} from \"./types/rumbleInput\";\n\nexport type OrderArgImplementerType<\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n\ttypeof createOrderArgImplementer<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\tSchemaBuilderType<UserContext, DB, RequestEvent, Action, PothosConfig>\n\t>\n>;\n\nconst makeDefaultName = (dbName: string) =>\n\t`${capitalizeFirstLetter(toCamelCase(dbName.toString()))}OrderInputArgument`;\n\nexport const createOrderArgImplementer = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n\tSchemaBuilder extends SchemaBuilderType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n>({\n\tdb,\n\tschemaBuilder,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n\tschemaBuilder: SchemaBuilder;\n}) => {\n\tconst referenceStorage = new Map<string, any>();\n\n\tconst sortingParameterEnumRef = lazy(() =>\n\t\tschemaBuilder.enumType(\"SortingParameter\", {\n\t\t\tvalues: [\"asc\", \"desc\"] as const,\n\t\t}),\n\t);\n\n\tconst orderArgImplementer = <\n\t\tExplicitTableName extends TableIdentifierTSName<DB>,\n\t\tRefName extends string,\n\t>({\n\t\ttable,\n\t\trefName,\n\t\tdbName,\n\t}: Partial<{\n\t\ttable: ExplicitTableName;\n\t\trefName: RefName | undefined;\n\t\tdbName: string;\n\t}> &\n\t\t(\n\t\t\t| {\n\t\t\t\t\ttable: ExplicitTableName;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tdbName: string;\n\t\t\t }\n\t\t)) => {\n\t\tconst tableSchema = tableHelper({\n\t\t\tdb,\n\t\t\tdbName,\n\t\t\ttsName: table!,\n\t\t});\n\n\t\tconst inputTypeName = refName ?? makeDefaultName(tableSchema.tsName);\n\n\t\tlet ret: ReturnType<typeof implement> | undefined =\n\t\t\treferenceStorage.get(inputTypeName);\n\t\tif (ret) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tconst implement = () => {\n\t\t\treturn schemaBuilder.inputType(inputTypeName, {\n\t\t\t\tfields: (t) => {\n\t\t\t\t\tconst fields = Object.entries(tableSchema.columns).reduce(\n\t\t\t\t\t\t(acc, [key, value]) => {\n\t\t\t\t\t\t\tacc[key] = t.field({\n\t\t\t\t\t\t\t\ttype: sortingParameterEnumRef(),\n\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{} as Record<\n\t\t\t\t\t\t\tkeyof typeof tableSchema.columns,\n\t\t\t\t\t\t\tReturnType<typeof t.field>\n\t\t\t\t\t\t>,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst relations = Object.entries(tableSchema.relations ?? {}).reduce(\n\t\t\t\t\t\t(acc, [key, value]) => {\n\t\t\t\t\t\t\tconst relationSchema = tableHelper({\n\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\ttable: value.targetTable as Table,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst referenceModel = orderArgImplementer({\n\t\t\t\t\t\t\t\tdbName: relationSchema.dbName,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tacc[key] = t.field({\n\t\t\t\t\t\t\t\ttype: referenceModel,\n\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{} as Record<\n\t\t\t\t\t\t\tkeyof typeof tableSchema.columns,\n\t\t\t\t\t\t\tReturnType<typeof t.field>\n\t\t\t\t\t\t>,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...fields,\n\t\t\t\t\t\t...relations,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t});\n\t\t};\n\n\t\tret = implement();\n\t\treferenceStorage.set(inputTypeName, ret);\n\t\treturn ret;\n\t};\n\n\treturn orderArgImplementer;\n};\n","import type { GetColumnData } from \"drizzle-orm\";\nimport { createPubSub } from \"graphql-yoga\";\nimport type { TableIdentifierTSName } from \"./helpers/tableHelpers\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\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\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n\ttypeof createPubSubInstance<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>\n>[\"makePubSubInstance\"];\n\nexport const createPubSubInstance = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n>({\n\tsubscriptions,\n\tdb,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig>) => {\n\tconst pubsub = subscriptions\n\t\t? createPubSub(...subscriptions)\n\t\t: createPubSub();\n\n\tconst makePubSubInstance = <\n\t\tExplicitTableName extends TableIdentifierTSName<DB>,\n\t>({\n\t\ttable,\n\t}: {\n\t\ttable: ExplicitTableName;\n\t}) => {\n\t\ttype PrimaryKeyType = any;\n\n\t\tfunction makePubSubKey({\n\t\t\taction,\n\t\t\ttableName,\n\t\t\tprimaryKeyValue,\n\t\t}: {\n\t\t\ttableName: string;\n\t\t\taction: PubSubAction;\n\t\t\tprimaryKeyValue?: PrimaryKeyType;\n\t\t}) {\n\t\t\tlet actionKey: string;\n\n\t\t\tswitch (action) {\n\t\t\t\tcase \"created\":\n\t\t\t\t\tactionKey = SUBSCRIPTION_NOTIFIER_CREATED;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"removed\":\n\t\t\t\t\tactionKey = SUBSCRIPTION_NOTIFIER_REMOVED;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"updated\":\n\t\t\t\t\tactionKey = SUBSCRIPTION_NOTIFIER_UPDATED;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error(`Unknown action: ${action}`);\n\t\t\t}\n\n\t\t\treturn `${SUBSCRIPTION_NOTIFIER_RUMBLE_PREFIX}/${tableName}${\n\t\t\t\tprimaryKeyValue ? `/${primaryKeyValue}` : \"\"\n\t\t\t}/${actionKey}`;\n\t\t}\n\n\t\t// TODO does caching these make sense?\n\t\treturn {\n\t\t\t/**\n\t\t\t * Call this when you want to register a subscription on an instance to this table\n\t\t\t */\n\t\t\tregisterOnInstance({\n\t\t\t\tinstance,\n\t\t\t\taction,\n\t\t\t\tprimaryKeyValue,\n\t\t\t}: {\n\t\t\t\tinstance: { register: (id: string) => void };\n\t\t\t\taction: PubSubAction;\n\t\t\t\tprimaryKeyValue?: string;\n\t\t\t}) {\n\t\t\t\tconst key = makePubSubKey({\n\t\t\t\t\ttableName: table.toString(),\n\t\t\t\t\taction,\n\t\t\t\t\tprimaryKeyValue,\n\t\t\t\t});\n\t\t\t\tinstance.register(key);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Call this when you created an entity of this table\n\t\t\t */\n\t\t\tcreated() {\n\t\t\t\tconst key = makePubSubKey({\n\t\t\t\t\ttableName: table.toString(),\n\t\t\t\t\taction: \"created\",\n\t\t\t\t});\n\t\t\t\treturn pubsub.publish(key);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Call this when you removed one or more entities of this table\n\t\t\t */\n\t\t\tremoved(primaryKeyValue?: PrimaryKeyType | PrimaryKeyType[]) {\n\t\t\t\tconst key = makePubSubKey({\n\t\t\t\t\ttableName: table.toString(),\n\t\t\t\t\taction: \"removed\",\n\t\t\t\t\t//TODO would it make sense to use specific sub topics here?\n\t\t\t\t\t// primaryKeyValue,\n\t\t\t\t});\n\t\t\t\treturn pubsub.publish(key);\n\t\t\t},\n\t\t\t/**\n\t\t\t * Call this when you updated one or more entities of this table\n\t\t\t */\n\t\t\tupdated(primaryKeyValue?: PrimaryKeyType | PrimaryKeyType[]) {\n\t\t\t\tconst primaryKeys = Array.isArray(primaryKeyValue)\n\t\t\t\t\t? primaryKeyValue\n\t\t\t\t\t: [primaryKeyValue];\n\t\t\t\tconst keys = primaryKeys.map((primaryKeyValue) =>\n\t\t\t\t\tmakePubSubKey({\n\t\t\t\t\t\ttableName: table.toString(),\n\t\t\t\t\t\taction: \"updated\",\n\t\t\t\t\t\tprimaryKeyValue,\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t\tconst uniqueKeys = Array.from(new Set(keys));\n\t\t\t\tfor (const key of uniqueKeys) {\n\t\t\t\t\tpubsub.publish(key);\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\t};\n\n\treturn {\n\t\tpubsub,\n\t\tmakePubSubInstance,\n\t};\n};\n","import { plural, singular } from \"pluralize\";\nimport { assertFindFirstExists } from \"./helpers/helper\";\nimport {\n\ttype TableIdentifierTSName,\n\ttableHelper,\n} from \"./helpers/tableHelpers\";\nimport type { OrderArgImplementerType } from \"./orderArg\";\nimport type { MakePubSubInstanceType } from \"./pubsub\";\nimport type { SchemaBuilderType } from \"./schemaBuilder\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\n} from \"./types/rumbleInput\";\nimport type { WhereArgImplementerType } from \"./whereArg\";\n\n// TODO: consider removing the whole inject helper thing since we dont need a syntax transform anymore\n\nexport const createQueryImplementer = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n\tSchemaBuilder extends SchemaBuilderType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n\tWhereArgImplementer extends WhereArgImplementerType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n\tOrderArgImplementer extends OrderArgImplementerType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n\tMakePubSubInstance extends MakePubSubInstanceType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n>({\n\tdb,\n\tschemaBuilder,\n\twhereArgImplementer,\n\torderArgImplementer,\n\tmakePubSubInstance,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n\tschemaBuilder: SchemaBuilder;\n\twhereArgImplementer: WhereArgImplementer;\n\torderArgImplementer: OrderArgImplementer;\n\tmakePubSubInstance: MakePubSubInstance;\n}) => {\n\treturn <ExplicitTableName extends TableIdentifierTSName<DB>>({\n\t\ttable,\n\t\treadAction = \"read\" as Action,\n\t\tlistAction = \"read\" as Action,\n\t}: {\n\t\t/**\n\t\t * The table for which to implement the query\n\t\t */\n\t\ttable: ExplicitTableName;\n\t\t/**\n\t\t * Which action should be used for reading single entities\n\t\t * @default \"read\"\n\t\t */\n\t\treadAction?: Action;\n\t\t/**\n\t\t * Which action should be used for listing many entities\n\t\t * @default \"read\"\n\t\t */\n\t\tlistAction?: Action;\n\t}) => {\n\t\tconst WhereArg = whereArgImplementer({\n\t\t\ttable: table,\n\t\t});\n\t\tconst OrderArg = orderArgImplementer({\n\t\t\ttable: table,\n\t\t});\n\t\tconst tableSchema = tableHelper({\n\t\t\tdb,\n\t\t\ttsName: table!,\n\t\t});\n\t\tconst primaryKeyField = Object.values(tableSchema.primaryColumns)[0];\n\n\t\tconst { registerOnInstance } = makePubSubInstance({ table: table });\n\n\t\treturn schemaBuilder.queryFields((t) => {\n\t\t\treturn {\n\t\t\t\t[plural(table.toString())]: t.drizzleField({\n\t\t\t\t\ttype: [table],\n\t\t\t\t\tnullable: false,\n\t\t\t\t\tsmartSubscription: true,\n\t\t\t\t\tsubscribe: (subscriptions, root, args, ctx, info) => {\n\t\t\t\t\t\tregisterOnInstance({\n\t\t\t\t\t\t\tinstance: subscriptions,\n\t\t\t\t\t\t\taction: \"created\",\n\t\t\t\t\t\t});\n\t\t\t\t\t\tregisterOnInstance({\n\t\t\t\t\t\t\tinstance: subscriptions,\n\t\t\t\t\t\t\taction: \"removed\",\n\t\t\t\t\t\t});\n\t\t\t\t\t},\n\t\t\t\t\targs: {\n\t\t\t\t\t\twhere: t.arg({ type: WhereArg, required: false }),\n\t\t\t\t\t\torderBy: t.arg({ type: OrderArg, required: false }),\n\t\t\t\t\t\tlimit: t.arg.int({ required: false }),\n\t\t\t\t\t\toffset: t.arg.int({ required: false }),\n\t\t\t\t\t},\n\t\t\t\t\tresolve: (query, root, args, ctx, info) => {\n\t\t\t\t\t\t// transform null prototyped object\n\t\t\t\t\t\t// biome-ignore lint/style/noParameterAssign: Its really not a problem here\n\t\t\t\t\t\targs = JSON.parse(JSON.stringify(args));\n\t\t\t\t\t\tconst filter = ctx.abilities[table as any].filter(\n\t\t\t\t\t\t\tlistAction,\n\t\t\t\t\t\t\targs.where || args.limit || args.offset\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\tinject: {\n\t\t\t\t\t\t\t\t\t\t\twhere: args.where,\n\t\t\t\t\t\t\t\t\t\t\tlimit: args.limit,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t).query.many;\n\n\t\t\t\t\t\tif (args.offset) {\n\t\t\t\t\t\t\t(filter as any).offset = args.offset;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (args.orderBy) {\n\t\t\t\t\t\t\t(filter as any).orderBy = args.orderBy;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst queryInstance = query(filter as any);\n\n\t\t\t\t\t\tif (filter.columns) {\n\t\t\t\t\t\t\tqueryInstance.columns = filter.columns;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn db.query[table as any].findMany(queryInstance);\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t\t[singular(table.toString())]: t.drizzleField({\n\t\t\t\t\ttype: table,\n\t\t\t\t\tnullable: false,\n\t\t\t\t\tsmartSubscription: true,\n\t\t\t\t\targs: {\n\t\t\t\t\t\t// where: t.arg({ type: WhereArg, required: false }),\n\t\t\t\t\t\tid: t.arg.id({ required: true }),\n\t\t\t\t\t},\n\t\t\t\t\tresolve: (query, root, args, ctx, info) => {\n\t\t\t\t\t\t// transform null prototyped object\n\t\t\t\t\t\targs = JSON.parse(JSON.stringify(args));\n\n\t\t\t\t\t\tconst filter = ctx.abilities[table as any].filter(readAction, {\n\t\t\t\t\t\t\tinject: { where: { [primaryKeyField.name]: args.id } },\n\t\t\t\t\t\t}).query.single;\n\n\t\t\t\t\t\tconst queryInstance = query(filter as any);\n\n\t\t\t\t\t\tif (filter.columns) {\n\t\t\t\t\t\t\tqueryInstance.columns = filter.columns;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn db.query[table as any]\n\t\t\t\t\t\t\t.findFirst(queryInstance)\n\t\t\t\t\t\t\t.then(assertFindFirstExists);\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t};\n\t\t});\n\t};\n};\n","import \"./pluginTypes\";\nimport SchemaBuilder, {\n\tBasePlugin,\n\ttype PothosEnumValueConfig,\n\ttype PothosInputFieldConfig,\n\ttype PothosInterfaceTypeConfig,\n\ttype PothosOutputFieldConfig,\n\ttype PothosTypeConfig,\n\ttype PothosUnionTypeConfig,\n\ttype SchemaTypes,\n} from \"@pothos/core\";\nimport type {\n\tGraphQLFieldResolver,\n\tGraphQLSchema,\n\tGraphQLTypeResolver,\n} from \"graphql\";\nimport { applyFilters } from \"../helpers/helper\";\nimport type { ApplyFiltersField } from \"./pluginTypes\";\n\nconst pluginName = \"ManualFiltersPlugin\";\n\nexport default pluginName;\n\nexport const applyFiltersKey = \"applyFilters\";\n\nexport class ManualFiltersPlugin<\n\tTypes extends SchemaTypes,\n> extends BasePlugin<Types> {\n\toverride wrapResolve(\n\t\tresolver: GraphQLFieldResolver<unknown, Types[\"Context\"], object>,\n\t\tfieldConfig: PothosOutputFieldConfig<Types>,\n\t): GraphQLFieldResolver<unknown, Types[\"Context\"], object> {\n\t\treturn async (parent, args, context, info) => {\n\t\t\t//TODO: https://github.com/hayes/pothos/discussions/1431#discussioncomment-12974130\n\t\t\tconst filters: ApplyFiltersField<Types[\"Context\"], any> = (\n\t\t\t\tfieldConfig?.type as any\n\t\t\t).type?.ref.currentConfig.pothosOptions[applyFiltersKey];\n\n\t\t\t// if no filter should be applied, just continue\n\t\t\tif (!filters || !Array.isArray(filters) || filters.length === 0) {\n\t\t\t\treturn resolver(parent, args, context, info);\n\t\t\t}\n\n\t\t\tconst resolved = await resolver(parent, args, context, info);\n\t\t\tconst allResolvedValues = Array.isArray(resolved) ? resolved : [resolved];\n\t\t\tconst allFilters = Array.isArray(filters) ? filters : [filters];\n\n\t\t\tconst allowed = await applyFilters({\n\t\t\t\tfilters: allFilters,\n\t\t\t\tentities: allResolvedValues,\n\t\t\t\tcontext,\n\t\t\t});\n\n\t\t\t// if the original value was an array, return an array\n\t\t\tif (Array.isArray(resolved)) {\n\t\t\t\treturn allowed;\n\t\t\t}\n\n\t\t\t// if the original value was a single value, return the first allowed\n\t\t\t// or null if not allowed\n\t\t\treturn allowed[0] ?? null;\n\t\t};\n\t}\n}\n\nSchemaBuilder.registerPlugin(pluginName, ManualFiltersPlugin);\n","import type { Table } from \"drizzle-orm\";\nimport { toCamelCase } from \"drizzle-orm/casing\";\nimport { type EnumImplementerType, isEnumSchema } from \"./enum\";\nimport { capitalizeFirstLetter } from \"./helpers/capitalize\";\nimport { mapSQLTypeToGraphQLType } from \"./helpers/sqlTypes/mapSQLTypeToTSType\";\nimport type { PossibleSQLType } from \"./helpers/sqlTypes/types\";\nimport {\n\ttype TableIdentifierTSName,\n\ttableHelper,\n} from \"./helpers/tableHelpers\";\nimport type { SchemaBuilderType } from \"./schemaBuilder\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport { RumbleError } from \"./types/rumbleError\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\n} from \"./types/rumbleInput\";\n\nexport type WhereArgImplementerType<\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n\ttypeof createWhereArgImplementer<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\tSchemaBuilderType<UserContext, DB, RequestEvent, Action, PothosConfig>,\n\t\tEnumImplementerType<UserContext, DB, RequestEvent, Action, PothosConfig>\n\t>\n>;\n\nconst makeDefaultName = (dbName: string) =>\n\t`${capitalizeFirstLetter(toCamelCase(dbName.toString()))}WhereInputArgument`;\n\nexport const createWhereArgImplementer = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n\tSchemaBuilder extends SchemaBuilderType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n\tEnumImplementer extends EnumImplementerType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n>({\n\tdb,\n\tschemaBuilder,\n\tenumImplementer,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n\tenumImplementer: EnumImplementer;\n\tschemaBuilder: SchemaBuilder;\n}) => {\n\tconst referenceStorage = new Map<string, any>();\n\n\tconst whereArgImplementer = <\n\t\tExplicitTableName extends TableIdentifierTSName<DB>,\n\t\tRefName extends string,\n\t>({\n\t\ttable,\n\t\trefName,\n\t\tdbName,\n\t}: Partial<{\n\t\ttable: ExplicitTableName;\n\t\trefName: RefName | undefined;\n\t\tdbName: string;\n\t}> &\n\t\t(\n\t\t\t| {\n\t\t\t\t\ttable: ExplicitTableName;\n\t\t\t }\n\t\t\t| {\n\t\t\t\t\tdbName: string;\n\t\t\t }\n\t\t)) => {\n\t\tconst tableSchema = tableHelper({\n\t\t\tdb,\n\t\t\tdbName,\n\t\t\ttsName: table!,\n\t\t});\n\n\t\tconst inputTypeName = refName ?? makeDefaultName(tableSchema.tsName);\n\n\t\tlet ret: ReturnType<typeof implement> | undefined =\n\t\t\treferenceStorage.get(inputTypeName);\n\t\tif (ret) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tconst implement = () => {\n\t\t\treturn schemaBuilder.inputType(inputTypeName, {\n\t\t\t\tfields: (t) => {\n\t\t\t\t\tconst mapSQLTypeStringToInputPothosType = (\n\t\t\t\t\t\tsqlType: PossibleSQLType,\n\t\t\t\t\t\tfieldName: string,\n\t\t\t\t\t) => {\n\t\t\t\t\t\tconst gqlType = mapSQLTypeToGraphQLType({\n\t\t\t\t\t\t\tsqlType,\n\t\t\t\t\t\t\tfieldName,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tswitch (gqlType) {\n\t\t\t\t\t\t\tcase \"Int\":\n\t\t\t\t\t\t\t\treturn t.field({ type: \"IntWhereInputArgument\" });\n\t\t\t\t\t\t\tcase \"String\":\n\t\t\t\t\t\t\t\treturn t.field({ type: \"StringWhereInputArgument\" });\n\t\t\t\t\t\t\tcase \"Boolean\":\n\t\t\t\t\t\t\t\treturn t.boolean({ required: false });\n\t\t\t\t\t\t\tcase \"Date\":\n\t\t\t\t\t\t\t\treturn t.field({\n\t\t\t\t\t\t\t\t\ttype: \"DateWhereInputArgument\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcase \"DateTime\":\n\t\t\t\t\t\t\t\treturn t.field({\n\t\t\t\t\t\t\t\t\ttype: \"DateWhereInputArgument\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcase \"Float\":\n\t\t\t\t\t\t\t\treturn t.field({\n\t\t\t\t\t\t\t\t\ttype: \"FloatWhereInputArgument\",\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tcase \"ID\":\n\t\t\t\t\t\t\t\treturn t.id({ required: false });\n\t\t\t\t\t\t\tcase \"JSON\":\n\t\t\t\t\t\t\t\treturn t.field({\n\t\t\t\t\t\t\t\t\ttype: \"JSON\",\n\t\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tthrow new RumbleError(\n\t\t\t\t\t\t\t\t\t`Unsupported argument type ${gqlType} for column ${sqlType}`,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tconst fields = Object.entries(tableSchema.columns).reduce(\n\t\t\t\t\t\t(acc, [key, value]) => {\n\t\t\t\t\t\t\tif (isEnumSchema(value)) {\n\t\t\t\t\t\t\t\tconst enumImpl = enumImplementer({\n\t\t\t\t\t\t\t\t\tenumColumn: value,\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tacc[key] = t.field({\n\t\t\t\t\t\t\t\t\ttype: enumImpl,\n\t\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tacc[key] = mapSQLTypeStringToInputPothosType(\n\t\t\t\t\t\t\t\t\tvalue.getSQLType() as PossibleSQLType,\n\t\t\t\t\t\t\t\t\tkey,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{} as Record<\n\t\t\t\t\t\t\tkeyof typeof tableSchema.columns,\n\t\t\t\t\t\t\tReturnType<typeof mapSQLTypeStringToInputPothosType>\n\t\t\t\t\t\t>,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst relations = Object.entries(tableSchema.relations ?? {}).reduce(\n\t\t\t\t\t\t(acc, [key, value]) => {\n\t\t\t\t\t\t\tconst relationSchema = tableHelper({\n\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\ttable: value.targetTable as Table,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tconst referenceModel = whereArgImplementer({\n\t\t\t\t\t\t\t\tdbName: relationSchema.dbName,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tacc[key] = t.field({\n\t\t\t\t\t\t\t\ttype: referenceModel,\n\t\t\t\t\t\t\t\trequired: false,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\treturn acc;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{} as Record<\n\t\t\t\t\t\t\tkeyof typeof tableSchema.columns,\n\t\t\t\t\t\t\tReturnType<typeof mapSQLTypeStringToInputPothosType>\n\t\t\t\t\t\t>,\n\t\t\t\t\t);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...fields,\n\t\t\t\t\t\t...relations,\n\t\t\t\t\t};\n\t\t\t\t},\n\t\t\t});\n\t\t};\n\n\t\tret = implement();\n\t\treferenceStorage.set(inputTypeName, ret);\n\t\treturn ret;\n\t};\n\n\treturn whereArgImplementer;\n};\n\nexport type NumberWhereInputArgument = {\n\teq?: number;\n\tne?: number;\n\tgt?: number;\n\tgte?: number;\n\tlt?: number;\n\tlte?: number;\n\tin?: number[];\n\tnotIn?: number[];\n\tlike?: string;\n\tilike?: string;\n\tnotLike?: string;\n\tnotIlike?: string;\n\tisNull?: boolean;\n\tisNotNull?: boolean;\n\tarrayOverlaps?: number[];\n\tarrayContained?: number[];\n\tarrayContains?: number[];\n\tAND?: NumberWhereInputArgument[];\n\tOR?: NumberWhereInputArgument[];\n\tNOT?: NumberWhereInputArgument;\n};\n\nexport type StringWhereInputArgument = {\n\teq?: string;\n\tne?: string;\n\tgt?: string;\n\tgte?: string;\n\tlt?: string;\n\tlte?: string;\n\tin?: string[];\n\tnotIn?: string[];\n\tlike?: string;\n\tilike?: string;\n\tnotLike?: string;\n\tnotIlike?: string;\n\tisNull?: boolean;\n\tisNotNull?: boolean;\n\tarrayOverlaps?: string[];\n\tarrayContained?: string[];\n\tarrayContains?: string[];\n\tAND?: StringWhereInputArgument[];\n\tOR?: StringWhereInputArgument[];\n\tNOT?: StringWhereInputArgument;\n};\n\nexport type DateWhereInputArgument = {\n\teq?: Date;\n\tne?: Date;\n\tgt?: Date;\n\tgte?: Date;\n\tlt?: Date;\n\tlte?: Date;\n\tin?: Date[];\n\tnotIn?: Date[];\n\tlike?: string;\n\tilike?: string;\n\tnotLike?: string;\n\tnotIlike?: string;\n\tisNull?: boolean;\n\tisNotNull?: boolean;\n\tarrayOverlaps?: Date[];\n\tarrayContained?: Date[];\n\tarrayContains?: Date[];\n\tAND?: DateWhereInputArgument[];\n\tOR?: DateWhereInputArgument[];\n\tNOT?: DateWhereInputArgument;\n};\n\nexport function implementDefaultWhereInputArgs<\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n\tT extends SchemaBuilderType<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>,\n>(schemaBuilder: T) {\n\tconst IntWhereInputArgument = schemaBuilder\n\t\t.inputRef<NumberWhereInputArgument>(\"IntWhereInputArgument\")\n\t\t.implement({\n\t\t\tfields: (t) => ({\n\t\t\t\teq: t.int(),\n\t\t\t\tne: t.int(),\n\t\t\t\tgt: t.int(),\n\t\t\t\tgte: t.int(),\n\t\t\t\tlt: t.int(),\n\t\t\t\tlte: t.int(),\n\t\t\t\tin: t.intList(),\n\t\t\t\tnotIn: t.intList(),\n\t\t\t\tlike: t.string(),\n\t\t\t\tilike: t.string(),\n\t\t\t\tnotLike: t.string(),\n\t\t\t\tnotIlike: t.string(),\n\t\t\t\tisNull: t.boolean(),\n\t\t\t\tisNotNull: t.boolean(),\n\t\t\t\tarrayOverlaps: t.intList(),\n\t\t\t\tarrayContained: t.intList(),\n\t\t\t\tarrayContains: t.intList(),\n\t\t\t\tAND: t.field({\n\t\t\t\t\ttype: [IntWhereInputArgument],\n\t\t\t\t}),\n\t\t\t\tOR: t.field({\n\t\t\t\t\ttype: [IntWhereInputArgument],\n\t\t\t\t}),\n\t\t\t\tNOT: t.field({\n\t\t\t\t\ttype: IntWhereInputArgument,\n\t\t\t\t}),\n\t\t\t}),\n\t\t});\n\n\tconst FloatWhereInputArgument = schemaBuilder\n\t\t.inputRef<NumberWhereInputArgument>(\"FloatWhereInputArgument\")\n\t\t.implement({\n\t\t\tfields: (t) => ({\n\t\t\t\teq: t.float(),\n\t\t\t\tne: t.float(),\n\t\t\t\tgt: t.float(),\n\t\t\t\tgte: t.float(),\n\t\t\t\tlt: t.float(),\n\t\t\t\tlte: t.float(),\n\t\t\t\tin: t.floatList(),\n\t\t\t\tnotIn: t.floatList(),\n\t\t\t\tlike: t.string(),\n\t\t\t\tilike: t.string(),\n\t\t\t\tnotLike: t.string(),\n\t\t\t\tnotIlike: t.string(),\n\t\t\t\tisNull: t.boolean(),\n\t\t\t\tisNotNull: t.boolean(),\n\t\t\t\tarrayOverlaps: t.floatList(),\n\t\t\t\tarrayContained: t.floatList(),\n\t\t\t\tarrayContains: t.floatList(),\n\t\t\t\tAND: t.field({\n\t\t\t\t\ttype: [FloatWhereInputArgument],\n\t\t\t\t}),\n\t\t\t\tOR: t.field({\n\t\t\t\t\ttype: [FloatWhereInputArgument],\n\t\t\t\t}),\n\t\t\t\tNOT: t.field({\n\t\t\t\t\ttype: FloatWhereInputArgument,\n\t\t\t\t}),\n\t\t\t}),\n\t\t});\n\n\tconst StringWhereInputArgument = schemaBuilder\n\t\t.inputRef<StringWhereInputArgument>(\"StringWhereInputArgument\")\n\t\t.implement({\n\t\t\tfields: (t) => ({\n\t\t\t\teq: t.string(),\n\t\t\t\tne: t.string(),\n\t\t\t\tgt: t.string(),\n\t\t\t\tgte: t.string(),\n\t\t\t\tlt: t.string(),\n\t\t\t\tlte: t.string(),\n\t\t\t\tin: t.stringList(),\n\t\t\t\tnotIn: t.stringList(),\n\t\t\t\tlike: t.string(),\n\t\t\t\tilike: t.string(),\n\t\t\t\tnotLike: t.string(),\n\t\t\t\tnotIlike: t.string(),\n\t\t\t\tisNull: t.boolean(),\n\t\t\t\tisNotNull: t.boolean(),\n\t\t\t\tarrayOverlaps: t.stringList(),\n\t\t\t\tarrayContained: t.stringList(),\n\t\t\t\tarrayContains: t.stringList(),\n\t\t\t\tAND: t.field({\n\t\t\t\t\ttype: [StringWhereInputArgument],\n\t\t\t\t}),\n\t\t\t\tOR: t.field({\n\t\t\t\t\ttype: [StringWhereInputArgument],\n\t\t\t\t}),\n\t\t\t\tNOT: t.field({\n\t\t\t\t\ttype: StringWhereInputArgument,\n\t\t\t\t}),\n\t\t\t}),\n\t\t});\n\n\tconst DateWhereInputArgument = schemaBuilder\n\t\t.inputRef<DateWhereInputArgument>(\"DateWhereInputArgument\")\n\t\t.implement({\n\t\t\tfields: (t) => ({\n\t\t\t\teq: t.field({ type: \"Date\" }),\n\t\t\t\tne: t.field({ type: \"Date\" }),\n\t\t\t\tgt: t.field({ type: \"Date\" }),\n\t\t\t\tgte: t.field({ type: \"Date\" }),\n\t\t\t\tlt: t.field({ type: \"Date\" }),\n\t\t\t\tlte: t.field({ type: \"Date\" }),\n\t\t\t\tin: t.field({ type: [\"Date\"] }),\n\t\t\t\tnotIn: t.field({ type: [\"Date\"] }),\n\t\t\t\tlike: t.string(),\n\t\t\t\tilike: t.string(),\n\t\t\t\tnotLike: t.string(),\n\t\t\t\tnotIlike: t.string(),\n\t\t\t\tisNull: t.boolean(),\n\t\t\t\tisNotNull: t.boolean(),\n\t\t\t\tarrayOverlaps: t.field({ type: [\"Date\"] }),\n\t\t\t\tarrayContained: t.field({ type: [\"Date\"] }),\n\t\t\t\tarrayContains: t.field({ type: [\"Date\"] }),\n\t\t\t\tAND: t.field({\n\t\t\t\t\ttype: [DateWhereInputArgument],\n\t\t\t\t}),\n\t\t\t\tOR: t.field({\n\t\t\t\t\ttype: [DateWhereInputArgument],\n\t\t\t\t}),\n\t\t\t\tNOT: t.field({\n\t\t\t\t\ttype: DateWhereInputArgument,\n\t\t\t\t}),\n\t\t\t}),\n\t\t});\n}\n","import SchemaBuilder from \"@pothos/core\";\nimport DrizzlePlugin from \"@pothos/plugin-drizzle\";\nimport SmartSubscriptionsPlugin, {\n\tsubscribeOptionsFromIterator,\n} from \"@pothos/plugin-smart-subscriptions\";\nimport {\n\tDateResolver,\n\tDateTimeISOResolver,\n\tJSONResolver,\n} from \"graphql-scalars\";\nimport type { createPubSub } from \"graphql-yoga\";\nimport type { ContextType } from \"./context\";\nimport ExplicitChecksPlugin from \"./explicitFiltersPlugin/explicitFiltersPlugin\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\n} from \"./types/rumbleInput\";\nimport {\n\ttype DateWhereInputArgument,\n\timplementDefaultWhereInputArgs,\n\ttype NumberWhereInputArgument,\n\ttype StringWhereInputArgument,\n} from \"./whereArg\";\n\nexport type SchemaBuilderType<\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n> = ReturnType<\n\ttypeof createSchemaBuilder<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>\n>[\"schemaBuilder\"];\n\nexport const createSchemaBuilder = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tAction extends string,\n\tPothosConfig extends CustomRumblePothosConfig,\n>({\n\tdb,\n\tdisableDefaultObjects,\n\tpubsub,\n\tpothosConfig,\n}: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig> & {\n\tpubsub: ReturnType<typeof createPubSub>;\n}) => {\n\tconst schemaBuilder = new SchemaBuilder<{\n\t\tContext: ContextType<UserContext, DB, RequestEvent, Action, PothosConfig>;\n\t\tDrizzleRelations: DB[\"_\"][\"relations\"];\n\t\tScalars: {\n\t\t\tJSON: {\n\t\t\t\tInput: unknown;\n\t\t\t\tOutput: unknown;\n\t\t\t};\n\t\t\tDate: {\n\t\t\t\tInput: Date;\n\t\t\t\tOutput: Date;\n\t\t\t};\n\t\t\tDateTime: {\n\t\t\t\tInput: Date;\n\t\t\t\tOutput: Date;\n\t\t\t};\n\t\t};\n\t\tInputs: {\n\t\t\tIntWhereInputArgument: NumberWhereInputArgument;\n\t\t\tFloatWhereInputArgument: NumberWhereInputArgument;\n\t\t\tStringWhereInputArgument: StringWhereInputArgument;\n\t\t\tDateWhereInputArgument: DateWhereInputArgument;\n\t\t};\n\t}>({\n\t\t...pothosConfig,\n\t\tplugins: [\n\t\t\tExplicitChecksPlugin,\n\t\t\tDrizzlePlugin,\n\t\t\tSmartSubscriptionsPlugin,\n\t\t\t...(pothosConfig?.plugins ?? []),\n\t\t],\n\t\tdrizzle: {\n\t\t\tclient: db,\n\t\t\trelations: db._.relations,\n\t\t\tgetTableConfig(table) {\n\t\t\t\t//TODO support composite primary keys\n\t\t\t\treturn {\n\t\t\t\t\tcolumns: Object.values((table as any)[Symbol.for(\"drizzle:Columns\")]),\n\t\t\t\t\tprimaryKeys: Object.values(\n\t\t\t\t\t\t(table as any)[Symbol.for(\"drizzle:Columns\")],\n\t\t\t\t\t).filter((v: any) => v.primary),\n\t\t\t\t} as any;\n\t\t\t},\n\t\t},\n\t\tsmartSubscriptions: {\n\t\t\t...subscribeOptionsFromIterator((name, context) => {\n\t\t\t\treturn pubsub.subscribe(name);\n\t\t\t}),\n\t\t},\n\t});\n\n\tschemaBuilder.addScalarType(\"JSON\", JSONResolver);\n\tschemaBuilder.addScalarType(\"Date\", DateResolver);\n\tschemaBuilder.addScalarType(\"DateTime\", DateTimeISOResolver);\n\timplementDefaultWhereInputArgs(schemaBuilder as any);\n\n\tif (!disableDefaultObjects?.query) {\n\t\tschemaBuilder.queryType({});\n\t}\n\n\tif (!disableDefaultObjects?.subscription) {\n\t\tschemaBuilder.subscriptionType({});\n\t}\n\n\tif (!disableDefaultObjects?.mutation) {\n\t\tschemaBuilder.mutationType({});\n\t}\n\n\treturn { schemaBuilder };\n};\n","import {\n\tcreateYoga as nativeCreateYoga,\n\ttype YogaServerOptions,\n} from \"graphql-yoga\";\nimport { useSofa } from \"sofa-api\";\nimport { createAbilityBuilder } from \"./abilityBuilder\";\nimport { createContextFunction } from \"./context\";\nimport { createEnumImplementer } from \"./enum\";\nimport { lazy } from \"./helpers/lazy\";\nimport { sofaOpenAPIWebhookDocs } from \"./helpers/sofaOpenAPIWebhookDocs\";\nimport { createObjectImplementer } from \"./object\";\nimport { createOrderArgImplementer } from \"./orderArg\";\nimport { createPubSubInstance } from \"./pubsub\";\nimport { createQueryImplementer } from \"./query\";\nimport { createSchemaBuilder } from \"./schemaBuilder\";\nimport type { GenericDrizzleDbTypeConstraints } from \"./types/genericDrizzleDbType\";\nimport type {\n\tCustomRumblePothosConfig,\n\tRumbleInput,\n} from \"./types/rumbleInput\";\nimport { createWhereArgImplementer } from \"./whereArg\";\n\nexport const rumble = <\n\tUserContext extends Record<string, any>,\n\tDB extends GenericDrizzleDbTypeConstraints,\n\tRequestEvent extends Record<string, any>,\n\tPothosConfig extends CustomRumblePothosConfig,\n\tAction extends string = \"read\" | \"update\" | \"delete\",\n>(\n\trumbleInput: RumbleInput<UserContext, DB, RequestEvent, Action, PothosConfig>,\n) => {\n\t// to be able to iterate over the actions, we populate the actions array in case the user does not\n\tif (!rumbleInput.actions) {\n\t\trumbleInput.actions = [\"read\", \"update\", \"delete\"] as Action[];\n\t}\n\n\tif (rumbleInput.defaultLimit === undefined) {\n\t\trumbleInput.defaultLimit = 100;\n\t}\n\n\tconst abilityBuilder = createAbilityBuilder<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>(rumbleInput);\n\n\tconst context = createContextFunction<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\ttypeof abilityBuilder\n\t>({\n\t\t...rumbleInput,\n\t\tabilityBuilder,\n\t});\n\n\tconst { makePubSubInstance, pubsub } = createPubSubInstance<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>({\n\t\t...rumbleInput,\n\t});\n\n\tconst { schemaBuilder } = createSchemaBuilder<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig\n\t>({ ...rumbleInput, pubsub });\n\tconst enum_ = createEnumImplementer<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\ttypeof schemaBuilder\n\t>({\n\t\t...rumbleInput,\n\t\tschemaBuilder,\n\t});\n\tconst whereArg = createWhereArgImplementer<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\ttypeof schemaBuilder,\n\t\ttypeof enum_\n\t>({\n\t\t...rumbleInput,\n\t\tschemaBuilder,\n\t\tenumImplementer: enum_,\n\t});\n\tconst orderArg = createOrderArgImplementer<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\ttypeof schemaBuilder\n\t>({\n\t\t...rumbleInput,\n\t\tschemaBuilder,\n\t});\n\tconst object = createObjectImplementer<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\ttypeof schemaBuilder,\n\t\ttypeof whereArg,\n\t\ttypeof orderArg,\n\t\ttypeof enum_,\n\t\ttypeof makePubSubInstance,\n\t\ttypeof abilityBuilder\n\t>({\n\t\t...rumbleInput,\n\t\tschemaBuilder,\n\t\tmakePubSubInstance,\n\t\twhereArgImplementer: whereArg,\n\t\torderArgImplementer: orderArg,\n\t\tenumImplementer: enum_,\n\t\tabilityBuilder,\n\t});\n\tconst query = createQueryImplementer<\n\t\tUserContext,\n\t\tDB,\n\t\tRequestEvent,\n\t\tAction,\n\t\tPothosConfig,\n\t\ttypeof schemaBuilder,\n\t\ttypeof whereArg,\n\t\ttypeof orderArg,\n\t\ttypeof makePubSubInstance\n\t>({\n\t\t...rumbleInput,\n\t\tschemaBuilder,\n\t\twhereArgImplementer: whereArg,\n\t\torderArgImplementer: orderArg,\n\t\tmakePubSubInstance,\n\t});\n\n\tconst builtSchema = lazy(() => schemaBuilder.toSchema());\n\n\tconst createYoga = (\n\t\targs?:\n\t\t\t| Omit<YogaServerOptions<RequestEvent, any>, \"schema\" | \"context\">\n\t\t\t| undefined,\n\t) =>\n\t\tnativeCreateYoga<RequestEvent>({\n\t\t\t...args,\n\t\t\tschema: builtSchema(),\n\t\t\tcontext,\n\t\t});\n\n\tconst createSofa = (\n\t\targs: Omit<Parameters<typeof useSofa>[0], \"schema\" | \"context\">,\n\t) => {\n\t\tif (args.openAPI) {\n\t\t\targs.openAPI = {\n\t\t\t\t...sofaOpenAPIWebhookDocs,\n\t\t\t\t...args.openAPI,\n\t\t\t};\n\t\t}\n\t\treturn useSofa({\n\t\t\t...args,\n\t\t\tschema: builtSchema(),\n\t\t\tcontext,\n\t\t});\n\t};\n\n\treturn {\n\t\t/**\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\t\tabilityBuilder,\n\t\t/**\n\t\t * The pothos schema builder. See https://pothos-graphql.dev/docs/plugins/drizzle\n\t\t */\n\t\tschemaBuilder,\n\t\t/**\n * Creates the native yoga instance. Can be used to run an actual HTTP server.\n * \n * @example\n * \n * ```ts\n\t * \n import { createServer } from \"node:http\";\n\t\t* const server = createServer(createYoga());\n\t\tserver.listen(3000, () => {\n console.info(\"Visit http://localhost:3000/graphql\");\n\t\t\t});\n\t\t\t* ```\n\t * https://the-guild.dev/graphql/yoga-server/docs#server\n */\n\t\tcreateYoga,\n\t\t/**\n\t\t * Creates a sofa instance to offer a REST API.\n\t\t```ts\n\t\timport express from 'express';\n\t\t\n\t\tconst app = express();\n\t\tconst sofa = createSofa(...);\n\t\t\n\t\tapp.use('/api', useSofa({ schema }));\n\t\t```\n\t\t* https://the-guild.dev/graphql/sofa-api/docs#usage\n\t\t */\n\t\tcreateSofa,\n\t\t/**\n\t\t * A function for creating default objects for your schema\n\t\t */\n\t\tobject,\n\t\t/**\n\t\t * A function for creating where args to filter entities\n\t\t */\n\t\twhereArg,\n\t\t/**\n\t\t * A function for creating order args to sort entities\n\t\t */\n\t\torderArg,\n\t\t/**\n\t\t * A function for creating default READ queries.\n\t\t * Make sure the objects for the table you are creating the queries for are implemented\n\t\t */\n\t\tquery,\n\t\t/**\n\t\t * A function for creating a pubsub instance for a table. Use this to publish or subscribe events\n\t\t */\n\t\tpubsub: makePubSubInstance,\n\t\t/**\n\t\t * A function to implement enums for graphql usage.\n\t\t * The other helpers use this helper internally so in most cases you do not have to\n\t\t * call this helper directly, unless you need the reference to an enum type\n\t\t */\n\t\tenum_,\n\t};\n};\n"]}