pqb 0.72.2 → 0.72.3
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/dist/index.d.ts +2 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/internal.d.ts +2 -3
- package/dist/internal.js.map +1 -1
- package/dist/internal.mjs.map +1 -1
- package/package.json +1 -1
package/dist/internal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.js","names":["toArray","noop","emptyObject","emptyArray","singleQuote","quoteObjectKey","toCamelCase","objectHasValues","toSnakeCase","getFreeAlias","setFreeAlias","Expression","isExpression","Expression","emptyObject","Expression","prepareSubQueryForSql","isExpression","RawSql","Expression","isRawSQL","rawSqlToCode","DynamicRawSQL","emptyObject","raw","setColumnData","setCurrentColumnName","consumeColumnName","Column","emptyObject","raw","addCode","isRawSQL","rawSqlToCode","singleQuote","indexInnerToCode","indexToCode","excludeInnerToCode","excludeToCode","emptyObject","toArray","toSnakeCase","CustomTypeColumn","Column","Operators","singleQuote","setColumnData","DomainColumn","EnumColumn","Column","Operators","setColumnParse","setColumnParseNull","getDateAsNumberFn","getDateAsDateFn","Column","Operators","DateColumn","TimestampColumn","TimestampTZColumn","TimeColumn","IntervalColumn","ArrayColumn","Column","Operators","JSONColumn","Column","Operators","JSONTextColumn","internalSchemaConfig","Column","Operators","DecimalColumn","SmallIntColumn","setColumnData","IntegerColumn","BigIntColumn","RealColumn","DoublePrecisionColumn","SmallSerialColumn","SerialColumn","BigSerialColumn","defaultSchemaConfig","setColumnParse","setColumnParseNull","setColumnData","getDateAsNumberFn","getDateAsDateFn","EnumColumn","ArrayColumn","noop","JSONColumn","JSONTextColumn","SmallIntColumn","IntegerColumn","RealColumn","SmallSerialColumn","SerialColumn","BigIntColumn","DecimalColumn","DoublePrecisionColumn","BigSerialColumn","MoneyColumn","VarCharColumn","TextColumn","StringColumn","CitextColumn","DateColumn","TimestampColumn","TimestampTZColumn","internalSchemaConfig","BooleanColumn","Column","internalSchemaConfig","Operators","moveMutativeQueryToCte","prepareSubQueryForSql","BooleanColumn","Expression","isExpression","emptyArray","Operators","Column","Operators","VarCharColumn","StringColumn","TextColumn","internalSchemaConfig","ByteaColumn","PointColumn","LineColumn","LsegColumn","BoxColumn","PathColumn","PolygonColumn","CircleColumn","MoneyColumn","CidrColumn","InetColumn","MacAddrColumn","MacAddr8Column","BitColumn","BitVaryingColumn","TsVectorColumn","toSnakeCase","quoteObjectKey","setColumnData","TsQueryColumn","RawSql","UUIDColumn","XMLColumn","CitextColumn","RawSql","raw","PostgisGeographyPointColumn","Column","Operators","makeColumnTypes","ByteaColumn","TimeColumn","IntervalColumn","BooleanColumn","PointColumn","LineColumn","LsegColumn","BoxColumn","PathColumn","PolygonColumn","CircleColumn","CidrColumn","InetColumn","MacAddrColumn","MacAddr8Column","BitColumn","BitVaryingColumn","TsVectorColumn","TsQueryColumn","UUIDColumn","XMLColumn","CustomTypeColumn","DomainColumn","PostgisGeographyPointColumn","VirtualColumn","Column","Operators","UnknownColumn","VirtualColumn","internalSchemaConfig","emptyObject","UnknownColumn","pushQueryValueImmutable","getClonedQueryData","_clone","getQueryAs","getFreeAlias","#query","#columnsCache","getQuerySchema","getQuerySchema","getQueryAs","quoteTableWithSchema","RawSql","isExpression","Expression","getDriverErrorCode","getPrimaryKeys","getFreeAlias","_clone","emptyArray","getDriverErrorCode","prepareSubQueryForSql","isExpression","prepareSubQueryForSql","getShapeFromSelect","getQueryAs","cloneQueryBaseUnscoped","getClonedQueryData","prepareSubQueryForSql","isExpression","_queryWhere","_queryWhere","getQueryAs","_clone","getClonedQueryData","prepareSubQueryForSql","getQueryAs","getSqlText","setColumnData","getShapeFromSelect","isExpression","RawSql","cloneQueryBaseUnscoped","UnknownColumn","prepareSubQueryForSql","getShapeFromSelect","setColumnData","JSONTextColumn","internalSchemaConfig","getQueryAs","isExpression","Operators","Expression","UnknownColumn","getQueryAs","cloneQueryBaseUnscoped","_clone","addTopCte","getShapeFromSelect","getQueryAs","getSqlText","prepareSubQueryForSql","_clone","getQueryAs","isExpression","getFreeAlias","RawSql","getQueryAs","isExpression","toArray","quoteTableWithSchema","RawSql","toArray","emptyArray","isExpression","_clone","getPrimaryKeys","quoteTableWithSchema","emptyObject","isExpression","quoteTableWithSchema","isRawSQL","quoteTableWithSchema","isExpression","getQueryAs","getQuerySchema","isExpression","emptyObject","isExpression","isExpression","isExpression","_clone","RawSql","isExpression","emptyArray","setFreeAlias","getSqlText","emptyObject","addTopCteSql","addTopCte","addTopCteSql","addTopCte","quoteTableWithSchema","getQuerySchema","getSqlText","IntegerColumn","internalSchemaConfig","RealColumn","BooleanColumn","TextColumn","JSONTextColumn","XMLColumn","prepareSubQueryForSql","isExpression","_queryInsert"],"sources":["../src/utils.ts","../src/query/expressions/expression.ts","../src/query/expressions/sql-join-expression.ts","../src/query/expressions/sql-ref-expression.ts","../src/query/expressions/raw-sql.ts","../src/columns/column.ts","../src/query/query.ts","../src/columns/column-data-types.ts","../src/columns/code.ts","../src/query/query-columns/query-column-parsers.ts","../src/columns/column-types/custom-type.ts","../src/columns/column-types/enum.ts","../src/columns/column.utils.ts","../src/columns/column-types/date-time.ts","../src/columns/column-types/array.ts","../src/columns/column-types/json.ts","../src/columns/column-types/number.ts","../src/columns/default-schema-config.ts","../src/columns/column-types/boolean.ts","../src/columns/operators.ts","../src/columns/column-types/string.ts","../src/columns/timestamps.ts","../src/columns/column-types/postgis.ts","../src/columns/column-types.ts","../src/columns/column-types/virtual.ts","../src/columns/column-types/unknown.ts","../src/columns/any-shape.ts","../src/query/query-data.ts","../src/query/basic-features/clone/clone.ts","../src/query/basic-features/as/as.ts","../src/query/query-columns/query-columns.ts","../src/query/errors.ts","../src/adapters/features/sql-session-context.ts","../src/query/basic-features/storage/storage.ts","../src/query/basic-features/join/join.sql.ts","../src/query/expressions/select-item-expression.ts","../src/query/query.utils.ts","../src/query/basic-features/transaction/transaction.ts","../src/query/extra-features/hooks/hooks.ts","../src/query/extra-features/data-transform/transform.ts","../src/query/extra-features/computed/computed.ts","../src/adapters/adapter.ts","../src/query/query-columns/primary-keys.ts","../src/query/extra-features/scope/scope.ts","../src/query/internal-features/mutative-queries-select-relation/mutative-queries-select-relations.result-handler.ts","../src/query/then/then.ts","../src/query/extra-features/none/none.ts","../src/query/internal-features/sub-query/sub-query-for-sql.ts","../src/query/basic-features/from/from.ts","../src/query/basic-features/wrap/wrap.ts","../src/query/relations.ts","../src/query/basic-features/where/where.ts","../src/query/extra-features/chain/chain.ts","../src/query/internal-features/sub-query/sub-query.ts","../src/query/basic-features/join/join.ts","../src/query/basic-features/select/hook-select.ts","../src/query/internal-features/mutative-queries-select-relation/mutative-queries-select-relations.qb.ts","../src/query/basic-features/select/select.utils.ts","../src/query/basic-features/get/get.utils.ts","../src/query/basic-features/json/json.utils.ts","../src/query/basic-features/cte/move-mutative-query-to-cte-base.sql.ts","../src/query/extra-features/hooks/hooks.sql.ts","../src/query/internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql.ts","../src/query/basic-features/select/select.sql.ts","../src/query/basic-features/where/where.sql.ts","../src/query/sql/sql-constants.ts","../src/query/basic-features/mutate/insert.sql.ts","../src/query/basic-features/limit-offset/limit-offset.sql.ts","../src/query/basic-features/mutate/update.sql.ts","../src/query/basic-features/mutate/delete.sql.ts","../src/query/basic-features/distinct/distinct.sql.ts","../src/query/extra-features/search/search.sql.ts","../src/query/sql/check-if-a-simple-query.ts","../src/query/basic-features/from/fromAndAs.sql.ts","../src/query/basic-features/having/having.sql.ts","../src/query/basic-features/order/order.sql.ts","../src/query/basic-features/window/window.sql.ts","../src/query/basic-features/union/union.sql.ts","../src/query/basic-features/for/for.sql.ts","../src/query/sql/to-sql.ts","../src/query/basic-features/cte/cte.sql.ts","../src/query/sql/wrap-main-query-in-cte.ts","../src/query/sql/sql.ts","../src/query/sql/column-to-sql.ts","../src/query/basic-features/aggregate/aggregate.ts","../src/query/basic-features/mutate/create.ts","../src/query/basic-features/mutate/create-from.ts"],"sourcesContent":["import url from 'node:url';\nimport path from 'node:path';\nimport { SingleSqlItem } from './query';\n\nexport type UnionToIntersection<U> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (U extends any ? (x: U) => void : never) extends (x: infer I) => void\n ? I\n : never;\n\n// It may be a value or an array of such values.\nexport type MaybeArray<T> = T | T[];\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport interface FnUnknownToUnknown {\n (a: unknown): unknown;\n}\n\n// Utility type to store info to know which keys are available.\n// Use it for cases where you'd want to pick a string union,\n// this record type solves the same use case, but is better at handling the empty case.\nexport interface RecordKeyTrue {\n [K: string]: true;\n}\n\nexport interface RecordString {\n [K: string]: string;\n}\n\nexport interface RecordStringOrNumber {\n [K: string]: string | number;\n}\n\nexport interface RecordOptionalString {\n [K: string]: string | undefined;\n}\n\nexport interface RecordUnknown {\n [K: string]: unknown;\n}\n\nexport interface RecordBoolean {\n [K: string]: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ShallowSimplify<T> = T extends any ? { [K in keyof T]: T[K] } : T;\n\n/**\n * Merge methods from multiple class into another class.\n * @param derivedCtor - target class to merge methods into\n * @param constructors - classes to merge methods from\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function applyMixins(targetClass: any, mixinClasses: any[]) {\n const target = targetClass.prototype;\n for (const mixinClass of mixinClasses) {\n for (const key of Object.getOwnPropertyNames(mixinClass.prototype)) {\n if (key !== 'constructor') {\n target[key] = mixinClass.prototype[key];\n }\n }\n }\n}\n\n/**\n * Join array of strings with '', ignoring empty strings, false, undefined.\n * @param strings - array of strings, or false, or undefined\n */\nexport const joinTruthy = (...strings: (string | false | undefined)[]) => {\n return strings.filter((string) => string).join('');\n};\n\n/**\n * When array is passed, it is returned as is, otherwise, returns a new array with the provided value.\n * @param item - array or a value to turn into array\n */\nexport const toArray = <T>(item: T) =>\n (Array.isArray(item) ? item : [item]) as unknown as T extends unknown[]\n ? T\n : [T];\n\n// Shared doing nothing function\nexport const noop = () => {};\n\nexport const returnArg = <T>(a: T) => a;\n\nexport type EmptyObject = {};\n// Shared empty object to avoid unnecessary allocations\nexport const emptyObject = {};\n\n// Type of empty array\nexport type EmptyTuple = [];\n// Shared empty array to avoid unnecessary allocations\nexport const emptyArray = [];\n\n/**\n * Push a value into an array in the object if it's defined, or set a new array with a single value into the object.\n * Does not mutate the array.\n *\n * @param obj - object that can contain the array by the key\n * @param key - key to access an array in the object\n * @param value - value to push into the array\n */\nexport const pushOrNewArrayToObjectImmutable = (\n obj: object,\n key: string | number,\n value: unknown,\n) => {\n (obj as RecordUnknown)[key] = (obj as RecordUnknown)[key]\n ? [...((obj as RecordUnknown)[key] as unknown[]), value]\n : [value];\n};\n\n/**\n * Set value into the object in data, create the object if it doesn't yet exist.\n * Does not mutate the object.\n *\n * @param q - object\n * @param object - query data key to get the object\n * @param key - object key to set the value into\n * @param value - value to set by the key\n */\nexport const setObjectValueImmutable = <T>(\n q: T,\n object: string,\n key: PropertyKey,\n value: unknown,\n): T => {\n (q as RecordUnknown)[object] = {\n ...((q as RecordUnknown)[object] as RecordUnknown),\n [key]: value,\n };\n return q;\n};\n\nexport const spreadObjectValues = (\n q: object,\n object: string,\n value: RecordUnknown,\n) => {\n (q as RecordUnknown)[object] = {\n ...((q as RecordUnknown)[object] as RecordUnknown),\n ...value,\n };\n};\n\n/**\n * Push value into an array if it's defined, or return a new array with a single value.\n * @param arr - array to push into, or `undefined`\n * @param value - value to push into the array\n */\nexport const pushOrNewArray = <Arr extends unknown[]>(\n arr: Arr | undefined,\n value: Arr[number],\n): Arr => {\n if (arr) {\n arr.push(value);\n return arr;\n } else {\n return [value] as Arr;\n }\n};\n\n/**\n * For code generation: quote a string with a single quote, escape characters.\n * @param s - string to quote\n */\nexport const singleQuote = (s: string) => {\n return `'${s.replaceAll('\\\\', '\\\\\\\\').replaceAll(\"'\", \"\\\\'\")}'`;\n};\n\n/**\n * For code generation: quote string with a backtick, escape characters.\n * @param s - string to quote\n */\nexport const backtickQuote = (s: string) => {\n return `\\`${s.replaceAll('\\\\', '\\\\\\\\').replaceAll('`', '\\\\`')}\\``;\n};\n\n/**\n * For code generation: stringify array of strings using a single quote.\n * @param arr\n */\nexport const singleQuoteArray = (arr: string[]) => {\n return `[${arr.map(singleQuote).join(', ')}]`;\n};\n\n/**\n * For code generation: some strings must be quoted when used as an object key.\n * This function quotes the strings when needed.\n * @param key - object key to quote\n * @param toCamel - change to camel case\n */\nexport const quoteObjectKey = (key: string, toCamel: boolean | undefined) => {\n if (toCamel) key = toCamelCase(key);\n return /^[a-zA-Z_$][\\w$]*$/.test(key) ? key : singleQuote(key);\n};\n\n/**\n * Check if the object has no values that are not `undefined`.\n * @param obj\n */\nexport const isObjectEmpty = (obj: object) => !objectHasValues(obj);\n\n/**\n * Check if the object has at least one value that is not `undefined`.\n * Nulls counts.\n * @param obj - any object\n */\nexport const objectHasValues = (obj?: object) => {\n if (!obj) return false;\n for (const key in obj) {\n if (obj[key as keyof typeof obj] !== undefined) return true;\n }\n return false;\n};\n\n/**\n * If we simply log file path as it is, it may be not clickable in the terminal.\n * On Windows, it is clickable as it is, so it is returned as is.\n * On Linux (at least in my JetBrains editor terminal) it's transformed to URL format to be clickable.\n * @param path - file path\n */\nexport const pathToLog = (path: string) => {\n return process.platform === 'win32'\n ? path\n : url.pathToFileURL(path).toString();\n};\n\n/**\n * Translate a string to camelCase\n * @param str - string to translate\n */\nexport const toCamelCase = (str: string) => {\n return str\n .replace(/^_+/g, '')\n .replace(/_+./g, (a) => a[a.length - 1].toUpperCase())\n .replace(/_+$/g, '');\n};\n\n/**\n * Translate a string to a PascalCase\n * @param str - string to translate\n */\nexport const toPascalCase = (str: string) => {\n const camel = toCamelCase(str);\n return camel[0].toUpperCase() + camel.slice(1);\n};\n\n/**\n * Translate a string to a snake_case.\n * @param str - string to translate\n */\nexport const toSnakeCase = (str: string) => {\n return str.replace(/[A-Z]/g, (a, i) => `${i ? '_' : ''}${a.toLowerCase()}`);\n};\n\n/**\n * Compare two values deeply.\n * undefined and empty object are considered to be equal.\n * @param a - any value\n * @param b - any value\n */\nexport const deepCompare = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n\n if (typeof a !== typeof b) {\n if (a === undefined && typeof b === 'object') {\n a = emptyObject;\n } else if (typeof a === 'object' && b === undefined) {\n b = emptyObject;\n } else {\n return false;\n }\n }\n\n if (typeof a === 'object') {\n if (a === null) {\n return b === null;\n }\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) {\n return false;\n }\n\n return a.every((item, i) => deepCompare(item, (b as unknown[])[i]));\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n for (const key in a) {\n if (!deepCompare((a as RecordUnknown)[key], (b as RecordUnknown)[key])) {\n return false;\n }\n }\n\n for (const key in b as RecordUnknown) {\n if (!(key in a) && (b as RecordUnknown)[key] !== undefined) {\n return false;\n }\n }\n\n return true;\n }\n\n return a === b;\n};\n\n/**\n * Returns a relative path to use as an `import` source to import one file from another.\n * @param from - TS file where we want to place the `import`\n * @param to - TS file that we're importing\n */\nexport const getImportPath = (from: string, to: string) => {\n const rel = path\n .relative(path.dirname(from), to)\n .split(path.sep)\n .join(path.posix.sep);\n\n const importPath =\n rel.startsWith('./') || rel.startsWith('../') ? rel : `./${rel}`;\n\n return importPath.replace(/\\.[tj]s$/, '');\n};\n\n/**\n * Get stack trace to collect info about who called the function\n */\nexport const getStackTrace = (): NodeJS.CallSite[] | undefined => {\n let stack: NodeJS.CallSite[] | undefined;\n const original = Error.prepareStackTrace;\n Error.prepareStackTrace = (_, s) => (stack = s as NodeJS.CallSite[]);\n new Error().stack;\n Error.prepareStackTrace = original;\n return stack;\n};\n\n/**\n * Get a file path of the function which called the function which called this `getCallerFilePath`.\n * Determines file path by error stack trace, skips any paths that are located in `node_modules`.\n * @param stack - optionally provide an existing stack trace\n */\nexport const getCallerFilePath = (\n stack = getStackTrace(),\n): string | undefined => {\n if (stack) {\n const coreLibFile = stack[0]?.getFileName();\n let i = 1;\n if (stack[1]?.getFileName() === coreLibFile) {\n i++;\n }\n // other orchid library that called the function in this file\n const libFile = stack[i]?.getFileName();\n const libDir = libFile && path.dirname(libFile);\n for (; i < stack.length; i++) {\n const item = stack[i];\n let file = item.getFileName();\n if (\n !file ||\n // skip files in the caller orchid library\n path.dirname(file) === libDir ||\n // skip any files in the node_modules\n /\\bnode_modules\\b/.test(file)\n ) {\n continue;\n }\n\n // on Windows with ESM file is file:///C:/path/to/file.ts\n // it is not a valid URL\n if (/file:\\/\\/\\/\\w+:\\//.test(file)) {\n file = decodeURI(file.slice(8));\n } else {\n try {\n file = new URL(file).pathname;\n } catch {}\n }\n\n return file;\n }\n }\n\n return;\n};\n\n/**\n * Call function passing `this` as an argument,\n * micro-optimization for `map` and `forEach` to not define temporary inline function\n * ```ts\n * arrayOfFns.map(callWithThis, argument)\n * ```\n * @param cb\n */\nexport const callWithThis = function <T, R>(this: T, cb: (arg: T) => R): R {\n return cb(this);\n};\n\nexport const pick = <T, Keys extends keyof T>(\n obj: T,\n keys: Keys[],\n): Pick<T, Keys> => {\n const res = {} as T;\n for (const key of keys) {\n res[key] = obj[key];\n }\n return res;\n};\n\nexport const omit = <T, Keys extends keyof T>(\n obj: T,\n keys: Keys[],\n): Omit<T, Keys> => {\n const res = { ...obj };\n for (const key of keys) {\n delete res[key];\n }\n return res;\n};\n\nexport const addValue = (values: unknown[], value: unknown) => {\n values.push(value);\n return `$${values.length}`;\n};\n\nexport const getFreeAlias = (\n obj: RecordUnknown | undefined,\n as: string,\n): string => {\n if (obj?.[as]) {\n let suffix = 2;\n let name;\n while (obj[(name = as + suffix)]) {\n suffix++;\n }\n as = name;\n }\n return as;\n};\n\nexport const setFreeAlias = (\n obj: RecordUnknown,\n as: string,\n value: unknown,\n): string => {\n const key = getFreeAlias(obj, as);\n obj[key] = value;\n return key;\n};\n\nexport const getFreeSetAlias = (\n set: Set<string>,\n as: string,\n start = 2,\n): string => {\n if (set.has(as)) {\n let suffix = start;\n let name;\n while (set.has((name = as + suffix))) {\n suffix++;\n }\n as = name;\n }\n return as;\n};\n\nexport const exhaustive = (_: never) => {\n throw new Error('Condition was not exhaustive');\n};\n\nexport const pluralize = (w: string, count: number, append = 's') => {\n return count === 1 ? w : w + append;\n};\n\nexport const isIterable = (x: unknown): x is Iterable<unknown> =>\n !!(\n x &&\n typeof x === 'object' &&\n typeof x[Symbol.iterator as never] === 'function'\n );\n\nexport const colors = {\n yellow: (s: string) => `\\x1b[33m${s}\\x1b[0m`,\n green: (s: string) => `\\x1b[32m${s}\\x1b[0m`,\n red: (s: string) => `\\x1b[31m${s}\\x1b[0m`,\n blue: (s: string) => `\\x1b[34m${s}\\x1b[0m`,\n bright: (s: string) => `\\x1b[1m${s}\\x1b[0m`,\n blueBold: (s: string) => `\\x1b[1m\\x1b[34m${s}\\x1b[0m`,\n yellowBold: (s: string) => `\\x1b[1m\\x1b[33m${s}\\x1b[0m`,\n greenBold: (s: string) => `\\x1b[1m\\x1b[32m${s}\\x1b[0m`,\n pale: (s: string) => `\\x1b[2m${s}\\x1b[0m`,\n};\n\nexport const commitSql: SingleSqlItem = {\n text: 'COMMIT',\n};\n\nexport const rollbackSql: SingleSqlItem = {\n text: 'ROLLBACK',\n};\n\nexport const quoteIdentifier = (role: string): string => {\n return `\"${role.replace(/\"/g, '\"\"')}\"`;\n};\n","import {\n EmptyObject,\n pushOrNewArrayToObjectImmutable,\n RecordUnknown,\n} from '../../utils';\nimport { Column } from '../../columns/column';\nimport { OperatorToSQL } from '../../columns/operators';\nimport { HasBeforeAndBeforeSet } from '../internal-features/sub-query/sub-query-for-sql';\nimport { PickQuerySelectable } from '../pick-query-types';\nimport { QueryBeforeHook } from '../query-data';\nimport { ToSqlValues } from '../sql/to-sql';\nimport type { QueryDataTransform } from '../extra-features/data-transform/transform';\n\nexport type SelectableOrExpression<\n T extends PickQuerySelectable = PickQuerySelectable,\n C extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n> = '*' | keyof T['__selectable'] | Expression<C>;\n\nexport type SelectableOrExpressions<\n T extends PickQuerySelectable = PickQuerySelectable,\n C extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n> = ('*' | keyof T['__selectable'] | Expression<C>)[];\n\nexport type ExpressionOutput<\n T extends PickQuerySelectable,\n Expr extends SelectableOrExpression<T>,\n> = Expr extends keyof T['__selectable']\n ? T['__selectable'][Expr]['column']\n : Expr extends Expression\n ? Expr['result']['value']\n : never;\n\n// The chain array is used to store a sequence of operators and their arguments, one be one.\n// For example, expression of numeric type may be chained to `lt`, `gt` and similar functions.\nexport type ExpressionChain = (OperatorToSQL | unknown)[];\n\nexport interface ExpressionData extends HasBeforeAndBeforeSet {\n chain?: ExpressionChain;\n expr?: Expression;\n before?: QueryBeforeHook[];\n dynamicBefore?: boolean;\n getColumn?: Column;\n transform?: QueryDataTransform[];\n}\n\n// Base class for the raw SQL and other classes that can produce SQL\nexport abstract class Expression<\n T extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n> {\n // `result` contains an instance of a column type.\n // Starts with underscore to allow having `type` method\n abstract result: { value: T };\n\n abstract q: ExpressionData;\n\n // used in update to prevent non-select sub-queries\n declare meta: { kind: 'select' };\n\n // Produce SQL string by calling `makeSQL` and applying operators from the `q.chain`, push query variables into given `values` array.\n toSQL(ctx: ToSqlValues, quotedAs?: string): string {\n let sql = this.makeSQL(ctx, quotedAs);\n if (this.q.chain) {\n const { chain } = this.q;\n for (let i = 0, len = chain.length; i < len; i += 2) {\n sql = (chain[i] as OperatorToSQL)(\n sql,\n chain[i + 1] as never,\n ctx,\n quotedAs,\n );\n }\n }\n\n return sql;\n }\n\n /**\n * Transform the expression value after loading it.\n *\n * It is meant to transform expressions selected by a query.\n *\n * @param fn - function to transform expression value with\n */\n transform<\n Self extends {\n result: { value: Column.Pick.QueryColumn };\n q: ExpressionData;\n },\n Result,\n >(\n this: Self,\n fn: (\n input: Self['result']['value']['__type'],\n queryData: ExpressionData,\n ) => Result,\n ): Omit<Self, 'result'> & {\n result: { value: Column.Pick.QueryColumnOfType<Result> };\n } {\n pushOrNewArrayToObjectImmutable(this.q, 'transform', fn);\n return this as never;\n }\n\n // `makeSQL` should be implemented on subclasses of Expression to return SQL of the expression.\n // Result of `makeSQL` will be chained with operators by `toSQL`.\n abstract makeSQL(ctx: ToSqlValues, quotedAs?: string): string;\n}\n\n// Check if the unknown thing is an Expression\nexport const isExpression = (arg: unknown): arg is Expression =>\n arg instanceof Expression;\n\n// Object representing SQL query.\n// Constructed by `toSQL`, passed to adapter.query and adapter.array\nexport type TemplateLiteralArgs = [\n strings: TemplateStringsArray,\n ...values: unknown[],\n];\n\n// Check if arguments are a template literal.\nexport const isTemplateLiteralArgs = (\n args: unknown[],\n): args is TemplateLiteralArgs =>\n Array.isArray(args[0]) && 'raw' in args[0] && Array.isArray(args[0].raw);\n\n// Argument type for `sql` function.\n// It can take a template literal, an object `{ raw: string, values?: Record<string, unknown> }`,\n// or a function to build SQL lazily.\nexport type SQLArgs = StaticSQLArgs | [DynamicSQLArg<Column.Pick.QueryColumn>];\n\n// Function for sql method to build SQL lazily (dynamically).\n// May be used for computed column to build a different SQL in different executions.\nexport interface DynamicSQLArg<T extends Column.Pick.QueryColumn> {\n (sql: (...args: StaticSQLArgs) => Expression<T>): Expression<T>;\n}\n\n// SQL arguments for a non-lazy SQL expression.\nexport type StaticSQLArgs =\n | TemplateLiteralArgs\n | [{ raw: string; values?: RawSQLValues }];\n\n// Record of values to pass and store in a RawSql instance.\nexport type RawSQLValues = RecordUnknown;\n\n// `type` method to be used in both static and dynamic variants of SQL expressions.\nexport abstract class ExpressionTypeMethod {\n // Define the resulting column type for the raw SQL.\n type<\n T extends {\n q: { expr?: Expression };\n columnTypes: unknown;\n },\n C extends Column.Pick.QueryColumn,\n >(\n this: T,\n fn: (types: T['columnTypes']) => C,\n ): // Omit is optimal\n Omit<T, 'result'> & { result: { value: C } } {\n const column = fn(this.columnTypes) as unknown as Column;\n (this.q.expr as Expression).result.value = column;\n Object.assign(\n 'baseQuery' in this ? (this.baseQuery as EmptyObject) : this,\n column.operators,\n );\n return this as never;\n }\n}\n\nexport const templateLiteralSQLToCode = (sql: TemplateLiteralArgs): string => {\n let code = '`';\n\n const parts = sql[0];\n let i = 0;\n for (let last = parts.length - 1; i < last; i++) {\n code += parts[i] + `\\${${sql[i + 1]}}`;\n }\n code += parts[i];\n\n return code + '`';\n};\n","import { Column } from '../../columns/column';\nimport { emptyObject } from '../../utils';\nimport { ToSqlValues } from '../sql/to-sql';\nimport { Expression, ExpressionData, ExpressionTypeMethod } from './expression';\nimport { type RawSqlBase } from './raw-sql';\n\nexport interface SqlJoinExpression<T extends Column.Pick.QueryColumn>\n extends Expression<T>, ExpressionTypeMethod {}\n\nexport class SqlJoinExpression<\n T extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n> extends Expression<T> {\n result = { value: emptyObject as T };\n q: ExpressionData = { expr: this };\n\n constructor(\n public items: readonly unknown[],\n public separator?: RawSqlBase,\n ) {\n super();\n }\n\n makeSQL(ctx: ToSqlValues, quotedAs?: string): string {\n let sql = '';\n\n for (let i = 0; i < this.items.length; i++) {\n if (i > 0) {\n sql += this.separator ? this.separator.toSQL(ctx, quotedAs) : ', ';\n }\n\n const item = this.items[i];\n if (item instanceof Expression) {\n sql += item.toSQL(ctx, quotedAs);\n } else {\n ctx.values.push(item);\n sql += `$${ctx.values.length}`;\n }\n }\n\n return sql;\n }\n}\n\nSqlJoinExpression.prototype.type = ExpressionTypeMethod.prototype.type;\n","import { Expression, ExpressionData } from './expression';\nimport { Column } from '../../columns/column';\n\n/**\n * Expression for a SQL identifier reference.\n * Used to safely quote identifiers in raw SQL queries.\n */\nexport class SqlRefExpression extends Expression {\n result = { value: {} as Column.Pick.QueryColumn };\n q: ExpressionData = { expr: this };\n\n constructor(public name: string) {\n super();\n }\n\n makeSQL() {\n // Quote a SQL identifier (table name, column name, schema name, etc.).\n // Handle dots to support qualified names like \"schema.table\" → \"schema\".\"table\".\n // Escape double quotes by doubling them.\n return `\"${this.name.replaceAll('\"', '\"\"').replaceAll('.', '\".\"')}\"`;\n }\n}\n","import {\n DynamicSQLArg,\n Expression,\n ExpressionData,\n ExpressionTypeMethod,\n isExpression,\n isTemplateLiteralArgs,\n RawSQLValues,\n SQLArgs,\n StaticSQLArgs,\n TemplateLiteralArgs,\n templateLiteralSQLToCode,\n} from './expression';\nimport { SqlJoinExpression } from './sql-join-expression';\nimport { SqlRefExpression } from './sql-ref-expression';\nimport { Column } from '../../columns/column';\nimport { ColumnSchemaConfig } from '../../columns/column-schema';\nimport { DefaultColumnTypes } from '../../columns/column-types';\nimport { ToSQLCtx, ToSqlValues } from '../sql/to-sql';\nimport { emptyObject, RecordUnknown } from '../../utils';\nimport { PrepareSubQueryForSql } from '../internal-features/sub-query/sub-query-for-sql';\nimport { SQLQueryArgs } from '../db-sql-query';\n\nlet prepareSubQueryForSql: PrepareSubQueryForSql;\nexport const setRawSqlPrepareSubQueryForSql = (fn: PrepareSubQueryForSql) => {\n prepareSubQueryForSql = fn;\n};\n\n// reuse array to track which variables were used in the SQL, to throw when there are some unused.\nconst used: string[] = [];\nconst literalValues: number[] = [];\n\nexport const templateLiteralToSQL = (\n template: TemplateLiteralArgs,\n ctx: ToSqlValues,\n quotedAs?: string,\n): string => {\n let sql = '';\n const { values } = ctx;\n const parts = template[0];\n literalValues.length = 0;\n\n let i = 0;\n for (let last = parts.length - 1; i < last; i++) {\n sql += parts[i];\n\n const value = template[i + 1];\n if (isExpression(value)) {\n sql += value.toSQL(ctx, quotedAs);\n } else {\n values.push(value);\n literalValues.push(sql.length);\n sql += `$${values.length}`;\n }\n }\n\n return sql + parts[i];\n};\n\nexport interface RawSqlBase<\n T extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n> extends Expression<T> {\n _sql: string | TemplateLiteralArgs;\n _values?: RawSQLValues;\n}\n\n// RawSql extends both Expression and ExpressionTypeMethod, so it needs a separate interface.\nexport interface RawSql<\n T extends Column.Pick.QueryColumn,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ColumnTypes,\n>\n extends Expression<T>, RawSqlBase<T>, ExpressionTypeMethod {}\n\nexport class RawSql<\n T extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n ColumnTypes = DefaultColumnTypes<ColumnSchemaConfig>,\n> extends Expression<T> {\n // Column type instance, it is assigned directly to the prototype of RawSql class.\n declare result: { value: T };\n // Column types are stored to be passed to the `type` callback.\n declare columnTypes: ColumnTypes;\n q: ExpressionData;\n _sql: string | TemplateLiteralArgs;\n _values?: RawSQLValues;\n\n constructor(\n sql: string | TemplateLiteralArgs,\n values?: RawSQLValues,\n type?: T,\n ) {\n super();\n this.q = { expr: this };\n this._sql = sql;\n this._values = values;\n this.result = { value: type as T };\n if (type) {\n Object.assign(this, type.operators);\n }\n }\n\n // Attach query variables to the raw SQL.\n values<Self extends RawSqlBase>(this: Self, values: RawSQLValues): Self {\n this._values = values;\n return this;\n }\n\n // Produce SQL string, push query variables into given `values` array.\n makeSQL(ctx: ToSqlValues, quotedAs?: string): string {\n let sql;\n const isTemplate = typeof this._sql !== 'string';\n\n if (isTemplate) {\n sql = templateLiteralToSQL(\n this._sql as TemplateLiteralArgs,\n ctx,\n quotedAs,\n );\n } else {\n sql = this._sql as string;\n }\n\n const data = this._values;\n if (!data) {\n return sql;\n }\n\n const { values } = ctx;\n const arr = sql.split(\"'\");\n const len = arr.length;\n used.length = 0;\n for (let i = 0; i < len; i += 2) {\n arr[i] = arr[i].replace(/\\$\\$?(\\w+)/g, (match, key, i) => {\n if (isTemplate && literalValues.includes(i)) return match;\n\n const value = data[key];\n if (value === undefined) {\n throw new Error(`Query variable \\`${key}\\` is not provided`);\n }\n\n used.push(key);\n\n if (match.length - key.length === 2) {\n if (typeof value !== 'string') {\n throw new Error(\n `Expected string value for $$${key} SQL keyword, got ${typeof value}`,\n );\n }\n\n return `\"${value.replace('\"', '\"\"').replace('.', '\".\"')}\"`;\n }\n\n values.push(value);\n return `$${values.length}`;\n });\n }\n\n if (used.length > 0 && used.length < Object.keys(data).length) {\n for (const key in data) {\n if (!used.includes(key)) {\n throw new Error(`Query variable \\`${key}\\` is unused`);\n }\n }\n }\n\n return arr.join(\"'\");\n }\n}\n\n// Check if something is a raw SQL.\nexport const isRawSQL = (arg: unknown): arg is RawSqlBase =>\n arg instanceof RawSql;\n\nRawSql.prototype.type = ExpressionTypeMethod.prototype.type;\n\ninterface RawSqlToCodeCtx {\n t: string;\n sql?: string;\n isSqlUsed?: boolean;\n}\n\n// Convert raw SQL to code for a code generator.\nexport const rawSqlToCode = (\n rawSql: RawSqlBase,\n ctx: string | RawSqlToCodeCtx,\n): string => {\n const { _sql: sql, _values: values } = rawSql;\n let code: string;\n\n if (typeof ctx === 'string') {\n code = `${ctx}.sql`;\n } else {\n ctx.isSqlUsed = true;\n code = ctx.sql ?? `${ctx.t}.sql`;\n }\n\n code +=\n typeof sql === 'string'\n ? values\n ? `({ raw: '${sql.replace(/'/g, \"\\\\'\")}' })`\n : `\\`${sql.replace(/`/g, '\\\\`')}\\``\n : templateLiteralSQLToCode(sql);\n\n if (values) {\n code += `.values(${JSON.stringify(values)})`;\n }\n\n return code;\n};\n\n// `DynamicRawSQL` extends both `Expression` and `ExpressionTypeMethod`, so it needs a separate interface.\nexport interface DynamicRawSQL<T extends Column.Pick.QueryColumn>\n extends Expression<T>, ExpressionTypeMethod {}\n\n// Calls the given function to get inner SQL each time when converting to SQL.\nexport class DynamicRawSQL<\n T extends Column.Pick.QueryColumn,\n ColumnTypes = DefaultColumnTypes<ColumnSchemaConfig>,\n> extends Expression<T> {\n declare columnTypes: ColumnTypes;\n result: { value: T } = emptyObject as { value: T };\n q: ExpressionData;\n dynamicBefore = true;\n\n constructor(public fn: DynamicSQLArg<T>) {\n super();\n this.q = { expr: this };\n }\n\n // Calls the given function to get SQL from it.\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n const expr = this.fn(raw as never);\n this.q.beforeSet = this.q.before = undefined;\n const prepared = prepareSubQueryForSql(\n this,\n expr as never,\n ) as unknown as Expression;\n return prepared.toSQL(ctx, quotedAs);\n }\n}\n\nDynamicRawSQL.prototype.type = ExpressionTypeMethod.prototype.type;\n\n/**\n * @deprecated use `sql` instead\n */\nexport function raw<T = never>(\n ...args: StaticSQLArgs\n): RawSql<Column.Pick.QueryColumnOfType<T>>;\n/**\n * @deprecated use `sql` instead\n */\nexport function raw<T = never>(\n ...args: [DynamicSQLArg<Column.Pick.QueryColumnOfType<T>>]\n): DynamicRawSQL<Column.Pick.QueryColumnOfType<T>>;\nexport function raw(...args: SQLArgs) {\n return isTemplateLiteralArgs(args)\n ? new RawSql(args)\n : typeof args[0] === 'function'\n ? new DynamicRawSQL(args[0])\n : new RawSql(args[0].raw, args[0].values);\n}\n\n// Raw SQL count(*) to apply directly to `QueryData.select`.\nexport const countSelect = [new RawSql('count(*)')];\n\nexport function sqlQueryArgsToExpression(args: SQLQueryArgs): RawSqlBase {\n return Array.isArray(args[0])\n ? new RawSql(args as TemplateLiteralArgs)\n : (args[0] as never);\n}\n\nexport interface SqlFn {\n <\n T,\n Args extends\n | TemplateLiteralArgs\n | [sql: string]\n | [values: RecordUnknown, sql?: string],\n >(\n this: T,\n ...args: Args\n ): Args extends [RecordUnknown]\n ? (...sql: TemplateLiteralArgs) => RawSql<Column.Pick.QueryColumn, T>\n : RawSql<Column.Pick.QueryColumn, T>;\n\n /**\n * `sql.join` builds a SQL list from values and expressions.\n * Plain values are bound as query parameters, while SQL expressions render as SQL.\n *\n * Use it for SQL constructs such as `ARRAY[...]`, `IN (...)`, function arguments,\n * or tuple lists. The default separator is `, `. Provide a SQL expression as the\n * custom separator when a different separator is needed.\n *\n * ```ts\n * await db.user.whereSql`\"id\" IN (${sql.join([1, 2, 3])})`;\n * ```\n *\n * ```ts\n * await db.user.whereSql`\n * (${sql.join([sql.ref('name'), sql.ref('age')])}) IN (${sql.join(\n * users.map((user) => sql`(${user.name}, ${user.age})`),\n * )})\n * `;\n * ```\n *\n * ```ts\n * await db.user.select({\n * displayName: (q) =>\n * sql<string>`concat(${sql.join(\n * [q.column('firstName'), q.column('lastName')],\n * sql` || ' ' || `,\n * )})`,\n * });\n * ```\n */\n join<T = unknown>(\n items: readonly unknown[],\n separator?: RawSqlBase,\n ): SqlJoinExpression<Column.Pick.QueryColumnOfType<T>>;\n\n /**\n * `sql.ref` quotes a SQL identifier such as a table name, column name, or schema name.\n * Use it when you need to dynamically reference an identifier in raw SQL.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * const schema = 'my_schema';\n *\n * // Produces: SET LOCAL search_path TO \"my_schema\"\n * await db.$query`SET LOCAL search_path TO ${sql.ref(schema)}`\n * ```\n *\n * It handles dots to support qualified names:\n *\n * ```ts\n * // \"my_schema\".\"my_table\"\n * sql.ref('my_schema.my_table');\n * ```\n */\n ref(name: string): SqlRefExpression;\n unsafe(sql: string | number | boolean): UnsafeSqlExpression;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const sqlFn: SqlFn = ((...args: any[]): any => {\n const arg = args[0];\n if (Array.isArray(arg)) {\n return new RawSql(args as TemplateLiteralArgs);\n }\n\n if (typeof args[0] === 'string') {\n return new RawSql(args[0]);\n }\n\n if (args[1] !== undefined) {\n return new RawSql(args[1], arg);\n }\n\n return (...args: TemplateLiteralArgs) =>\n new RawSql(args, arg as RecordUnknown);\n}) as SqlFn;\n\nsqlFn.ref = (name) => new SqlRefExpression(name);\nsqlFn.join = (items, separator) => new SqlJoinExpression(items, separator);\nsqlFn.unsafe = (sql) => new UnsafeSqlExpression(sql);\n\nexport class UnsafeSqlExpression extends Expression {\n declare result: { value: Column.Pick.QueryColumn };\n q: ExpressionData;\n\n constructor(public sql: string | number | boolean) {\n super();\n this.q = { expr: this };\n }\n\n makeSQL(): string {\n return String(this.sql);\n }\n}\n","import { Query } from '../query/query';\nimport { emptyObject, RecordString, RecordUnknown } from '../utils';\nimport {\n Expression,\n RawSQLValues,\n StaticSQLArgs,\n TemplateLiteralArgs,\n templateLiteralSQLToCode,\n} from '../query/expressions/expression';\nimport { raw, RawSqlBase } from '../query/expressions/raw-sql';\nimport { TableData } from '../tableData';\nimport { ColumnTypeSchemaArg } from './column-schema';\nimport { Code, ColumnToCodeCtx } from './code';\n\nimport { Operator } from './operators';\nimport { PickQueryInputType } from '../query/pick-query-types';\nimport { QueryHookUtils } from '../query/extra-features/hooks/hooks';\nimport type { ColumnDataComputedProp } from '../query';\nimport type { SelectSqlColumn } from '../query/extra-features/select-sql/select-sql';\nimport type { ColumnRefExpression } from '../query/expressions/column-ref-expression';\nimport type { QuerySchema } from '../query/basic-features/schema/schema';\n\nexport namespace Column {\n // marks the column as a primary, this typing is used in onConflict logic\n export interface IsPrimaryKey<Name extends string> {\n data: {\n primaryKey: Name;\n };\n }\n\n // marks the column as unique, this typing is used in onConflict logic\n export type IsUnique<Name extends string> = {\n data: {\n unique: Name;\n };\n };\n\n export type Nullable<T extends Column.Pick.ForNullable> = {\n [K in keyof T]: K extends '__type'\n ? T['__type'] | null\n : K extends '__inputType'\n ? T['__inputType'] | null\n : K extends '__outputType'\n ?\n | T['__outputType']\n | (unknown extends T['__nullType'] ? null : T['__nullType'])\n : K extends '__queryType'\n ? T['__queryType'] | null\n : K extends 'data'\n ? T['data'] & DataNullable\n : K extends 'operators'\n ? {\n [K in keyof T['operators']]: K extends\n | 'equals'\n | 'not'\n | 'isDistinctFrom'\n | 'isNotDistinctFrom'\n ? Operator<T['__queryType'] | null, T>\n : T['operators'][K];\n }\n : T[K];\n };\n\n // marks the column as a nullable, adds `null` type to `type` and `__inputType`\n export type NullableWithSchema<\n T extends Column.Pick.ForNullable,\n InputSchema,\n OutputSchema,\n QuerySchema,\n > = {\n [K in keyof T]: K extends '__type'\n ? T['__type'] | null\n : K extends '__inputType'\n ? T['__inputType'] | null\n : K extends 'inputSchema'\n ? InputSchema\n : K extends '__outputType'\n ?\n | T['__outputType']\n | (unknown extends T['__nullType'] ? null : T['__nullType'])\n : K extends 'outputSchema'\n ? OutputSchema\n : K extends '__queryType'\n ? T['__queryType'] | null\n : K extends 'querySchema'\n ? QuerySchema\n : K extends 'data'\n ? T['data'] & DataNullable\n : K extends 'operators'\n ? {\n [K in keyof T['operators']]: K extends\n | 'equals'\n | 'not'\n | 'isDistinctFrom'\n | 'isNotDistinctFrom'\n ? Operator<T['__queryType'] | null, T>\n : T['operators'][K];\n }\n : T[K];\n };\n\n export type QueryColumnToNullable<C> = {\n [K in keyof C]: K extends '__outputType' | '__queryType'\n ? C[K] | null\n : C[K];\n };\n\n export type QueryColumnToOptional<C> = {\n [K in keyof C]: K extends '__outputType' ? C[K] | undefined : C[K];\n };\n\n interface DataNullable {\n isNullable: true;\n optional: true;\n }\n\n // allow `null` in .where({ column: { equals: null } }) and the same for equality-style operators\n export interface OperatorsNullable<Column extends Column.Pick.QueryColumn> {\n equals: Operator<Column['__queryType'] | null, Column>;\n not: Operator<Column['__queryType'] | null, Column>;\n isDistinctFrom: Operator<Column['__queryType'] | null, Column>;\n isNotDistinctFrom: Operator<Column['__queryType'] | null, Column>;\n }\n\n // change the input type of the column\n export type Encode<T, InputSchema, Input> = {\n [K in keyof T]: K extends '__inputType'\n ? Input\n : K extends 'inputSchema'\n ? InputSchema\n : T[K];\n };\n\n // change the output type of the column\n export type Parse<T extends Pick.ForParse, OutputSchema, Output> = {\n [K in keyof T]: K extends '__outputType'\n ? null extends T['__type']\n ?\n | (Output extends null ? never : Output)\n | (unknown extends T['__nullType'] ? null : T['__nullType'])\n : Output\n : K extends 'outputSchema'\n ? null extends T['__type']\n ? OutputSchema | T['nullSchema']\n : OutputSchema\n : T[K];\n };\n\n // change the output type of null value\n export type ParseNull<\n T extends Column.Pick.ForParseNull,\n NullSchema,\n NullType,\n > = {\n [K in keyof T]: K extends '__outputType'\n ? null extends T['__type']\n ? Exclude<T['__outputType'], null> | NullType\n : T['__outputType']\n : K extends '__nullType'\n ? NullType\n : K extends 'outputSchema'\n ? null extends T['__type']\n ? T['outputSchema'] | NullSchema\n : T['outputSchema']\n : K extends 'nullSchema'\n ? NullSchema\n : T[K];\n };\n\n // adds default type to the column\n // removes the default if the Value is null\n export type HasDefault<T extends Column.Pick.Data> = T & Column.Data.Default;\n\n type DefaultSelectData<T extends Column.Data, Value> = {\n [K in keyof T]: K extends 'explicitSelect'\n ? Value extends true\n ? false\n : true\n : T[K];\n };\n\n // whether to select column by default or with *\n export type DefaultSelect<\n T extends Column.Pick.Data,\n Value extends boolean,\n > = {\n [K in keyof T]: K extends 'data'\n ? DefaultSelectData<T['data'], Value>\n : T[K];\n };\n\n export interface IsAppReadOnly {\n data: {\n appReadOnly: true;\n };\n }\n\n export type Generated<T extends Column.Pick.Data> = {\n [K in keyof T]: K extends 'data'\n ? {\n [K in keyof T['data']]: K extends 'default' ? true : T['data'][K];\n }\n : K extends '__inputType'\n ? never\n : T[K];\n };\n\n export interface Branded<Token extends true | string = true> {\n data: {\n branded: Token;\n };\n }\n\n export namespace Pick {\n export interface Data {\n data: Column.Data;\n }\n\n export interface Type {\n __type: unknown;\n }\n\n export interface OutputType {\n __outputType: unknown;\n }\n\n export interface InputType {\n __inputType: unknown;\n }\n\n export interface DataAndInputType extends Data, InputType {}\n\n export interface NullType {\n __nullType: unknown;\n }\n\n export interface OutputTypeAndOperators extends OutputType {\n operators: unknown;\n }\n\n export interface DataAndDataType extends Data {\n dataType: string;\n }\n\n // Use a lightweight column type across the query builder, this helps TS significantly.\n //\n export interface QueryColumn extends OutputType {\n dataType: string;\n __type: unknown;\n __queryType: unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n operators: any;\n }\n\n export interface QueryColumnOfType<T> {\n dataType: string;\n __type: T;\n __outputType: T;\n __queryType: T;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n operators: any;\n }\n\n export interface QueryColumnOfTypeAndOps<DataType, T, Ops> {\n dataType: DataType;\n __type: T;\n __outputType: T;\n __queryType: T;\n operators: Ops;\n }\n\n export interface QueryColumnOfDataType<\n T extends string,\n > extends QueryColumn {\n dataType: T;\n }\n\n export interface QueryInit extends QueryColumn, InputType {\n data: Column.QueryData;\n }\n\n export interface OutputSchema {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n outputSchema: any;\n }\n\n export interface NullSchema {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nullSchema: any;\n }\n\n export interface TypeSchemas extends OutputSchema, NullSchema {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputSchema: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n querySchema: any;\n }\n\n export interface ForNullable\n extends Data, Type, InputType, OutputType, TypeSchemas {\n __nullType: unknown;\n __queryType: unknown;\n operators: unknown;\n }\n\n export interface ForParse extends Type, NullType, NullSchema {}\n\n export interface ForParseNull extends Type, OutputType, OutputSchema {}\n\n export interface ForValidation extends TypeSchemas, DataAndDataType {}\n }\n\n export namespace Shape {\n export interface Data {\n [K: string]: Column.Pick.Data;\n }\n\n export interface QueryInit {\n [K: string]: Column.Pick.QueryInit;\n }\n\n export interface ForValidation {\n [K: string]: Column.Pick.ForValidation;\n }\n }\n\n export interface QueryColumns {\n [K: string]: Column.Pick.QueryColumn;\n }\n\n export interface QueryColumnsInit {\n [K: string]: Pick.QueryInit;\n }\n\n export namespace ForeignKey {\n export interface TableParamInstance {\n schema?: string;\n table: string;\n nameInDb?: string;\n columns: { shape: unknown };\n }\n\n export interface TableParamInstanceInput {\n schema?: QuerySchema;\n table?: string;\n nameInDb?: string;\n columns: { shape: unknown };\n }\n\n export interface TableParamWithInstance {\n instance(): TableParamInstanceInput;\n }\n\n export interface TableParamWithData {\n data: { columns: unknown };\n instance(): TableParamInstanceInput;\n }\n\n // minimal table class type to use in the foreign key option\n export type TableParam =\n | (new () => TableParamInstance)\n | TableParamWithInstance\n | TableParamWithData;\n\n // string union of available column names of the table\n export type ColumnNameOfTable<Table extends Column.ForeignKey.TableParam> =\n Table extends { data: { columns: infer R } }\n ? keyof R\n : Table extends { instance(): { columns: { shape: infer R } } }\n ? keyof R\n : Table extends new () => { columns: { shape: infer R } }\n ? keyof R\n : never;\n }\n\n export namespace Error {\n // Can be used to customize required and invalidType validation error message on any column.\n // must be a type, because of zod typing\n export interface Messages {\n required?: string;\n invalidType?: string;\n }\n\n export interface Message {\n message?: string;\n }\n\n // Parameter of column types to customize an error message.\n export type StringOrMessage = string | Message;\n }\n\n export interface InputOutputQueryTypes {\n __inputType: unknown;\n __outputType: unknown;\n __queryType: unknown;\n }\n\n export interface InputOutputQueryTypesWithSchemas extends InputOutputQueryTypes {\n inputSchema: unknown;\n outputSchema: unknown;\n querySchema: unknown;\n }\n\n export interface QueryData {\n explicitSelect?: boolean;\n primaryKey?: string;\n unique?: string;\n optional?: true;\n isNullable?: true;\n default?: unknown;\n name?: string;\n readOnly?: boolean;\n appReadOnly: true | undefined;\n branded: true | string | undefined;\n }\n\n // type of data for ColumnType\n export interface Data extends ColumnDataComputedProp {\n // column key is assigned when instantiating a table interface\n key: string;\n\n // name of the column in the database, if different from the code\n name?: string;\n\n // true when is nullable or has a default\n optional: true | undefined;\n\n // is null value allowed\n isNullable?: true;\n\n // true for primary key, string for primary key with a custom name\n primaryKey?: string;\n\n // if column has a default value, then it can be omitted in `create` method\n default: unknown;\n\n // to hide default from generated code\n defaultDefault: unknown;\n\n // if the `default` is a function, instantiating table query will set `runtimeDefault` to wrap the `default` function with `encode` if it is set.\n runtimeDefault?(): unknown;\n\n // column should not be implicitly selected\n explicitSelect?: boolean;\n\n // parse and encode a column to use it `as` another column\n as?: Column.Pick.Data;\n\n unique?: string;\n\n // hook for modifying base query object of the table\n // used for automatic updating of `updatedAt`\n modifyQuery?(q: Query, column: Column.Pick.Data): void;\n\n // raw database check expression\n checks?: Column.Data.Check[];\n\n // if the column is of domain or other user-defined type\n isOfCustomType?: boolean;\n\n // error messages: key is camelCased version of Zod, like invalidType, and the value is the message\n errors?: RecordString;\n\n // identify whether this column is from `timestamps()` helper for codegen purposes\n defaultTimestamp?: 'createdAt' | 'updatedAt';\n\n // alias of the type used as a column function name\n alias?: string;\n\n // name of extension that contains the column type, if it's not standard\n extension?: string;\n\n // encode value passed to `create` to an appropriate value for a database\n encode?(input: any): unknown; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n // parse value from a database into what is preferred by the app\n parse?(input: any): unknown; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n // parse value from a database when it is an element of database array type\n parseItem?(input: string): unknown;\n\n // replaces selected nulls with custom values\n parseNull?(): unknown;\n\n // this is used to cast column types in SQL when wrapping rows as JSON.\n // decimal and similar columns have to be casted to text to not loose precision.\n jsonCast?: string;\n\n // removes the column from update and create, it's for generated and computed columns\n readOnly?: boolean;\n\n // removes the column from update and create, but it is still allowed to be set in the hooks\n appReadOnly: true | undefined;\n\n // set a value on create\n setOnCreate?(arg: QueryHookUtils<PickQueryInputType>): unknown;\n\n // set a value on update\n setOnUpdate?(arg: QueryHookUtils<PickQueryInputType>): unknown;\n\n // set a value on save\n setOnSave?(arg: QueryHookUtils<PickQueryInputType>): unknown;\n\n // postgres internal number modifier, it can be present on custom types.\n typmod?: number;\n\n // virtual columns are read only, and they are ignored in update in create,\n // unlike unknown column that is extending virtual\n virtual?: true;\n\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n validationDefault?: unknown;\n indexes?: TableData.ColumnIndex[];\n excludes?: TableData.ColumnExclude[];\n comment?: string;\n collate?: string;\n compression?: string;\n foreignKeys?: TableData.ColumnReferences[];\n identity?: TableData.Identity;\n // raw SQL for generated columns\n generated?: Data.Generated;\n // computed and generated columns are readonly\n readonly?: boolean;\n valueToArray?: boolean;\n skipValueToArray?: boolean;\n branded: true | string | undefined;\n }\n\n export namespace Data {\n export interface Default {\n data: {\n default: true;\n optional: true;\n };\n }\n\n export interface Check {\n sql: RawSqlBase;\n name?: string;\n }\n\n export interface Generated {\n toSQL(\n ctx: { values: unknown[]; snakeCase: boolean | undefined },\n quotedAs?: string,\n ): string;\n\n toCode(): string;\n }\n }\n\n interface AsTypeArgWithType<Schema> {\n type: Schema;\n input?: Schema;\n output?: Schema;\n query?: Schema;\n }\n\n interface AsTypeArgWithoutType<Schema> {\n input: Schema;\n output: Schema;\n query: Schema;\n }\n\n export type AsTypeArg<Schema> =\n | AsTypeArgWithType<Schema>\n | AsTypeArgWithoutType<Schema>;\n}\n\nexport const getForeignKeyTableInstance = (\n table: Column.ForeignKey.TableParam,\n): Column.ForeignKey.TableParamInstance => {\n const item = 'instance' in table ? table.instance() : new table();\n\n if (!item.table)\n throw new Error('Referenced table is missing table property');\n\n return {\n ...item,\n schema: typeof item.schema === 'function' ? item.schema() : item.schema,\n table: item.table,\n };\n};\n\n// change column type and all schemas to nullable\nexport function makeColumnNullable<\n T extends Column.Pick.ForNullable,\n InputSchema,\n OutputSchema,\n QuerySchema,\n>(\n column: T,\n inputSchema: InputSchema,\n outputSchema: OutputSchema,\n querySchema: QuerySchema,\n) {\n const c = setColumnData(column, 'isNullable', true) as unknown as Column;\n c.inputSchema = inputSchema;\n c.outputSchema = outputSchema;\n c.querySchema = querySchema;\n return c as unknown as Column.NullableWithSchema<\n T,\n InputSchema,\n OutputSchema,\n QuerySchema\n >;\n}\n\n// clone column type and set data to it\nexport const setColumnData = <\n T extends Column.Pick.Data,\n K extends keyof T['data'],\n>(\n q: T,\n key: K,\n value: T['data'][K],\n): T => {\n const cloned = Object.create(q);\n cloned.data = { ...q.data, [key]: value };\n return cloned;\n};\n\n// clone column type and push data to array property of it\nexport const pushColumnData = <\n T extends Column.Pick.Data,\n K extends keyof T['data'],\n>(\n q: T,\n key: K,\n value: unknown,\n) => {\n const arr = q.data[key as keyof typeof q.data] as unknown[];\n return setColumnData(\n q,\n key,\n (arr ? [...arr, value] : [value]) as unknown as T['data'][K],\n );\n};\n\n// Clone a column or a JSON type and set the value in its data.\nexport const setDataValue = <\n T extends Column.Pick.Data,\n Key extends string,\n Value,\n>(\n item: T,\n key: Key,\n value: Value,\n params?: Column.Error.StringOrMessage,\n): T => {\n const cloned = Object.create(item);\n cloned.data = { ...item.data, [key]: value };\n\n if (params && (typeof params === 'string' || params.message)) {\n (cloned.data.errors ??= {})[key] =\n typeof params === 'string' ? params : params.message;\n }\n\n return cloned as T;\n};\n\n// current name of the column, set by `name` method\nlet currentName: string | undefined;\n\n// set current name of the column\nexport function setCurrentColumnName(name: string): void {\n currentName = name;\n}\n\n// consume column name: reset current name and return the value it contained\nexport const consumeColumnName = () => {\n const name = currentName;\n currentName = undefined;\n return name;\n};\n\n// by default, updatedAt and createdAt timestamps are defaulted to now()\nconst defaultNowFn = 'now()';\n\n// stores SQL to use as default for updatedAt and createdAt\nlet currentNowFn = defaultNowFn;\n\n// change default SQL for updatedAt and createdAt\nexport const setDefaultNowFn = (sql: string) => {\n currentNowFn = sql;\n};\n\n// get default SQL for updatedAt and createdAt\nexport const getDefaultNowFn = () => currentNowFn;\n\n// reset default SQL for updatedAt and createdAt to now()\nexport const resetDefaultNowFn = () => {\n currentNowFn = defaultNowFn;\n};\n\n// default language for full text search\nlet defaultLanguage = 'english';\n\n// set default language for full text search\nexport const setDefaultLanguage = (lang?: string) => {\n defaultLanguage = lang || 'english';\n};\n\n// get default language for full text search\nexport const getDefaultLanguage = () => defaultLanguage;\n\nexport abstract class Column {\n abstract __schema: ColumnTypeSchemaArg;\n\n // name of the type in a database\n abstract dataType: string;\n\n // operators supported by the type, that are available in `where` method\n // oxlint-disable-next-line typescript/no-explicit-any\n abstract operators: any;\n\n // turn the column into TS code, used for code generation\n abstract toCode(ctx: ColumnToCodeCtx, key: string): Code;\n\n // Type returned from a database before parsing, it is an output type of db.\n // Unlike `__queryType`, it cannot be a union.\n abstract __type: unknown;\n\n // allowed type for creating and updating, it is processed by `encode` function when it's defined.\n abstract __inputType: unknown;\n\n // type returned from a database and processed by `parse` function when it's defined.\n abstract __outputType: unknown;\n\n // Allowed type to use in `where` and other query methods.\n // Input type of db: timestamp can be sent as a string, a number, or Date (serialized by `pg` driver).\n // It is **not** processed by the ORM, only by a database driver.\n abstract __queryType: unknown;\n\n declare __nullType: unknown;\n declare nullSchema: unknown;\n abstract inputSchema: unknown;\n abstract outputSchema: unknown;\n abstract querySchema: unknown;\n\n // data of the column that specifies column characteristics and validations\n data: Column.Data;\n\n error: this['__schema']['error'];\n\n _parse?: (input: unknown) => unknown;\n\n constructor(\n schema: ColumnTypeSchemaArg,\n // type for validation lib for inserting and updating records\n // public inputSchema: InputSchema = undefined as InputSchema,\n inputSchema: unknown,\n // type for validation lib for selected data\n outputSchema: unknown = inputSchema,\n // type for validation lib for validating filters\n querySchema: unknown = inputSchema,\n ) {\n (this as unknown as RecordUnknown).inputSchema = inputSchema;\n (this as unknown as RecordUnknown).outputSchema = outputSchema;\n (this as unknown as RecordUnknown).querySchema = querySchema;\n this.parse = schema.parse;\n this.parseNull = schema.parseNull;\n this.encode = schema.encode;\n this.asType = schema.asType;\n this.narrowType = schema.narrowType;\n this.narrowAllTypes = schema.narrowAllTypes;\n this.nullable = schema.nullable;\n this.error = schema.error;\n const name = consumeColumnName();\n this.data = (name ? { name } : {}) as Column.Data;\n }\n\n /**\n * Set a default value to a column. Columns that have defaults become optional when creating a record.\n *\n * If you provide a value or a raw SQL, such default should be set on the column in migration to be applied on a database level.\n *\n * Or you can specify a callback that returns a value. This function will be called for each creating record. Such a default won't be applied to a database.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * // values as defaults:\n * int: t.integer().default(123),\n * text: t.text().default('text'),\n *\n * // raw SQL default:\n * timestamp: t.timestamp().default(t.sql`now()`),\n *\n * // runtime default, each new records gets a new random value:\n * random: t.numeric().default(() => Math.random()),\n * }));\n * ```\n *\n * @param value - default value or a function returning a value\n */\n default<\n T extends Column.Pick.DataAndInputType,\n Value extends\n | T['__inputType']\n | null\n | RawSqlBase\n | (() => T['__inputType']),\n >(this: T, value: Value): Column.HasDefault<T> {\n return setColumnData(this, 'default', value) as never;\n }\n\n /**\n * Use `hasDefault` to let the column be omitted when creating records.\n *\n * It's better to use {@link default} instead so the value is explicit and serves as a hint.\n */\n hasDefault<T extends Column.Pick.Data>(this: T): Column.HasDefault<T> {\n return this as never;\n }\n\n /**\n * Set a database-level validation check to a column. `check` accepts a raw SQL.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * // validate rank to be from 1 to 10\n * rank: t.integer().check(t.sql`1 >= \"rank\" AND \"rank\" <= 10`),\n * // constraint name can be passed as a second argument\n * column: t.integer().check(t.sql`...`, 'check_name'),\n * // a single column can have multiple checks\n * multiChecksColumn: t\n * .integer()\n * .check(t.sql`...`)\n * .check(t.sql`...`, 'optional_name'),\n * }));\n * });\n * ```\n *\n * @param sql - raw SQL expression\n * @param name - to specify a constraint name\n */\n check<T extends Column.Pick.Data>(\n this: T,\n sql: RawSqlBase,\n name?: string,\n ): T {\n return pushColumnData(this, 'checks', { sql, name });\n }\n\n /**\n * Use `nullable` to mark the column as nullable. By default, all columns are required.\n *\n * Nullable columns are optional when creating records.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * name: t.integer().nullable(),\n * }));\n * ```\n */\n nullable: this['__schema']['nullable'];\n\n /**\n * Set a custom function to process value for the column when creating or updating a record.\n *\n * The type of `input` argument will be used as the type of the column when creating and updating.\n *\n * If you have a validation library [installed and configured](/guide/columns-validation-methods.html),\n * first argument is a schema to validate the input.\n *\n * ```ts\n * import { z } from 'zod';\n *\n * export const Table = defineTable('table', (t) => ({\n * // encode boolean, number, or string to text before saving\n * column: t\n * .string()\n * // when having validation library, the first argument is a validation schema\n * .encode(\n * z.boolean().or(z.number()).or(z.string()),\n * (input: boolean | number | string) => String(input),\n * )\n * // no schema argument otherwise\n * .encode((input: boolean | number | string) => String(input)),\n * }));\n *\n * // numbers and booleans will be converted to a string:\n * await db.table.create({ column: 123 });\n * await db.table.create({ column: true });\n * await db.table.where({ column: 'true' }).update({ column: false });\n * ```\n *\n * @param fn - function to encode value for a database, argument type is specified by you, return type must be compatible with a database\n */\n encode: this['__schema']['encode'];\n\n /**\n * Set a custom function to process value after loading it from a database.\n *\n * The type of input is the type of column before `.parse`, the resulting type will replace the type of column.\n *\n * If you have a validation library [installed and configured](/guide/columns-validation-methods.html),\n * first argument is a schema for validating the output.\n *\n * For handling `null` values use {@link parseNull} instead or in addition.\n *\n * ```ts\n * import { z } from 'zod';\n * import { number, integer } from 'valibot';\n *\n * export const Table = defineTable('table', (t) => ({\n * columnZod: t\n * .string()\n * // when having validation library, the first argument is a schema\n * .parse(z.number().int(), (input) => parseInt(input))\n * // no schema argument otherwise\n * .parse((input) => parseInt(input)),\n *\n * columnValibot: t\n * .string()\n * .parse(number([integer()]), (input) => parseInt(input))\n * .parse((input) => parseInt(input)),\n * }));\n *\n * // column will be parsed to a number\n * const value: number = await db.table.get('column');\n * ```\n *\n * @param fn - function to parse a value from the database, argument is the type of this column, return type is up to you\n */\n parse: this['__schema']['parse'];\n\n /**\n * Use `parseNull` to specify runtime defaults at selection time.\n *\n * The `parseNull` function is only triggered for `nullable` columns.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * column: t\n * .integer()\n * .parse(String) // parse non-nulls to string\n * .parseNull(() => false), // replace nulls with false\n * .nullable(),\n * }));\n *\n * const record = await db.table.take()\n * record.column // can be a string or boolean, not null\n * ```\n *\n * If you have a validation library [installed and configured](/guide/columns-validation-methods),\n * first argument is a schema for validating the output.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * column: t\n * .integer()\n * .parse(z.string(), String) // parse non-nulls to string\n * .parseNull(z.literal(false), () => false) // replace nulls with false\n * .nullable(),\n * }));\n *\n * const record = await db.table.take();\n * record.column; // can be a string or boolean, not null\n *\n * Table.outputSchema().parse({\n * column: false, // the schema expects strings or `false` literals, not nulls\n * });\n * ```\n */\n parseNull: this['__schema']['parseNull'];\n\n /**\n * This method changes a column type without modifying its behavior.\n * This is needed when converting columns to a validation schema, the converter will pick a different type specified by `.as`.\n *\n * Before calling `.as` need to use `.encode` with the input of the same type as the input of the target column,\n * and `.parse` which returns the correct type.\n *\n * ```ts\n * // column has the same type as t.integer()\n * const column = t\n * .string()\n * .encode((input: number) => input)\n * .parse((text) => parseInt(text))\n * .as(t.integer());\n * ```\n *\n * @param column - other column type to inherit from\n */\n as<\n T extends {\n __inputType: unknown;\n __outputType: unknown;\n data: Column.Data;\n },\n C extends {\n __inputType: T['__inputType'];\n __outputType: T['__outputType'];\n },\n >(this: T, column: C): C {\n return setColumnData(\n this,\n 'as',\n column as unknown as T['data']['as'],\n ) as unknown as C;\n }\n\n /**\n * @deprecated use narrowType instead\n */\n asType: this['__schema']['asType'];\n\n /**\n * `narrowType` narrows TypeScript types of a column. It sets input, output, query type altogether.\n *\n * For example, to narrow a `string` type to a union of string literals.\n *\n * When _not_ integrating with [validation libraries](/guide/columns-validation-methods), `narrowType` has the following syntax:\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * size: t.string().narrowType((t) => t<'small' | 'medium' | 'large'>()),\n * }));\n *\n * // size will be typed as 'small' | 'medium' | 'large'\n * const size = await db.table.get('size');\n * ```\n *\n * - `input` is for `create`, `update` methods.\n * - `output` is for the data that is loaded from a database and parsed if the column has `parse`.\n * - `query` is used in `where` and other query methods, it should be compatible with the actual database column type.\n *\n * When integrating with a [validation library](/guide/columns-validation-methods), also provide validation schemas:\n *\n * ```ts\n * const sizeSchema = z.union([\n * z.literal('small'),\n * z.literal('medium'),\n * z.literal('large'),\n * ]);\n *\n * export const Table = defineTable('table', (t) => ({\n * size: t.text().narrowType(sizeSchema),\n * }));\n *\n * // size will be typed as 'small' | 'medium' | 'large'\n * const size = await db.table.get('size');\n * ```\n *\n * @deprecated use `type` instead\n */\n narrowType: this['__schema']['narrowType'];\n\n /**\n * Allows to narrow different TypeScript types of a column granularly.\n *\n * Use it when the column's input is different from output.\n *\n * When _not_ integrating with [validation libraries](/guide/columns-validation-methods), `narrowAllTypes` has the following syntax:\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * size: t.string().narrowAllTypes((t) =>\n * t<{\n * // what types are accepted when creating/updating\n * input: 'small' | 'medium' | 'large';\n * // how types are retured from a database\n * output: 'small' | 'medium' | 'large';\n * // what types the column accepts in `where` and similar\n * query: 'small' | 'medium' | 'large';\n * }>(),\n * ),\n * }));\n *\n * // size will be typed as 'small' | 'medium' | 'large'\n * const size = await db.table.get('size');\n * ```\n *\n * - `input` is for `create`, `update` methods.\n * - `output` is for the data that is loaded from a database and parsed if the column has `parse`.\n * - `query` is used in `where` and other query methods, it should be compatible with the actual database column type.\n *\n * When integrating with a [validation library](/guide/columns-validation-methods), also provide validation schemas:\n *\n * ```ts\n * const sizeSchema = z.union([\n * z.literal('small'),\n * z.literal('medium'),\n * z.literal('large'),\n * ]);\n *\n * export const Table = defineTable('table', (t) => ({\n * size: t.text().narrowAllTypes({\n * input: sizeSchema,\n * output: sizeSchema,\n * query: sizeSchema,\n * }),\n * }));\n *\n * // size will be typed as 'small' | 'medium' | 'large'\n * const size = await db.table.get('size');\n * ```\n *\n * @deprecated use `type`, `inputType`, `outputType`, `queryType` instead\n */\n narrowAllTypes: this['__schema']['narrowAllTypes'];\n\n brand<T, Token extends true | string = true>(\n this: T,\n _token?: Token,\n ): T & Column.Branded<Token> {\n return this as never;\n }\n\n input<\n T extends { inputSchema: unknown },\n InputSchema extends this['__schema']['__schemaType'],\n >(\n this: T,\n fn: (schema: T['inputSchema']) => InputSchema,\n ): { [K in keyof T]: K extends 'inputSchema' ? InputSchema : T[K] } {\n const cloned = Object.create(this);\n cloned.inputSchema = fn(this.inputSchema);\n return cloned;\n }\n\n output<\n T extends { outputSchema: unknown },\n OutputSchema extends this['__schema']['__schemaType'],\n >(\n this: T,\n fn: (schema: T['outputSchema']) => OutputSchema,\n ): { [K in keyof T]: K extends 'outputSchema' ? OutputSchema : T[K] } {\n const cloned = Object.create(this);\n cloned.outputSchema = fn(this.outputSchema);\n return cloned;\n }\n\n query<\n T extends { querySchema: unknown },\n QuerySchema extends this['__schema']['__schemaType'],\n >(\n this: T,\n fn: (schema: T['querySchema']) => QuerySchema,\n ): { [K in keyof T]: K extends 'querySchema' ? QuerySchema : T[K] } {\n const cloned = Object.create(this);\n cloned.querySchema = fn(this.querySchema);\n return cloned;\n }\n\n /**\n * Set a database column name.\n *\n * @param name - name of the column in database.\n */\n name<T extends Column.Pick.Data>(this: T, name: string): T {\n return setColumnData(this, 'name', name);\n }\n\n /**\n * Append `select(false)` to a column to exclude it from the default selection.\n * It won't be selected with `selectAll` or `select('*')` as well.\n *\n * ```ts\n * export const UserTable = defineTable('user', (t) => ({\n * id: t.identity().primaryKey(),\n * name: t.string(),\n * password: t.string().select(false),\n * }));\n *\n * // only id and name are selected, without password\n * const user = await db.user.find(123);\n *\n * // password is still omitted, even with the wildcard\n * const same = await db.user.find(123).select('*');\n *\n * const comment = await db.comment.find(123).select({\n * // password is omitted in the sub-selects as well\n * author: (q) => q.author,\n * });\n *\n * // password is omitted here as well\n * const created = await db.user.create(userData);\n * ```\n *\n * Such a column can only be selected explicitly.\n *\n * ```ts\n * const userWithPassword = await db.user.find(123).select('*', 'password');\n * ```\n */\n select<T extends Column.Pick.Data, Value extends boolean>(\n this: T,\n value: Value,\n ): Column.DefaultSelect<T, Value> {\n return setColumnData(this, 'explicitSelect', !value) as never;\n }\n\n /**\n * Set SQL to use when selecting this column.\n *\n * The column remains a regular writable database column. Create, update,\n * filters, ordering, grouping, and migrations still use the physical column.\n */\n selectSql<T extends Column.Pick.DataAndDataType, Expr extends Expression>(\n this: T,\n fn: (column: ColumnRefExpression<T & Column.Pick.QueryColumn>) => Expr,\n ): SelectSqlColumn<T, Expr> {\n return setColumnData(this, 'selectSqlFn', fn as never) as never;\n }\n\n /**\n * Forbid the column to be used in [create](/guide/create-update-delete.html#create-insert) and [update](/guide/create-update-delete.html#update) methods.\n *\n * `readOnly` column is still can be set from a [hook](http://localhost:5173/guide/hooks.html#set-values-before-create-or-update).\n *\n * `readOnly` column can be used together with a `default`.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * column: t.string().default(() => 'default value'),\n * another: t.string().nullable().readOnly(),\n * })).init((orm: typeof db, hooks) => {\n * hooks.beforeSave(({ columns, set }) => {\n * if (columns.include('column')) {\n * set({ another: 'value' });\n * }\n * });\n * });\n *\n * // later in the code\n * db.table.create({ column: 'value' }); // TS error, runtime error\n * ```\n */\n readOnly<T>(this: T): T & Column.IsAppReadOnly {\n return setColumnData(this as never, 'appReadOnly', true as never) as never;\n }\n\n /**\n * Set a column value when creating a record.\n * This works for [readOnly](#readonly) columns as well.\n *\n * If no value or undefined is returned, the hook won't have any effect.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * some: t.number(),\n * column: t\n * .string()\n * .setOnCreate(({ columns }) =>\n * columns.include('some') ? 'value' : undefined,\n * ),\n * }));\n * ```\n */\n setOnCreate<T extends Column.Pick.QueryInit>(\n this: T,\n fn: (arg: QueryHookUtils<PickQueryInputType>) => T['__inputType'] | void,\n ): T {\n return setColumnData(this as never, 'setOnCreate', fn as never) as never;\n }\n\n /**\n * Set a column value when updating a record.\n * This works for [readOnly](#readonly) columns as well.\n *\n * If no value or undefined is returned, the hook won't have any effect.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * some: t.number(),\n * column: t\n * .string()\n * .setOnUpdate(({ columns }) =>\n * columns.include('some') ? 'value' : undefined,\n * ),\n * }));\n * ```\n */\n setOnUpdate<T extends Column.Pick.QueryInit>(\n this: T,\n fn: (arg: QueryHookUtils<PickQueryInputType>) => T['__inputType'] | void,\n ): T {\n return setColumnData(this as never, 'setOnUpdate', fn as never) as never;\n }\n\n /**\n * Set a column value when creating or updating a record.\n * This works for [readOnly](#readonly) columns as well.\n *\n * If no value or undefined is returned, the hook won't have any effect.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * some: t.number(),\n * column: t\n * .string()\n * .setOnSave(({ columns }) =>\n * columns.include('some') ? 'value' : undefined,\n * ),\n * }));\n * ```\n */\n setOnSave<T extends Column.Pick.QueryInit>(\n this: T,\n fn: (arg: QueryHookUtils<PickQueryInputType>) => T['__inputType'] | void,\n ): T {\n return setColumnData(this as never, 'setOnSave', fn as never) as never;\n }\n\n /**\n * Mark the column as a primary key.\n * This column type becomes an argument of the `.find` method.\n * So if the primary key is of `integer` type (`identity` or `serial`), `.find` will accept the number,\n * or if the primary key is of `UUID` type, `.find` will expect a string.\n *\n * Using `primaryKey` on a `uuid` column will automatically add a [gen_random_uuid](https://www.postgresql.org/docs/current/functions-uuid.html) default.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * id: t.uuid().primaryKey(),\n * // optionally, specify a database-level constraint name:\n * id: t.uuid().primaryKey('primary_key_name'),\n * }));\n *\n * // primary key can be used by `find` later:\n * db.table.find('97ba9e78-7510-415a-9c03-23d440aec443');\n * ```\n *\n * @param name - to specify a constraint name\n */\n primaryKey<T extends Column.Pick.Data, Name extends string>(\n this: T,\n name?: Name,\n ): T & Column.IsPrimaryKey<Name> {\n return setColumnData(this, 'primaryKey', name ?? (true as never)) as never;\n }\n\n /**\n * Defines a reference between different tables to enforce data integrity.\n *\n * In [snakeCase](/guide/orm-and-query-builder.html#snakecase-option) mode, columns of both tables are translated to a snake_case.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * otherId: t.integer().foreignKey('otherTableName', 'columnName'),\n * }));\n * });\n * ```\n *\n * In the migration it's different from OrchidORM table code where a callback with a table is expected:\n *\n * ```ts\n * export const SomeTable = defineTable('someTable', (t) => ({\n * otherTableId: t.integer().foreignKey(() => OtherTable, 'id'),\n * }));\n * ```\n *\n * Optionally you can pass the third argument to `foreignKey` with options:\n *\n * ```ts\n * type ForeignKeyOptions = {\n * // name of the constraint\n * name?: string;\n * // see database docs for MATCH in FOREIGN KEY\n * match?: 'FULL' | 'PARTIAL' | 'SIMPLE';\n *\n * onUpdate?: 'NO ACTION' | 'RESTRICT' | 'CASCADE' | 'SET NULL' | 'SET DEFAULT';\n * onDelete?: 'NO ACTION' | 'RESTRICT' | 'CASCADE' | 'SET NULL' | 'SET DEFAULT';\n * };\n * ```\n *\n * ## composite foreign key\n *\n * Set foreign key from multiple columns in the current table to corresponding columns in the other table.\n *\n * The first argument is an array of columns in the current table, the second argument is another table name, the third argument is an array of columns in another table, and the fourth argument is for options.\n *\n * Options are the same as in a single-column foreign key.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.integer(),\n * name: t.string(), // string is varchar(255)\n * ...t.foreignKey(\n * ['id', 'name'],\n * 'otherTable',\n * ['foreignId', 'foreignName'],\n * {\n * name: 'constraintName',\n * match: 'FULL',\n * onUpdate: 'RESTRICT',\n * onDelete: 'CASCADE',\n * },\n * ),\n * }));\n * });\n * ```\n *\n * @param fn - function returning a table class\n * @param column - column in the foreign table to connect with\n * @param options - {@link ForeignKeyOptions}\n */\n foreignKey<T, Table extends Column.ForeignKey.TableParam>(\n this: T,\n fn: () => Table,\n column: Column.ForeignKey.ColumnNameOfTable<Table>,\n options?: TableData.References.Options,\n ): T;\n foreignKey<T, Table extends string, Column extends string>(\n this: T,\n table: Table,\n column: Column,\n options?: TableData.References.Options,\n ): T;\n foreignKey(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fnOrTable: any,\n column: string,\n options: TableData.References.Options = emptyObject,\n ) {\n return pushColumnData(this, 'foreignKeys', {\n fnOrTable,\n foreignColumns: [column],\n options,\n });\n }\n\n // format the column into the database type\n toSQL(): string {\n return this.dataType;\n }\n\n /**\n * Add an index to the column.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * // add an index to the name column with default settings:\n * name: t.text().index(),\n * // options are described below:\n * name: t.text().index({ ...options }),\n * // with a database-level name:\n * name: t.text().index({ name: 'custom_index_name', ...indexOptions }),\n * }));\n * });\n * ```\n *\n * Possible options are:\n *\n * ```ts\n * type IndexOptions = {\n * name?: string,\n * // NULLS NOT DISTINCT: availabe in Postgres 15+, makes sense only for unique index\n * nullsNotDistinct?: true;\n * // index algorithm to use such as GIST, GIN\n * using?: string;\n * // specify collation:\n * collate?: string;\n * // see `opclass` in the Postgres document for creating the index\n * opclass?: string;\n * // specify index order such as ASC NULLS FIRST, DESC NULLS LAST\n * order?: string;\n * // include columns to an index to optimize specific queries\n * include?: MaybeArray<string>;\n * // see \"storage parameters\" in the Postgres document for creating an index, for example, 'fillfactor = 70'\n * with?: string;\n * // The tablespace in which to create the index. If not specified, default_tablespace is consulted, or temp_tablespaces for indexes on temporary tables.\n * tablespace?: string;\n * // WHERE clause to filter records for the index\n * where?: string;\n * // mode is for dropping the index\n * mode?: 'CASCADE' | 'RESTRICT';\n * };\n * ```\n *\n * @param args\n */\n index<T extends Column.Pick.Data>(\n this: T,\n ...args: [options?: TableData.Index.ColumnArg]\n ): T {\n const a = args as\n | [options?: RecordUnknown]\n | [name: string, options?: RecordUnknown];\n\n return pushColumnData(this, 'indexes', {\n options:\n (typeof a[0] === 'string' ? { ...a[1], name: a[0] } : a[0]) ??\n emptyObject,\n });\n }\n\n /**\n * `searchIndex` is designed for [full text search](/guide/text-search).\n *\n * It can accept the same options as a regular `index`, but it is `USING GIN` by default, and it is concatenating columns into a `tsvector` database type.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * title: t.text(),\n * body: t.text(),\n * ...t.searchIndex(['title', 'body']),\n * }));\n * });\n * ```\n *\n * Produces the following index ('english' is a default language, see [full text search](/guide/text-search.html#language) for changing it):\n *\n * ```sql\n * CREATE INDEX \"table_title_body_idx\" ON \"table\" USING GIN (to_tsvector('english', \"title\" || ' ' || \"body\"))\n * ```\n *\n * You can set different search weights (`A` to `D`) on different columns inside the index:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * title: t.text(),\n * body: t.text(),\n * ...t.searchIndex([\n * { column: 'title', weight: 'A' },\n * { column: 'body', weight: 'B' },\n * ]),\n * }));\n * });\n * ```\n *\n * When the table has localized columns,\n * you can define different indexes for different languages by setting the `language` parameter:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * titleEn: t.text(),\n * bodyEn: t.text(),\n * titleFr: t.text(),\n * bodyFr: t.text(),\n * ...t.searchIndex(['titleEn', 'bodyEn'], { language: 'english' }),\n * ...t.searchIndex(['titleFr', 'bodyFr'], { language: 'french' }),\n * }));\n * });\n * ```\n *\n * Alternatively, different table records may correspond to a single language,\n * then you can define a search index that relies on a language column by using `languageColumn` parameter:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * lang: t.type('regconfig'),\n * title: t.text(),\n * body: t.text(),\n * ...t.searchIndex(['title', 'body'], { languageColumn: 'lang' }),\n * }));\n * });\n * ```\n *\n * It can be more efficient to use a [generated](/guide/migration-column-methods.html#generated-column) column instead of indexing text column in the way described above,\n * and to set a `searchIndex` on it:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * title: t.text(),\n * body: t.text(),\n * generatedTsVector: t.tsvector().generated(['title', 'body']).searchIndex(),\n * }));\n * });\n * ```\n *\n * Produces the following index:\n *\n * ```sql\n * CREATE INDEX \"table_generatedTsVector_idx\" ON \"table\" USING GIN (\"generatedTsVector\")\n * ```\n *\n * @param options - index options\n */\n searchIndex<T extends { data: Column['data']; dataType: string }>(\n this: T,\n ...args: [options?: TableData.Index.TsVectorColumnArg]\n ): T {\n const a = args as\n | [options?: RecordUnknown]\n | [name: string, options?: RecordUnknown];\n\n return pushColumnData(this, 'indexes', {\n options: {\n ...(typeof a[0] === 'string' ? { ...a[1], name: a[0] } : a[0]),\n ...(this.dataType === 'tsvector'\n ? { using: 'GIN' }\n : { tsVector: true }),\n },\n });\n }\n\n unique<\n T extends Column.Pick.Data,\n const Options extends TableData.Index.UniqueColumnArg,\n >(\n this: T,\n ...args: [options?: Options]\n ): T & Column.IsUnique<Options['name'] & string> {\n const a = args as\n | [options?: RecordUnknown]\n | [name: string, options?: RecordUnknown];\n\n return pushColumnData(this, 'indexes', {\n options: {\n ...(typeof a[0] === 'string' ? { ...a[1], name: a[0] } : a[0]),\n unique: true,\n },\n }) as never;\n }\n\n /**\n * Add [EXCLUDE constraint](https://www.postgresql.org/docs/current/sql-createtable.html#SQL-CREATETABLE-EXCLUDE) to the column.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * // exclude rows with overlapping time ranges, && is for the `WITH` operator\n * timeRange: t.type('tstzrange').exclude('&&'),\n * // with a database-level name:\n * timeRange: t.type('tstzrange').exclude('&&', 'no_overlap'),\n * // with options:\n * timeRange: t.type('tstzrange').exclude('&&', { ...options }),\n * // with name and options:\n * name: t.type('tstzrange').exclude('&&', 'no_overlap', { ...options }),\n * }));\n * });\n * ```\n *\n * Possible options are:\n *\n * ```ts\n * interface ExcludeColumnOptions {\n * // specify collation:\n * collate?: string;\n * // see `opclass` in the Postgres document for creating the index\n * opclass?: string;\n * // specify index order such as ASC NULLS FIRST, DESC NULLS LAST\n * order?: string;\n * // algorithm to use such as GIST, GIN\n * using?: string;\n * // EXCLUDE creates an index under the hood, include columns to the index\n * include?: MaybeArray<string>;\n * // see \"storage parameters\" in the Postgres document for creating an index, for example, 'fillfactor = 70'\n * with?: string;\n * // The tablespace in which to create the constraint. If not specified, default_tablespace is consulted, or temp_tablespaces for indexes on temporary tables.\n * tablespace?: string;\n * // WHERE clause to filter records for the constraint\n * where?: string;\n * // for dropping the index at a down migration\n * dropMode?: DropMode;\n * }\n * ```\n */\n exclude<T extends Column.Pick.Data>(\n this: T,\n op: string,\n ...args: [options?: TableData.Exclude.ColumnArg]\n ): T {\n const a = args as\n | [options?: RecordUnknown]\n | [name: string, options?: RecordUnknown];\n\n return pushColumnData(this, 'excludes', {\n with: op,\n options:\n (typeof a[0] === 'string' ? { ...a[1], name: a[0] } : a[0]) ??\n emptyObject,\n });\n }\n\n comment<T extends Column.Pick.Data>(this: T, comment: string): T {\n return setColumnData(this, 'comment', comment);\n }\n\n compression<T extends Column.Pick.Data>(this: T, compression: string): T {\n return setColumnData(this, 'compression', compression);\n }\n\n collate<T extends Column.Pick.Data>(this: T, collate: string): T {\n return setColumnData(this, 'collate', collate);\n }\n\n modifyQuery<T extends Column.Pick.Data>(this: T, cb: (q: Query) => void): T {\n return setColumnData(this, 'modifyQuery', cb);\n }\n\n /**\n * Define a generated column. `generated` accepts a raw SQL.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * two: t.integer().generated`1 + 1`,\n * }));\n * });\n * ```\n *\n * @param args - raw SQL\n */\n generated<T extends Column.Pick.Data>(\n this: T,\n ...args: StaticSQLArgs\n ): Column.Generated<T> {\n const sql = raw(...args);\n const column = setColumnData(this, 'generated', {\n toSQL(ctx, quoted) {\n return sql.toSQL(ctx, quoted);\n },\n\n toCode() {\n let sql = '.generated';\n\n if (Array.isArray(args[0])) {\n sql += templateLiteralSQLToCode(args as TemplateLiteralArgs);\n } else {\n const { raw, values } = args[0] as {\n raw: string;\n values?: RawSQLValues;\n };\n sql += `({ raw: '${raw.replace(/'/g, \"\\\\'\")}'${\n values ? `, values: ${JSON.stringify(values)}` : ''\n } })`;\n }\n\n return sql;\n },\n });\n column.data.readOnly = true;\n return column as never;\n }\n}\n","import { QueryMethods } from './query-methods';\nimport { QueryData } from './query-data';\nimport { QueryBuilder } from './db';\nimport { Column } from '../columns/column';\nimport { WithDataItems } from './basic-features/cte/cte.sql';\nimport { ColumnsShape } from '../columns';\nimport { QueryInternal } from './query-internal';\nimport {\n PickQueryResult,\n PickQueryResultReturnType,\n PickQueryReturnType,\n PickQuerySelectable,\n PickQueryShape,\n PickQueryTable,\n} from './pick-query-types';\nimport { EmptyObject, RecordKeyTrue, RecordUnknown } from '../utils';\nimport {\n RelationsBase,\n RelationsDataForCreateBase,\n RelationsDataForCreateOptionalBase,\n} from './relations';\nimport { QueryError, QueryErrorName } from './errors';\nimport { Expression } from './expressions/expression';\nimport { GetStringArg } from './basic-features/get/get.utils';\nimport { QueryHasWhere } from './basic-features/where/where';\nimport {\n QueryCatch,\n QueryThen,\n QueryThenByQuery,\n QueryThenShallowSimplify,\n QueryThenShallowSimplifyArr,\n QueryThenShallowSimplifyOptional,\n} from './then/then';\nimport { Order as OrderNamespace } from './basic-features/order/order';\nexport type { Rls, RlsPolicy } from './extra-features/rls/rls.db';\nimport { Grant } from './extra-features/grants/grants.db';\n\nexport interface DbExtension {\n name: string;\n version?: string;\n}\n\nexport interface GeneratorIgnore {\n schemas?: string[];\n enums?: string[];\n domains?: string[];\n extensions?: string[];\n tables?: string[];\n /** Regular views to ignore during migration generation. */\n views?: (string | RegExp)[];\n grants?: Grant.Ignore;\n}\n\nexport interface DbDomainArg<ColumnTypes> {\n (columnTypes: ColumnTypes): Column;\n}\n\nexport interface DbDomainArgRecord {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [K: string]: DbDomainArg<any>;\n}\n\nexport type SelectableFromShape<\n Shape extends Column.QueryColumns,\n Table extends string | undefined,\n> = { [K in keyof Shape]: { as: K; column: Shape[K] } } & {\n [K in keyof Shape & string as `${Table}.${K}`]: {\n as: K;\n column: Shape[K];\n };\n};\n\nexport type QueryReturnType =\n | QueryReturnTypeAll\n | 'one'\n | 'oneOrThrow'\n | 'rows'\n | 'pluck'\n | 'value'\n | 'valueOrThrow'\n | 'void';\n\nexport type QueryReturnTypeAll = undefined | 'all';\n\nexport type QueryReturnTypeOptional = 'one' | 'value';\n\nexport interface QueryHasSelect {\n __hasSelect: true;\n}\n\nexport interface IsQuery {\n __isQuery: true;\n}\n\n// affects on typing of `chain`\nexport interface IsSubQuery {\n __subQuery: true;\n}\n\nexport interface IsQueries {\n [K: string]: IsQuery;\n}\n\nexport interface QueryOrExpression<T> {\n result: { value: Column.Pick.QueryColumnOfType<T> };\n}\n\n// query metadata that is stored only on TS side, not available in runtime\nexport interface QuerySelectable {\n [K: PropertyKey]: { as: string; column: Column.Pick.QueryColumn };\n}\n\nexport interface Query\n extends\n IsQuery,\n PickQueryTable,\n PickQueryShape,\n PickQuerySelectable,\n QueryMethods<unknown> {\n __as: string;\n\n // Commented out for TS optimizations purposes:\n // Single relations (belongsTo, hasOne) returns one when subQuery is true, returns many otherwise.\n // It is of type `true | undefined` when is set.\n // __subQuery: boolean;\n // Union of available full text search aliases to use in `headline` and in `order`.\n // __tsQuery?: string;\n\n // return type of `create`, `update`, `delete` depends on whether the query has select\n __hasSelect: boolean;\n // `update` and `delete` require the query to have `where`.\n // Calling `.all()` is also setting `__hasWhere` to true.\n __hasWhere: boolean;\n // Record<string, true> where keys are columns with defaults for `create` to make them optional.\n __defaults: EmptyObject;\n // Used to determine what scopes are available on the table.\n __scopes: EmptyObject;\n // union of columns to select by default or with *\n __defaultSelect: PropertyKey;\n result: Column.QueryColumns;\n withData: WithDataItems;\n baseQuery: Query;\n internal: QueryInternal;\n returnType: QueryReturnType;\n qb: QueryBuilder;\n columnTypes: unknown;\n __inputType: RecordUnknown;\n q: QueryData;\n then: QueryThen<unknown>;\n catch: QueryCatch;\n windows: EmptyObject;\n relations: RelationsBase;\n relationsDataForCreate: RelationsDataForCreateBase;\n relationsDataForCreateOptional: RelationsDataForCreateOptionalBase;\n relationQueries: IsQueries;\n error: new (\n message: string,\n length: number,\n name: QueryErrorName,\n ) => QueryError;\n\n __readOnly: true | undefined;\n __materialized: true | undefined;\n}\n\nexport namespace Query {\n export interface NotReadOnlyQuery extends Query {\n __readOnly: undefined;\n }\n\n export interface MaterializedQuery extends Query {\n __materialized: true;\n }\n\n export namespace Order {\n export type Arg<T extends OrderNamespace.ArgThis> = OrderNamespace.Arg<T>;\n export type Args<T extends OrderNamespace.ArgThis> = OrderNamespace.Args<T>;\n }\n\n export namespace Pick {\n export interface ReturnType {\n returnType: QueryReturnType;\n }\n\n export interface SingleValueResult {\n result: { value: Column.Pick.OutputType };\n returnType: 'value' | 'valueOrThrow';\n }\n\n export interface IsNotReadOnly {\n __readOnly: undefined;\n }\n\n export interface IsMaterialized {\n __materialized: true;\n }\n }\n}\n\nexport type SelectableOfType<T extends PickQuerySelectable, Type> = {\n [K in keyof T['__selectable']]: T['__selectable'][K]['column']['__type'] extends Type | null\n ? K\n : never;\n}[keyof T['__selectable']];\n\nexport type SelectableOrExpressionOfType<\n T extends PickQuerySelectable,\n C extends Column.Pick.Type,\n> =\n | SelectableOfType<T, C['__type']>\n | Expression<Column.Pick.QueryColumnOfType<C['__type'] | null>>;\n\nexport const queryTypeWithLimitOne: RecordKeyTrue = {\n one: true,\n oneOrThrow: true,\n value: true,\n valueOrThrow: true,\n};\n\n// Change the query type to return multiple object records.\n// It wraps the query with `WhereResult` to allow updating and deleting all records when the `all` method is used.\nexport type SetQueryReturnsAll<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'all'\n : K extends 'then'\n ? QueryThenShallowSimplifyArr<ColumnsShape.Output<T['result']>>\n : T[K];\n} & QueryHasWhere;\n\nexport type SetQueryReturnsAllResult<\n T extends PickQueryResult,\n Result extends Column.QueryColumns,\n> = {\n [K in keyof T]: K extends 'returnType'\n ? 'all'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThenShallowSimplifyArr<T['result']>\n : T[K];\n} & QueryHasWhere;\n\nexport type QueryTakeOptional<T extends PickQueryResultReturnType> =\n T['returnType'] extends 'value' | 'pluck' | 'void'\n ? T\n : T['returnType'] extends 'valueOrThrow'\n ? {\n [K in keyof T]: K extends 'returnType'\n ? 'value'\n : K extends 'then'\n ? QueryThen<T['result']['value']['__outputType'] | undefined>\n : T[K];\n }\n : {\n [K in keyof T]: K extends 'returnType'\n ? 'one'\n : K extends 'then'\n ? QueryThenShallowSimplifyOptional<\n ColumnsShape.Output<T['result']>\n >\n : T[K];\n };\n\nexport type QueryManyTakeOptional<T extends PickQueryResultReturnType> = {\n [K in keyof T]: K extends 'returnType'\n ? 'one'\n : K extends 'then'\n ? QueryThenShallowSimplifyOptional<ColumnsShape.Output<T['result']>>\n : T[K];\n};\n\nexport type QueryRequire<T extends PickQueryResultReturnType> =\n T['returnType'] extends QueryReturnTypeAll | 'valueOrThrow' | 'pluck' | 'void'\n ? T\n : T['returnType'] extends 'value'\n ? {\n [K in keyof T]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<\n Exclude<T['result']['value']['__outputType'], undefined>\n >\n : T[K];\n }\n : {\n [K in keyof T]: K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'then'\n ? QueryThenShallowSimplify<ColumnsShape.Output<T['result']>>\n : T[K];\n };\n\nexport type QueryTake<T extends PickQueryResultReturnType> =\n T['returnType'] extends 'valueOrThrow' | 'pluck' | 'void'\n ? T\n : T['returnType'] extends 'value'\n ? {\n [K in keyof T]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<\n Exclude<T['result']['value']['__outputType'], undefined>\n >\n : T[K];\n }\n : {\n [K in keyof T]: K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'then'\n ? QueryThenShallowSimplify<ColumnsShape.Output<T['result']>>\n : T[K];\n };\n\nexport type QueryManyTake<T extends PickQueryResultReturnType> = {\n [K in keyof T]: K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'then'\n ? QueryThenShallowSimplify<ColumnsShape.Output<T['result']>>\n : T[K];\n};\n\nexport type SetQueryReturnsOne<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'then'\n ? QueryThenShallowSimplify<ColumnsShape.Output<T['result']>>\n : T[K];\n};\n\nexport type SetQueryReturnsOneResult<\n T extends PickQueryResult,\n Result extends Column.QueryColumns,\n> = {\n [K in keyof T]: K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThenShallowSimplify<ColumnsShape.Output<Result>>\n : T[K];\n};\n\nexport type SetQueryReturnsRows<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'rows'\n : K extends 'then'\n ? QueryThen<ColumnsShape.Output<T['result']>[keyof T['result']][][]>\n : T[K];\n};\n\nexport type SetQueryReturnsPluck<\n T extends PickQuerySelectable,\n S extends keyof T['__selectable'] | Expression,\n> = S extends keyof T['__selectable']\n ? {\n [K in keyof T]: K extends '__hasSelect'\n ? true\n : K extends 'result'\n ? {\n pluck: T['__selectable'][S]['column'];\n }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'then'\n ? QueryThen<T['__selectable'][S]['column']['__outputType'][]>\n : T[K];\n }\n : {\n [K in keyof T]: K extends '__hasSelect'\n ? true\n : K extends 'result'\n ? {\n pluck: S extends Expression ? S['result']['value'] : never;\n }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'then'\n ? QueryThen<\n (S extends Expression\n ? S['result']['value']['__outputType']\n : never)[]\n >\n : T[K];\n };\n\nexport type SetValueQueryReturnsPluckColumn<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'result'\n ? { pluck: T['result']['value'] }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'then'\n ? QueryThen<T['result']['value']['__outputType'][]>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsPluckColumnResult<\n T extends PickQueryResult,\n Result extends Column.QueryColumns,\n> = {\n [K in keyof T]: K extends 'result'\n ? { pluck: T['result']['value'] }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<T['result']['value']['__outputType'][]>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsValueOrThrow<\n T extends PickQuerySelectable,\n Arg extends keyof T['__selectable'],\n> = SetQueryReturnsColumnOrThrow<T, T['__selectable'][Arg]['column']> &\n T['__selectable'][Arg]['column']['operators'];\n\nexport type SetValueQueryReturnsValueOrThrow<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<T['result']['value']['__outputType']>\n : T[K];\n};\n\nexport type SetQueryReturnsValueOptional<\n T extends PickQuerySelectable,\n Arg extends GetStringArg<T>,\n> = SetQueryReturnsColumnOptional<\n T,\n {\n [K in keyof T['__selectable'][Arg]['column']]: K extends '__outputType'\n ? T['__selectable'][Arg]['column'][K] | undefined\n : T['__selectable'][Arg]['column'][K];\n }\n> &\n Omit<T['__selectable'][Arg]['column']['operators'], 'equals' | 'not'> &\n Column.OperatorsNullable<T['__selectable'][Arg]['column']>;\n\nexport type SetQueryReturnsColumnOrThrow<\n T,\n Column extends Column.Pick.OutputType,\n> = {\n [K in keyof T]: K extends 'result'\n ? { value: Column }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<Column['__outputType']>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsColumnOptional<\n T,\n Column extends Column.Pick.OutputType,\n> = {\n [K in keyof T]: K extends 'result'\n ? { value: Column }\n : K extends 'returnType'\n ? 'value'\n : K extends 'then'\n ? QueryThen<Column['__outputType'] | undefined>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsColumn<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'result'\n ? { value: T['result']['pluck'] }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<T['result']['pluck']['__outputType']>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsColumnResult<\n T extends PickQueryResult,\n Result extends Column.QueryColumns,\n> = {\n [K in keyof T]: K extends 'result'\n ? { value: T['result']['pluck'] }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<Result['pluck']['__outputType']>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsRowCount<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'result'\n ? { value: Column.Pick.QueryColumnOfType<number> }\n : K extends 'then'\n ? QueryThen<number>\n : T[K];\n};\n\nexport type SetQueryReturnsRowCountMany<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'pluck'\n : K extends 'result'\n ? { pluck: Column.Pick.QueryColumnOfType<number> }\n : K extends 'then'\n ? QueryThen<number>\n : T[K];\n};\n\nexport type SetQueryReturnsVoid<T> = {\n [K in keyof T]: K extends 'returnType'\n ? 'void'\n : K extends 'then'\n ? QueryThen<void>\n : T[K];\n};\n\nexport type SetQueryResult<\n T extends PickQueryReturnType,\n Result extends Column.QueryColumns,\n> = {\n [K in keyof T]: K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThenByQuery<T, Result>\n : T[K];\n};\n\nexport interface ReturnsQueryOrExpression<T> {\n (): QueryOrExpression<T>;\n}\n\nexport interface QueryOrExpressionBooleanOrNullResult {\n result: { value: Column.Pick.QueryColumnOfType<boolean | null> };\n}\n\nexport const isQueryReturnsAll = (q: Query) =>\n !q.q.returnType || q.q.returnType === 'all';\n\nexport const isQuery = (q: unknown): q is IsQuery =>\n !!q && typeof q === 'object' && '__isQuery' in q && q.__isQuery === true;\n","import { Column } from './column';\n\n// method names for numeric columns and JSON types to generate methods' code\nexport const numberMethodNames: (keyof AdditionalNumberData)[] = [\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'step',\n 'int',\n 'finite',\n 'safe',\n];\n\nexport interface AdditionalNumberData {\n lt?: number;\n lte?: number;\n gt?: number;\n gte?: number;\n step?: number;\n int?: boolean;\n finite?: boolean;\n safe?: boolean;\n}\n\n// numeric column and JSON type data for validations\nexport interface BaseNumberData extends Column.Data, AdditionalNumberData {}\n\n// method names for string columns and JSON types to generate methods' code\nexport const stringMethodNames: (keyof AdditionalStringData)[] = [\n 'nonEmpty',\n 'min',\n 'max',\n 'length',\n 'email',\n 'url',\n 'emoji',\n 'uuid',\n 'cuid',\n 'cuid2',\n 'ulid',\n 'regex',\n 'includes',\n 'startsWith',\n 'endsWith',\n 'datetime',\n 'ipv4',\n 'ipv6',\n 'trim',\n 'toLowerCase',\n 'toUpperCase',\n];\n\nexport interface AdditionalStringData {\n min?: number;\n max?: number;\n length?: number;\n email?: boolean;\n url?: boolean;\n emoji?: boolean;\n uuid?: boolean;\n cuid?: boolean;\n cuid2?: boolean;\n ulid?: boolean;\n regex?: RegExp;\n includes?: string;\n startsWith?: string;\n endsWith?: string;\n datetime?: {\n offset?: boolean;\n precision?: number;\n };\n ipv4?: true;\n ipv6?: true;\n nonEmpty?: boolean;\n trim?: boolean;\n toLowerCase?: boolean;\n toUpperCase?: boolean;\n}\n\n// string column and JSON type data for validations\nexport interface StringData extends Column.Data, AdditionalStringData {}\n\n// method names for date columns to generate methods' code\nexport const dateMethodNames: (keyof AdditionalDateData)[] = ['min', 'max'];\n\nexport interface AdditionalDateData {\n min?: Date;\n max?: Date;\n}\n\n// date column data for validations\nexport interface DateColumnData extends Column.Data, AdditionalDateData {}\n\n// method names for array column and JSON type to generate methods' code\nexport const arrayMethodNames: (keyof ArrayMethodsData)[] = [\n 'min',\n 'max',\n 'length',\n 'nonEmpty',\n];\n\n// array column and JSON type data for validations\nexport interface ArrayMethodsData {\n min?: number;\n max?: number;\n length?: number;\n nonEmpty?: boolean;\n}\n\nexport interface ArrayMethodsDataForBaseColumn\n extends Column.Data, ArrayMethodsData {}\n","import { Column, getForeignKeyTableInstance } from './column';\nimport {\n emptyArray,\n emptyObject,\n objectHasValues,\n quoteObjectKey,\n RecordKeyTrue,\n RecordString,\n singleQuote,\n singleQuoteArray,\n toArray,\n toSnakeCase,\n} from '../utils';\nimport { TableData } from '../tableData';\nimport {\n arrayMethodNames,\n ArrayMethodsDataForBaseColumn,\n BaseNumberData,\n DateColumnData,\n dateMethodNames,\n numberMethodNames,\n StringData,\n stringMethodNames,\n} from './column-data-types';\nimport { isRawSQL, rawSqlToCode } from '../query/expressions/raw-sql';\n\n// Type for composing code pieces for the code generation\nexport type Code = string | Codes;\nexport type Codes = Code[];\n\nexport interface ColumnToCodeCtx {\n t: string;\n table: string;\n currentSchema: string;\n migration?: boolean;\n snakeCase?: boolean;\n sql?: string;\n isSqlUsed?: boolean;\n}\n\n/**\n * Push code: this will append a code string to the last code array element when possible.\n * @param code - array of code to push into\n * @param add - code to push\n */\nexport const addCode = (code: Code[], add: Code) => {\n if (typeof add === 'object') {\n code.push(add);\n } else {\n const last = code.length - 1;\n if (typeof code[last] === 'string') {\n code[last] = code[last] + add;\n } else {\n code.push(add);\n }\n }\n};\n\n/**\n * Convert the code item into string.\n *\n * @param code - code item\n * @param tabs - each new line will be prefixed with the tabs. Each element of the code represents a new line\n * @param shift - array elements of the given code will be shifted with this sting\n */\nexport const codeToString = (\n code: Code,\n tabs: string,\n shift: string,\n): string => {\n if (typeof code === 'string') return `${tabs}${code}`;\n\n const lines: string[] = [];\n for (const item of code) {\n if (typeof item === 'string') {\n lines.push(`${tabs}${item}`);\n } else {\n lines.push(codeToString(item, tabs + shift, shift));\n }\n }\n\n return lines.length ? lines.join('\\n') : '';\n};\n\n/**\n * Convert a column default value into code string.\n *\n * @param t - column types variable name\n * @param value - column default\n */\nexport const columnDefaultArgumentToCode = (\n ctx: string | ColumnToCodeCtx,\n value: unknown,\n): string => {\n if (typeof value === 'object' && value && isRawSQL(value)) {\n return rawSqlToCode(value, ctx);\n } else if (typeof value === 'function') {\n return value.toString();\n } else if (typeof value === 'string') {\n return singleQuote(value);\n } else {\n return JSON.stringify(value);\n }\n};\n\n/**\n * Build a function that will generate a code for a specific column type.\n *\n * @param methodNames - array of column method names to convert to code\n * @param skip - allows skipping some methods\n * @param aliases - provide aliases for specific methods\n */\nexport const columnMethodsToCode = <T extends Column.Data>(\n methodNames: (keyof T)[],\n skip?: RecordKeyTrue,\n aliases?: RecordString,\n) => {\n return (\n data: T,\n migration: boolean | undefined,\n skipLocal?: RecordKeyTrue,\n ) => {\n return migration\n ? ''\n : methodNames\n .map((key) =>\n (skipLocal || skip)?.[key as string] ||\n (key === 'min' &&\n (data as { nonEmpty?: boolean }).nonEmpty &&\n (data as { min?: number }).min === 1)\n ? ''\n : columnMethodToCode(data, key, aliases?.[key as string]),\n )\n .join('');\n };\n};\n\n/**\n * Converts a single column method into code\n *\n * @param data - column `data` object that has info about applied methods\n * @param key - name of the method\n * @param name - optional alias for this method\n */\nconst columnMethodToCode = <T extends Column.Data, K extends keyof T>(\n data: T,\n key: K,\n name: string = key as string,\n): string => {\n const param = data[key];\n if (param === undefined) return '';\n\n const error = data.errors?.[key as string];\n\n let params;\n if (typeof param === 'object' && param && param?.constructor === Object) {\n const props: string[] = [];\n for (const key in param) {\n if (key === 'message') continue;\n\n const value = (param as T)[key as keyof T];\n if (value !== undefined) {\n props.push(\n `${key}: ${typeof value === 'string' ? singleQuote(value) : value}`,\n );\n }\n }\n\n if (error) props.push(`message: ${singleQuote(error)}`);\n\n params = props.length ? `{ ${props.join(', ')} }` : '';\n } else {\n params =\n param === true\n ? ''\n : typeof param === 'string'\n ? singleQuote(param)\n : param instanceof Date\n ? `new Date('${param.toISOString()}')`\n : param;\n\n if (error) {\n if (param !== true) params += ', ';\n params += singleQuote(error);\n }\n }\n\n return `.${name}(${params})`;\n};\n\n// Function to encode string column methods\nexport const stringDataToCode =\n columnMethodsToCode<StringData>(stringMethodNames);\n\n// Function to encode numeric column methods.\n// `int` method is skipped because it's defined by the column type itself.\n// Alias `lte` and `gte` to `max` and `min` for readability.\nexport const numberDataToCode = columnMethodsToCode<BaseNumberData>(\n numberMethodNames,\n undefined,\n { lte: 'max', gte: 'min' },\n);\n\n// Function to encode date column methods\nexport const dateDataToCode =\n columnMethodsToCode<DateColumnData>(dateMethodNames);\n// Function to encode array column methods\nexport const arrayDataToCode =\n columnMethodsToCode<ArrayMethodsDataForBaseColumn>(arrayMethodNames);\n\n/**\n * Converts column type and JSON type custom errors into code\n *\n * @param errors - custom error messages\n */\nexport const columnErrorMessagesToCode = (errors: RecordString): Code => {\n const props: Code[] = [];\n\n if (errors.required) {\n props.push(`required: ${singleQuote(errors.required)},`);\n }\n\n if (errors.invalidType) {\n props.push(`invalidType: ${singleQuote(errors.invalidType)},`);\n }\n\n const code: Code[] = [];\n\n if (!props.length) return code;\n\n addCode(code, '.error({');\n code.push(props);\n addCode(code, '})');\n\n return code;\n};\n\nexport const isDefaultTimeStamp = (item: Column.Pick.DataAndDataType) => {\n if (item.dataType !== 'timestamptz') return false;\n\n const def = item.data.default;\n if (!isRawSQL(def)) return false;\n\n return typeof def._sql === 'string' && def._sql.startsWith('now()');\n};\n\nconst combineCodeElements = (input: Code): Code => {\n if (typeof input === 'string') return input;\n\n const output: Code = [];\n let i = -1;\n\n for (const item of input) {\n if (typeof item === 'string') {\n if (typeof output[i] === 'string') {\n output[i] += item;\n } else {\n output[++i] = item;\n }\n } else {\n output[++i] = combineCodeElements(item);\n }\n }\n\n return output;\n};\n\nexport const columnsShapeToCode = (\n ctx: ColumnToCodeCtx,\n shape: Column.Shape.QueryInit,\n): Codes => {\n const hasTimestamps =\n // migration should capture the current `nowSQL`, it can be changed later by user\n !ctx.migration &&\n 'createdAt' in shape &&\n isDefaultTimeStamp(\n shape.createdAt as unknown as Column.Pick.DataAndDataType,\n ) &&\n 'updatedAt' in shape &&\n isDefaultTimeStamp(\n shape.updatedAt as unknown as Column.Pick.DataAndDataType,\n );\n\n const code: Code = [];\n\n for (const key in shape) {\n if (hasTimestamps && (key === 'createdAt' || key === 'updatedAt')) continue;\n\n const column = shape[key];\n const name = column.data.name;\n if (name === key) column.data.name = undefined;\n\n code.push(\n ...combineCodeElements([\n `${quoteObjectKey(key, ctx.snakeCase)}: `,\n ...toArray((shape[key] as Column).toCode(ctx, key)),\n ',',\n ]),\n );\n\n if (name === key) column.data.name = name;\n }\n\n if (hasTimestamps) {\n code.push(`...${ctx.t}.timestamps(),`);\n }\n\n return code;\n};\n\nexport const pushTableDataCode = (code: Codes, ast: TableData): Codes => {\n const lines: Codes[] = [\n ast.primaryKey && [primaryKeyInnerToCode(ast.primaryKey, 't') + ','],\n ...(ast.indexes?.map((x) => indexToCode(x, 't')) || emptyArray),\n ...(ast.excludes?.map((x) => excludeToCode(x, 't')) || emptyArray),\n ...(ast.constraints?.map((x) => constraintToCode(x, 't', true)) ||\n emptyArray),\n ].filter((x): x is string[] => !!x);\n\n if (lines.length > 1) {\n code.push('(t) => [', ...lines, '],');\n } else if (lines[0].length === 1 && typeof lines[0][0] === 'string') {\n code.push('(t) => ' + lines[0][0]);\n } else {\n code.push('(t) => ', lines[0]);\n }\n\n return code;\n};\n\nexport const primaryKeyInnerToCode = (\n primaryKey: TableData.PrimaryKey,\n t: string,\n): string => {\n const name = primaryKey.name;\n\n return `${t}.primaryKey([${primaryKey.columns.map(singleQuote).join(', ')}]${\n name ? `, ${singleQuote(name)}` : ''\n })`;\n};\n\nconst indexOrExcludeToCode =\n <T extends TableData.Index | TableData.Exclude>(\n innerToCode: (item: T, t: string) => Codes,\n ) =>\n (item: T, t: string, prefix?: string) => {\n const code = innerToCode(item, t);\n if (prefix) code[0] = prefix + code[0];\n const last = code[code.length - 1];\n if (typeof last === 'string' && !last.endsWith(',')) addCode(code, ',');\n return code;\n };\n\nexport const indexInnerToCode = (index: TableData.Index, t: string): Codes => {\n const code: Codes = [\n `${t}.${\n index.options.tsVector\n ? 'searchIndex'\n : index.options.unique\n ? 'unique'\n : 'index'\n }(`,\n ];\n\n const columnOptions = ['collate', 'opclass', 'order', 'weight'] as const;\n\n const indexOptionsKeys: (undefined | keyof TableData.Index.Options)[] = [\n index.options.tsVector ? 'unique' : undefined,\n 'name',\n 'using',\n 'nullsNotDistinct',\n 'deferrable',\n 'include',\n 'with',\n 'tablespace',\n 'where',\n 'language',\n 'languageColumn',\n 'dropMode',\n ];\n\n const hasOptions = indexOptionsKeys.some((key) => key && index.options[key]);\n\n const columnsMultiline = index.columns.some((column) => {\n for (const key in column) {\n if (key !== 'column' && column[key as keyof typeof column] !== undefined)\n return true;\n }\n return false;\n });\n\n if (columnsMultiline) {\n const objects: Codes = [];\n\n for (const column of index.columns) {\n const expr = 'expression' in column ? column.expression : column.column;\n\n let hasOptions = false;\n for (const key in column) {\n if (key !== 'column') {\n hasOptions = true;\n }\n }\n\n if (!hasOptions) {\n objects.push(`${singleQuote(expr)},`);\n } else {\n const props: Codes = [\n `${'expression' in column ? 'expression' : 'column'}: ${singleQuote(\n expr,\n )},`,\n ];\n for (const key of columnOptions) {\n const value = column[key];\n if (value !== undefined) {\n props.push(`${key}: ${singleQuote(value)},`);\n }\n }\n\n objects.push('{', props, '},');\n }\n }\n\n code.push(['[', objects, hasOptions ? '],' : ']']);\n } else {\n addCode(\n code,\n `[${index.columns\n .map((it) => singleQuote((it as { column: string }).column))\n .join(', ')}]`,\n );\n }\n\n if (hasOptions) {\n if (columnsMultiline) {\n code.push(['{']);\n } else {\n addCode(code, ', {');\n }\n\n const options: string[] = [];\n for (const key of indexOptionsKeys) {\n if (!key) continue;\n\n const value = index.options[key];\n if (value === null || value === undefined) continue;\n\n options.push(\n `${key}: ${\n Array.isArray(value)\n ? singleQuoteArray(value)\n : typeof value === 'string'\n ? singleQuote(value)\n : value\n },`,\n );\n }\n\n if (columnsMultiline) {\n code.push([options, '},']);\n } else {\n code.push(options);\n addCode(code, '}');\n }\n }\n\n if (columnsMultiline) {\n code.push('),');\n } else {\n addCode(code, ')');\n }\n\n return code;\n};\n\nexport const indexToCode = indexOrExcludeToCode(indexInnerToCode);\n\nexport const excludeInnerToCode = (\n item: TableData.Exclude,\n t: string,\n): Codes => {\n const code: Codes = [`${t}.exclude(`];\n\n const columnOptions = ['collate', 'opclass', 'order', 'with'] as const;\n\n const optionsKeys: (undefined | keyof TableData.Exclude.Options)[] = [\n 'name',\n 'using',\n 'include',\n 'with',\n 'tablespace',\n 'where',\n 'dropMode',\n ];\n\n const hasOptions = optionsKeys.some((key) => key && item.options[key]);\n\n const objects: Codes = [];\n\n for (const column of item.columns) {\n const expr = 'expression' in column ? column.expression : column.column;\n\n const props: Codes = [\n `${'expression' in column ? 'expression' : 'column'}: ${singleQuote(\n expr,\n )},`,\n ];\n for (const key of columnOptions) {\n const value = column[key];\n if (value !== undefined) {\n props.push(`${key}: ${singleQuote(value)},`);\n }\n }\n\n objects.push('{', props, '},');\n }\n\n code.push(['[', objects, hasOptions ? '],' : ']']);\n\n if (hasOptions) {\n code.push(['{']);\n\n const options: string[] = [];\n for (const key of optionsKeys) {\n if (!key) continue;\n\n const value = item.options[key];\n if (value === null || value === undefined) continue;\n\n options.push(\n `${key}: ${\n Array.isArray(value)\n ? singleQuoteArray(value)\n : typeof value === 'string'\n ? singleQuote(value)\n : value\n },`,\n );\n }\n\n code.push([options, '},']);\n }\n\n code.push('),');\n\n return code;\n};\n\nexport const excludeToCode = indexOrExcludeToCode(excludeInnerToCode);\n\nexport const constraintToCode = (\n item: TableData.Constraint,\n t: string,\n m?: boolean,\n prefix?: string,\n ctx?: ColumnToCodeCtx,\n): Codes => {\n const code = constraintInnerToCode(item, t, m, ctx);\n if (prefix) code[0] = prefix + code[0];\n const last = code[code.length - 1];\n if (typeof last === 'string' && !last.endsWith(','))\n code[code.length - 1] += ',';\n return code;\n};\n\nexport const constraintInnerToCode = (\n item: TableData.Constraint,\n t: string,\n m?: boolean,\n ctx?: ColumnToCodeCtx,\n): Codes => {\n if (item.references) {\n return [\n `${t}.foreignKey(`,\n referencesArgsToCode(item.references, item.name, m),\n '),',\n ];\n }\n\n return [\n `${t}.check(${rawSqlToCode(item.check as TableData.Check, ctx ?? t)}${\n item.name ? `, ${singleQuote(item.name)}` : ''\n })`,\n ];\n};\n\nexport const referencesArgsToCode = (\n {\n columns,\n fnOrTable,\n foreignColumns,\n options,\n }: Exclude<TableData.Constraint['references'], undefined>,\n name: string | false = options?.name || false,\n m?: boolean,\n): Codes => {\n const args: Codes = [];\n\n args.push(`${singleQuoteArray(columns)},`);\n\n if (m && typeof fnOrTable !== 'string') {\n const { schema, table } = getForeignKeyTableInstance(fnOrTable());\n fnOrTable = schema ? `${schema}.${table}` : table;\n }\n\n args.push(\n `${\n typeof fnOrTable === 'string'\n ? singleQuote(fnOrTable)\n : fnOrTable.toString()\n },`,\n );\n\n args.push(`${singleQuoteArray(foreignColumns)},`);\n\n if (objectHasValues(options) || name) {\n const lines: string[] = [];\n if (name) lines.push(`name: ${singleQuote(name)},`);\n for (const key in options) {\n if (key === 'name') continue;\n const value = options[key as keyof typeof options];\n if (value) lines.push(`${key}: ${singleQuote(value)},`);\n }\n args.push('{', lines, '},');\n }\n\n return args;\n};\n\nexport const columnForeignKeysToCode = (\n foreignKeys: TableData.ColumnReferences[],\n migration: boolean | undefined,\n): Codes => {\n const code: Codes = [];\n for (const foreignKey of foreignKeys) {\n addCode(code, `.foreignKey(`);\n for (const part of foreignKeyArgumentToCode(foreignKey, migration)) {\n addCode(code, part);\n }\n addCode(code, ')');\n }\n return code;\n};\n\nexport const foreignKeyArgumentToCode = (\n {\n fnOrTable,\n foreignColumns,\n options = emptyObject,\n }: TableData.ColumnReferences,\n migration: boolean | undefined,\n): Codes => {\n const code: Code = [];\n\n if (migration && typeof fnOrTable !== 'string') {\n const { schema, table } = getForeignKeyTableInstance(fnOrTable());\n fnOrTable = schema ? `${schema}.${table}` : table;\n }\n\n code.push(\n typeof fnOrTable === 'string'\n ? singleQuote(fnOrTable)\n : fnOrTable.toString(),\n );\n\n addCode(code, `, ${singleQuote(foreignColumns[0])}`);\n\n const hasOptions =\n options.name || options.match || options.onUpdate || options.onDelete;\n\n if (hasOptions) {\n const arr: string[] = [];\n\n if (options.name) arr.push(`name: ${singleQuote(options.name)},`);\n if (options.match) arr.push(`match: ${singleQuote(options.match)},`);\n if (options.onUpdate)\n arr.push(`onUpdate: ${singleQuote(options.onUpdate)},`);\n if (options.onDelete)\n arr.push(`onDelete: ${singleQuote(options.onDelete)},`);\n\n addCode(code, ', {');\n code.push(arr);\n addCode(code, '}');\n }\n\n return code;\n};\n\nexport const columnIndexesToCode = (\n items: Exclude<Column.Data['indexes'], undefined>,\n): Codes => {\n const code: Codes = [];\n for (const { options } of items) {\n addCode(code, `.${options.unique ? 'unique' : 'index'}(`);\n\n const arr = [\n options.name && `name: ${singleQuote(options.name)},`,\n options.collate && `collate: ${singleQuote(options.collate)},`,\n options.opclass && `opclass: ${singleQuote(options.opclass)},`,\n options.order && `order: ${singleQuote(options.order)},`,\n options.using && `using: ${singleQuote(options.using)},`,\n options.include &&\n `include: ${\n typeof options.include === 'string'\n ? singleQuote(options.include)\n : `[${options.include.map(singleQuote).join(', ')}]`\n },`,\n options.nullsNotDistinct && `nullsNotDistinct: true,`,\n options.deferrable && `deferrable: ${singleQuote(options.deferrable)},`,\n options.with && `with: ${singleQuote(options.with)},`,\n options.tablespace && `tablespace: ${singleQuote(options.tablespace)},`,\n options.where && `where: ${singleQuote(options.where)},`,\n ].filter((x): x is string => !!x);\n\n if (arr.length) {\n addCode(code, '{');\n addCode(code, arr);\n addCode(code, '}');\n }\n\n addCode(code, ')');\n }\n return code;\n};\n\nexport const columnExcludesToCode = (\n items: Exclude<Column.Data['excludes'], undefined>,\n): Codes => {\n const code: Codes = [];\n for (const { options, with: w } of items) {\n addCode(code, `.exclude('${w}'`);\n\n const arr = [\n options.name && `name: ${singleQuote(options.name)},`,\n options.collate && `collate: ${singleQuote(options.collate)},`,\n options.opclass && `opclass: ${singleQuote(options.opclass)},`,\n options.order && `order: ${singleQuote(options.order)},`,\n options.using && `using: ${singleQuote(options.using)},`,\n options.include &&\n `include: ${\n typeof options.include === 'string'\n ? singleQuote(options.include)\n : `[${options.include.map(singleQuote).join(', ')}]`\n },`,\n options.with && `with: ${singleQuote(options.with)},`,\n options.tablespace && `tablespace: ${singleQuote(options.tablespace)},`,\n options.where && `where: ${singleQuote(options.where)},`,\n ].filter((x): x is string => !!x);\n\n if (arr.length) {\n addCode(code, ', {');\n addCode(code, arr);\n addCode(code, '}');\n }\n\n addCode(code, ')');\n }\n return code;\n};\n\nexport const columnCheckToCode = (\n ctx: ColumnToCodeCtx,\n checks: Column.Data.Check[],\n): string => {\n return checks\n .map(\n ({ sql, name }) =>\n `.check(${rawSqlToCode(sql, ctx)}${name ? `, '${name}'` : ''})`,\n )\n .join('');\n};\n\nexport const identityToCode = (\n identity: TableData.Identity,\n dataType?: string,\n) => {\n const code: Codes = [];\n\n if (dataType === 'integer') {\n code.push(`identity(`);\n } else {\n code.push(`${dataType}().identity(`);\n }\n\n const props: string[] = [];\n if (identity.always) props.push(`always: true,`);\n if (identity.increment && identity.increment !== 1)\n props.push(`increment: ${identity.increment},`);\n if (identity.start && identity.start !== 1)\n props.push(`start: ${identity.start},`);\n if (identity.min) props.push(`min: ${identity.min},`);\n if (identity.max) props.push(`max: ${identity.max},`);\n if (identity.cache && identity.cache !== 1)\n props.push(`cache: ${identity.cache},`);\n if (identity.cycle) props.push(`cycle: true,`);\n\n if (props.length) {\n addCode(code, '{');\n code.push(props, '}');\n }\n\n addCode(code, ')');\n\n return code;\n};\n\nexport const columnCode = (\n type: Column,\n ctx: ColumnToCodeCtx,\n key: string,\n code: Code,\n): Code => {\n const { data } = type;\n\n code = toArray(code);\n\n let prepend = `${ctx.t}.`;\n const keyName = ctx.snakeCase ? toSnakeCase(key) : key;\n const name = data.name ?? keyName;\n if (name !== keyName) {\n prepend += `name(${singleQuote(name)}).`;\n }\n\n if (typeof code[0] === 'string') {\n code[0] = `${prepend}${code[0]}`;\n } else {\n code[0].unshift(prepend);\n }\n\n if (data.generated) {\n addCode(code, data.generated.toCode());\n }\n\n if (data.primaryKey) {\n addCode(\n code,\n `.primaryKey(${\n data.primaryKey === (true as never) ? '' : singleQuote(data.primaryKey)\n })`,\n );\n }\n\n if (data.foreignKeys) {\n for (const part of columnForeignKeysToCode(\n data.foreignKeys,\n ctx.migration,\n )) {\n addCode(code, part);\n }\n }\n\n if (data.explicitSelect) addCode(code, '.select(false)');\n\n if (data.isNullable) addCode(code, '.nullable()');\n\n if (data.as && !ctx.migration) {\n addCode(code, `.as(${(data.as as Column).toCode(ctx, key)})`);\n }\n\n if (\n data.default !== undefined &&\n data.default !== data.defaultDefault &&\n (!ctx.migration || typeof data.default !== 'function')\n ) {\n addCode(\n code,\n `.default(${columnDefaultArgumentToCode(ctx, data.default)})`,\n );\n }\n\n if (data.indexes) {\n for (const part of columnIndexesToCode(data.indexes)) {\n addCode(code, part);\n }\n }\n\n if (data.excludes) {\n for (const part of columnExcludesToCode(data.excludes)) {\n addCode(code, part);\n }\n }\n\n if (data.comment) addCode(code, `.comment(${singleQuote(data.comment)})`);\n\n if (data.checks) {\n addCode(code, columnCheckToCode(ctx, data.checks));\n }\n\n if (data.errors) {\n for (const part of columnErrorMessagesToCode(data.errors)) {\n addCode(code, part);\n }\n }\n\n const { validationDefault } = data;\n if (validationDefault) {\n addCode(\n code,\n `.validationDefault(${\n typeof validationDefault === 'function'\n ? validationDefault.toString()\n : typeof validationDefault === 'string'\n ? singleQuote(validationDefault)\n : JSON.stringify(validationDefault)\n })`,\n );\n }\n\n if (data.compression)\n addCode(code, `.compression(${singleQuote(data.compression)})`);\n\n if (data.collate) addCode(code, `.collate(${singleQuote(data.collate)})`);\n\n if (data.modifyQuery && !ctx.migration)\n addCode(code, `.modifyQuery(${data.modifyQuery.toString()})`);\n\n return code.length === 1 && typeof code[0] === 'string' ? code[0] : code;\n};\n","import {\n FnUnknownToUnknown,\n MaybePromise,\n setObjectValueImmutable,\n} from '../../utils';\nimport { HookSelect } from '../basic-features/select/hook-select';\nimport { Query, QueryReturnType } from '../query';\nimport { Column } from '../../columns';\nimport { PickQueryQ } from '../pick-query-types';\nimport { Expression } from '../expressions/expression';\n\nexport interface PickQueryDataParsers {\n // column parsers that are applied by default, when not selecting anything\n defaultParsers?: ColumnsParsers;\n // parsers added for selected items\n parsers?: ColumnsParsers;\n // parsers for nested records\n batchParsers?: BatchParsers;\n}\n\n// function to parse a single column after loading the data\nexport type ColumnParser = FnUnknownToUnknown;\n\nexport interface BatchParserPathEntry {\n key: string;\n returnType: QueryReturnType;\n}\n\n// To parse all returned rows. Unlike column parser, can return a promise.\nexport interface BatchParser {\n path: BatchParserPathEntry[];\n fn: (\n path: BatchParserPathEntry[],\n queryResult: { rows: unknown[] },\n ) => MaybePromise<void>;\n}\n\n// set of value parsers\n// key is a name of a selected column,\n// 'v' is a special name for a single-value queries parser\nexport type ColumnsParsers = { [K in string]?: ColumnParser };\n\n// set of batch parsers\n// is only triggered when loading all,\n// or when using `hookSelect` or computed columns that convert response to `all` internally.\n// key is a name of a selected column\nexport type BatchParsers = BatchParser[];\n\n/**\n * generic utility to add a parser to the query object\n * @param query - the query object, it will be mutated\n * @param key - the name of the column in the data loaded by the query\n * @param parser - function to process the value of the column with.\n */\nexport const setParserToQuery = (\n query: { parsers?: ColumnsParsers },\n key: string,\n parser?: ColumnParser,\n) => {\n if (parser) {\n if (query.parsers) query.parsers[key] = parser;\n else query.parsers = { [key]: parser };\n } else if (query.parsers) {\n delete query.parsers[key];\n }\n};\n\n/**\n * similar to setParserToQuery,\n * but if the parser for the column is already set,\n * this will wrap it with HOC to additionally parse with a provided function\n * @param query - the query object, it will be mutated\n * @param key - the name of the column in the data loaded by the query\n * @param parser - function to process the value of the column with.\n */\nexport const overrideParserInQuery = (\n query: { parsers?: ColumnsParsers },\n key: string,\n parser: ColumnParser,\n) => {\n if (query.parsers) {\n const existing = query.parsers[key];\n query.parsers[key] = existing\n ? (value: unknown) => parser(existing(value))\n : parser;\n } else query.parsers = { [key]: parser } as ColumnsParsers;\n};\n\nexport const getQueryParsers = (q: Query, hookSelect?: HookSelect) => {\n if (hookSelect) {\n const parsers = { ...q.q.parsers };\n const { defaultParsers } = q.q;\n if (defaultParsers) {\n for (const [key, value] of hookSelect) {\n const parser = defaultParsers[key];\n if (parser) {\n parsers[value.as || key] = parser;\n }\n }\n }\n return parsers;\n }\n\n return q.q.select ? q.q.parsers : q.q.defaultParsers;\n};\n\nexport const addColumnParserToQuery = (\n q: { parsers?: ColumnsParsers },\n key: string,\n column: Column.Pick.QueryColumn,\n) => {\n if ((column as Column)._parse) {\n setObjectValueImmutable(q, 'parsers', key, (column as Column)._parse);\n }\n};\n\nexport const setValueParserToQuery = (\n q: { parsers?: ColumnsParsers },\n column: Column.Pick.QueryColumn,\n) => {\n addColumnParserToQuery(q, 'v', column);\n};\n\nexport const getValueParser = (parsers?: ColumnsParsers) => {\n return parsers?.v;\n};\n\nexport const setValueParser = (\n q: PickQueryDataParsers,\n parser: ColumnParser | undefined,\n) => {\n setObjectValueImmutable(q, 'parsers', 'v', parser);\n};\n\n// export const setValueParserForSelectedString = (\n// query: PickQueryQAndInternal,\n// arg: string,\n// as: string | undefined,\n// ) => setParserForSelectedString(query, arg, as, 'v');\n\n// add a parser for a raw expression column\n// is used by .select and .get methods\nexport const addParserForRawExpression = (\n q: PickQueryQ,\n key: string,\n raw: Expression,\n) => {\n if (raw.result.value) addColumnParserToQuery(q.q, key, raw.result.value);\n};\n","import { singleQuote } from '../../utils';\nimport { Column, setColumnData } from '../column';\nimport { Code, columnCode, ColumnToCodeCtx } from '../code';\nimport { Operators } from '../operators';\nimport { ColumnSchemaConfig } from '../column-schema';\n\n// for a user-defined type, or for unsupported yet type from some module\nexport class CustomTypeColumn<\n Schema extends ColumnSchemaConfig,\n> extends Column {\n declare __schema: Schema;\n operators = Operators.any;\n declare __type: unknown;\n declare __inputType: unknown;\n declare inputSchema: ReturnType<Schema['unknown']>;\n declare __outputType: unknown;\n declare outputSchema: ReturnType<Schema['unknown']>;\n declare __queryType: unknown;\n declare querySchema: ReturnType<Schema['unknown']>;\n declare data: Column.Data;\n public dataType: string;\n\n constructor(\n schema: Schema,\n public typeName: string,\n public typeSchema?: string,\n extension?: string,\n ) {\n super(\n schema,\n schema.unknown() as never,\n schema.unknown() as never,\n schema.unknown() as never,\n );\n this.dataType = typeSchema ? typeSchema + '.' + typeName : typeName;\n this.data.isOfCustomType = true;\n this.data.extension = extension;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const {\n dataType,\n data: { typmod },\n } = this;\n\n return columnCode(\n this,\n ctx,\n key,\n `type(${singleQuote(\n (dataType.startsWith(ctx.currentSchema)\n ? dataType.slice(ctx.currentSchema.length + 1)\n : dataType) +\n (typmod !== undefined && typmod !== -1 && !dataType.includes('(')\n ? `(${typmod})`\n : ''),\n )})`,\n );\n }\n\n as<\n T extends {\n __inputType: unknown;\n __outputType: unknown;\n data: Column.Data;\n },\n C extends {\n __inputType: T['__inputType'];\n __outputType: T['__outputType'];\n },\n >(this: T, column: C): C {\n const c = column as unknown as Column.Pick.TypeSchemas;\n const extended = setColumnData(\n this,\n 'as',\n column as unknown as T['data']['as'],\n ) as unknown as Column.Pick.TypeSchemas;\n\n extended.inputSchema = c.inputSchema;\n extended.outputSchema = c.outputSchema;\n extended.querySchema = c.querySchema;\n\n return extended as never;\n }\n}\n\n// domain column type: https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-user-defined-data-types/\nexport class DomainColumn<\n Schema extends ColumnSchemaConfig,\n> extends CustomTypeColumn<Schema> {\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `domain(${singleQuote(this.dataType)})`);\n }\n}\n","import { Column } from '../column';\nimport { columnCode, ColumnToCodeCtx } from '../code';\nimport { Code } from '../code';\nimport { Operators } from '../operators';\nimport { ColumnTypeSchemaArg } from '../column-schema';\n\nexport class EnumColumn<\n Schema extends ColumnTypeSchemaArg,\n SchemaType extends Schema['__schemaType'],\n const T extends readonly string[],\n> extends Column {\n declare __schema: Schema;\n operators = Operators.ordinalText;\n declare __type: T[number];\n declare __inputType: T[number];\n declare inputSchema: SchemaType;\n declare __outputType: T[number];\n declare outputSchema: SchemaType;\n declare __queryType: T[number];\n declare querySchema: SchemaType;\n dataType = 'enum';\n\n constructor(\n schema: Schema,\n public enumName: string,\n public options: T,\n schemaType: SchemaType,\n ) {\n super(schema, schemaType);\n this.inputSchema = this.outputSchema = this.querySchema = schemaType;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const options = ctx.migration\n ? ''\n : `, [${this.options.map((option) => `'${option}'`).join(', ')}]`;\n return columnCode(this, ctx, key, `enum('${this.enumName}'${options})`);\n }\n\n toSQL() {\n const name = this.enumName;\n const index = name.indexOf('.');\n return `\"${\n index === -1 ? name : `${name.slice(0, index)}\".\"${name.slice(index + 1)}`\n }\"`;\n }\n}\n","import { Column } from './column';\nimport { DomainColumn } from './column-types/custom-type';\nimport { EnumColumn } from './column-types/enum';\n\nexport interface DbStructureDomainsMap {\n [K: string]: Column;\n}\n\nexport const setColumnDefaultParse = (\n column: Column.Pick.Data,\n parse: (input: any) => unknown, // eslint-disable-line @typescript-eslint/no-explicit-any\n) => {\n column.data.parse = parse;\n (column as Column)._parse = (input: unknown) =>\n input === null ? null : parse(input);\n};\n\nexport const setColumnParse = (\n column: Column.Pick.Data,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fn: (input: any) => unknown,\n outputSchema?: unknown,\n) => {\n const c = Object.create(column);\n c.outputSchema = outputSchema;\n c.data = { ...column.data, parse: fn };\n\n const { parseNull } = column.data;\n c._parse = parseNull\n ? (input: unknown) => (input === null ? parseNull() : fn(input))\n : (input: unknown) => (input === null ? null : fn(input));\n\n return c;\n};\n\nexport const setColumnParseNull = (\n column: Column.Pick.Data,\n //\n fn: () => unknown,\n nullSchema?: unknown,\n) => {\n const c = Object.create(column);\n c.nullSchema = nullSchema;\n c.data = { ...column.data, parseNull: fn };\n\n const { parse } = column.data;\n c._parse = parse\n ? (input: unknown) => (input === null ? fn() : parse(input))\n : (input: unknown) => (input === null ? fn() : input);\n\n return c;\n};\n\nexport const setColumnDefaultEncode = (\n column: Column.Pick.Data,\n fn: (input: any) => unknown, // eslint-disable-line @typescript-eslint/no-explicit-any\n) => {\n column.data.encode = fn;\n};\n\nexport const setColumnEncode = (\n column: Column.Pick.Data,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fn: (input: any) => unknown,\n inputSchema?: unknown,\n) => {\n const c = Object.create(column);\n c.inputSchema = inputSchema;\n c.data = { ...column.data, encode: fn };\n return c;\n};\n\nexport const getColumnBaseType = (\n column: Column.Pick.Data,\n domainsMap: DbStructureDomainsMap,\n type: string,\n) => {\n return column instanceof EnumColumn\n ? 'text'\n : column instanceof DomainColumn\n ? domainsMap[column.dataType]?.dataType\n : type;\n};\n","import { Column } from '../column';\nimport { joinTruthy } from '../../utils';\nimport { Code, ColumnToCodeCtx, dateDataToCode } from '../code';\nimport { columnCode } from '../code';\nimport { Operators } from '../operators';\nimport { DateColumnData } from '../column-data-types';\nimport { ColumnSchemaConfig } from '../column-schema';\nimport { PostgresInterval } from '../../adapters/driver-adapter-shared';\nimport { setColumnDefaultParse } from '../column.utils';\n\nexport type DateColumnInput = string | number | Date;\n\nconst dateToString = (value: Date): string => value.toISOString();\n\n// encode string, number, or Date to a Date object,\nconst dateTimeEncode = (value: DateColumnInput) => {\n return typeof value === 'number' ? new Date(value) : value;\n};\n\n// In Bun, it is Date normally, but string in case of nested json\nconst parseStringOrDateToNumber = (value: unknown): number =>\n typeof value === 'string' ? Date.parse(value) : (value as Date).getTime();\n\nexport const getDateAsNumberFn = (column: {\n data: Column.Data;\n dateParsedByDriver?: boolean;\n}) =>\n column.dateParsedByDriver\n ? parseStringOrDateToNumber\n : (Date.parse as (input: unknown) => number);\n\n// parse a date string to date object, with respect to null\nconst parseDateToDate = (value: unknown): Date => new Date(value as string);\n\n// In Bun, it is Date normally, but string in case of nested json\nconst parseStringOrDateToDate = (value: unknown): Date =>\n typeof value === 'string' ? new Date(value) : (value as Date);\n\nexport const getDateAsDateFn = (column: {\n data: Column.Data;\n dateParsedByDriver?: boolean;\n}) => (column.dateParsedByDriver ? parseStringOrDateToDate : parseDateToDate);\n\n// common class for Date and DateTime columns\nexport abstract class DateBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends Column {\n declare __schema: Schema;\n declare __type: string;\n declare __inputType: DateColumnInput;\n declare inputSchema: ReturnType<Schema['stringNumberDate']>;\n declare data: DateColumnData;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: DateColumnInput;\n declare querySchema: ReturnType<Schema['stringNumberDate']>;\n operators = Operators.date;\n asNumber: Schema['dateAsNumber'];\n asDate: Schema['dateAsDate'];\n\n constructor(\n schema: Schema,\n public dateParsedByDriver?: boolean,\n ) {\n super(\n schema,\n schema.stringNumberDate() as never,\n schema.stringSchema() as never,\n schema.stringNumberDate() as never,\n );\n if (dateParsedByDriver) {\n this._parse = dateToString as never;\n }\n this.asNumber = schema.dateAsNumber;\n this.asDate = schema.dateAsDate;\n this.data.encode = dateTimeEncode;\n }\n}\n\n// date\t4 bytes\tdate (no time of day)\t4713 BC\t5874897 AD 1 day\nexport class DateColumn<\n Schema extends ColumnSchemaConfig,\n> extends DateBaseColumn<Schema> {\n dataType = 'date' as const;\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(\n this,\n ctx,\n key,\n `date()${dateDataToCode(this.data, ctx.migration)}`,\n );\n }\n}\n\nexport abstract class DateTimeBaseClass<\n Schema extends ColumnSchemaConfig,\n> extends DateBaseColumn<Schema> {\n declare data: DateColumnData & { dateTimePrecision?: number };\n\n constructor(\n schema: Schema,\n dateTimePrecision?: number,\n dateParsedByDriver?: boolean,\n ) {\n super(schema, dateParsedByDriver);\n this.data.dateTimePrecision = dateTimePrecision;\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.dateTimePrecision !== undefined &&\n `(${this.data.dateTimePrecision})`,\n );\n }\n}\n\nexport abstract class DateTimeTzBaseClass<\n Schema extends ColumnSchemaConfig,\n> extends DateTimeBaseClass<Schema> {\n abstract baseDataType: string;\n\n toSQL() {\n return joinTruthy(\n this.baseDataType,\n this.data.dateTimePrecision !== undefined &&\n `(${this.data.dateTimePrecision})`,\n ' with time zone',\n );\n }\n}\n\nconst timestampToCode = (\n self:\n | TimestampColumn<ColumnSchemaConfig>\n | TimestampTZColumn<ColumnSchemaConfig>,\n ctx: ColumnToCodeCtx,\n key: string,\n) => {\n const { dateTimePrecision: p } = self.data;\n\n const { defaultTimestamp } = self.data;\n // migrations should capture the current `nowSQL`, it can be changed by user later.\n if (!ctx.migration && defaultTimestamp) {\n const noTz = self instanceof TimestampColumn ? 'NoTZ' : '';\n\n const def = self.data.default;\n const modifyQuery = self.data.modifyQuery;\n self.data.default = undefined;\n self.data.modifyQuery = undefined;\n\n const code = columnCode(\n self,\n ctx,\n key,\n `timestamps${noTz}(${\n p && p !== 6 ? p : ''\n }).${defaultTimestamp}${dateDataToCode(self.data, ctx.migration)}`,\n );\n\n self.data.default = def;\n self.data.modifyQuery = modifyQuery;\n\n return code;\n } else {\n return columnCode(\n self,\n ctx,\n key,\n `${self instanceof TimestampColumn ? 'timestampNoTZ' : 'timestamp'}(${\n p && p !== 6 ? p : ''\n })${dateDataToCode(self.data, ctx.migration)}`,\n );\n }\n};\n\n// timestamp [ (p) ] [ without time zone ]\t8 bytes\tboth date and time (no time zone)\t4713 BC\t294276 AD\t1 microsecond\nexport class TimestampColumn<\n Schema extends ColumnSchemaConfig,\n> extends DateTimeBaseClass<Schema> {\n dataType = 'timestamp' as const;\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return timestampToCode(this, ctx, key);\n }\n}\n\n// timestamp [ (p) ] with time zone\t8 bytes\tboth date and time, with time zone\t4713 BC\t294276 AD\t1 microsecond\nexport class TimestampTZColumn<\n Schema extends ColumnSchemaConfig,\n> extends DateTimeTzBaseClass<Schema> {\n dataType = 'timestamptz' as const;\n baseDataType = 'timestamp' as const;\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return timestampToCode(this, ctx, key);\n }\n}\n\n// time [ (p) ] [ without time zone ]\t8 bytes\ttime of day (no date)\t00:00:00\t24:00:00\t1 microsecond\nexport class TimeColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n declare __type: string;\n declare __inputType: ReturnType<Schema['stringSchema']>;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare data: DateColumnData & { dateTimePrecision?: number };\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n dataType = 'time' as const;\n operators = Operators.time;\n\n constructor(schema: Schema, dateTimePrecision?: number) {\n super(schema, schema.stringSchema() as never);\n this.data.dateTimePrecision = dateTimePrecision;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { dateTimePrecision } = this.data;\n return columnCode(\n this,\n ctx,\n key,\n `time(${dateTimePrecision || ''})${dateDataToCode(\n this.data,\n ctx.migration,\n )}`,\n );\n }\n}\n\nconst addIntervalPart = (\n parts: string[],\n value: number | undefined,\n unit: string,\n) => {\n if (value) {\n parts.push(`${value} ${unit}`);\n }\n};\n\nconst serializePostgresInterval = (\n input: Partial<PostgresInterval>,\n): string => {\n const parts: string[] = [];\n\n addIntervalPart(parts, input.years, 'years');\n addIntervalPart(parts, input.months, 'months');\n addIntervalPart(parts, input.days, 'days');\n addIntervalPart(parts, input.hours, 'hours');\n addIntervalPart(parts, input.minutes, 'minutes');\n addIntervalPart(parts, input.seconds, 'seconds');\n addIntervalPart(parts, input.milliseconds, 'milliseconds');\n\n return parts.length ? parts.join(' ') : '0 seconds';\n};\n\n// interval [ fields ] [ (p) ]\t16 bytes\ttime interval\t-178000000 years\t178000000 years\t1 microsecond\nexport class IntervalColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n declare __type: PostgresInterval;\n declare data: Column.Data & { fields?: string; precision?: number };\n declare __inputType: Partial<PostgresInterval>;\n declare inputSchema: ReturnType<Schema['timeInterval']>;\n declare __outputType: PostgresInterval;\n declare outputSchema: ReturnType<Schema['timeInterval']>;\n declare __queryType: PostgresInterval;\n declare querySchema: ReturnType<Schema['timeInterval']>;\n dataType = 'interval' as const;\n operators = Operators.date;\n\n constructor(\n schema: Schema,\n fields?: string,\n precision?: number,\n parse?: (input: string) => PostgresInterval,\n ) {\n super(schema, schema.timeInterval() as never);\n this.data.fields = fields;\n this.data.precision = precision;\n if (parse) {\n setColumnDefaultParse(this, parse);\n }\n this.data.encode = serializePostgresInterval;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { fields, precision } = this.data;\n return columnCode(\n this,\n ctx,\n key,\n `interval(${[fields && `'${fields}'`, precision && String(precision)]\n .filter((part) => part)\n .join(', ')})`,\n );\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.fields && ` ${this.data.fields}`,\n this.data.precision !== undefined && ` (${this.data.precision})`,\n );\n }\n}\n","import { Column } from '../column';\nimport {\n addCode,\n Code,\n arrayDataToCode,\n Codes,\n ColumnToCodeCtx,\n} from '../code';\nimport { columnCode } from '../code';\nimport { Operators, OperatorsArray } from '../operators';\nimport { setColumnDefaultEncode } from '../column.utils';\nimport { ArrayMethodsData } from '../column-data-types';\nimport { ColumnSchemaConfig, ColumnTypeSchemaArg } from '../column-schema';\n\nexport interface ArrayColumnValue {\n __type: unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputSchema: any;\n __inputType: unknown;\n __outputType: unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n outputSchema: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n __queryType: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n querySchema: any;\n toSQL(): string;\n toCode(ctx: ColumnToCodeCtx, key: string): Code;\n data: Column.Data;\n}\n\nexport interface ArrayData<Item extends ArrayColumnValue>\n extends Column.Data, ArrayMethodsData {\n item: Item;\n arrayDims: number;\n}\n\nexport class ArrayColumn<\n Schema extends ColumnTypeSchemaArg,\n Item extends ArrayColumnValue,\n InputType,\n OutputType,\n QueryType,\n> extends Column {\n declare __schema: Schema;\n dataType = 'array' as const;\n operators = Operators.array as OperatorsArray<Item['__queryType']>;\n declare data: ArrayData<Item>;\n declare __type: Item['__type'][];\n declare __inputType: Item['__type'][];\n declare inputSchema: InputType;\n declare __outputType: Item['__outputType'][];\n declare outputSchema: OutputType;\n declare __queryType: Item['__queryType'][];\n declare querySchema: QueryType;\n\n constructor(\n schema: Schema,\n item: Item,\n __inputType: InputType,\n defaultEncode?: (input: unknown) => unknown,\n __outputType?: OutputType,\n __queryType?: QueryType,\n ) {\n super(schema, __inputType, __outputType, __queryType);\n\n // array items cannot be non-nullable, postgres limitation\n item.data.isNullable = true;\n\n if (defaultEncode) {\n setColumnDefaultEncode(this, defaultEncode);\n }\n\n this.data.item = item instanceof ArrayColumn ? item.data.item : item;\n this.data.name = item.data.name;\n this.data.arrayDims =\n item instanceof ArrayColumn ? item.data.arrayDims + 1 : 1;\n }\n\n toSQL(): string {\n return this.data.item.toSQL() + '[]'.repeat(this.data.arrayDims);\n }\n\n toCode(\n this: ArrayColumn<\n ColumnSchemaConfig,\n ArrayColumnValue,\n unknown,\n unknown,\n unknown\n >,\n ctx: ColumnToCodeCtx,\n key: string,\n ): Code {\n let open = 'array(';\n let close = ')';\n for (let i = 1; i < this.data.arrayDims; i++) {\n open += `${ctx.t}.array(`;\n close += ')';\n }\n\n const code: Codes = [open];\n\n const { item } = this.data;\n const clonedItem = Object.create(item);\n const { isNullable: _, ...dataWithoutNullable } = item.data;\n clonedItem.data = dataWithoutNullable;\n addCode(code, clonedItem.toCode(ctx, key));\n\n addCode(code, `${close}${arrayDataToCode(this.data, ctx.migration)}`);\n return columnCode(this, ctx, key, code);\n }\n}\n","import { Column } from '../column';\nimport { columnCode, ColumnToCodeCtx } from '../code';\nimport { Operators } from '../operators';\nimport { Code } from '../code';\nimport {\n DefaultSchemaConfig,\n internalSchemaConfig,\n} from '../default-schema-config';\nimport { ColumnTypeSchemaArg } from '../column-schema';\n\nexport const encodeJson = (x: unknown) => (x === null ? x : JSON.stringify(x));\n\n// Type of JSON column (jsonb).\nexport class JSONColumn<\n T,\n Schema extends ColumnTypeSchemaArg,\n InputSchema = Schema['__schemaType'],\n> extends Column {\n declare __schema: Schema;\n dataType = 'jsonb' as const;\n declare __type: T;\n declare __inputType: T;\n declare inputSchema: InputSchema;\n declare __outputType: T;\n declare outputSchema: InputSchema;\n declare __queryType: T;\n declare querySchema: InputSchema;\n operators = Operators.json;\n\n constructor(\n schema: Schema,\n __inputType: InputSchema,\n encodedByDriver = true,\n ) {\n super(schema, __inputType as InputSchema);\n if (!encodedByDriver) {\n this.data.encode = encodeJson;\n }\n this.data.parseItem = JSON.parse;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `json()`);\n }\n}\n\n// JSON non-binary type, stored as a text in the database, so it doesn't have rich functionality.\nexport class JSONTextColumn<\n T,\n Schema extends ColumnTypeSchemaArg,\n InputSchema = Schema['__schemaType'],\n> extends Column {\n declare __schema: Schema;\n dataType = 'json' as const;\n declare __type: T;\n declare __inputType: T;\n declare inputSchema: InputSchema;\n declare __outputType: T;\n declare outputSchema: InputSchema;\n declare __queryType: T;\n declare querySchema: InputSchema;\n operators = Operators.text;\n\n private static _instance:\n | JSONTextColumn<unknown, DefaultSchemaConfig>\n | undefined;\n static get instance() {\n return (this._instance ??= new JSONTextColumn(\n internalSchemaConfig,\n undefined,\n ));\n }\n\n constructor(schema: Schema, __inputType: InputSchema) {\n super(schema, __inputType as InputSchema);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `jsonText()`);\n }\n}\n","import { Column, setColumnData } from '../column';\nimport {\n Code,\n numberDataToCode,\n addCode,\n Codes,\n ColumnToCodeCtx,\n} from '../code';\nimport { columnCode, identityToCode } from '../code';\nimport { Operators } from '../operators';\nimport { TableData } from '../../tableData';\nimport { BaseNumberData } from '../column-data-types';\nimport { ColumnSchemaConfig } from '../column-schema';\nimport { joinTruthy } from '../../utils';\n\nexport interface NumberColumnData extends BaseNumberData, Column.Data {\n identity?: TableData.Identity;\n}\n\nexport interface SerialColumnData extends NumberColumnData {\n default: true;\n}\n\nexport abstract class NumberBaseColumn<\n Schema extends ColumnSchemaConfig,\n SchemaType extends Schema['__schemaType'],\n> extends Column {\n declare __schema: Schema;\n declare __type: number;\n declare __inputType: number;\n declare inputSchema: SchemaType;\n declare data: NumberColumnData;\n declare __outputType: number;\n declare outputSchema: SchemaType;\n declare __queryType: number;\n declare querySchema: SchemaType;\n operators = Operators.number;\n}\n\nexport abstract class IntegerBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberBaseColumn<Schema, ReturnType<Schema['int']>> {\n declare data: NumberColumnData;\n declare querySchema: ReturnType<Schema['int']>;\n constructor(schema: Schema) {\n super(schema, schema.int() as never);\n this.data.int = true;\n }\n}\n\nexport abstract class NumberAsStringBaseColumn<\n Schema extends ColumnSchemaConfig,\n InputType = string | number,\n> extends Column {\n declare __schema: Schema;\n declare __type: string;\n declare __inputType: InputType;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.number;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: InputType;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n declare data: Column.Data;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n this.data.jsonCast = 'text';\n }\n}\n\nexport interface DecimalColumnData extends Column.Data {\n numericPrecision?: number;\n numericScale?: number;\n}\n\n// exact numeric of selectable precision\nexport class DecimalColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema> {\n declare data: DecimalColumnData;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.number;\n dataType = 'numeric' as const;\n\n constructor(\n schema: Schema,\n numericPrecision?: number,\n numericScale?: number,\n ) {\n super(schema);\n this.data.numericPrecision = numericPrecision;\n this.data.numericScale = numericScale;\n this.data.alias = 'decimal';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { numericPrecision, numericScale } = this.data;\n return columnCode(\n this,\n ctx,\n key,\n `decimal(${numericPrecision || ''}${\n numericScale ? `, ${numericScale}` : ''\n })`,\n );\n }\n\n toSQL() {\n const { numericPrecision, numericScale } = this.data;\n\n return joinTruthy(\n this.dataType,\n numericPrecision\n ? numericScale\n ? `(${numericPrecision}, ${numericScale})`\n : `(${numericPrecision})`\n : undefined,\n );\n }\n}\n\nconst skipNumberMethods = { int: true } as const;\n\nconst intToCode = (\n column: Column,\n ctx: ColumnToCodeCtx,\n key: string,\n alias: string,\n): Code => {\n let code: Codes;\n\n if (column.data.identity) {\n code = identityToCode(column.data.identity, alias);\n } else {\n code = [`${alias}()`];\n }\n\n addCode(\n code,\n numberDataToCode(column.data, ctx.migration, skipNumberMethods),\n );\n\n return columnCode(column, ctx, key, code);\n};\n\n// signed two-byte integer\nexport class SmallIntColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int2' as const;\n declare querySchema: ReturnType<Schema['int']>;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'smallint';\n this.data.parseItem = parseInt;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return intToCode(this, ctx, key, 'smallint');\n }\n\n identity<T extends Column.Pick.Data>(\n this: T,\n options: TableData.Identity = {},\n ): Column.HasDefault<T> {\n return setColumnData(this, 'identity', options) as never;\n }\n}\n\n// signed four-byte integer\nexport class IntegerColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int4' as const;\n declare querySchema: ReturnType<Schema['int']>;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'integer';\n this.data.parseItem = parseInt;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return intToCode(this, ctx, key, 'integer');\n }\n\n identity<T extends Column.Pick.Data>(\n this: T,\n options: TableData.Identity = {},\n ): Column.HasDefault<T> {\n return setColumnData(this, 'identity', options) as never;\n }\n}\n\n// signed eight-byte integer\nexport class BigIntColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema, string | number | bigint> {\n dataType = 'int8' as const;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'bigint';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return intToCode(this, ctx, key, 'bigint');\n }\n\n identity<T extends Column.Pick.Data>(\n this: T,\n options: TableData.Identity = {},\n ): Column.HasDefault<T> {\n return setColumnData(this, 'identity', options) as never;\n }\n}\n\n// single precision floating-point number (4 bytes)\nexport class RealColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberBaseColumn<Schema, ReturnType<Schema['number']>> {\n dataType = 'float4' as const;\n declare querySchema: ReturnType<Schema['number']>;\n\n constructor(schema: Schema) {\n super(schema, schema.number() as never);\n this.data.alias = 'real';\n this.data.parseItem = parseFloat;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(\n this,\n ctx,\n key,\n `real()${numberDataToCode(this.data, ctx.migration)}`,\n );\n }\n}\n\n// double precision floating-point number (8 bytes)\nexport class DoublePrecisionColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema> {\n dataType = 'float8' as const;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'doublePrecision';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `doublePrecision()`);\n }\n}\n\n// autoincrementing two-byte integer\nexport class SmallSerialColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int2' as const;\n declare data: SerialColumnData;\n declare querySchema: ReturnType<Schema['int']>;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.int = true;\n this.data.alias = 'smallSerial';\n this.data.parseItem = parseInt;\n }\n\n toSQL() {\n return 'smallserial';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(\n this,\n ctx,\n key,\n `smallSerial()${numberDataToCode(\n this.data,\n ctx.migration,\n skipNumberMethods,\n )}`,\n );\n }\n}\n\n// autoincrementing four-byte integer\nexport class SerialColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int4' as const;\n declare data: SerialColumnData;\n declare querySchema: ReturnType<Schema['int']>;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.int = true;\n this.data.alias = 'serial';\n this.data.parseItem = parseInt;\n }\n\n toSQL() {\n return 'serial';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(\n this,\n ctx,\n key,\n `serial()${numberDataToCode(\n this.data,\n ctx.migration,\n skipNumberMethods,\n )}`,\n );\n }\n}\n\n// autoincrementing eight-byte integer\nexport class BigSerialColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema> {\n dataType = 'int8' as const;\n declare data: SerialColumnData;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'bigint';\n }\n\n toSQL() {\n return 'bigserial';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `bigSerial()`);\n }\n}\n","import {\n DateColumn,\n getDateAsDateFn,\n getDateAsNumberFn,\n TimestampColumn,\n TimestampTZColumn,\n} from './column-types/date-time';\nimport { EnumColumn } from './column-types/enum';\nimport { ArrayColumn, ArrayColumnValue } from './column-types/array';\nimport { JSONColumn, JSONTextColumn } from './column-types/json';\nimport {\n BigIntColumn,\n BigSerialColumn,\n DecimalColumn,\n DoublePrecisionColumn,\n IntegerColumn,\n RealColumn,\n SerialColumn,\n SmallIntColumn,\n SmallSerialColumn,\n} from './column-types/number';\nimport {\n CitextColumn,\n MoneyColumn,\n StringColumn,\n TextColumn,\n VarCharColumn,\n} from './column-types/string';\nimport { Column, setColumnData } from './column';\nimport { setColumnParse, setColumnParseNull } from './column.utils';\nimport { ColumnSchemaConfig } from './column-schema';\nimport { MaybeArray, noop } from '../utils';\nimport { AdapterSchemaConfigOptions } from '../adapters/adapter';\n\nexport interface DefaultSchemaConfig extends ColumnSchemaConfig<Column> {\n nullable<T extends Column.Pick.ForNullable>(this: T): Column.Nullable<T>;\n\n parse<T extends Column.Pick.ForParse, Output>(\n this: T,\n fn: (input: T['__type']) => Output,\n ): Column.Parse<T, unknown, Output>;\n\n parseNull<T extends Column.Pick.ForParseNull, Output>(\n this: T,\n fn: () => Output,\n ): Column.ParseNull<T, unknown, Output>;\n\n encode<T extends Column.Pick.Type, Input>(\n this: T,\n fn: (input: Input) => unknown,\n ): Column.Encode<T, unknown, Input>;\n\n /**\n * @deprecated use narrowType instead\n */\n asType<\n T,\n Types extends {\n type: unknown;\n __inputType: unknown;\n __outputType: unknown;\n __queryType: unknown;\n },\n >(\n this: T,\n //\n _fn: (\n type: <Type, Input = Type, Output = Type, Query = Type>() => {\n type: Type;\n __inputType: Input;\n __outputType: Output;\n __queryType: Query;\n },\n ) => Types,\n ): {\n [K in keyof T]: K extends '__type'\n ? Types['type']\n : K extends keyof Types\n ? Types[K]\n : T[K];\n };\n\n narrowType<\n T extends Column.InputOutputQueryTypes,\n Types extends Column.InputOutputQueryTypes,\n >(\n this: T,\n //\n _fn: (\n type: <\n Type extends T['__inputType'] extends T['__outputType'] &\n T['__queryType']\n ? T['__outputType'] & T['__queryType'] // generated column case\n : T['__inputType'] & T['__outputType'] & T['__queryType'],\n >() => {\n __inputType: T['__inputType'] extends never ? never : Type;\n __outputType: Type;\n __queryType: Type;\n },\n ) => Types,\n ): { [K in keyof T]: K extends keyof Types ? Types[K] : T[K] };\n\n narrowAllTypes<\n T extends Column.InputOutputQueryTypes,\n Types extends Column.InputOutputQueryTypes,\n >(\n this: T,\n //\n _fn: (\n type: <\n Types extends {\n input?: T['__inputType'];\n output?: T['__outputType'];\n query?: T['__queryType'];\n },\n >() => {\n __inputType: undefined extends Types['input']\n ? T['__inputType']\n : Types['input'];\n __outputType: undefined extends Types['output']\n ? T['__outputType']\n : Types['output'];\n __queryType: undefined extends Types['query']\n ? T['__queryType']\n : Types['query'];\n },\n ) => Types,\n ): { [K in keyof T]: K extends keyof Types ? Types[K] : T[K] };\n\n dateAsNumber<T extends Column.Pick.ForParse>(\n this: T,\n ): Column.Parse<T, unknown, number>;\n dateAsDate<T extends Column.Pick.ForParse>(\n this: T,\n ): Column.Parse<T, unknown, Date>;\n\n enum<const T extends readonly [string, ...string[]]>(\n dataType: string,\n type: T,\n ): EnumColumn<DefaultSchemaConfig, unknown, T>;\n\n array<Item extends ArrayColumnValue>(\n item: Item,\n ): ArrayColumn<DefaultSchemaConfig, Item, unknown, unknown, unknown>;\n\n json<T>(): JSONColumn<\n // (#286) the default type shouldn't conform to a function,\n // because otherwise `update` can't differentiate between a function and non-function value\n unknown extends T ? MaybeArray<string | number | boolean | object> : T,\n DefaultSchemaConfig\n >;\n\n jsonText<T>(): JSONTextColumn<\n // (#286) the default type shouldn't conform to a function,\n // because otherwise `update` can't differentiate between a function and non-function value\n unknown extends T ? MaybeArray<string | number | boolean | object> : T,\n DefaultSchemaConfig\n >;\n\n inputSchema(): undefined;\n outputSchema(): undefined;\n querySchema(): undefined;\n updateSchema(): undefined;\n pkeySchema(): undefined;\n\n smallint(): SmallIntColumn<DefaultSchemaConfig>;\n integer(): IntegerColumn<DefaultSchemaConfig>;\n real(): RealColumn<DefaultSchemaConfig>;\n smallSerial(): SmallSerialColumn<DefaultSchemaConfig>;\n serial(): SerialColumn<DefaultSchemaConfig>;\n\n bigint(): BigIntColumn<DefaultSchemaConfig>;\n decimal(\n precision?: number,\n scale?: number,\n ): DecimalColumn<DefaultSchemaConfig>;\n doublePrecision(): DoublePrecisionColumn<DefaultSchemaConfig>;\n bigSerial(): BigSerialColumn<DefaultSchemaConfig>;\n money(): MoneyColumn<DefaultSchemaConfig>;\n varchar(limit?: number): VarCharColumn<DefaultSchemaConfig>;\n text(): TextColumn<DefaultSchemaConfig>;\n string(limit?: number): StringColumn<DefaultSchemaConfig>;\n citext(): CitextColumn<DefaultSchemaConfig>;\n\n date(): DateColumn<DefaultSchemaConfig>;\n timestampNoTZ(precision?: number): TimestampColumn<DefaultSchemaConfig>;\n timestamp(precision?: number): TimestampTZColumn<DefaultSchemaConfig>;\n}\n\nexport const defaultSchemaConfig = (\n options?: AdapterSchemaConfigOptions,\n): DefaultSchemaConfig => {\n const schemaConfig = {\n intervalParse: options?.intervalParse,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parse(fn: (input: any) => unknown) {\n return setColumnParse(this as never, fn);\n },\n parseNull(fn: () => unknown) {\n return setColumnParseNull(this as never, fn);\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n encode(fn: (input: any) => unknown) {\n return setColumnData(this as Column.Pick.Data, 'encode', fn);\n },\n asType() {\n return this as never;\n },\n narrowType() {\n return this as never;\n },\n narrowAllTypes() {\n return this as never;\n },\n dateAsNumber(this: { data: Column.Data; parse(fn: unknown): unknown }) {\n return this.parse(getDateAsNumberFn(this)) as never;\n },\n dateAsDate(this: { data: Column.Data; parse(fn: unknown): unknown }) {\n return this.parse(getDateAsDateFn(this)) as never;\n },\n enum<const T extends readonly [string, ...string[]]>(\n dataType: string,\n type: T,\n ) {\n return new EnumColumn(schemaConfig, dataType, type, undefined);\n },\n array<Item extends ArrayColumnValue>(item: Item) {\n return new ArrayColumn(\n schemaConfig,\n item,\n undefined,\n options?.arrayEncode,\n );\n },\n boolean: noop,\n buffer: noop,\n unknown: noop,\n never: noop,\n stringSchema: noop,\n stringMin: noop,\n stringMax: noop,\n stringMinMax: noop,\n number: noop,\n int: noop,\n stringNumberDate: noop,\n timeInterval: noop,\n bit: noop,\n uuid: noop,\n nullable(this: Column.Pick.ForNullable) {\n return setColumnData(this, 'isNullable', true);\n },\n json() {\n return new JSONColumn(\n schemaConfig,\n undefined,\n options?.jsonEncodedByDriver,\n );\n },\n jsonText() {\n return new JSONTextColumn(schemaConfig, undefined);\n },\n setErrors: noop,\n\n smallint: () => new SmallIntColumn(schemaConfig),\n integer: () => new IntegerColumn(schemaConfig),\n real: () => new RealColumn(schemaConfig),\n smallSerial: () => new SmallSerialColumn(schemaConfig),\n serial: () => new SerialColumn(schemaConfig),\n\n bigint: () => new BigIntColumn(schemaConfig),\n decimal: (precision?: number, scale?: number) =>\n new DecimalColumn(schemaConfig, precision, scale),\n doublePrecision: () => new DoublePrecisionColumn(schemaConfig),\n bigSerial: () => new BigSerialColumn(schemaConfig),\n money: () => new MoneyColumn(schemaConfig),\n varchar: (limit: number) => new VarCharColumn(schemaConfig, limit),\n text: () => new TextColumn(schemaConfig),\n string: (limit?: number) => new StringColumn(schemaConfig, limit),\n citext: () => new CitextColumn(schemaConfig),\n\n date: () => new DateColumn(schemaConfig, options?.dateParsedByDriver),\n timestampNoTZ: (precision?: number) =>\n new TimestampColumn(schemaConfig, precision, options?.dateParsedByDriver),\n timestamp: (precision?: number) =>\n new TimestampTZColumn(\n schemaConfig,\n precision,\n options?.dateParsedByDriver,\n ),\n\n geographyPointSchema: noop,\n } as unknown as DefaultSchemaConfig;\n\n return schemaConfig;\n};\n\nexport const internalSchemaConfig = defaultSchemaConfig();\n","import { Column } from '../column';\nimport { columnCode, ColumnToCodeCtx } from '../code';\nimport { Code } from '../code';\nimport { Operators } from '../operators';\nimport {\n DefaultSchemaConfig,\n internalSchemaConfig,\n} from '../default-schema-config';\nimport { ColumnSchemaConfig } from '../column-schema';\n\n// 1 byte, true or false\nexport class BooleanColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'bool' as const;\n operators = Operators.boolean;\n declare __type: boolean;\n declare __inputType: boolean;\n declare inputSchema: ReturnType<Schema['boolean']>;\n declare __outputType: boolean;\n declare outputSchema: ReturnType<Schema['boolean']>;\n declare __queryType: boolean;\n declare querySchema: ReturnType<Schema['boolean']>;\n\n private static _instance: BooleanColumn<DefaultSchemaConfig> | undefined;\n static get instance() {\n return (this._instance ??= new BooleanColumn(internalSchemaConfig));\n }\n\n private static _instanceSkipValueToArray:\n | BooleanColumn<DefaultSchemaConfig>\n | undefined;\n static get instanceSkipValueToArray() {\n let instance = this._instanceSkipValueToArray;\n if (!instance) {\n instance = this._instanceSkipValueToArray = Object.create(this.instance);\n instance!.data.skipValueToArray = true;\n }\n return instance!;\n }\n\n constructor(schema: Schema) {\n super(schema, schema.boolean() as never);\n this.data.alias = 'boolean';\n this.data.parseItem = parseItem;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, 'boolean()');\n }\n}\n\nconst parseItem = (input: string) => input[0] === 't';\n","import { IsQuery, Query, SetQueryReturnsColumnOrThrow } from '../query/query';\nimport { Column } from './column';\nimport { ToSQLCtx } from '../query/sql/to-sql';\nimport { MoveMutativeQueryToCte } from '../query/basic-features/cte/cte.sql';\nimport {\n ArgWithBeforeAndBeforeSet,\n PrepareSubQueryForSql,\n} from '../query/internal-features/sub-query/sub-query-for-sql';\nimport { Db } from '../query/db';\nimport {\n PickQueryColumTypes,\n PickQueryQ,\n PickQueryResult,\n PickQueryResultColumnTypes,\n} from '../query/pick-query-types';\nimport {\n addValue,\n emptyArray,\n isIterable,\n MaybeArray,\n RecordUnknown,\n} from '../utils';\nimport { Expression, isExpression } from '../query/expressions/expression';\nimport { BooleanQueryColumn } from '../query/basic-features/aggregate/aggregate';\nimport { QueryThen } from '../query';\nimport {\n setValueParserToQuery,\n getValueParser,\n setValueParser,\n} from '../query/query-columns/query-column-parsers';\nimport { BooleanColumn } from './column-types/boolean';\n\n// workaround for circular dependencies between columns and sql\nlet moveMutativeQueryToCte: MoveMutativeQueryToCte;\nexport const setMoveMutativeQueryToCte = (fn: MoveMutativeQueryToCte) => {\n moveMutativeQueryToCte = fn;\n};\n\nlet prepareSubQueryForSql: PrepareSubQueryForSql;\nexport const setPrepareSubQueryForSql = (fn: PrepareSubQueryForSql) => {\n prepareSubQueryForSql = fn;\n};\n\nlet dbClass: typeof Db;\nexport const setDb = (db: typeof Db) => {\n dbClass = db;\n};\n\n/**\n * Function to turn the operator expression into SQL.\n *\n * @param key - SQL of the target to apply operator for, can be a quoted column name or an SQL expression wrapped with parens.\n * @param args - arguments of operator function.\n * @param ctx - context object for SQL conversions, for collecting query variables.\n * @param quotedAs - quoted table name.\n */\nexport interface OperatorToSQL {\n (key: string, args: [unknown], ctx: unknown, quotedAs?: string): string;\n}\n\n// Operator function type.\n// Table.count().gt(10) <- here `.gt(10)` is this operator function.\n// It discards previously defined column type operators and applies new ones,\n// for a case when operator gives a different column type.\nexport interface Operator<\n Value,\n Column extends Column.Pick.OutputTypeAndOperators =\n Column.Pick.OutputTypeAndOperators,\n> {\n <T extends PickQueryResult>(\n this: T,\n arg: Value,\n ): {\n [K in Exclude<\n keyof T,\n keyof T['result']['value']['operators']\n >]: K extends 'result'\n ? { value: Column }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<Column['__outputType']>\n : T[K];\n } & Column['operators'];\n // argument type of the function\n _opType: Value;\n}\n\n// Extend query object with given operator methods, so that user can call `gt` after calling `count`.\n// If query already has the same operators, nothing is changed.\n// Previously defined operators, if any, are **not** dropped from the query.\nexport function setQueryOperators(query: IsQuery, operators: RecordUnknown) {\n const q = (query as unknown as PickQueryQ).q;\n\n if (q.operators !== operators) {\n q.operators = operators;\n Object.assign(query, operators);\n }\n\n return query;\n}\n\n/**\n * Makes operator function that has `_op` property.\n *\n * @param _op - function to turn the operator call into SQL.\n */\nconst make = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _op: (key: string, args: any, ctx: ToSQLCtx, quotedAs?: string) => string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any => {\n return Object.assign(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function (this: PickQueryQ, value: any) {\n const { q } = this;\n\n const val = prepareOpArg(this, value);\n (q.chain ??= []).push(_op, val || value);\n\n // parser might be set by a previous type, but is not needed for boolean\n if (getValueParser(q.parsers)) {\n setValueParser(q, undefined);\n }\n\n q.getColumn = BooleanColumn.instance;\n\n // turn `this.result.value` to boolean,\n // preserve existing column name if it is set\n if (this instanceof Expression && this.result) {\n let column;\n if (this.result.value?.data.name) {\n column = Object.create(BooleanColumn.instance);\n column.data = { ...column.data, name: this.result.value.data.name };\n } else {\n column = BooleanColumn.instance;\n }\n this.result.value = column;\n }\n\n return setQueryOperators(this as never, boolean as never);\n },\n {\n // function to turn the operator expression into SQL\n _op,\n },\n //\n ) as never;\n};\n\n// is different from `make` by `(q.chain ??= []).push(_op, value -> args)`\nconst makeVarArg = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _op: (key: string, args: any[], ctx: ToSQLCtx, quotedAs?: string) => string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any => {\n return Object.assign(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function (this: PickQueryQ, ...args: any[]) {\n const { q } = this;\n\n args.forEach((arg, i) => {\n const val = prepareOpArg(this, arg);\n if (val) args[i] = val;\n });\n\n (q.chain ??= []).push(_op, args);\n\n // parser might be set by a previous type, but is not needed for boolean\n if (getValueParser(q.parsers)) {\n setValueParser(q, undefined);\n }\n\n return setQueryOperators(this as never, boolean as never);\n },\n {\n // function to turn the operator expression into SQL\n _op,\n },\n //\n ) as never;\n};\n\nexport const prepareOpArg = (q: unknown, arg: unknown) => {\n return arg instanceof dbClass\n ? prepareSubQueryForSql(q as ArgWithBeforeAndBeforeSet, arg as Query)\n : undefined;\n};\n\n// Handles array, expression object, query object to insert into sql.\n// Saves values to `ctx.values`.\nconst quoteValue = (\n arg: unknown,\n ctx: ToSQLCtx,\n quotedAs: string | undefined,\n IN?: boolean,\n): string => {\n if (arg && typeof arg === 'object') {\n if (IN && isIterable(arg)) {\n return `(${(Array.isArray(arg) ? arg : [...arg])\n .map((value) => addValue(ctx.values, value))\n .join(', ')})`;\n }\n\n if (isExpression(arg)) {\n return arg.toSQL(ctx, quotedAs);\n }\n\n if ('toSQL' in arg) {\n return `(${moveMutativeQueryToCte(ctx, arg as never)})`;\n }\n\n if (!(arg instanceof Date) && !Array.isArray(arg)) {\n arg = JSON.stringify(arg);\n }\n }\n\n return addValue(ctx.values, arg);\n};\n\nconst quoteLikeValue = (\n arg: unknown,\n ctx: ToSQLCtx,\n quotedAs: string | undefined,\n jsonArray?: boolean,\n): string => {\n if (arg && typeof arg === 'object') {\n if (!jsonArray && Array.isArray(arg)) {\n return `(${arg.map((value) => addValue(ctx.values, value)).join(', ')})`;\n }\n\n if (isExpression(arg)) {\n return arg.toSQL(ctx, quotedAs);\n }\n\n if ('toSQL' in arg) {\n return `replace(replace((${moveMutativeQueryToCte(\n ctx,\n arg as never,\n )}), '%', '\\\\\\\\%'), '_', '\\\\\\\\_')`;\n }\n }\n\n return addValue(ctx.values, (arg as string).replace(/[%_]/g, '\\\\$&'));\n};\n\n// common operators that exist for any types\ninterface Base<Value> {\n __hasSelect: true;\n equals: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n not: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n isDistinctFrom: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n isNotDistinctFrom: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n in: Operator<Value[] | IsQuery | Expression, BooleanQueryColumn>;\n notIn: Operator<Value[] | IsQuery | Expression, BooleanQueryColumn>;\n}\n\nconst base = {\n equals: make((key, value, ctx, quotedAs) =>\n value === null\n ? `${key} IS NULL`\n : `${key} = ${quoteValue(value, ctx, quotedAs)}`,\n ),\n not: make((key, value, ctx, quotedAs) =>\n value === null\n ? `${key} IS NOT NULL`\n : `${key} <> ${quoteValue(value, ctx, quotedAs)}`,\n ),\n isDistinctFrom: make(\n (key, value, ctx, quotedAs) =>\n `${key} IS DISTINCT FROM ${quoteValue(value, ctx, quotedAs)}`,\n ),\n isNotDistinctFrom: make(\n (key, value, ctx, quotedAs) =>\n `${key} IS NOT DISTINCT FROM ${quoteValue(value, ctx, quotedAs)}`,\n ),\n in: make((key, value, ctx, quotedAs) =>\n Array.isArray(value) && !value.length\n ? 'false'\n : `${key} IN ${quoteValue(value, ctx, quotedAs, true)}`,\n ),\n notIn: make((key, value, ctx, quotedAs) =>\n Array.isArray(value) && !value.length\n ? 'true'\n : `NOT ${key} IN ${quoteValue(value, ctx, quotedAs, true)}`,\n ),\n} as Base<unknown>;\n\ninterface OperatorsBooleanSelf extends OperatorsBoolean {\n result: { value: BooleanQueryColumn };\n}\n\n// Numeric, date, and time can be compared with `lt`, `gt`, so it's generic.\nexport interface Ord<Value> extends Base<Value> {\n lt: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n lte: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n gt: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n gte: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n between: Operator<\n [Value | IsQuery | Expression, Value | IsQuery | Expression],\n BooleanQueryColumn\n >;\n}\n\nexport type OperatorsNumber = Ord<number>;\n\nconst ord = {\n ...base,\n lt: make(\n (key, value, ctx, quotedAs) =>\n `${key} < ${quoteValue(value, ctx, quotedAs)}`,\n ),\n lte: make(\n (key, value, ctx, quotedAs) =>\n `${key} <= ${quoteValue(value, ctx, quotedAs)}`,\n ),\n gt: make(\n (key, value, ctx, quotedAs) =>\n `${key} > ${quoteValue(value, ctx, quotedAs)}`,\n ),\n gte: make(\n (key, value, ctx, quotedAs) =>\n `${key} >= ${quoteValue(value, ctx, quotedAs)}`,\n ),\n between: make(\n (key, [from, to], ctx, quotedAs) =>\n `${key} BETWEEN ${quoteValue(from, ctx, quotedAs)} AND ${quoteValue(\n to,\n ctx,\n quotedAs,\n )}`,\n ),\n} as OperatorsNumber;\n\n// Boolean type operators\nexport interface OperatorsBoolean extends Ord<boolean> {\n and: Operator<OperatorsBooleanSelf, BooleanQueryColumn>;\n or: Operator<OperatorsBooleanSelf, BooleanQueryColumn>;\n}\n\nconst boolean = {\n ...ord,\n and: make(\n (key, value, ctx, quotedAs) =>\n `${key} AND ${value.q.expr.toSQL(ctx, quotedAs)}`,\n ),\n or: make(\n (key, value, ctx, quotedAs) =>\n `(${key}) OR (${value.q.expr.toSQL(ctx, quotedAs)})`,\n ),\n} as unknown as OperatorsBoolean;\n\n// Text type operators\nexport interface OperatorsText extends Base<string> {\n contains: Operator<string | IsQuery | Expression, BooleanQueryColumn>;\n containsSensitive: Operator<\n string | IsQuery | Expression,\n BooleanQueryColumn\n >;\n startsWith: Operator<string | IsQuery | Expression, BooleanQueryColumn>;\n startsWithSensitive: Operator<\n string | IsQuery | Expression,\n BooleanQueryColumn\n >;\n endsWith: Operator<string | IsQuery | Expression, BooleanQueryColumn>;\n endsWithSensitive: Operator<\n string | IsQuery | Expression,\n BooleanQueryColumn\n >;\n}\n\nconst text = {\n ...base,\n contains: make(\n (key, value, ctx, quotedAs) =>\n `${key} ILIKE '%' || ${quoteLikeValue(value, ctx, quotedAs)} || '%'`,\n ),\n containsSensitive: make(\n (key, value, ctx, quotedAs) =>\n `${key} LIKE '%' || ${quoteLikeValue(value, ctx, quotedAs)} || '%'`,\n ),\n startsWith: make(\n (key, value, ctx, quotedAs) =>\n `${key} ILIKE ${quoteLikeValue(value, ctx, quotedAs)} || '%'`,\n ),\n startsWithSensitive: make(\n (key, value, ctx, quotedAs) =>\n `${key} LIKE ${quoteLikeValue(value, ctx, quotedAs)} || '%'`,\n ),\n endsWith: make(\n (key, value, ctx, quotedAs) =>\n `${key} ILIKE '%' || ${quoteLikeValue(value, ctx, quotedAs)}`,\n ),\n endsWithSensitive: make(\n (key, value, ctx, quotedAs) =>\n `${key} LIKE '%' || ${quoteLikeValue(value, ctx, quotedAs)}`,\n ),\n} as OperatorsText;\n\nexport interface OperatorsOrdinalText extends Ord<string>, OperatorsText {}\n\nconst ordinalText = {\n ...ord,\n ...text,\n} as OperatorsOrdinalText;\n\ninterface JsonPathQueryOptions {\n vars?: RecordUnknown;\n silent?: boolean;\n}\n\ninterface JsonPathQueryTypeOptions<\n T extends PickQueryColumTypes,\n C extends Column.Pick.QueryColumn,\n> extends JsonPathQueryOptions {\n type?: (types: T['columnTypes']) => C;\n}\n\ninterface JsonPathQuery {\n /**\n * Selects a value from JSON data using a JSON path.\n *\n * Calls the [jsonb_path_query_first](https://www.postgresql.org/docs/current/functions-json.html) Postgres function.\n *\n * Type can be provided via `{ type: (t) => t.columnType() }` options, by default the type is `unknown`.\n *\n * Optionally takes `vars` and `silent` parameters, see [Postgres docs](https://www.postgresql.org/docs/current/functions-json.html) for details.\n *\n * The `type` option sets the output type when selecting a value,\n * also it makes specific operators available in `where`, so that you can apply `contains` if the type is text, and `gt` if the type is numeric.\n *\n * ```ts\n * // query a single value from a JSON data,\n * // because of the provided type, string JSON value will be parsed to a Date object.\n * const value = await db.table\n * .get('data')\n * .jsonPathQueryFirst('$.path.to.date', { type: (t) => t.date().asDate() });\n *\n * // using it in a select\n * const records = await db.table.select({\n * date: (q) =>\n * q.get('data').jsonPathQueryFirst('$[*] ? (@ = key)', {\n * type: (t) => t.integer(),\n * // defining `vars` and `silent`\n * vars: { key: 'key' },\n * silent: true,\n * }),\n * });\n *\n * // using it in `where`\n * const filtered = await db.table.where((q) =>\n * // filtering records by the `name` property from the `data` JSON column\n * q.get('data').jsonPathQueryFirst('$.name').equals('name'),\n * );\n *\n * // using it in update\n * await db.table.find(id).update({\n * // using data property to set the `name` column\n * name: (q) =>\n * q.get('data').jsonPathQueryFirst('$.name', { type: (t) => t.string() }),\n * });\n *\n * // filtering records to contain 'word' in the json property \"name\"\n * await db.table.where((q) =>\n * q\n * .get('data')\n * .jsonPathQueryFirst('$.name', { type: (t) => t.string() })\n * .contains('word'),\n * );\n * ```\n *\n * @param path - JSON path\n * @param options - can have type, vars, silent\n */\n <\n T extends PickQueryResultColumnTypes,\n C extends Column.Pick.QueryColumn = Column.Pick.QueryColumnOfTypeAndOps<\n string,\n unknown,\n OperatorsAny\n >,\n >(\n this: T,\n path: string,\n options?: JsonPathQueryTypeOptions<T, C>,\n ): Omit<\n SetQueryReturnsColumnOrThrow<T, C>,\n keyof T['result']['value']['operators']\n > &\n C['operators'];\n\n // disallow it from `where`\n _opType: never;\n}\n\n// JSON type operators\nexport interface OperatorsJson extends Ord<unknown> {\n jsonPathQueryFirst: JsonPathQuery;\n jsonSupersetOf: Operator<unknown | IsQuery | Expression, BooleanQueryColumn>;\n jsonSubsetOf: Operator<unknown | IsQuery | Expression, BooleanQueryColumn>;\n jsonSet: {\n /**\n * Returns a JSON value/object/array where a given value is set at the given path.\n * The path is a key or an array of keys to access the value.\n *\n * Calls the [jsonb_set](https://www.postgresql.org/docs/current/functions-json.html) Postgres function.\n *\n * It can be used in all contexts on a single JSON value.\n *\n * ```ts\n * await db.table.find(id).update({\n * data: (q) => q.get('data').jsonSet(['path', 'to', 'value'], 'new value'),\n * // supports sql for the value\n * data: (q) => q.get('data').jsonSet(['path', 'to', 'value'], sql`'new value'`),\n * });\n * ```\n *\n * @param path - key or array of keys\n * @param value - value to set\n */\n <T extends PickQueryResult>(\n this: T,\n path: MaybeArray<string | number>,\n value: unknown,\n ): T;\n // disallow it from `where`\n _opType: never;\n };\n jsonReplace: {\n /**\n * The same as {@link jsonSet}, but sets the last argument of `jsonb_set` to false,\n * so this function only has effect when the value already existed in the JSON.\n *\n * ```ts\n * await db.table.find(id).update({\n * // data.path.to.value will be updated only if it already was defined\n * data: (q) => q.get('data').jsonReplace(['path', 'to', 'value'], 'new value'),\n * // supports sql for the value\n * data: (q) =>\n * q.get('data').jsonReplace(['path', 'to', 'value'], sql`'new value'`),\n * });\n * ```\n *\n * @param path - key or array of keys\n * @param value - value to set\n */\n <T extends PickQueryResult>(\n this: T,\n path: MaybeArray<string | number>,\n value: unknown,\n ): T;\n // disallow it from `where`\n _opType: never;\n };\n jsonInsert: {\n /**\n * Inserts a value into a given position of JSON array and returns the whole array.\n * The path is a key or an array of keys to access the value.\n *\n * If a value exists at the given path, the value is not replaced.\n *\n * Provide `{ after: true }` option to insert a value after a given position.\n *\n * Calls the [jsonb_insert](https://www.postgresql.org/docs/current/functions-json.html) Postgres function.\n *\n * It can be used in all contexts on a single JSON value.\n *\n * ```ts\n * // update the record with data { tags: ['two'] } to have data { tags: ['one', 'two'] }\n * await db.table.find(id).update({\n * data: (q) => q.get('data').jsonInsert(['tags', 0], 'one'),\n * // supports sql for the value\n * data: (q) => q.get('data').jsonInsert(['tags', 0], sql`'one'`),\n * });\n *\n * // add 'three' after 'two'\n * await db.table.find(id).update({\n * data: (q) => q.get('data').jsonInsert(['tags', 1], 'three', { after: true }),\n * });\n * ```\n *\n * @param path - key or array of keys\n * @param value - value to insert\n * @param options - can have `after: true`\n */\n <T extends PickQueryResult>(\n this: T,\n path: MaybeArray<string | number>,\n value: unknown,\n options?: { after?: boolean },\n ): T;\n // disallow it from `where`\n _opType: never;\n };\n jsonRemove: {\n /**\n * Remove a value from a JSON object or array at a given path.\n * The path is a key or an array of keys to access the value.\n *\n * Uses the [#-](https://www.postgresql.org/docs/current/functions-json.html) Postgres operator.\n *\n * It can be used in all contexts on a single JSON value.\n *\n * ```ts\n * // the record has data { tags: ['one', 'two'] }\n * // removing the first tag, the data will be { tags: ['two'] }\n * const result = await db.table.find(id).update({\n * data: (q) => q.get('data').jsonRemove(['tags', 0]),\n * });\n * ```\n *\n * @param path - key or array of keys\n */\n <T extends PickQueryResult>(this: T, path: MaybeArray<string | number>): T;\n // disallow it from `where`\n _opType: never;\n };\n}\n\nconst encodeJsonPath = (ctx: ToSQLCtx, path: MaybeArray<string | number>) =>\n addValue(ctx.values, `{${Array.isArray(path) ? path.join(', ') : path}}`);\n\nconst jsonPathQueryOp = (\n key: string,\n [path, options]: [path: string, options?: JsonPathQueryOptions],\n ctx: ToSQLCtx,\n) =>\n `jsonb_path_query_first(${key}, ${addValue(ctx.values, path)}${\n options?.vars\n ? `, ${addValue(ctx.values, JSON.stringify(options.vars))}${\n options.silent ? ', true' : ''\n }`\n : options?.silent\n ? ', NULL, true'\n : ''\n })`;\n\nconst shouldEncodeJson = (ctx: ToSQLCtx) =>\n ctx.q.adapter.driverAdapter.schemaConfig?.jsonEncodedByDriver === false;\n\nconst quoteJsonValue = (\n arg: unknown,\n ctx: ToSQLCtx,\n quotedAs: string | undefined,\n IN?: boolean,\n): string => {\n if (arg && typeof arg === 'object') {\n if (IN && Array.isArray(arg)) {\n return `(${arg\n .map((value) =>\n shouldEncodeJson(ctx)\n ? addValue(ctx.values, JSON.stringify(value))\n : addValue(ctx.values, value),\n )\n .join(', ')})`;\n }\n\n if (Array.isArray(arg)) {\n return shouldEncodeJson(ctx)\n ? addValue(ctx.values, JSON.stringify(arg))\n : addValue(ctx.values, arg);\n }\n\n if (isExpression(arg)) {\n return 'to_jsonb(' + arg.toSQL(ctx, quotedAs) + ')';\n }\n\n if ('toSQL' in arg) {\n return `to_jsonb((${moveMutativeQueryToCte(ctx, arg as never)}))`;\n }\n }\n\n return shouldEncodeJson(ctx)\n ? addValue(ctx.values, JSON.stringify(arg))\n : addValue(ctx.values, arg);\n};\n\nconst serializeJsonValue = (\n arg: unknown,\n ctx: ToSQLCtx,\n quotedAs: string | undefined,\n): string => {\n if (arg && typeof arg === 'object') {\n if (isExpression(arg)) {\n return 'to_jsonb(' + arg.toSQL(ctx, quotedAs) + ')';\n }\n\n if ('toSQL' in arg) {\n return `to_jsonb((${moveMutativeQueryToCte(ctx, arg as never)}))`;\n }\n }\n\n return addValue(ctx.values, JSON.stringify(arg));\n};\n\nconst json = {\n ...ord,\n equals: make((key, value, ctx, quotedAs) =>\n value === null\n ? `nullif(${key}, 'null'::jsonb) IS NULL`\n : `${key} = ${quoteJsonValue(value, ctx, quotedAs)}`,\n ),\n not: make((key, value, ctx, quotedAs) =>\n value === null\n ? `nullif(${key}, 'null'::jsonb) IS NOT NULL`\n : `${key} != ${quoteJsonValue(value, ctx, quotedAs)}`,\n ),\n isDistinctFrom: make(\n (key, value, ctx, quotedAs) =>\n `${key} IS DISTINCT FROM ${quoteJsonValue(value, ctx, quotedAs)}`,\n ),\n isNotDistinctFrom: make(\n (key, value, ctx, quotedAs) =>\n `${key} IS NOT DISTINCT FROM ${quoteJsonValue(value, ctx, quotedAs)}`,\n ),\n in: make((key, value, ctx, quotedAs) =>\n Array.isArray(value) && !value.length\n ? 'false'\n : `${key} IN ${quoteJsonValue(value, ctx, quotedAs, true)}`,\n ),\n notIn: make((key, value, ctx, quotedAs) =>\n Array.isArray(value) && !value.length\n ? 'true'\n : `NOT ${key} IN ${quoteJsonValue(value, ctx, quotedAs, true)}`,\n ),\n jsonPathQueryFirst: Object.assign(\n function (\n this: IsQuery,\n path: string,\n options?: JsonPathQueryTypeOptions<\n PickQueryColumTypes,\n Column.Pick.QueryColumn\n >,\n ) {\n const { q, columnTypes } = this as Query;\n const chain = (q.chain ??= []);\n chain.push(jsonPathQueryOp, [path, options]);\n\n if (getValueParser(q.parsers)) {\n setValueParser(q, undefined);\n }\n\n if (options?.type) {\n const type = options.type(columnTypes);\n setValueParserToQuery(q, type);\n\n // push the type cast `::type` only if operator is applied\n chain.push = (...args: unknown[]) => {\n chain.push = Array.prototype.push;\n chain.push((s: string) => `${s}::${type.dataType}`, emptyArray);\n return chain.push(...args);\n };\n\n return setQueryOperators(this, type.operators);\n }\n\n return this;\n },\n { _op: jsonPathQueryOp },\n ) as never,\n jsonSupersetOf: make(\n (key, value, ctx, quotedAs) =>\n `${key} @> ${quoteValue(value, ctx, quotedAs)}`,\n ),\n jsonSubsetOf: make(\n (key, value, ctx, quotedAs) =>\n `${key} <@ ${quoteValue(value, ctx, quotedAs)}`,\n ),\n jsonSet: makeVarArg(\n (key, [path, value], ctx, quotedAs) =>\n `jsonb_set(${key}, ${encodeJsonPath(ctx, path)}, ${serializeJsonValue(\n value,\n ctx,\n quotedAs,\n )})`,\n ),\n jsonReplace: makeVarArg(\n (key, [path, value], ctx, quotedAs) =>\n `jsonb_set(${key}, ${encodeJsonPath(ctx, path)}, ${serializeJsonValue(\n value,\n ctx,\n quotedAs,\n )}, false)`,\n ),\n jsonInsert: makeVarArg(\n (key, [path, value, options], ctx, quotedAs) =>\n `jsonb_insert(${key}, ${encodeJsonPath(ctx, path)}, ${serializeJsonValue(\n value,\n ctx,\n quotedAs,\n )}${options?.after ? ', true' : ''})`,\n ),\n jsonRemove: makeVarArg(\n (key, [path], ctx) => `(${key} #- ${encodeJsonPath(ctx, path)})`,\n ),\n} as OperatorsJson;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type OperatorsAny = Base<any>;\nexport type OperatorsDate = Ord<Date | string>;\n\nexport type OperatorsTime = Ord<string>;\n\nexport interface OperatorsArray<T> extends Ord<T[]> {\n has: Operator<T | IsQuery | Expression, BooleanQueryColumn>;\n hasEvery: Operator<T[] | IsQuery | Expression, BooleanQueryColumn>;\n hasSome: Operator<T[] | IsQuery | Expression, BooleanQueryColumn>;\n containedIn: Operator<T[] | IsQuery | Expression, BooleanQueryColumn>;\n length: {\n _opType:\n | number\n | {\n [K in Exclude<\n keyof OperatorsNumber,\n '__hasSelect'\n >]?: OperatorsNumber[K]['_opType'];\n };\n };\n}\n\nconst array = {\n ...ord,\n has: make(\n (key, value, ctx, quotedAs) =>\n `${quoteValue(value, ctx, quotedAs)} = ANY(${key})`,\n ),\n hasEvery: make(\n (key, value, ctx, quotedAs) =>\n `${key} @> ${quoteValue(value, ctx, quotedAs)}`,\n ),\n hasSome: make(\n (key, value, ctx, quotedAs) =>\n `${key} && ${quoteValue(value, ctx, quotedAs)}`,\n ),\n containedIn: make(\n (key, value, ctx, quotedAs) =>\n `${key} <@ ${quoteValue(value, ctx, quotedAs)}`,\n ),\n length: make((key, value, ctx, quotedAs) => {\n const expr = `COALESCE(array_length(${key}, 1), 0)`;\n return typeof value === 'number'\n ? `${expr} = ${quoteValue(value, ctx, quotedAs)}`\n : Object.keys(value)\n .map((key) =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (ord as any)[key]._op(expr, value[key], ctx, quotedAs),\n )\n .join(' AND ');\n }),\n} as OperatorsArray<unknown>;\n\n// `Operators` has operators grouped by types. To be used by column classes.\nexport const Operators: {\n any: OperatorsAny;\n ordinalText: OperatorsOrdinalText;\n boolean: OperatorsBoolean;\n number: OperatorsNumber;\n date: OperatorsDate;\n time: OperatorsTime;\n text: OperatorsText;\n json: OperatorsJson;\n array: OperatorsArray<unknown>;\n} = {\n any: base,\n boolean,\n ordinalText,\n number: ord,\n date: ord,\n time: ord,\n text,\n json,\n array,\n} as never;\n","import { Column, getDefaultLanguage, setColumnData } from '../column';\nimport { NumberColumnData } from './number';\nimport { Code, ColumnToCodeCtx, stringDataToCode } from '../code';\nimport { columnCode } from '../code';\nimport { RawSql } from '../../query/expressions/raw-sql';\nimport { Operators, OperatorsOrdinalText, OperatorsText } from '../operators';\nimport { setColumnDefaultParse } from '../column.utils';\nimport {\n DefaultSchemaConfig,\n internalSchemaConfig,\n} from '../default-schema-config';\nimport { StringData } from '../column-data-types';\nimport { ColumnSchemaConfig } from '../column-schema';\nimport {\n joinTruthy,\n quoteObjectKey,\n RecordString,\n toSnakeCase,\n} from '../../utils';\nimport { StaticSQLArgs } from '../../query/expressions/expression';\nimport { SearchWeightRecord } from '../../query';\n\nexport type TextColumnData = StringData;\n\nexport abstract class TextBaseColumn<\n Schema extends ColumnSchemaConfig,\n Ops = OperatorsText,\n> extends Column {\n declare __schema: Schema;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare data: TextColumnData;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text as Ops;\n\n constructor(\n schema: Schema,\n schemaType: ReturnType<\n Schema['stringSchema']\n > = schema.stringSchema() as never,\n ) {\n super(schema, schemaType);\n }\n}\n\nexport abstract class LimitedTextBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends TextBaseColumn<Schema, OperatorsOrdinalText> {\n declare data: TextColumnData & { maxChars?: number };\n operators = Operators.ordinalText;\n\n constructor(schema: Schema, limit?: number) {\n super(\n schema,\n (limit !== undefined\n ? schema.stringMax(limit)\n : schema.stringSchema()) as never,\n );\n this.data.maxChars = limit;\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.maxChars !== undefined && `(${this.data.maxChars})`,\n );\n }\n}\n\n// character varying(n), varchar(n) variable-length with limit\nexport class VarCharColumn<\n Schema extends ColumnSchemaConfig,\n> extends LimitedTextBaseColumn<Schema> {\n dataType = 'varchar' as const;\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { maxChars } = this.data;\n return columnCode(\n this,\n ctx,\n key,\n `varchar(${maxChars ?? ''})${stringDataToCode(this.data, ctx.migration)}`,\n );\n }\n}\n\nexport class StringColumn<\n Schema extends ColumnSchemaConfig,\n> extends VarCharColumn<Schema> {\n constructor(schema: Schema, limit = 255) {\n super(schema, limit);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n let max: number | undefined = this.data.maxChars;\n if (max === 255) max = undefined;\n return columnCode(\n this,\n ctx,\n key,\n `string(${max ?? ''})${stringDataToCode(this.data, ctx.migration)}`,\n );\n }\n}\n\nconst textColumnToCode = (\n column: TextBaseColumn<ColumnSchemaConfig> & {\n data: TextColumnData & { minArg?: number; maxArg?: number };\n },\n ctx: ColumnToCodeCtx,\n key: string,\n) => {\n const data = { ...column.data };\n let args = '';\n const hasMax = data.maxArg !== undefined && data.max === data.maxArg;\n if ((data.minArg !== undefined && data.min === data.minArg) || hasMax) {\n if (data.minArg !== 0 || (hasMax && data.max !== Infinity)) {\n args += data.minArg;\n }\n delete data.min;\n if (hasMax) {\n if (data.maxArg !== Infinity) {\n args += `, ${data.maxArg}`;\n }\n delete data.max;\n }\n }\n return columnCode(\n column,\n ctx,\n key,\n `${column.dataType}(${args})${stringDataToCode(data, ctx.migration)}`,\n );\n};\n\n// text\tvariable unlimited length\nexport class TextColumn<\n Schema extends ColumnSchemaConfig,\n> extends TextBaseColumn<Schema, OperatorsOrdinalText> {\n dataType = 'text' as const;\n declare data: TextColumnData & { minArg?: number; maxArg?: number };\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.ordinalText;\n\n private static _instance: TextColumn<DefaultSchemaConfig> | undefined;\n static get instance() {\n return (this._instance ??= new TextColumn(internalSchemaConfig));\n }\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return textColumnToCode(this, ctx, key);\n }\n}\n\nconst byteaParse = (val: unknown) =>\n typeof val === 'string' ? Buffer.from(val.slice(2), 'hex') : val;\n\n// To store binary strings\nexport class ByteaColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'bytea' as const;\n operators = Operators.ordinalText;\n declare __type: string;\n declare __inputType: Buffer;\n declare inputSchema: ReturnType<Schema['buffer']>;\n declare __outputType: Buffer;\n declare outputSchema: ReturnType<Schema['buffer']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n\n constructor(schema: Schema) {\n super(schema, schema.buffer() as never);\n setColumnDefaultParse(this, byteaParse);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `bytea()`);\n }\n}\n\n// point\t16 bytes\tPoint on a plane\t(x,y)\nexport class PointColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'point' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `point()`);\n }\n}\n\n// line\t32 bytes\tInfinite line\t{A,B,C}\nexport class LineColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'line' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `line()`);\n }\n}\n\n// lseg\t32 bytes\tFinite line segment\t((x1,y1),(x2,y2))\nexport class LsegColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'lseg' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `lseg()`);\n }\n}\n\n// box\t32 bytes\tRectangular box\t((x1,y1),(x2,y2))\nexport class BoxColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'box' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `box()`);\n }\n}\n\n// path\t16+16n bytes\tClosed path (similar to polygon)\t((x1,y1),...)\n// path\t16+16n bytes\tOpen path\t[(x1,y1),...)\nexport class PathColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'path' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `path()`);\n }\n}\n\n// polygon\t40+16n bytes\tPolygon (similar to closed path)\t((x1,y1),...)\nexport class PolygonColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'polygon' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `polygon()`);\n }\n}\n\n// circle\t24 bytes\tCircle\t<(x,y),r> (center point and radius)\nexport class CircleColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'circle' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `circle()`);\n }\n}\n\nexport class MoneyColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'money' as const;\n declare __type: string;\n declare data: NumberColumnData;\n declare __inputType: string | number;\n declare inputSchema: ReturnType<Schema['number']>;\n declare __outputType: number;\n declare outputSchema: ReturnType<Schema['number']>;\n declare __queryType: string | number;\n declare querySchema: ReturnType<Schema['number']>;\n operators = Operators.number;\n\n constructor(schema: Schema) {\n super(schema, schema.number() as never);\n setColumnDefaultParse(this, moneyParse);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `money()`);\n }\n}\n\nconst moneyParse = Object.assign(\n function (input: unknown) {\n return input === null\n ? input\n : parseFloat((input as string).replace(/,/g, '').replace(/\\$/g, ''));\n },\n {\n hideFromCode: true,\n },\n);\n\n// cidr\t7 or 19 bytes\tIPv4 and IPv6 networks\nexport class CidrColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'cidr' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `cidr()`);\n }\n}\n\n// inet\t7 or 19 bytes\tIPv4 and IPv6 hosts and networks\nexport class InetColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'inet' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `inet()`);\n }\n}\n\n// macaddr\t6 bytes\tMAC addresses\nexport class MacAddrColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'macaddr' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `macaddr()`);\n }\n}\n\n// macaddr8\t8 bytes\tMAC addresses (EUI-64 format)\nexport class MacAddr8Column<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'macaddr8' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `macaddr8()`);\n }\n}\n\n// Bit strings are strings of 1's and 0's.\n// They can be used to store or visualize bit masks.\n// There are two SQL bit types: bit(n) and bit varying(n), where n is a positive integer.\nexport class BitColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'bit' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['bit']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['bit']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['bit']>;\n operators = Operators.ordinalText;\n declare data: Column.Data & { length: number };\n\n constructor(schema: Schema, length: number) {\n super(schema, schema.bit(length) as ReturnType<Schema['bit']>);\n this.data.length = length;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { length } = this.data;\n return columnCode(this, ctx, key, `bit(${length})`);\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.length !== undefined && `(${this.data.length})`,\n );\n }\n}\n\nexport class BitVaryingColumn<\n Schema extends ColumnSchemaConfig,\n> extends Column {\n declare __schema: Schema;\n dataType = 'varbit' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['bit']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['bit']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['bit']>;\n operators = Operators.ordinalText;\n declare data: Column.Data & { length?: number };\n\n constructor(schema: Schema, length?: number) {\n super(schema, schema.bit(length) as ReturnType<Schema['bit']>);\n this.data.length = length;\n this.data.alias = 'bitVarying';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { length } = this.data;\n return columnCode(this, ctx, key, `bitVarying(${length ?? ''})`);\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.length !== undefined && `(${this.data.length})`,\n );\n }\n}\n\ntype TsVectorGeneratedColumns = string[] | SearchWeightRecord;\n\n// A tsvector value is a sorted list of distinct lexemes\nexport class TsVectorColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'tsvector' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.ordinalText;\n\n constructor(\n schema: Schema,\n public defaultLanguage = getDefaultLanguage(),\n ) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `tsvector()`);\n }\n\n /**\n * For `tsvector` column type, it can also accept language (optional) and columns:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('post', (t) => ({\n * id: t.id(),\n * title: t.text(),\n * body: t.text(),\n * // join title and body into a single ts_vector\n * generatedTsVector: t.tsvector().generated(['title', 'body']).searchIndex(),\n * // with language:\n * spanishTsVector: t\n * .tsvector()\n * .generated('spanish', ['title', 'body'])\n * .searchIndex(),\n * }));\n * });\n * ```\n *\n * @param args\n */\n generated<T extends Column.Pick.Data>(\n this: T,\n ...args:\n | StaticSQLArgs\n | [language: string, columns: TsVectorGeneratedColumns]\n | [columns: TsVectorGeneratedColumns]\n ): Column.Generated<T> {\n const arg = args[0];\n // early return on StaticSQLArgs case\n if (typeof arg === 'object' && 'raw' in arg) {\n return super.generated(...(args as StaticSQLArgs)) as never;\n }\n\n const toSQL: Column.Data.Generated['toSQL'] = (ctx) => {\n const first = args[0];\n const target = typeof first === 'string' ? (args[1] as string[]) : first;\n\n const language =\n typeof first === 'string'\n ? first\n : (this as unknown as TsVectorColumn<ColumnSchemaConfig>)\n .defaultLanguage;\n\n const { snakeCase } = ctx;\n\n let sql;\n if (Array.isArray(target)) {\n const columns =\n target.length === 1\n ? `\"${snakeCase ? toSnakeCase(target[0]) : target[0]}\"`\n : target\n .map(\n (column) =>\n `coalesce(\"${\n snakeCase ? toSnakeCase(column) : column\n }\", '')`,\n )\n .join(` || ' ' || `);\n\n sql = `to_tsvector('${language}', ${columns})`;\n } else {\n for (const key in target) {\n sql =\n (sql ? sql + ' || ' : '(') +\n `setweight(to_tsvector('${language}', coalesce(\"${\n snakeCase ? toSnakeCase(key) : key\n }\", '')), '${(target as RecordString)[key]}')`;\n }\n if (sql) {\n sql += ')';\n } else {\n throw new Error('Empty target in the text search generated column');\n }\n }\n\n return sql;\n };\n\n const toCode = (): string => {\n let code = '.generated(';\n\n const first = args[0];\n let target;\n if (typeof first === 'string') {\n code += `'${first}', `;\n target = args[1] as string[];\n } else {\n target = args[0];\n }\n\n if (Array.isArray(target)) {\n code += `[${target.map((x) => `'${x}'`).join(', ')}]`;\n } else {\n const pairs: string[] = [];\n for (const key in target as RecordString) {\n pairs.push(\n `${quoteObjectKey(key, false)}: '${(target as RecordString)[key]}'`,\n );\n }\n code += `{ ${pairs.join(', ')} }`;\n }\n\n return code + ')';\n };\n\n const column = setColumnData(this, 'generated', {\n toSQL,\n toCode,\n });\n column.data.readOnly = true;\n return column as never;\n }\n}\n\n// A tsquery value stores lexemes that are to be searched for\nexport class TsQueryColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'tsquery' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `tsquery()`);\n }\n}\n\nconst uuidDefaultSQL = 'gen_random_uuid()';\nconst uuidDefault = new RawSql(uuidDefaultSQL);\n\n// uuid stores Universally Unique Identifiers (UUID)\nexport class UUIDColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'uuid' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['uuid']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['uuid']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['uuid']>;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.uuid() as never);\n this.data.defaultDefault = uuidDefault;\n }\n\n /**\n * see {@link Column.primaryKey}\n */\n primaryKey<T extends Column.Pick.Data, Name extends string>(\n this: T,\n name?: Name,\n ): // using & bc otherwise the return type doesn't match `primaryKey` in ColumnType and TS complains\n T & {\n data: { primaryKey: Name; default: true };\n } {\n const column = super.primaryKey(name);\n if (!column.data.default) column.data.default = uuidDefault;\n return column as never;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `uuid()`);\n }\n}\n\n// xml data type can be used to store XML data\nexport class XMLColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'xml' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n private static _instance: XMLColumn<DefaultSchemaConfig> | undefined;\n static get instance() {\n return (this._instance ??= new XMLColumn(internalSchemaConfig));\n }\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `xml()`);\n }\n}\n\n// citext is a postgres extension\nexport class CitextColumn<\n Schema extends ColumnSchemaConfig,\n> extends TextBaseColumn<Schema, OperatorsOrdinalText> {\n declare __schema: Schema;\n dataType = 'citext' as const;\n declare data: TextColumnData & { minArg?: number; maxArg?: number };\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n this.data.extension = 'citext';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return textColumnToCode(this, ctx, key);\n }\n}\n","import { pushOrNewArrayToObjectImmutable, RecordUnknown } from '../utils';\nimport { Column, getDefaultNowFn } from './column';\nimport { RawSql } from '../query/expressions/raw-sql';\n\n// Column types returned by `...t.timestamps()` and variations.\nexport interface Timestamps<T extends Column.Pick.Data> {\n // Timestamp column with a `now()` default\n createdAt: Column.HasDefault<T>;\n // Timestamp column with a `now()` default, and it's being updated on every record update.\n updatedAt: Column.HasDefault<T>;\n}\n\n// Simplified SQL type that returns raw SQL as it is, without dealing with SQL variables.\nclass SimpleRawSQL extends RawSql {\n // Simply returning SQL provided in the constructor.\n makeSQL(): string {\n return this._sql as string;\n }\n}\n\n// Construct a simplified raw SQL.\nconst raw = (sql: string) => new SimpleRawSQL(sql);\n\nexport interface TimestampHelpers {\n /**\n * Add `createdAt` and `updatedAt` timestamps. Both have `now()` as a default, `updatedAt` is automatically updated during update.\n */\n timestamps<T extends Column.Pick.Data>(this: {\n timestamp(): T;\n }): Timestamps<T>;\n\n /**\n * The same as {@link timestamps}, for the timestamp without time zone time.\n */\n timestampsNoTZ<T extends Column.Pick.Data>(this: {\n timestampNoTZ(): T;\n }): Timestamps<T>;\n}\n\nconst makeTimestamps = <T extends Column.Pick.Data>(timestamp: () => T) => {\n const now = getDefaultNowFn();\n const nowRaw = raw(now);\n const updatedAt = (timestamp() as unknown as Column).default(nowRaw);\n let updater:\n | ((data: (RecordUnknown | (() => void))[]) => RecordUnknown | undefined)\n | undefined;\n\n updatedAt.data.modifyQuery = (q: unknown, column: Column.Pick.Data) => {\n if (!updater) {\n const key = column.data.key;\n updater = (data) => {\n if (\n data.some((item) => {\n return typeof item !== 'function' && item[key];\n })\n )\n return;\n\n return { [column.data.key]: nowRaw };\n };\n }\n\n pushOrNewArrayToObjectImmutable(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (q as any).q,\n 'updateData',\n updater,\n );\n };\n updatedAt.data.defaultTimestamp = 'updatedAt';\n\n const createdAt = (timestamp() as unknown as Column).default(nowRaw);\n createdAt.data.defaultTimestamp = 'createdAt';\n\n return {\n createdAt,\n updatedAt,\n } as never;\n};\n\nexport const timestampHelpers: TimestampHelpers = {\n timestamps<T extends Column.Pick.Data>(this: {\n timestamp(): T;\n }): Timestamps<T> {\n return makeTimestamps(this.timestamp);\n },\n\n timestampsNoTZ<T extends Column.Pick.Data>(this: {\n timestampNoTZ(): T;\n }): Timestamps<T> {\n return makeTimestamps(this.timestampNoTZ);\n },\n};\n","import { Code, ColumnToCodeCtx } from '../code';\nimport { Column } from '../column';\nimport { Operators } from '../operators';\nimport { columnCode } from '../code';\nimport { setColumnDefaultParse } from '../column.utils';\nimport { ColumnSchemaConfig } from '../column-schema';\n\nconst defaultSrid = 4326;\n\nexport interface PostgisPoint {\n lon: number;\n lat: number;\n srid?: number;\n}\n\nconst encode = ({ srid = defaultSrid, lon, lat }: PostgisPoint): string => {\n const arr = new Uint8Array(25);\n const view = new DataView(arr.buffer);\n\n // first byte 01 indicates little-endian\n view.setInt8(0, 1);\n\n // geometry type Point\n view.setInt8(1, 1);\n // it's a part of geom type, not sure why it's 32\n view.setInt8(4, 32);\n\n view.setUint32(5, srid, true);\n view.setFloat64(9, lon, true);\n view.setFloat64(17, lat, true);\n\n return uint8ArrToHex(arr);\n};\n\nexport class PostgisGeographyPointColumn<\n Schema extends ColumnSchemaConfig,\n> extends Column {\n declare __schema: Schema;\n dataType = 'geography(Point)';\n declare __type: PostgisPoint;\n declare __inputType: PostgisPoint;\n declare inputSchema: ReturnType<Schema['geographyPointSchema']>;\n declare __outputType: PostgisPoint;\n declare outputSchema: ReturnType<Schema['geographyPointSchema']>;\n declare __queryType: PostgisPoint;\n declare querySchema: ReturnType<Schema['geographyPointSchema']>;\n operators = Operators.any;\n\n // It is used by test-factory\n static encode = encode;\n\n static isDefaultPoint(typmod: number) {\n return typmodType(typmod) === 'Point' && typmodSrid(typmod) === defaultSrid;\n }\n\n constructor(schema: Schema) {\n super(schema, schema.geographyPointSchema() as never);\n setColumnDefaultParse(this, parse);\n this.data.encode = encode;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `geography.point()`);\n }\n}\n\nconst parse = (input: string): PostgisPoint => {\n const bytes = new Uint8Array(20);\n for (let i = 0; i < 40; i += 2) {\n bytes[i / 2] = parseInt(input.slice(10 + i, 12 + i), 16);\n }\n const view = new DataView(bytes.buffer);\n\n const srid = view.getUint32(0, true);\n const lon = view.getFloat64(4, true);\n const lat = view.getFloat64(12, true);\n\n return srid === defaultSrid\n ? { lon, lat }\n : {\n lon,\n lat,\n srid,\n };\n};\n\nconst typmodGetType = (typmod: number) => (typmod & 0x000000fc) >> 2;\n\nconst lwtypeName = (type: number) =>\n [\n 'Unknown',\n 'Point',\n 'LineString',\n 'Polygon',\n 'MultiPoint',\n 'MultiLineString',\n 'MultiPolygon',\n 'GeometryCollection',\n 'CircularString',\n 'CompoundCurve',\n 'CurvePolygon',\n 'MultiCurve',\n 'MultiSurface',\n 'PolyhedralSurface',\n 'Triangle',\n 'Tin',\n ][type] || 'Invalid type';\n\nconst typmodGetZ = (typmod: number) => (typmod & 0x00000002) >> 1;\n\nconst typmodGetM = (typmod: number) => typmod & 0x00000001;\n\nconst typmodType = (typmod: number) => {\n const type = typmodGetType(typmod);\n\n let s = '';\n\n if (typmod < 0 || type === 0) {\n s += 'Geometry';\n } else {\n s += lwtypeName(type);\n }\n\n if (typmod >= 0 && typmodGetZ(typmod)) s += 'Z';\n\n if (typmod >= 0 && typmodGetM(typmod)) s += 'M';\n\n return s;\n};\n\nconst typmodSrid = (typmod: number) => {\n return typmod < 0 ? 0 : ((typmod & 0x0fffff00) - (typmod & 0x10000000)) >> 8;\n};\n\nexport const postgisTypmodToSql = (typmod: number) => {\n const srid = typmodSrid(typmod);\n return typmodType(typmod) + (srid === defaultSrid ? '' : ', ' + srid);\n};\n\nlet byteToHex: string[] | undefined;\nfunction uint8ArrToHex(arr: Uint8Array) {\n if (!byteToHex) {\n byteToHex = [];\n for (let n = 0; n <= 0xff; ++n) {\n const hexOctet = n.toString(16).padStart(2, '0');\n byteToHex.push(hexOctet);\n }\n }\n\n const hexOctets = [];\n\n for (let i = 0; i < arr.length; ++i) hexOctets.push(byteToHex[arr[i]]);\n\n return hexOctets.join('');\n}\n","import { IntegerColumn } from './column-types/number';\nimport {\n BitColumn,\n BitVaryingColumn,\n BoxColumn,\n ByteaColumn,\n CidrColumn,\n CircleColumn,\n InetColumn,\n LineColumn,\n LsegColumn,\n MacAddr8Column,\n MacAddrColumn,\n PathColumn,\n PointColumn,\n PolygonColumn,\n TsQueryColumn,\n TsVectorColumn,\n UUIDColumn,\n XMLColumn,\n} from './column-types/string';\nimport { IntervalColumn, TimeColumn } from './column-types/date-time';\nimport { BooleanColumn } from './column-types/boolean';\nimport { timestampHelpers, TimestampHelpers } from './timestamps';\nimport { CustomTypeColumn, DomainColumn } from './column-types/custom-type';\nimport { RawSql, sqlFn, SqlFn } from '../query/expressions/raw-sql';\nimport { TableData } from '../tableData';\nimport { PostgisGeographyPointColumn } from './column-types/postgis';\nimport { ColumnSchemaConfig } from './column-schema';\nimport {\n Column,\n setCurrentColumnName,\n setDefaultLanguage,\n setDefaultNowFn,\n} from './column';\n\nexport const getColumnTypes = <\n ColumnTypes,\n Shape extends Column.QueryColumnsInit,\n>(\n types: ColumnTypes,\n fn: (t: ColumnTypes) => Shape,\n nowSQL: string | undefined,\n language: string | undefined,\n): Shape => {\n if (nowSQL) setDefaultNowFn(nowSQL);\n if (language) setDefaultLanguage(language);\n return fn(types);\n};\n\nexport interface DefaultColumnTypes<\n SchemaConfig extends ColumnSchemaConfig,\n> extends TimestampHelpers {\n schema: SchemaConfig;\n enum: SchemaConfig['enum'];\n array: SchemaConfig['array'];\n\n name<T>(this: T, name: string): T;\n\n sql: SqlFn;\n\n smallint: SchemaConfig['smallint'];\n integer: SchemaConfig['integer'];\n bigint: SchemaConfig['bigint'];\n numeric: SchemaConfig['decimal'];\n decimal: SchemaConfig['decimal'];\n real: SchemaConfig['real'];\n doublePrecision: SchemaConfig['doublePrecision'];\n identity(\n options?: TableData.Identity,\n ): Column.HasDefault<ReturnType<SchemaConfig['integer']>>;\n smallSerial: SchemaConfig['smallSerial'];\n serial: SchemaConfig['serial'];\n bigSerial: SchemaConfig['bigSerial'];\n money: SchemaConfig['money'];\n varchar: SchemaConfig['varchar'];\n text: SchemaConfig['text'];\n // `varchar` column with optional limit defaulting to 255.\n string: SchemaConfig['string'];\n citext: SchemaConfig['citext'];\n bytea(): ByteaColumn<SchemaConfig>;\n date: SchemaConfig['date'];\n timestampNoTZ: SchemaConfig['timestampNoTZ'];\n timestamp: SchemaConfig['timestamp'];\n time(precision?: number): TimeColumn<SchemaConfig>;\n interval(fields?: string, precision?: number): IntervalColumn<SchemaConfig>;\n boolean(): BooleanColumn<SchemaConfig>;\n point(): PointColumn<SchemaConfig>;\n line(): LineColumn<SchemaConfig>;\n lseg(): LsegColumn<SchemaConfig>;\n box(): BoxColumn<SchemaConfig>;\n path(): PathColumn<SchemaConfig>;\n polygon(): PolygonColumn<SchemaConfig>;\n circle(): CircleColumn<SchemaConfig>;\n cidr(): CidrColumn<SchemaConfig>;\n inet(): InetColumn<SchemaConfig>;\n macaddr(): MacAddrColumn<SchemaConfig>;\n macaddr8(): MacAddr8Column<SchemaConfig>;\n bit(length: number): BitColumn<SchemaConfig>;\n bitVarying(length?: number): BitVaryingColumn<SchemaConfig>;\n tsvector(): TsVectorColumn<SchemaConfig>;\n tsquery(): TsQueryColumn<SchemaConfig>;\n uuid(): UUIDColumn<SchemaConfig>;\n xml(): XMLColumn<SchemaConfig>;\n json: SchemaConfig['json'];\n jsonText: SchemaConfig['jsonText'];\n type(dataType: string): CustomTypeColumn<SchemaConfig>;\n domain(dataType: string): DomainColumn<SchemaConfig>;\n\n geography: {\n point(): PostgisGeographyPointColumn<SchemaConfig>;\n };\n}\n\nexport const makeColumnTypes = <SchemaConfig extends ColumnSchemaConfig>(\n schema: SchemaConfig,\n): DefaultColumnTypes<SchemaConfig> => {\n return {\n schema,\n enum: schema.enum,\n array: schema.array,\n\n name(name: string) {\n setCurrentColumnName(name);\n return this;\n },\n\n sql: sqlFn,\n\n smallint: schema.smallint,\n integer: schema.integer,\n bigint: schema.bigint,\n numeric: schema.decimal,\n decimal: schema.decimal,\n real: schema.real,\n doublePrecision: schema.doublePrecision,\n identity(options) {\n return (schema.integer() as IntegerColumn<SchemaConfig>).identity(\n options,\n ) as never;\n },\n smallSerial: schema.smallSerial,\n serial: schema.serial,\n bigSerial: schema.bigSerial,\n money: schema.money,\n varchar: schema.varchar,\n text: schema.text,\n string: schema.string,\n citext: schema.citext,\n bytea() {\n return new ByteaColumn<SchemaConfig>(schema);\n },\n date: schema.date,\n timestampNoTZ: schema.timestampNoTZ,\n timestamp: schema.timestamp,\n time(precision) {\n return new TimeColumn<SchemaConfig>(schema, precision);\n },\n interval(fields, precision) {\n return new IntervalColumn(\n schema,\n fields,\n precision,\n schema.intervalParse,\n );\n },\n boolean() {\n return new BooleanColumn<SchemaConfig>(schema);\n },\n point() {\n return new PointColumn<SchemaConfig>(schema);\n },\n line() {\n return new LineColumn<SchemaConfig>(schema);\n },\n lseg() {\n return new LsegColumn<SchemaConfig>(schema);\n },\n box() {\n return new BoxColumn<SchemaConfig>(schema);\n },\n path() {\n return new PathColumn<SchemaConfig>(schema);\n },\n polygon() {\n return new PolygonColumn<SchemaConfig>(schema);\n },\n circle() {\n return new CircleColumn<SchemaConfig>(schema);\n },\n cidr() {\n return new CidrColumn<SchemaConfig>(schema);\n },\n inet() {\n return new InetColumn<SchemaConfig>(schema);\n },\n macaddr() {\n return new MacAddrColumn<SchemaConfig>(schema);\n },\n macaddr8() {\n return new MacAddr8Column<SchemaConfig>(schema);\n },\n bit(length) {\n return new BitColumn<SchemaConfig>(schema, length);\n },\n bitVarying(length) {\n return new BitVaryingColumn<SchemaConfig>(schema, length);\n },\n tsvector() {\n return new TsVectorColumn<SchemaConfig>(schema);\n },\n tsquery() {\n return new TsQueryColumn<SchemaConfig>(schema);\n },\n uuid() {\n return new UUIDColumn<SchemaConfig>(schema);\n },\n xml() {\n return new XMLColumn<SchemaConfig>(schema);\n },\n json: schema.json,\n jsonText: schema.jsonText,\n type(dataType) {\n return new CustomTypeColumn<SchemaConfig>(schema, dataType);\n },\n domain(dataType) {\n return new DomainColumn<SchemaConfig>(schema, dataType);\n },\n\n geography: {\n point() {\n return new PostgisGeographyPointColumn(schema);\n },\n },\n\n ...timestampHelpers,\n };\n};\n\nRawSql.prototype.columnTypes = makeColumnTypes;\n","import { Column } from '../column';\nimport { Operators } from '../operators';\nimport { ColumnSchemaConfig } from '../column-schema';\nimport { RecordUnknown } from '../../utils';\nimport {\n CreateCtx,\n CreateSelf,\n} from '../../query/basic-features/mutate/create';\nimport { UpdateSelf } from '../../query/basic-features/mutate/update';\n\nexport abstract class VirtualColumn<\n Schema extends ColumnSchemaConfig,\n InputSchema extends Schema['__schemaType'] = ReturnType<Schema['never']>,\n> extends Column {\n declare __schema: Schema;\n dataType = '';\n declare __type: unknown;\n declare __inputType: unknown;\n declare inputSchema: InputSchema;\n declare __outputType: unknown;\n declare outputSchema: InputSchema;\n declare __queryType: unknown;\n declare querySchema: ReturnType<Schema['never']>;\n operators = Operators.any;\n\n constructor(\n schema: Schema,\n inputSchema: InputSchema = schema.never() as InputSchema,\n ) {\n super(schema, inputSchema);\n // to omit it from selection when selecting *\n this.data.explicitSelect = this.data.appReadOnly = this.data.virtual = true;\n }\n\n toCode(): never {\n throw new Error(`toCode is not implemented for virtual column`);\n }\n\n create?(\n q: CreateSelf,\n ctx: CreateCtx,\n items: unknown[],\n rowIndex: number[],\n count: number,\n ): void;\n\n update?(q: UpdateSelf, set: RecordUnknown): void;\n}\n","import { VirtualColumn } from './virtual';\nimport { RawSql } from '../../query/expressions/raw-sql';\nimport { internalSchemaConfig } from '../default-schema-config';\nimport { ColumnSchemaConfig } from '../column-schema';\n\n// unknown column is used for the case of raw SQL when user doesn't specify a column\nexport class UnknownColumn<\n Schema extends ColumnSchemaConfig,\n> extends VirtualColumn<Schema> {\n static instance = new UnknownColumn(internalSchemaConfig);\n\n selectable = true;\n\n constructor(schema: Schema) {\n super(schema, schema.unknown() as never);\n // include this column when selecting *, unlike the parent VirtualColumn\n this.data.explicitSelect =\n this.data.appReadOnly =\n this.data.virtual =\n undefined;\n }\n}\n\nRawSql.prototype.result = { value: UnknownColumn.instance };\n","import { UnknownColumn } from './column-types/unknown';\nimport { Column } from './column';\nimport { emptyObject } from '../utils';\n\nexport const anyShape = new Proxy(emptyObject, {\n get() {\n return UnknownColumn.instance;\n },\n}) as Column.QueryColumnsInit;\n","import { IsQuery, Query, QueryReturnType } from './query';\nimport { ComputedColumns } from './extra-features/computed/computed';\nimport { Column } from '../columns/column';\nimport { ColumnsShape } from '../columns/columns-shape';\nimport { CteItem } from './basic-features/cte/cte.sql';\nimport {\n HasBeforeAndBeforeSet,\n SubQueryForSql,\n} from './internal-features/sub-query/sub-query-for-sql';\nimport {\n BatchParsers,\n ColumnsParsers,\n PickQueryDataParsers,\n} from './query-columns/query-column-parsers';\nimport {\n PickQueryInputType,\n PickQueryQ,\n PickQueryTable,\n} from './pick-query-types';\nimport {\n Expression,\n ExpressionChain,\n SelectableOrExpression,\n} from './expressions/expression';\nimport { Adapter, QueryResult } from '../adapters/adapter';\nimport { HasHookSelect } from './basic-features/select/hook-select';\nimport {\n MaybeArray,\n pushOrNewArrayToObjectImmutable,\n RecordString,\n RecordUnknown,\n} from '../utils';\nimport { RelationConfigBase } from './relations';\nimport { QueryDataAliases } from './basic-features/as/as';\nimport { AfterCommitErrorHandler } from './basic-features/transaction/transaction';\nimport { Sql } from './sql/sql';\nimport { QueryDataTransform } from './extra-features/data-transform/transform';\nimport { QueryHookUtils } from './extra-features/hooks/hooks';\nimport { SelectItem } from './basic-features/select/select.sql';\nimport { QueryDataSources } from './extra-features/search/search.sql';\nimport { JoinItem, JoinItemArgs } from './basic-features/join/join.sql';\nimport { WhereItem } from './basic-features/where/where.sql';\nimport { OrderItem } from './basic-features/order/order.sql';\nimport { HavingItem } from './basic-features/having/having.sql';\nimport { WindowItem } from './basic-features/window/window.sql';\nimport { QueryDataUnion } from './basic-features/union/union.sql';\nimport {\n OnConflictMerge,\n OnConflictSet,\n OnConflictTarget,\n} from './basic-features/mutate/insert.sql';\nimport { QueryLogger, QueryLogObject } from './basic-features/log/log';\nimport { QuerySchema } from './basic-features/schema/schema';\nimport { MutativeQueriesSelectRelationsQueryData } from './internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\nimport type { ToSQLCtx } from './sql/to-sql';\n\nexport interface RecordOfColumnsShapeBase {\n [K: string]: Column.Shape.QueryInit;\n}\n\nexport interface WithConfigs {\n [K: string]: WithConfig;\n}\n\nexport interface WithConfig {\n shape: Column.Shape.QueryInit;\n computeds?: ComputedColumns;\n}\n\n// Column shapes of joined tables. Used to select, filter, order by the columns of joined tables.\nexport type JoinedShapes = RecordOfColumnsShapeBase;\n\n// Column parsers of joined tables. Used to parse the columns when selecting the column of joined tables.\nexport interface JoinedParsers {\n [K: string]: ColumnsParsers | undefined;\n}\n\nexport type QueryBeforeHook = (query: Query) => void | Promise<void>;\n\nexport type QueryBeforeActionHook = (\n utils: QueryHookUtils<PickQueryInputType>,\n) => void | Promise<void>;\n\nexport type QueryAfterHook<Data = unknown> = (\n data: Data,\n query: Query,\n) => unknown | Promise<unknown>;\n\nexport type QueryDataScopes = {\n [K: string]: QueryScopeData;\n};\n\n// Query data stored for a specific scope to be applied to the query.\n// The scope function is stored and called lazily when building SQL.\nexport type QueryScopeData = (q: Query) => {\n and?: WhereItem[];\n or?: WhereItem[][];\n};\n\nexport type QueryDataFromItem = string | SubQueryForSql | Expression;\n\nexport interface QueryDataJoinTo extends PickQueryTable, PickQueryQ {}\n\nexport interface HandleResult {\n (\n q: Query,\n returnType: QueryReturnType,\n result: QueryResult,\n sql: Sql,\n isSubQuery?: true,\n ): unknown;\n}\n\nexport type WithItems = CteItem[];\n\nexport interface JoinValueDedupItem {\n q: Query;\n a: string;\n}\n\nexport type QueryType =\n | undefined\n // the same as undefined, used only in SQL composer to override default value\n | null\n | 'upsert'\n | 'insert'\n | 'update'\n | 'delete';\n\nexport interface AsFn {\n (as: string): void;\n}\n\nexport interface SelectAllColumnExpression {\n (ctx: ToSQLCtx, quotedAs?: string): string;\n}\n\nexport type SelectAllColumn = string | SelectAllColumnExpression;\n\nexport interface QueryData\n extends\n QueryDataAliases,\n PickQueryDataParsers,\n HasHookSelect,\n MutativeQueriesSelectRelationsQueryData {\n type: QueryType;\n adapter: Adapter;\n selectShape: ColumnsShape;\n // Database relation name used when it differs from the query-facing table alias.\n nameInDb?: string;\n handleResult: HandleResult;\n // When executed in a transaction,\n // the query will be wrapped with a `SAVEPOINT x; *query*; ROLLBACK TO SAVEPOINT x (if fails)`.\n // This allows to continue working with the transaction, otherwise it would be in a failed state and wouldn't accept more queries.\n catch?: boolean;\n returnType: QueryReturnType;\n returning?: boolean;\n returningMany?: boolean;\n wrapInTransaction?: boolean;\n throwOnNotFound?: boolean;\n cteThrowOnNotFound?: boolean;\n ensureCount?: number;\n with?: WithItems;\n withShapes?: WithConfigs;\n joinTo?: QueryDataJoinTo;\n joinedShapes?: JoinedShapes;\n joinedParsers?: JoinedParsers;\n joinedBatchParsers?: { [K: string]: BatchParsers };\n joinedComputeds?: { [K: string]: ComputedColumns | undefined };\n joined?: { [K: string]: Query };\n joinedForSelect?: string;\n innerJoinLateral?: true;\n // to select values with `get` or aggregate them when they were joined inside `select`.\n // joined table name is implicit in such a case.\n valuesJoinedAs?: RecordString;\n schema?: QuerySchema;\n select?: SelectItem[];\n selectCache?: { sql: string; aliases: string[] };\n selectAllColumns?: SelectAllColumn[];\n /**\n * Subset of the `shape` that only includes columns with no `data.explicitSelect`.\n */\n selectAllShape: RecordUnknown;\n /**\n * column type for query with 'value' or 'valueOrThrow' return type\n * Is needed in {@link getShapeFromSelect} to get shape of sub-select that returns a single value.\n */\n getColumn?: Column.Pick.QueryColumn;\n // expr when a single value is returned from the query, when using `get`, or functions.\n expr?: Expression;\n from?: MaybeArray<QueryDataFromItem>;\n updateFrom?: JoinItemArgs;\n sources?: QueryDataSources;\n and?: WhereItem[];\n or?: WhereItem[][];\n order?: OrderItem[];\n // It is used for ORM relations that are known to return a single record to omit `LIMIT` and `OFFSET` from SQL.\n returnsOne?: true;\n // It is used by `joinQueryChainHOF`\n // to remove `LIMIT` and `OFFSET`\n // from the inner query and apply it to the outer query for grouping-ordering reasons.\n useFromLimitOffset?: true;\n coalesceValue?: unknown | Expression;\n notFoundDefault?: unknown;\n defaults?: RecordUnknown;\n // available computed columns, this can be set when selecting from a `with` expression\n runtimeComputeds?: ComputedColumns;\n // selected computed columns\n selectedComputeds?: ComputedColumns;\n // a set for deduplication of hooks added dynamically from the sub queries\n beforeSet?: Set<QueryBeforeHook>;\n // regular before are executed before SQL is generated,\n // but in some cases (dynamic aka lazy SQL) this is impossible,\n // such queries need a second round of `before` hooks to execute after SQL generation.\n dynamicBefore?: HasBeforeAndBeforeSet[];\n // run functions before any query\n before?: QueryBeforeHook[];\n // run functions after any query\n after?: QueryAfterHook[];\n // run functions before create\n beforeCreate?: QueryBeforeHook[];\n // run functions after create in transaction\n afterCreate?: QueryAfterHook[];\n // run functions after create commit\n afterCreateCommit?: QueryAfterHook[];\n // additional select for afterCreate hooks\n afterCreateSelect?: Set<string>;\n // run functions before update\n beforeUpdate?: QueryBeforeHook[];\n // run functions after update in transaction\n afterUpdate?: QueryAfterHook[];\n // run functions after update commit\n afterUpdateCommit?: QueryAfterHook[];\n // additional select for afterUpdate hooks\n afterUpdateSelect?: Set<string>;\n // run functions after create or update in transaction\n afterSave?: QueryAfterHook[];\n // run functions after create or update commit\n afterSaveCommit?: QueryAfterHook[];\n // run functions before delete\n beforeDelete?: QueryBeforeHook[];\n // run functions after delete in transaction\n afterDelete?: QueryAfterHook[];\n // run functions after delete commit\n afterDeleteCommit?: QueryAfterHook[];\n // additional select for afterDelete hooks\n afterDeleteSelect?: Set<string>;\n // catch after commit hooks errors, letting query to return its result\n catchAfterCommitErrors?: AfterCommitErrorHandler[];\n // log settings\n log?: QueryLogObject;\n // logger with `log`, `warn`, `error`\n logger: QueryLogger;\n // convert query into prepared statement automatically as an optimization\n autoPreparedStatements?: boolean;\n // functions to transform query result after loading data\n transform?: QueryDataTransform[];\n // default language for the full text search\n language?: string;\n // Is set for query arg inside `select`, `where`, and others callbacks.\n // It is used by ORM to skip applying a join to the query when `subQuery` is true,\n // the join will be applied after callback is resolved.\n // 1 for the same query, 2 for relation queries returned from the callback.\n subQuery?: number;\n // once there is a hasMany or hasAndBelongsToMany in the chain,\n // the following belongTo and hasOne must also return multiple\n chainMultiple?: boolean;\n // Chained relations, such as `db.user.messages.chat` are stored into array.\n relChain?: { query: Query; rel: RelationConfigBase }[];\n /**\n * Stores current operator functions available for the query.\n * Is needed to remove these operators from query object when changing the query type, see {@link setQueryOperators}.\n */\n operators?: RecordUnknown;\n // Track the applied scopes, this is used when removing the scope from the query.\n scopes?: { [K: string]: QueryScopeData };\n // to allow updating or deleting all records\n all?: true;\n\n chain?: ExpressionChain;\n\n // It is used by `joinQueryChainHOF` to customize the outer query of a chained relation.\n outerQuery?: Query;\n\n // `set` data for insert or update that was set from a `before*` hook\n hookCreateSet?: RecordUnknown[];\n hookUpdateSet?: RecordUnknown[];\n\n appendQueries?: SubQueryForSql[];\n asFns?: AsFn[];\n\n /** select and upsert **/\n\n distinct?: SelectableOrExpression[];\n only?: boolean;\n join?: JoinItem[];\n joinValueDedup?: Map<string, JoinValueDedupItem>;\n group?: (string | Expression)[];\n having?: HavingItem[];\n window?: WindowItem[];\n union?: QueryDataUnion;\n limit?: number;\n offset?: number;\n for?: {\n type: 'UPDATE' | 'NO KEY UPDATE' | 'SHARE' | 'KEY SHARE';\n tableNames?: string[] | Expression;\n mode?: 'NO WAIT' | 'SKIP LOCKED';\n };\n\n /** upsert **/\n\n // upsert does 2 queries: simple find/update, then a union of find/update and insert.\n // this signals SQL code to run the second query for the same query object.\n upsertUpdate?: boolean;\n upsertSecond?: boolean;\n upsertUpdateAsFns?: AsFn[];\n upsertCreateWith?: WithItems;\n upsertCreateAppendQueries?: SubQueryForSql[];\n upsertCreateAsFns?: AsFn[];\n // only for tha data function, it's called only in toSQL after the first query is made.\n upsertInsert?(): unknown;\n\n /** insert **/\n\n columns: string[];\n insertFrom?: SubQueryForSql;\n insertValuesAs?: string;\n queryColumnsCount?: number;\n values: unknown[][];\n onConflict?: {\n target?: OnConflictTarget;\n set?: OnConflictSet;\n merge?: OnConflictMerge;\n };\n\n /** update **/\n\n updateData?: UpdateQueryDataItem[];\n updateMany?: UpdateManyQueryData;\n}\n\nexport interface UpdateManyQueryData {\n primaryKeys: string[];\n setColumns: string[];\n data: RecordUnknown[];\n strict?: boolean;\n}\n\nexport interface UpdateQueryDataObject {\n [K: string]: Expression | { op: string; arg: unknown } | unknown;\n}\n\nexport interface UpdatedAtDataInjector {\n (data: UpdateQueryDataItem[]): UpdateQueryDataObject | void;\n}\n\nexport type UpdateQueryDataItem = UpdateQueryDataObject | UpdatedAtDataInjector;\n\nexport interface PickQueryDataShapeAndJoinedShapes {\n shape: Column.Shape.QueryInit;\n joinedShapes?: JoinedShapes;\n}\n\nexport interface PickQueryDataShapeAndJoinedShapesAndAliases\n extends PickQueryDataShapeAndJoinedShapes, QueryDataAliases {}\n\n/**\n * Push a new element into an array in the query data - immutable version\n *\n * @param q - query\n * @param key - key to get the array\n * @param value - new element to push\n */\nexport const pushQueryValueImmutable = <T extends IsQuery>(\n q: T,\n key: string,\n value: unknown,\n): T => {\n pushOrNewArrayToObjectImmutable(\n (q as unknown as { q: object }).q,\n key,\n value,\n );\n return q;\n};\n\nexport const getClonedQueryData = (query: QueryData): QueryData => {\n return { ...query };\n};\n","import { Query } from '../../query';\nimport { PickQueryQ } from '../../pick-query-types';\nimport { getClonedQueryData } from '../../query-data';\n\n/**\n * Call `.clone()` on a supposed query object\n */\nexport const _clone = (q: unknown): Query => (q as unknown as Query).clone();\n\nexport class QueryClone {\n /**\n * Clones the current query chain, useful for re-using partial query snippets in other queries without mutating the original.\n *\n * Used under the hood, and not really needed on the app side.\n */\n clone<T>(this: T): T {\n const cloned = Object.create((this as unknown as Query).baseQuery);\n cloned.q = getClonedQueryData((this as unknown as PickQueryQ).q);\n return cloned;\n }\n}\n","import { PickQueryQ, PickQuerySelectableShapeAs } from '../../pick-query-types';\nimport { getFreeAlias, RecordString } from '../../../utils';\nimport { Query } from '../../query';\n\nimport { _clone } from '../clone/clone';\nimport { QueryData } from '../../query-data';\n\ninterface PickQueryDataAliases {\n aliases?: RecordString;\n}\n\nexport interface QueryDataAliases extends PickQueryDataAliases {\n as?: string;\n // stores `aliases` of the parent query object when the current query object is withing a query callback.\n outerAliases?: RecordString;\n}\n\nexport type SetQueryTableAlias<\n T extends PickQuerySelectableShapeAs,\n As extends string,\n> = {\n [K in keyof T]: K extends '__selectable'\n ? Omit<T['__selectable'], `${T['__as']}.${keyof T['shape'] & string}`> & {\n [K in keyof T['shape'] & string as `${As}.${K}`]: {\n as: K;\n column: T['shape'][K];\n };\n }\n : K extends '__as'\n ? As\n : T[K];\n};\n\nexport type AsQueryArg = PickQuerySelectableShapeAs;\n\n/** getters **/\n\nexport const getQueryAs = (q: { table?: string; q: { as?: string } }) => {\n return q.q.as || (q.table as string);\n};\n\nexport const requireQueryAs = (q: { table?: string; q: { as?: string } }) => {\n const as = getQueryAs(q);\n if (!as) throw new Error(`Table name or alias is missing`);\n return as;\n};\n\nexport const _getQueryAs = (q: Query): string | undefined => q.q.as;\n\nexport const _getQueryFreeAlias = (q: QueryDataAliases, as: string): string =>\n q.aliases ? getFreeAlias(q.aliases, as) : as;\n\nexport const _checkIfAliased = (\n q: Query,\n as: string,\n name: string,\n): boolean => {\n return q.q.aliases?.[as] === name;\n};\n\nexport const _getQueryAliasOrName = (\n q: PickQueryDataAliases,\n as: string,\n): string => {\n return q.aliases?.[as] || as;\n};\n\nexport const _getQueryOuterAliases = (\n q: QueryDataAliases,\n): RecordString | undefined => {\n return q.outerAliases;\n};\n\n/** setters **/\n\nexport const _setQueryAs = <T extends AsQueryArg, As extends string>(\n self: T,\n as: As,\n): SetQueryTableAlias<T, As> => {\n const { q } = self as unknown as PickQueryQ;\n q.as = as;\n q.aliases = {\n ...q.aliases!,\n [as]: _getQueryFreeAlias(q, as),\n };\n\n return self as never;\n};\n\nexport const _setQueryAlias = (q: Query, name: string, as: string): void => {\n q.q.aliases = { ...q.q.aliases, [as]: name };\n};\n\nexport const _setSubQueryAliases = (q: Query): void => {\n q.q.outerAliases = q.q.aliases;\n};\n\n/**\n * Is used in `chain`: combines query and its relation aliases,\n * stores the result to the relation query data.\n */\nexport const _applyRelationAliases = (\n query: Query,\n relQueryData: QueryData,\n): void => {\n const aliases = query.q.as\n ? { ...query.q.aliases }\n : { ...query.q.aliases, [query.table as string]: query.table as string };\n\n const relAliases = relQueryData.aliases!; // is always set for a relation\n for (const as in relAliases) {\n aliases[as] = getFreeAlias(aliases, as);\n }\n relQueryData.as = aliases[relQueryData.as!]; // `as` is always set for a relation;\n relQueryData.aliases = aliases;\n};\n\nexport const _copyQueryAliasToQuery = (\n fromQuery: Query,\n toQuery: Query,\n key: string,\n): string => {\n const name = _getQueryAliasOrName(fromQuery.q, key);\n if (name !== key) {\n _setQueryAlias(toQuery, name, key);\n }\n return name;\n};\n\nexport abstract class QueryAsMethods {\n /**\n * Sets table alias:\n *\n * ```ts\n * db.table.as('u').select('u.name');\n *\n * // Can be used in the join:\n * db.table.join(db.profile.as('p'), 'p.userId', 'user.id');\n * ```\n *\n * @param as - alias for the table of this query\n */\n as<T extends AsQueryArg, As extends string>(\n this: T,\n as: As,\n ): SetQueryTableAlias<T, As> {\n return _setQueryAs(_clone(this), as) as never;\n }\n}\n","import { Column } from '../../columns';\nimport { Query } from '../query';\n\nexport interface QueryInternalColumnNameToKey {\n // cache `columnNameToKey` method that's available on table instances\n columnNameToKeyMap?: Map<string, string>;\n}\n\n/**\n * In snake case mode, or when columns have custom names,\n * use this method to exchange a db column name to its runtime key.\n */\nexport const queryColumnNameToKey = (\n q: Query,\n name: string,\n): string | undefined => {\n let map = q.internal.columnNameToKeyMap;\n if (!map) {\n q.internal.columnNameToKeyMap = map = new Map<string, string>();\n\n const { shape } = q;\n for (const key in q.shape) {\n const column = shape[key];\n map.set((column as Column.Pick.QueryInit).data.name ?? key, key);\n }\n }\n\n return map.get(name);\n};\n","import { RecordUnknown } from '../utils';\nimport { PickQueryShape } from './pick-query-types';\nimport { IsQuery, Query } from './query';\nimport { queryColumnNameToKey } from './query-columns/query-columns';\n\nexport abstract class OrchidOrmError extends Error {}\n\n/**\n * When we search for a single record, and it is not found, it can either throw an error, or return `undefined`.\n *\n * Unlike other database libraries, `Orchid ORM` decided to throw errors by default when using methods `take`, `find`, `findBy`, `get` and the record is not found.\n * It is a [good practice](https://github.com/goldbergyoni/nodebestpractices/blob/master/sections/errorhandling/centralizedhandling.md) to catch common errors in a centralized place (see [global error handling](https://orchid-orm.netlify.app/guide/error-handling.html#global-error-handling)), and this allows for a more concise code.\n *\n * If it's more suitable to get the `undefined` value instead of throwing, use `takeOptional`, `findOptional`, `findByOptional`, `getOptional` instead.\n */\nexport class NotFoundError extends OrchidOrmError {\n // `#query` is private to prevent it from serializing to not cause problems to test runner reports\n // it is exposed with `getQuery` method which prevents this problem from both Vitest and Jest.\n // Exposing it with `get query()` still leaves the issue in Vitest.\n readonly #query: Query;\n\n constructor(query: IsQuery, message = 'Record is not found') {\n super(message);\n this.#query = query as Query;\n }\n\n getQuery() {\n return this.#query;\n }\n}\n\nexport class OrchidOrmInternalError extends Error {\n // `#query` is private to prevent it from serializing to not cause problems to test runner reports\n // it is exposed with `getQuery` method which prevents this problem from both Vitest and Jest.\n // Exposing it with `get query()` still leaves the issue in Vitest.\n readonly #query: Query;\n\n constructor(\n query: IsQuery,\n message?: string,\n public data?: RecordUnknown,\n ) {\n super(message);\n this.#query = query as Query;\n }\n\n getQuery() {\n return this.#query;\n }\n}\n\nexport type QueryErrorName =\n | 'parseComplete'\n | 'bindComplete'\n | 'closeComplete'\n | 'noData'\n | 'portalSuspended'\n | 'replicationStart'\n | 'emptyQuery'\n | 'copyDone'\n | 'copyData'\n | 'rowDescription'\n | 'parameterDescription'\n | 'parameterStatus'\n | 'backendKeyData'\n | 'notification'\n | 'readyForQuery'\n | 'commandComplete'\n | 'dataRow'\n | 'copyInResponse'\n | 'copyOutResponse'\n | 'authenticationOk'\n | 'authenticationMD5Password'\n | 'authenticationCleartextPassword'\n | 'authenticationSASL'\n | 'authenticationSASLContinue'\n | 'authenticationSASLFinal'\n | 'error'\n | 'notice';\n\nexport abstract class QueryError<\n T extends PickQueryShape = PickQueryShape,\n> extends OrchidOrmInternalError {\n declare message: string;\n declare length?: number;\n declare name: QueryErrorName;\n declare stack: string | undefined;\n code: string | undefined;\n detail: string | undefined;\n severity: string | undefined;\n hint: string | undefined;\n position: string | undefined;\n internalPosition: string | undefined;\n internalQuery: string | undefined;\n where: string | undefined;\n schema: string | undefined;\n table: string | undefined;\n column: string | undefined;\n dataType: string | undefined;\n constraint: string | undefined;\n file: string | undefined;\n line: string | undefined;\n routine: string | undefined;\n\n get isUnique() {\n return this.code === '23505';\n }\n\n #columnsCache?: { [K in keyof T['shape']]?: true };\n get columns() {\n if (this.#columnsCache) return this.#columnsCache;\n\n const columns: { [K in keyof T['shape']]?: true } = {};\n\n if (this.detail) {\n const list = this.detail.match(/\\((.*)\\)=/)?.[1];\n if (list) {\n list.split(', ').forEach((item) => {\n const column = (\n item.startsWith('\"') ? item.slice(1, -1) : item\n ) as keyof T['shape'];\n\n const key =\n queryColumnNameToKey(this.getQuery(), column as string) ?? column;\n columns[key as keyof T['shape']] = true;\n });\n }\n }\n\n return (this.#columnsCache = columns);\n }\n}\n\nexport class MoreThanOneRowError extends OrchidOrmInternalError {\n constructor(query: IsQuery, message?: string) {\n super(query, message);\n }\n}\n\nexport class UnhandledTypeError extends OrchidOrmInternalError {\n constructor(query: IsQuery, value: never) {\n super(query, `Unhandled type: ${JSON.stringify(value)} received`);\n }\n}\n\n/**\n * Error thrown when attempting to nest SQL session scopes.\n * Nested withOptions/$withOptions calls that supply role or setConfig while an outer\n * scope already has SQL session state defined will throw this error.\n */\nexport class NestedSqlSessionError extends OrchidOrmInternalError {\n constructor(query: IsQuery) {\n super(\n query,\n 'Cannot nest SQL session scopes. Outer scope already has role or setConfig defined.',\n );\n }\n}\n\nexport class CannotMutateReadOnlyTableError extends OrchidOrmInternalError {\n constructor(query: IsQuery) {\n super(query, 'Cannot mutate a readonly table.');\n }\n}\n","import { type IsQuery } from '../../query';\nimport { NestedSqlSessionError } from '../../query/errors';\nimport { type PickQueryQ } from '../../query/pick-query-types';\nimport { type QueryResult } from '../adapter';\nimport { quoteIdentifier } from '../../utils';\n\nexport interface SqlSessionState {\n /**\n * Postgres role for SQL session context.\n *\n * `$withOptions` applies it around query execution; transaction options apply\n * it with transaction-local semantics.\n */\n role?: string;\n /**\n * Postgres custom settings for SQL session context.\n *\n * `$withOptions` applies them around query execution; transaction options\n * apply them with transaction-local semantics.\n */\n setConfig?: Record<string, string | number | boolean>;\n}\n\nexport interface SqlSessionContextSetupResult {\n roleSetupSql?: string;\n configSetupSql?: string;\n captureRoleSql?: string;\n captureConfigSql?: string;\n captureConfigValues?: string[];\n}\n\nexport interface SqlSessionContextQueryFn {\n (sql: string, values?: unknown[]): Promise<QueryResult>;\n}\n\ninterface CapturedSessionState {\n previousRole?: string;\n previousConfigs?: Record<string, string | null>;\n}\n\nconst hasSqlSessionContextOptions = (options: SqlSessionState): boolean => {\n return options.role !== undefined || options.setConfig !== undefined;\n};\n\nconst hasActiveSqlSessionContext = (\n state: SqlSessionState | undefined,\n): boolean => {\n if (!state) return false;\n return state.role !== undefined || state.setConfig !== undefined;\n};\n\nconst buildConfigRestoreExpression = (\n key: string,\n value: string | null | undefined,\n): string => {\n const escapedKey = key.replace(/'/g, \"''\");\n if (value === null || value === undefined) {\n value = '';\n }\n return `set_config('${escapedKey}', '${value.replace(/'/g, \"''\")}', false) as \"${key}\"`;\n};\n\nexport const sqlSessionContextSetStorageOptions = (\n query: PickQueryQ,\n state: SqlSessionState | undefined,\n options: SqlSessionState,\n result: SqlSessionState,\n): void => {\n if (\n hasSqlSessionContextOptions(options) &&\n hasActiveSqlSessionContext(state)\n ) {\n throw new NestedSqlSessionError(query as unknown as IsQuery);\n }\n\n if (options.role !== undefined) {\n result.role = options.role;\n }\n\n if (options.setConfig) {\n result.setConfig = options.setConfig;\n }\n};\n\nexport const sqlSessionContextMergeStorageState = (\n state: SqlSessionState | undefined,\n options: SqlSessionState | undefined,\n): SqlSessionState | undefined => {\n if (!options) return state;\n\n return {\n role: options.role ?? state?.role,\n setConfig: options.setConfig ?? state?.setConfig,\n };\n};\n\nexport const sqlSessionContextGetStateFromAsyncState = (\n state: SqlSessionState | undefined,\n): SqlSessionState | undefined => {\n return state?.role || state?.setConfig ? state : undefined;\n};\n\nexport const sqlSessionContextComputeSetup = (\n desired: SqlSessionState | undefined,\n): SqlSessionContextSetupResult | undefined => {\n if (!desired) return undefined;\n\n const role = desired.role;\n const hasRole = role !== undefined;\n const { setConfig } = desired;\n const configKeys = setConfig && Object.keys(setConfig);\n const hasConfig = configKeys && configKeys.length > 0;\n\n if (!hasRole && !hasConfig) return undefined;\n\n const result: SqlSessionContextSetupResult = {};\n\n if (hasRole) {\n result.roleSetupSql = `SET ROLE ${quoteIdentifier(role)}`;\n result.captureRoleSql = 'SELECT current_user';\n }\n\n if (hasConfig && setConfig) {\n result.captureConfigValues = configKeys;\n const captureColumns = configKeys\n .map((key, i) => `current_setting($${i + 1}, true) as \"${key}\"`)\n .join(', ');\n result.captureConfigSql = `SELECT ${captureColumns}`;\n\n const setColumns = configKeys\n .map((key) => {\n const value = setConfig[key];\n return `set_config('${key.replace(/'/g, \"''\")}', '${typeof value === 'string' ? value.replace(/'/g, \"''\") : value}', false) as \"${key}\"`;\n })\n .join(', ');\n result.configSetupSql = `SELECT ${setColumns}`;\n }\n\n return result;\n};\n\nexport const sqlSessionContextBuildConfigRestoreBatchSql = (\n configs: Record<string, string | null | undefined>,\n): string | undefined => {\n const keys = Object.keys(configs);\n if (keys.length === 0) return undefined;\n\n const expressions = keys\n .map((key) => buildConfigRestoreExpression(key, configs[key]))\n .join(', ');\n return `SELECT ${expressions}`;\n};\n\nexport const sqlSessionContextHasState = (\n state: SqlSessionState | undefined,\n): boolean => {\n if (!state) return false;\n return (\n state.role !== undefined ||\n (state.setConfig !== undefined && Object.keys(state.setConfig).length > 0)\n );\n};\n\nexport const sqlSessionContextExecute = async <T extends QueryResult>(\n query: SqlSessionContextQueryFn,\n setup: SqlSessionContextSetupResult | undefined,\n mainQuery: () => Promise<T>,\n): Promise<T> => {\n if (!setup) {\n return mainQuery();\n }\n\n const captured: CapturedSessionState = {};\n const {\n captureRoleSql,\n roleSetupSql,\n captureConfigSql,\n captureConfigValues,\n configSetupSql,\n } = setup;\n\n const setupPromises: Promise<unknown>[] = [];\n\n if (captureRoleSql) {\n setupPromises.push(\n query(captureRoleSql).then((res) => {\n captured.previousRole = (res.rows[0] as unknown[])?.[0] as string;\n }),\n );\n setupPromises.push(query(roleSetupSql!));\n }\n\n if (captureConfigSql && captureConfigValues && configSetupSql) {\n captured.previousConfigs = {};\n const previousConfigs = captured.previousConfigs;\n setupPromises.push(\n query(captureConfigSql, captureConfigValues).then((res) => {\n const row = res.rows[0] as unknown[];\n captureConfigValues.forEach((key, i) => {\n previousConfigs[key] = row[i] as string | null;\n });\n }),\n );\n setupPromises.push(query(configSetupSql));\n }\n\n try {\n await Promise.all(setupPromises);\n return await mainQuery();\n } finally {\n const cleanupPromises: Promise<unknown>[] = [];\n\n if (roleSetupSql && captured.previousRole !== undefined) {\n cleanupPromises.push(\n query(`SET ROLE ${quoteIdentifier(captured.previousRole)}`),\n );\n }\n\n if (captured.previousConfigs) {\n const restoreSql = sqlSessionContextBuildConfigRestoreBatchSql(\n captured.previousConfigs,\n );\n if (restoreSql) {\n cleanupPromises.push(query(restoreSql));\n }\n }\n\n await Promise.all(cleanupPromises);\n }\n};\n","import { logParamToLogObject, QueryLogObject } from '../log/log';\nimport {\n AdapterTransactionOptions,\n TransactionAdapter,\n TransactionAfterCommitHook,\n} from '../../../adapters/adapter';\nimport {\n sqlSessionContextMergeStorageState,\n sqlSessionContextSetStorageOptions,\n} from '../../../adapters/features/sql-session-context';\nimport type { SqlSessionState } from '../../../adapters/features/sql-session-context';\nimport { PickQueryQ, PickQueryQAndInternal } from '../../pick-query-types';\nimport { QuerySchema } from '../schema/schema';\n\nexport type { SqlSessionState } from '../../../adapters/features/sql-session-context';\n\nexport interface AsyncState extends SqlSessionState {\n // Database adapter that is connected to a currently running transaction.\n transactionAdapter?: TransactionAdapter;\n // Number of transaction nesting.\n // Top transaction has id = 0, transaction inside of transaction will have id = 1, and so on.\n transactionId?: number;\n // Array of data and functions to call after commit.\n // 1st element is a query result, 2nd element is a query object, 3rd element is array of functions to call with the query result and object.\n afterCommit?: TransactionAfterCommitHook[];\n // To log all the queries after inside the storage scope\n log?: QueryLogObject;\n // number of test transaction wrapping the current one\n testTransactionCount?: number;\n // sequential number for catching save-points\n catchI?: number;\n // a db schema to use by default\n schema?: QuerySchema;\n // Effective transaction role for transaction-scoped SQL session context.\n transactionRole?: SqlSessionState['role'];\n // Effective transaction set_config map for transaction-scoped SQL session context.\n transactionSetConfig?: SqlSessionState['setConfig'];\n}\n\nexport interface StorageOptions extends SqlSessionState {\n log?: boolean;\n schema?: QuerySchema;\n}\n\nexport interface ProcessedStorageOptions extends SqlSessionState {\n log?: QueryLogObject;\n schema?: QuerySchema;\n}\n\nexport const processStorageOptions = (\n query: PickQueryQ,\n state: AsyncState | undefined,\n { log: enableLog, ...options }: StorageOptions,\n): AdapterTransactionOptions | undefined => {\n const log =\n enableLog === undefined\n ? query.q.log\n : logParamToLogObject(query.q.logger, enableLog);\n\n const result = options as ProcessedStorageOptions;\n\n if (log) result.log = log;\n if ('schema' in options) result.schema = options.schema;\n\n sqlSessionContextSetStorageOptions(query, state, options, result);\n\n return result;\n};\n\nlet currentDefaultSchema: string | undefined;\nexport const setCurrentDefaultSchema = (schema: QuerySchema | undefined) => {\n currentDefaultSchema = typeof schema === 'function' ? schema() : schema;\n};\n\nexport const getQuerySchema = (query: PickQueryQ) =>\n query.q.schema || currentDefaultSchema;\n\nexport class QueryStorage {\n async withOptions<Result>(\n this: PickQueryQAndInternal,\n options: StorageOptions,\n cb: () => Promise<Result>,\n ): Promise<Result> {\n const state = this.internal.asyncStorage.getStore();\n const opts = processStorageOptions(this, state, options);\n const sqlSessionState = sqlSessionContextMergeStorageState(state, opts);\n\n // Build new state if options were processed\n const newState: AsyncState = opts\n ? {\n ...state,\n log: opts.log ?? state?.log,\n schema: opts.schema ?? state?.schema,\n ...sqlSessionState,\n }\n : (undefined as unknown as AsyncState);\n\n // If no options were processed, run with the existing state or directly if no state\n return !opts\n ? state\n ? this.internal.asyncStorage.run(state, cb)\n : cb()\n : this.internal.asyncStorage.run(newState, cb);\n }\n}\n","import {\n columnToSqlNotSelect,\n rawOrColumnToSql,\n} from '../../sql/column-to-sql';\nimport { IsQuery, Query } from '../../query';\nimport { whereToSql } from '../where/where.sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { JoinedShapes, QueryData } from '../../query-data';\nimport { RawSql } from '../../expressions/raw-sql';\nimport { Column } from '../../../columns/column';\nimport { moveMutativeQueryToCte } from '../cte/cte.sql';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { _getQueryAliasOrName, getQueryAs } from '../as/as';\nimport { addValue, RecordString, RecordUnknown } from '../../../utils';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport {\n getQueryRelationAliasForAs,\n quoteFromWithSchema,\n quoteTableWithSchema,\n requireTableOrStringFrom,\n} from '../../sql/sql';\nimport { getQuerySchema } from '../storage/storage';\nimport { SelectItem } from '../select/select.sql';\nimport { ColumnsShape } from '../../../columns';\n\nexport type SimpleJoinItemNonSubQueryArgs =\n | [{ [K: string]: string | Expression } | Expression | true]\n | [leftColumn: string | Expression, rightColumn: string | Expression]\n | [\n leftColumn: string | Expression,\n op: string,\n rightColumn: string | Expression,\n ];\n\nexport type JoinItemArgs =\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // lateral join query\n l: SubQueryForSql;\n // as\n a: string;\n // \"inner join\" by checking `IS NOT NULL` in the `ON`\n i?: boolean;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // relation query from `relation.joinQuery`\n j: IsQuery;\n // join a sub query, is not applicable in whereExists\n s: boolean;\n // callback result, if callback is present\n r?: IsQuery;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // `with` item name\n w: string;\n // callback result\n r: IsQuery;\n // join a sub query, is not applicable in whereExists\n s: boolean;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // `with` item name\n w: string;\n // join arguments\n a: SimpleJoinItemNonSubQueryArgs;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // joining query\n q: IsQuery;\n // join a sub query, is not applicable in whereExists\n s: boolean;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // joining query\n q: IsQuery;\n // callback result\n r: IsQuery;\n // join a sub query, is not applicable in whereExists\n s: boolean;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // joining query\n q: IsQuery;\n // join arguments\n a: SimpleJoinItemNonSubQueryArgs;\n // join a sub query, is not applicable in whereExists\n s: boolean;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c: Column.Shape.Data;\n // alias\n a: string;\n // array of values, item is a record\n d: RecordUnknown[];\n };\n\nexport interface JoinItem {\n type: string;\n args: JoinItemArgs;\n}\n\ntype ItemOf2Or3Length =\n | [leftColumn: string | Expression, rightColumn: string | Expression]\n | [\n leftColumn: string | Expression,\n op: string,\n rightColumn?: string | Expression,\n ];\n\ninterface SqlJoinItem {\n target: string;\n on?: string;\n}\n\nexport const processJoinItem = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: {\n selectShape: ColumnsShape;\n joinedShapes?: JoinedShapes;\n as?: string;\n outerAliases?: RecordString;\n aliases?: RecordString;\n },\n args: JoinItemArgs,\n quotedAs: string | undefined,\n): SqlJoinItem => {\n let target: string;\n let on: string | undefined;\n\n const forbidLateral = 'u' in args;\n\n // lateral\n if ('l' in args) {\n const { aliasValue } = ctx;\n ctx.aliasValue = true;\n\n target = `(${moveMutativeQueryToCte(ctx, args.l)}) \"${_getQueryAliasOrName(\n query,\n args.a,\n )}\"`;\n\n on = `${args.i ? `\"${args.a}\".\"${args.a}\" IS NOT NULL` : 'true'}`;\n\n ctx.aliasValue = aliasValue;\n } else if ('j' in args) {\n const { j, s, r } = args as {\n j: SubQueryForSql;\n s: boolean;\n r?: Query;\n };\n\n const joinTable = j.q.nameInDb || requireTableOrStringFrom(j);\n target = quoteFromWithSchema(getQuerySchema(j), joinTable);\n\n const as = j.q.as as string;\n const joinAs = `\"${as}\"`;\n const alias = getQueryRelationAliasForAs(j, as);\n if (alias) {\n target += ` ${alias}`;\n }\n\n if (r && s) {\n target = subJoinToSql(\n ctx,\n j,\n `\"${joinTable}\"`,\n !forbidLateral,\n joinAs,\n true,\n );\n } else {\n on = whereToSql(ctx, j, j.q, joinAs);\n }\n } else if ('w' in args) {\n const { w } = args;\n target = `\"${w}\"`;\n\n if ('r' in args) {\n const { s, r } = args as {\n w: string;\n s: boolean;\n r: SubQueryForSql;\n };\n if (s) {\n target = subJoinToSql(ctx, r, target, !forbidLateral, target);\n } else {\n on = whereToSql(ctx, r as unknown as Query, r.q, target);\n }\n } else {\n on = processArgs(\n args.a,\n ctx,\n query,\n target,\n (query.joinedShapes as JoinedShapes)[w],\n quotedAs,\n );\n }\n } else if ('d' in args) {\n const shape = args.c;\n const { values } = ctx;\n\n target = `(VALUES ${args.d\n .map((x) => {\n return (\n '(' +\n Object.entries(shape)\n .map(([key, column]) => {\n const value = x[key];\n return (\n addValue(\n values,\n value === null || value === undefined\n ? null\n : column.data.encode\n ? column.data.encode(value)\n : value,\n ) +\n '::' +\n (column as Column).dataType\n );\n })\n .join(', ') +\n ')'\n );\n })\n .join(', ')}) \"${args.a}\"(${Object.entries(shape)\n .map(([key, column]) => `\"${column.data.name || key}\"`)\n .join(', ')})`;\n } else {\n const { q, s } = args as {\n q: SubQueryForSql;\n s: boolean;\n };\n let joinAs;\n\n if ('r' in args) {\n const { r } = args as {\n q: Query;\n s: boolean;\n r: Query;\n };\n\n const res = getArgQueryTarget(ctx, q, s && !forbidLateral, s, s);\n target = res.target;\n joinAs = res.joinAs;\n\n if (!s || forbidLateral) {\n on = whereToSql(ctx, r, r.q, `\"${getQueryAs(r)}\"`);\n }\n } else {\n const res = getArgQueryTarget(ctx, q, false, s);\n target = res.target;\n joinAs = res.joinAs;\n\n if ('a' in args) {\n on = processArgs(args.a, ctx, query, joinAs, q.shape, quotedAs);\n }\n }\n\n // if it's a sub query, WHERE conditions are already in the sub query\n if (!s) {\n const whereSql = whereToSql(\n ctx,\n q,\n {\n ...q.q,\n joinedShapes: {\n ...query.joinedShapes,\n ...q.q.joinedShapes,\n [(table.q.as || table.table) as string]: table.q.selectShape,\n },\n },\n joinAs,\n );\n if (whereSql) {\n if (on) on += ` AND ${whereSql}`;\n else on = whereSql;\n }\n }\n }\n\n return { target, on };\n};\n\nconst getArgQueryTarget = (\n ctx: ToSQLCtx,\n first: SubQueryForSql,\n lateral: boolean,\n joinSubQuery: boolean,\n cloned?: boolean,\n) => {\n const joinQuery = first.q;\n\n const quotedFrom =\n typeof joinQuery.from === 'string' ? `\"${joinQuery.from}\"` : undefined;\n\n let joinAs = quotedFrom || `\"${first.table}\"`;\n\n const qAs = joinQuery.as ? `\"${joinQuery.as}\"` : undefined;\n const aliasToAdd = getQueryRelationAliasForAs(first, joinQuery.as);\n\n if (joinSubQuery) {\n return {\n target: subJoinToSql(ctx, first, joinAs, lateral, qAs, cloned),\n joinAs: qAs || joinAs,\n };\n } else {\n let target = quotedFrom || quoteTableWithSchema(first);\n if (aliasToAdd) {\n joinAs = aliasToAdd;\n target += ` ${aliasToAdd}`;\n }\n return { target, joinAs };\n }\n};\n\nconst subJoinToSql = (\n ctx: ToSQLCtx,\n jq: SubQueryForSql,\n innerAs: string,\n lateral: boolean,\n outerAs?: string,\n cloned?: boolean,\n) => {\n if (!jq.q.select && jq.q.selectAllColumns) {\n if (!cloned) jq = jq.clone();\n jq.q.select = [new RawSql(`${innerAs}.*`)];\n }\n\n const sql = `(${moveMutativeQueryToCte(ctx, jq)}) ${outerAs || innerAs}`;\n return lateral ? `LATERAL ${sql}` : sql;\n};\n\nconst processArgs = (\n args: SimpleJoinItemNonSubQueryArgs,\n ctx: ToSQLCtx,\n query: {\n joinedShapes?: JoinedShapes;\n select?: SelectItem[];\n selectShape: ColumnsShape;\n },\n joinAs: string,\n joinShape: Column.QueryColumns,\n quotedAs?: string,\n): string | undefined => {\n return args.length\n ? args.length === 1\n ? getObjectOrRawConditions(\n ctx,\n query,\n args[0],\n quotedAs,\n joinAs,\n joinShape,\n )\n : getConditionsFor3Or4LengthItem(\n ctx,\n query,\n joinAs,\n quotedAs,\n args as ItemOf2Or3Length,\n joinShape,\n )\n : undefined;\n};\n\nconst getConditionsFor3Or4LengthItem = (\n ctx: ToSQLCtx,\n query: {\n joinedShapes?: JoinedShapes;\n select?: SelectItem[];\n selectShape: ColumnsShape;\n },\n target: string,\n quotedAs: string | undefined,\n args: ItemOf2Or3Length,\n joinShape: Column.QueryColumns,\n): string => {\n const [leftColumn, opOrRightColumn, maybeRightColumn] = args;\n\n const op = maybeRightColumn ? opOrRightColumn : '=';\n const rightColumn = maybeRightColumn ? maybeRightColumn : opOrRightColumn;\n\n return `${rawOrColumnToSql(\n ctx,\n query,\n joinShape,\n leftColumn,\n target,\n )} ${op} ${rawOrColumnToSql(ctx, query, query.selectShape, rightColumn, quotedAs)}`;\n};\n\nconst getObjectOrRawConditions = (\n ctx: ToSQLCtx,\n query: {\n joinedShapes?: JoinedShapes;\n select?: SelectItem[];\n selectShape: ColumnsShape;\n },\n data: { [K: string]: string | Expression } | Expression | true,\n quotedAs: string | undefined,\n joinAs: string,\n joinShape: Column.QueryColumns,\n): string => {\n if (data === true) {\n return 'true';\n } else if (isExpression(data)) {\n return data.toSQL(ctx, quotedAs);\n } else {\n const pairs: string[] = [];\n const shape = query.selectShape;\n\n for (const key in data) {\n const value = data[key];\n\n pairs.push(\n `${columnToSqlNotSelect(\n ctx,\n query,\n joinShape,\n key,\n joinAs,\n )} = ${rawOrColumnToSql(ctx, query, shape, value, quotedAs)}`,\n );\n }\n\n return pairs.join(', ');\n }\n};\n\nexport const pushJoinSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryData & {\n join: JoinItem[];\n },\n quotedAs?: string,\n) => {\n const joinSet = query.join.length > 1 ? new Set<string>() : null;\n\n for (const item of query.join) {\n const { target, on = 'true' } = processJoinItem(\n ctx,\n table,\n query,\n item.args,\n quotedAs,\n );\n\n const sql = `${item.type} ${target} ON ${on}`;\n\n if (joinSet) {\n if (joinSet.has(sql)) continue;\n joinSet.add(sql);\n }\n\n ctx.sql.push(sql);\n }\n};\n","import { selectAllSql } from '../basic-features/select/select.sql';\nimport { columnToSql } from '../sql/column-to-sql';\nimport { Column } from '../../columns/column';\nimport { Expression, ExpressionData } from './expression';\nimport { ToSQLCtx, ToSQLQuery } from '../sql/to-sql';\nimport { QueryData } from '../query-data';\n\n/**\n * Expression that can turn a {@link SelectItem} (except {@link SelectAs}) into SQL.\n * Used by `get` to have an expression that can be chained with operators.\n */\nexport class SelectItemExpression<\n T extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n> extends Expression<T> {\n result: { value: T };\n q: ExpressionData;\n\n constructor(\n public query: ToSQLQuery,\n public item: string | Expression,\n value?: T,\n ) {\n super();\n this.result = { value: value as T };\n this.q = query.q as ExpressionData;\n if (value) Object.assign(this, value.operators);\n }\n\n // `makeSQL` acts similarly to how select args are handled\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n const q = this.q as QueryData;\n return typeof this.item === 'string'\n ? this.item === '*'\n ? selectAllSql(q, quotedAs, undefined, ctx).join(', ')\n : columnToSql(\n ctx,\n q,\n q.selectShape,\n this.item,\n quotedAs,\n true,\n undefined,\n undefined,\n undefined,\n true,\n )\n : this.item.toSQL(ctx, quotedAs);\n }\n}\n","import {\n IsQuery,\n Query,\n QueryTake,\n QueryTakeOptional,\n SetQueryReturnsAll,\n SetQueryReturnsRows,\n} from './query';\nimport { emptyObject, getFreeAlias, RecordUnknown } from '../utils';\nimport {\n CannotMutateReadOnlyTableError,\n OrchidOrmInternalError,\n} from './errors';\nimport {\n PickQueryQ,\n PickQueryQAndBaseQuery,\n PickQueryResult,\n PickQueryResultReturnType,\n} from './pick-query-types';\nimport { _checkIfAliased } from './basic-features/as/as';\n\nimport { getClonedQueryData } from './query-data';\nimport { Column } from '../columns';\n\n/**\n * Push all elements of given array into the array in the query data,\n * set given array if there is no array yet in the query data.\n * Not mutating the array.\n *\n * @param q - query\n * @param key - key to get the array\n * @param value - array with values\n */\nexport const pushQueryArrayImmutable = <T extends PickQueryQ>(\n q: T,\n key: string,\n value: unknown[],\n): T => {\n const arr = (q.q as unknown as RecordUnknown)[key] as unknown[];\n (q.q as unknown as RecordUnknown)[key] = arr ? [...arr, ...value] : value;\n return q;\n};\n\n/**\n * Set value into the object in query data, create the object if it doesn't yet exist.\n * Does not mutate the object.\n *\n * @param q - query\n * @param object - query data key to get the object\n * @param key - object key to set the value into\n * @param value - value to set by the key\n */\nexport const setQueryObjectValueImmutable = <T extends PickQueryQ>(\n q: T,\n object: string,\n key: string,\n value: unknown,\n): T => {\n (q.q as unknown as RecordUnknown)[object] = {\n ...((q.q as unknown as RecordUnknown)[object] as RecordUnknown),\n [key]: value,\n };\n return q as unknown as T;\n};\n\n/**\n * Throw runtime error when delete or update has no where conditions\n *\n * @param q - query\n * @param method - 'update' or 'delete'\n */\nexport const throwIfNoWhere = (q: PickQueryQ, method: string): void => {\n if (!q.q.or && !q.q.and && !q.q.scopes && !q.q.all) {\n throw new OrchidOrmInternalError(\n q as Query,\n `Dangerous ${method} without conditions`,\n );\n }\n};\n\nexport const throwIfJoinLateral = (q: PickQueryQ, method: string): void => {\n if (q.q.join?.some((x) => Array.isArray(x) || ('s' in x.args && x.args.s))) {\n throw new OrchidOrmInternalError(\n q as Query,\n `Cannot join a complex query in ${method}`,\n );\n }\n};\n\nexport const throwIfReadOnly = (query: Query): void => {\n if (query.internal.readOnly) {\n throw new CannotMutateReadOnlyTableError(query);\n }\n};\n\nexport const throwOnReadOnlyUpdate = (\n query: unknown,\n column: Column.Pick.Data,\n key: string,\n) => {\n if (column.data.appReadOnly || column.data.readOnly) {\n throw new OrchidOrmInternalError(\n query as Query,\n 'Trying to update a readonly column',\n { column: key },\n );\n }\n};\n\n// Searches if a given name is already taken, if it is taken it suffixes it with an increment.\n// Stores an empty object under this key and this alias to the query data.\nexport const saveAliasedShape = (\n q: IsQuery,\n as: string,\n key: 'joinedShapes' | 'withShapes',\n): string => {\n const shapes = (q as Query).q[key];\n\n as = getFreeAlias(shapes, as);\n\n setQueryObjectValueImmutable(q as Query, key, as, emptyObject);\n\n return as;\n};\n\n/**\n * Extend query prototype with new methods.\n * The query and its data are cloned (with Object.create).\n *\n * @param q - query object to extend from\n * @param methods - methods to add\n */\nexport const extendQuery = <\n T extends PickQueryQAndBaseQuery,\n Methods extends RecordUnknown,\n>(\n q: T,\n methods: Methods,\n): T & Methods => {\n const base = Object.create(q.baseQuery);\n base.baseQuery = base;\n\n Object.assign(base, methods);\n\n const cloned = Object.create(base);\n cloned.q = getClonedQueryData(q.q);\n\n return cloned as T & Methods;\n};\n\nexport const _queryAll = <T extends PickQueryResult>(\n q: T,\n): SetQueryReturnsAll<T> => {\n (q as unknown as PickQueryQ).q.returnType = 'all';\n (q as unknown as PickQueryQ).q.all = true;\n return q as never;\n};\n\nexport const _queryTake = <T extends PickQueryResultReturnType>(\n query: T,\n): QueryTake<T> => {\n const q = (query as unknown as PickQueryQ).q;\n switch (q.returnType) {\n case 'valueOrThrow':\n case 'pluck':\n case 'void':\n break;\n case 'value': {\n q.returnType = 'valueOrThrow';\n break;\n }\n default: {\n q.returnType = 'oneOrThrow';\n }\n }\n return query as never;\n};\n\nexport const _queryTakeOptional = <T extends PickQueryResultReturnType>(\n query: T,\n): QueryTakeOptional<T> => {\n const q = (query as unknown as PickQueryQ).q;\n switch (q.returnType) {\n case 'value':\n case 'pluck':\n case 'void':\n break;\n case 'valueOrThrow': {\n q.returnType = 'value';\n break;\n }\n default: {\n q.returnType = 'one';\n }\n }\n return query as never;\n};\n\nexport const _queryExec = <T extends IsQuery>(q: T) => {\n (q as unknown as PickQueryQ).q.returnType = 'void';\n return q as never;\n};\n\nexport const _queryRows = <T extends PickQueryResult>(\n q: T,\n): SetQueryReturnsRows<T> => {\n (q as unknown as PickQueryQ).q.returnType = 'rows';\n return q as never;\n};\n\nexport const getFullColumnTable = (\n q: IsQuery,\n column: string,\n index: number,\n as: string | undefined,\n): string => {\n const table = column.slice(0, index);\n return as && table !== as && _checkIfAliased(q as Query, table, as as string)\n ? (as as string)\n : table;\n};\n","import { Query } from '../../query';\nimport {\n AfterCommitStandaloneHook,\n SqlSessionState,\n TransactionAdapter,\n} from '../../../adapters/adapter';\nimport { emptyObject } from '../../../utils';\nimport { OrchidOrmError } from '../../errors';\nimport { PickQueryQAndInternal } from '../../pick-query-types';\nimport { _clone } from '../clone/clone';\nimport { AsyncState, processStorageOptions } from '../storage/storage';\nimport { QuerySchema } from '../schema/schema';\n\nexport interface AsyncTransactionState extends AsyncState {\n transactionAdapter: TransactionAdapter;\n transactionId: number;\n}\n\nexport type IsolationLevel =\n | 'SERIALIZABLE'\n | 'REPEATABLE READ'\n | 'READ COMMITTED'\n | 'READ UNCOMMITTED';\n\nexport interface TransactionOptions extends SqlSessionState {\n /**\n * Enable or disable logging for all queries in the transaction.\n */\n log?: boolean;\n /**\n * Default schema to use for queries in the transaction.\n */\n schema?: QuerySchema;\n /**\n * Postgres isolation level for the top-level transaction.\n */\n level?: IsolationLevel;\n /**\n * Whether the top-level transaction should be read-only.\n */\n readOnly?: boolean;\n /**\n * Whether the top-level transaction should be deferrable.\n */\n deferrable?: boolean;\n /**\n * Postgres role to apply for the transaction callback.\n *\n * Nested transactions can temporarily replace the parent transaction role.\n */\n role?: SqlSessionState['role'];\n /**\n * Postgres custom settings to apply for the transaction callback.\n *\n * Nested transaction settings are shallow-merged over the parent transaction\n * settings while the nested callback runs.\n */\n setConfig?: SqlSessionState['setConfig'];\n}\n\nexport interface AfterCommitErrorFulfilledResult extends PromiseFulfilledResult<unknown> {\n name?: string;\n}\n\nexport interface AfterCommitErrorRejectedResult extends PromiseRejectedResult {\n name?: string;\n}\n\nexport type AfterCommitErrorResult =\n | AfterCommitErrorFulfilledResult\n | AfterCommitErrorRejectedResult;\n\n/**\n * `AfterCommitError` is thrown when one of after commit hooks throws.\n *\n * ```ts\n * interface AfterCommitError extends OrchidOrmError {\n * // the result of transaction functions\n * result: unknown;\n *\n * // Promise.allSettled result + optional function names\n * hookResults: (\n * | {\n * status: 'fulfilled';\n * value: unknown;\n * name?: string;\n * }\n * | {\n * status: 'rejected';\n * reason: any; // the error object thrown by a hook\n * name?: string;\n * }\n * )[];\n * }\n * ```\n *\n * Use `function name() {}` function syntax for hooks to give them names,\n * so later they can be identified when handling after commit errors.\n *\n * ```ts\n * export const SomeTable = defineTable('someTable', (t) => ({\n * ...someColumns,\n * })).init((orm: typeof db, hooks) => {\n * // anonymous funciton - has no name\n * hooks.afterCreateCommit([], async () => {\n * // ...\n * });\n *\n * // named function\n * hooks.afterCreateCommit([], function myHook() {\n * // ...\n * });\n * });\n * ```\n */\nexport class AfterCommitError extends OrchidOrmError {\n constructor(\n public result: unknown,\n public hookResults: AfterCommitErrorResult[],\n ) {\n super('After commit hooks have failed');\n }\n}\n\nexport type AfterCommitErrorHandler = (\n error: AfterCommitError,\n) => void | Promise<void>;\n\nexport const _runAfterCommitHooks = async (\n result: unknown,\n promises: unknown[],\n getHookNames: () => string[],\n catchAfterCommitErrors: AfterCommitErrorHandler[] | undefined,\n) => {\n const hookResults = await Promise.allSettled(promises);\n if (hookResults.some((result) => result.status === 'rejected')) {\n const hookNames = getHookNames();\n\n for (const [i, r] of hookResults.entries()) {\n (r as AfterCommitErrorResult).name = hookNames[i];\n }\n\n const err = new AfterCommitError(result, hookResults);\n if (!catchAfterCommitErrors) throw err;\n\n for (const fn of catchAfterCommitErrors) {\n try {\n fn(err);\n } catch {}\n }\n }\n};\n\n/**\n * Check if inside transaction started by user (not test transaction).\n */\nexport const isInUserTransaction = (\n trx: AsyncState | undefined,\n): trx is AsyncState =>\n trx?.transactionId !== undefined &&\n // when inside test transactions, compare transaction counts to ensure there is a user transaction.\n (!trx.testTransactionCount || trx.transactionId >= trx.testTransactionCount);\n\nexport class QueryTransaction {\n /**\n * In Orchid ORM the method is `$transaction`, when using `pqb` on its own it is `transaction`.\n *\n * `COMMIT` happens automatically after the callback was successfully resolved, and `ROLLBACK` is done automatically if the callback fails.\n *\n * Let's consider the case of transferring money from one user to another:\n *\n * ```ts\n * export const transferMoney = async (\n * fromId: number,\n * toId: number,\n * amount: number,\n * ) => {\n * try {\n * // db.$transaction returns data that is returned from the callback\n * // result here is senderRemainder\n * const result = await db.$transaction(async () => {\n * const sender = await db.user.find(fromId);\n * const senderRemainder = sender.balance - amount;\n * if (senderRemainder < 0) {\n * throw new Error('Sender does not have enough money');\n * }\n *\n * await db.user.find(fromId).decrement({\n * balance: amount,\n * });\n * await db.user.find(toId).increment({\n * balance: amount,\n * });\n *\n * return senderRemainder;\n * });\n * } catch (error) {\n * // handle transaction error\n * }\n * };\n * ```\n *\n * It performs 3 queries in a single transaction: load sender record, decrement sender's balance, increment receiver's balance.\n *\n * If sender or receiver record doesn't exist, it will throw `NotFound` error, and there is an error thrown when sender's balance is too low.\n * In such case, the transaction will be rolled back and no changes will be applied to the database.\n *\n * Internally, ORM relies on [AsyncLocalStorage](https://nodejs.org/api/async_context.html#class-asynclocalstorage) feature of node.js,\n * it allows passing the transaction object implicitly. So that any query that is done inside of callback, will run inside a transaction.\n *\n * ## nested transactions\n *\n * Transactions can be nested one in another.\n * The top level transaction is the real one,\n * and the nested ones are emulated with [savepoint](https://www.postgresql.org/docs/current/sql-savepoint.html) instead of `BEGIN`\n * and [release savepoint](https://www.postgresql.org/docs/current/sql-release-savepoint.html) instead of `COMMIT`.\n *\n * Use [ensureTransaction](#ensuretransaction) to run all queries in a single transaction.\n *\n * ```ts\n * const result = await db.$transaction(async () => {\n * await db.table.create(...one);\n *\n * const result = await db.$transaction(async () => {\n * await db.table.create(...two);\n * return 123;\n * });\n *\n * await db.table.create(...three);\n *\n * return result;\n * });\n *\n * // result is returned from the inner transaction\n * result === 123;\n * ```\n *\n * If the inner transaction throws an error, and it is caught by `try/catch` of outer transaction,\n * it performs [rollback to savepoint](https://www.postgresql.org/docs/current/sql-rollback-to.html)\n * and the outer transaction can continue:\n *\n * ```ts\n * class CustomError extends Error {}\n *\n * await db.$transaction(async () => {\n * try {\n * await db.$transaction(async () => {\n * throw new CustomError();\n * });\n * } catch (err) {\n * if (err instanceof CustomError) {\n * // ignore this error\n * return;\n * }\n * throw err;\n * }\n *\n * // this transaction can continue\n * await db.table.create(...data);\n * });\n * ```\n *\n * If the error in the inner transaction is not caught, all nested transactions are rolled back and aborted.\n *\n * ## SQL session context in transactions\n *\n * Pass `role` and `setConfig` in transaction options to apply Postgres SQL session context for the whole transaction:\n *\n * ```ts\n * await db.$transaction(\n * {\n * role: 'app_user',\n * setConfig: {\n * 'app.tenant_id': tenantId,\n * 'app.user_id': userId,\n * },\n * },\n * async () => {\n * const project = await db.project.find(projectId);\n *\n * await db.project.find(projectId).update({ lastViewedAt: new Date() });\n *\n * return project;\n * },\n * );\n * ```\n *\n * This is different from `$withOptions({ role, setConfig }, cb)`.\n * `$withOptions` is query-scoped and reconciles SQL session state around each query.\n * Transaction options are applied once for the transaction and are useful for request-scoped RLS work that is already transaction-bound.\n *\n * Nested transactions can temporarily override the parent transaction role and config.\n * When the nested transaction finishes, Orchid restores the parent transaction context before the outer callback continues.\n */\n transaction<Result>(\n this: PickQueryQAndInternal,\n cb: () => Promise<Result>,\n ): Promise<Result>;\n transaction<Result>(\n this: PickQueryQAndInternal,\n options: IsolationLevel | TransactionOptions,\n cb: () => Promise<Result>,\n ): Promise<Result>;\n async transaction<Result>(\n this: PickQueryQAndInternal,\n cbOrOptions: IsolationLevel | TransactionOptions | (() => Promise<Result>),\n cb?: () => Promise<Result>,\n ): Promise<Result> {\n let options: TransactionOptions;\n let fn: () => Promise<Result>;\n if (typeof cbOrOptions === 'function') {\n options = emptyObject as TransactionOptions;\n fn = cbOrOptions;\n } else {\n options =\n typeof cbOrOptions === 'object' ? cbOrOptions : { level: cbOrOptions };\n fn = cb as () => Promise<Result>;\n }\n\n let opts = processStorageOptions(this, undefined, options);\n\n return this.q.adapter.transaction(this.internal.asyncStorage, opts, fn);\n }\n\n /**\n * Use the `$ensureTransaction` when you want to ensure the sequence of queries is running in a transaction, but there is no need for Postgres [savepoints](https://www.postgresql.org/docs/current/sql-savepoint.html).\n *\n * ```ts\n * async function updateUserBalance(userId: string, amount: number) {\n * await db.$ensureTransaction(async () => {\n * await db.transfer.create({ userId, amount })\n * await db.user.find(userId).increment({ balance: amount })\n * })\n * }\n *\n * async function saveDeposit(userId: string, deposit: { ... }) {\n * await db.$ensureTransaction(async () => {\n * await db.deposit.create(deposit)\n * // transaction in updateUserBalance won't be started\n * await updateUserBalance(userId, deposit.amount)\n * })\n * }\n * ```\n */\n ensureTransaction<Result>(\n this: PickQueryQAndInternal,\n cb: () => Promise<Result>,\n ): Promise<Result> {\n const trx = this.internal.asyncStorage.getStore();\n if (trx) return cb();\n\n return (\n QueryTransaction.prototype.transaction as (cb: unknown) => Promise<Result>\n ).call(this, cb) as Promise<Result>;\n }\n\n isInTransaction(): boolean {\n const trx = (this as unknown as Query).internal.asyncStorage.getStore();\n\n return isInUserTransaction(trx);\n }\n\n /**\n * Schedules a hook to run after the outermost transaction commits:\n *\n * ```ts\n * await db.$transaction(async () => {\n * await db.table.create(data)\n * await db.table.where({ ...conditions }).update({ key: 'value' })\n *\n * db.$afterCommit(() => { // can be sync or async\n * console.log('after commit')\n * })\n * })\n * ```\n *\n * If used outside the transaction, the hook will be executed almost immediately, on the next microtask:\n *\n * ```ts\n * db.$afterCommit(async () => { // can be sync or async\n * console.log('after commit')\n * })\n * ```\n *\n * If the callback has no `try/catch` and throws an error,\n * this will cause `uncaughtException` if the callback is sync and `unhandledRejection` if it is async.\n */\n afterCommit(this: Query, hook: AfterCommitStandaloneHook): void {\n const trx = this.internal.asyncStorage.getStore();\n if (isInUserTransaction(trx)) {\n (trx.afterCommit ??= []).push(hook);\n } else {\n queueMicrotask(hook);\n }\n }\n\n /**\n * Whenever a query in a transaction fails, the transaction is transitioned to a failed state, no further queries are possible.\n *\n * Use [catchUniqueError](/guide/error-handling.html#catchuniqueerror) to handle uniqueness errors,\n * the following examples do not use it to illustrate error handling.\n *\n * ```ts\n * // This transaction is going to fail\n * db.$transaction(async () => {\n * try {\n * // imagine it fails because the username is already taken\n * await db.user.insert({ username: 'taken' });\n * } catch (err) {\n * // even though the query is wrapped in a try-catch, the transaction fails anyway\n * }\n * });\n * ```\n *\n * You can use `catch` method on a query instead of `try-catch` to surpass the problem.\n * The following transaction won't fail:\n *\n * ```ts\n * // Transaction succeeds\n * db.$transaction(async () => {\n * const result = await db.user.insert({ username: 'taken' }).catch(() => 'failed');\n *\n * if (result === 'failed') {\n * await db.user.insert({ username: 'another' });\n * }\n * });\n * ```\n *\n * This is because when using `catch` method, `OrchidORM` will wrap the query with a savepoint.\n *\n * Alternatively, you can use the `recoverable()` method:\n *\n * ```ts\n * // Transaction succeeds\n * db.$transaction(async () => {\n * try {\n * await db.user.insert({ username: 'taken' }).recoverable();\n * } catch (err) {\n * await db.user.insert({ username: 'another' });\n * }\n * });\n * ```\n */\n recoverable<T>(this: T): T {\n const q = _clone(this);\n q.q.catch = true;\n return q as T;\n }\n}\n","import {\n IsQuery,\n Query,\n QueryOrExpression,\n QueryReturnType,\n} from '../../query';\nimport { AfterCommitErrorHandler } from '../../basic-features/transaction/transaction';\nimport { Column } from '../../../columns';\nimport {\n PickQueryInputType,\n PickQueryQ,\n PickQueryShape,\n} from '../../pick-query-types';\nimport { _clone } from '../../basic-features/clone/clone';\nimport { emptyArray, RecordString, RecordUnknown } from '../../../utils';\nimport { QueryBatchResult } from '../../basic-features/select/select.utils';\nimport {\n pushQueryValueImmutable,\n QueryAfterHook,\n QueryBeforeActionHook,\n QueryBeforeHook,\n} from '../../query-data';\n\n// A function type for after-hook. Constructs type of data argument based on selected columns.\nexport type AfterHook<\n Select extends PropertyKey[],\n Shape extends Column.QueryColumns,\n> = QueryAfterHook<\n {\n [K in Select[number]]: K extends keyof Shape\n ? Shape[K]['__outputType']\n : never;\n }[]\n>;\n\n// Hook argument for selecting columns: array of column names of the table.\nexport type HookSelectArg<T extends PickQueryShape> = (keyof T['shape'] &\n string)[];\n\n// Possible action types to attach hook for.\nexport type HookAction = 'Create' | 'Update' | 'Save' | 'Delete';\n\n// Save `before` hook into the query.\nconst before = <T>(q: T, key: HookAction, cb: QueryBeforeHook): T =>\n pushQueryValueImmutable(q as IsQuery, `before${key}`, cb) as never;\n\n// Save `after` hook into the query: this saves the function and the hook selection into the query data.\nconst after = <T extends PickQueryShape, S extends HookSelectArg<T>>(\n query: T,\n key: HookAction,\n select: S,\n cb: AfterHook<S, T['shape']>,\n commit?: boolean,\n): T => {\n const q = query as unknown as PickQueryQ;\n pushQueryValueImmutable(\n q as never,\n `after${key}${commit ? 'Commit' : ''}`,\n cb,\n );\n\n if (key === 'Save') {\n addSelect(q, 'Create', select);\n addSelect(q, 'Update', select);\n } else {\n addSelect(q, key, select);\n }\n\n return query;\n};\n\nconst addSelect = (\n q: PickQueryQ,\n key: 'Create' | 'Update' | 'Delete',\n select: string[],\n) => {\n const prop = `after${key}Select` as const;\n const set = (q.q[prop] = new Set(q.q[prop]));\n for (const column of select) {\n set.add(column);\n }\n};\n\nexport const _queryHookBeforeQuery = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeHook,\n): T => {\n return pushQueryValueImmutable(q as never, 'before', cb);\n};\n\nexport const _queryHookAfterQuery = <T extends PickQueryShape>(\n q: T,\n cb: QueryAfterHook,\n): T => {\n return pushQueryValueImmutable(q as never, 'after', cb);\n};\n\nexport const _hookSelectColumns = (\n query: Query,\n columns: string[],\n asFn: (as: string[]) => void,\n) => {\n const hookSelect = (query.q.hookSelect = new Map(\n query.q.hookSelect && [...query.q.hookSelect],\n ));\n\n const aliases: string[] = [];\n const addAlias = (as: string) => {\n aliases.push(as);\n if (aliases.length === columns.length) {\n asFn(aliases);\n }\n };\n\n for (const column of columns) {\n const item = hookSelect.get(column);\n hookSelect.set(column, {\n ...item,\n select: column,\n onAs: [...(item?.onAs || emptyArray), addAlias],\n });\n }\n};\n\nexport class QueryHookUtils<T extends PickQueryInputType> {\n constructor(\n public query: IsQuery,\n public columns: string[],\n private key: 'hookCreateSet' | 'hookUpdateSet',\n ) {}\n\n set = (data: {\n [K in keyof T['__inputType']]?:\n | T['__inputType'][K]\n | (() => QueryOrExpression<T['__inputType'][K]>);\n }) => {\n const set: RecordUnknown = {};\n for (const key in data) {\n if (data[key] !== undefined) {\n set[key] = data[key];\n }\n }\n pushQueryValueImmutable(this.query, this.key, set);\n };\n}\n\nexport const finalizeNestedHookSelect = (\n batches: QueryBatchResult[],\n returnType: QueryReturnType,\n tempColumns: Set<string> | undefined,\n renames: RecordString | undefined,\n key: string,\n) => {\n if (renames) {\n for (const { data } of batches) {\n for (const record of data) {\n if (record) {\n for (const a in renames) {\n record[a] = record[renames[a]];\n }\n }\n }\n }\n }\n\n if (tempColumns?.size) {\n for (const { data } of batches) {\n for (const record of data) {\n if (record) {\n for (const key of tempColumns) {\n delete record[key];\n }\n }\n }\n }\n }\n\n if (returnType === 'one' || returnType === 'oneOrThrow') {\n for (const batch of batches) {\n batch.data = batch.data[0];\n }\n } else if (returnType === 'pluck') {\n for (const { data } of batches) {\n for (let i = 0; i < data.length; i++) {\n data[i] = data[i][key];\n }\n }\n } else if (returnType === 'value' || returnType === 'valueOrThrow') {\n for (const item of batches) {\n item.parent[item.key] = item.data[0]?.[key];\n }\n }\n};\n\nexport const _queryHookBeforeCreate = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeActionHook,\n): T => {\n return before(q, 'Create', (q) =>\n cb(new QueryHookUtils(q, q.q.columns, 'hookCreateSet')),\n );\n};\n\nexport const _queryHookAfterCreate = (\n q: PickQueryShape,\n select: HookSelectArg<PickQueryShape>,\n cb: AfterHook<HookSelectArg<PickQueryShape>, Column.QueryColumns>,\n): PickQueryShape => {\n return after(q, 'Create', select, cb);\n};\n\nexport const _queryHookAfterCreateCommit = (\n q: PickQueryShape,\n select: HookSelectArg<PickQueryShape>,\n cb: AfterHook<HookSelectArg<PickQueryShape>, PickQueryShape['shape']>,\n): PickQueryShape => {\n return after(q, 'Create', select, cb, true);\n};\n\nexport const _queryHookBeforeUpdate = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeActionHook,\n): T => {\n return before(q, 'Update', (q) => {\n const columns = new Set<string>();\n\n if (q.q.updateData) {\n for (const item of q.q.updateData) {\n if (typeof item === 'object') {\n for (const key in item) {\n columns.add(key);\n }\n }\n }\n }\n\n if (q.q.updateMany) {\n for (const key of q.q.updateMany.setColumns) {\n columns.add(key);\n }\n }\n\n return cb(new QueryHookUtils(q, [...columns], 'hookUpdateSet'));\n });\n};\n\nexport const _queryHookAfterUpdate = (\n q: PickQueryShape,\n select: HookSelectArg<PickQueryShape>,\n cb: AfterHook<HookSelectArg<PickQueryShape>, PickQueryShape['shape']>,\n): PickQueryShape => {\n return after(q, 'Update', select, cb);\n};\n\nexport const _queryHookAfterUpdateCommit = (\n q: PickQueryShape,\n select: HookSelectArg<PickQueryShape>,\n cb: AfterHook<HookSelectArg<PickQueryShape>, PickQueryShape['shape']>,\n): PickQueryShape => {\n return after(q, 'Update', select, cb, true);\n};\n\nexport const _queryHookBeforeSave = (\n q: PickQueryShape,\n cb: QueryBeforeActionHook,\n): PickQueryShape => {\n return _queryHookBeforeUpdate(_queryHookBeforeCreate(q, cb), cb);\n};\n\nexport const _queryHookAfterSave = (\n q: PickQueryShape,\n select: HookSelectArg<PickQueryShape>,\n cb: AfterHook<HookSelectArg<PickQueryShape>, PickQueryShape['shape']>,\n): PickQueryShape => {\n return after(q, 'Save', select, cb);\n};\n\nexport const _queryAfterSaveCommit = (\n q: PickQueryShape,\n select: HookSelectArg<PickQueryShape>,\n cb: AfterHook<HookSelectArg<PickQueryShape>, PickQueryShape['shape']>,\n): PickQueryShape => {\n return after(q, 'Save', select, cb, true);\n};\n\nexport const _queryHookBeforeDelete = (\n q: PickQueryShape,\n cb: QueryBeforeHook,\n): PickQueryShape => {\n return before(q, 'Delete', cb);\n};\n\nexport const _queryHookAfterDelete = (\n q: PickQueryShape,\n select: HookSelectArg<PickQueryShape>,\n cb: AfterHook<HookSelectArg<PickQueryShape>, PickQueryShape['shape']>,\n): PickQueryShape => {\n return after(q, 'Delete', select, cb);\n};\n\nexport const _queryHookAfterDeleteCommit = (\n q: PickQueryShape,\n select: HookSelectArg<PickQueryShape>,\n cb: AfterHook<HookSelectArg<PickQueryShape>, PickQueryShape['shape']>,\n): PickQueryShape => {\n return after(q, 'Delete', select, cb, true);\n};\n\nexport abstract class QueryHooks {\n /**\n * Run the function before any kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeQuery<T>(this: T, cb: QueryBeforeHook): T {\n return _queryHookBeforeQuery(_clone(this), cb) as T;\n }\n\n /**\n * Run the function after any kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n *\n * @param cb - function to call, first argument is the query result of type `unknown`, second argument is a query object\n */\n afterQuery<T>(this: T, cb: QueryAfterHook): T {\n return _queryHookAfterQuery(_clone(this), cb) as T;\n }\n\n /**\n * Run the function before a `create` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeCreate<T>(this: T, cb: QueryBeforeActionHook): T {\n return _queryHookBeforeCreate(_clone(this), cb) as T;\n }\n\n /**\n * Run the function after a `create` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterCreate<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterCreate(_clone(this), select, cb) as never;\n }\n\n /**\n * Run the function after transaction for a `create` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterCreateCommit<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterCreateCommit(_clone(this), select, cb) as never;\n }\n\n /**\n * Run the function before an `update` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeUpdate<T>(this: T, cb: QueryBeforeActionHook): T {\n return _queryHookBeforeUpdate(_clone(this), cb) as T;\n }\n\n /**\n * Run the function after an `update` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n * If no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterUpdate<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterUpdate(_clone(this), select, cb) as never;\n }\n\n /**\n * Run the function after transaction for an `update` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n * If no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterUpdateCommit<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterUpdateCommit(_clone(this), select, cb) as never;\n }\n\n /**\n * Run the function before a `create` or an `update` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeSave<T>(this: T, cb: QueryBeforeActionHook): T {\n return _queryHookBeforeSave(_clone(this), cb) as T;\n }\n\n /**\n * Run the function after a `create` or an `update` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n * For the `update` query, if no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterSave<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterSave(_clone(this), select, cb) as never;\n }\n\n /**\n * Run the function after transaction for a `create` or an `update` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n * For the `update` query, if no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterSaveCommit<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryAfterSaveCommit(_clone(this), select, cb) as never;\n }\n\n /**\n * Run the function before a `delete` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeDelete<T>(this: T, cb: QueryBeforeHook): T {\n return _queryHookBeforeDelete(_clone(this), cb) as T;\n }\n\n /**\n * Run the function after a `delete` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n * If no records were deleted, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterDelete<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterDelete(_clone(this), select, cb) as never;\n }\n\n /**\n * Run the function after transaction for a `delete` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n * If no records were deleted, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterDeleteCommit<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterDeleteCommit(_clone(this), select, cb) as never;\n }\n\n /**\n * Add `catchAfterCommitError` to the query to catch possible errors that are coming from after commit hooks.\n *\n * When it is used, the transaction will return its result disregarding of a failed hook.\n *\n * Without `catchAfterCommitError`, the transaction function throws and won't return result.\n * Result is still accessible from the error object [AfterCommitError](#AfterCommitError).\n *\n * ```ts\n * const result = await db\n * .$transaction(async () => {\n * return db.table.create(data);\n * })\n * .catchAfterCommitError((err) => {\n * // err is instance of AfterCommitError (see below)\n * })\n * // can be added multiple times, all catchers will be executed\n * .catchAfterCommitError((err) => {});\n *\n * // result is available even if an after commit hook has failed\n * result.id;\n * ```\n */\n catchAfterCommitError<T>(this: T, fn: AfterCommitErrorHandler): T {\n const q = _clone(this);\n pushQueryValueImmutable(q, 'catchAfterCommitErrors', fn);\n return q as T;\n }\n}\n","import { Column } from '../../../columns';\nimport { IsQuery, QueryReturnType } from '../../query';\nimport { _clone } from '../../basic-features/clone/clone';\nimport { QueryBatchResult } from '../../basic-features/select/select.utils';\nimport { pushQueryValueImmutable, QueryData } from '../../query-data';\nimport { QueryThen } from '../../then/then';\n\n// result transformer: function for `transform`, object for `map`\nexport type QueryDataTransform =\n | QueryDataTransformFn\n | {\n map: (record: unknown, index: number, array: unknown) => unknown;\n thisArg?: unknown;\n };\n\ninterface QueryDataTransformFn {\n (data: unknown, queryData: unknown): unknown;\n}\n\n/**\n * See `transform` query method.\n * This helper applies all transform functions to a result.\n *\n * @param queryData - query data\n * @param returnType - return type of the query, for proper `map` handling\n * @param fns - array of transform functions, can be undefined\n * @param result - query result to transform\n */\nexport const applyTransforms = (\n queryData: unknown,\n returnType: QueryReturnType,\n fns: QueryDataTransform[],\n result: unknown,\n): unknown => {\n for (const fn of fns) {\n if ('map' in fn) {\n if (!returnType || returnType === 'all' || returnType === 'pluck') {\n result = (result as unknown[]).map(fn.map, fn.thisArg);\n } else if (result !== undefined) {\n result =\n result === null ? null : fn.map.call(fn.thisArg, result, 0, result);\n }\n } else {\n result = fn(result, queryData);\n }\n }\n return result;\n};\n\nexport const applyBatchTransforms = (\n q: QueryData,\n batches: QueryBatchResult[],\n) => {\n if (q.transform) {\n for (const item of batches) {\n item.parent[item.key] = applyTransforms(\n q,\n q.returnType,\n q.transform,\n item.data,\n );\n }\n }\n};\n\nexport class QueryTransform {\n /**\n * Transform the result of the query right after loading it.\n *\n * `transform` method should be called in the last order, other methods can't be chained after calling it.\n *\n * It is meant to transform the whole result of a query, for transforming individual records consider using {@link QueryMap.map}.\n *\n * The [hooks](/guide/hooks.html) that are going to run after the query will receive the query result **before** transferring.\n *\n * Consider the following example of a cursor-based pagination by `id`:\n *\n * ```ts\n * const lastId: number | undefined = req.query.cursor;\n *\n * type Result = {\n * nodes: { id: number; text: string }[];\n * cursor?: number;\n * };\n *\n * // result is only for demo, it will be inferred\n * const posts: Result = await db.post\n * .select('id', 'text')\n * .where({ id: { lt: lastId } })\n * .order({ id: 'DESC' })\n * .limit(100)\n * .transform((nodes) => ({ nodes, cursor: nodes.at(-1)?.id }));\n * ```\n *\n * You can also use the `tranform` on nested sub-queries:\n *\n * ```ts\n * type Result = {\n * nodes: {\n * id: number;\n * text: string;\n * comments: { nodes: { id: number; text: string }[]; cursor?: number };\n * }[];\n * cursor?: number;\n * };\n *\n * const postsWithComments: Result = await db.post\n * .select('id', 'text')\n * .select({\n * comments: (q) =>\n * q.comments\n * .select('id', 'text')\n * .transform((nodes) => ({ nodes, cursor: nodes.at(-1)?.id })),\n * })\n * .transform((nodes) => ({ nodes, cursor: nodes.at(-1)?.id }));\n * ```\n *\n * @param fn - function to transform query result with\n */\n transform<T extends IsQuery, Result>(\n this: T,\n fn: (\n input: T extends { then: QueryThen<infer Data> } ? Data : never,\n queryData: QueryData,\n ) => Result,\n ): {\n [K in keyof T]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'result'\n ? { value: Column.Pick.QueryColumnOfType<Result> }\n : K extends 'then'\n ? QueryThen<Result>\n : T[K];\n } {\n return pushQueryValueImmutable(_clone(this), 'transform', fn) as never;\n }\n}\n","import {\n IsQuery,\n QueryOrExpression,\n QueryReturnType,\n ReturnsQueryOrExpression,\n} from '../../query';\nimport { Column, UnknownColumn } from '../../../columns';\nimport { Expression } from '../../expressions/expression';\nimport {\n EmptyObject,\n FnUnknownToUnknown,\n MaybePromise,\n RecordString,\n RecordUnknown,\n} from '../../../utils';\nimport { RelationsBase } from '../../relations';\nimport { PickQueryQ, PickQueryShape } from '../../pick-query-types';\nimport { QueryBatchResult } from '../../basic-features/select/select.utils';\nimport { QueryExpressions } from '../../expressions/query-expressions';\nimport { QuerySql } from '../../sql/sql';\nimport { finalizeNestedHookSelect } from '../hooks/hooks';\nimport { applyBatchTransforms } from '../data-transform/transform';\nimport { QueryData } from '../../query-data';\nimport { ColumnDataSelectSqlProp } from '../select-sql/select-sql';\nimport { type BrandColumn } from '../../../columns/brand';\n\nexport interface ColumnDataComputedProp extends ColumnDataSelectSqlProp {\n // SQL computed-column marker used for virtual/read-only/default-excluded semantics.\n computed?: Expression;\n}\n\nexport type ComputedColumnsFromOptions<\n Table extends string | undefined,\n Shape,\n Options,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n> = Options extends { computed: (...args: any) => infer R }\n ? {\n [K in (keyof Shape | keyof R) & string]: K extends keyof Shape\n ? Shape[K]\n : K extends keyof R\n ? BrandColumn<ComputedColumnValue<R[K]>, `${Table}.${K & string}`>\n : never;\n }\n : Shape;\n\ntype ComputedColumnValue<T> = T extends\n | {\n result: {\n value: infer Value extends Column.Pick.QueryColumn;\n };\n }\n | (() => {\n result: {\n value: infer Value extends Column.Pick.QueryColumn;\n };\n })\n ? Value\n : never;\n\nexport interface ComputedOptionsConfig {\n [K: string]: QueryOrExpression<unknown> | ReturnsQueryOrExpression<unknown>;\n}\n\nexport type ComputedOptionsFactory<\n ColumnTypes,\n Shape extends Column.QueryColumns,\n> = (t: ComputedMethods<ColumnTypes, Shape>) => ComputedOptionsConfig;\n\nexport interface RuntimeComputedQueryColumn<OutputType>\n extends Column.Pick.QueryColumn {\n dataType: 'runtimeComputed';\n __type: never;\n __outputType: OutputType;\n __queryType: undefined;\n operators: { cannotQueryRuntimeComputed: never };\n}\n\nexport interface ComputedMethods<\n ColumnTypes,\n Shape extends Column.QueryColumns,\n> extends QueryComputedArg<ColumnTypes, Shape> {\n computeAtRuntime<Deps extends keyof Shape, OutputType>(\n dependsOn: Deps[],\n fn: (record: {\n [K in keyof Shape & Deps]: Shape[K]['__outputType'];\n }) => OutputType,\n ): { result: { value: RuntimeComputedQueryColumn<OutputType> } };\n\n computeBatchAtRuntime<Deps extends keyof Shape, OutputType>(\n dependsOn: Deps[],\n fn: (\n record: {\n [K in keyof Shape & Deps]: Shape[K]['__outputType'];\n }[],\n ) => MaybePromise<OutputType[]>,\n ): { result: { value: RuntimeComputedQueryColumn<OutputType> } };\n}\n\nexport class ComputedColumn {\n constructor(\n public kind: 'one' | 'many',\n public deps: string[],\n public fn: FnUnknownToUnknown,\n ) {}\n}\n\nexport interface ComputedColumns {\n [K: string]: ComputedColumn;\n}\n\nconst computeAtRuntime = (deps: string[], fn: () => void) =>\n new ComputedColumn('one', deps, fn);\nconst computeBatchAtRuntime = (deps: string[], fn: () => void) =>\n new ComputedColumn('many', deps, fn);\n\nexport interface QueryComputedArg<\n ColumnTypes,\n Shape extends Column.QueryColumns,\n>\n extends QueryExpressions, QuerySql<ColumnTypes> {\n shape: Shape;\n columnTypes: ColumnTypes;\n windows: EmptyObject;\n relations: RelationsBase;\n result: EmptyObject;\n __selectable: {\n [K in keyof Shape]: { as: string; column: Column.Pick.QueryColumn };\n };\n}\n\nexport const applyComputedColumns = (\n q: IsQuery,\n fn: ComputedOptionsFactory<never, never>,\n) => {\n (q as unknown as RecordUnknown).computeAtRuntime = computeAtRuntime;\n (q as unknown as RecordUnknown).computeBatchAtRuntime = computeBatchAtRuntime;\n\n const computed = fn(q as never);\n for (const key in computed) {\n let item = computed[key];\n if (typeof item === 'function') item = item.call(computed);\n\n item = Object.create(item);\n\n if (item instanceof ComputedColumn) {\n (q as unknown as PickQueryQ).q.runtimeComputeds = {\n ...(q as unknown as PickQueryQ).q.runtimeComputeds,\n [key]: item,\n };\n } else {\n let col = (item as QueryOrExpression<unknown>).result.value as\n | Column\n | undefined;\n if (!col) {\n (item as QueryOrExpression<unknown>).result = {\n value: (col = Object.create(UnknownColumn.instance) as Column),\n };\n col.data = { ...col.data };\n }\n\n ((q as unknown as PickQueryShape).shape as Column.QueryColumns)[key] =\n col;\n\n const { data } = col;\n data.computed = item as Expression;\n data.selectSql = item as Expression;\n data.explicitSelect = true;\n data.readOnly = true;\n\n const parse = col._parse;\n if (parse) {\n ((q as unknown as PickQueryQ).q.defaultParsers ??= {})[key] = parse;\n }\n }\n }\n\n (q as unknown as RecordUnknown).computeAtRuntime = (\n q as unknown as RecordUnknown\n ).computeBatchAtRuntime = undefined;\n};\n\nexport const processComputedResult = (query: QueryData, result: unknown) => {\n let promises: Promise<void>[] | undefined;\n\n for (const key in query.selectedComputeds) {\n const computed = query.selectedComputeds[key];\n if (computed.kind === 'one') {\n for (const record of result as RecordUnknown[]) {\n record[key] = computed.fn(record);\n }\n } else {\n const res = computed.fn(result);\n if (Array.isArray(res)) {\n saveBatchComputed(key, result, res);\n } else {\n (promises ??= []).push(\n (res as Promise<unknown[]>).then((res) =>\n saveBatchComputed(key, result, res),\n ),\n );\n }\n }\n }\n\n if (!promises) return;\n return Promise.all(promises);\n};\n\nexport const processComputedBatches = (\n query: QueryData,\n batches: QueryBatchResult[],\n originalReturnType: QueryReturnType,\n returnType: QueryReturnType,\n tempColumns: Set<string> | undefined,\n renames: RecordString | undefined,\n key: string,\n) => {\n let promises: Promise<void>[] | undefined;\n\n const plainValue =\n originalReturnType === 'value' || originalReturnType === 'valueOrThrow';\n\n for (const computedKey in query.selectedComputeds) {\n const setAsKey = plainValue ? key : computedKey;\n\n const computed = query.selectedComputeds[computedKey];\n if (computed.kind === 'one') {\n for (const { data } of batches) {\n for (const record of data) {\n if (record) {\n record[setAsKey] = computed.fn(record);\n }\n }\n }\n } else {\n for (const { data } of batches) {\n let present;\n let blanks: Set<number> | undefined;\n if (!returnType || returnType === 'all') {\n present = data;\n } else {\n present = [];\n blanks = new Set<number>();\n for (let i = 0; i < data.length; i++) {\n if (data[i]) {\n present.push(data[i]);\n } else {\n blanks.add(i);\n }\n }\n }\n\n const res = computed.fn(present);\n if (Array.isArray(res)) {\n saveBatchComputed(setAsKey, data, res, blanks);\n } else {\n (promises ??= []).push(\n (res as Promise<unknown[]>).then((res) =>\n saveBatchComputed(setAsKey, data, res, blanks),\n ),\n );\n }\n }\n }\n }\n\n if (!promises) return;\n\n return Promise.all(promises).then(() => {\n finalizeNestedHookSelect(\n batches,\n originalReturnType,\n tempColumns,\n renames,\n key,\n );\n\n applyBatchTransforms(query, batches);\n });\n};\n\nconst saveBatchComputed = (\n key: string,\n result: unknown,\n res: unknown[],\n blanks?: Set<number>,\n) => {\n const len = (result as unknown[]).length;\n const actual = res.length + (blanks?.size || 0);\n if (len !== actual) {\n throw new Error(\n `Incorrect length of batch computed result for column ${key}. Expected ${len}, received ${actual}.`,\n );\n }\n\n if (blanks) {\n for (let i = 0, r = 0; i < len; i++) {\n if (!blanks.has(i)) {\n (result as RecordUnknown[])[i][key] = res[r++];\n }\n }\n } else {\n for (let i = 0; i < len; i++) {\n (result as RecordUnknown[])[i][key] = res[i];\n }\n }\n};\n","import {\n commitSql,\n emptyArray,\n emptyObject,\n RecordString,\n RecordUnknown,\n rollbackSql,\n} from '../utils';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { setTimeout } from 'node:timers/promises';\nimport { QueryError } from '../query/errors';\nimport {\n AfterCommitErrorHandler,\n IsolationLevel,\n Query,\n QueryLogObject,\n QuerySchema,\n SingleSqlItem,\n} from '../query';\nimport {\n AsyncState,\n ProcessedStorageOptions,\n} from '../query/basic-features/storage/storage';\nimport {\n sqlSessionContextComputeSetup,\n sqlSessionContextExecute,\n SqlSessionContextSetupResult,\n SqlSessionState,\n} from './features/sql-session-context';\nimport {\n getResetRoleSql,\n getResetSetConfigSql,\n getSetConfigSql,\n getSetRoleSql,\n} from './adapter.utils';\nimport { _runAfterCommitHooks } from '../query/basic-features/transaction/transaction';\nimport { PostgresInterval } from './driver-adapter-shared';\n\nexport type { SqlSessionState } from './features/sql-session-context';\n\n/**\n * Generic result returning from query methods.\n */\nexport interface QueryResultRow {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [K: string]: any;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface QueryResult<T = any> {\n rowCount: number;\n rows: T[];\n /**\n * node-postgres and postgres-js: fields are present even for empty results.\n * Bun doesn't implement fields in the same way, fields are empty if no rows returned.\n */\n fields: {\n name: string;\n }[];\n}\n\nexport interface AdapterConfigBase {\n databaseURL?: string;\n database?: string;\n user?: string;\n password?: string | (() => string | Promise<string>);\n searchPath?: string;\n // oxlint-disable-next-line typescript/no-explicit-any - different drivers support different configs for this\n ssl?: any;\n /**\n * Postgres settings to apply when driver connections are configured.\n *\n * `searchPath` is normalized to `search_path` in this map.\n */\n setConfig?: RecordString;\n schema?: QuerySchema;\n host?: string;\n /**\n * This option may be useful in CI when database container has started, CI starts performing next steps,\n * migrations begin to apply though database may be not fully ready for connections yet.\n *\n * Set `connectRetry: true` for the default backoff strategy. It performs 10 attempts starting with 50ms delay and increases delay exponentially according to this formula:\n *\n * ```\n * (factor, defaults to 1.5) ** (currentAttempt - 1) * (delay, defaults to 50)\n * ```\n *\n * So the 2nd attempt will happen in 50ms from start, 3rd attempt in 125ms, 3rd in 237ms, and so on.\n *\n * You can customize max attempts to be made, `factor` multiplier and the starting delay by passing:\n *\n * ```ts\n * const options = {\n * databaseURL: process.env.DATABASE_URL,\n * connectRetry: {\n * attempts: 15, // max attempts\n * strategy: {\n * delay: 100, // initial delay\n * factor: 2, // multiplier for the formula above\n * }\n * }\n * };\n *\n * rakeDb(options, { ... });\n * ```\n *\n * You can pass a custom function to `strategy` to customize delay behavior:\n *\n * ```ts\n * import { setTimeout } from 'timers/promises';\n *\n * const options = {\n * databaseURL: process.env.DATABASE_URL,\n * connectRetry: {\n * attempts: 5,\n * stragegy(currentAttempt: number, maxAttempts: number) {\n * // linear: wait 100ms after 1st attempt, then 200m after 2nd, and so on.\n * return setTimeout(currentAttempt * 100);\n * },\n * },\n * };\n * ```\n */\n connectRetry?: AdapterConfigConnectRetryParam | true;\n}\n\ninterface AdapterConfigConnectRetryParam {\n attempts?: number;\n strategy?:\n | AdapterConfigConnectRetryStrategyParam\n | AdapterConfigConnectRetryStrategy;\n}\n\ninterface AdapterConfigConnectRetryStrategyParam {\n delay?: number;\n factor?: number;\n}\n\nexport interface AdapterConfigConnectRetry {\n attempts: number;\n strategy: AdapterConfigConnectRetryStrategy;\n}\n\ninterface AdapterConfigConnectRetryStrategy {\n (attempt: number, attempts: number): Promise<void> | void;\n}\n\nexport interface AdapterTransactionOptions extends ProcessedStorageOptions {\n level?: IsolationLevel;\n readOnly?: boolean;\n deferrable?: boolean;\n}\n\n// Interface of a database adapter to use for different databases.\n// This is the full interface exposed to users, including metadata methods and clone.\nexport interface Adapter {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n errorClass: new (...args: any[]) => Error;\n searchPath?: string;\n driverAdapter: DriverAdapter;\n\n // Connection state\n isInTransaction(this: Adapter): this is TransactionAdapter;\n\n // Error handling\n assignError(to: QueryError, from: Error): void;\n\n // make a query to get rows as objects\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n sqlSessionState?: SqlSessionState,\n ): Promise<QueryResult<T>>;\n\n // make a query to get rows as array of column values.\n // Selecting fields of the same names works fine with node-postgres and postgres-js,\n // but not for Bun SQL until it supports parsing fields info from Postgres response.\n arrays<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n R extends any[] = any[],\n >(\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n sqlSessionState?: SqlSessionState,\n ): Promise<QueryResult<R>>;\n\n /**\n * Run a transaction\n *\n * `options` can be `undefined`.\n */\n transaction<T>(\n asyncStorage: AsyncLocalStorage<AsyncState> | undefined,\n options: AdapterTransactionOptions | undefined,\n cb: (adapter: TransactionAdapter) => Promise<T>,\n ): Promise<T>;\n\n // close connection\n close(): Promise<void>;\n\n // Metadata methods\n getDatabase(): string;\n getUser(): string;\n getSearchPath(): string | undefined;\n getHost(): string;\n getSchema(): QuerySchema | undefined;\n\n // Clone method\n clone(params?: AdapterConfigBase): Adapter;\n}\n\n/**\n * Adapter interface for transaction contexts.\n */\nexport interface TransactionAdapter extends Adapter {\n isInTransaction(this: Adapter): this is TransactionAdapter;\n savepoint<T>(name: string, cb: () => Promise<T>): Promise<T>;\n\n /**\n * This is a workaround for postgres-js savepoint limitations.\n * Postgres-js dictates this:\n * - must use its `savepoint` method over manual `SAVEPOINT` because when doing it manually there is no way to prevent transaction from being rolled back when a query in a savepoint fails.\n * - must use its `sql` client from inside the `savepoint` method for the lifetime of the savepoint because of the reason above.\n */\n hackySavepoint<T extends QueryResultRow = QueryResultRow>(\n state: HackySavepointState,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n ): Promise<QueryResult<T>>;\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype Pool = any;\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype Client = any;\n\nexport interface AdapterSchemaConfigOptions {\n // true by default, node-postgres has false\n jsonEncodedByDriver?: boolean;\n // false by default, Bun has true\n dateParsedByDriver?: boolean;\n // Bun requires wrapping arrays in `sql.array`\n arrayEncode?(input: unknown): unknown;\n // node-postgres does that out of the box, postgres-js does it with default parsers, Bun provides this function\n intervalParse?(input: string): PostgresInterval;\n}\n\n/**\n * Adapter class used by runtime orchestrator to create driver-specific adapters.\n */\nexport interface DriverAdapter {\n noFieldsForArrays?: boolean;\n schemaConfig?: AdapterSchemaConfigOptions;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n errorClass: new (...args: any[]) => Error;\n errorFields: RecordString;\n configure(config: AdapterConfigBase): Pool;\n manualPool: boolean;\n borrow(pool: Pool): Client;\n release(client: Client): void;\n queryClient<T = QueryResultRow>(\n client: Client,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n ): Promise<QueryResult<T>>;\n begin<DriverClient, Result>(\n pool: Pool,\n cb: (client: DriverClient) => Promise<Result>,\n options?: string,\n ): Promise<Result>;\n savepoint<T>(\n client: Client,\n setClient: (client: Client) => void,\n name: string,\n cb: () => Promise<T>,\n ): Promise<T>;\n hackySavepoint<T extends QueryResultRow>(\n client: Client,\n setClient: (client: Client) => void,\n state: HackySavepointState,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n ): Promise<QueryResult<T>>;\n close(pool: Pool): Promise<void>;\n}\n\n/**\n * Constructor params for the shared runtime adapter orchestrator.\n */\nexport interface AdapterParams {\n /**\n * Driver-specific adapter class implementing `DriverAdapter`.\n */\n driverAdapter: DriverAdapter;\n /**\n * Base config saved by runtime and used for clone recreation.\n */\n config: AdapterConfigBase;\n}\n\n/**\n * Shared runtime adapter orchestrator over a driver-specific adapter implementation.\n */\nexport class AdapterClass implements Adapter {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n errorClass: new (...args: any[]) => Error;\n driverAdapter: DriverAdapter;\n private pool: Pool;\n private readonly config: AdapterConfigBase;\n private readonly connectionState: AdapterConnectionState;\n\n constructor(private readonly params: AdapterParams) {\n this.config = { ...params.config };\n\n if (this.config.connectRetry) {\n const connectRetryConfig = makeConnectRetryConfig(\n this.config.connectRetry === true\n ? emptyObject\n : this.config.connectRetry,\n );\n if (connectRetryConfig) {\n this.query = wrapAdapterFnWithConnectRetry(\n connectRetryConfig,\n this.query,\n );\n this.arrays = wrapAdapterFnWithConnectRetry(\n connectRetryConfig,\n this.arrays,\n );\n }\n }\n this.connectionState = createAdapterConnectionState(this.config);\n this.config = createDriverAdapterConfig(this.config, this.connectionState);\n this.driverAdapter = params.driverAdapter;\n this.pool = this.driverAdapter.configure(this.config);\n this.errorClass = this.driverAdapter.errorClass;\n }\n\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n sqlSessionState?: SqlSessionState,\n ): Promise<QueryResult<T>> {\n return runQueryHandlePool<QueryResult<T>>(\n this.pool,\n this.driverAdapter,\n text,\n values,\n sqlSessionState,\n );\n }\n\n // make a query to get rows as array of column values\n arrays<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n R extends any[] = any[],\n >(\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n sqlSessionState?: SqlSessionState,\n ): Promise<QueryResult<R>> {\n return runQueryHandlePool<QueryResult<R>>(\n this.pool,\n this.driverAdapter,\n text,\n values,\n sqlSessionState,\n true,\n );\n }\n\n clone(params?: AdapterConfigBase): Adapter {\n return new AdapterClass({\n driverAdapter: this.params.driverAdapter,\n config: cloneAdapterConfig(this.config, params),\n });\n }\n\n isInTransaction(this: Adapter): this is TransactionAdapter {\n return false;\n }\n\n getDatabase(): string {\n return this.connectionState.database as string;\n }\n\n getUser(): string {\n return this.connectionState.user as string;\n }\n\n getSearchPath(): string | undefined {\n return this.connectionState.searchPath;\n }\n\n getHost(): string {\n return this.connectionState.host as string;\n }\n\n getSchema(): QuerySchema | undefined {\n return this.connectionState.schema;\n }\n\n transaction<T>(\n asyncStorage: AsyncLocalStorage<AsyncState> | undefined,\n options: AdapterTransactionOptions | undefined,\n cb: (adapter: TransactionAdapter) => Promise<T>,\n ): Promise<T> {\n return transaction(\n asyncStorage,\n this,\n this.driverAdapter,\n this.pool,\n options,\n cb,\n );\n }\n\n close = async (): Promise<void> => {\n const { pool } = this;\n this.pool = this.driverAdapter.configure(this.config);\n await this.driverAdapter.close(pool);\n };\n\n assignError(to: QueryError, from: Error): void {\n const { errorFields } = this.driverAdapter;\n for (const key in errorFields) {\n (to as unknown as RecordUnknown)[key] = (\n from as unknown as RecordUnknown\n )[errorFields[key]];\n }\n }\n}\n\nexport interface HackySavepointStateActiveSavepoint {\n release(): Promise<void>;\n rollback(err: unknown): Promise<void>;\n}\n\nexport interface HackySavepointState {\n name: string;\n activeSavepoint?: HackySavepointStateActiveSavepoint;\n}\n\n/**\n * Shared runtime transaction adapter orchestrator over a driver-specific transaction adapter.\n */\nexport class TransactionAdapterClass implements TransactionAdapter {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n errorClass: new (...args: any[]) => Error;\n\n driverAdapter: DriverAdapter;\n\n constructor(\n private adapter: Adapter,\n private client: Client,\n ) {\n this.driverAdapter = adapter.driverAdapter;\n this.errorClass = this.adapter.errorClass;\n }\n\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n sqlSessionState?: SqlSessionState,\n ): Promise<QueryResult<T>> {\n const setup = sqlSessionContextComputeSetup(sqlSessionState);\n\n return runQueryHandleSetupAndCleanup<QueryResult<T>>(\n this.driverAdapter,\n this.client,\n text,\n values,\n setup,\n );\n }\n\n // make a query to get rows as array of column values\n arrays<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n R extends any[] = any[],\n >(\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n sqlSessionState?: SqlSessionState,\n ): Promise<QueryResult<R>> {\n const setup = sqlSessionContextComputeSetup(sqlSessionState);\n\n return runQueryHandleSetupAndCleanup<QueryResult<R>>(\n this.driverAdapter,\n this.client,\n text,\n values,\n setup,\n true,\n );\n }\n\n clone(params?: AdapterConfigBase): Adapter {\n return this.adapter.clone(params);\n }\n\n isInTransaction(this: Adapter): this is TransactionAdapter {\n return true;\n }\n\n getDatabase(): string {\n return this.adapter.getDatabase();\n }\n\n getUser(): string {\n return this.adapter.getUser();\n }\n\n getSearchPath(): string | undefined {\n return this.adapter.getSearchPath();\n }\n\n getHost(): string {\n return this.adapter.getHost();\n }\n\n getSchema(): QuerySchema | undefined {\n return this.adapter.getSchema();\n }\n\n async transaction<T>(\n asyncStorage: AsyncLocalStorage<AsyncState> | undefined,\n options: AdapterTransactionOptions | undefined,\n cb: (adapter: TransactionAdapter) => Promise<T>,\n ): Promise<T> {\n return transaction(\n asyncStorage,\n this.adapter,\n this.driverAdapter,\n this.client,\n options,\n cb,\n this,\n );\n }\n\n savepoint<T>(name: string, cb: () => Promise<T>): Promise<T> {\n return this.driverAdapter.savepoint(\n this.client,\n (client) => {\n this.client = client;\n },\n name,\n cb,\n );\n }\n\n hackySavepoint<T extends QueryResultRow = QueryResultRow>(\n state: HackySavepointState,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n ): Promise<QueryResult<T>> {\n return this.driverAdapter.hackySavepoint(\n this.client,\n (client) => {\n this.client = client;\n },\n state,\n text,\n values,\n arraysMode,\n );\n }\n\n close(): Promise<void> {\n return this.adapter.close();\n }\n\n assignError(to: QueryError, from: Error): void {\n return this.adapter.assignError(to, from);\n }\n}\n\ninterface TransactionCtx {\n state?: AsyncState;\n logData: unknown;\n}\n\nconst transaction = <T>(\n asyncStorage: AsyncLocalStorage<AsyncState> | undefined,\n adapter: Adapter,\n driverAdapter: DriverAdapter,\n poolOrClient: Pool | Client,\n options: AdapterTransactionOptions | undefined,\n cb: (adapter: TransactionAdapter) => Promise<T>,\n transactionAdapter?: TransactionAdapter,\n): Promise<T> => {\n const sql = {\n values: emptyArray,\n } as unknown as SingleSqlItem;\n\n const log = options?.log;\n\n const state = asyncStorage?.getStore();\n\n const ctx = {\n state,\n logData: undefined as unknown,\n };\n\n const transactionId =\n state?.transactionId !== undefined ? state.transactionId + 1 : 0;\n\n const fn = (transactionAdapter: TransactionAdapter) => {\n if (log && sql.text) log.afterQuery(sql, ctx.logData);\n if (log) ctx.logData = log.beforeQuery(commitSql);\n\n if (state || !asyncStorage) {\n const parentTransactionRole = state?.transactionRole;\n const parentTransactionSetConfig = state?.transactionSetConfig;\n\n if (state) {\n state.transactionId = transactionId;\n if (options) {\n if (options.role) state.transactionRole = options.role;\n if (options.setConfig)\n state.transactionSetConfig = {\n ...state.transactionSetConfig,\n ...options.setConfig,\n };\n }\n }\n\n return Promise.resolve(cb(transactionAdapter)).finally(() => {\n if (state) {\n state.transactionId = transactionId - 1;\n state.transactionRole = parentTransactionRole;\n state.transactionSetConfig = parentTransactionSetConfig;\n }\n });\n }\n\n ctx.state = {\n ...options,\n role: undefined,\n setConfig: undefined,\n transactionAdapter,\n transactionId,\n transactionRole: options?.role,\n transactionSetConfig: options?.setConfig,\n };\n\n return asyncStorage.run(ctx.state, () => cb(transactionAdapter));\n };\n\n transactionAdapter ??= state?.transactionAdapter;\n\n if (transactionAdapter) {\n return nestedTransaction(\n adapter,\n driverAdapter,\n transactionAdapter,\n poolOrClient,\n options,\n fn,\n ctx,\n transactionId,\n );\n } else {\n return realTransaction(\n adapter,\n driverAdapter,\n poolOrClient,\n options,\n fn,\n ctx,\n sql,\n log,\n );\n }\n};\n\nconst realTransaction = async <T>(\n adapter: Adapter,\n driverAdapter: DriverAdapter,\n pool: Pool,\n options: AdapterTransactionOptions | undefined,\n cb: (adapter: TransactionAdapter) => Promise<T>,\n ctx: TransactionCtx,\n sql: SingleSqlItem,\n log?: QueryLogObject,\n) => {\n let trxOpts: string | undefined;\n if (options?.level) {\n trxOpts = `ISOLATION LEVEL ${options.level}`;\n }\n\n if (options?.readOnly !== undefined) {\n const add = `READ ${options.readOnly ? 'ONLY' : 'WRITE'}`;\n trxOpts = trxOpts ? trxOpts + ' ' + add : add;\n }\n\n if (options?.deferrable !== undefined) {\n const add = `${options.deferrable ? '' : 'NOT '}DEFERRABLE`;\n trxOpts = trxOpts ? trxOpts + ' ' + add : add;\n }\n\n if (log) {\n sql.text = trxOpts ? `BEGIN ${trxOpts}` : 'BEGIN';\n ctx.logData = log.beforeQuery(sql);\n }\n\n const result = (await driverAdapter\n .begin(\n pool,\n (client) => {\n let promises: Promise<unknown>[] | undefined;\n\n const setRoleSql = getSetRoleSql(undefined, options);\n if (setRoleSql) {\n (promises ??= []).push(driverAdapter.queryClient(client, setRoleSql));\n }\n\n const setConfigSql = getSetConfigSql(undefined, options);\n if (setConfigSql) {\n (promises ??= []).push(\n driverAdapter.queryClient(client, setConfigSql),\n );\n }\n\n const transaction = cb(new TransactionAdapterClass(adapter, client));\n\n return promises\n ? Promise.all(promises).then(() => transaction)\n : transaction;\n },\n trxOpts,\n )\n .catch((err) => {\n if (log) log.afterQuery(rollbackSql, ctx.logData);\n\n throw err;\n })) as Promise<T>;\n\n if (log) log.afterQuery(commitSql, ctx.logData);\n\n if (ctx.state) {\n // state was defined in the callback above;\n runAfterCommit(ctx.state.afterCommit, result);\n }\n\n return result;\n};\n\nconst nestedTransaction = async <T>(\n adapter: Adapter,\n driverAdapter: DriverAdapter,\n transactionAdapter: TransactionAdapter,\n client: Client,\n options: AdapterTransactionOptions | undefined,\n cb: (adapter: TransactionAdapter) => Promise<T>,\n ctx: TransactionCtx,\n transactionId: number,\n) => {\n const state = ctx.state;\n const parentRole = state?.transactionRole;\n const parentSetConfig = state?.transactionSetConfig;\n\n const result = await transactionAdapter.savepoint(\n `t${transactionId}`,\n async () => {\n const setRoleSql = getSetRoleSql(parentRole, options);\n if (setRoleSql) {\n // awaited by await below\n driverAdapter.queryClient(client, setRoleSql);\n }\n\n const setConfigSql = getSetConfigSql(parentSetConfig, options);\n if (setConfigSql) {\n // awaited by await below\n driverAdapter.queryClient(client, setConfigSql);\n }\n\n let result;\n try {\n result = await cb(new TransactionAdapterClass(adapter, client));\n // config is reverted by rollback to savepoint, role is not reverted and it is undone manually in the finally section\n } finally {\n const resetRoleSql = getResetRoleSql(parentRole, options);\n if (resetRoleSql) {\n await driverAdapter.queryClient(client, resetRoleSql);\n }\n }\n\n const resetSetConfigSql = getResetSetConfigSql(parentSetConfig, options);\n if (resetSetConfigSql) {\n // awaited by await release savepoint\n driverAdapter.queryClient(client, resetSetConfigSql);\n }\n\n return result;\n },\n );\n\n // transactionId is trx.testTransactionCount when only the test transactions are left,\n // and it's time to execute after commit hooks, because they won't be executed for test transactions.\n if (ctx.state && transactionId === ctx.state.testTransactionCount) {\n const { afterCommit } = ctx.state;\n ctx.state.afterCommit = undefined;\n runAfterCommit(afterCommit, result);\n }\n\n return result;\n};\n\n// `afterCommit` hooks are detached from the main flow, this function won't throw.\nconst runAfterCommit = (\n afterCommit: TransactionAfterCommitHook[] | undefined,\n result: unknown,\n) => {\n // to suppress throws of sync afterCommit hooks.\n queueMicrotask(async () => {\n if (afterCommit) {\n const promises = [];\n\n let catchAfterCommitErrors: AfterCommitErrorHandler[] | undefined;\n for (let i = 0, len = afterCommit.length; i < len; ) {\n const first = afterCommit[i];\n if (typeof first === 'function') {\n try {\n promises.push(first());\n } catch (err) {\n promises.push(Promise.reject(err));\n }\n i++;\n } else {\n const q = afterCommit[i + 1] as Query;\n if (q.q.catchAfterCommitErrors) {\n (catchAfterCommitErrors ??= []).push(...q.q.catchAfterCommitErrors);\n }\n\n for (const fn of afterCommit[i + 2] as AfterCommitHook[]) {\n try {\n promises.push(fn(first as unknown[], q));\n } catch (err) {\n promises.push(Promise.reject(err));\n }\n }\n i += 3;\n }\n }\n\n const getHookNames = () => {\n const hookNames = [];\n for (let i = 0, len = afterCommit.length; i < len; ) {\n const first = afterCommit[i];\n if (typeof first === 'function') {\n hookNames.push(first.name);\n i++;\n } else {\n for (const fn of afterCommit[i + 2] as AfterCommitHook[]) {\n hookNames.push(fn.name);\n }\n i += 3;\n }\n }\n return hookNames;\n };\n\n await _runAfterCommitHooks(\n result,\n promises,\n getHookNames,\n catchAfterCommitErrors,\n );\n }\n });\n};\n\nconst runQueryHandlePool = async <Result extends QueryResult = QueryResult>(\n pool: Pool,\n driverAdapter: DriverAdapter,\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n sqlSessionState?: SqlSessionState,\n arraysMode?: boolean,\n client?: Client,\n): Promise<Result> => {\n const setup = sqlSessionContextComputeSetup(sqlSessionState);\n\n if (client || (!driverAdapter.manualPool && !setup)) {\n return runQueryHandleSetupAndCleanup<Result>(\n driverAdapter,\n client || pool,\n text,\n values,\n setup,\n arraysMode,\n );\n }\n\n client = await driverAdapter.borrow(pool);\n\n try {\n return await runQueryHandleSetupAndCleanup<Result>(\n driverAdapter,\n client,\n text,\n values,\n setup,\n arraysMode,\n );\n } finally {\n driverAdapter.release(client);\n }\n};\n\nconst runQueryHandleSetupAndCleanup = <\n Result extends QueryResult = QueryResult,\n>(\n driverAdapter: DriverAdapter,\n client: Client,\n text: string,\n values?: unknown[],\n setup?: SqlSessionContextSetupResult,\n arraysMode?: boolean,\n): Promise<Result> => {\n const mainQuery = () =>\n driverAdapter.queryClient(client, text, values, arraysMode);\n\n if (setup) {\n return sqlSessionContextExecute<Result>(\n (text, values) => driverAdapter.queryClient(client, text, values, true),\n setup,\n mainQuery as () => Promise<Result>,\n );\n }\n\n return mainQuery() as Promise<Result>;\n};\n\ninterface AdapterConnectionState {\n /**\n * Original config copy used for runtime metadata derivation and clone.\n */\n originalConfig: AdapterConfigBase;\n /**\n * Full connection URL when adapter config includes it.\n */\n databaseURL?: string;\n /**\n * Normalized database name derived from URL or direct config.\n */\n database?: string;\n /**\n * Normalized user name derived from URL or direct config.\n */\n user?: string;\n /**\n * Normalized password value derived from URL or direct config.\n */\n password?: string | (() => string | Promise<string>);\n /**\n * Normalized search_path derived from URL or direct config.\n */\n searchPath?: string;\n /**\n * Normalized host derived from URL or direct config.\n */\n host?: string;\n /**\n * Schema metadata from config or adapter instance.\n */\n schema?: QuerySchema;\n}\n\nconst createAdapterConnectionState = (\n config: AdapterConfigBase,\n): AdapterConnectionState => {\n const state: AdapterConnectionState = {\n originalConfig: { ...config },\n };\n\n const url = config.databaseURL ? new URL(config.databaseURL) : undefined;\n if (url) {\n state.databaseURL = url.toString();\n state.database = url.pathname.slice(1);\n state.user = url.username;\n state.password = url.password;\n state.searchPath = url.searchParams.get('searchPath') ?? config.searchPath;\n state.host = url.hostname;\n } else {\n state.database = config.database;\n state.user = config.user;\n state.password = config.password;\n state.searchPath = config.searchPath;\n state.host = config.host;\n }\n\n state.schema = config.schema;\n\n return state;\n};\n\nconst cloneAdapterConfig = (\n config: AdapterConfigBase,\n params?: AdapterConfigBase,\n): AdapterConfigBase => {\n if (!params) {\n return { ...config };\n }\n\n const clonedConfig = { ...config };\n\n if ('databaseURL' in params) {\n clonedConfig.databaseURL = params.databaseURL;\n }\n\n const url = clonedConfig.databaseURL\n ? new URL(clonedConfig.databaseURL)\n : undefined;\n if (url) {\n if ('database' in params) {\n url.pathname = `/${params.database ?? ''}`;\n }\n\n if ('user' in params) {\n url.username = params.user ?? '';\n }\n\n if ('password' in params && typeof params.password !== 'function') {\n url.password = params.password ?? '';\n }\n\n if ('searchPath' in params) {\n if (params.searchPath === undefined) {\n url.searchParams.delete('searchPath');\n } else {\n url.searchParams.set('searchPath', params.searchPath);\n }\n clonedConfig.searchPath = params.searchPath;\n }\n\n clonedConfig.databaseURL = url.toString();\n } else {\n if ('database' in params) {\n clonedConfig.database = params.database;\n }\n\n if ('user' in params) {\n clonedConfig.user = params.user;\n }\n\n if ('password' in params) {\n clonedConfig.password = params.password;\n }\n\n if ('searchPath' in params) {\n clonedConfig.searchPath = params.searchPath;\n }\n }\n\n if ('connectRetry' in params) {\n clonedConfig.connectRetry = params.connectRetry;\n }\n\n return clonedConfig;\n};\n\nconst createDriverAdapterConfig = (\n config: AdapterConfigBase,\n state: AdapterConnectionState,\n): AdapterConfigBase => {\n const setConfig: RecordString = config.setConfig\n ? { ...config.setConfig }\n : {};\n delete setConfig.search_path;\n if (state.searchPath && state.searchPath !== 'public') {\n setConfig.search_path = state.searchPath;\n }\n\n const driverConfig: AdapterConfigBase = {\n ...config,\n searchPath: state.searchPath,\n setConfig,\n };\n\n if (driverConfig.databaseURL) {\n const url = new URL(driverConfig.databaseURL);\n url.searchParams.delete('searchPath');\n\n const ssl = url.searchParams.get('ssl');\n if (ssl === 'false') {\n driverConfig.ssl = false;\n url.searchParams.delete('ssl');\n } else if (ssl === 'true') {\n driverConfig.ssl = true;\n url.searchParams.delete('ssl');\n }\n\n driverConfig.databaseURL = url.toString();\n }\n\n return driverConfig;\n};\n\n/**\n * Element of `afterCommit` transaction array. See {@link AsyncState.afterCommit}.\n */\nexport type TransactionAfterCommitHook =\n | unknown[]\n | Query\n | AfterCommitHook[]\n | AfterCommitStandaloneHook;\n\n// Function to call after transaction commit.\nexport interface AfterCommitHook {\n (data: unknown[], q: Query): unknown | Promise<unknown>;\n}\n\nexport interface AfterCommitStandaloneHook {\n (): unknown | Promise<unknown>;\n}\n\nexport const makeConnectRetryConfig = (\n config: AdapterConfigConnectRetryParam,\n): AdapterConfigConnectRetry => {\n return {\n attempts: config.attempts ?? 10,\n strategy:\n typeof config.strategy === 'function'\n ? config.strategy\n : defaultConnectRetryStrategy(config.strategy ?? emptyObject),\n };\n};\n\nexport const wrapAdapterFnWithConnectRetry = <\n // oxlint-disable-next-line typescript/no-explicit-any\n Fn extends (...args: any[]) => any,\n>(\n connectRetryConfig: AdapterConfigConnectRetry,\n fn: Fn,\n): Fn => {\n return async function (this: unknown, ...args: unknown[]) {\n let attempt = 1;\n for (;;) {\n try {\n return await fn.call(this as never, ...args);\n } catch (err) {\n if (\n !err ||\n typeof err !== 'object' ||\n (err as { code: string }).code !== 'ECONNREFUSED' ||\n attempt >= connectRetryConfig.attempts\n ) {\n throw err;\n }\n\n await connectRetryConfig.strategy(attempt, connectRetryConfig.attempts);\n attempt++;\n }\n }\n } as Fn;\n};\n\nconst defaultConnectRetryStrategy = (\n param: AdapterConfigConnectRetryStrategyParam,\n): AdapterConfigConnectRetryStrategy => {\n return (attempt) =>\n setTimeout((param.factor ?? 1.5) ** (attempt - 1) * (param.delay ?? 50));\n};\n\nexport const getDriverErrorCode = (err: object) =>\n 'errno' in err ? err.errno : (err as { code?: string }).code;\n","import { OrchidOrmInternalError } from '../errors';\nimport { Query } from '../query';\nimport { ColumnsShape } from '../../columns';\n\nexport const getPrimaryKeys = (q: Query) => {\n return (q.internal.primaryKeys ??= collectPrimaryKeys(q));\n};\n\nexport const requirePrimaryKeys = (q: Query, message: string) => {\n const primaryKeys = getPrimaryKeys(q);\n if (!primaryKeys.length) {\n throw new OrchidOrmInternalError(q, message);\n }\n return primaryKeys;\n};\n\nconst collectPrimaryKeys = (q: Query): string[] => {\n const primaryKeys = [];\n const { shape } = q;\n for (const key in shape) {\n if ((shape as ColumnsShape)[key].data.primaryKey) {\n primaryKeys.push(key);\n }\n }\n\n const pkey = q.internal.tableData.primaryKey;\n if (pkey) {\n primaryKeys.push(...pkey.columns);\n }\n\n return primaryKeys;\n};\n","import { QueryHasWhere, Where } from '../../basic-features/where/where';\nimport { Query, SelectableFromShape } from '../../query';\nimport { Column } from '../../../columns/column';\nimport {\n PickQueryScopes,\n PickQuerySelectableShapeRelationsWithData,\n} from '../../pick-query-types';\nimport { setObjectValueImmutable } from '../../../utils';\nimport { _clone } from '../../basic-features/clone/clone';\nimport { QueryDataScopes } from '../../query-data';\n\n// Scopes data stored in table instance. Doesn't change after defining a table.\nexport type QueryScopes<Keys extends string> = {\n [K in Keys]: unknown;\n};\n\nexport interface ScopeArgumentQuery<\n Table extends string | undefined,\n Shape extends Column.QueryColumns,\n>\n extends Where, PickQuerySelectableShapeRelationsWithData {\n __isQuery: true;\n table: Table;\n shape: Shape;\n __selectable: SelectableFromShape<Shape, Table>;\n}\n\nexport const _unscope = (q: Query, scope: PropertyKey): Query => {\n if (q.q.scopes) {\n q.q.scopes = { ...q.q.scopes };\n delete q.q.scopes[scope as string];\n for (const _ in q.q.scopes) {\n return q as never;\n }\n delete q.q.scopes;\n }\n\n return q as never;\n};\n\n/**\n * This feature allows defining a set of query modifiers to use it later.\n * Only [where conditions](/guide/where.html) can be set in a scope.\n * If you define a scope with name `default`, it will be applied for all table queries by default.\n *\n * ```ts\n * import { defineTable } from './table-factory';\n *\n * export const SomeTable = defineTable('some', (t) => ({\n * id: t.identity().primaryKey(),\n * hidden: t.boolean(),\n * active: t.boolean(),\n * })).scopes({\n * default: (q) => q.where({ hidden: false }),\n * active: (q) => q.where({ active: true }),\n * });\n *\n * const db = orchidORM(\n * { databaseURL: '...' },\n * {\n * some: SomeTable,\n * },\n * );\n *\n * // the default scope is applied for all queries:\n * const nonHiddenRecords = await db.some;\n * ```\n */\nexport class QueryScope {\n /**\n * See {@link QueryScope}\n *\n * Use the `scope` method to apply a pre-defined scope.\n *\n * ```ts\n * // use the `active` scope that is defined in the table:\n * await db.some.scope('active');\n * ```\n *\n * @param scope - name of the scope to apply\n */\n scope<T extends PickQueryScopes>(\n this: T,\n scope: keyof T['__scopes'],\n ): T & QueryHasWhere {\n const q = _clone(this);\n\n if (!q.q.scopes?.[scope as string]) {\n const s = (q.internal.scopes as QueryDataScopes)[scope as string];\n\n if (!s) throw new Error(`Scope ${scope as string} is not defined`);\n\n setObjectValueImmutable(q.q, 'scopes', scope, s);\n }\n\n return q as never;\n }\n\n /**\n * See {@link QueryScope}\n *\n * Remove conditions that were added by the scope from the query.\n *\n * ```ts\n * // SomeTable has a default scope, ignore it for this query:\n * await db.some.unscope('default');\n * ```\n *\n * @param scope - name of the scope to remove from the query\n */\n unscope<T extends PickQueryScopes>(this: T, scope: keyof T['__scopes']): T {\n return _unscope(_clone(this), scope) as never;\n }\n}\n","import { Query } from '../../query';\nimport {\n MutativeQueriesSelectRelationsSqlProp,\n MutativeQueriesSelectRelationsSqlState,\n MutativeQueriesSelectRelationsValue,\n} from './mutative-queries-select-relations.sql';\nimport { requirePrimaryKeys } from '../../query-columns/primary-keys';\nimport { _unscope } from '../../extra-features/scope/scope';\nimport { getFreeAlias, RecordString, RecordUnknown } from '../../../utils';\nimport {\n SelectAsValue,\n SelectItem,\n} from '../../basic-features/select/select.sql';\nimport { maybeWrappedThen, ThenSavepointState } from '../../then/then';\n\nexport const checkIfNeedResultAllForMutativeQueriesSelectRelations = (\n sql: MutativeQueriesSelectRelationsSqlProp,\n): MutativeQueriesSelectRelationsValue | undefined => {\n return sql.mutativeQueriesSelectRelationsState?.value;\n};\n\nexport const checkIfShouldReleaseSavepointForMutativeQueriesSelectRelations = (\n sql: MutativeQueriesSelectRelationsSqlProp,\n): MutativeQueriesSelectRelationsValue | undefined => {\n return sql.mutativeQueriesSelectRelationsState?.value;\n};\n\nexport const loadMutativeQueriesSelectRelations = (\n sql: MutativeQueriesSelectRelationsSqlProp,\n result: unknown,\n savepointState?: ThenSavepointState,\n renames?: RecordString,\n): Promise<void> | undefined =>\n sql.mutativeQueriesSelectRelationsState?.value\n ? loadRelations(\n sql.mutativeQueriesSelectRelationsState,\n result,\n savepointState,\n renames,\n )\n : undefined;\n\nexport const loadRelations = async (\n state: MutativeQueriesSelectRelationsSqlState,\n result: unknown,\n savepointState?: ThenSavepointState,\n renames?: RecordString,\n): Promise<void> => {\n const q = state.query as Query;\n\n const primaryKeys = requirePrimaryKeys(\n q,\n 'Cannot select a relation of a table that has no primary keys',\n );\n const selectQuery = _unscope(q, 'nonDeleted');\n // after cloning the mutating query:\n // type = undefined makes it a select query\n selectQuery.q.type = undefined;\n // returnType = undefined: need to select full objects for this relations loading logic to work,\n // will be transformed to what user requested later.\n selectQuery.q.returnType = undefined;\n // the original query can contain mutative withs, need to strip them all for selecting\n selectQuery.q.with = undefined;\n selectQuery.q.appendQueries = undefined;\n selectQuery.q.valuesJoinedAs = undefined;\n\n const matchSourceTableIds: RecordUnknown = {};\n for (const pkey of primaryKeys) {\n matchSourceTableIds[pkey] = {\n in: (result as RecordUnknown[]).map((row) => row[pkey]),\n };\n }\n (selectQuery.q.and ??= []).push(matchSourceTableIds);\n\n const relationsSelect = state.value as Record<string, Query>;\n\n const selectAs: SelectAsValue = { ...relationsSelect };\n\n const select: SelectItem[] = [{ selectAs }];\n\n const relationKeyAliases = primaryKeys.map((key) => {\n if (key in selectAs) {\n const as = getFreeAlias(selectAs, key);\n selectAs[as] = key;\n return as;\n } else {\n select.push(key);\n return key;\n }\n });\n\n selectQuery.q.select = select;\n\n const relationsResult = (await maybeWrappedThen.call(\n selectQuery,\n undefined,\n async (err) => {\n await savepointState?.activeSavepoint?.rollback(err);\n throw err;\n },\n savepointState,\n )) as RecordUnknown[];\n\n for (const row of result as RecordUnknown[]) {\n const relationRow = relationsResult.find((relationRow) => {\n return !primaryKeys.some(\n (key, i) => relationRow[relationKeyAliases[i]] !== row[key],\n );\n });\n if (relationRow) {\n Object.assign(row, relationRow);\n }\n }\n\n // when relation is loaded under the same key as a transient primary key:\n // no need to rename it because the relation was already loaded under the key name.\n if (renames) {\n for (const key in relationsSelect) {\n if (key in renames) {\n delete renames[key];\n }\n }\n }\n};\n","import { Query, QueryReturnType } from '../query';\nimport {\n _runAfterCommitHooks,\n AsyncTransactionState,\n isInUserTransaction,\n} from '../basic-features/transaction/transaction';\nimport { processComputedResult } from '../extra-features/computed/computed';\nimport { Column, ColumnsShape } from '../../columns';\nimport { HookPurpose } from '../extra-features/hooks/hooks.sql';\nimport {\n Adapter,\n AfterCommitHook,\n getDriverErrorCode,\n HackySavepointState,\n QueryResult,\n SqlSessionState,\n TransactionAdapter,\n} from '../../adapters/adapter';\nimport { sqlSessionContextGetStateFromAsyncState } from '../../adapters/features/sql-session-context';\nimport {\n callWithThis,\n commitSql,\n emptyArray,\n MaybePromise,\n RecordString,\n RecordUnknown,\n ShallowSimplify,\n} from '../../utils';\nimport {\n ColumnParser,\n ColumnsParsers,\n getQueryParsers,\n getValueParser,\n} from '../query-columns/query-column-parsers';\nimport { _clone } from '../basic-features/clone/clone';\nimport { NotFoundError, QueryError } from '../errors';\nimport { SingleSql, SingleSqlItem, Sql } from '../sql/sql';\nimport { applyTransforms } from '../extra-features/data-transform/transform';\nimport { HandleResult, QueryAfterHook, QueryBeforeHook } from '../query-data';\nimport { PickQueryReturnType } from '../pick-query-types';\nimport {\n AsyncState,\n setCurrentDefaultSchema,\n} from '../basic-features/storage/storage';\nimport {\n checkIfNeedResultAllForMutativeQueriesSelectRelations,\n checkIfShouldReleaseSavepointForMutativeQueriesSelectRelations,\n loadMutativeQueriesSelectRelations,\n} from '../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.result-handler';\n\n// This is a standard Promise['then'] method\n// copied from TS standard library because the original `then` is not decoupled from the Promise\nexport interface QueryThen<T> {\n <TResult1 = T, TResult2 = never>(\n onfulfilled?: (value: T) => TResult1 | PromiseLike<TResult1>,\n // oxlint-disable-next-line typescript/no-explicit-any\n onrejected?: (reason: any) => TResult2 | PromiseLike<TResult2>,\n ): Promise<TResult1 | TResult2>;\n} // This is a standard Promise['catch'] method\n\nexport type QueryThenShallowSimplify<T> = QueryThen<ShallowSimplify<T>>;\n\nexport type QueryThenShallowSimplifyArr<T> = QueryThen<ShallowSimplify<T>[]>;\n\nexport type QueryThenShallowSimplifyOptional<T> = QueryThen<\n ShallowSimplify<T> | undefined\n>;\n\nexport type QueryThenByQuery<\n T extends PickQueryReturnType,\n Result extends Column.QueryColumns,\n> = T['returnType'] extends undefined | 'all'\n ? QueryThenShallowSimplifyArr<ColumnsShape.Output<Result>>\n : T['returnType'] extends 'one'\n ? QueryThenShallowSimplifyOptional<ColumnsShape.Output<Result>>\n : T['returnType'] extends 'oneOrThrow'\n ? QueryThenShallowSimplify<ColumnsShape.Output<Result>>\n : T['returnType'] extends 'value'\n ? QueryThen<Result['value']['__outputType'] | undefined>\n : T['returnType'] extends 'valueOrThrow'\n ? QueryThen<Result['value']['__outputType']>\n : T['returnType'] extends 'rows'\n ? QueryThen<ColumnsShape.Output<Result>[keyof Result][][]>\n : T['returnType'] extends 'pluck'\n ? QueryThen<Result['pluck']['__outputType'][]>\n : QueryThen<void>;\n\nexport type QueryThenByReturnType<\n T extends QueryReturnType,\n Result extends Column.QueryColumns,\n> = T extends undefined | 'all'\n ? QueryThenShallowSimplifyArr<ColumnsShape.Output<Result>>\n : T extends 'one'\n ? QueryThenShallowSimplifyOptional<ColumnsShape.Output<Result>>\n : T extends 'oneOrThrow'\n ? QueryThenShallowSimplify<ColumnsShape.Output<Result>>\n : T extends 'value'\n ? QueryThen<Result['value']['__outputType'] | undefined>\n : T extends 'valueOrThrow'\n ? QueryThen<Result['value']['__outputType']>\n : T extends 'rows'\n ? QueryThen<ColumnsShape.Output<Result>[keyof Result][][]>\n : T extends 'pluck'\n ? QueryThen<Result['pluck']['__outputType'][]>\n : QueryThen<void>;\n\n// copied from TS standard library because the original `catch` is not decoupled from the Promise\nexport interface QueryCatch {\n <Q, TResult = never>(\n // oxlint-disable-next-line typescript/no-explicit-any\n this: { then: (onfulfilled?: (value: Q) => any) => any },\n // oxlint-disable-next-line typescript/no-explicit-any\n onrejected?: (reason: any) => TResult | PromiseLike<TResult>,\n ): Promise<Q | TResult>;\n}\n\nexport const queryMethodByReturnType: {\n [K in string]: 'query' | 'arrays';\n} = {\n undefined: 'query',\n all: 'query',\n rows: 'arrays',\n pluck: 'arrays',\n one: 'query',\n oneOrThrow: 'query',\n value: 'arrays',\n valueOrThrow: 'arrays',\n void: 'arrays',\n};\n\ntype Resolve = // oxlint-disable-next-line typescript/no-explicit-any\n (result: any) => any;\ntype Reject = // oxlint-disable-next-line typescript/no-explicit-any\n (error: any) => any;\n\nexport interface QueryCatchers {\n catchUniqueError<ThenResult, CatchResult>(\n // oxlint-disable-next-line typescript/no-explicit-any\n this: { then: (onfulfilled?: (value: ThenResult) => any) => any },\n fn: (reason: QueryError) => CatchResult,\n ): Promise<ThenResult | CatchResult>;\n}\n\nexport class Then implements QueryCatchers {\n catch(\n this: Query,\n // oxlint-disable-next-line typescript/no-explicit-any\n fn: (reason: any) => unknown,\n ) {\n const q = _clone(this as unknown as Query);\n q.q.catch = true;\n return q.then(undefined, fn);\n }\n\n catchUniqueError(fn: (reason: QueryError) => unknown) {\n const q = _clone(this as unknown as Query);\n q.q.catch = true;\n return q.then(undefined, (err) => {\n if (err instanceof QueryError && err.isUnique) {\n return fn(err);\n } else {\n throw err;\n }\n }) as never;\n }\n}\n\n// For storing error with the stacktrace leading to the code which calls `await query`,\n// using it later when catching query error.\nlet queryError: Error = undefined as unknown as Error;\n\n// `query.then` getter: it must be a getter to store the error with stacktrace prior to executing `await`.\nexport const getThen = function (): (\n this: Query,\n resolve?: Resolve,\n reject?: Reject,\n) => Promise<unknown> {\n queryError = new Error();\n return maybeWrappedThen;\n};\n\nObject.defineProperty(Then.prototype, 'then', {\n configurable: true,\n get: getThen,\n set(value) {\n Object.defineProperty(this, 'then', {\n value,\n });\n },\n});\n\nexport function maybeWrappedThen(\n this: Query,\n resolve?: Resolve,\n reject?: Reject,\n parentSavepoint?: ThenSavepointState,\n): Promise<unknown> {\n const { q } = this;\n\n const shouldCatch = q.catch;\n\n let beforeActionHooks: QueryBeforeHook[] | undefined;\n let afterHooks: QueryAfterHook[] | undefined;\n let afterSaveHooks: QueryAfterHook[] | undefined;\n let afterCommitHooks: QueryAfterHook[] | undefined;\n let afterSaveCommitHooks: QueryAfterHook[] | undefined;\n if (q.type) {\n if (q.type === 'insert') {\n beforeActionHooks = q.beforeCreate;\n afterHooks = q.afterCreate;\n afterSaveHooks = q.afterSave;\n afterCommitHooks = q.afterCreateCommit;\n afterSaveCommitHooks = q.afterSaveCommit;\n } else if (q.type === 'update') {\n beforeActionHooks = q.beforeUpdate;\n afterHooks = q.afterUpdate;\n afterSaveHooks = q.afterSave;\n afterCommitHooks = q.afterUpdateCommit;\n afterSaveCommitHooks = q.afterSaveCommit;\n } else if (q.type === 'upsert') {\n if (q.upsertSecond) {\n beforeActionHooks = q.beforeCreate;\n } else if (q.upsertUpdate && q.updateData) {\n beforeActionHooks = q.beforeUpdate;\n afterHooks = q.afterUpdate;\n afterSaveHooks = q.afterSave;\n afterCommitHooks = q.afterUpdateCommit;\n afterSaveCommitHooks = q.afterSaveCommit;\n }\n } else if (q.type === 'delete') {\n beforeActionHooks = q.beforeDelete;\n afterHooks = q.afterDelete;\n afterCommitHooks = q.afterDeleteCommit;\n }\n }\n\n const { before } = q;\n const beforeHooks =\n before && beforeActionHooks\n ? [...before, ...beforeActionHooks]\n : before\n ? before\n : beforeActionHooks;\n\n const state = this.internal.asyncStorage.getStore();\n if (\n (q.wrapInTransaction || (q.selectRelation && q.type) || afterHooks) &&\n !state?.transactionAdapter\n ) {\n return this.transaction(\n () =>\n new Promise((resolve, reject) => {\n const state =\n this.internal.asyncStorage.getStore() as AsyncTransactionState;\n return then(\n this,\n state.transactionAdapter,\n state,\n beforeHooks,\n afterHooks,\n afterSaveHooks,\n afterCommitHooks,\n afterSaveCommitHooks,\n resolve,\n reject,\n shouldCatch,\n parentSavepoint,\n );\n }),\n ).then(resolve, reject);\n } else {\n return then(\n this,\n state?.transactionAdapter || this.q.adapter,\n state,\n beforeHooks,\n afterHooks,\n afterSaveHooks,\n afterCommitHooks,\n afterSaveCommitHooks,\n resolve,\n reject,\n shouldCatch,\n parentSavepoint,\n );\n }\n}\n\nconst queriesNames: RecordString = {};\nlet nameI = 0;\n\nconst callAfterHook = function (\n this: [result: unknown[], q: Query],\n cb: QueryAfterHook,\n): Promise<unknown> | unknown {\n return cb(this[0], this[1]);\n};\n\nconst beginSql: SingleSqlItem = { text: 'BEGIN' };\n\nconst then = async (\n q: Query,\n adapter: Adapter,\n state?: AsyncState,\n beforeHooks?: QueryBeforeHook[],\n afterHooks?: QueryAfterHook[],\n afterSaveHooks?: QueryAfterHook[],\n afterCommitHooks?: QueryAfterHook[],\n afterSaveCommitHooks?: QueryAfterHook[],\n resolve?: // oxlint-disable-next-line typescript/no-explicit-any\n (result: any) => any,\n reject?: // oxlint-disable-next-line typescript/no-explicit-any\n (error: any) => any,\n shouldCatch?: boolean,\n parentSavepoint?: ThenSavepointState,\n): Promise<unknown> => {\n const { q: query } = q;\n\n let sql: (Sql & { name?: string }) | undefined;\n let logData: unknown | undefined;\n const log = state?.log ?? query.log;\n setCurrentDefaultSchema(state?.schema);\n\n // save error to a local variable before async operations\n const localError = queryError;\n\n try {\n if (beforeHooks) {\n await Promise.all(beforeHooks.map(callWithThis, q));\n }\n\n const localSql = (sql = q.toSQL(true));\n\n if (q.q.dynamicBefore) {\n let promises: Promise<unknown>[] | undefined;\n\n for (const data of q.q.dynamicBefore) {\n if (data.before) {\n for (const before of data.before) {\n const promise = before(q);\n if (promise) (promises ??= []).push(promise);\n }\n }\n }\n\n if (promises) await Promise.all(promises);\n }\n\n const { tableHook, cteHooks } = sql;\n const { returnType = 'all' } = query;\n const tempReturnType =\n tableHook?.select ||\n cteHooks?.hasSelect ||\n q.q.batchParsers ||\n adapter.driverAdapter.noFieldsForArrays ||\n checkIfNeedResultAllForMutativeQueriesSelectRelations(sql)\n ? 'all'\n : returnType;\n\n let result: unknown;\n let queryResult: QueryResult;\n let cteData: Record<string, unknown[]> | undefined;\n\n const startingSavepoint = setCatchingSavepoint(\n !parentSavepoint && shouldCatch && state,\n );\n\n const releasingSavepoint =\n checkIfShouldReleaseSavepointForMutativeQueriesSelectRelations(sql) ||\n parentSavepoint\n ? undefined\n : parentSavepoint || startingSavepoint;\n\n if ('text' in sql) {\n if (query.autoPreparedStatements) {\n sql.name =\n queriesNames[sql.text] ||\n (queriesNames[sql.text] = (nameI++).toString(36));\n }\n\n if (log) {\n logData = log.beforeQuery(sql);\n }\n\n const method = queryMethodByReturnType[tempReturnType];\n queryResult = await execQuery(\n adapter,\n method,\n sql,\n startingSavepoint,\n releasingSavepoint,\n sqlSessionContextGetStateFromAsyncState(state),\n );\n const { runAfterQuery } = sql;\n\n if (log) {\n log.afterQuery(sql, logData);\n // set sql to be undefined to prevent logging on error in case if afterHooks throws\n sql = undefined;\n }\n\n if (runAfterQuery) {\n const r = await runAfterQuery(queryResult);\n if (r) {\n return resolve ? resolve(r.result) : r.result;\n }\n }\n\n if (localSql.cteHooks?.hasSelect) {\n const lastRowI = queryResult.rows.length - 1;\n const lastFieldI = queryResult.fields.length - 1;\n\n const fieldName =\n method === 'query' ? queryResult.fields[lastFieldI].name : lastFieldI;\n cteData = queryResult.rows[lastRowI][fieldName];\n queryResult.fields.length = lastFieldI;\n queryResult.rowCount--;\n queryResult.rows.length = lastRowI;\n\n if (method === 'query') {\n for (const row of queryResult.rows) {\n delete row[fieldName];\n }\n } else {\n for (const row of queryResult.rows) {\n row.length = lastFieldI;\n }\n }\n }\n\n result = query.handleResult(q, tempReturnType, queryResult, localSql);\n } else {\n // autoPreparedStatements in batch doesn't seem to make sense\n\n const queryMethod = queryMethodByReturnType[tempReturnType] as 'query';\n\n const queryBatch = async (batch: SingleSql[]) => {\n const last = batch.length - 1;\n for (let i = 0; i <= last; i++) {\n sql = batch[i];\n\n if (log) {\n logData = log.beforeQuery(sql);\n }\n\n const result = await execQuery(\n adapter,\n queryMethod,\n sql,\n i === 0 ? startingSavepoint : undefined,\n i === last ? releasingSavepoint : undefined,\n sqlSessionContextGetStateFromAsyncState(state),\n );\n\n if (queryResult) {\n queryResult.rowCount += result.rowCount;\n queryResult.rows.push(...result.rows);\n } else {\n queryResult = result;\n }\n\n if (log) {\n log.afterQuery(sql, logData);\n }\n }\n\n // set sql to be undefined to prevent logging on error in case if afterHooks throws\n sql = undefined;\n };\n\n if (state) {\n await queryBatch(sql.batch);\n } else {\n const { batch } = sql;\n\n if (log) logData = log.beforeQuery(beginSql);\n await adapter.transaction(undefined, undefined, async () => {\n if (log) log.afterQuery(beginSql, logData);\n const res = await queryBatch(batch);\n if (log) logData = log.beforeQuery(commitSql);\n return res;\n });\n if (log) log.afterQuery(commitSql, logData);\n }\n\n // runAfterQuery is not called because it's only for upsert,\n // while this batch branch is for batch insert\n\n result = query.handleResult(q, tempReturnType, queryResult!, localSql);\n }\n\n // TODO: move computeds after parsing\n let tempColumns: Set<string> | undefined;\n let renames: RecordString | undefined;\n if (tableHook?.select) {\n for (const [\n column,\n { as, temp, notLoaded },\n ] of tableHook.select.entries()) {\n if (notLoaded) continue;\n\n if (as) {\n (renames ??= {})[column] = as;\n }\n\n if (temp) {\n (tempColumns ??= new Set())?.add(temp);\n }\n }\n\n if (renames) {\n for (const record of result as RecordUnknown[]) {\n for (const a in renames) {\n const value = record[renames[a]];\n record[renames[a]] = record[a];\n record[a] = value;\n }\n }\n }\n\n if (query.selectedComputeds) {\n const promise = processComputedResult(query, result);\n if (promise) await promise;\n }\n }\n\n let cteAfterHooks: (() => unknown)[] | undefined;\n let cteAfterCommitHooks: (() => unknown)[] | undefined;\n if (localSql.cteHooks) {\n // oxlint-disable-next-line typescript/no-explicit-any\n const addedAfterHooks = new Set<(data: unknown, query: any) => unknown>();\n const addedAfterCommitHooks = new Set<\n // oxlint-disable-next-line typescript/no-explicit-any\n (data: unknown, query: any) => unknown\n >();\n\n interface TableData {\n data: {\n [K in HookPurpose | 'Save']?: unknown[];\n };\n }\n\n const dataPerSubQuery = new Map<string, TableData>();\n\n for (const cteName in localSql.cteHooks.tableHooks) {\n const hook = localSql.cteHooks.tableHooks[cteName];\n\n const data = cteData?.[cteName];\n if (!data && hook.throwOnNotFound) {\n throw new NotFoundError(q, `Record for cte ${cteName} is not found`);\n }\n\n const purpose = hook.tableHook.hookPurpose as HookPurpose | undefined;\n if (!purpose) continue;\n\n let tableData = dataPerSubQuery.get(hook.table);\n if (!tableData) {\n tableData = { data: {} };\n dataPerSubQuery.set(hook.table, tableData);\n }\n\n if (data) {\n const existing = tableData.data[purpose];\n tableData.data[purpose] = existing ? [...existing, ...data] : data;\n\n if (purpose === 'Create' || purpose === 'Update') {\n tableData.data.Save = tableData.data.Save\n ? [...tableData.data.Save, ...data]\n : data;\n }\n\n let hasParsers: boolean | undefined;\n const parsers: ColumnsParsers = {};\n for (const key in hook.shape) {\n if ((hook.shape[key] as Column)._parse) {\n hasParsers = true;\n parsers[key] = (hook.shape[key] as Column)._parse;\n }\n }\n\n if (hasParsers) {\n for (const row of data) {\n parseRecord(parsers, row);\n }\n }\n }\n }\n\n for (const cteName in localSql.cteHooks.tableHooks) {\n const hook = localSql.cteHooks.tableHooks[cteName];\n const { tableHook } = hook;\n\n const purpose = tableHook.hookPurpose as HookPurpose | undefined;\n const tableData = dataPerSubQuery.get(hook.table);\n if (!purpose || !tableData) continue;\n\n for (const purpose of ['Create', 'Update', 'Delete', 'Save'] as const) {\n const data = tableData.data[purpose];\n if (!data) continue;\n\n const afterKey = `after${purpose}` as const;\n const after = tableHook[afterKey];\n if (after) {\n const arr = (cteAfterHooks ??= []);\n for (const fn of after) {\n const hookData = addedAfterHooks.has(fn);\n if (!hookData) {\n addedAfterHooks.add(fn);\n arr.push(() => fn(data, q));\n }\n }\n }\n\n const afterCommitKey = `after${purpose}Commit` as const;\n const afterCommit = tableHook[afterCommitKey];\n if (afterCommit) {\n const arr = (cteAfterCommitHooks ??= []);\n for (const fn of afterCommit) {\n const hookData = addedAfterCommitHooks.has(fn);\n if (!hookData) {\n addedAfterCommitHooks.add(fn);\n arr.push(() => fn(data, q));\n }\n }\n }\n }\n }\n }\n\n const queryAfter = query.after;\n const hasAfterHook =\n afterHooks ||\n afterSaveHooks ||\n afterCommitHooks ||\n afterSaveCommitHooks ||\n queryAfter ||\n cteAfterHooks ||\n cteAfterCommitHooks;\n if (hasAfterHook) {\n //\n if (!queryResult!.rowCount) {\n afterHooks =\n afterSaveHooks =\n afterCommitHooks =\n afterSaveCommitHooks =\n undefined;\n }\n\n if (afterHooks || afterSaveHooks || queryAfter || cteAfterHooks) {\n const args = [result, q];\n await Promise.all(\n [\n ...(afterHooks || emptyArray),\n ...(afterSaveHooks || emptyArray),\n ...(queryAfter || emptyArray),\n ...(cteAfterHooks || emptyArray),\n ].map(callAfterHook, args),\n );\n }\n\n // afterCommitHooks are executed later after transaction commit,\n // or, if we don't have transaction, they are executed intentionally after other after hooks\n if (afterCommitHooks || afterSaveCommitHooks || cteAfterCommitHooks) {\n const afterActionAndSaveCommit = (afterCommitHooks ||\n afterSaveCommitHooks) && [\n ...(afterCommitHooks || emptyArray),\n ...(afterSaveCommitHooks || emptyArray),\n ];\n\n if (isInUserTransaction(state)) {\n if (afterActionAndSaveCommit) {\n (state.afterCommit ??= []).push(\n result as unknown[],\n q,\n afterActionAndSaveCommit,\n );\n }\n\n if (cteAfterCommitHooks) {\n (state.afterCommit ??= []).push(\n result as unknown[],\n q,\n cteAfterCommitHooks,\n );\n }\n } else {\n // result can be transformed later, reference the current form to use it in hook.\n const localResult = result as unknown[];\n // to suppress throws of sync afterCommit hooks.\n queueMicrotask(async () => {\n const promises: (unknown | Promise<unknown>)[] = [];\n if (afterActionAndSaveCommit) {\n for (const fn of afterActionAndSaveCommit) {\n try {\n promises.push(\n (fn as unknown as AfterCommitHook)(localResult, q),\n );\n } catch (err) {\n promises.push(Promise.reject(err));\n }\n }\n }\n\n if (cteAfterCommitHooks) {\n for (const fn of cteAfterCommitHooks) {\n try {\n promises.push(fn());\n } catch (err) {\n promises.push(Promise.reject(err));\n }\n }\n }\n\n await _runAfterCommitHooks(\n localResult,\n promises,\n () =>\n [\n ...(afterCommitHooks || emptyArray),\n ...(cteAfterCommitHooks || emptyArray),\n ].map((h) => h.name),\n q.q.catchAfterCommitErrors,\n );\n });\n }\n }\n }\n\n const promise =\n loadMutativeQueriesSelectRelations(\n localSql,\n result,\n startingSavepoint,\n renames,\n ) ||\n /**\n * In case when we have MutativeQueriesSelectRelations, the first query does insert/update/delete,\n * it must not run batchParsers because it doesn't have the data yet.\n * The second query loads data and performs batchParsers.\n */\n //\n parseBatch(q, queryResult!);\n\n if (promise) {\n await promise;\n }\n\n // can be set by hooks or by computed columns\n if (tableHook?.select || tempReturnType !== returnType) {\n if (renames) {\n // to not mutate the original result because it's passed to hooks\n const renamedResult = Array.from({\n length: (result as RecordUnknown[]).length,\n });\n\n for (\n let i = 0, len = (result as RecordUnknown[]).length;\n i < len;\n ++i\n ) {\n const record = (result as RecordUnknown[])[i];\n const renamedRecord = (renamedResult[i] = { ...record });\n for (const a in renames) {\n // TODO: no need to assign if the one or another is in `tempColumns`\n renamedRecord[a] = record[renames[a]];\n renamedRecord[renames[a]] = record[a];\n }\n }\n\n result = renamedResult;\n }\n\n result = filterResult(\n q,\n returnType,\n //\n queryResult!,\n result,\n tempColumns,\n hasAfterHook,\n );\n }\n\n if (query.transform) {\n result = applyTransforms(query, returnType, query.transform, result);\n }\n\n return resolve ? resolve(result) : result;\n } catch (err) {\n let error;\n if (err instanceof adapter.errorClass) {\n // errno for Bun SQL, code for others\n const code = getDriverErrorCode(err);\n if (\n // a special not found error thrown by 'not-found'::int\n code === '22P02' &&\n err.message.endsWith(`\"not-found\"`)\n ) {\n error = new NotFoundError(q);\n } else {\n error = new (q.error as unknown as new () => QueryError)();\n adapter.assignError(error, err);\n }\n error.cause = localError;\n } else {\n error = err;\n if (error instanceof Error) {\n error.cause = localError;\n }\n }\n\n // shift stack by one to point to the calling code\n const stack = localError.stack;\n if (stack) {\n const from = stack.indexOf('\\n');\n if (from !== -1) {\n const to = stack.indexOf('\\n', from + 1);\n if (to !== -1) {\n localError.stack = stack.slice(0, from) + stack.slice(to);\n }\n }\n }\n\n if (log && sql) {\n log.onError(error as Error, sql as SingleSqlItem, logData);\n }\n\n if (reject) return reject(error);\n\n throw error;\n }\n};\n\nexport interface ThenSavepointState extends HackySavepointState {\n transactionAdapter: TransactionAdapter;\n}\n\nconst setCatchingSavepoint = (\n catchTrx: AsyncState | false | undefined,\n): ThenSavepointState | undefined => {\n return catchTrx && catchTrx.transactionAdapter\n ? {\n transactionAdapter: catchTrx.transactionAdapter,\n name: `s${(catchTrx.catchI = (catchTrx.catchI || 0) + 1)}`,\n }\n : undefined;\n};\n\n/**\n * Executes a query and in the case there are rows, but nothing was selected,\n * it populates the response with empty objects,\n * because user might expect empty objects to be returned for an empty select.\n */\nconst execQuery = (\n adapter: Adapter,\n method: 'query' | 'arrays',\n sql: SingleSql,\n startingSavepoint: ThenSavepointState | undefined,\n releasingSavepoint: ThenSavepointState | undefined,\n sqlSessionState: SqlSessionState | undefined,\n) => {\n let promise: Promise<QueryResult>;\n if (startingSavepoint) {\n if (releasingSavepoint) {\n promise = startingSavepoint.transactionAdapter.savepoint(\n startingSavepoint.name,\n () => {\n return (promise = adapter[method as 'query'](\n sql.text,\n sql.values,\n sqlSessionState,\n ));\n },\n );\n } else {\n promise = startingSavepoint.transactionAdapter.hackySavepoint(\n startingSavepoint,\n sql.text,\n sql.values,\n method === 'arrays',\n );\n }\n } else {\n promise = adapter[method as 'query'](sql.text, sql.values, sqlSessionState);\n }\n\n if (!startingSavepoint && releasingSavepoint) {\n promise = promise.then(async (res) => {\n await releasingSavepoint.activeSavepoint?.release();\n return res;\n });\n }\n\n return promise.then((result) => {\n if (result.rowCount && !result.rows.length) {\n result.rows.length = result.rowCount;\n result.rows.fill({});\n }\n\n return result;\n });\n};\n\nexport const handleResult: HandleResult = (\n q,\n returnType,\n result,\n sql,\n isSubQuery,\n) => {\n let parsers = getQueryParsers(q, sql.tableHook?.select);\n\n switch (returnType) {\n case 'all': {\n if (q.q.throwOnNotFound && result.rows.length === 0)\n throw new NotFoundError(q);\n\n const { rows } = result;\n\n if (q.q.returnType === 'value' || q.q.returnType === 'valueOrThrow') {\n if (!rows.length) {\n if (!q.q.select) {\n return rows;\n } else {\n if (q.q.returnType === 'valueOrThrow') {\n throw new NotFoundError(q);\n }\n return [{ value: q.q.notFoundDefault }];\n }\n }\n\n if (parsers) {\n const parser = getValueParser(parsers);\n if (parser) {\n const hookSelect = sql.tableHook?.select;\n for (const row of rows) {\n for (const key in row) {\n if (!hookSelect?.has(key)) {\n row[key] = parser(row[key]);\n }\n }\n }\n }\n }\n } else if (parsers) {\n for (const row of rows) {\n parseRecord(parsers, row);\n }\n }\n\n return rows;\n }\n case 'one': {\n const { rows } = result;\n if (!rows.length) return;\n\n if (parsers) parseRecord(parsers, rows[0]);\n\n return rows[0];\n }\n case 'oneOrThrow': {\n const { rows } = result;\n if (!rows.length) throw new NotFoundError(q);\n\n if (parsers) parseRecord(parsers, rows[0]);\n\n return rows[0];\n }\n case 'rows': {\n const { rows } = result;\n\n if (parsers) {\n parseRows(parsers, result.fields, rows);\n }\n\n return rows;\n }\n case 'pluck': {\n const { rows } = result;\n\n parsePluck(q, parsers, isSubQuery, rows);\n\n return rows;\n }\n case 'value': {\n const { rows } = result;\n\n return rows[0]?.[0] !== undefined\n ? parseValue(rows[0][0], parsers)\n : q.q.notFoundDefault;\n }\n case 'valueOrThrow': {\n if (q.q.returning) {\n if (q.q.throwOnNotFound && result.rowCount === 0) {\n throw new NotFoundError(q);\n }\n return result.rowCount;\n }\n\n const { rows } = result;\n\n if (rows[0]?.[0] === undefined) throw new NotFoundError(q);\n return parseValue(rows[0][0], parsers);\n }\n case 'void': {\n return;\n }\n }\n};\n\nconst parseBatch = (q: Query, queryResult: QueryResult): MaybePromise<void> => {\n let promises: Promise<void>[] | undefined;\n\n if (q.q.batchParsers) {\n for (const parser of q.q.batchParsers) {\n const res = parser.fn(parser.path, queryResult);\n if (res) (promises ??= []).push(res);\n }\n }\n\n return promises && (Promise.all(promises) as never);\n};\n\nexport const parseRecord = (\n parsers: ColumnsParsers, // oxlint-disable-next-line typescript/no-explicit-any\n row: any,\n): unknown => {\n for (const key in parsers) {\n if (key in row) {\n row[key] = (parsers[key] as ColumnParser)(row[key]);\n }\n }\n return row;\n};\n\nconst parseRows = (\n parsers: ColumnsParsers,\n fields: { name: string }[],\n rows: // oxlint-disable-next-line typescript/no-explicit-any\n any[],\n): void => {\n for (let i = fields.length - 1; i >= 0; i--) {\n const parser = parsers[fields[i].name];\n if (parser) {\n for (const row of rows) {\n row[i] = parser(row[i]);\n }\n }\n }\n};\n\nconst parsePluck = (\n query: Query,\n parsers: ColumnsParsers | undefined,\n isSubQuery: true | undefined,\n rows: unknown[],\n): void => {\n const valueToArray = (query.q.getColumn as Column.Pick.Data | undefined)?.data\n ?.valueToArray;\n\n const parse = parsers?.pluck;\n if (parse) {\n if (valueToArray) {\n for (let i = 0; i < rows.length; i++) {\n const value = (\n isSubQuery ? rows[i] : (rows[i] as RecordUnknown)[0]\n ) as unknown[];\n rows[i] =\n value === null\n ? undefined\n : value[0] === null\n ? null\n : parse(value[0]);\n }\n } else {\n for (let i = 0; i < rows.length; i++) {\n const value = isSubQuery ? rows[i] : (rows[i] as RecordUnknown)[0];\n rows[i] = value === null ? value : parse(value);\n }\n }\n } else if (valueToArray) {\n for (let i = 0; i < rows.length; i++) {\n const value = (\n isSubQuery ? rows[i] : (rows[i] as RecordUnknown)[0]\n ) as unknown[];\n rows[i] = value === null ? undefined : value[0];\n }\n } else if (!isSubQuery) {\n for (let i = 0; i < rows.length; i++) {\n rows[i] = (rows[i] as RecordUnknown)[0];\n }\n }\n};\n\nconst parseValue = (value: unknown, parsers?: ColumnsParsers): unknown => {\n const parse = getValueParser(parsers);\n return parse ? parse(value) : value;\n};\n\nexport const filterResult = (\n q: Query,\n returnType: QueryReturnType,\n queryResult: QueryResult,\n result: unknown,\n tempColumns: Set<string> | undefined,\n // result should not be mutated when having hooks, because hook may want to access the data later\n hasAfterHook?: unknown,\n): unknown => {\n if (returnType === 'all') {\n return filterAllResult(result, tempColumns, hasAfterHook);\n }\n\n if (returnType === 'oneOrThrow' || returnType === 'one') {\n let row = (result as RecordUnknown[])[0];\n if (!row) {\n if (returnType === 'oneOrThrow') throw new NotFoundError(q);\n return undefined;\n } else if (!tempColumns?.size) {\n return row;\n } else {\n if (hasAfterHook) row = { ...row };\n\n for (const column of tempColumns) {\n delete row[column];\n }\n\n return row;\n }\n }\n\n if (returnType === 'value') {\n return (result as RecordUnknown[])[0]?.[\n getFirstResultKey(q, queryResult) as string\n ];\n }\n\n if (returnType === 'valueOrThrow') {\n if (q.q.returning) {\n return queryResult.rowCount;\n }\n\n const row = (result as RecordUnknown[])[0];\n if (!row) throw new NotFoundError(q);\n\n return row[getFirstResultKey(q, queryResult) as string];\n }\n\n if (returnType === 'pluck') {\n const key = getFirstResultKey(q, queryResult) as string;\n return (result as RecordUnknown[]).map((row) => row[key]);\n }\n\n if (returnType === 'rows') {\n result = filterAllResult(result, tempColumns, hasAfterHook);\n return (result as RecordUnknown[]).map((record) => Object.values(record));\n }\n\n return;\n};\n\nconst getFirstResultKey = (\n q: Query,\n queryResult: QueryResult,\n): string | undefined => {\n if (q.q.select) {\n return queryResult.fields[0] ? queryResult.fields[0].name : 'value';\n } else {\n for (const key in q.q.selectedComputeds) {\n return key;\n }\n }\n return;\n};\n\nconst filterAllResult = (\n result: unknown,\n tempColumns: Set<string> | undefined,\n hasAfterHook: unknown,\n) => {\n if (tempColumns?.size) {\n if (hasAfterHook) {\n return (result as RecordUnknown[]).map((data) => {\n const record = { ...data };\n for (const key of tempColumns) {\n delete record[key];\n }\n return record;\n });\n } else {\n for (const record of result as RecordUnknown[]) {\n for (const key of tempColumns) {\n delete record[key];\n }\n }\n }\n }\n return result;\n};\n","import { Query, QueryReturnType } from '../../query';\nimport { extendQuery } from '../../query.utils';\nimport { RawSql } from '../../expressions/raw-sql';\nimport { NotFoundError } from '../../errors';\nimport { applyTransforms } from '../data-transform/transform';\nimport { pushQueryValueImmutable, QueryData } from '../../query-data';\n\nconst noneResult = (q: Query, queryData: QueryData, type: QueryReturnType) => {\n if (!type || type === 'all' || type === 'rows' || type === 'pluck') {\n return [];\n } else if (type === 'one' || type === 'value' || type === 'void') {\n return queryData.notFoundDefault;\n } else if (type === 'valueOrThrow' && queryData.returning) {\n return 0;\n } else {\n throw new NotFoundError(q);\n }\n};\n\n/**\n * Methods added to the query prototype when calling {@link QueryMethods.none}.\n */\nexport const noneMethods = {\n // `then` resolves or rejects based on a return type of the query.\n // It is `async` so it returns a chainable Promise.\n async then(\n this: Query,\n resolve?: (data?: unknown) => void,\n reject?: (err: unknown) => void,\n ) {\n try {\n let result = noneResult(this, this.q, this.q.returnType);\n\n if (this.q.transform) {\n result = applyTransforms(\n this.q,\n this.q.returnType,\n this.q.transform,\n result,\n );\n }\n\n return resolve?.(result);\n } catch (err) {\n return reject?.(err);\n }\n },\n catch(this: PromiseLike<unknown>, reject?: (err: unknown) => void) {\n return this.then(undefined, reject);\n },\n};\n\nexport const _queryNone = <T>(q: T): T => {\n if (isQueryNone(q)) return q;\n\n q = extendQuery(q as Query, noneMethods) as T;\n\n pushQueryValueImmutable(q as Query, 'and', new RawSql('false'));\n\n pushQueryValueImmutable(\n q as Query,\n 'transform',\n (_: unknown, queryData: QueryData) =>\n noneResult(q as Query, queryData, queryData.returnType),\n );\n\n return q;\n};\n\nexport const isQueryNone = (q: unknown) =>\n (q as Query).then === noneMethods.then;\n","import { pushQueryArrayImmutable } from '../../query.utils';\nimport {\n pushQueryValueImmutable,\n QueryBeforeHook,\n QueryData,\n} from '../../query-data';\nimport { ToSQLQuery } from '../../sql/to-sql';\nimport { setPrepareSubQueryForSql } from '../../../columns/operators';\nimport { setRawSqlPrepareSubQueryForSql } from '../../expressions/raw-sql';\nimport { PickQueryQ } from '../../pick-query-types';\n\nexport interface SubQueryForSql extends ToSQLQuery {\n __forSql: true;\n}\n\nexport interface HasBeforeAndBeforeSet {\n before?: QueryBeforeHook[];\n beforeSet?: QueryData['beforeSet'];\n}\n\nexport interface ArgWithBeforeAndBeforeSet {\n q: HasBeforeAndBeforeSet;\n}\n\nexport interface PrepareSubQueryForSqlArg extends PickQueryQ {\n dynamicBefore?: boolean;\n}\n\nexport interface PrepareSubQueryForSql {\n (\n mainQuery: ArgWithBeforeAndBeforeSet,\n subQuery: PrepareSubQueryForSqlArg,\n ): SubQueryForSql;\n}\n\nexport const prepareSubQueryForSql: PrepareSubQueryForSql = (\n mainQuery,\n subQuery,\n) => {\n // used in DynamicRawSql because it doesn't know what callbacks does it need before executing\n if (subQuery.dynamicBefore) {\n pushQueryValueImmutable(mainQuery as never, 'dynamicBefore', subQuery.q);\n return subQuery as never;\n }\n\n let beforeAction = subQuery.q.type\n ? subQuery.q.type === 'insert'\n ? subQuery.q.beforeCreate\n : subQuery.q.type === 'update'\n ? subQuery.q.beforeUpdate\n : subQuery.q.type === 'upsert'\n ? subQuery.q.upsertUpdate && subQuery.q.updateData\n ? subQuery.q.beforeUpdate && subQuery.q.beforeCreate\n ? [...subQuery.q.beforeUpdate, ...subQuery.q.beforeCreate]\n : subQuery.q.beforeUpdate || subQuery.q.beforeCreate\n : subQuery.q.beforeCreate\n : subQuery.q.type === 'delete'\n ? subQuery.q.beforeDelete\n : undefined\n : undefined;\n\n const { beforeSet } = subQuery.q;\n beforeAction =\n beforeAction && beforeSet\n ? [...beforeAction, ...beforeSet]\n : beforeSet\n ? [...beforeSet]\n : beforeAction;\n\n if (beforeAction) {\n const newSet = new Set(mainQuery.q.beforeSet);\n const filteredHooks = [];\n for (const hook of beforeAction) {\n if (!newSet.has(hook)) {\n newSet.add(hook);\n filteredHooks.push(hook);\n }\n }\n mainQuery.q.beforeSet = newSet;\n beforeAction = filteredHooks;\n\n if (beforeAction.length) {\n pushQueryArrayImmutable(\n mainQuery as PickQueryQ,\n 'before',\n beforeAction.map((fn) => () => fn(subQuery as never)),\n );\n }\n }\n\n return subQuery as never;\n};\n\nsetPrepareSubQueryForSql(prepareSubQueryForSql);\nsetRawSqlPrepareSubQueryForSql(prepareSubQueryForSql);\n","import { IsQuery, Query, SelectableFromShape } from '../../query';\nimport { sqlQueryArgsToExpression } from '../../expressions/raw-sql';\nimport { anyShape, Column, ColumnsShape } from '../../../columns';\nimport {\n prepareSubQueryForSql,\n SubQueryForSql,\n} from '../../internal-features/sub-query/sub-query-for-sql';\nimport {\n PickQueryAs,\n PickQueryHasSelect,\n PickQueryResultAs,\n PickQuerySelectableResultInputTypeAs,\n PickQueryQ,\n PickQueryReturnType,\n PickQuerySelectable,\n PickQueryShape,\n PickQueryWithData,\n} from '../../pick-query-types';\nimport { MaybeArray, UnionToIntersection } from '../../../utils';\nimport { getQueryAs, SetQueryTableAlias } from '../as/as';\nimport {\n ColumnsParsers,\n getQueryParsers,\n} from '../../query-columns/query-column-parsers';\nimport { isExpression } from '../../expressions/expression';\nimport { _clone } from '../clone/clone';\nimport { getShapeFromSelect } from '../select/select.utils';\nimport { WithDataItems } from '../cte/cte.sql';\nimport { SQLQueryArgs } from '../../db-sql-query';\nimport { JoinedParsers, WithConfig, WithConfigs } from '../../query-data';\nimport { QueryThenByQuery } from '../../then/then';\n\nexport interface FromQuerySelf\n extends\n PickQuerySelectable,\n PickQueryShape,\n PickQueryReturnType,\n PickQueryWithData,\n PickQueryAs,\n PickQueryHasSelect {}\n\nexport type FromArg<T extends FromQuerySelf> =\n | IsQuery\n | Exclude<keyof T['withData'], symbol | number>;\n\nexport type FromResult<\n T extends FromQuerySelf,\n Arg extends MaybeArray<FromArg<T>>,\n> = Arg extends string\n ? T['withData'] extends WithDataItems\n ? {\n [K in keyof T]: K extends '__selectable'\n ? SelectableFromShape<T['withData'][Arg]['shape'], Arg>\n : K extends 'result'\n ? T['withData'][Arg]['shape']\n : K extends 'then'\n ? QueryThenByQuery<T, T['withData'][Arg]['shape']>\n : T[K];\n }\n : SetQueryTableAlias<T, Arg>\n : Arg extends PickQuerySelectableResultInputTypeAs\n ? {\n [K in keyof T]: K extends '__defaultSelect'\n ? keyof Arg['result']\n : K extends '__selectable'\n ? SelectableFromShape<Arg['result'], Arg['__as']>\n : K extends '__as'\n ? Arg['__as']\n : K extends 'result'\n ? Arg['result']\n : K extends 'shape'\n ? Arg['result']\n : K extends '__inputType'\n ? Arg['__inputType']\n : K extends 'then'\n ? QueryThenByQuery<T, Arg['result']>\n : T[K];\n }\n : Arg extends (infer A)[]\n ? {\n [K in keyof T]: K extends '__selectable'\n ? UnionToIntersection<\n A extends string\n ? T['withData'] extends WithDataItems\n ? {\n [K in keyof T['withData'][A]['shape'] &\n string as `${A}.${K}`]: {\n as: K;\n column: T['withData'][A]['shape'][K];\n };\n }\n : never\n : A extends PickQueryResultAs\n ? {\n [K in keyof A['result'] &\n string as `${A['__as']}.${K}`]: K extends string\n ? {\n as: K;\n column: A['result'][K];\n }\n : never;\n }\n : never\n >\n : T[K];\n }\n : T;\n\nconst addWithParsers = (w: WithConfig, parsers: ColumnsParsers) => {\n for (const key in w.shape) {\n const { _parse } = w.shape[key] as Column;\n if (_parse) parsers[key] = _parse;\n }\n};\n\nexport function queryFrom<\n T extends FromQuerySelf,\n Arg extends MaybeArray<FromArg<T>>,\n>(self: T, arg: Arg): FromResult<T, Arg> {\n const data = (self as unknown as PickQueryQ).q;\n if (typeof arg === 'string') {\n data.as ||= arg;\n const w = data.withShapes?.[arg];\n data.selectShape = (w?.shape ?? anyShape) as ColumnsShape;\n data.runtimeComputeds = w?.computeds;\n\n const parsers: ColumnsParsers = {};\n data.defaultParsers = parsers;\n if (w) addWithParsers(w, parsers);\n\n const i = arg.indexOf('.');\n if (i !== -1) {\n data.schema = arg.slice(0, i);\n arg = arg.slice(i + 1) as Arg;\n } else if (w) {\n data.schema = undefined;\n }\n } else if (Array.isArray(arg)) {\n const shape = { ...data.selectShape };\n\n const joinedParsers: JoinedParsers = {};\n\n // TODO: batchParsers\n for (const item of arg) {\n if (typeof item === 'string') {\n const w = (data.withShapes as WithConfigs)[item];\n\n Object.assign(shape, w.shape);\n if (w.computeds)\n data.runtimeComputeds = { ...data.runtimeComputeds, ...w.computeds };\n\n const parsers: ColumnsParsers = {};\n joinedParsers[item] = parsers;\n addWithParsers(w, parsers);\n } else if (!isExpression(item)) {\n const sub = prepareSubQueryForSql(self as unknown as Query, item);\n Object.assign(shape, getShapeFromSelect(sub, true));\n\n const key = getQueryAs(sub);\n joinedParsers[key] = getQueryParsers(sub as unknown as Query);\n }\n }\n\n data.joinedParsers = joinedParsers;\n } else {\n const q = prepareSubQueryForSql(self as never, arg as never);\n data.as ||= q.q.as || q.table || 't';\n data.selectShape = getShapeFromSelect(q, true) as ColumnsShape;\n data.defaultParsers = getQueryParsers(q as unknown as Query);\n data.batchParsers = q.q.batchParsers;\n }\n\n data.from = arg as SubQueryForSql;\n data.selectAllColumns = data.scopes = undefined;\n\n return self as never;\n}\n\nexport function queryFromSql<T extends FromQuerySelf>(\n self: T,\n args: SQLQueryArgs,\n): T {\n const data = (self as unknown as PickQueryQ).q;\n data.as ||= 't';\n data.from = sqlQueryArgsToExpression(args);\n data.selectAllColumns = undefined;\n return self;\n}\n\nexport class FromMethods {\n /**\n * Set the `FROM` value, by default the table name is used.\n *\n * `from` determines a set of available tables and columns withing the query,\n * and thus it must not follow `select`, use `select` only after `from`.\n *\n * ```ts\n * // accepts sub-query:\n * db.table.from(db.otherTable.select('foo', 'bar'));\n *\n * // accepts alias of `WITH` expression:\n * q.with('withTable', db.table.select('id', 'name'))\n * .from('withTable')\n * // `select` is after `from`\n * .select('id', 'name');\n * ```\n *\n * `from` can accept multiple sources:\n *\n * ```ts\n * db.table\n * // add a `WITH` statement called `withTable\n * .with('withTable', db.table.select('one'))\n * // select from `withTable` and from `otherTable`\n * .from('withTable', db.otherTable.select('two'))\n * // source names and column names are properly typed when selecting\n * .select('withTable.one', 'otherTable.two');\n * ```\n *\n * @param arg - query or name of CTE table\n */\n from<T extends FromQuerySelf, Arg extends MaybeArray<FromArg<T>>>(\n this: T,\n arg: T['__hasSelect'] extends true\n ? '`select` must be placed after `from`'\n : Arg,\n ): FromResult<T, Arg> {\n return queryFrom(_clone(this), arg as never) as never;\n }\n\n /**\n * Set the `FROM` value with custom SQL:\n *\n * ```ts\n * const value = 123;\n * db.table.fromSql`value = ${value}`;\n * ```\n *\n * @param args - SQL expression\n */\n fromSql<T extends FromQuerySelf>(this: T, ...args: SQLQueryArgs): T {\n return queryFromSql(_clone(this), args as never) as never;\n }\n\n /**\n * Adds `ONLY` SQL keyword to the `FROM`.\n * When selecting from a parent table that has a table inheritance,\n * setting `only` will make it to select rows only from the parent table.\n *\n * ```ts\n * db.table.only();\n *\n * // disabling `only` after being enabled\n * db.table.only().only(false);\n * ```\n *\n * @param only - can be disabled by passing `false` if was enabled previously.\n */\n only<T>(this: T, only = true): T {\n const q = _clone(this);\n q.q.only = only;\n return q as T;\n }\n}\n","import { IsQuery, Query } from '../../query';\nimport { FromQuerySelf, queryFrom } from '../from/from';\nimport { _setQueryAs, SetQueryTableAlias } from '../as/as';\nimport { _clone } from '../clone/clone';\n\nexport type WrapQueryArg = FromQuerySelf;\n\nexport function queryWrap<\n T extends IsQuery,\n Q extends WrapQueryArg,\n As extends string = 't',\n>(self: T, query: Q, as: As = 't' as As): SetQueryTableAlias<Q, As> {\n return _setQueryAs(queryFrom(query, self) as never, as) as never;\n}\n\n/**\n * This function is useful when wrapping a query,\n * such as when doing `SELECT json_agg(t.*) FROM (...) AS t`,\n * to get rid of default scope conditions (WHERE deletedAt IS NULL)\n * that otherwise would be duplicated inside the `FROM` and after `AS t`.\n */\nexport function cloneQueryBaseUnscoped(query: Query) {\n const q = query.baseQuery.clone();\n q.q.or = q.q.and = q.q.scopes = undefined;\n return q;\n}\n\nexport class QueryWrap {\n wrap<T extends IsQuery, Q extends WrapQueryArg, As extends string = 't'>(\n this: T,\n query: Q,\n as?: As,\n ): SetQueryTableAlias<Q, As> {\n return queryWrap(this, _clone(query), as) as never;\n }\n}\n","import {\n PickQueryAs,\n PickQuerySelectable,\n PickQueryShape,\n PickQueryTable,\n PickQueryResult,\n PickQueryRelations,\n PickQueryReturnType,\n} from './pick-query-types';\nimport { RecordUnknown } from '../utils';\nimport { IsQuery, QueryManyTake, QueryManyTakeOptional } from './query';\n\nexport interface RelationJoinQuery {\n (joiningQuery: IsQuery, baseQuery: IsQuery): IsQuery;\n}\n\nexport interface RelationConfigQuery\n extends\n PickQueryResult,\n PickQuerySelectable,\n PickQueryShape,\n PickQueryTable,\n PickQueryAs,\n PickQueryRelations,\n PickQueryReturnType {}\n\nexport interface RelationConfigBase extends IsQuery {\n returnsOne: boolean;\n required?: unknown;\n query: RelationConfigQuery;\n joinQuery: RelationJoinQuery;\n reverseJoin: RelationJoinQuery;\n params: unknown;\n\n queryRelated(params: unknown): unknown;\n\n modifyRelatedQuery?(relatedQuery: IsQuery): (query: IsQuery) => void;\n\n // Omit `belongsTo` foreign keys to be able to create records\n // with `db.book.create({ authorId: 123 })`\n // or with `db.book.create({ author: authorData })`.\n // Other relation kinds have `omitForeignKeyInCreate: never`.\n omitForeignKeyInCreate: PropertyKey;\n dataForUpdate: unknown;\n dataForUpdateOne: unknown;\n primaryKeys: string[];\n}\n\nexport interface RelationConfigDataForCreate {\n columns: PropertyKey;\n nested: RecordUnknown;\n}\n\nexport interface RelationsBase {\n [relationName: string]: RelationConfigBase;\n}\n\nexport interface RelationsDataForCreateBase {\n [relationName: string]: unknown;\n}\n\nexport interface RelationsDataForCreateOptionalBase {\n [relationName: string]: unknown;\n}\n\nexport type RelationQueryMaybeSingle<T extends RelationConfigBase> =\n T['returnsOne'] extends true\n ? T['required'] extends true\n ? QueryManyTake<T['query']>\n : QueryManyTakeOptional<T['query']>\n : T['query'];\n\n/* getters */\n\nexport const isRelationQuery = (q: IsQuery): q is RelationConfigBase =>\n 'joinQuery' in q;\n","import {\n IsQuery,\n Query,\n QueryHasSelect,\n QueryOrExpressionBooleanOrNullResult,\n QueryTake,\n QueryTakeOptional,\n} from '../../query';\nimport {\n _queryTake,\n _queryTakeOptional,\n pushQueryArrayImmutable,\n} from '../../query.utils';\nimport {\n JoinArgs,\n JoinCallback,\n JoinCallbackArgs,\n JoinFirstArg,\n} from '../join/join';\nimport { sqlQueryArgsToExpression } from '../../expressions/raw-sql';\nimport { preprocessJoinArg, processJoinArgs } from '../join/process-join-args';\nimport { _queryNone } from '../../extra-features/none/none';\nimport { prepareSubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { prepareOpArg } from '../../../columns/operators';\nimport {\n PickQuerySelectableShapeRelationsWithDataAs,\n PickQueryQ,\n PickQueryRelations,\n PickQuerySelectableRelations,\n PickQuerySelectableRelationsResultReturnType,\n} from '../../pick-query-types';\nimport {\n EmptyObject,\n isIterable,\n MaybeArray,\n RecordUnknown,\n} from '../../../utils';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { _setSubQueryAliases } from '../as/as';\nimport { _clone } from '../clone/clone';\nimport { QueryExpressions } from '../../expressions/query-expressions';\nimport { resolveSubQueryCallback } from '../../internal-features/sub-query/sub-query';\nimport { OrchidOrmInternalError } from '../../errors';\nimport { SQLQueryArgs } from '../../db-sql-query';\nimport { getClonedQueryData, pushQueryValueImmutable } from '../../query-data';\n\n/*\nArgument of `where`:\n- can be an object with special keys `NOT`, `OR`, `IN`, etc.: q.where({ NOT: { key: 'value' } })\n- can be a raw SQL: q.where(q.raw`sql`)\n- can be a special query builder: q.whereNot((q) => q.whereIn(...))\n- can be a nested `where` query to be joined wth `AND`: q.where(q.where(...), q.where(...))\n- can be an object where keys are column names and values can be one of:\n - value to check for equality\n - null for `IS NULL`\n - object with column operators: q.where({ num: { gt: 5 } })\n - raw SQL: q.where({ num: q.raw`sql` })\n - sub query returning a single column: q.where({ num: db.someTable.where(...).get('column') })\n */\nexport type WhereArg<T extends PickQuerySelectableRelations> =\n | {\n [K in keyof T['__selectable'] | 'NOT' | 'OR' | 'IN']?: K extends 'NOT'\n ? WhereArg<T> | WhereArgs<T>\n : K extends 'OR'\n ? (WhereArg<T> | WhereArgs<T>)[]\n : K extends 'IN'\n ? MaybeArray<{\n columns: (keyof T['__selectable'])[];\n values: unknown[][] | IsQuery | Expression;\n }>\n :\n | T['__selectable'][K]['column']['__queryType']\n | null\n // inlined `ColumnOperators` helper\n | {\n [O in keyof T['__selectable'][K]['column']['operators']]?: T['__selectable'][K]['column']['operators'][O]['_opType'];\n }\n // inlined QueryOrExpression\n | {\n result: {\n value: {\n // simplified Column.Pick.QueryColumn\n __queryType:\n | T['__selectable'][K]['column']['__queryType']\n | null;\n };\n };\n }\n // returns inlined QueryOrExpression\n | ((q: T) => {\n result: {\n value: {\n // simplified Column.Pick.QueryColumn\n __queryType:\n | T['__selectable'][K]['column']['__queryType']\n | null;\n };\n };\n });\n }\n | ((\n q: WhereQueryBuilder<T>,\n ) => QueryOrExpressionBooleanOrNullResult | WhereQueryBuilder<T>);\n\n/**\n * Callback argument of `where`.\n * It has `where` methods (`where`, `whereNot`, `whereExists`, etc.),\n * and it has relations that you can aggregate and use a boolean comparison with, such as:\n * ```ts\n * db.table.where((q) => q.relation.count().equals(10))\n * ```\n */\nexport type WhereQueryBuilder<T extends PickQueryRelations> =\n EmptyObject extends T['relations']\n ? {\n [K in keyof T]: K extends\n | keyof Where\n | keyof QueryExpressions\n | 'table' // is needed for `useHelper`\n | 'get'\n | 'columnTypes'\n | '__selectable'\n | 'relations'\n | 'useHelper'\n | 'modify'\n // rest are required by `useHelper`\n | 'result'\n | 'returnType'\n | 'withData'\n | 'windows'\n | 'then'\n ? T[K]\n : never;\n }\n : {\n [K in keyof T['relations'] | keyof T]: K extends keyof T['relations']\n ? T['relations'][K]['query']\n : K extends keyof T &\n (\n | keyof Where\n | keyof QueryExpressions\n | 'table' // is needed for `useHelper`\n | 'get'\n | 'columnTypes'\n | '__selectable'\n | 'relations'\n | 'useHelper'\n | 'modify'\n // rest are required by `useHelper`\n | 'result'\n | 'returnType'\n | 'withData'\n | 'windows'\n | 'then'\n )\n ? T[K]\n : never;\n };\n\n// One or more of {@link WhereArg} or a string template for raw SQL.\nexport type WhereArgs<T extends PickQuerySelectableRelations> = WhereArg<T>[];\n\nexport type WhereNotArgs<T extends PickQuerySelectableRelations> = [\n WhereArg<T>,\n];\n\n// Argument of `whereIn`: can be a column name or a tuple with column names to search in.\nexport type WhereInColumn<T extends PickQuerySelectableRelations> =\n | keyof T['__selectable']\n | [keyof T['__selectable'], ...(keyof T['__selectable'])[]];\n\n// If `WhereInColumn` is a single column, it accepts array of values, or Query returning single column, or raw SQL expression.\n// If `WhereInColumn` is a tuple, it accepts a tuple of values described above.\nexport type WhereInValues<\n T extends PickQuerySelectableRelations,\n Column,\n> = Column extends keyof T['__selectable']\n ?\n | Iterable<T['__selectable'][Column]['column']['__queryType']>\n | IsQuery\n | Expression\n :\n | ({\n [I in keyof Column]: Column[I] extends keyof T['__selectable']\n ? T['__selectable'][Column[I]]['column']['__queryType']\n : never;\n } & {\n length: Column extends { length: number } ? Column['length'] : never;\n })[]\n | IsQuery\n | Expression;\n\n// In addition to `WhereInColumn` + `WhereInValues` where user can provide a tuple with columns and a tuple with values, enable `whereIn` with object syntax.\n// Each key is a column name, value is array of column values, or a query returning single column, or a raw SQL expression.\nexport type WhereInArg<T extends PickQuerySelectableRelations> = {\n [K in keyof T['__selectable']]?:\n | Iterable<T['__selectable'][K]['column']['__queryType']>\n | IsQuery\n | Expression;\n};\n\n// After applying `where`, attach `__hasWhere: true` to query to allow updating and deleting.\nexport interface QueryHasWhere {\n __hasWhere: true;\n}\n\ninterface QueryFnReturningSelect {\n (q: never): QueryHasSelect;\n}\n\nconst resolveCallbacksInArgs = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n) => {\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (typeof arg === 'function') {\n const qb = Object.create(q);\n qb.q = getClonedQueryData((q as unknown as PickQueryQ).q);\n qb.q.and = qb.q.or = qb.q.scopes = undefined;\n qb.q.subQuery = 1;\n _setSubQueryAliases(qb);\n\n const resolved = resolveSubQueryCallback(qb, arg as never) as never;\n args[i] = prepareSubQueryForSql(q as never, resolved) as never;\n } else if (arg.constructor === Object) {\n const copy = ((args as RecordUnknown[])[i] = {\n ...(arg as RecordUnknown),\n });\n for (const key in arg) {\n const value = arg[key as never] as RecordUnknown;\n if (typeof value === 'function') {\n let resolved = (value as (q: unknown) => unknown)(q);\n if (!isExpression(resolved)) {\n resolved = prepareSubQueryForSql(\n q as unknown as Query,\n resolved as unknown as Query,\n );\n }\n copy[key] = resolved;\n } else {\n prepareWhereObj(q, value, true);\n }\n }\n }\n }\n};\n\nconst prepareWhereObj = (\n q: PickQuerySelectableRelations,\n value: RecordUnknown,\n checkNested?: boolean,\n) => {\n for (const op in value) {\n const param = value[op];\n if (param && typeof param === 'object') {\n if (Array.isArray(param)) {\n param.forEach((item, i) => {\n const val = prepareOpArg(q, item);\n if (val) param[i] = val;\n });\n } else if (checkNested && param.constructor === Object) {\n prepareWhereObj(q, param as RecordUnknown);\n } else {\n const val = prepareOpArg(q, param);\n if (val) value[op] = val;\n }\n }\n }\n};\n\n/**\n * Mutative {@link Where.prototype.where}\n */\nexport const _queryWhere = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n): T & QueryHasWhere => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryArrayImmutable(q as never, 'and', args) as never;\n};\n\nexport const _queryFindBy = <\n T extends PickQuerySelectableRelationsResultReturnType,\n>(\n q: T,\n arg: WhereArg<T>,\n): QueryTake<T & QueryHasWhere> => {\n validateFindBy(q, arg, 'findBy');\n return _queryTake(_queryWhere(q, [arg]));\n};\n\nexport const _queryFindByOptional = <\n T extends PickQuerySelectableRelationsResultReturnType,\n>(\n q: T,\n arg: WhereArg<T>,\n): QueryTakeOptional<T & QueryHasWhere> => {\n validateFindBy(q, arg, 'findByOptional');\n return _queryTakeOptional(_queryWhere(q, [arg]));\n};\n\nconst validateFindBy = (\n q: unknown,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n arg: WhereArg<any>,\n method: string,\n) => {\n let nonEmpty: boolean | undefined;\n for (const key in arg) {\n nonEmpty = true;\n if (arg[key as keyof typeof arg] === undefined) {\n throw new OrchidOrmInternalError(\n q as never,\n `${method} was called with undefined value`,\n );\n }\n }\n if (!nonEmpty) {\n throw new OrchidOrmInternalError(\n q as never,\n `${method} was called with empty object`,\n );\n }\n};\n\n/**\n * Mutative {@link Where.prototype.whereSql}\n */\nexport const _queryWhereSql = <T>(q: T, args: SQLQueryArgs): T => {\n return pushQueryValueImmutable(\n q as never,\n 'and',\n sqlQueryArgsToExpression(args),\n ) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.whereNot}\n */\nexport const _queryWhereNot = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereNotArgs<T>,\n): T & QueryHasWhere => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryValueImmutable(q as never, 'and', {\n NOT: args,\n }) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.whereNotSql}\n */\nexport const _queryWhereNotSql = <T>(q: T, args: SQLQueryArgs): T => {\n return pushQueryValueImmutable(q as never, 'and', {\n NOT: sqlQueryArgsToExpression(args),\n }) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.whereNotExists}\n */\nexport const _queryWhereNotExists = (q: Query, arg: unknown, args: unknown) => {\n return _queryWhereNot(q, existsArgs(q, arg as never, args as never)) as never;\n};\n\nexport const _queryWhereOneOf = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n): T & QueryHasWhere => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryValueImmutable(q as never, 'and', {\n OR: args,\n }) as never;\n};\n\nexport const _queryWhereNotOneOf = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n): T => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryValueImmutable(q as never, 'and', {\n NOT: { OR: args },\n }) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.orWhere}\n */\nexport const _queryOr = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n): T & QueryHasWhere => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryArrayImmutable(\n q as never,\n 'or',\n args.map((item) => [item]),\n ) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.orWhereNot}\n */\nexport const _queryOrNot = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n): T & QueryHasWhere => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryArrayImmutable(\n q as never,\n 'or',\n args.map((item) => {\n return [{ NOT: item }];\n }),\n ) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.whereIn}\n */\nexport const _queryWhereIn = <T>(\n q: T,\n and: boolean,\n arg: unknown,\n values: unknown[] | Iterable<unknown> | IsQuery | Expression | undefined,\n not?: boolean,\n): T & QueryHasWhere => {\n let item;\n if (values) {\n if (isIterable(values)) values = [...values];\n\n if ('length' in values && !values.length) {\n return _queryNone(q) as T & QueryHasWhere;\n }\n\n if (values instanceof (q as Query).constructor) {\n values = prepareSubQueryForSql(q as Query, values as Query);\n }\n\n if (Array.isArray(arg)) {\n item = {\n IN: {\n columns: arg,\n values,\n },\n };\n } else {\n item = { [arg as string]: { in: values } };\n }\n } else {\n item = {} as { [K: string]: { in: Iterable<unknown> } };\n for (const key in arg as { [K: string]: Iterable<unknown> }) {\n let values = (arg as { [K: string]: Iterable<unknown> })[key];\n\n if (\n ('length' in values && !values.length) ||\n ('size' in values && !values.size)\n ) {\n return _queryNone(q) as T & QueryHasWhere;\n }\n\n if (values instanceof (q as Query).constructor) {\n // TODO: add a test, not sure if `in` expects a query in this case\n values = prepareSubQueryForSql(q as Query, values as never) as never;\n }\n\n item[key] = { in: values };\n }\n }\n\n if (not) item = { NOT: item };\n\n if (and) {\n pushQueryValueImmutable(q as never, 'and', item);\n } else {\n pushQueryValueImmutable(q as never, 'or', [item]);\n }\n\n return q as never;\n};\n\n/**\n * Process arguments of `whereExists`.\n */\nconst existsArgs = (\n self: Query,\n q: JoinFirstArg<Query>,\n args: JoinArgs<Query, Query>,\n) => {\n const joinArgs = processJoinArgs(\n self,\n preprocessJoinArg(self, q) as never,\n args as never,\n false,\n undefined,\n true,\n );\n\n return [\n {\n EXISTS: joinArgs,\n },\n ] as never;\n};\n\n/**\n * Mutative {@link Where.prototype.whereExists}\n */\nexport const _queryWhereExists = <\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n>(\n q: T,\n arg: Arg,\n args: [JoinCallback<T, Arg>] | JoinArgs<T, Arg>,\n): T & QueryHasWhere => {\n return _queryWhere(\n q as never,\n existsArgs(q as unknown as Query, arg as never, args as never),\n ) as never;\n};\n\nexport class Where {\n /**\n * Constructing `WHERE` conditions:\n *\n * ```ts\n * import { sql } from './table-factory';\n *\n * db.table.where({\n * // column of the current table\n * name: 'John',\n *\n * // table name may be specified, it can be the name of a joined table\n * 'table.lastName': 'Johnsonuk',\n *\n * // object with operators, see the \"column operators\" section to see a full list of them:\n * age: {\n * gt: 30,\n * lt: 70,\n * },\n *\n * // where column equals to raw SQL\n * // import `sql` from your table factory\n * column: sql`sql expression`,\n * // or use `(q) => sql` for the same\n * column2: (q) => sql`sql expression`,\n *\n * // reference other columns in such a way:\n * firstName: (q) => q.ref('lastName'),\n * });\n * ```\n *\n * Multiple `where`s are joined with `AND`:\n *\n * ```ts\n * db.table.where({ foo: 'foo' }).where({ bar: 'bar' });\n * ```\n *\n * ```sql\n * SELECT * FROM table WHERE foo = 'foo' AND bar = 'bar'\n * ```\n *\n * `undefined` values are ignored, so you can supply a partial object with conditions:\n *\n * ```ts\n * type Params = {\n * // allow providing exact age, or lower or greater than\n * age?: number | { lt?: number; gt?: number };\n * };\n *\n * const loadRecords = async (params: Params) => {\n * // this will load all records if params is an empty object\n * const records = await db.table.where(params);\n * };\n * ```\n *\n * It supports a sub-query that is selecting a single value to compare it with a column:\n *\n * ```ts\n * db.table.where({\n * // compare `someColumn` in one table with the `column` value returned from another query.\n * someColumn: db.otherTable.where(...conditions).get('column'),\n * });\n * ```\n *\n * `where` can accept other queries and merge their conditions:\n *\n * ```ts\n * const otherQuery = db.table.where({ name: 'John' });\n *\n * db.table.where({ id: 1 }, otherQuery);\n * // this will produce WHERE \"table\".\"id\" = 1 AND \"table\".\"name' = 'John'\n * ```\n *\n * `where` supports raw SQL:\n *\n * ```ts\n * db.table.where(sql`a = b`);\n * ```\n *\n * `where` can accept a callback with a specific query builder containing all \"where\" methods such as `where`, `orWhere`, `whereNot`, `whereIn`, `whereExists`:\n *\n * ```ts\n * db.table.where((q) =>\n * q\n * .where({ name: 'Name' })\n * .orWhere({ id: 1 }, { id: 2 })\n * .whereIn('letter', ['a', 'b', 'c'])\n * .whereExists(db.message, 'authorId', 'id'),\n * );\n * ```\n *\n * `where` can accept multiple arguments, conditions are joined with `AND`:\n *\n * ```ts\n * db.table.where(\n * { id: 1 },\n * db.table.where({ name: 'John' }),\n * sql`a = b`,\n * );\n * ```\n *\n * ## where sub query\n *\n * `where` handles a special callback where you can query a relation to get some value and filter by that value.\n *\n * It is useful for a faceted search. For instance, posts have tags, and we want to find all posts that have all the given tags.\n *\n * ```ts\n * const givenTags = ['typescript', 'node.js'];\n *\n * const posts = await db.post.where(\n * (post) =>\n * post.tags // query tags of the post\n * .whereIn('tagName', givenTags) // where name of the tag is inside array\n * .count() // count how many such tags were found\n * .equals(wantedTags.length), // the count must be exactly the length of array\n * // if the post has ony `typescript` tag but not the `node.js` it will be omitted\n * );\n * ```\n *\n * This will produce an efficient SQL query:\n *\n * ```sql\n * SELECT * FROM \"post\"\n * WHERE (\n * SELECT count(*) = 3\n * FROM \"tag\" AS \"tags\"\n * WHERE \"tag\".\"tagName\" IN ('typescript', 'node.js')\n * -- join tags to the post via \"postTag\" table\n * AND EXISTS (\n * SELECT 1 FROM \"postTag\"\n * WHERE \"postTag\".\"postId\" = \"post\".\"id\"\n * AND \"postTag\".\"tagId\" = \"tag\".\"id\"\n * )\n * )\n * ```\n *\n * In the example above we use `count()`, you can also use any other aggregate method instead, such as `min`, `max`, `avg`.\n *\n * The `count()` is chained with `equals` to check for a strict equality, any other operation is also allowed, such as `not`, `lt`, `gt`.\n *\n * ## where special keys\n *\n * The object passed to `where` can contain special keys, each of the keys corresponds to its own method and takes the same value as the type of argument of the method.\n *\n * For example:\n *\n * ```ts\n * db.table.where({\n * NOT: { key: 'value' },\n * OR: [{ name: 'a' }, { name: 'b' }],\n * IN: {\n * columns: ['id', 'name'],\n * values: [\n * [1, 'a'],\n * [2, 'b'],\n * ],\n * },\n * });\n * ```\n *\n * Using methods `whereNot`, `orWhere`, `whereIn` instead of this is a shorter and cleaner way, but in some cases, such object keys way may be more convenient.\n *\n * ```ts\n * db.table.where({\n * // see .whereNot\n * NOT: { id: 1 },\n * // can be an array:\n * NOT: [{ id: 1 }, { id: 2 }],\n *\n * // see .orWhere\n * OR: [{ name: 'a' }, { name: 'b' }],\n * // can be an array:\n * // this will give id = 1 AND id = 2 OR id = 3 AND id = 4\n * OR: [\n * [{ id: 1 }, { id: 2 }],\n * [{ id: 3 }, { id: 4 }],\n * ],\n *\n * // see .in, the key syntax requires an object with columns and values\n * IN: {\n * columns: ['id', 'name'],\n * values: [\n * [1, 'a'],\n * [2, 'b'],\n * ],\n * },\n * // can be an array:\n * IN: [\n * {\n * columns: ['id', 'name'],\n * values: [\n * [1, 'a'],\n * [2, 'b'],\n * ],\n * },\n * { columns: ['someColumn'], values: [['foo', 'bar']] },\n * ],\n * });\n * ```\n *\n * ## column operators\n *\n * `where` argument can take an object where the key is the name of the operator and the value is its argument.\n *\n * Different types of columns support different sets of operators.\n *\n * All column operators can take a value of the same type as the column, a sub-query, or a raw SQL expression:\n *\n * ```ts\n * db.table.where({\n * numericColumn: {\n * // lower than 5\n * lt: 5,\n *\n * // lower than the value returned by sub-query\n * lt: db.otherTable.select('someNumber').take(),\n *\n * // raw SQL expression produces WHERE \"numericColumn\" < \"otherColumn\" + 10\n * lt: sql`\"otherColumn\" + 10`,\n * },\n * });\n * ```\n *\n * ### Any type of column operators\n *\n * `equals` is a simple `=` operator, it may be useful for comparing column value with JSON object:\n *\n * ```ts\n * db.table.where({\n * // when searching for an exact same JSON value, this won't work:\n * jsonColumn: someObject,\n *\n * // use `{ equals: ... }` instead:\n * jsonColumn: { equals: someObject },\n * });\n * ```\n *\n * `not` is `!=` (aka `<>`) not equal operator:\n *\n * ```ts\n * db.table.where({\n * anyColumn: { not: value },\n * });\n * ```\n *\n * `in` is for the `IN` operator to check if the column value is included in a list of values.\n *\n * Takes an array of the same type as a column, a sub-query that returns a list of values, or a raw SQL expression that returns a list.\n *\n * ```ts\n * db.table.where({\n * column: {\n * in: ['a', 'b', 'c'],\n *\n * // WHERE \"column\" IN (SELECT \"column\" FROM \"otherTable\")\n * in: db.otherTable.select('column'),\n *\n * in: sql`('a', 'b')`,\n * },\n * });\n * ```\n *\n * `notIn` is for the `NOT IN` operator, and takes the same arguments as `in`\n *\n * ### Numeric, Date, and Time column operators\n *\n * To compare numbers, dates, and times.\n *\n * `lt` is for `<` (lower than)\n *\n * `lte` is for `<=` (lower than or equal)\n *\n * `gt` is for `>` (greater than)\n *\n * `gte` is for `>=` (greater than or equal)\n *\n * ```ts\n * db.table.where({\n * numericColumn: {\n * gt: 5,\n * lt: 10,\n * },\n *\n * date: {\n * lte: new Date(),\n * },\n *\n * time: {\n * gte: new Date(),\n * },\n * });\n * ```\n *\n * `between` also works with numeric, dates, and time columns, it takes an array of two elements.\n *\n * Both elements can be of the same type as a column, a sub-query, or a raw SQL expression.\n *\n * ```ts\n * db.table.where({\n * column: {\n * // simple values\n * between: [1, 10],\n *\n * // sub-query and raw SQL expression\n * between: [db.otherTable.select('column').take(), sql`2 + 2`],\n * },\n * });\n * ```\n *\n * ### Text column operators\n *\n * For `text`, `varchar`, `string`, and `json` columns.\n *\n * `json` is stored as text, so it has text operators. Use the `jsonb` type for JSON operators.\n *\n * Takes a string, or sub-query returning string, or raw SQL expression as well as other operators.\n *\n * ```ts\n * db.table.where({\n * textColumn: {\n * // WHERE \"textColumn\" LIKE '%string%'\n * contains: 'string',\n * // WHERE \"textColumn\" ILIKE '%string%'\n * containsInsensitive: 'string',\n * // WHERE \"textColumn\" LIKE 'string%'\n * startsWith: 'string',\n * // WHERE \"textColumn\" ILIKE 'string%'\n * startsWithInsensitive: 'string',\n * // WHERE \"textColumn\" LIKE '%string'\n * endsWith: 'string',\n * // WHERE \"textColumn\" ILIKE '%string'\n * endsWithInsensitive: 'string',\n * },\n * });\n * ```\n *\n * ### JSONB column operators\n *\n * JSON functions are available only for the `jsonb` column, note that the `json` type has text operators instead.\n *\n * You can use [jsonPathQueryFirst](/guide/json.html#jsonpathqueryfirst) to filter by a JSON value, follow the link for details.\n *\n * The value can be of any type, it can also be returned from a sub-query, raw SQL expression.\n *\n * ```ts\n * db.table.where((q) =>\n * q.get('jsonbColumn').jsonPathQueryFirst('$.name').equals(value),\n * );\n * ```\n *\n * `jsonSupersetOf`: check if the column value is a superset of provided value.\n *\n * For instance, it is true if the column has JSON `{ \"a\": 1, \"b\": 2 }` and provided value is `{ \"a\": 1 }`.\n *\n * Takes the value of any type, or sub query which returns a single value, or a raw SQL expression.\n *\n * ```ts\n * db.table.where({\n * jsonbColumn: {\n * jsonSupersetOf: { a: 1 },\n * },\n * });\n * ```\n *\n * `jsonSubsetOf`: check if the column value is a subset of provided value.\n *\n * For instance, it is true if the column has JSON `{ \"a\": 1 }` and provided value is `{ \"a\": 1, \"b\": 2 }`.\n *\n * Takes the value of any type, or sub query which returns a single value, or a raw SQL expression.\n *\n * ```ts\n * db.table.where({\n * jsonbColumn: {\n * jsonSubsetOf: { a: 1 },\n * },\n * });\n * ```\n *\n * @param args - {@link WhereArgs}\n */\n where<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): T & QueryHasWhere {\n return _queryWhere(_clone(this), args as never) as never;\n }\n\n /**\n * Use a custom SQL expression in `WHERE` statement:\n *\n * ```ts\n * db.table.whereSql`a = b`;\n * ```\n *\n * @param args - SQL expression\n */\n whereSql<T>(this: T, ...args: SQLQueryArgs): T & QueryHasWhere {\n return _queryWhereSql(_clone(this), args as never) as never;\n }\n\n /**\n * `whereNot` takes the same argument as `where`,\n * multiple conditions are combined with `AND`,\n * the whole group of conditions is negated with `NOT`.\n *\n * ```ts\n * // find records of different colors than red\n * db.table.whereNot({ color: 'red' });\n * // WHERE NOT color = 'red'\n * db.table.whereNot({ one: 1, two: 2 });\n * // WHERE NOT (one = 1 AND two = 2)\n * ```\n *\n * @param args - {@link WhereArgs}\n */\n whereNot<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereNotArgs<T>\n ): T & QueryHasWhere {\n return _queryWhereNot(_clone(this), args as never) as never;\n }\n\n /**\n * `whereNotSql` is a version of `whereNot` accepting SQL expression:\n *\n * ```ts\n * db.table.whereNotSql`sql expression`\n * ```\n *\n * @param args - SQL expression\n */\n whereNotSql<T>(this: T, ...args: SQLQueryArgs): T {\n return _queryWhereNotSql(_clone(this), args) as never;\n }\n\n /**\n * `whereOneOf` stands for \"...**and** where one of the given is true\".\n *\n * Accepts the same arguments as `where`.\n *\n * ```ts\n * db.table.where({ id: 1 }).whereOneOf({ color: 'red' }, { color: 'blue' });\n * ```\n *\n * ```sql\n * SELECT * FROM table\n * WHERE id = 1 AND (color = 'red' OR color = 'blue')\n * ```\n *\n * Note that columns inside every argument are joined with `AND`:\n *\n * ```ts\n * db.table.whereOneOf({ id: 1, color: 'red' }, { id: 2 });\n * ```\n *\n * ```sql\n * SELECT * FROM table\n * WHERE (id = 1 AND color = 'red') OR (id = 2)\n * ```\n *\n * @param args - same arguments as in {@link where}, joined with `OR`\n */\n whereOneOf<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): T & QueryHasWhere {\n return _queryWhereOneOf(_clone(this), args as never) as never;\n }\n\n /**\n * Negative {@link whereOneOf}:\n *\n * ```ts\n * db.table.where({ id: 1 }).whereNotOneOf({ color: 'red' }, { color: 'blue' });\n * ```\n *\n * ```sql\n * SELECT * FROM table\n * WHERE id = 1 AND NOT (color = 'red' OR color = 'blue')\n * ```\n *\n * @param args - same arguments as in {@link where}, joined with `OR`\n */\n whereNotOneOf<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): T {\n return _queryWhereNotOneOf(_clone(this), args as never) as never;\n }\n\n /**\n * `orWhere` stands for \"...**or** where one of the given is true\".\n *\n * Accepts the same arguments as `where`.\n *\n * ```ts\n * db.table.where({ id: 1, color: 'red' }).orWhere({ id: 2, color: 'blue' });\n * // equivalent:\n * db.table.orWhere({ id: 1, color: 'red' }, { id: 2, color: 'blue' });\n * ```\n *\n * ```sql\n * SELECT * FROM table\n * WHERE (id = 1 AND color = 'red') OR (id = 2 AND color = 'blue')\n * ```\n *\n * @param args - same arguments as in {@link where}, joined with `OR`\n */\n orWhere<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): T & QueryHasWhere {\n return _queryOr(_clone(this), args as never) as never;\n }\n\n /**\n * `orWhereNot` takes the same arguments as {@link orWhere}, and prepends each condition with `NOT` just as {@link whereNot} does.\n *\n * @param args - {@link WhereArgs} will be prefixed with `NOT` and joined with `OR`\n */\n orWhereNot<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): T & QueryHasWhere {\n return _queryOrNot(_clone(this), args as never) as never;\n }\n\n /**\n * `whereIn` and related methods are for the `IN` operator to check for inclusion in a list of values.\n *\n * When used with a single column it works equivalent to the `in` column operator:\n *\n * ```ts\n * db.table.whereIn('column', [1, 2, 3]);\n * db.table.whereIn('column', new Set([1, 2, 3]));\n * // the same as:\n * db.table.where({ column: { in: [1, 2, 3] } });\n * db.table.where({ column: { in: new Set([1, 2, 3]) } });\n * ```\n *\n * `whereIn` can support a tuple of columns, that's what the `in` operator cannot support:\n *\n * ```ts\n * db.table.whereIn(\n * ['id', 'name'],\n * [\n * [1, 'Alice'],\n * [2, 'Bob'],\n * ],\n * );\n * ```\n *\n * It supports sub query which should return records with columns of the same type:\n *\n * ```ts\n * db.table.whereIn(['id', 'name'], db.otherTable.select('id', 'name'));\n * ```\n *\n * It supports raw SQL expression:\n *\n * ```ts\n * db.table.whereIn(['id', 'name'], sql`((1, 'one'), (2, 'two'))`);\n * ```\n *\n * When empty set of values is given, `whereIn` will resolve into a {@link QueryMethods.none} query that has a special behavior.\n *\n * ```ts\n * // following queries resolves into `none`:\n * db.table.whereIn('id', [])\n * db.table.whereIn(['id', 'name'], [])\n * db.table.whereIn({ id: [] })\n * ```\n */\n whereIn<\n T extends PickQuerySelectableRelations,\n Column extends WhereInColumn<T>,\n >(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [arg: WhereInArg<T>]\n ): T & QueryHasWhere {\n return _queryWhereIn(_clone(this), true, args[0], args[1]) as never;\n }\n\n /**\n * Takes the same arguments as {@link whereIn}.\n * Add a `WHERE IN` condition prefixed with `OR` to the query:\n *\n * ```ts\n * db.table.whereIn('a', [1, 2, 3]).orWhereIn('b', ['one', 'two']);\n * ```\n */\n orWhereIn<\n T extends PickQuerySelectableRelations,\n Column extends WhereInColumn<T>,\n >(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [WhereInArg<T>]\n ): T & QueryHasWhere {\n return _queryWhereIn(_clone(this), false, args[0], args[1]) as never;\n }\n\n /**\n * Acts as `whereIn`, but negates the condition with `NOT`:\n *\n * ```ts\n * db.table.whereNotIn('color', ['red', 'green', 'blue']);\n * ```\n */\n whereNotIn<\n T extends PickQuerySelectableRelations,\n Column extends WhereInColumn<T>,\n >(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [arg: WhereInArg<T>]\n ): T & QueryHasWhere {\n return _queryWhereIn(_clone(this), true, args[0], args[1], true) as never;\n }\n\n /**\n * Acts as `whereIn`, but prepends `OR` to the condition and negates it with `NOT`:\n *\n * ```ts\n * db.table.whereNotIn('a', [1, 2, 3]).orWhereNoIn('b', ['one', 'two']);\n * ```\n */\n orWhereNotIn<\n T extends PickQuerySelectableRelations,\n Column extends WhereInColumn<T>,\n >(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [arg: WhereInArg<T>]\n ): T & QueryHasWhere {\n return _queryWhereIn(_clone(this), false, args[0], args[1], true) as never;\n }\n\n /**\n * `whereExists` is for support of the `WHERE EXISTS (query)` clause.\n *\n * This method is accepting the same arguments as `join`, see the {@link Join.join} section for more details.\n *\n * ```ts\n * // find users who have accounts\n * // find by a relation name if it's defined\n * db.user.whereExists('account');\n *\n * // find users who have an account with positive balance\n * // `accounts` is a relation name\n * db.user.whereExists((q) => q.accounts.where({ balance: { gt: 0 } }));\n *\n * // find using a table and a join conditions\n * db.user.whereExists(db.account, 'account.id', 'user.id');\n *\n * // find using a query builder in a callback:\n * db.user.whereExists(db.account, (q) => q.on('account.id', '=', 'user.id'));\n * ```\n */\n whereExists<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallbackArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Cb | JoinArgs<T, Arg>\n ): Arg extends QueryFnReturningSelect\n ? { error: 'Cannot select in whereExists' }\n : Cb[0] extends QueryFnReturningSelect\n ? { error: 'Cannot select in whereExists' }\n : T & QueryHasWhere {\n return _queryWhereExists(\n _clone(this) as unknown as T,\n arg,\n args as never,\n ) as never;\n }\n\n /**\n * Acts as `whereExists`, but prepends the condition with `OR`:\n *\n * ```ts\n * // find users who have an account or a profile,\n * // imagine that the user has both `account` and `profile` relations defined.\n * db.user.whereExist('account').orWhereExists('profile');\n * ```\n */\n orWhereExists<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n >(this: T, arg: Arg, ...args: JoinArgs<T, Arg>): T & QueryHasWhere {\n const q = _clone(this);\n return _queryOr(q, existsArgs(q, arg as never, args as never)) as never;\n }\n\n /**\n * Acts as `whereExists`, but negates the condition with `NOT`:\n *\n * ```ts\n * // find users who don't have an account,\n * // image that the user `belongsTo` or `hasOne` account.\n * db.user.whereNotExist('account');\n * ```\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param args - no arguments needed when the first argument is a relation name, or conditions to join the table with.\n */\n whereNotExists<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n >(this: T, arg: Arg, ...args: JoinArgs<T, Arg>): T & QueryHasWhere {\n const q = _clone(this);\n return _queryWhereNotExists(q, arg, args);\n }\n\n /**\n * Acts as `whereExists`, but prepends the condition with `OR` and negates it with `NOT`:\n *\n * ```ts\n * // find users who don't have an account OR who don't have a profile\n * // imagine that the user has both `account` and `profile` relations defined.\n * db.user.whereNotExists('account').orWhereNotExists('profile');\n * ```\n */\n orWhereNotExists<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n >(this: T, arg: Arg, ...args: JoinArgs<T, Arg>): T & QueryHasWhere {\n const q = _clone(this);\n return _queryOrNot(q, existsArgs(q, arg as never, args as never)) as never;\n }\n}\n","import { IsQuery, Query } from '../../query';\nimport { _queryWhere } from '../../basic-features/where/where';\nimport { _queryAll } from '../../query.utils';\nimport { QueryData } from '../../query-data';\nimport { RelationConfigBase } from '../../relations';\nimport { _applyRelationAliases, getQueryAs } from '../../basic-features/as/as';\n\nexport const _chain = (\n fromQuery: IsQuery,\n toQuery: IsQuery,\n rel: RelationConfigBase,\n) => {\n const self = fromQuery as Query;\n const toTable = toQuery as Query;\n\n let query: Query;\n let q: QueryData;\n if (self.q.subQuery) {\n query = toTable;\n query.q.subQuery = 2;\n q = query.q as QueryData;\n\n // once there is a hasMany or hasAndBelongsToMany in the chain,\n // the following belongTo and hasOne must also return multiple\n if (\n // `select({ q => q.rel })`: on the first relation it doesn't matter if the parent has chainMultiple\n self.q.subQuery > 1 &&\n self.q.chainMultiple\n ) {\n q.returnType = q.returnsOne = q.limit = undefined;\n } else if (!((rel.query as Query).q as QueryData).returnsOne) {\n q.chainMultiple = true;\n }\n } else {\n // Relation query returns a single record in case of belongsTo or hasOne,\n // but when called as a query chain like `q.user.profile` it should return many.\n query = _queryWhere(_queryAll(toTable), [\n {\n EXISTS: { q: rel.reverseJoin(self, toTable) },\n },\n ]);\n\n q = query.q as QueryData;\n\n q.returnType = q.returnsOne = q.limit = undefined;\n }\n\n if (self.q.relChain) {\n q.relChain = [...self.q.relChain, { query: self, rel }];\n } else {\n q.relChain = [{ query: self, rel }];\n }\n\n _applyRelationAliases(self, q);\n\n q.joinedShapes = {\n [getQueryAs(self)]: self.q.selectShape,\n ...self.q.joinedShapes,\n };\n\n rel.modifyRelatedQuery?.(query)?.(self);\n\n return query;\n};\n","import type { Query } from '../../query';\nimport { _clone } from '../../basic-features/clone/clone';\nimport { _chain } from '../../extra-features/chain/chain';\nimport { _setSubQueryAliases } from '../../basic-features/as/as';\nimport { ToSQLQuery } from '../../sql/to-sql';\nimport { getClonedQueryData } from '../../query-data';\n\n/**\n * In `select`, `update`, `create` it's possible to pass a callback with a sub-query.\n * This function resolves such a sub-query.\n *\n * @param q - main query object to pass to a callback as argument\n * @param cb - sub-query callback\n */\nexport const resolveSubQueryCallback = (\n q: ToSQLQuery,\n cb: (q: ToSQLQuery) => ToSQLQuery,\n): ToSQLQuery => {\n let base;\n // `with` can pass a generic `qb` here, it has no table.\n // Do not memoize anything into `internal` of a common `qb`,\n // because it is common and will be re-used.\n if (q.table) {\n base = q.internal.callbackArg;\n if (!base) {\n base = Object.create(q.baseQuery) as Query;\n base.baseQuery = base;\n\n const { relations } = q;\n for (const key in relations) {\n Object.defineProperty(base, key, {\n get() {\n const rel = relations[key as string];\n const relQuery = _clone(rel.query);\n relQuery.q.withShapes = this.q.withShapes;\n return _chain(this, relQuery, rel);\n },\n });\n }\n\n q.internal.callbackArg = base;\n }\n } else {\n base = q;\n }\n\n const arg = Object.create(base);\n\n arg.q = getClonedQueryData(q.q);\n arg.q.subQuery = 1;\n // Deleting `with` because sub-query should duplicate WITH statements of the parent query in its SQL\n arg.q.with = arg.q.relChain = undefined;\n _setSubQueryAliases(arg);\n\n return cb(arg as Query);\n};\n","import {\n IsQuery,\n Query,\n QuerySelectable,\n SelectableFromShape,\n} from '../../query';\nimport { Column, setColumnData } from '../../../columns/column';\nimport { ColumnsShape } from '../../../columns';\nimport {\n PickQuerySelectableResultRelationsWithDataReturnType,\n PickQueryResultRelationsWithDataReturnTypeShape,\n PickQuerySelectableShapeRelationsWithDataAs,\n PickQueryQ,\n PickQueryRelationsWithData,\n PickQueryTable,\n PickQueryResultAs,\n PickQueryShapeAsRelations,\n PickQuerySelectable,\n PickQuerySelectableRelationsResultReturnType,\n PickQuerySelectableShape,\n PickQuerySelectableColumnTypes,\n PickQuerySelectableResultAs,\n PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n PickQuerySelectableShapeRelationsWithDataAsResultReturnType,\n PickQueryHasSelectResultShapeAsRelations,\n PickQuerySelectableRelations,\n PickQueryResultAsRelations,\n PickQueryRelations,\n} from '../../pick-query-types';\nimport {\n EmptyObject,\n EmptyTuple,\n pushOrNewArrayToObjectImmutable,\n setObjectValueImmutable,\n} from '../../../utils';\nimport { getQueryAs } from '../as/as';\nimport { Expression } from '../../expressions/expression';\nimport { _clone } from '../clone/clone';\nimport {\n prepareSubQueryForSql,\n SubQueryForSql,\n} from '../../internal-features/sub-query/sub-query-for-sql';\nimport { _queryNone, isQueryNone } from '../../extra-features/none/none';\nimport {\n addColumnParserToQuery,\n BatchParsers,\n ColumnsParsers,\n getQueryParsers,\n} from '../../query-columns/query-column-parsers';\nimport { preprocessJoinArg, processJoinArgs } from './process-join-args';\nimport { getIsJoinSubQuery } from '../../sql/get-is-join-sub-query';\nimport { getShapeFromSelect } from '../select/select.utils';\nimport { WithDataItem } from '../cte/cte.sql';\nimport {\n isRelationQuery,\n RelationConfigBase,\n RelationsBase,\n} from '../../relations';\nimport { ComputedColumns } from '../../extra-features/computed/computed';\nimport { throwIfJoinLateral } from '../../query.utils';\nimport { resolveSubQueryCallback } from '../../internal-features/sub-query/sub-query';\nimport { SelectAs, SelectAsValue, SelectItem } from '../select/select.sql';\nimport { JoinItemArgs } from './join.sql';\nimport { getSqlText } from '../../sql/sql';\nimport { JoinValueDedupItem, pushQueryValueImmutable } from '../../query-data';\nimport { ToSQLQuery } from '../../sql/to-sql';\nimport { QueryThenByQuery } from '../../then/then';\n\n// Type of column names of a `with` table, to use to join a `with` table by these columns.\n// Union of `with` column names that may be prefixed with a `with` table name.\ntype WithSelectable<W extends WithDataItem> =\n | keyof W['shape']\n | `${W['table']}.${keyof W['shape'] & string}`;\n\n/**\n * The first argument of all `join` and `joinLateral` methods.\n * See argument of {@link join}.\n */\nexport type JoinFirstArg<T extends PickQueryRelationsWithData> =\n | PickQueryResultAs\n | keyof T['relations']\n | keyof T['withData']\n | ((q: {\n [K in keyof T['relations']]: T['relations'][K]['query'];\n }) => PickQueryResultAs)\n | FnPickQueryResultAs;\n\ninterface FnPickQueryResultAs {\n (): PickQueryResultAs;\n}\n\n/**\n * Arguments of `join` methods (not `joinLateral`).\n * See {@link join}\n */\nexport type JoinArgs<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n> = Arg extends PickQueryResultAs\n ?\n // Available arguments when joining a query object. Can be:\n // - an object where keys are columns of the joined table and values are columns of the main table or a raw SQL.\n // - raw SQL expression\n // - `true` to join without conditions\n // - pair of columns, first is of the joined table, second is of main table\n // - string tuple of a column of a joined table, operator string such as '=' or '!=', and a column of the main table\n | [\n conditions:\n | {\n [K in JoinSelectable<Arg>]:\n | keyof T['__selectable']\n | Expression;\n }\n | Expression,\n ]\n | [\n leftColumn: JoinSelectable<Arg> | Expression,\n rightColumn: keyof T['__selectable'] | Expression,\n ]\n | [\n leftColumn: JoinSelectable<Arg> | Expression,\n op: string,\n rightColumn: keyof T['__selectable'] | Expression,\n ]\n : Arg extends keyof T['withData']\n ? JoinWithArgs<T, T['withData'][Arg]>\n : EmptyTuple;\n\n/**\n * Column names of the joined table that can be used to join.\n * Derived from 'result', not from 'shape',\n * because if the joined table has a specific selection, it will be wrapped like:\n * ```sql\n * JOIN (SELECT something FROM joined) joined ON joined.something = ...\n * ```\n * And the selection becomes available to use in the `ON` and to select from the joined table.\n */\ntype JoinSelectable<Q extends PickQueryResultAs> =\n | keyof Q['result']\n | `${Q['__as']}.${keyof Q['result'] & string}`;\n\n// Available arguments when joining a `with` table. Can be:\n// - an object where keys are columns of the `with` table and values are columns of the main table or a raw SQL\n// - raw SQL expression\n// - pair of columns, first is of the `with` table, second is of main table\n// - string tuple of a column of a `with` table, operator string such as '=' or '!=', and a column of the main table\ntype JoinWithArgs<T extends PickQuerySelectable, Arg extends WithDataItem> =\n | [\n conditions:\n | {\n [K in WithSelectable<Arg>]: keyof T['__selectable'] | Expression;\n }\n | Expression,\n ]\n | [\n leftColumn: WithSelectable<Arg> | Expression,\n rightColumn: keyof T['__selectable'] | Expression,\n ]\n | [\n leftColumn: WithSelectable<Arg> | Expression,\n op: string,\n rightColumn: keyof T['__selectable'] | Expression,\n ];\n\nexport type JoinResultRequireMain<\n T extends PickQuerySelectable,\n JoinedSelectable,\n> = {\n // is optimal\n [K in keyof T]: K extends '__selectable'\n ? T['__selectable'] & JoinedSelectable\n : T[K];\n};\n\n/**\n * Result of all `join` methods, not `joinLateral`.\n * Adds joined table columns from its 'result' to the '__selectable' of the query.\n */\nexport type JoinResult<\n T extends PickQuerySelectableRelationsResultReturnType,\n Joined extends PickQuerySelectableRelations,\n RequireMain,\n> = RequireMain extends true\n ? {\n // is optimal, same as JoinResultRequireMain above, inlined for fewer instantiations.\n [K in keyof T]: K extends '__selectable'\n ? T['__selectable'] & Joined['__selectable']\n : K extends 'relations'\n ? {\n [K in\n | keyof T['relations']\n | keyof Joined['relations']]: K extends keyof Joined['relations']\n ? Joined['relations'][K]\n : T['relations'][K];\n }\n : T[K];\n }\n : {\n [K in keyof T]: K extends '__selectable'\n ? {\n [K in keyof T['__selectable']]: {\n as: T['__selectable'][K]['as'];\n column: Column.QueryColumnToNullable<\n T['__selectable'][K]['column']\n >;\n };\n } & Joined['__selectable'] // & is optimal\n : K extends 'result'\n ? // nullable result: inlined for optimization\n {\n [K in keyof T['result']]: Column.QueryColumnToNullable<\n T['result'][K]\n >;\n }\n : K extends 'then'\n ? QueryThenByQuery<\n T,\n // nullable result: inlined for optimization\n {\n [K in keyof T['result']]: Column.QueryColumnToNullable<\n T['result'][K]\n >;\n }\n >\n : K extends 'relations'\n ? {\n [K in\n | keyof T['relations']\n | keyof Joined['relations']]: K extends keyof Joined['relations']\n ? Joined['relations'][K]\n : T['relations'][K];\n }\n : T[K];\n };\n\n/**\n * Calls {@link JoinResult} with either callback result, if join has a callback,\n * or with a query derived from the first join argument.\n */\nexport type JoinResultFromArgs<\n T extends PickQuerySelectableResultRelationsWithDataReturnType,\n Arg,\n Args extends unknown[],\n RequireJoined,\n RequireMain,\n> = JoinResult<\n T,\n // .join(db.table, () => query)\n Args[0] extends GenericJoinCallback\n ? JoinResultSelectable<\n ReturnType<Args[0]>['result'],\n ReturnType<Args[0]>['__as'],\n ReturnType<Args[0]>['relations'],\n RequireJoined\n >\n : // .join(db.table, ...)\n Arg extends PickQueryHasSelectResultShapeAsRelations\n ? JoinResultSelectable<\n Arg['__hasSelect'] extends true\n ? // If joined query has select, computed values won't be available, use `result` as is\n Arg['result']\n : // If no select, allow using computed values by setting result to shape\n Arg['shape'],\n Arg['__as'],\n Arg['relations'],\n RequireJoined\n >\n : // .join('rel-name')\n Arg extends keyof T['relations']\n ? JoinResultSelectable<\n T['relations'][Arg]['query']['shape'],\n T['relations'][Arg]['query']['__as'],\n T['relations'][Arg]['query']['relations'],\n RequireJoined\n >\n : // .join((q) => q.relation)\n // .join(() => db.table)\n Arg extends FirstArgCallback\n ? JoinResultSelectable<\n ReturnType<Arg>['shape'],\n ReturnType<Arg>['__as'],\n ReturnType<Arg>['relations'],\n RequireJoined\n >\n : // .join('cte-name')\n Arg extends keyof T['withData']\n ? T['withData'][Arg] extends WithDataItem\n ? JoinResultSelectable<\n T['withData'][Arg]['shape'],\n T['withData'][Arg]['table'],\n EmptyObject,\n RequireJoined\n >\n : never\n : never,\n RequireMain\n>;\n\ninterface GenericJoinCallback {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (...args: any[]): PickQueryResultAsRelations;\n}\ninterface FirstArgCallback {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (...args: any[]): PickQueryShapeAsRelations;\n}\n\n/**\n * Result of all `joinLateral` methods.\n * Adds joined table columns from its 'result' to the '__selectable' of the query.\n *\n * @param T - query type to join to\n * @param Arg - first arg of join, see {@link JoinFirstArg}\n * @param RequireJoined - when false, joined table shape will be mapped to make all columns optional\n */\nexport type JoinLateralResult<\n T extends PickQuerySelectable,\n As extends string,\n Result extends Column.QueryColumns,\n JoinedRelations extends RelationsBase,\n RequireJoined,\n> = JoinAddSelectable<\n T,\n JoinResultSelectable<Result, As, JoinedRelations, RequireJoined>\n>;\n\n/**\n * Build `selectable` type for joined table.\n *\n * When `RequireJoined` parameter is false,\n * the result type of the joined table will be mapped to make all columns optional.\n *\n * Callback may override the joined table alias.\n *\n * The resulting selectable receives all joined table columns prefixed with the table name or alias,\n * and a star prefixed with the table name or alias to select all joined columns.\n */\nexport type JoinResultSelectable<\n // Interestingly, accepting T and inlining T['result'] adds a LOT (~823k) instantiations\n Result extends Column.QueryColumns,\n As extends string,\n JoinedRelations,\n RequireJoined,\n> = RequireJoined extends true\n ? {\n __selectable: {\n [K in '*' | (keyof Result & string) as `${As}.${K}`]: K extends '*'\n ? {\n as: As;\n column: ColumnsShape.MapToObjectColumn<Result>;\n }\n : {\n as: K;\n column: Result[K];\n };\n };\n relations: {\n [K in keyof JoinedRelations &\n string as `${As}.${K}`]: JoinedRelations[K];\n };\n }\n : {\n __selectable: {\n [K in '*' | (keyof Result & string) as `${As}.${K}`]: K extends '*'\n ? {\n as: As;\n column: ColumnsShape.MapToNullableObjectColumn<Result>;\n }\n : {\n as: K;\n column: Column.QueryColumnToNullable<Result[K]>;\n };\n };\n relations: {\n [K in keyof JoinedRelations &\n string as `${As}.${K}`]: JoinedRelations[K];\n };\n };\n\n// Replace the '__selectable' of the query with the given selectable.\ntype JoinAddSelectable<\n T extends PickQuerySelectable,\n Joined extends PickQuerySelectableRelations,\n> = {\n // is optimal\n [K in keyof T]: K extends '__selectable'\n ? T['__selectable'] & Joined['__selectable']\n : T[K];\n};\n\n/**\n * Map the first argument of `join` or `joinLateral` to a query type.\n *\n * `with` table arg is mapped into `QueryBase`,\n * query arg is returned as is,\n * relation name is replaced with a relation table.\n */\nexport type JoinArgToQuery<\n T extends PickQueryRelationsWithData,\n Arg extends JoinFirstArg<T>,\n> = Arg extends keyof T['withData']\n ? T['withData'][Arg] extends WithDataItem\n ? /**\n * Map the `with` table first argument of `join` or `joinLateral` to a query type.\n * Constructs `selectable` based on `with` table shape.\n */\n {\n [K in 'result' | '__as' | keyof T]: K extends '__as'\n ? T['withData'][Arg]['table']\n : K extends '__selectable'\n ? {\n [K in keyof T['withData'][Arg]['shape'] &\n string as `${T['withData'][Arg]['table']}.${K}`]: {\n as: K;\n column: T['withData'][Arg]['shape'][K];\n };\n }\n : K extends 'result'\n ? T['withData'][Arg]['shape']\n : K extends keyof T\n ? T[K]\n : never;\n }\n : never\n : Arg extends PickQuerySelectableResultAs\n ? Arg\n : Arg extends keyof T['relations']\n ? T['relations'][Arg]['query']\n : Arg extends JoinArgToQueryCallback\n ? ReturnType<Arg>\n : never;\n\ninterface JoinArgToQueryCallback {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (...args: any[]): IsQuery;\n}\n\n/**\n * Type of the `join` callback (not `joinLateral`).\n *\n * Receives a query builder that can access columns of both the main and the joined table.\n *\n * The query builder is limited to `or` and `where` methods only.\n *\n * Callback must return a query builder.\n */\nexport interface JoinCallback<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n> {\n (q: JoinQueryBuilder<T, JoinArgToQuery<T, Arg>>): IsQuery;\n}\n\nexport type JoinCallbackArgs<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n> = [cb?: JoinCallback<T, Arg> | true];\n\n/**\n * After getting a query from a sub-query callback,\n * join it to the main query in case it's a relation query.\n *\n * If it's not a relation query, it will be returned as is.\n *\n * @param q - main query object\n * @param sub - sub-query query object\n */\nexport const joinSubQuery = (q: ToSQLQuery, sub: ToSQLQuery): SubQueryForSql =>\n prepareSubQueryForSql(\n q as Query,\n (isRelationQuery(sub) ? sub.joinQuery(sub, q) : sub) as never,\n );\n\nexport const _joinReturningArgs = <\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n RequireJoined extends boolean,\n>(\n query: T,\n require: RequireJoined,\n first:\n | JoinFirstArg<never>\n // is used by `joinQueryChainHOF` in ORM\n | { _internalJoin: Query },\n args: JoinArgs<Query, JoinFirstArg<Query>>,\n forbidLateral?: boolean,\n): JoinItemArgs | undefined => {\n let joinKey: string | undefined;\n let joined: Query | undefined;\n let shape: Column.QueryColumns | undefined;\n let parsers: ColumnsParsers | undefined;\n let batchParsers: BatchParsers | undefined;\n let computeds: ComputedColumns | undefined;\n let joinSubQuery = false;\n let joinTo = query as unknown as Query;\n\n first = preprocessJoinArg(query, first as JoinFirstArg<never>) as Query;\n\n if (typeof first === 'object') {\n let isInternalJoin;\n if ('_internalJoin' in first) {\n isInternalJoin = true;\n first = first._internalJoin as JoinFirstArg<never>;\n }\n\n if (require && isQueryNone(first)) {\n return;\n }\n\n const q = first as Query;\n if (!isInternalJoin) {\n joinSubQuery = getIsJoinSubQuery(q);\n }\n\n joinKey = q.q.as || q.table;\n if (joinKey) {\n joined = q;\n shape = getShapeFromSelect(q, joinSubQuery && !!q.q.select);\n parsers = getQueryParsers(q);\n batchParsers = q.q.batchParsers;\n computeds = q.q.runtimeComputeds;\n\n if (joinSubQuery) {\n first = q.clone() as JoinFirstArg<Query>;\n (first as Query).shape = shape as never;\n }\n }\n } else {\n joinKey = first as string;\n\n const relation = query.relations[joinKey];\n if (relation) {\n joined = relation.query as Query;\n shape = getShapeFromSelect(relation.query as never);\n const r = prepareSubQueryForSql(query as never, relation.query as Query);\n parsers = getQueryParsers(r as unknown as Query);\n batchParsers = r.q.batchParsers;\n computeds = r.q.runtimeComputeds;\n } else {\n const i = joinKey.indexOf('.');\n if (i === -1) {\n const w = (query as unknown as PickQueryQ).q.withShapes?.[joinKey];\n shape = w?.shape;\n computeds = w?.computeds;\n // TODO batchParsers\n\n if (shape) {\n // clone the shape to mutate it below; in other cases the shape is newly created\n if (!require) shape = { ...shape };\n\n const arg = { parsers: {} as ColumnsParsers };\n for (const key in shape) {\n addColumnParserToQuery(arg, key, shape[key]);\n }\n }\n } else {\n const joinedRelKey = joinKey.slice(0, i);\n const joinedQuery = (query as unknown as PickQueryQ).q.joined?.[\n joinedRelKey\n ] as Query;\n joinTo = joinedQuery;\n joinKey = first = joinKey.slice(i + 1);\n const relation = joinedQuery.relations[first];\n joined = relation.query as Query;\n shape = getShapeFromSelect(relation.query as never);\n const r = prepareSubQueryForSql(\n query as never,\n relation.query as Query,\n );\n parsers = getQueryParsers(r as unknown as Query);\n batchParsers = r.q.batchParsers;\n computeds = r.q.runtimeComputeds;\n }\n }\n }\n\n const joinArgs = processJoinArgs(\n joinTo,\n first,\n args,\n joinSubQuery,\n shape,\n false,\n joinKey,\n forbidLateral,\n );\n\n if ('r' in joinArgs) {\n joinKey = getQueryAs(joinArgs.r as never);\n if (joined && joinKey !== getQueryAs(joined)) {\n joined = _clone(joined);\n joined.q.as = joinKey;\n }\n }\n\n if (require && 'r' in joinArgs && isQueryNone(joinArgs.r)) {\n return;\n } else if (joinKey && 's' in joinArgs && joinArgs.s) {\n const j = (\n 'j' in joinArgs\n ? (joinArgs.r ?? joinArgs.j)\n : 'r' in joinArgs\n ? joinArgs.r\n : joinArgs.q\n ) as Query;\n\n const jq = j.q;\n if (jq.select || !jq.selectAllColumns) {\n const { q } = query as unknown as PickQueryQ;\n\n // if 2nd argument callback is present, and it has select,\n // re-assign the columns shape from it.\n if ('r' in joinArgs && joinArgs.r) {\n joinArgs.c = shape = getShapeFromSelect(j, true);\n }\n\n if (joined) setObjectValueImmutable(q, 'joined', joinKey, joined);\n setObjectValueImmutable(q, 'joinedShapes', joinKey, shape);\n setObjectValueImmutable(q, 'joinedParsers', joinKey, getQueryParsers(j));\n\n if (jq.batchParsers) {\n setObjectValueImmutable(\n jq,\n 'joinedBatchParsers',\n joinKey,\n jq.batchParsers,\n );\n }\n\n setObjectValueImmutable(\n q,\n 'joinedComputeds',\n joinKey,\n jq.runtimeComputeds,\n );\n } else {\n addAllShapesAndParsers(\n query,\n joinKey,\n joined,\n shape,\n parsers,\n batchParsers,\n computeds,\n );\n }\n } else {\n addAllShapesAndParsers(\n query,\n joinKey,\n joined,\n shape,\n parsers,\n batchParsers,\n computeds,\n );\n }\n\n return joinArgs;\n};\n\nconst addAllShapesAndParsers = (\n query: unknown,\n joinKey?: string,\n joined?: PickQueryRelations,\n shape?: Column.QueryColumns,\n parsers?: ColumnsParsers,\n batchParsers?: BatchParsers,\n computeds?: ComputedColumns,\n) => {\n if (!joinKey) return;\n\n const { q } = query as PickQueryQ;\n\n if (joined) setObjectValueImmutable(q, 'joined', joinKey, joined);\n setObjectValueImmutable(q, 'joinedShapes', joinKey, shape);\n setObjectValueImmutable(q, 'joinedParsers', joinKey, parsers);\n\n if (batchParsers) {\n setObjectValueImmutable(q, 'joinedBatchParsers', joinKey, batchParsers);\n }\n\n setObjectValueImmutable(q, 'joinedComputeds', joinKey, computeds);\n};\n\n/**\n * Generic function to construct all JOIN queries.\n * Add a shape of the joined table into `joinedShapes`.\n * Add column parsers of the joined table into `joinedParsers`.\n * Add join data into `join` of the query data.\n *\n * @param query - query object to join to\n * @param require - true for INNER kind of JOIN\n * @param type - SQL of the JOIN kind: JOIN, LEFT JOIN, RIGHT JOIN, etc.\n * @param first - the first argument of join: join target\n * @param args - rest join arguments: columns to join with, or a callback\n */\nexport const _join = (\n query: PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n require: boolean,\n type: string,\n first:\n | JoinFirstArg<never>\n // is used by `joinQueryChainHOF` in ORM\n | { _internalJoin: Query },\n args: JoinArgs<Query, JoinFirstArg<Query>>,\n): never => {\n const joinArgs = _joinReturningArgs(query, require, first, args);\n if (!joinArgs) {\n return _queryNone(query) as never;\n }\n\n pushQueryValueImmutable(query as never, 'join', {\n type,\n args: joinArgs,\n });\n\n if ((query as unknown as PickQueryQ).q.type === 'delete') {\n throwIfJoinLateral(\n query as never,\n (query as unknown as PickQueryQ).q.type as string,\n );\n }\n\n return query as never;\n};\n\nexport const _joinLateralProcessArg = (\n q: Query,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n arg: JoinFirstArg<any>,\n cb: (\n q: JoinQueryBuilder<PickQuerySelectableShape, PickQuerySelectableResultAs>,\n ) => {\n table: string;\n result: Column.QueryColumns;\n },\n): Query => {\n let relation: RelationConfigBase | undefined;\n if (typeof arg === 'string') {\n relation = q.relations[arg];\n if (relation) {\n arg = _clone(relation.query);\n } else {\n const w = q.q.withShapes?.[arg];\n if (w) {\n const t = Object.create((q as unknown as Query).qb);\n t.table = arg;\n t.shape = w.shape;\n t.computeds = w.computeds;\n t.q = {\n ...t.q,\n shape: w.shape,\n };\n t.baseQuery = t;\n arg = t;\n }\n }\n }\n\n let result = resolveSubQueryCallback(\n arg as Query,\n cb as never,\n ) as unknown as Query;\n\n if (relation) {\n result = relation.joinQuery(\n result as unknown as Query,\n q as unknown as Query,\n ) as unknown as Query;\n }\n\n return result;\n};\n\n/**\n * Generic function to construct all JOIN LATERAL queries.\n * Adds a shape of the joined table into `joinedShapes`.\n * Adds column parsers of the joined table into `joinedParsers`.\n * Adds join data into `join` of the query data.\n *\n * @param self - query object to join to\n * @param type - SQL of the JOIN kind: JOIN or LEFT JOIN\n * @param joinQuery - join target: a query, or a relation name, or a `with` table name, or a callback returning a query.\n * @param as - alias of the joined table, it is set the join lateral happens when selecting a relation in `select`\n * @param innerJoinLateral - add `ON p.r IS NOT NULL` check to have INNER JOIN like experience when sub-selecting arrays.\n */\nexport const _joinLateral = (\n self: PickQueryResultRelationsWithDataReturnTypeShape,\n type: string,\n joinQuery: Query,\n as?: string,\n innerJoinLateral?: boolean,\n): string | undefined => {\n const query = self as Query;\n\n joinQuery = prepareSubQueryForSql(self as Query, joinQuery) as never;\n joinQuery.q.joinTo = query;\n\n as ||= getQueryAs(joinQuery);\n setObjectValueImmutable(\n query.q,\n 'joinedComputeds',\n as,\n joinQuery.q.runtimeComputeds,\n );\n\n const joinArgs = {\n l: joinQuery,\n a: as,\n i: innerJoinLateral,\n };\n\n const joinAs = (as || joinQuery.q.as || joinQuery.table) as string;\n\n const joinValue =\n joinQuery.q.returnType === 'value' ||\n joinQuery.q.returnType === 'valueOrThrow';\n\n let joinValueAs: string | undefined;\n let joinValueSelect: SelectItem | undefined;\n let existingValue: JoinValueDedupItem | undefined;\n\n if (joinValue) {\n const map = query.q.joinValueDedup\n ? new Map(query.q.joinValueDedup)\n : new Map<string, JoinValueDedupItem>();\n query.q.joinValueDedup = map;\n\n const select = joinQuery.q.select as SelectItem[];\n joinValueSelect = select[0];\n joinQuery.q.select = [];\n const dedupKey = getSqlText(joinQuery.toSQL());\n joinQuery.q.select = select;\n\n existingValue = map.get(dedupKey);\n if (existingValue) {\n joinValueAs = existingValue.a as string;\n } else {\n joinValueAs = joinAs;\n map.set(dedupKey, { q: joinQuery, a: as });\n }\n }\n\n if (!existingValue) {\n const joinedAs = getQueryAs(query);\n setObjectValueImmutable(\n joinQuery.q,\n 'joinedShapes',\n joinedAs,\n query.q.selectShape,\n );\n }\n\n const joinedShapeMayHaveNames =\n (joinQuery.table && joinQuery.q.joinedShapes?.[joinQuery.table]) ||\n joinQuery.q.joinedShapes?.[joinAs];\n\n // unname joined shape columns because the columns are aliased inside JOIN LATERAL\n let joinedShape: Column.QueryColumns | undefined;\n if (joinedShapeMayHaveNames) {\n joinedShape = {};\n for (const key in joinedShapeMayHaveNames) {\n const column = joinedShapeMayHaveNames[key];\n joinedShape[key] = column.data.name\n ? setColumnData(column as never, 'name', undefined as never)\n : column;\n }\n }\n\n const shape = joinedShape || getShapeFromSelect(joinQuery, true);\n\n setObjectValueImmutable(query.q, 'joinedShapes', joinAs, shape);\n\n if (joinValue) {\n setObjectValueImmutable(query.q, 'valuesJoinedAs', joinAs, joinValueAs);\n }\n\n setObjectValueImmutable(\n query.q,\n 'joinedParsers',\n joinValueAs || joinAs,\n getQueryParsers(joinQuery),\n );\n\n if (joinQuery.q.batchParsers) {\n setObjectValueImmutable(\n query.q,\n 'joinedBatchParsers',\n joinAs,\n joinQuery.q.batchParsers,\n );\n }\n\n if (joinValueAs) {\n if (existingValue) {\n existingValue.q.q.select = [\n {\n selectAs: {\n ...((existingValue.q.q.select![0] as SelectAs)\n .selectAs as SelectAsValue),\n [joinAs]: joinValueSelect as never,\n },\n },\n ];\n\n return joinValueAs;\n }\n\n joinQuery.q.select = [\n { selectAs: { [joinValueAs]: joinValueSelect as string } },\n ];\n }\n\n pushQueryValueImmutable(query, 'join', {\n type: `${type} LATERAL`,\n args: joinArgs,\n });\n\n return joinAs;\n};\n\nexport class QueryJoin {\n /**\n * ## Select relation\n *\n * Before joining a table, consider if selecting a relation is enough for your case:\n *\n * ```ts\n * // select users with profiles\n * // result type is Array<{ name: string, profile: Profile }>\n * await db.user.select('name', {\n * profile: (q) => q.profile,\n * });\n *\n * // select posts with counts of comments, filter and order by comments count\n * // result type is Array<Post & { commentsCount: number }>\n * await db.post\n * .select('*', {\n * commentsCount: (q) => q.comments.count(),\n * })\n * .where({ commentsCount: { gt: 10 } })\n * .order({ commentsCount: 'DESC' });\n *\n * // select authors with array of their book titles\n * // result type is Array<Author & { books: string[] }>\n * await db.author.select('*', {\n * books: (q) => q.books.pluck('title'),\n * });\n * ```\n *\n * Internally, such selects will use `LEFT JOIN LATERAL` to join a relation.\n * If you're loading users with profiles (one-to-one relation), and some users don't have a profile, `profile` property will have `NULL` for such users.\n * If you want to load only users that have profiles, and filter out the rest, add `.join()` method to the relation without arguments:\n *\n * ```ts\n * // load only users who have a profile\n * await db.user.select('*', {\n * profile: (q) => q.profile.join(),\n * });\n *\n * // load only users who have a specific profile\n * await db.user.select('*', {\n * profile: (q) => q.profile.join().where({ age: { gt: 20 } }),\n * });\n * ```\n *\n * You can also use this `.join()` method on the one-to-many relations, and records with empty array will be filtered out:\n *\n * ```ts\n * // posts that have no tags won't be loaded\n * // result type is Array<Post & { tags: Tag[] }>\n * db.post.select('*', {\n * tags: (q) => q.tags.join(),\n * });\n * ```\n *\n * # join\n *\n * `join` methods allows to join other tables, relations by name, [with](/guide/advanced-queries#with) statements, sub queries.\n *\n * All the `join` methods accept the same arguments, but returning type is different because with `join` it's guaranteed to load joined table, and with `leftJoin` the joined table columns may be `NULL` when no matching record was found.\n *\n * For the following examples, imagine you have a `User` table with `id` and `name`, and `Message` table with `id`, `text`, messages belongs to user via `userId` column:\n *\n * ```ts\n * export const UserTable = defineTable('user', (t) => ({\n * id: t.identity().primaryKey(),\n * name: t.text(),\n * })).relations((user) => ({\n * messages: user('id').hasMany(() => MessageTable('userId')),\n * }));\n *\n * export const MessageTable = defineTable('message', (t) => ({\n * id: t.identity().primaryKey(),\n * userId: t.integer(),\n * text: t.text(),\n * ...t.timestamps(),\n * })).relations((message) => ({\n * user: message('userId').belongsTo(() => UserTable('id')),\n * }));\n * ```\n *\n * `join` is a method for SQL `JOIN`, which is equivalent to `INNER JOIN`, `LEFT INNERT JOIN`.\n *\n * When no matching record is found, it will skip records of the main table.\n *\n * ### join relation\n *\n * When relations are defined between the tables, you can join them by a relation name.\n * Joined table can be references from `where` and `select` by a relation name.\n *\n * ```ts\n * const result = await db.user\n * .join('messages')\n * // after joining a table, you can use it in `where` conditions:\n * .where({ 'messages.text': { startsWith: 'Hi' } })\n * .select(\n * 'name', // name is User column, table name may be omitted\n * 'messages.text', // text is the Message column, and the table name is required\n * );\n *\n * // result has the following type:\n * const ok: { name: string; text: string }[] = result;\n * ```\n *\n * The first argument can also be a callback, where instead of relation name as a string you're picking it as a property of `q`.\n * In such a way, you can alias the relation with `as`, add `where` conditions, use other query methods.\n *\n * ```ts\n * const result = await db.user.join((q) =>\n * q.messages.as('m').where({ text: 'some text' }),\n * );\n * ```\n *\n * Optionally, you can pass a second callback argument, it makes `on` and `orOn` methods available.\n *\n * But remember that when joining a relation, the relevant `ON` conditions are already handled automatically.\n *\n * ```ts\n * const result = await db.user.join(\n * (q) => q.messages.as('m'),\n * (q) =>\n * q\n * .on('messages.text', 'user.name') // additionally, match message with user name\n * .where({ text: 'some text' }), // you can add `where` in a second callback as well.\n * );\n * ```\n *\n * ### join a relation of the joined\n *\n * After joining a relation or a table:\n *\n * ```ts\n * db.post.join('comments');\n *\n * db.post.join(() => db.comment);\n * ```\n *\n * You can join a relation of that joined table:\n *\n * ```ts\n * db.post.join('comments').join('comments.author');\n *\n * db.post.join(() => db.comment).join('comment.author');\n * ```\n *\n * Note that in the first case it's `comments` - a relation name, while in the second case it is a table name.\n *\n * ### joins deduplication\n *\n * When joining the same table with the same condition more than once, duplicated joins will be ignored:\n *\n * ```ts\n * // joining a relation\n * db.post.join('comments').join('comments');\n *\n * // joining a table with a condition\n * db.post\n * .join('comments', 'comments.postId', 'post.id')\n * .join('comments', 'comments.postId', 'post.id');\n * ```\n *\n * Both queries will produce SQL with only 1 join\n *\n * ```sql\n * SELECT * FROM post JOIN comments ON comments.postId = post.id\n * ```\n *\n * However, this is only possible if the join has no dynamic values:\n *\n * ```ts\n * db.post\n * .join('comments', (q) => q.where({ rating: { gt: 5 } }))\n * .join('comments', (q) => q.where({ rating: { gt: 5 } }));\n * ```\n *\n * Both joins above have the same `{ gt: 5 }`, but still, the `5` is a dynamic value and in this case joins will be duplicated,\n * resulting in a database error.\n *\n * ### select full joined records\n *\n * `select` supports selecting a full record of a previously joined table by passing a table name with `.*` at the end:\n *\n * ```ts\n * const result = await db.book.join('author').select('title', {\n * author: 'author.*',\n * });\n *\n * // result has the following type:\n * const ok: {\n * // title of the book\n * title: string;\n * // a full author record is included:\n * author: { id: number; name: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * It works fine for `1:1` (`belongsTo`, `hasOne`) relations, but it may have an unexpected result for `1:M` or `M:M` (`hasMany`, `hasAndBelongsToMany`) relations.\n * For any kind of relation, it results in one main table record with data of exactly one joined table record, i.e. when selecting in this way, the records **won't** be collected into arrays.\n *\n * ```ts\n * const result = await db.user\n * .join('messages')\n * .where({ 'messages.text': { startsWith: 'Hi' } })\n * .select('name', { messages: 'messages.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included:\n * messages: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * Because it's a one-to-many relation, one user has many messages, the user data will be duplicated for different messages data:\n *\n * | name | msg |\n * | ------ | ------------------------------ |\n * | user 1 | `{ id: 1, text: 'message 1' }` |\n * | user 1 | `{ id: 2, text: 'message 2' }` |\n * | user 1 | `{ id: 3, text: 'message 3' }` |\n *\n * ### join table\n *\n * If relation wasn't defined, provide a `db.table` instance and specify columns for the join.\n * Joined table can be references from `where` and `select` by a table name.\n *\n * ```ts\n * db.user\n * .join(db.message, 'userId', 'user.id')\n * .where({ 'message.text': { startsWith: 'Hi' } })\n * .select('name', 'message.text');\n * ```\n *\n * The name of the joining table can be omitted, but not the name of the main table:\n *\n * ```ts\n * db.user.join(db.message, 'userId', 'user.id');\n * ```\n *\n * Joined table can have an alias for referencing it further:\n *\n * ```ts\n * db.user\n * .join(db.message.as('m'), 'message.userId', 'user.id')\n * .where({ 'm.text': { startsWith: 'Hi' } })\n * .select('name', 'm.text');\n * ```\n *\n * Joined table can be selected as an object as well as the relation join above:\n *\n * ```ts\n * const result = await db.user\n * .join(db.message.as('m'), 'message.userId', 'user.id')\n * .where({ 'm.text': { startsWith: 'Hi' } })\n * .select('name', { msg: 'm.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included as msg:\n * msg: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * You can provide a custom comparison operator\n *\n * ```ts\n * db.user.join(db.message, 'userId', '!=', 'user.id');\n * ```\n *\n * Join can accept raw SQL for the `ON` part of join:\n *\n * ```ts\n * db.user.join(\n * db.message,\n * // `sql` can be imported from your table factory file\n * sql`lower(\"message\".\"text\") = lower(\"user\".\"name\")`,\n * );\n * ```\n *\n * Join can accept raw SQL instead of columns:\n *\n * ```ts\n * db.user.join(\n * db.message,\n * sql`lower(\"message\".\"text\")`,\n * sql`lower(\"user\".\"name\")`,\n * );\n *\n * // with operator:\n * db.user.join(\n * db.message,\n * sql`lower(\"message\".\"text\")`,\n * '!=',\n * sql`lower(\"user\".\"name\")`,\n * );\n * ```\n *\n * To join based on multiple columns, you can provide an object where keys are joining table columns, and values are main table columns or a raw SQL:\n *\n * ```ts\n * db.user.join(db.message, {\n * 'message.userId': 'user.id',\n *\n * // joined table name may be omitted\n * userId: 'user.id',\n *\n * // value can be a raw SQL expression:\n * text: sql`lower(\"user\".\"name\")`,\n * });\n * ```\n *\n * Join all records without conditions by providing `true`:\n *\n * ```ts\n * db.user.join(db.message, true);\n * ```\n *\n * Join methods can accept a callback with a special query builder that has `on` and `orOn` methods for handling advanced cases:\n *\n * ```ts\n * db.user.join(\n * db.message,\n * (q) =>\n * q\n * .on('message.userId', 'user.id')\n * // joined table name may be omitted\n * .on('userId', 'user.id')\n * // operator can be specified:\n * .on('userId', '!=', 'user.id')\n * // operator can be specified with table names as well:\n * .on('message.userId', '!=', 'user.id')\n * // `.orOn` takes the same arguments as `.on` and acts like `.or`:\n * .on('userId', 'user.id') // where message.userId = user.id\n * .orOn('text', 'user.name'), // or message.text = user.name\n * );\n * ```\n *\n * Column names in the where conditions are applied for the joined table, but you can specify a table name to add a condition for the main table.\n *\n * ```ts\n * db.user.join(db.message, (q) =>\n * q\n * .on('userId', 'user.id')\n * .where({\n * // not prefixed column name is for joined table:\n * text: { startsWith: 'hello' },\n * // specify a table name to set condition on the main table:\n * 'user.name': 'Bob',\n * })\n * // id is a column of a joined table Message\n * .whereIn('id', [1, 2, 3])\n * // condition for id of a user\n * .whereIn('user.id', [4, 5, 6]),\n * );\n * ```\n *\n * The query above will generate the following SQL (simplified):\n *\n * ```sql\n * SELECT * FROM \"user\"\n * JOIN \"message\"\n * ON \"message\".\"userId\" = \"user\".\"id\"\n * AND \"message\".\"text\" ILIKE 'hello%'\n * AND \"user\".\"name\" = 'Bob'\n * AND \"message\".\"id\" IN (1, 2, 3)\n * AND \"user\".\"id\" IN (4, 5, 6)\n * ```\n *\n * The join argument can be a query with `select`, `where`, and other methods. In such case, it will be handled as a sub query:\n *\n * ```ts\n * db.user.join(\n * db.message\n * .select('id', 'userId', 'text')\n * .where({ text: { startsWith: 'Hi' } })\n * .as('t'),\n * 'userId',\n * 'user.id',\n * );\n * ```\n *\n * It will produce such SQL:\n *\n * ```sql\n * SELECT * FROM \"user\"\n * JOIN (\n * SELECT \"t\".\"id\", \"t\".\"userId\", \"t\".\"text\"\n * FROM \"message\" AS \"t\"\n * ) \"t\" ON \"t\".\"userId\" = \"user\".\"id\"\n * ```\n *\n * ## implicit join lateral\n *\n * `JOIN`'s source expression that comes before `ON` cannot access other tables, but in some cases this may be needed.\n *\n * For example, let's consider joining last 10 messages of a user:\n *\n * ```ts\n * await db.user.join('messages', (q) => q.order({ createdAt: 'DESC' }).limit(10));\n * ```\n *\n * When the `join`'s callback returns a more complex query than the one that simply applies certain conditions,\n * it will implicitly generate a `JOIN LATERAL` SQL query, as the following:\n *\n * ```sql\n * SELECT *\n * FROM \"user\"\n * JOIN LATERAL (\n * SELECT *\n * FROM \"message\" AS \"messages\"\n * WHERE \"message\".\"userId\" = \"user\".\"id\"\n * ORDER BY \"message\".\"createdAt\" DESC\n * LIMIT 10\n * ) \"messages\" ON true\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n join<\n T extends PickQuerySelectableShapeRelationsWithDataAsResultReturnType,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallbackArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Cb | JoinArgs<T, Arg>\n ): JoinResultFromArgs<T, Arg, Cb, true, true> {\n return _join(\n _clone(this),\n true,\n 'JOIN',\n arg as never,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\n }\n\n /**\n * `leftJoin` is a method for SQL `LEFT JOIN`, which is equivalent to `OUTER JOIN`, `LEFT OUTER JOIN`.\n *\n * When no matching record is found, it will fill joined table columns with `NULL` values in the result rows.\n *\n * Works just like `join`, except for result type that may have `null`:\n *\n * ```ts\n * const result = await db.user\n * .leftJoin('messages')\n * .select('name', 'messages.text');\n *\n * // the same query, but joining table explicitly\n * const result2: typeof result = await db.user\n * .leftJoin(db.message, 'userId', 'user.id')\n * .select('name', 'message.text');\n *\n * // result has the following type:\n * const ok: { name: string; text: string | null }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n leftJoin<\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallbackArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Cb | JoinArgs<T, Arg>\n ): JoinResultFromArgs<T, Arg, Cb, false, true> {\n return _join(\n _clone(this),\n false,\n 'LEFT JOIN',\n arg as never,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\n }\n\n /**\n * `rightJoin` is a method for SQL `RIGHT JOIN`, which is equivalent to `RIGHT OUTER JOIN`.\n *\n * Takes the same arguments as `json`.\n *\n * It will load all records from the joining table, and fill the main table columns with `null` when no match is found.\n *\n * The columns of the table you're joining to are becoming nullable when using `rightJoin`.\n *\n * ```ts\n * const result = await db.user\n * .rightJoin('messages')\n * .select('name', 'messages.text');\n *\n * // even though name is not a nullable column, it becomes nullable after using rightJoin\n * const ok: { name: string | null; text: string }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n rightJoin<\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallbackArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Cb | JoinArgs<T, Arg>\n ): JoinResultFromArgs<T, Arg, Cb, true, false> {\n return _join(\n _clone(this),\n true,\n 'RIGHT JOIN',\n arg as never,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\n }\n\n /**\n * `fullJoin` is a method for SQL `FULL JOIN`, which is equivalent to `FULL OUTER JOIN`.\n *\n * Takes the same arguments as `json`.\n *\n * It will load all records from the joining table, both sides of the join may result in `null` values when there is no match.\n *\n * All columns become nullable after using `fullJoin`.\n *\n * ```ts\n * const result = await db.user\n * .rightJoin('messages')\n * .select('name', 'messages.text');\n *\n * // all columns can be null\n * const ok: { name: string | null; text: string | null }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n fullJoin<\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallbackArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Cb | JoinArgs<T, Arg>\n ): JoinResultFromArgs<T, Arg, Cb, false, false> {\n return _join(\n _clone(this),\n false,\n 'FULL JOIN',\n arg as never,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\n }\n\n /**\n * `joinLateral` allows joining a table with a sub-query that can reference the main table of current query and the other joined tables.\n *\n * First argument is the other table you want to join, or a name of relation, or a name of `with` defined table.\n *\n * Second argument is a callback where you can reference other tables using `on` and `orOn`, select columns, do `where` conditions, and use any other query methods to build a sub-query.\n *\n * Note that the regular `join` will also generate `JOIN LATERAL` SQL expression when the query returned from callback is complex enough (see the bottom of {@link join} description).\n *\n * ```ts\n * // joinLateral messages relation, alias it as `m`\n * // without aliasing you can refer to the message by a table name\n * db.user\n * .joinLateral(db.message.as('m'), (q) =>\n * q\n * // select message columns\n * .select('text')\n * // join the message to the user, column names can be prefixed with table names\n * .on('authorId', 'user.id')\n * // message columns are available without prefixing,\n * // outer table columns are available with a table name\n * .where({ text: 'some text', 'user.name': 'name' })\n * .order({ createdAt: 'DESC' }),\n * )\n * // only selected message columns are available in select and where\n * .select('id', 'name', 'm.text')\n * .where({ 'm.text': messageData.text });\n * ```\n *\n * As well as simple `join`, `joinLateral` can select an object of full joined record:\n *\n * ```ts\n * // join by relation name\n * const result = await db.user\n * .joinLateral('messages', (q) => q.as('message')) // alias to 'message'\n * .select('name', { message: 'message.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included:\n * message: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * `message` can be aliased withing the `select` as well as in case of a simple `join`:\n *\n * ```ts\n * // join by relation name\n * const result = await db.user\n * .joinLateral('messages', (q) => q.as('message')) // alias to 'message'\n * .select('name', { msg: 'message.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included as msg:\n * msg: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param cb - callback for shaping the joined query\n */\n joinLateral<\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n Arg extends JoinFirstArg<T>,\n As extends string,\n Result extends Column.QueryColumns,\n JoinedRelations extends RelationsBase,\n >(\n this: T,\n arg: Arg,\n cb: (q: JoinQueryBuilder<T, JoinArgToQuery<T, Arg>>) => {\n __as: As;\n result: Result;\n relations: JoinedRelations;\n },\n ): JoinLateralResult<T, As, Result, JoinedRelations, true> {\n const q = _clone(this);\n _joinLateral(\n q,\n 'JOIN',\n _joinLateralProcessArg(q, arg as never, cb as never),\n );\n return q as never;\n }\n\n /**\n * The same as {@link joinLateral}, but when no records found for the join it will result in `null`:\n *\n * ```ts\n * const result = await db.user\n * .leftJoinLateral('messages', (q) => q.as('message'))\n * .select('name', 'message.text');\n *\n * // result has the following type:\n * const ok: { name: string; text: string | null }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param cb - callback for shaping the joined query\n */\n leftJoinLateral<\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n Arg extends JoinFirstArg<T>,\n As extends string,\n Result extends Column.QueryColumns,\n JoinedRelations extends RelationsBase,\n >(\n this: T,\n arg: Arg,\n cb: (q: JoinQueryBuilder<T, JoinArgToQuery<T, Arg>>) => {\n __as: As;\n result: Result;\n relations: JoinedRelations;\n },\n ): JoinLateralResult<T, As, Result, JoinedRelations, false> {\n const q = _clone(this);\n _joinLateral(\n q,\n 'LEFT JOIN',\n _joinLateralProcessArg(q, arg as never, cb as never),\n );\n return q as never;\n }\n\n /**\n * This method may be useful\n * for combining with [createForEachFrom](/guide/create-update-delete.html#createForEachFrom-insertForEachFrom).\n *\n * `createForEachFrom` creates multiple record based on a selecting query:\n *\n * ```sql\n * INSERT INTO t1(c1, c2)\n * SELECT c1, c2 FROM t2\n * ```\n *\n * Such a query inserts one record per one selected record.\n *\n * Use `joinData` to insert a multiplication of selected records and the provided data.\n *\n * ```ts\n * const data = [{ column2: 'one' }, { column2: 'two' }, { column2: 'three' }];\n *\n * await db.table.createForEachFrom(\n * db.otherTable\n * .joinData('data', (t) => ({ column2: t.text() }), data)\n * .select('otherTable.column1', 'data.column2'),\n * );\n * ```\n *\n * If the query on the other table returns 2 records,\n * and the data array contains 3 records, then 2 \\* 3 = 6 will be inserted - every combination.\n *\n * Joined data values are available in `where` just as usual.\n *\n * @param as - alias to reference joined columns\n * @param fn - declare column types\n * @param data - array of data to join\n */\n joinData<\n T extends PickQuerySelectableColumnTypes,\n As extends string,\n RecordType extends Column.QueryColumnsInit,\n Item extends ColumnsShape.Input<RecordType>,\n >(\n this: T,\n as: As,\n fn: (types: T['columnTypes']) => RecordType,\n data: Item[],\n ): {\n [K in keyof T]: K extends '__selectable'\n ? T['__selectable'] & {\n [K in keyof RecordType & string as `${As}.${K}`]: {\n as: K;\n column: RecordType[K];\n };\n }\n : T[K];\n } {\n const shape = fn(this.columnTypes);\n\n const query = _clone(this);\n\n const parsers = Object.fromEntries(\n Object.entries(shape).map(([key, column]) => [\n key,\n (column as Column)._parse,\n ]),\n );\n\n const { q } = query;\n setObjectValueImmutable(q, 'joinedShapes', as, shape);\n setObjectValueImmutable(q, 'joinedParsers', as, parsers);\n\n pushOrNewArrayToObjectImmutable(q, 'join', {\n type: 'JOIN',\n args: { a: as, c: shape, d: data },\n });\n\n return query as never;\n }\n}\n\n// Arguments of `on` and `orOn` methods inside `join` callback.\n// Takes a pair of columns to check them for equality, or a pair of columns separated with an operator such as '!='.\ntype OnArgs<S extends QuerySelectable> =\n | [leftColumn: keyof S, rightColumn: keyof S]\n | [leftColumn: keyof S, op: string, rightColumn: keyof S];\n\n// Construct an object for `ON` type of where condition.\nconst makeOnItem = (\n joinTo: PickQuerySelectable,\n joinFrom: PickQuerySelectable,\n args: OnArgs<QuerySelectable>,\n) => ({\n ON: {\n joinFrom,\n from: args[0],\n joinTo,\n to: args.length === 2 ? args[1] : args[2],\n op: args.length === 2 ? undefined : args[1],\n },\n});\n\n// Add `ON` statement.\nexport const pushQueryOnForOuter = <T extends PickQuerySelectable>(\n q: T,\n joinFrom: PickQuerySelectable,\n joinTo: PickQuerySelectable,\n leftColumn: string,\n rightColumn: string,\n): T => {\n return pushQueryValueImmutable(q as never, 'and', {\n ON: {\n joinFrom: joinTo,\n from: leftColumn,\n joinTo: joinFrom,\n to: rightColumn,\n useOuterAliases: true,\n },\n }) as never;\n};\n\n// Add `ON` statement.\nexport const pushQueryOn = <T extends PickQuerySelectable>(\n q: T,\n joinFrom: PickQuerySelectable,\n joinTo: PickQuerySelectable,\n ...on: OnArgs<QuerySelectable>\n): T => {\n return pushQueryValueImmutable(\n q as never,\n 'and',\n makeOnItem(joinFrom, joinTo, on),\n ) as never;\n};\n\n// Add `ON` statement separated from previous statements with `OR`.\nexport const pushQueryOrOn = <T extends PickQuerySelectable>(\n q: T,\n joinFrom: PickQuerySelectable,\n joinTo: PickQuerySelectable,\n ...on: OnArgs<QuerySelectable>\n) => {\n return pushQueryValueImmutable(q as never, 'or', [\n makeOnItem(joinFrom, joinTo, on),\n ]);\n};\n\n// Used by the ORM to join relations.\n// Adds a shape of relation to the `joinedShapes`, and adds an `on` statement.\nexport const addQueryOn = <T extends PickQuerySelectable>(\n query: T,\n joinFrom: PickQuerySelectable,\n joinTo: PickQuerySelectable,\n ...args: OnArgs<QuerySelectable>\n): T => {\n const cloned = _clone(query);\n\n const { q } = cloned;\n\n setObjectValueImmutable(\n q,\n 'joinedShapes',\n ((joinFrom as unknown as PickQueryQ).q.as ||\n (joinFrom as PickQueryTable).table) as string,\n (joinFrom as unknown as PickQueryQ).q.selectShape,\n );\n\n return pushQueryOn(cloned, joinFrom, joinTo, ...args) as never;\n};\n\n// To join record based on a value inside their json columns\ntype OnJsonPathEqualsArgs<S extends QuerySelectable> = [\n leftColumn: keyof S,\n leftPath: string,\n rightColumn: keyof S,\n rightPath: string,\n];\n\n/**\n * Mutative {@link OnMethods.prototype.on}\n */\nexport const _queryJoinOn = <T extends PickQuerySelectable>(\n q: T,\n args: OnArgs<T['__selectable']>,\n): T => {\n return pushQueryOn(\n q,\n (q as unknown as PickQueryQ).q.joinTo as unknown as PickQuerySelectable,\n q,\n ...args,\n );\n};\n\n/**\n * Mutative {@link OnMethods.prototype.orOn}\n */\nexport const _queryJoinOrOn = <T extends PickQuerySelectable>(\n q: T,\n args: OnArgs<T['__selectable']>,\n): T => {\n return pushQueryOrOn(\n q,\n (q as unknown as PickQueryQ).q.joinTo as unknown as PickQuerySelectable,\n q,\n ...args,\n ) as unknown as T;\n};\n\n/**\n * Mutative {@link OnMethods.prototype.onJsonPathEquals}\n */\nexport const _queryJoinOnJsonPathEquals = <T extends PickQuerySelectable>(\n q: T,\n args: OnJsonPathEqualsArgs<T['__selectable']>,\n): T => {\n return pushQueryValueImmutable(q as never, 'and', {\n ON: args,\n }) as unknown as T;\n};\n\n/**\n * Argument of join callback.\n * It is a query object of table that you're joining, with ability to select main table's columns.\n * Adds {@link OnMethods.prototype.on} method and similar to the query.\n */\nexport type JoinQueryBuilder<\n T extends PickQuerySelectableShape,\n J extends PickQuerySelectableResultAs,\n> = {\n [K in keyof J | keyof OnMethods]: K extends '__selectable'\n ? SelectableFromShape<J['result'], J['__as']> &\n Omit<T['__selectable'], keyof T['shape']>\n : K extends keyof OnMethods\n ? OnMethods[K]\n : K extends keyof J\n ? J[K]\n : never;\n};\n\nexport class OnMethods {\n /**\n * Use `on` to specify columns to join records.\n *\n * ```ts\n * q\n * .on('message.userId', 'user.id')\n * // joined table name may be omitted\n * .on('userId', 'user.id')\n * // operator can be specified:\n * .on('userId', '!=', 'user.id')\n * // operator can be specified with table names as well:\n * .on('message.userId', '!=', 'user.id')\n * ```\n *\n * @param args - columns to join with\n */\n on<T extends PickQuerySelectable>(\n this: T,\n ...args: OnArgs<T['__selectable']>\n ): T {\n return _queryJoinOn(_clone(this) as never, args);\n }\n\n /**\n * Works as {@link on}, but the added conditions will be separated from previous with `OR`.\n *\n * @param args - columns to join with\n */\n orOn<T extends PickQuerySelectable>(\n this: T,\n ...args: OnArgs<T['__selectable']>\n ): T {\n return _queryJoinOrOn(_clone(this) as never, args);\n }\n\n /**\n * Use `onJsonPathEquals` to join record based on a field of their JSON column:\n *\n * ```ts\n * db.table.join(db.otherTable, (q) =>\n * // '$.key' is a JSON path\n * q.onJsonPathEquals('otherTable.data', '$.key', 'table.data', '$.key'),\n * );\n * ```\n *\n * @param args - columns and JSON paths to join with.\n */\n onJsonPathEquals<T extends PickQuerySelectable>(\n this: T,\n ...args: OnJsonPathEqualsArgs<T['__selectable']>\n ): T {\n return _queryJoinOnJsonPathEquals(_clone(this) as never, args);\n }\n}\n","import { Column } from '../../../columns/column';\nimport { HookPurpose } from '../../extra-features/hooks/hooks.sql';\nimport { IsQuery, Query } from '../../query';\nimport { QueryAfterHook } from '../../query-data';\n\nexport interface HasCteHooks {\n cteHooks?: CteHooks;\n}\n\nexport interface CteHooks {\n hasSelect?: boolean;\n tableHooks?: CteTableHooks;\n ensureCount?: EnsureCount;\n}\n\nexport interface EnsureCount {\n [cteName: string]: EnsureCountItem;\n}\n\nexport type EnsureCountItem =\n | {\n count: number;\n }\n | {\n jsonNotNull: string;\n };\n\nexport interface CteTableHooks {\n [K: string]: CteTableHook;\n}\n\nexport interface CteTableHook {\n table: string;\n shape: Column.Shape.Data;\n tableHook: TableHook;\n throwOnNotFound?: boolean;\n}\n\nexport interface TableHook {\n hookPurpose?: HookPurpose;\n select?: HookSelect;\n afterCreate?: QueryAfterHook[];\n afterUpdate?: QueryAfterHook[];\n afterSave?: QueryAfterHook[];\n afterDelete?: QueryAfterHook[];\n afterCreateCommit?: QueryAfterHook[];\n afterUpdateCommit?: QueryAfterHook[];\n afterSaveCommit?: QueryAfterHook[];\n afterDeleteCommit?: QueryAfterHook[];\n}\n\nexport type HookSelect = Map<string, HookSelectValue>;\n\nexport interface HookSelectValue {\n select: string | { sql: string };\n as?: string;\n temp?: string;\n onAs?: ((as: string) => void)[];\n notLoaded?: boolean;\n}\n\nexport interface HasTableHook {\n tableHook?: TableHook;\n}\n\nexport interface HasHookSelect {\n // additional columns to select for `after` hooks\n hookSelect?: HookSelect;\n}\n\nexport const _addToHookSelect = (\n query: IsQuery,\n selects: string[],\n notLoaded?: boolean,\n) => {\n const { q } = query as Query;\n const map: HookSelect = (q.hookSelect = new Map(q.hookSelect));\n for (const key of selects) {\n const item = map.get(key) || { select: key };\n map.set(key, notLoaded ? { ...item, notLoaded } : item);\n }\n};\n\nexport const _addToHookSelectWithTable = (\n query: IsQuery,\n selects: string[],\n table: string,\n) => {\n const { q } = query as Query;\n const map: HookSelect = (q.hookSelect = new Map(q.hookSelect));\n for (const column of selects) {\n map.set(column, { select: `${table}.${column}` });\n }\n};\n","import { QueryData } from '../../query-data';\n\nexport const setSelectRelation = (q: QueryData) => {\n q.selectRelation = true;\n};\n","import {\n addParserForRawExpression,\n BatchParser,\n BatchParserPathEntry,\n getQueryParsers,\n getValueParser,\n setParserToQuery,\n} from '../../query-columns/query-column-parsers';\nimport { parseRecord } from '../../then/then';\nimport {\n RecordString,\n RecordUnknown,\n setObjectValueImmutable,\n spreadObjectValues,\n} from '../../../utils';\nimport {\n Column,\n internalSchemaConfig,\n JSONTextColumn,\n setColumnData,\n UnknownColumn,\n} from '../../../columns';\nimport { processComputedBatches } from '../../extra-features/computed/computed';\nimport { isQueryNone } from '../../extra-features/none/none';\nimport { cloneQueryBaseUnscoped } from '../wrap/wrap';\nimport { prepareSubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { RawSql } from '../../expressions/raw-sql';\nimport { SelectArg, SelectAsArg, SelectSelf } from './select';\nimport { _joinLateral } from '../join/join';\nimport {\n PickQueryQ,\n PickQueryQAndInternal,\n PickQuerySelectable,\n} from '../../pick-query-types';\nimport {\n Expression,\n isExpression,\n SelectableOrExpression,\n} from '../../expressions/expression';\nimport { getFullColumnTable, pushQueryArrayImmutable } from '../../query.utils';\nimport { IsQuery, Query, QueryReturnType } from '../../query';\nimport { NotFoundError } from '../../errors';\nimport { finalizeNestedHookSelect } from '../../extra-features/hooks/hooks';\nimport { applyBatchTransforms } from '../../extra-features/data-transform/transform';\nimport { resolveSubQueryCallback } from '../../internal-features/sub-query/sub-query';\nimport { isRelationQuery } from '../../relations';\nimport { _copyQueryAliasToQuery } from '../as/as';\nimport { _addToHookSelect, _addToHookSelectWithTable } from './hook-select';\nimport { SelectAsValue, SelectItem } from './select.sql';\nimport { pushQueryValueImmutable, QueryData } from '../../query-data';\nimport { ToSQLQuery } from '../../sql/to-sql';\nimport { setSelectRelation } from '../../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.qb';\nimport { _getSelectableColumn } from '../get/get.utils';\n\n// Add parsers when selecting a full joined table by name or alias.\n// It always selects a single record, not array, it's documented.\nconst addParsersForSelectJoinedWildcard = (\n q: PickQueryQ,\n arg: string,\n as: string = arg,\n) => {\n const parsers = q.q.joinedParsers?.[arg];\n if (parsers) {\n setParserToQuery(q.q, as, (row) => parseRecord(parsers, row));\n }\n\n const batchParsers = q.q.joinedBatchParsers?.[arg];\n if (batchParsers) {\n pushQueryArrayImmutable(\n q,\n 'batchParsers',\n batchParsers.map((x) => ({\n path: [{ key: as as string, returnType: 'one' }, ...x.path],\n fn: x.fn,\n })),\n );\n }\n};\n\nexport interface QueryBatchResult {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parent: any;\n key: PropertyKey;\n}\n\n// add parser for a single key-value pair of selected object\nexport const addParserForSelectItem = <T extends PickQuerySelectable>(\n query: T,\n as: string | undefined,\n key: string,\n arg: SelectableOrExpression<T> | Query,\n columnAlias?: string,\n joinQuery?: boolean,\n): string | Expression | Query | undefined => {\n if (typeof arg === 'object') {\n const { q } = arg as Query;\n\n if (q.batchParsers) {\n pushQueryArrayImmutable(\n query as unknown as Query,\n 'batchParsers',\n q.batchParsers.map((bp) => ({\n path: [{ key, returnType: q.returnType }, ...bp.path],\n fn: bp.fn,\n })),\n );\n }\n\n const parsers = isExpression(arg)\n ? undefined\n : getQueryParsers(arg as Query);\n\n if (\n parsers ||\n q.hookSelect ||\n q.transform ||\n q.returnType === 'oneOrThrow' ||\n q.returnType === 'valueOrThrow' ||\n q.returnType === 'one' ||\n q.returnType === 'value'\n ) {\n pushQueryValueImmutable(query as unknown as Query, 'batchParsers', {\n path: [{ key, returnType: q.returnType }],\n fn: (path, queryResult) => {\n const { rows } = queryResult;\n const originalReturnType = q.returnType || 'all';\n let returnType = originalReturnType;\n const { hookSelect } = q;\n const batches: QueryBatchResult[] = [];\n\n if (returnType === 'value' || returnType === 'valueOrThrow') {\n if (hookSelect) {\n batches.push = (item) => {\n // if the item has no key, it means value return was implicitly turned into 'one' return,\n // happens when getting a computed column\n if (!(key in item)) {\n returnType = returnType === 'value' ? 'one' : 'oneOrThrow';\n }\n batches.push = Array.prototype.push;\n return batches.push(item);\n };\n }\n }\n\n collectNestedSelectBatches(batches, rows, path);\n\n switch (returnType) {\n case 'all': {\n if (parsers) {\n for (const { data } of batches) {\n for (const one of data) {\n parseRecord(parsers, one);\n }\n }\n }\n break;\n }\n case 'one':\n case 'oneOrThrow': {\n if (parsers) {\n if (returnType === 'one') {\n for (const batch of batches) {\n if (batch.data) parseRecord(parsers, batch.data);\n else batch.parent[batch.key] = batch.data = undefined; // null to undefined\n }\n } else {\n for (const { data } of batches) {\n if (!data) throw new NotFoundError(arg as Query);\n parseRecord(parsers, data);\n }\n }\n } else if (returnType === 'one') {\n for (const batch of batches) {\n if (!batch.data)\n batch.parent[batch.key] = batch.data = undefined; // null to undefined\n }\n } else {\n for (const { data } of batches) {\n if (!data) throw new NotFoundError(arg as Query);\n }\n }\n\n if (hookSelect) {\n for (const batch of batches) {\n batch.data = [batch.data];\n }\n }\n\n break;\n }\n case 'pluck': {\n const parse = parsers?.pluck;\n if (parse) {\n for (const { data } of batches) {\n for (let i = 0; i < data.length; i++) {\n (data as unknown as RecordUnknown)[i] = parse(data[i]);\n }\n }\n }\n\n // not transforming data for hookSelect because it's set to load 'all' elsewhere for this case\n\n break;\n }\n case 'value':\n case 'valueOrThrow': {\n const data = (q.getColumn as Column.Pick.Data | undefined)?.data;\n const notNullable = !data?.isNullable;\n const valueToArray = data?.valueToArray;\n\n const parse = getValueParser(parsers);\n if (parse) {\n if (returnType === 'value') {\n if (valueToArray) {\n for (const item of batches) {\n item.parent[item.key] = item.data = item.data\n ? item.data[0] === null\n ? null\n : parse(item.data[0])\n : q.notFoundDefault;\n }\n } else {\n for (const item of batches) {\n item.parent[item.key] = item.data =\n item.data === null\n ? q.notFoundDefault\n : parse(item.data);\n }\n }\n } else {\n if (valueToArray) {\n for (const item of batches) {\n if (!item.data) {\n throw new NotFoundError(arg as Query);\n }\n\n item.parent[item.key] = item.data =\n item.data[0] === null ? null : parse(item.data[0]);\n }\n } else {\n for (const item of batches) {\n if (notNullable && item.data === null) {\n throw new NotFoundError(arg as Query);\n }\n\n item.parent[item.key] = item.data = parse(item.data);\n }\n }\n }\n } else if (returnType === 'value') {\n if (valueToArray) {\n for (const item of batches) {\n item.parent[item.key] = item.data = item.data\n ? item.data[0]\n : q.notFoundDefault;\n }\n } else {\n for (const item of batches) {\n if (item.data === undefined) {\n item.parent[item.key] = item.data = q.notFoundDefault;\n }\n }\n }\n } else if (valueToArray) {\n for (const item of batches) {\n if (!item.data) {\n throw new NotFoundError(arg as Query);\n }\n item.parent[item.key] = item.data = item.data[0];\n }\n } else if (notNullable) {\n for (const { data } of batches) {\n if (data === null) {\n throw new NotFoundError(arg as Query);\n }\n }\n }\n\n if (hookSelect) {\n for (const batch of batches) {\n batch.data = [batch.data];\n }\n }\n\n break;\n }\n }\n\n if (hookSelect) {\n let tempColumns: Set<string> | undefined;\n let renames: RecordString | undefined;\n for (const column of hookSelect.keys()) {\n const select = hookSelect!.get(column)!;\n\n if (select.as) (renames ??= {})[column] = select.as;\n\n if (select.temp) {\n (tempColumns ??= new Set())?.add(select.as || column);\n }\n }\n\n if (renames) {\n for (const { data } of batches) {\n for (const record of data) {\n if (record) {\n for (const a in renames) {\n const value = record[renames[a]];\n record[renames[a]] = record[a];\n record[a] = value;\n }\n }\n }\n }\n }\n\n if (q.selectedComputeds) {\n const maybePromise = processComputedBatches(\n q,\n batches,\n originalReturnType,\n returnType,\n tempColumns,\n renames,\n key,\n );\n if (maybePromise) return maybePromise;\n }\n\n finalizeNestedHookSelect(\n batches,\n originalReturnType,\n tempColumns,\n renames,\n key,\n );\n }\n\n applyBatchTransforms(q, batches);\n return;\n },\n } as BatchParser);\n }\n\n if (!joinQuery && (arg as Query).q?.subQuery && arg.q.expr) {\n arg = arg.q.expr;\n }\n\n if (isExpression(arg)) {\n addParserForRawExpression(query as never, key, arg);\n return arg;\n }\n\n return arg;\n }\n\n const joinedAs = (query as unknown as Query).q.valuesJoinedAs?.[\n arg as string\n ];\n return setParserForSelectedString(\n query as never,\n joinedAs ? joinedAs + '.' + (arg as string) : (arg as string),\n as,\n key,\n columnAlias,\n );\n};\n\nconst collectNestedSelectBatches = (\n batches: QueryBatchResult[],\n rows: unknown[],\n path: BatchParserPathEntry[],\n) => {\n const last = path.length - 1;\n const { key, returnType } = path[0];\n\n for (const row of rows) {\n processNestedSelectPathEntry(batches, path, key, returnType, 0, last, row);\n }\n};\n\nconst processNestedSelectPathEntry = (\n batches: QueryBatchResult[],\n path: BatchParserPathEntry[],\n thisKey: string,\n thisReturnType: QueryReturnType,\n i: number,\n last: number,\n parent: unknown,\n) => {\n const data = (parent as RecordUnknown)[thisKey];\n if (i === last) {\n batches.push({\n data,\n parent,\n key: thisKey,\n });\n } else {\n // Optional single relations can be null, don't descend into nested paths.\n if (!data) return;\n\n const { key, returnType } = path[++i];\n if (!thisReturnType || thisReturnType === 'all') {\n for (const row of data as unknown[]) {\n processNestedSelectPathEntry(\n batches,\n path,\n key,\n returnType,\n i,\n last,\n row,\n );\n }\n } else {\n processNestedSelectPathEntry(\n batches,\n path,\n key,\n returnType,\n i,\n last,\n data,\n );\n }\n }\n};\n\n// reuse SQL for empty array for JSON agg expressions\nconst emptyArrSQL = new RawSql(\"'[]'\");\n\n// process select argument: add parsers, join relations when needed\nexport const processSelectArg = <T extends SelectSelf>(\n q: T,\n as: string | undefined,\n arg: SelectArg<T>,\n columnAs?: string,\n): SelectItem | undefined | false => {\n const query = q as unknown as Query;\n if (typeof arg === 'string') {\n return setParserForSelectedString(query, arg, as, columnAs);\n }\n\n const selectAs: SelectAsValue = {};\n const selectShape = (query.q.selectShape = { ...query.q.selectShape });\n\n for (const key in arg as unknown as SelectAsArg<T>) {\n const item = processSelectAsArg(\n q,\n selectAs,\n as,\n key,\n (arg as unknown as SelectAsArg<T>)[key],\n key,\n );\n if (item) {\n selectShape[key] = item;\n } else if (item === false) {\n // propagate `none` state of a joined sub-query\n return false;\n }\n }\n\n return { selectAs };\n};\n\nexport const processSelectAsArg = <T extends SelectSelf>(\n q: T,\n selectAs: SelectAsValue,\n as: string | undefined,\n key: string,\n arg: SelectAsArg<T>[string],\n columnAlias?: string,\n outerReturnType?: QueryReturnType,\n): Column | undefined | false => {\n const query = q as unknown as Query;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let value = arg as any;\n let joinQuery: boolean | undefined;\n let column: Column | undefined;\n\n if (typeof value === 'function') {\n value = resolveSubQueryCallback(q as unknown as ToSQLQuery, value);\n\n if (isQueryNone(value)) {\n if (value.q.innerJoinLateral) {\n return false;\n }\n }\n\n if (isExpression(value)) {\n column = value.result.value as Column;\n } else {\n // `subQuery = 1` case is when callback returns the same query as it gets,\n // for example `q => q.get('name')`.\n const isSelfReferencingQuery =\n (value as unknown as Query).q.subQuery === 1;\n\n if (isRelationQuery(value) && !isSelfReferencingQuery) {\n joinQuery = true;\n setSelectRelation(query.q);\n\n value = value.joinQuery(value, q as unknown as IsQuery);\n\n let subQuery;\n const { returnType, innerJoinLateral } = value.q;\n if (!returnType || returnType === 'all') {\n subQuery = value.json(false);\n\n // no need to coalesce in case of inner lateral join.\n if (!innerJoinLateral) {\n value.q.coalesceValue = emptyArrSQL;\n }\n } else if (returnType === 'pluck') {\n // no select in case of plucking a computed\n subQuery = value.q.select\n ? value\n .wrap(cloneQueryBaseUnscoped(value))\n .jsonAgg(value.q.select[0])\n : value.json(false);\n\n value.q.coalesceValue = emptyArrSQL;\n } else {\n if (returnType === 'value' || returnType === 'valueOrThrow') {\n if (value.q.select) {\n // todo: investigate what is this for\n if (typeof value.q.select[0] === 'string') {\n value.q.select[0] = {\n selectAs: { r: value.q.select[0] },\n };\n }\n\n subQuery = value;\n } else {\n subQuery = value.json(false);\n }\n } else {\n subQuery = value;\n }\n }\n\n const joinLateral =\n innerJoinLateral || query.q.returnType === 'valueOrThrow';\n\n const as = _joinLateral(\n q,\n joinLateral ? 'JOIN' : 'LEFT JOIN',\n subQuery,\n key,\n // no need for `ON p.r IS NOT NULL` check when joining a single record,\n // `JOIN` will handle it on itself.\n innerJoinLateral &&\n returnType !== 'one' &&\n returnType !== 'oneOrThrow',\n );\n\n if (as) {\n value.q.joinedForSelect = _copyQueryAliasToQuery(\n value,\n q as unknown as Query,\n as,\n );\n }\n }\n\n if (value.q.getColumn?.data.skipValueToArray) {\n value.q.notFoundDefault ??= null;\n } else if (\n !value.q.type &&\n (value.q.returnType === 'value' ||\n value.q.returnType === 'valueOrThrow') &&\n !isSelfReferencingQuery\n ) {\n const column = Object.create(\n value.q.getColumn || UnknownColumn.instance,\n );\n column.data = { ...column.data, valueToArray: true };\n\n if (joinQuery) {\n // `name: undefined` for the case when the select implicitly joins, aliases the selected columns,\n // `where` uses the joined columns in conditions, and in this case `where` needs to use joined columns aliases - not their real db names.\n column.data.name = undefined;\n }\n\n value.q.getColumn = column;\n if (value.q.expr) {\n value.q.expr.q.getColumn = column;\n }\n }\n\n if (\n (outerReturnType === 'value' || isSelfReferencingQuery) &&\n value.q.returnType === 'valueOrThrow'\n ) {\n value.q.returnType = 'value';\n }\n\n column = value.q.getColumn;\n\n value = prepareSubQueryForSql(q as never, value);\n }\n } else if (typeof value === 'string') {\n const joinedAs = query.q.valuesJoinedAs?.[value];\n\n column = (\n joinedAs\n ? query.q.joinedShapes?.[joinedAs]?.value\n : _getSelectableColumn(query as never, value)\n ) as Column | undefined;\n } else {\n column = value.result.value;\n }\n\n selectAs[key] = addParserForSelectItem(\n query as never,\n as,\n key,\n value as SelectableOrExpression<T> | Query,\n columnAlias,\n joinQuery,\n );\n\n return column;\n};\n\n// process string select arg\n// adds a column parser for a column\n// when table.* string is provided, sets a parser for a joined table\nexport const setParserForSelectedString = (\n query: PickQueryQAndInternal,\n arg: string,\n as: string | undefined,\n columnAs?: string,\n columnAlias?: string,\n): string | undefined => {\n const { q } = query;\n const index = arg.indexOf('.');\n if (index === -1) {\n return selectColumn(query, q, arg, columnAs, columnAlias);\n }\n\n const table = getFullColumnTable(query as unknown as IsQuery, arg, index, as);\n const column = arg.slice(index + 1);\n\n // 'table.*' is selecting a full joined record (without computeds)\n if (column === '*') {\n addParsersForSelectJoinedWildcard(query, table, columnAs);\n return table === as ? column : arg;\n }\n\n if (table === as) {\n return selectColumn(query, q, column, columnAs, columnAlias);\n }\n\n const parser = q.joinedParsers?.[table]?.[column];\n if (parser) setParserToQuery(q, columnAs || column, parser);\n\n const batchParsers = q.joinedBatchParsers?.[table];\n if (batchParsers) {\n let cloned = false;\n for (const bp of batchParsers) {\n if (bp.path[0].key === column) {\n if (!cloned) {\n q.batchParsers = [...(q.batchParsers || [])];\n cloned = true;\n }\n q.batchParsers!.push(bp);\n }\n }\n }\n\n const computeds = q.joinedComputeds?.[table];\n if (computeds?.[column]) {\n const computed = computeds[column];\n _addToHookSelectWithTable(query, computed.deps, table);\n\n setObjectValueImmutable(q, 'selectedComputeds', column, computed);\n return;\n }\n\n return arg;\n};\n\nconst selectColumn = (\n query: PickQueryQAndInternal,\n q: QueryData,\n key: string,\n columnAs?: string,\n columnAlias?: string,\n) => {\n if (key === '*') {\n const { defaultParsers } = query.q;\n if (defaultParsers) {\n spreadObjectValues(query.q, 'parsers', defaultParsers);\n }\n } else {\n const parser = query.q.defaultParsers?.[key];\n if (parser) setObjectValueImmutable(q, 'parsers', columnAs || key, parser);\n\n if (q.runtimeComputeds?.[key]) {\n const computed = q.runtimeComputeds[key];\n _addToHookSelect(query, computed.deps);\n\n query.q.selectedComputeds = {\n ...query.q.selectedComputeds,\n [columnAlias || key]: computed,\n };\n return;\n }\n }\n\n return key;\n};\n\n// is mapping the result of a query into a columns shape\n// in this way, the result of a sub query becomes available outside of it for using in WHERE and other methods\n//\n// when isSubQuery is true, it will remove data.name of columns,\n// so that outside of the sub-query the columns are named with app-side names,\n// while db column names are encapsulated inside the sub-query\nexport const getShapeFromSelect = (\n q: IsQuery,\n isSubQuery?: boolean,\n): Column.QueryColumns => {\n const query = (q as Query).q;\n const { selectShape } = query;\n let select: SelectItem[] | undefined;\n\n if (query.selectedComputeds) {\n select = query.select ? [...query.select] : [];\n for (const key in query.selectedComputeds) {\n select.push(...query.selectedComputeds[key].deps);\n }\n } else {\n select = query.select;\n }\n\n let result: Column.QueryColumns;\n if (!select) {\n if (query.type) {\n // mutative queries with no select are returning nothing\n result = {};\n } else if (isSubQuery) {\n // when no select, and it is a sub-query, return the table shape with unnamed columns\n result = {};\n for (const key in selectShape) {\n const column = selectShape[key];\n if (!column.data.explicitSelect) {\n result[key] = column.data.name\n ? setColumnData(column, 'name', undefined)\n : column;\n }\n }\n } else {\n result = selectShape;\n }\n } else {\n result = {};\n for (const item of select) {\n if (typeof item === 'string') {\n addColumnToShapeFromSelect(\n q,\n item,\n selectShape,\n query,\n result,\n isSubQuery,\n );\n } else if (isExpression(item)) {\n result.value = item.result.value;\n } else if (item && 'selectAs' in item) {\n for (const key in item.selectAs) {\n const it = item.selectAs[key];\n if (typeof it === 'string') {\n addColumnToShapeFromSelect(\n q,\n it,\n selectShape,\n query,\n result,\n isSubQuery,\n key,\n );\n } else if (isExpression(it)) {\n result[key] = it.result.value || UnknownColumn.instance;\n } else if (it) {\n const { returnType } = it.q;\n if (returnType === 'value' || returnType === 'valueOrThrow') {\n const type = it.q.getColumn;\n result[key] = type\n ? mapSubSelectColumn(\n type as unknown as Column.Pick.Data,\n isSubQuery,\n )\n : UnknownColumn.instance;\n } else {\n result[key] = new JSONTextColumn(internalSchemaConfig, undefined);\n }\n }\n }\n }\n }\n }\n\n return result;\n};\n\n// converts selected items into a shape of columns\n// when `isSubQuery` is true, it un-names named columns\nconst addColumnToShapeFromSelect = (\n q: IsQuery,\n arg: string,\n shape: Column.QueryColumns,\n query: QueryData,\n result: Column.QueryColumns,\n isSubQuery?: boolean,\n key?: string,\n) => {\n const index = arg.indexOf('.');\n if (index !== -1) {\n const as = (q as Query).q.as || (q as Query).table;\n const table = getFullColumnTable(q, arg, index, as);\n const column = arg.slice(index + 1);\n if (table === as) {\n result[key || column] = shape[column];\n } else {\n const it = query.joinedShapes?.[table]?.[column];\n if (it)\n result[key || column] = mapSubSelectColumn(\n it as unknown as Column.Pick.Data,\n isSubQuery,\n );\n }\n } else if (arg === '*') {\n for (const key in shape) {\n if (!(shape[key] as unknown as Column.Pick.Data).data.explicitSelect) {\n result[key] = mapSubSelectColumn(\n shape[key] as unknown as Column.Pick.Data,\n isSubQuery,\n );\n }\n }\n } else {\n result[key || arg] = mapSubSelectColumn(\n shape[arg] as unknown as Column.Pick.Data,\n isSubQuery,\n );\n }\n};\n\n// un-name a column if `isSubQuery` is true\nconst mapSubSelectColumn = (column: Column.Pick.Data, isSubQuery?: boolean) => {\n // `!column` is needed for case when wrong column is passed to subquery (see issue #236)\n if (\n !isSubQuery ||\n !column ||\n (!column.data.name && !column.data.explicitSelect)\n ) {\n return column;\n }\n\n const cloned = Object.create(column);\n cloned.data = { ...column.data, name: undefined, explicitSelect: undefined };\n return cloned;\n};\n","import { SelectItemExpression } from '../../expressions/select-item-expression';\nimport { Operators, setQueryOperators } from '../../../columns/operators';\nimport { getFullColumnTable } from '../../query.utils';\nimport { Column } from '../../../columns';\nimport {\n PickQueryQ,\n PickQueryRelationsWithData,\n PickQuerySelectable,\n PickQueryShape,\n PickQueryTable,\n} from '../../pick-query-types';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport {\n IsQuery,\n Query,\n SetQueryReturnsColumnOptional,\n SetQueryReturnsColumnOrThrow,\n SetQueryReturnsValueOptional,\n SetQueryReturnsValueOrThrow,\n} from '../../query';\nimport { processSelectAsArg } from '../select/select.utils';\nimport { getQueryAs } from '../as/as';\nimport type { SelectAsFnArg } from '../select/select';\nimport { SelectAsValue } from '../select/select.sql';\n\nexport interface QueryGetSelf\n extends PickQuerySelectable, PickQueryRelationsWithData {}\n\n// `get` method argument, accepts a string for a column name or a raw SQL\nexport type GetArg<T extends QueryGetSelf> =\n | GetStringArg<T>\n | Expression\n | ((q: SelectAsFnArg<T>) => Expression | Query.Pick.SingleValueResult);\n\nexport type GetStringArg<T extends PickQuerySelectable> =\n keyof T['__selectable'] & string;\n\ntype ResolveGetArgColumn<Arg> = Arg extends Expression\n ? Arg['result']['value']\n : Arg extends (q: never) => infer R\n ? R extends Expression\n ? R['result']['value']\n : R extends Query.Pick.SingleValueResult\n ? R['result']['value']\n : never\n : never;\n\n// `get` method result: returns a column type for raw expression or a value type for string argument\nexport type GetResult<\n T extends QueryGetSelf,\n Arg extends GetArg<T>,\n> = Arg extends string\n ? SetQueryReturnsValueOrThrow<T, Arg>\n : SetQueryReturnsColumnOrThrow<T, ResolveGetArgColumn<Arg>>;\n\nexport type GetResultOptional<\n T extends QueryGetSelf,\n Arg extends GetArg<T>,\n> = Arg extends string\n ? SetQueryReturnsValueOptional<T, Arg>\n : SetQueryReturnsColumnOptional<T, ResolveGetArgColumn<Arg>>;\n\nexport const _getSelectableColumn = (\n q: IsQuery,\n arg: string,\n): Column.Pick.QueryColumn | undefined => {\n let type: Column.Pick.QueryColumn | undefined = (q as unknown as PickQueryQ).q\n .selectShape[arg];\n if (!type) {\n const index = arg.indexOf('.');\n if (index !== -1) {\n const as =\n (q as unknown as PickQueryQ).q.as || (q as PickQueryTable).table;\n\n const table = getFullColumnTable(q, arg, index, as);\n const column = arg.slice(index + 1);\n\n if (table === as) {\n type = (q as unknown as PickQueryShape).shape[column];\n } else {\n type = (q as unknown as PickQueryQ).q.joinedShapes?.[table]?.[column];\n }\n }\n }\n return type;\n};\n\n// mutate the query to get a single value\nconst _get = <\n T extends QueryGetSelf,\n R extends 'value' | 'valueOrThrow',\n Arg extends GetArg<T>,\n>(\n query: T,\n returnType: R,\n arg: Arg,\n): R extends 'value' ? GetResultOptional<T, Arg> : GetResult<T, Arg> => {\n const q = (query as unknown as PickQueryQ).q;\n\n if (q.returning) q.returning = undefined;\n\n q.returnType = returnType;\n\n let value: unknown = arg;\n\n const selectAs: SelectAsValue = {};\n let column: Column | undefined;\n const selected = processSelectAsArg(\n query as never,\n selectAs,\n getQueryAs(query as never),\n 'v',\n value as never,\n undefined,\n returnType,\n );\n if (selected !== false) {\n q.getColumn = column = selected;\n value = selectAs.v || value;\n }\n\n if (typeof value === 'string') {\n value =\n selectAs.v &&\n new SelectItemExpression(query as never, selectAs.v as string, column);\n }\n\n q.select = isExpression(value)\n ? [(q.expr = value)]\n : value\n ? [{ selectAs: { v: value as Query } }]\n : undefined;\n\n return setQueryOperators(\n query as never,\n column?.operators || Operators.any,\n ) as never;\n};\n\nexport function _queryGet<T extends QueryGetSelf, Arg extends GetArg<T>>(\n self: T,\n arg: Arg,\n): GetResult<T, Arg> {\n return _get(self, 'valueOrThrow', arg);\n}\n\nexport function _queryGetOptional<\n T extends QueryGetSelf,\n Arg extends GetArg<T>,\n>(self: T, arg: Arg): GetResultOptional<T, Arg> {\n return _get(self, 'value', arg);\n}\n","import { _queryGetOptional } from '../get/get.utils';\nimport {\n Query,\n queryTypeWithLimitOne,\n SetQueryReturnsColumnOptional,\n} from '../../query';\nimport { Column } from '../../../columns/column';\nimport { cloneQueryBaseUnscoped, queryWrap } from '../wrap/wrap';\nimport { UnknownColumn } from '../../../columns';\nimport { selectToSql } from '../select/select.sql';\nimport { Expression, ExpressionData } from '../../expressions/expression';\nimport { getQueryAs } from '../as/as';\nimport { ToSQLCtx } from '../../sql/to-sql';\n\nclass RowToJsonExpression extends Expression {\n q: ExpressionData;\n result = { value: UnknownColumn.instance };\n\n constructor(\n public from: Query,\n public one: boolean,\n public coalesce?: boolean,\n ) {\n super();\n this.q = { expr: this };\n }\n\n makeSQL(ctx: ToSQLCtx) {\n const q = this.from;\n const aliases: string[] = [];\n const jsonList: { [K: string]: Column | undefined } = {};\n const select = selectToSql(\n ctx,\n q,\n q.q,\n `\"${getQueryAs(q)}\"`,\n q.q.hookSelect,\n undefined,\n aliases,\n jsonList,\n );\n q.q.selectCache = { sql: select, aliases };\n\n let rowToJson: string;\n if (Object.values(jsonList).some((x) => x?.data.jsonCast)) {\n rowToJson = `json_build_object(${Object.entries(jsonList)\n .map(\n ([key, column]) =>\n `'${key}', t.\"${key}\"${\n column?.data.jsonCast ? `::${column.data.jsonCast}` : ''\n }`,\n )\n .join(', ')})`;\n } else {\n rowToJson = 'row_to_json(t.*)';\n }\n\n return this.one\n ? rowToJson\n : this.coalesce !== false\n ? `COALESCE(json_agg(${rowToJson}), '[]')`\n : `json_agg(${rowToJson})`;\n }\n}\n\nexport function queryJson<T>(\n self: T,\n coalesce?: boolean,\n): SetQueryReturnsColumnOptional<T, Column.Pick.QueryColumnOfType<string>> {\n const inner = (self as Query).clone();\n\n const q = queryWrap(inner, cloneQueryBaseUnscoped(inner)) as unknown as Query;\n // json_agg is used instead of jsonb_agg because it is 2x faster, according to my benchmarks\n _queryGetOptional(\n q,\n new RowToJsonExpression(\n inner,\n queryTypeWithLimitOne[(self as Query).q.returnType as string],\n coalesce,\n ),\n );\n\n // to skip LIMIT 1\n q.q.returnsOne = true;\n\n return q as never;\n}\n","import { SelectItemExpression } from '../../expressions/select-item-expression';\nimport { ToSql, ToSQLCtx } from '../../sql/to-sql';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { addTopCte } from './cte.sql';\nimport { _clone } from '../clone/clone';\nimport { getShapeFromSelect } from '../select/select.utils';\nimport { getQueryAs } from '../as/as';\nimport { getSqlText } from '../../sql/sql';\nimport { QueryType } from '../../query-data';\n\nexport const moveQueryToCte = (\n ctx: ToSQLCtx,\n query: SubQueryForSql,\n type: QueryType,\n dontAddTableHook?: boolean,\n): {\n as: string;\n makeSelectList(isSubSql?: boolean): string[];\n} => {\n const { returnType } = query.q;\n const throwOnNotFound = returnType === 'valueOrThrow';\n\n let valueAs: string | undefined;\n if (\n returnType === 'value' ||\n returnType === 'valueOrThrow' ||\n returnType === 'pluck'\n ) {\n const first = query.q.select![0];\n if (\n first instanceof SelectItemExpression &&\n typeof first.item === 'string'\n ) {\n const columnName = first.result.value?.data.name;\n // A value query from `get` must expose its app-side key from the CTE,\n // otherwise named columns return their db name and the outer CTE select cannot reference them.\n if (columnName && columnName !== first.item) {\n query = _clone(query) as unknown as SubQueryForSql;\n query.q.returnType = 'one';\n query.q.select = [{ selectAs: { [first.item]: first } }];\n if (throwOnNotFound && query.q.type !== 'upsert') {\n query.q.cteThrowOnNotFound = true;\n }\n }\n valueAs = first.item;\n } else {\n query = _clone(query) as unknown as SubQueryForSql;\n query.q.returnType = 'one';\n query.q.select = [{ selectAs: { value: query.q.select![0] as never } }];\n valueAs = 'value';\n }\n }\n\n const as = addTopCte('before', ctx, query, type, undefined, dontAddTableHook);\n\n const makeSelectList = (isSubSql?: boolean) => {\n const list: string[] = [];\n\n let selectedCount = 0;\n if (valueAs) {\n selectedCount = 1;\n list.push(`\"${as}\".\"${valueAs}\"`);\n } else if (returnType !== 'void') {\n const shape = getShapeFromSelect(query, true);\n const keys = Object.keys(shape);\n selectedCount = keys.length;\n list.push(...keys.map((key) => `\"${as}\".\"${key}\"`));\n }\n\n if (!isSubSql && ctx.topCtx.cteHooks?.hasSelect) {\n list.push('NULL::json');\n ctx.selectedCount = selectedCount;\n }\n\n return list;\n };\n\n return {\n as,\n makeSelectList,\n };\n};\n\nexport const moveMutativeQueryToCteBase = (\n toSql: ToSql,\n ctx: ToSQLCtx,\n query: SubQueryForSql,\n type = query.q.type,\n): {\n as: string;\n makeSql(isSubSql?: boolean): string;\n} => {\n if (!query.q.type) {\n const as = getQueryAs(query);\n return {\n as,\n makeSql: () => getSqlText(toSql(query, query.q.type, ctx, true)),\n };\n }\n\n const { as, makeSelectList } = moveQueryToCte(ctx, query, type);\n\n return {\n as,\n // need to be called lazily for the upsert case because `ctx.cteHooks?.hasSelect` can change after the first query\n makeSql(isSubSql) {\n return 'SELECT ' + makeSelectList(isSubSql) + ` FROM \"${as}\"`;\n },\n };\n};\n","import { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { Column } from '../../../columns/column';\nimport {\n CteHooks,\n CteTableHook,\n EnsureCountItem,\n HookSelect,\n TableHook,\n} from '../../basic-features/select/hook-select';\nimport { QueryData } from '../../query-data';\n\nexport type HookPurpose = 'Create' | 'Update' | 'Delete';\n\nexport const addTableHook = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n data: QueryData,\n select?: HookSelect,\n hookPurpose?: HookPurpose,\n dontAddTableHook?: boolean,\n): void => {\n if (data.ensureCount !== undefined && ctx.cteName) {\n const cteHooks = setCteHooks(ctx, true);\n (cteHooks.ensureCount ??= {})[ctx.cteName] = { count: data.ensureCount };\n }\n\n const afterCreate = data.afterCreate;\n const afterUpdate = data.afterUpdate;\n const afterSave = data.afterSave;\n const afterDelete = data.afterDelete;\n const afterCreateCommit = data.afterCreateCommit;\n const afterUpdateCommit = data.afterUpdateCommit;\n const afterSaveCommit = data.afterSaveCommit;\n const afterDeleteCommit = data.afterDeleteCommit;\n const throwOnNotFound =\n // Assuming that Create always returns a record, though needs to be cautions with onConflictDoNothing\n hookPurpose !== 'Create' &&\n (data.cteThrowOnNotFound ||\n data.returnType === 'oneOrThrow' ||\n data.returnType === 'valueOrThrow');\n\n const hasAfterHook =\n afterCreate ||\n afterUpdate ||\n afterSave ||\n afterDelete ||\n afterCreateCommit ||\n afterUpdateCommit ||\n afterSaveCommit ||\n afterDeleteCommit;\n\n if (!select && !hasAfterHook && !throwOnNotFound) {\n return;\n }\n\n const tableHook: TableHook = {\n hookPurpose,\n select,\n afterCreate,\n afterUpdate,\n afterSave,\n afterDelete,\n afterCreateCommit,\n afterUpdateCommit,\n afterSaveCommit,\n afterDeleteCommit,\n };\n\n if (ctx.cteName && !dontAddTableHook) {\n if (tableHook && (hasAfterHook || throwOnNotFound)) {\n const shape: Column.Shape.Data = {};\n if (tableHook.select) {\n for (const key of tableHook.select.keys()) {\n shape[key] = q.shape[key] as unknown as Column.Pick.Data;\n }\n }\n\n const item: CteTableHook = {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n table: q.table!,\n shape,\n tableHook: tableHook,\n throwOnNotFound,\n };\n\n const hasSelect = throwOnNotFound || !!tableHook.select;\n const cteHooks = setCteHooks(ctx, hasSelect);\n (cteHooks.tableHooks ??= {})[ctx.cteName] ??= item;\n }\n } else {\n ctx.topCtx.tableHook = tableHook;\n }\n};\n\nexport const setCteHooks = (ctx: ToSQLCtx, hasSelect: boolean): CteHooks => {\n if (\n hasSelect &&\n ctx.topCtx.selectList &&\n ctx.topCtx === ctx.topCtx.topCtx &&\n !ctx.topCtx.cteHookTopNullSelectAppended\n ) {\n ctx.topCtx.selectList.push('NULL');\n ctx.topCtx.cteHookTopNullSelectAppended = true;\n }\n\n if (ctx.topCtx.cteHooks) {\n if (hasSelect) ctx.topCtx.cteHooks.hasSelect = true;\n return ctx.topCtx.cteHooks;\n } else {\n return (ctx.topCtx.cteHooks = {\n hasSelect,\n });\n }\n};\n\nexport const ensureCTECount = (\n ctx: ToSQLCtx,\n cteName: string,\n countItem: EnsureCountItem,\n) => {\n (setCteHooks(ctx, true).ensureCount ??= {})[cteName] = countItem;\n};\n","import { IsQuery, Query } from '../../query';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { _clone } from '../../basic-features/clone/clone';\nimport {\n prepareSubQueryForSql,\n SubQueryForSql,\n} from '../sub-query/sub-query-for-sql';\nimport { requirePrimaryKeys } from '../../query-columns/primary-keys';\nimport {\n _addToHookSelect,\n HookSelect,\n HookSelectValue,\n} from '../../basic-features/select/hook-select';\nimport { moveQueryToCte } from '../../basic-features/cte/move-mutative-query-to-cte-base.sql';\nimport { ensureCTECount } from '../../extra-features/hooks/hooks.sql';\nimport { JoinItem } from '../../basic-features/join/join.sql';\nimport { getQueryAs } from '../../basic-features/as/as';\nimport { RecordString } from '../../../utils';\n\nexport interface MutativeQueriesSelectRelationsQueryData {\n selectRelation?: true;\n}\n\nexport interface MutativeQueriesSelectRelationsSqlProp {\n mutativeQueriesSelectRelationsState?: MutativeQueriesSelectRelationsSqlState;\n}\n\nexport interface MutativeQueriesSelectRelationsSqlState {\n query: IsQuery;\n value?: MutativeQueriesSelectRelationsValue;\n}\n\nexport interface MutativeQueriesSelectRelationsValue {\n [K: string]: IsQuery;\n}\n\nexport const newMutativeQueriesSelectRelationsSqlState = (\n query: ToSQLQuery,\n): MutativeQueriesSelectRelationsSqlState | undefined =>\n query.q.selectRelation && {\n query,\n };\n\nexport const setMutativeQueriesSelectRelationsSqlState = (\n d: MutativeQueriesSelectRelationsSqlState,\n as: string,\n rel: IsQuery,\n) => {\n (d.value ??= {})[as] = rel;\n};\n\nexport const handleInsertAndUpdateSelectRelationsSqlState = (\n ctx: ToSQLCtx,\n state: MutativeQueriesSelectRelationsSqlState | undefined,\n) => {\n if (state) {\n ctx.topCtx.mutativeQueriesSelectRelationsSqlState = state;\n }\n};\n\n// It's a workaround for soft-delete when selecting a relation.\n// if relation is selected under the same name as primary key, valuesJoinedAs will make SQL use relation instead of pkey for the condition.\n// Temporarily unsetting valuesJoinedAs.\nexport const unsetValuesJoinedAsForMutativeSelectRelations = (\n query: ToSQLQuery,\n): RecordString | undefined => {\n if (!query.q.selectRelation || !query.q.valuesJoinedAs) {\n return;\n }\n\n const { valuesJoinedAs } = query.q;\n query.q.valuesJoinedAs = undefined;\n\n return valuesJoinedAs;\n};\n\nexport const restoreValuesJoinedAsForMutativeSelectRelations = (\n query: ToSQLQuery,\n valuesJoinedAs: RecordString | undefined,\n) => {\n if (valuesJoinedAs) {\n query.q.valuesJoinedAs = valuesJoinedAs;\n }\n};\n\nexport const handleDeleteSelectRelationsSqlState = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n relationSelectState: MutativeQueriesSelectRelationsSqlState | undefined,\n):\n | {\n join: JoinItem;\n joinedShape: string;\n movedWhereToCte: boolean;\n addReturning: string;\n }\n | undefined => {\n const selectRelations = relationSelectState?.value;\n if (!selectRelations) return;\n\n const selectPrimaryKeysQuery = prepareSubQueryForSql(query, _clone(query));\n selectPrimaryKeysQuery.q.valuesJoinedAs = undefined;\n\n const primaryKeys = requirePrimaryKeys(\n query as Query,\n 'primary keys are required for selecting relation in delete',\n );\n\n _addToHookSelect(selectPrimaryKeysQuery, primaryKeys, true);\n\n const { as: cteAs } = moveQueryToCte(\n ctx,\n selectPrimaryKeysQuery as unknown as SubQueryForSql,\n undefined,\n true,\n );\n\n const relKeys = Object.keys(selectRelations);\n\n const hookSelect = selectPrimaryKeysQuery.q.hookSelect as HookSelect;\n const queryAs = getQueryAs(query);\n\n const join: JoinItem = {\n type: 'JOIN',\n args: {\n w: cteAs,\n a: [\n Object.fromEntries(\n primaryKeys.map((key) => {\n const selected = hookSelect.get(key) as HookSelectValue;\n return [\n cteAs + '.' + ((selected.as || selected.select) as string),\n `${queryAs}.${key}`,\n ];\n }),\n ),\n ],\n },\n };\n\n for (const relKey in selectRelations) {\n const rel = selectRelations[relKey] as Query;\n if (\n rel.q.returnType === 'oneOrThrow' ||\n rel.q.returnType === 'valueOrThrow'\n ) {\n ensureCTECount(ctx, cteAs, { jsonNotNull: relKey });\n }\n }\n\n return {\n join,\n joinedShape: cteAs,\n movedWhereToCte: true,\n addReturning: relKeys.map((key) => `${cteAs}.\"${key}\"`).join(', '),\n };\n};\n\nexport const setMutativeQueriesSelectRelationsStateOnSql = (\n ctx: ToSQLCtx,\n sql: MutativeQueriesSelectRelationsSqlProp,\n) => {\n sql.mutativeQueriesSelectRelationsState =\n ctx.topCtx.mutativeQueriesSelectRelationsSqlState;\n};\n","import { RawSql } from '../../expressions/raw-sql';\nimport {\n columnToSql,\n simpleColumnToSQL,\n tableColumnToSql,\n} from '../../sql/column-to-sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { QueryData, SelectAllColumn } from '../../query-data';\nimport { _queryGetOptional } from '../get/get.utils';\nimport { queryJson } from '../json/json.utils';\nimport { queryWrap } from '../wrap/wrap';\nimport { isQueryNone } from '../../extra-features/none/none';\nimport { anyShape } from '../../../columns/any-shape';\nimport { Column } from '../../../columns/column';\nimport { IntegerBaseColumn } from '../../../columns/column-types/number';\nimport { moveMutativeQueryToCte } from '../cte/cte.sql';\nimport { SelectItemExpression } from '../../expressions/select-item-expression';\nimport { HookSelect, HookSelectValue } from './hook-select';\nimport {\n addValue,\n getFreeAlias,\n isObjectEmpty,\n RecordString,\n RecordUnknown,\n} from '../../../utils';\nimport { ColumnsParsers } from '../../query-columns/query-column-parsers';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport {\n Expression,\n isExpression,\n SelectableOrExpression,\n} from '../../expressions/expression';\nimport { isRelationQuery } from '../../relations';\nimport { OrchidOrmInternalError, UnhandledTypeError } from '../../errors';\nimport { Query } from '../../query';\nimport { getSelectedColumnData, makeRowToJson } from '../../sql/sql';\nimport {\n MutativeQueriesSelectRelationsSqlState,\n setMutativeQueriesSelectRelationsSqlState,\n} from '../../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\n\nexport type SelectItem = string | SelectAs | Expression | undefined;\n\nexport interface SelectAs {\n selectAs: SelectAsValue;\n}\n\nexport interface SelectAsValue {\n [K: string]: string | Query | Expression | undefined;\n}\n\nexport const setSqlCtxSelectList = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: {\n selectShape: Column.QueryColumns;\n hookSelect?: HookSelect;\n selectCache?: QueryData['selectCache'];\n returnType?: QueryData['returnType'];\n },\n quotedAs?: string,\n isSubSql?: boolean,\n aliases?: string[],\n): void => {\n if (query.selectCache) {\n if (aliases) aliases.push(...query.selectCache.aliases);\n ctx.selectList = [query.selectCache.sql];\n } else {\n ctx.selectList = selectToSqlList(\n ctx,\n table,\n query,\n quotedAs,\n query.hookSelect,\n isSubSql,\n aliases,\n undefined,\n undefined,\n );\n\n if (!isSubSql && ctx.topCtx.cteHooks?.hasSelect) {\n ctx.selectList.push('NULL');\n }\n }\n};\n\nexport const selectToSqlList = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: {\n select?: QueryData['select'];\n selectAllColumns?: SelectAllColumn[];\n selectAllShape?: RecordUnknown;\n join?: QueryData['join'];\n hookSelect?: HookSelect;\n selectShape: Column.QueryColumns;\n parsers?: ColumnsParsers;\n joinedShapes?: QueryData['joinedShapes'];\n returnType?: QueryData['returnType'];\n getColumn?: Column;\n },\n quotedAs: string | undefined,\n hookSelect: HookSelect | undefined = query.hookSelect,\n isSubSql?: boolean,\n aliases?: string[],\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n delayedRelationSelect?: MutativeQueriesSelectRelationsSqlState,\n): string[] => {\n let selected: RecordUnknown | undefined;\n let selectedAs: RecordString | undefined;\n\n let list: string[] = [];\n\n ctx.selectedCount = 0;\n\n if (query.select) {\n for (const item of query.select) {\n if (typeof item === 'string') {\n let sql;\n if (item === '*') {\n if (hookSelect) {\n selected ??= {};\n selectedAs ??= {};\n for (const key in query.selectAllShape) {\n selected[key] = quotedAs;\n selectedAs[key] = key;\n }\n }\n\n sql = internalSelectAllSql(ctx, query, quotedAs, jsonList).join(', ');\n } else {\n ctx.selectedCount++;\n\n const index = item.indexOf('.');\n if (index !== -1) {\n const tableName = item.slice(0, index);\n const key = item.slice(index + 1);\n\n if (hookSelect?.get(key)) {\n (selected ??= {})[key] = `\"${tableName}\"`;\n (selectedAs ??= {})[key] = key;\n }\n\n sql = tableColumnToSql(\n ctx,\n query,\n query.selectShape,\n tableName,\n key,\n quotedAs,\n true,\n key === '*' ? tableName : key,\n jsonList,\n );\n } else {\n if (hookSelect?.get(item)) {\n (selected ??= {})[item] = quotedAs;\n (selectedAs ??= {})[item] = item;\n }\n\n sql = simpleColumnToSQL(\n ctx,\n query,\n query.selectShape,\n item,\n query.selectShape[item],\n quotedAs,\n true,\n item,\n jsonList,\n );\n }\n }\n\n list.push(sql);\n aliases?.push('');\n } else if (item) {\n if ('selectAs' in item) {\n const obj = item.selectAs as {\n [K: string]: SelectableOrExpression | SubQueryForSql;\n };\n for (const as in obj) {\n ctx.selectedCount++;\n\n if (hookSelect) {\n (selected ??= {})[as] = true;\n }\n\n const value = obj[as];\n if (typeof value === 'object') {\n if (isExpression(value)) {\n let sql = value.toSQL(ctx, quotedAs);\n if (value.q.getColumn?.data.valueToArray) {\n sql = `array[${sql}]`;\n }\n\n list.push(`${sql} \"${as}\"`);\n\n if (jsonList) {\n jsonList[as] = value.result\n .value as unknown as Column.Pick.Data;\n }\n\n aliases?.push(as);\n } else if (delayedRelationSelect && isRelationQuery(value)) {\n setMutativeQueriesSelectRelationsSqlState(\n delayedRelationSelect,\n as,\n value,\n );\n } else {\n pushSubQuerySql(ctx, query, value, as, list, quotedAs, aliases);\n if (jsonList) {\n jsonList[as] =\n value.q.returnType === 'value' ||\n value.q.returnType === 'valueOrThrow'\n ? ((value.q.expr?.result.value ||\n value.result?.value) as unknown as Column.Pick.Data)\n : undefined;\n }\n }\n } else if (value) {\n if (hookSelect) {\n (selectedAs ??= {})[value as string] = as;\n }\n\n list.push(\n columnToSql(\n ctx,\n table.q,\n table.q.selectShape,\n value as string,\n quotedAs,\n true,\n as,\n jsonList,\n ),\n );\n aliases?.push(as);\n }\n }\n } else {\n // selecting a single value from expression\n ctx.selectedCount++;\n let sql = item.toSQL(ctx, quotedAs);\n\n if (item.q.getColumn?.data.valueToArray) {\n sql = `array[${sql}]`;\n }\n\n // `get` column\n if (\n hookSelect &&\n item instanceof SelectItemExpression &&\n typeof item.item === 'string' &&\n item.item !== '*'\n ) {\n const i = item.item.indexOf('.');\n let key: string | undefined;\n if (i !== -1) {\n if (item.item.slice(0, i) === table.table) {\n key = item.item.slice(i + 1);\n }\n } else {\n key = item.item;\n }\n\n if (key) {\n const column = (item.q as QueryData).selectShape[key];\n (selectedAs ??= {})[key] = column?.data.name || key;\n }\n }\n\n list.push(ctx.aliasValue ? `${sql} ${quotedAs}` : sql);\n aliases?.push('');\n }\n }\n }\n }\n\n if (hookSelect) {\n for (const column of hookSelect.keys()) {\n const item = hookSelect.get(column) as HookSelectValue;\n const { select } = item;\n let sql;\n let quotedTable;\n let columnName;\n let col;\n\n if (typeof select === 'string') {\n const index = select.indexOf('.');\n if (index !== -1) {\n const tableName = select.slice(0, index);\n quotedTable = `\"${tableName}\"`;\n columnName = select.slice(index + 1);\n col = table.q.joinedShapes?.[tableName]?.[columnName] as\n | Column\n | undefined;\n sql = columnToSql(\n ctx,\n table.q,\n table.shape,\n select,\n undefined,\n true,\n undefined,\n undefined,\n undefined,\n true,\n );\n } else {\n quotedTable = quotedAs;\n columnName = select;\n col = table.shape[select] as Column | undefined;\n sql = columnToSql(\n ctx,\n table.q,\n table.shape,\n select,\n quotedAs,\n true,\n undefined,\n undefined,\n undefined,\n true,\n );\n }\n } else {\n columnName = column;\n sql = select.sql;\n }\n\n let name = columnName;\n if (selected?.[columnName]) {\n if (selected?.[columnName] === quotedTable) {\n if (!isSubSql) {\n hookSelect.delete(column);\n }\n item.onAs?.forEach((fn) => fn(columnName));\n continue;\n }\n\n name = getFreeAlias(selected, column);\n\n item.as = name;\n item.temp = name;\n sql += ` \"${name}\"`;\n item.onAs?.forEach((fn) => fn(name));\n } else if (selectedAs?.[columnName]) {\n const as = selectedAs[columnName];\n item.as = as;\n item.temp = columnName;\n item.onAs?.forEach((fn) => fn(as));\n continue;\n } else {\n if (col?.data.name || typeof select === 'object') {\n sql += ` \"${columnName}\"`;\n }\n item.temp = columnName;\n item.onAs?.forEach((fn) => fn(column));\n }\n\n if (jsonList) jsonList[name] = col;\n\n ctx.selectedCount++;\n list.push(sql);\n }\n }\n\n if (!list.length && !query.select && query.returnType !== 'void') {\n list = internalSelectAllSql(ctx, query, quotedAs, jsonList);\n }\n\n return list;\n};\n\nexport const selectToSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: {\n select?: QueryData['select'];\n selectAllColumns?: SelectAllColumn[];\n selectAllShape?: RecordUnknown;\n join?: QueryData['join'];\n hookSelect?: HookSelect;\n selectShape: Column.QueryColumns;\n parsers?: ColumnsParsers;\n joinedShapes?: QueryData['joinedShapes'];\n returnType?: QueryData['returnType'];\n },\n quotedAs: string | undefined,\n hookSelect: HookSelect | undefined = query.hookSelect,\n isSubSql?: boolean,\n aliases?: string[],\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n delayedRelationSelect?: MutativeQueriesSelectRelationsSqlState,\n): string => {\n const list = selectToSqlList(\n ctx,\n table,\n query,\n quotedAs,\n hookSelect,\n isSubSql,\n aliases,\n jsonList,\n delayedRelationSelect,\n );\n\n return list.join(', ');\n};\n\nconst internalSelectAllSql = (\n ctx: ToSQLCtx,\n query: {\n updateFrom?: unknown;\n updateMany?: unknown;\n join?: QueryData['join'];\n selectAllColumns?: SelectAllColumn[];\n selectAllShape?: RecordUnknown;\n selectShape: Column.QueryColumns;\n },\n quotedAs?: string,\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n): string[] => {\n if (jsonList) {\n for (const key in query.selectAllShape) {\n const column = query.selectAllShape[key] as Column.Pick.Data;\n jsonList[key] = getSelectedColumnData(column);\n }\n }\n\n let columnsCount: number | undefined;\n if (query.selectShape !== anyShape) {\n columnsCount = 0;\n for (const key in query.selectShape) {\n if (!(query.selectShape[key] as Column).data.explicitSelect) {\n columnsCount++;\n }\n }\n ctx.selectedCount += columnsCount;\n }\n\n return selectAllSql(query, quotedAs, columnsCount, ctx);\n};\n\nexport const selectAllSql = (\n q: {\n updateFrom?: unknown;\n updateMany?: unknown;\n join?: QueryData['join'];\n selectAllColumns?: SelectAllColumn[];\n selectAllShape?: RecordUnknown;\n selectShape: Column.QueryColumns;\n },\n quotedAs?: string,\n columnsCount?: number,\n ctx?: ToSQLCtx,\n): string[] => {\n return q.join?.length || q.updateFrom || q.updateMany\n ? q.selectAllColumns?.map((item) =>\n selectAllColumnToSql(item, ctx, quotedAs, true),\n ) || (isEmptySelect(q.selectShape, columnsCount) ? [] : [`${quotedAs}.*`])\n : q.selectAllColumns\n ? q.selectAllColumns.map((item) =>\n selectAllColumnToSql(item, ctx, quotedAs),\n )\n : isEmptySelect(q.selectShape, columnsCount)\n ? []\n : ['*'];\n};\n\nconst selectAllColumnToSql = (\n item: SelectAllColumn,\n ctx: ToSQLCtx | undefined,\n quotedAs: string | undefined,\n prefix?: true,\n): string => {\n if (typeof item !== 'string') {\n return item(ctx as ToSQLCtx, quotedAs);\n }\n\n return prefix ? `${quotedAs}.${item}` : item;\n};\n\nconst isEmptySelect = (shape: Column.QueryColumns, columnsCount?: number) =>\n columnsCount === undefined\n ? shape === anyShape\n ? false\n : isObjectEmpty(shape)\n : !columnsCount;\n\nconst pushSubQuerySql = (\n ctx: ToSQLCtx,\n mainQuery: {\n joinedShapes?: QueryData['joinedShapes'];\n },\n query: SubQueryForSql,\n as: string,\n list: string[],\n quotedAs?: string,\n aliases?: string[],\n) => {\n const { returnType = 'all' } = query.q;\n\n if (isQueryNone(query)) {\n let sql: string;\n switch (returnType) {\n case 'one':\n case 'oneOrThrow':\n case 'void':\n return;\n case 'value':\n case 'valueOrThrow':\n if (\n query.q.returning ||\n query.q.expr?.result.value instanceof IntegerBaseColumn\n ) {\n sql = '0';\n } else {\n return;\n }\n break;\n case 'all':\n case 'pluck':\n case 'rows':\n sql = `'[]'::json`;\n break;\n default:\n throw new UnhandledTypeError(query, returnType);\n }\n list.push(`${sql} \"${as}\"`);\n aliases?.push(as);\n return;\n }\n\n if (query.q.joinedForSelect) {\n let sql;\n switch (returnType) {\n case 'one':\n case 'oneOrThrow': {\n const table = query.q.joinedForSelect;\n const shape = mainQuery.joinedShapes?.[\n as\n ] as unknown as Column.Shape.Data;\n sql = makeRowToJson(ctx, table, shape, false);\n break;\n }\n case 'all':\n case 'value':\n case 'pluck':\n case 'rows':\n sql = `\"${query.q.joinedForSelect}\".\"${as}\"`;\n break;\n case 'valueOrThrow':\n if (query.q.returning) return;\n sql = `\"${query.q.joinedForSelect}\".\"${as}\"`;\n break;\n case 'void':\n return;\n default:\n throw new UnhandledTypeError(query, returnType);\n }\n\n if (sql) {\n list.push(`${coalesce(ctx, query, sql, quotedAs)} \"${as}\"`);\n aliases?.push(as);\n }\n return;\n }\n\n switch (returnType) {\n case 'all':\n case 'one':\n case 'oneOrThrow':\n query = queryJson(query) as unknown as typeof query;\n break;\n case 'pluck': {\n const { select } = query.q;\n const first = select?.[0];\n if (!first && query.q.runtimeComputeds?.[as]) {\n query = queryJson(query) as unknown as typeof query;\n } else if (!first) {\n throw new OrchidOrmInternalError(\n query,\n `Nothing was selected for pluck`,\n );\n } else {\n const cloned = query.clone();\n cloned.q.select = [{ selectAs: { c: first } }] as SelectItem[];\n query = queryWrap(\n cloned,\n cloned.baseQuery.clone(),\n ) as unknown as SubQueryForSql;\n _queryGetOptional(\n query as never,\n new RawSql(`COALESCE(json_agg(\"c\"), '[]')`),\n );\n }\n break;\n }\n case 'value':\n case 'valueOrThrow':\n if (!query.q.returning && query.q.runtimeComputeds?.[as]) {\n query = queryJson(query) as unknown as typeof query;\n }\n break;\n case 'rows':\n case 'void':\n break;\n default:\n throw new UnhandledTypeError(query, returnType);\n }\n\n list.push(\n `${coalesce(\n ctx,\n query,\n `(${moveMutativeQueryToCte(ctx, query)})`,\n quotedAs,\n )} \"${as}\"`,\n );\n};\n\nconst coalesce = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n sql: string,\n quotedAs?: string,\n) => {\n const { coalesceValue } = query.q;\n if (coalesceValue !== undefined) {\n const value = isExpression(coalesceValue)\n ? coalesceValue.toSQL(ctx, quotedAs)\n : addValue(ctx.values, coalesceValue);\n return `COALESCE(${sql}, ${value})`;\n }\n\n return sql;\n};\n","import { Query } from '../../query';\nimport { columnToSqlNotSelect } from '../../sql/column-to-sql';\nimport { JoinItemArgs, processJoinItem } from '../join/join.sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { JoinedShapes, QueryData, QueryScopeData } from '../../query-data';\nimport { Column } from '../../../columns/column';\nimport { SelectItem, selectToSql } from '../select/select.sql';\nimport { OperatorToSQL } from '../../../columns/operators';\nimport { moveMutativeQueryToCte } from '../cte/cte.sql';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { _getQueryOuterAliases, getQueryAs, QueryDataAliases } from '../as/as';\nimport { ColumnsParsers } from '../../query-columns/query-column-parsers';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport {\n addValue,\n MaybeArray,\n RecordString,\n RecordUnknown,\n toArray,\n} from '../../../utils';\nimport { WhereSearchItem } from '../../extra-features/search/search.sql';\nimport { joinSubQuery } from '../join/join';\nimport { ColumnsShape } from '../../../columns';\n\nexport type WhereItem =\n | {\n [K: string]:\n | unknown\n | { [K: string]: unknown | SubQueryForSql | Expression }\n | Expression;\n\n NOT?: MaybeArray<WhereItem>;\n AND?: MaybeArray<WhereItem>;\n OR?: MaybeArray<WhereItem>[];\n IN?: MaybeArray<WhereInItem>;\n EXISTS?: MaybeArray<JoinItemArgs>;\n ON?: WhereOnItem | WhereJsonPathEqualsItem;\n SEARCH?: MaybeArray<WhereSearchItem>;\n }\n | Query\n | Expression;\n\nexport interface WhereInItem {\n columns: string[];\n values: unknown[][] | SubQueryForSql | Expression;\n}\n\nexport type WhereJsonPathEqualsItem = [\n leftColumn: string,\n leftPath: string,\n rightColumn: string,\n rightPath: string,\n];\n\nexport interface WhereOnItem {\n joinFrom: WhereOnJoinItem;\n from: string;\n joinTo: WhereOnJoinItem;\n to: string;\n useOuterAliases?: true;\n op?: string;\n}\n\nexport type WhereOnJoinItem = { table?: string; q: { as?: string } } | string;\n\ninterface QueryDataForWhere extends QueryDataAliases {\n and?: QueryData['and'];\n or?: QueryData['or'];\n selectShape: QueryData['selectShape'];\n joinedShapes?: QueryData['joinedShapes'];\n scopes?: { [K: string]: QueryScopeData };\n outerAliases?: QueryData['outerAliases'];\n parsers?: ColumnsParsers;\n valuesJoinedAs?: RecordString;\n}\n\ninterface QueryDataWithLanguage extends QueryDataForWhere {\n language?: QueryData['language'];\n}\n\nexport const pushWhereStatementSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n checkIfHasExplicitWhere?: { value?: boolean },\n) => {\n const res = whereToSql(\n ctx,\n table,\n query,\n quotedAs,\n undefined,\n checkIfHasExplicitWhere,\n );\n if (res) {\n ctx.sql.push('WHERE', res);\n }\n};\n\nexport const pushWhereToSql = (\n sql: string[],\n ctx: ToSQLCtx,\n table: Query,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n) => {\n const res = whereToSql(ctx, table, query, quotedAs, parens);\n if (res) {\n sql.push(res);\n }\n};\n\nexport const whereToSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n checkIfHasExplicitWhere?: { value?: boolean },\n): string | undefined => {\n let sql: string | undefined;\n\n if (query.scopes) {\n sql = andOrToSql(ctx, table, query, quotedAs, true);\n\n if (checkIfHasExplicitWhere && sql) {\n checkIfHasExplicitWhere.value = true;\n }\n\n const data = Object.create(query);\n for (const key in query.scopes) {\n const scope = query.scopes[key];\n const scopeResult = scope(table.baseQuery);\n data.and = scopeResult.and;\n data.or = scopeResult.or;\n const scopeSql = andOrToSql(ctx, table, data, quotedAs, true);\n if (scopeSql) {\n sql = sql ? sql + ' AND ' + scopeSql : scopeSql;\n\n if (\n checkIfHasExplicitWhere &&\n key !== 'default' &&\n key !== 'nonDeleted'\n ) {\n checkIfHasExplicitWhere.value = true;\n }\n }\n }\n } else {\n sql = andOrToSql(ctx, table, query, quotedAs, parens);\n\n if (checkIfHasExplicitWhere && sql) {\n checkIfHasExplicitWhere.value = true;\n }\n }\n\n return sql;\n};\n\nconst andOrToSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n): string | undefined => {\n let sql;\n if (query.or) {\n const ors = query.and?.length ? [query.and, ...query.or] : query.or;\n sql = ors\n .map((and) => processAnds(and, ctx, table, query, quotedAs))\n .join(' OR ');\n } else if (query.and) {\n sql = processAnds(query.and, ctx, table, query, quotedAs);\n } else {\n return;\n }\n\n return parens && sql ? `(${sql})` : sql;\n};\n\nconst processAnds = (\n and: WhereItem[],\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n): string | undefined => {\n const ands: string[] = [];\n for (const data of and) {\n processWhere(ands, ctx, table, query, data, quotedAs);\n }\n if (!ands.length) return;\n\n const sql = ands.join(' AND ');\n return parens && ands.length > 1 ? `(${sql})` : sql;\n};\n\nconst processWhere = (\n ands: string[],\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataWithLanguage,\n data: WhereItem,\n quotedAs?: string,\n) => {\n if ('prototype' in data || 'baseQuery' in data) {\n const query = data as Query;\n if (query.q.expr) {\n if (query.q.subQuery === 1) {\n ands.push(selectToSql(ctx, table, query.q, quotedAs));\n } else {\n const q = joinSubQuery(table, query);\n q.q.select = [query.q.expr];\n ands.push(`(${moveMutativeQueryToCte(ctx, q)})`);\n }\n } else {\n const as = getQueryAs(query);\n pushWhereToSql(ands, ctx, query, query.q, as && `\"${as}\"`, true);\n }\n return;\n }\n\n if (isExpression(data)) {\n ands.push(`(${data.toSQL(ctx, quotedAs)})`);\n return;\n }\n\n for (const key in data) {\n const value = (data as RecordUnknown)[key];\n if (value === undefined) continue;\n\n if (key === 'AND') {\n const arr = toArray(value as MaybeArray<WhereItem>);\n const sql = processAnds(arr, ctx, table, query, quotedAs);\n if (sql) ands.push(sql);\n } else if (key === 'OR') {\n const arr = (value as MaybeArray<WhereItem>[]).map(toArray);\n const sqls = arr.reduce<string[]>((acc, and) => {\n const sql = processAnds(and, ctx, table, query, quotedAs);\n if (sql) acc.push(sql);\n return acc;\n }, []);\n if (sqls.length) ands.push(`(${sqls.join(' OR ')})`);\n } else if (key === 'NOT') {\n const arr = toArray(value as MaybeArray<WhereItem>);\n ands.push(`NOT ${processAnds(arr, ctx, table, query, quotedAs, true)}`);\n } else if (key === 'ON') {\n if (Array.isArray(value)) {\n const item = value as WhereJsonPathEqualsItem;\n const leftColumn = columnToSqlNotSelect(\n ctx,\n query,\n query.selectShape,\n item[0],\n quotedAs,\n );\n\n const leftPath = item[1];\n const rightColumn = columnToSqlNotSelect(\n ctx,\n query,\n query.selectShape,\n item[2],\n quotedAs,\n );\n\n const rightPath = item[3];\n\n ands.push(\n `jsonb_path_query_first(${leftColumn}, ${addValue(\n ctx.values,\n leftPath,\n )}) = jsonb_path_query_first(${rightColumn}, ${addValue(\n ctx.values,\n rightPath,\n )})`,\n );\n } else {\n const item = value as WhereOnItem;\n const joinAs = `\"${getJoinItemSource(item.joinFrom)}\"`;\n\n const q: OnColumnToSQLQuery = item.useOuterAliases\n ? {\n joinedShapes: query.joinedShapes,\n aliases: _getQueryOuterAliases(query),\n selectShape: query.selectShape,\n }\n : query;\n\n ands.push(\n `${onColumnToSql(ctx, q, joinAs, item.from)} ${\n item.op || '='\n } ${onColumnToSql(ctx, q, joinAs, item.to)}`,\n );\n }\n } else if (key === 'IN') {\n toArray(value as MaybeArray<WhereInItem>).forEach((item) => {\n pushIn(ctx, query, ands, quotedAs, item);\n });\n } else if (key === 'EXISTS') {\n const joinItems = (\n Array.isArray((value as unknown[])[0]) ? value : [value]\n ) as JoinItemArgs[];\n\n const joinSet = joinItems.length > 1 ? new Set<string>() : null;\n\n for (const args of joinItems) {\n const { target, on } = processJoinItem(\n ctx,\n table,\n query,\n args,\n quotedAs,\n );\n\n const sql = `EXISTS (SELECT 1 FROM ${target}${\n on ? ` WHERE ${on}` : ''\n })`;\n if (joinSet) {\n if (joinSet.has(sql)) continue;\n joinSet.add(sql);\n }\n\n ands.push(sql);\n }\n } else if (key === 'SEARCH') {\n const search = value as WhereSearchItem;\n ands.push(`${search.vectorSQL} @@ \"${search.as}\"`);\n } else if (\n typeof value === 'object' &&\n value &&\n !(value instanceof Date) &&\n !Array.isArray(value)\n ) {\n whereExprOrQuery(ctx, ands, query, key, value, quotedAs);\n } else {\n const column = columnToSqlNotSelect(\n ctx,\n query,\n query.selectShape,\n key,\n quotedAs,\n );\n ands.push(\n `${column} ${\n value === null ? 'IS NULL' : `= ${addValue(ctx.values, value)}`\n }`,\n );\n }\n }\n};\n\nconst whereExprOrQuery = (\n ctx: ToSQLCtx,\n ands: string[],\n query: QueryDataForWhere,\n key: string,\n value: object,\n quotedAs?: string,\n) => {\n if (isExpression(value)) {\n ands.push(\n `${columnToSqlNotSelect(\n ctx,\n query,\n query.selectShape,\n key,\n quotedAs,\n )} = ${value.toSQL(ctx, quotedAs)}`,\n );\n } else {\n let column: Column.Pick.QueryColumn | undefined = query.selectShape[key];\n if (!column) {\n const index = key.indexOf('.');\n if (index === -1) {\n column = query.joinedShapes?.[key]?.value;\n } else if (index !== -1) {\n const table = key.slice(0, index);\n const name = key.slice(index + 1);\n const quoted = `\"${table}\"`;\n\n column = (\n quotedAs === quoted\n ? query.selectShape[name]\n : query.joinedShapes?.[table]?.[name]\n ) as typeof column;\n }\n }\n\n if (!column) {\n throw new Error(`Unknown column ${key} provided to condition`);\n }\n\n const quotedColumn = columnToSqlNotSelect(\n ctx,\n query,\n query.selectShape,\n key,\n quotedAs,\n );\n\n if (value instanceof ctx.qb.constructor) {\n const subQuerySql = moveMutativeQueryToCte(ctx, value as SubQueryForSql);\n\n ands.push(`${quotedColumn} = (${subQuerySql})`);\n } else {\n for (const op in value) {\n const operator = (column.operators as RecordUnknown)[op];\n if (!operator) {\n throw new Error(`Unknown operator ${op} provided to condition`);\n }\n\n if (value[op as keyof typeof value] === undefined) continue;\n\n ands.push(\n `${(operator as unknown as { _op: OperatorToSQL })._op(\n quotedColumn as string,\n value[op as keyof typeof value],\n ctx,\n quotedAs,\n )}`,\n );\n }\n }\n }\n};\n\ninterface OnColumnToSQLQuery {\n joinedShapes?: QueryData['joinedShapes'];\n aliases?: QueryData['aliases'];\n selectShape: ColumnsShape;\n select?: SelectItem[];\n}\n\nconst onColumnToSql = (\n ctx: ToSQLCtx,\n query: OnColumnToSQLQuery,\n joinAs: string,\n column: string,\n) => columnToSqlNotSelect(ctx, query, query.selectShape, column, joinAs);\n\nconst getJoinItemSource = (joinItem: WhereOnJoinItem) => {\n return typeof joinItem === 'string' ? joinItem : getQueryAs(joinItem);\n};\n\nconst pushIn = (\n ctx: ToSQLCtx,\n query: {\n selectShape: ColumnsShape;\n joinedShapes?: JoinedShapes;\n select?: SelectItem[];\n },\n ands: string[],\n quotedAs: string | undefined,\n arg: {\n columns: string[];\n values: unknown[][] | SubQueryForSql | Expression;\n },\n) => {\n // if there are multiple columns, make `(col1, col2) IN ((1, 2), (3, 4))`,\n // otherwise, make `col IN (1, 2, 3)`\n const multiple = arg.columns.length > 1;\n\n let value: string;\n\n if (Array.isArray(arg.values)) {\n value = `${arg.values\n .map(\n multiple\n ? (arr) =>\n `(${arr.map((value) => addValue(ctx.values, value)).join(', ')})`\n : (arr) =>\n `${arr.map((value) => addValue(ctx.values, value)).join(', ')}`,\n )\n .join(', ')}`;\n\n value = `(${value})`;\n } else if (isExpression(arg.values)) {\n value = arg.values.toSQL(ctx, quotedAs);\n } else {\n value = `(${moveMutativeQueryToCte(ctx, arg.values)})`;\n }\n\n const columnsSql = arg.columns\n .map((column) =>\n columnToSqlNotSelect(ctx, query, query.selectShape, column, quotedAs),\n )\n .join(', ');\n\n ands.push(`${multiple ? `(${columnsSql})` : columnsSql} IN ${value}`);\n};\n","export const MAX_BINDING_PARAMS = 65533;\n","import { pushWhereStatementSql } from '../where/where.sql';\nimport { SelectAsValue, SelectItem, selectToSql } from '../select/select.sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { pushQueryValueImmutable, QueryData } from '../../query-data';\nimport { Db } from '../../db';\nimport { RawSql } from '../../expressions/raw-sql';\nimport { MAX_BINDING_PARAMS } from '../../sql/sql-constants';\nimport {\n composeCteSingleSql,\n getTopCteSize,\n moveMutativeQueryToCte,\n setTopCteSize,\n} from '../cte/cte.sql';\nimport { Column } from '../../../columns/column';\nimport {\n addTableHook,\n HookPurpose,\n} from '../../extra-features/hooks/hooks.sql';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { moveQueryToCte } from '../cte/move-mutative-query-to-cte-base.sql';\nimport { isRelationQuery } from '../../relations';\nimport {\n getQueryRelationAliasForAs,\n quoteTableWithSchema,\n SingleSqlItem,\n Sql,\n} from '../../sql/sql';\nimport {\n addValue,\n emptyArray,\n pushOrNewArray,\n RecordUnknown,\n toArray,\n} from '../../../utils';\nimport { OrchidOrmInternalError } from '../../errors';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { HookSelect } from '../select/hook-select';\nimport { getPrimaryKeys } from '../../query-columns/primary-keys';\nimport { _clone } from '../clone/clone';\nimport { Query } from '../../query';\nimport {\n getShouldWrapMainQueryInCte,\n wrapMainQueryInCte,\n} from '../../sql/wrap-main-query-in-cte';\nimport {\n MutativeQueriesSelectRelationsSqlState,\n newMutativeQueriesSelectRelationsSqlState,\n handleInsertAndUpdateSelectRelationsSqlState,\n} from '../../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\nimport { ColumnsShape } from '../../../columns';\n\nexport type OnConflictTarget =\n | string\n | string[]\n | Expression\n | { constraint: string };\n\nexport type OnConflictSet = RecordUnknown;\n\nexport type OnConflictMerge = string | string[] | { except: string | string[] };\n\ninterface InsertSqlState {\n ctx: ToSQLCtx;\n q: ToSQLQuery;\n query: QueryData;\n quotedAs: string;\n returningQuotedAs: string;\n isSubSql?: boolean;\n relationSelectState?: MutativeQueriesSelectRelationsSqlState;\n returningPos: number;\n insertSql: string;\n selectFromSql?: string;\n}\n\ninterface InsertValuesSqlState extends InsertSqlState {\n valuesPrepend: string;\n valuesSql: string[];\n valuesAppend: string;\n}\n\nexport const makeInsertSql = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n query: QueryData,\n quotedAs: string,\n isSubSql?: boolean,\n): Sql => {\n let { columns } = query;\n const shape = q.shape as ColumnsShape;\n const { hookCreateSet } = query;\n const QueryClass = ctx.qb.constructor as unknown as Db;\n\n let { insertFrom, queryColumnsCount, values } = query;\n\n let hookSetSql: string | undefined;\n if (hookCreateSet) {\n ({ hookSetSql, columns, insertFrom, queryColumnsCount, values } =\n processHookSet(\n ctx,\n q,\n values,\n hookCreateSet,\n columns,\n QueryClass,\n quotedAs,\n ));\n }\n\n const quotedColumns = columns.map(\n (column) => `\"${shape[column]?.data.name || column}\"`,\n );\n\n let runtimeDefaults: (() => unknown)[] | undefined;\n let runtimeDefaultColumns: string[] | undefined;\n if (q.internal.runtimeDefaultColumns) {\n runtimeDefaults = [];\n runtimeDefaultColumns = [];\n for (const key of q.internal.runtimeDefaultColumns) {\n if (!columns.includes(key)) {\n const column = shape[key];\n columns.push(key);\n quotedColumns.push(`\"${column.data.name || key}\"`);\n runtimeDefaults.push(column.data.runtimeDefault as () => unknown);\n runtimeDefaultColumns.push(key);\n }\n }\n }\n\n if (quotedColumns.length === 0) {\n const key = Object.keys(q.shape)[0];\n if (key) {\n const column = q.shape[key] as unknown as Column.Pick.Data;\n quotedColumns[0] = `\"${column?.data.name || key}\"`;\n\n // for `create({})` case: `{}` is transformed into `[[]]`,\n // we replace it with `[[undefined]]`, and it generates SQL `VALUES (DEFAULT)`\n if (Array.isArray(values) && Array.isArray(values[0])) {\n values = values.map(() => [undefined]);\n }\n }\n }\n\n // `insertWith` queries are applied only once, need to ignore if `ctx.hasNonSelect` is changed below.\n const hasNonSelect = ctx.hasNonSelect;\n const returningQuotedAs = query.as ? `\"${query.as}\"` : quotedAs;\n const insertAlias = getQueryRelationAliasForAs(q, query.as);\n quotedAs = insertAlias || quotedAs;\n\n const sqlState: InsertSqlState = {\n ctx,\n q,\n query,\n quotedAs,\n returningQuotedAs,\n isSubSql,\n returningPos: 0,\n insertSql: `INSERT INTO ${quoteTableWithSchema(q)}${\n insertAlias ? ` AS ${insertAlias}` : ''\n }${quotedColumns.length ? '(' + quotedColumns.join(', ') + ')' : ''}`,\n };\n ctx.sql.push(null as never, null as never);\n\n const hasOnConflictWhere = pushOnConflictSql(\n ctx,\n q,\n query,\n quotedAs,\n columns,\n quotedColumns,\n runtimeDefaultColumns,\n );\n\n const upsert = query.type === 'upsert';\n\n if (upsert || (insertFrom && !isRelationQuery(q)) || hasOnConflictWhere) {\n pushWhereStatementSql(ctx, q, query, quotedAs);\n }\n\n sqlState.relationSelectState = newMutativeQueriesSelectRelationsSqlState(q);\n\n sqlState.returningPos = ctx.sql.length;\n\n let insertManyFromValuesAs: string | undefined;\n if (insertFrom) {\n if (values.length < 2) {\n const q = insertFrom.clone();\n\n if (values[0]?.length) {\n pushQueryValueImmutable(\n q,\n 'select',\n new RawSql(\n encodeRow(\n ctx,\n ctx.values,\n QueryClass,\n values[0],\n runtimeDefaults,\n quotedAs,\n ),\n ),\n );\n }\n\n ctx.sql[1] = moveMutativeQueryToCte(ctx, q);\n } else {\n const { as, makeSelectList } = moveQueryToCte(\n ctx,\n insertFrom,\n insertFrom.q.type,\n );\n\n const selectList = makeSelectList(true);\n\n insertManyFromValuesAs = query.insertValuesAs;\n selectList.push(\n ...columns.slice(queryColumnsCount || 0).map((key) => {\n const column = shape[key];\n return column\n ? `${insertManyFromValuesAs}.\"${column.data.name || key}\"::${\n column.dataType\n }`\n : `${insertManyFromValuesAs}.\"${key}\"`;\n }),\n );\n\n sqlState.selectFromSql = ` SELECT ${selectList.join(', ')} FROM \"${as}\",`;\n }\n }\n\n if (!insertFrom || insertManyFromValuesAs) {\n const valuesSqlState = sqlState as InsertValuesSqlState;\n valuesSqlState.valuesSql = [];\n valuesSqlState.valuesPrepend =\n (insertManyFromValuesAs ? '(' : '') + (upsert ? 'SELECT ' : 'VALUES ');\n valuesSqlState.valuesAppend = insertManyFromValuesAs\n ? `) ${insertManyFromValuesAs}(${quotedColumns\n .slice(queryColumnsCount || 0)\n .join(', ')})`\n : '';\n\n let ctxValues = ctx.values;\n const restValuesLen = ctxValues.length;\n let currentValuesLen = restValuesLen;\n let batch: SingleSqlItem[] | undefined;\n const { skipBatchCheck } = ctx;\n\n for (let i = 0; i < values.length; i++) {\n const topCteSize = getTopCteSize(ctx);\n\n ctx.skipBatchCheck = true;\n\n let encodedRow = encodeRow(\n ctx,\n ctxValues,\n QueryClass,\n values[i],\n runtimeDefaults,\n quotedAs,\n hookSetSql,\n );\n ctx.skipBatchCheck = skipBatchCheck;\n\n if (!upsert) encodedRow = '(' + encodedRow + ')';\n\n if (ctxValues.length > MAX_BINDING_PARAMS) {\n if (ctxValues.length - currentValuesLen > MAX_BINDING_PARAMS) {\n throw new Error(\n `Too many parameters for a single insert row, max is ${MAX_BINDING_PARAMS}`,\n );\n }\n\n if (!skipBatchCheck) {\n setTopCteSize(ctx, topCteSize);\n\n // save current batch\n applySqlState(sqlState);\n\n ctxValues.length = currentValuesLen;\n\n batch = pushOrNewArray(batch, composeCteSingleSql(ctx));\n\n // reset sql and values for the next batch, repeat the last cycle\n ctx.topCtx.topCTE = undefined;\n ctxValues = ctx.values = [];\n valuesSqlState.valuesSql.length = 0;\n i--;\n continue;\n }\n }\n\n currentValuesLen = ctxValues.length;\n valuesSqlState.valuesSql.push(encodedRow);\n }\n\n if (batch) {\n if (hasNonSelect) {\n throw new OrchidOrmInternalError(\n q,\n `Cannot insert many records when having a non-select sub-query`,\n );\n }\n\n applySqlState(sqlState);\n\n batch.push(composeCteSingleSql(ctx));\n\n handleInsertAndUpdateSelectRelationsSqlState(\n ctx,\n sqlState.relationSelectState,\n );\n\n return {\n batch,\n };\n }\n }\n\n applySqlState(sqlState);\n\n handleInsertAndUpdateSelectRelationsSqlState(\n ctx,\n sqlState.relationSelectState,\n );\n\n return {\n text: ctx.sql.join(' '),\n values: ctx.values,\n };\n};\n\nconst pushOnConflictSql = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n query: QueryData,\n quotedAs: string,\n columns: string[],\n quotedColumns: string[],\n runtimeDefaultColumns?: string[],\n): boolean => {\n if (!query.onConflict) return false;\n\n const shape = q.shape as ColumnsShape;\n\n ctx.sql.push('ON CONFLICT');\n\n const { target } = query.onConflict;\n if (target) {\n if (typeof target === 'string') {\n ctx.sql.push(`(\"${shape[target]?.data.name || target}\")`);\n } else if (Array.isArray(target)) {\n ctx.sql.push(\n `(${target.reduce(\n (sql, item, i) =>\n sql + (i ? ', ' : '') + `\"${shape[item]?.data.name || item}\"`,\n '',\n )})`,\n );\n } else if ('toSQL' in target) {\n ctx.sql.push(target.toSQL(ctx, quotedAs));\n } else {\n ctx.sql.push(`ON CONSTRAINT \"${target.constraint}\"`);\n }\n }\n\n // merge: undefined should also be handled by this `if`\n if ('merge' in query.onConflict) {\n let sql: string;\n\n const { merge } = query.onConflict;\n if (merge) {\n if (typeof merge === 'string') {\n const name = shape[merge]?.data.name || merge;\n sql = `DO UPDATE SET \"${name}\" = excluded.\"${name}\"`;\n } else if ('except' in merge) {\n sql = mergeColumnsSql(columns, quotedColumns, target, [\n ...toArray(merge.except),\n ...(runtimeDefaultColumns || emptyArray),\n ]);\n } else {\n sql = `DO UPDATE SET ${merge.reduce((sql, item, i) => {\n const name = shape[item]?.data.name || item;\n return sql + (i ? ', ' : '') + `\"${name}\" = excluded.\"${name}\"`;\n }, '')}`;\n }\n } else {\n sql = mergeColumnsSql(\n columns,\n quotedColumns,\n target,\n runtimeDefaultColumns,\n );\n }\n\n ctx.sql.push(sql);\n return true;\n } else if (query.onConflict.set) {\n const { set } = query.onConflict;\n const arr: string[] = [];\n for (const key in set) {\n const val = set[key];\n const value = isExpression(val)\n ? val.toSQL(ctx, quotedAs)\n : addValue(ctx.values, val);\n\n arr.push(`\"${shape[key]?.data.name || key}\" = ${value}`);\n }\n\n ctx.sql.push('DO UPDATE SET', arr.join(', '));\n return true;\n } else {\n ctx.sql.push('DO NOTHING');\n return false;\n }\n};\n\nconst applySqlState = (\n sqlState: InsertSqlState | InsertValuesSqlState,\n): void => {\n const { ctx } = sqlState;\n\n const insertSql = sqlState.selectFromSql\n ? sqlState.insertSql + sqlState.selectFromSql\n : sqlState.insertSql;\n\n const wrapInCte = getShouldWrapMainQueryInCte(\n ctx,\n sqlState.query,\n 'insert',\n sqlState.isSubSql,\n );\n\n if ('valuesSql' in sqlState) {\n ctx.sql[1] =\n sqlState.valuesPrepend +\n sqlState.valuesSql.join(', ') +\n sqlState.valuesAppend;\n }\n\n const returning = makeReturningSql(\n ctx,\n sqlState.q,\n sqlState.query,\n sqlState.returningQuotedAs,\n sqlState.relationSelectState,\n 'Create',\n undefined,\n sqlState.isSubSql || !!ctx.topCtx.cteHooks,\n );\n\n if (returning) {\n ctx.sql[sqlState.returningPos] = 'RETURNING ' + returning;\n }\n\n ctx.sql[0] = insertSql;\n\n if (wrapInCte) {\n wrapMainQueryInCte(ctx, sqlState.query);\n }\n};\n\nconst processHookSet = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n values: unknown[][],\n hookCreateSet: RecordUnknown[],\n columns: string[],\n QueryClass: Db,\n quotedAs: string,\n): {\n hookSetSql?: string | undefined;\n columns: string[];\n insertFrom?: SubQueryForSql;\n queryColumnsCount?: number;\n values: unknown[][];\n} => {\n const hookSet: RecordUnknown = {};\n for (const item of hookCreateSet) {\n Object.assign(hookSet, item);\n }\n\n const addHookSetColumns = Object.keys(hookSet).filter(\n (key) => !columns.includes(key),\n );\n\n let insertFrom = q.q.insertFrom;\n if (insertFrom) {\n const newColumns = new Set<string>();\n const originalSelect = insertFrom.q.select;\n if (originalSelect) {\n insertFrom = _clone(insertFrom) as unknown as SubQueryForSql;\n const select: SelectItem[] = [];\n for (const s of originalSelect) {\n if (typeof s === 'string' && !hookSet[s]) {\n select.push(s);\n newColumns.add(s);\n } else if (typeof s === 'object' && 'selectAs' in s) {\n const filtered: SelectAsValue = {};\n for (const key in s.selectAs) {\n if (!hookSet[key]) {\n filtered[key] = s.selectAs[key];\n newColumns.add(key);\n }\n }\n select.push({ selectAs: filtered });\n }\n }\n insertFrom.q.select = select;\n }\n\n if (values.length) {\n const newValues: unknown[][] = [];\n\n const valuesColumnsSet = new Set<string>();\n values.forEach((originalRow, i) => {\n const valuesColumns = columns.slice(-originalRow.length);\n const row: unknown[] = [];\n newValues[i] = row;\n valuesColumns.forEach((c, i) => {\n if (!hookSet[c] && !newColumns.has(c)) {\n valuesColumnsSet.add(c);\n row.push(originalRow[i]);\n }\n });\n });\n\n for (const valueColumn of valuesColumnsSet) {\n newColumns.add(valueColumn);\n }\n\n values = newValues;\n } else {\n values = [[]];\n }\n\n columns.forEach((column) => {\n if (column in hookSet) {\n newColumns.add(column);\n\n const fromHook = {\n fromHook: encodeValue(\n ctx,\n ctx.values,\n QueryClass,\n hookSet[column],\n quotedAs,\n ),\n };\n\n for (const row of values) {\n row.push(fromHook);\n }\n }\n });\n\n const queryColumnsCount = insertFrom.q.select?.length;\n\n if (addHookSetColumns) {\n for (const key of addHookSetColumns) {\n for (const row of values) {\n row.push({\n fromHook: encodeValue(\n ctx,\n ctx.values,\n QueryClass,\n hookSet[key],\n quotedAs,\n ),\n });\n }\n }\n\n return {\n columns: [...newColumns, ...addHookSetColumns],\n insertFrom,\n queryColumnsCount,\n values,\n };\n }\n\n return { columns: [...newColumns], insertFrom, queryColumnsCount, values };\n }\n\n columns.forEach((column, i) => {\n if (column in hookSet) {\n const fromHook = {\n fromHook: encodeValue(\n ctx,\n ctx.values,\n QueryClass,\n hookSet[column],\n quotedAs,\n ),\n };\n for (const row of values) {\n row[i] = fromHook;\n }\n }\n });\n\n const hookSetSql = addHookSetColumns\n .map((key) =>\n encodeValue(\n ctx,\n ctx.values,\n QueryClass,\n (hookSet as RecordUnknown)[key],\n quotedAs,\n ),\n )\n .join(', ');\n\n return {\n hookSetSql,\n columns: addHookSetColumns ? [...columns, ...addHookSetColumns] : columns,\n values,\n };\n};\n\nconst mergeColumnsSql = (\n columns: string[],\n quotedColumns: string[],\n target: OnConflictTarget | undefined,\n except?: string[],\n): string => {\n const notExcluded: string[] = [];\n\n const exclude =\n typeof target === 'string'\n ? [target]\n : Array.isArray(target)\n ? [...target]\n : [];\n\n if (except) {\n if (typeof except === 'string') {\n exclude.push(except);\n } else {\n exclude.push(...except);\n }\n }\n\n for (let i = 0; i < columns.length; i++) {\n if (!exclude.includes(columns[i])) {\n notExcluded.push(quotedColumns[i]);\n }\n }\n\n return notExcluded.length\n ? `DO UPDATE SET ${notExcluded\n .map((column) => `${column} = excluded.${column}`)\n .join(', ')}`\n : // update whatever is the first column because DO NOTHING prevents RETURNING,\n // and we might want to return data from the insert\n `DO UPDATE SET ${quotedColumns[0]} = excluded.${quotedColumns[0]}`;\n};\n\nconst encodeRow = (\n ctx: ToSQLCtx,\n values: unknown[],\n QueryClass: Db,\n row: unknown[],\n runtimeDefaults?: (() => unknown)[],\n quotedAs?: string,\n hookSetSql?: string,\n) => {\n const arr = row.map((value) =>\n encodeValue(ctx, values, QueryClass, value, quotedAs),\n );\n\n if (runtimeDefaults) {\n for (const fn of runtimeDefaults) {\n arr.push(addValue(values, fn()));\n }\n }\n\n if (hookSetSql) arr.push(hookSetSql);\n\n return arr.join(', ');\n};\n\nconst encodeValue = (\n ctx: ToSQLCtx,\n values: unknown[],\n QueryClass: Db,\n value: unknown,\n quotedAs?: string,\n) => {\n if (value && typeof value === 'object') {\n if (isExpression(value)) {\n return value.toSQL(ctx, quotedAs);\n } else if (value instanceof (QueryClass as never)) {\n return `(${moveMutativeQueryToCte(ctx, value as SubQueryForSql)})`;\n } else if ('fromHook' in value) {\n return value.fromHook as string;\n }\n }\n\n return value === undefined ? 'DEFAULT' : addValue(values, value);\n};\n\nexport const makeReturningSql = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n data: QueryData,\n quotedAs: string,\n relationSelectState: MutativeQueriesSelectRelationsSqlState | undefined,\n hookPurpose?: HookPurpose,\n addHookPurpose?: HookPurpose,\n isSubSql?: boolean,\n): string | undefined => {\n const hookSelect = hookPurpose && data[`after${hookPurpose}Select`];\n\n const { select } = data;\n if (!q.q.hookSelect && !hookSelect?.size && !select?.length && !hookPurpose) {\n const select = hookSelect && new Map();\n\n addTableHook(ctx, q, q.q, select);\n\n ctx.selectedCount = 1;\n return returnSqlOrNull(ctx, q, isSubSql);\n }\n\n const otherCTEHookSelect =\n addHookPurpose && data[`after${addHookPurpose}Select`];\n\n let tempSelect: HookSelect | undefined;\n if (\n q.q.hookSelect ||\n hookSelect ||\n otherCTEHookSelect ||\n q.q.selectRelation\n ) {\n tempSelect = new Map(q.q.hookSelect);\n\n if (hookSelect) {\n for (const column of hookSelect) {\n if (!tempSelect.has(column)) {\n tempSelect.set(column, { select: column });\n }\n }\n }\n\n if (otherCTEHookSelect) {\n for (const column of otherCTEHookSelect) {\n if (!tempSelect.has(column)) {\n tempSelect.set(column, { select: column });\n }\n }\n }\n\n // delete loads relations in a CTE\n if (q.q.selectRelation && hookPurpose !== 'Delete') {\n for (const column of getPrimaryKeys(q as Query)) {\n if (!tempSelect.has(column)) {\n tempSelect.set(column, { select: column });\n }\n }\n }\n }\n\n let sql: string | undefined;\n if (tempSelect?.size || select?.length) {\n sql = selectToSql(\n ctx,\n q,\n data,\n quotedAs,\n tempSelect,\n isSubSql,\n undefined,\n undefined,\n relationSelectState,\n );\n }\n\n addTableHook(ctx, q, data, tempSelect, hookPurpose);\n\n if (!sql) ctx.selectedCount = 1;\n\n return returnSqlOrNull(ctx, q, isSubSql, sql);\n};\n\nconst returnSqlOrNull = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n isSubSql?: boolean,\n sql?: string,\n): string | undefined => {\n return (\n sql ||\n (isSubSql || ctx.topCtx.cteHooks || q.q.appendQueries ? 'NULL' : undefined)\n );\n};\n","import { QueryData } from '../../query-data';\nimport { queryTypeWithLimitOne } from '../../query';\nimport { addValue } from '../../../utils';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { ToSQLCtx } from '../../sql/to-sql';\n\nexport function pushLimitOffsetSql(\n ctx: ToSQLCtx,\n query: QueryData,\n fromQuery?: SubQueryForSql,\n) {\n if (query.useFromLimitOffset) {\n const q = fromQuery?.q as QueryData;\n if (q.limit) {\n ctx.sql.push(`LIMIT ${addValue(ctx.values, q.limit)}`);\n }\n if (q.offset) {\n ctx.sql.push(`OFFSET ${addValue(ctx.values, q.offset)}`);\n }\n } else {\n pushLimitSQL(ctx.sql, ctx.values, query);\n\n if (query.offset && !query.returnsOne) {\n ctx.sql.push(`OFFSET ${addValue(ctx.values, query.offset)}`);\n }\n }\n}\n\nexport function pushLimitSQL(sql: string[], values: unknown[], q: QueryData) {\n if (!q.returnsOne) {\n if (queryTypeWithLimitOne[q.returnType as string] && !q.returning) {\n sql.push(`LIMIT 1`);\n } else if (q.limit) {\n sql.push(`LIMIT ${addValue(values, q.limit)}`);\n }\n }\n}\n","import { makeReturningSql } from './insert.sql';\nimport { pushWhereStatementSql, whereToSql } from '../where/where.sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport {\n QueryData,\n UpdateManyQueryData,\n UpdateQueryDataItem,\n UpdateQueryDataObject,\n} from '../../query-data';\nimport { Db } from '../../db';\nimport { selectToSql } from '../select/select.sql';\nimport { countSelect } from '../../expressions/raw-sql';\nimport { Query } from '../../query';\nimport { JoinItemArgs, processJoinItem } from '../join/join.sql';\nimport { moveMutativeQueryToCte, setFreeTopCteAs } from '../cte/cte.sql';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { pushLimitSQL } from '../limit-offset/limit-offset.sql';\nimport {\n getQueryRelationAliasForAs,\n makeSql,\n quoteTableWithSchema,\n Sql,\n} from '../../sql/sql';\nimport {\n addValue,\n emptyObject,\n pushOrNewArray,\n RecordUnknown,\n} from '../../../utils';\nimport { isExpression } from '../../expressions/expression';\nimport { throwOnReadOnlyUpdate } from '../../query.utils';\nimport { OrchidOrmInternalError } from '../../errors';\nimport { ensureCTECount } from '../../extra-features/hooks/hooks.sql';\nimport {\n MutativeQueriesSelectRelationsSqlState,\n newMutativeQueriesSelectRelationsSqlState,\n handleInsertAndUpdateSelectRelationsSqlState,\n restoreValuesJoinedAsForMutativeSelectRelations,\n unsetValuesJoinedAsForMutativeSelectRelations,\n} from '../../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\nimport { ColumnsShape } from 'pqb/index';\n\nexport const pushUpdateSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n isSubSql?: boolean,\n): Sql => {\n const valuesJoinedAs = unsetValuesJoinedAsForMutativeSelectRelations(query);\n\n try {\n return pushUpdateSqlWithoutValuesJoinedAs(\n ctx,\n query,\n q,\n quotedAs,\n isSubSql,\n );\n } finally {\n restoreValuesJoinedAsForMutativeSelectRelations(query, valuesJoinedAs);\n }\n};\n\nconst pushUpdateSqlWithoutValuesJoinedAs = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n isSubSql?: boolean,\n): Sql => {\n const from = quoteTableWithSchema(query);\n const alias = getQueryRelationAliasForAs(query, q.as);\n quotedAs = alias || quotedAs;\n\n const set: string[] = [];\n\n const hookSet = q.hookUpdateSet\n ? Object.fromEntries(\n q.hookUpdateSet.flatMap((item) => Object.entries(item)),\n )\n : emptyObject;\n\n const relationSelectState = newMutativeQueriesSelectRelationsSqlState(query);\n\n // User can use `set({ key: 'value' })` multiple times,\n // `usedSetKeys` is here to track what keys were already added to SQL to not add them twice.\n const usedSetKeys = new Set<string>();\n\n // Applies `hookSet`: key-values that should be set by the update hooks.\n // Adds SQL key-value pairs into `set` array.\n // Must be applied before other `set` data: the earlier one takes precedence.\n if (q.hookUpdateSet) {\n applySet(ctx, query, set, hookSet, emptyObject, usedSetKeys, quotedAs);\n }\n\n // updateData is array of update sets that's coming from `set`, `updateMany`, also `timestamps` logic are adding to it,\n // `processData` processes it into `set` array of SQL strings for key-value pairs.\n if (q.updateData) {\n processData(ctx, query, set, q.updateData, hookSet, usedSetKeys, quotedAs);\n }\n\n let updateManyValuesSql;\n if (q.updateMany) {\n for (const key of q.updateMany.primaryKeys) {\n usedSetKeys.add(key);\n }\n\n updateManyValuesSql = makeUpdateManyValuesSql(\n ctx,\n query,\n q.updateMany,\n set,\n usedSetKeys,\n quotedAs,\n );\n }\n\n // If nothing to set, make a SELECT query\n if (!set.length) {\n pushSelectForEmptySet(\n ctx,\n query,\n q,\n quotedAs,\n from,\n isSubSql,\n updateManyValuesSql,\n relationSelectState,\n );\n } else {\n ctx.sql.push(`UPDATE ${from}`);\n\n if (alias) {\n ctx.sql.push(alias);\n }\n\n ctx.sql.push('SET', set.join(', '));\n\n let fromWhereSql;\n\n if (updateManyValuesSql) {\n if (q.updateMany?.strict) {\n addUpdateManyCteForStrict(ctx, q.updateMany);\n }\n\n ctx.sql.push('FROM', updateManyValuesSql);\n } else if (q.updateFrom) {\n fromWhereSql = pushUpdateFromSql(ctx, query, q, quotedAs, q.updateFrom);\n }\n\n pushUpdateWhereSql(\n ctx,\n query,\n q,\n quotedAs,\n updateManyValuesSql || q.updateFrom,\n fromWhereSql,\n );\n\n pushUpdateReturning(\n ctx,\n query,\n q,\n quotedAs,\n 'RETURNING',\n relationSelectState,\n isSubSql,\n );\n }\n\n handleInsertAndUpdateSelectRelationsSqlState(ctx, relationSelectState);\n\n return makeSql(ctx, 'update', isSubSql);\n};\n\nconst pushSelectForEmptySet = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n from: string,\n isSubSql?: boolean,\n updateManyValuesSql?: string,\n relationSelectState?: MutativeQueriesSelectRelationsSqlState,\n) => {\n if (!q.select) {\n q.select = countSelect;\n }\n\n pushUpdateReturning(\n ctx,\n query,\n q,\n quotedAs,\n 'SELECT',\n relationSelectState,\n isSubSql,\n );\n\n let fromSql = `FROM ${from}`;\n\n const alias = getQueryRelationAliasForAs(query, q.as);\n if (alias) {\n fromSql += ` ${alias}`;\n }\n\n if (updateManyValuesSql) {\n fromSql += `, ${updateManyValuesSql}`;\n }\n\n ctx.sql.push(fromSql);\n pushWhereStatementSql(ctx, query, q, quotedAs);\n pushLimitSQL(ctx.sql, ctx.values, q);\n};\n\n// For strict variants, set up CTE infrastructure\nconst addUpdateManyCteForStrict = (\n ctx: ToSQLCtx,\n updateMany: UpdateManyQueryData,\n) => {\n const wrapAs = setFreeTopCteAs(ctx);\n ctx.wrapAs = wrapAs;\n ensureCTECount(ctx, wrapAs, { count: updateMany.data.length });\n};\n\nconst pushUpdateFromSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n updateFrom: JoinItemArgs,\n): string | undefined => {\n const { target, on } = processJoinItem(ctx, query, q, updateFrom, quotedAs);\n\n ctx.sql.push(`FROM ${target}`);\n\n let fromWhereSql = on;\n\n if (q.join) {\n const joinSet = q.join.length > 1 ? new Set<string>() : null;\n\n for (const item of q.join) {\n const { target, on } = processJoinItem(\n ctx,\n query,\n q,\n item.args,\n quotedAs,\n );\n\n if (joinSet) {\n const key = `${item.type}${target}${on}`;\n if (joinSet.has(key)) continue;\n joinSet.add(key);\n }\n\n ctx.sql.push(`${item.type} ${target} ON true`);\n\n if (on) {\n fromWhereSql = fromWhereSql ? fromWhereSql + ' AND ' + on : on;\n }\n }\n }\n\n return fromWhereSql;\n};\n\nconst pushUpdateWhereSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n from?: unknown,\n fromWhereSql?: string,\n): void => {\n const checkIfHasExplicitWhere: { value?: true } | undefined =\n q.all || from ? undefined : {};\n const mainWhereSql = whereToSql(\n ctx,\n query,\n q,\n quotedAs,\n undefined,\n checkIfHasExplicitWhere,\n );\n\n if (checkIfHasExplicitWhere && !checkIfHasExplicitWhere.value) {\n throw new OrchidOrmInternalError(\n query as Query,\n `Dangerous update without conditions`,\n );\n }\n\n const whereSql = mainWhereSql\n ? fromWhereSql\n ? mainWhereSql + ' AND ' + fromWhereSql\n : mainWhereSql\n : fromWhereSql;\n if (whereSql) {\n ctx.sql.push('WHERE', whereSql);\n }\n};\n\nconst pushUpdateReturning = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n keyword: string,\n relationSelectState: MutativeQueriesSelectRelationsSqlState | undefined,\n isSubSql?: boolean,\n) => {\n const returning = makeReturningSql(\n ctx,\n query,\n q,\n quotedAs,\n relationSelectState,\n 'Update',\n undefined,\n isSubSql,\n );\n\n if (returning) ctx.sql.push(keyword, returning);\n};\n\nconst processData = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n set: string[],\n data: UpdateQueryDataItem[],\n hookSet: RecordUnknown,\n usedSetKeys: Set<string>,\n quotedAs?: string,\n) => {\n let append: UpdateQueryDataItem[] | undefined;\n\n for (let i = data.length - 1; i >= 0; i--) {\n const item = data[i];\n if (typeof item === 'function') {\n const result = item(data);\n if (result) append = pushOrNewArray(append, result);\n } else {\n applySet(ctx, query, set, item, hookSet, usedSetKeys, quotedAs);\n }\n }\n\n if (append) {\n processData(ctx, query, set, append, hookSet, usedSetKeys, quotedAs);\n }\n};\n\nconst applySet = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n set: string[],\n item: UpdateQueryDataObject,\n skipColumns: RecordUnknown,\n usedSetKeys: Set<string>,\n quotedAs?: string,\n) => {\n const QueryClass = ctx.qb.constructor as unknown as Db;\n const shape = query.shape as ColumnsShape;\n\n for (const key in item) {\n if (usedSetKeys.has(key)) {\n continue;\n }\n\n usedSetKeys.add(key);\n\n const value = item[key];\n if (value === undefined || key in skipColumns) continue;\n\n set.push(\n `\"${shape[key].data.name || key}\" = ${processValue(\n ctx,\n query,\n QueryClass,\n key,\n value,\n quotedAs,\n )}`,\n );\n }\n};\n\nconst processValue = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n QueryClass: Db,\n key: string,\n value: UpdateQueryDataObject[string],\n quotedAs?: string,\n) => {\n if (value && typeof value === 'object') {\n if (isExpression(value)) {\n return value.toSQL(ctx, quotedAs);\n } else if (value instanceof (QueryClass as never)) {\n const subQuery = value as Query;\n if (subQuery.q.subQuery === 1) {\n return selectToSql(ctx, query, subQuery.q, quotedAs);\n }\n\n return `(${moveMutativeQueryToCte(\n ctx,\n subQuery as unknown as SubQueryForSql,\n )})`;\n } else if ('op' in value && 'arg' in value) {\n return `\"${(query.shape as ColumnsShape)[key].data.name || key}\" ${\n (value as { op: string }).op\n } ${addValue(ctx.values, (value as { arg: unknown }).arg)}`;\n }\n }\n\n return addValue(ctx.values, value);\n};\n\n// Build FROM (VALUES ...) \"v\"(\"col1\", \"col2\")\nconst makeUpdateManyValuesSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n updateMany: UpdateManyQueryData,\n set: string[],\n usedSetKeys: Set<string>,\n quotedAs: string,\n) => {\n const shape = query.shape as ColumnsShape;\n\n const keysSet = new Set<string>();\n const valueRows: string[] = [];\n const quotedColumnNames: string[] = [];\n const { data } = updateMany;\n\n for (let i = 0; i < data.length; i++) {\n const row = data[i];\n const cells: string[] = [];\n let keysInRow = 0;\n\n for (const key in row) {\n let value = row[key];\n if (value === undefined) {\n continue;\n }\n\n const column = shape[key];\n const columnName = column.data.name || key;\n\n if (column.data.virtual) continue;\n throwOnReadOnlyUpdate(query, column, key);\n\n keysInRow++;\n\n if (isExpression(value)) {\n cells.push(value.toSQL(ctx, quotedAs));\n } else {\n if (column.data.encode && value !== null) {\n value = column.data.encode(value);\n }\n\n cells.push(addValue(ctx.values, value));\n }\n\n // Cast the first VALUES row so Postgres can infer column types,\n // and collect the alias column names once.\n if (i === 0) {\n keysSet.add(key);\n cells[cells.length - 1] += `::${column.dataType}`;\n quotedColumnNames.push(`\"${columnName}\"`);\n\n if (!usedSetKeys.has(key)) {\n set.push(`\"${shape[key].data.name || key}\" = \"v\".\"${columnName}\"`);\n }\n } else if (!keysSet.has(key)) {\n throwOnDifferentColumns(query, keysSet, row, i);\n }\n }\n\n if (keysInRow < keysSet.size) {\n throwOnDifferentColumns(query, keysSet, row, i);\n }\n\n valueRows.push(`(${cells.join(', ')})`);\n }\n\n return `(VALUES ${valueRows.join(', ')}) \"v\"(${quotedColumnNames.join(\n ', ',\n )})`;\n};\n\nconst throwOnDifferentColumns = (\n query: ToSQLQuery,\n keysSet: Set<string>,\n row: RecordUnknown,\n i: number,\n) => {\n throw new OrchidOrmInternalError(\n query,\n `Row ${i} has different columns than row 0. Expected: [${[...keysSet].join(\n ', ',\n )}], got: [${Object.keys(row).join(', ')}]`,\n );\n};\n","import { pushWhereStatementSql } from '../where/where.sql';\nimport { makeReturningSql } from './insert.sql';\nimport { processJoinItem } from '../join/join.sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { QueryData } from '../../query-data';\nimport { Query } from '../../query';\nimport { isRelationQuery } from '../../relations';\nimport { OrchidOrmInternalError } from '../../errors';\nimport {\n getQueryRelationAliasForAs,\n makeSql,\n quoteTableWithSchema,\n Sql,\n} from '../../sql/sql';\nimport {\n handleDeleteSelectRelationsSqlState,\n newMutativeQueriesSelectRelationsSqlState,\n} from '../../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\nimport { anyShape } from '../../../columns';\n\nexport const pushDeleteSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n isSubSql?: boolean,\n): Sql => {\n const from = quoteTableWithSchema(query);\n ctx.sql.push(`DELETE FROM ${from}`);\n\n const alias = getQueryRelationAliasForAs(query, q.as);\n if (alias) {\n ctx.sql.push(alias);\n }\n\n const relationSelectState = newMutativeQueriesSelectRelationsSqlState(query);\n\n let returning = makeReturningSql(\n ctx,\n query,\n q,\n quotedAs,\n relationSelectState,\n 'Delete',\n undefined,\n isSubSql,\n );\n\n const selectRelations = handleDeleteSelectRelationsSqlState(\n ctx,\n query,\n relationSelectState,\n );\n\n let join = q.join;\n if (selectRelations) {\n returning =\n (returning ? returning + ', ' : '') + selectRelations.addReturning;\n\n join = join ? [...join, selectRelations.join] : [selectRelations.join];\n\n q = {\n ...q,\n joinedShapes: {\n ...q.joinedShapes,\n [selectRelations.joinedShape]: anyShape,\n },\n };\n }\n\n let conditions: string | undefined;\n if (join?.length) {\n const targets: string[] = [];\n const ons: string[] = [];\n\n const joinSet = join.length > 1 ? new Set<string>() : null;\n\n for (const item of join) {\n const lateral = 'l' in item.args && item.args.l;\n if (lateral) {\n if (isRelationQuery(lateral)) {\n continue;\n }\n\n throw new OrchidOrmInternalError(\n query as Query,\n 'Join lateral is not supported in delete',\n );\n }\n\n const join = processJoinItem(ctx, query, q, item.args, quotedAs);\n\n const key = `${join.target}${join.on}`;\n if (joinSet) {\n if (joinSet.has(key)) continue;\n joinSet.add(key);\n }\n targets.push(join.target);\n if (join.on) ons.push(join.on);\n }\n\n if (targets.length) {\n ctx.sql.push(`USING ${targets.join(', ')}`);\n }\n\n conditions = ons.join(' AND ');\n }\n\n let checkIfHasExplicitWhere: { value?: boolean } | undefined;\n\n if (!selectRelations?.movedWhereToCte) {\n checkIfHasExplicitWhere = {};\n pushWhereStatementSql(ctx, query, q, quotedAs, checkIfHasExplicitWhere);\n }\n\n if (conditions) {\n if (\n !selectRelations?.movedWhereToCte &&\n (q.and?.length || q.or?.length || q.scopes)\n ) {\n ctx.sql.push('AND', conditions);\n } else {\n ctx.sql.push('WHERE', conditions);\n }\n } else if (!q.all && !checkIfHasExplicitWhere?.value) {\n throw new OrchidOrmInternalError(\n query as Query,\n `Dangerous delete without conditions`,\n );\n }\n\n if (returning) {\n ctx.sql.push('RETURNING', returning);\n }\n\n return makeSql(ctx, 'delete', isSubSql);\n};\n","import { rawOrColumnToSql } from '../../sql/column-to-sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { QueryData } from '../../query-data';\n\nexport const pushDistinctSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n distinct: Exclude<QueryData['distinct'], undefined>,\n quotedAs?: string,\n) => {\n ctx.sql.push('DISTINCT');\n\n if (distinct.length) {\n const columns = distinct?.map((item) =>\n rawOrColumnToSql(ctx, table.q, table.q.selectShape, item, quotedAs),\n );\n ctx.sql.push(`ON (${columns?.join(', ') || ''})`);\n }\n};\n","import { columnToSqlNotSelect } from '../../sql/column-to-sql';\nimport { SortDir } from '../../basic-features/order/order.sql';\nimport { addValue, MaybeArray } from '../../../utils';\nimport { Expression } from '../../expressions/expression';\nimport { ToSQLCtx } from '../../sql/to-sql';\nimport { QueryData } from '../../query-data';\nimport { isRawSQL } from '../../expressions/raw-sql';\n\nexport type OrderTsQueryConfig = true | OrderTsQueryConfigObject;\n\ninterface OrderTsQueryConfigObject {\n coverDensity?: boolean;\n weights?: number[];\n normalization?: number;\n dir?: SortDir;\n}\n\nexport type SearchWeight = 'A' | 'B' | 'C' | 'D';\n\nexport interface SearchWeightRecord {\n [K: string]: SearchWeight;\n}\n\nexport interface WhereSearchItem {\n as: string;\n vectorSQL: string;\n}\n\nexport type QuerySourceItem = {\n queryAs: string;\n as?: string;\n textSQL?: MaybeArray<string>;\n langSQL?: string;\n vectorSQL?: string;\n order?: OrderTsQueryConfig;\n} & (\n | {\n language?: string;\n }\n | {\n languageColumn: string;\n }\n) &\n (\n | {\n text: string | Expression;\n }\n | {\n in: MaybeArray<string> | SearchWeightRecord;\n }\n | {\n vector: string;\n }\n ) &\n (\n | {\n query: string | Expression;\n }\n | {\n plainQuery: string | Expression;\n }\n | {\n phraseQuery: string | Expression;\n }\n | {\n tsQuery: string | Expression;\n }\n );\n\nexport interface QueryDataSources {\n [K: string]: QuerySourceItem;\n}\n\nexport const searchSourcesToSql = (\n ctx: ToSQLCtx,\n data: QueryData,\n sources: QueryDataSources,\n sql: string,\n quotedAs?: string,\n): string => {\n for (const as in sources) {\n const source = sources[as];\n\n const lang = getSearchLang(ctx, data, source, quotedAs);\n source.vectorSQL = getTsVector(ctx, data, lang, source, quotedAs);\n\n let fn;\n let query;\n if ('query' in source) {\n fn = 'websearch_to_tsquery';\n query = source.query;\n } else if ('plainQuery' in source) {\n fn = 'plainto_tsquery';\n query = source.plainQuery;\n } else if ('phraseQuery' in source) {\n fn = 'phraseto_tsquery';\n query = source.phraseQuery;\n } else {\n fn = 'to_tsquery';\n query = source.tsQuery;\n }\n\n let querySql;\n if (typeof query === 'string') {\n ctx.values.push(query);\n querySql = `$${ctx.values.length}`;\n } else {\n querySql = `${query.toSQL(ctx, quotedAs)}`;\n }\n\n sql += `, ${fn}(${lang}, ${querySql}) \"${as}\"`;\n }\n return sql;\n};\n\nexport const getSearchLang = (\n ctx: ToSQLCtx,\n data: QueryData,\n source: QuerySourceItem,\n quotedAs?: string,\n): string => {\n return (source.langSQL ??=\n 'languageColumn' in source\n ? columnToSqlNotSelect(\n ctx,\n data,\n data.selectShape,\n source.languageColumn,\n quotedAs,\n )\n : isRawSQL(source.language)\n ? source.language.toSQL(ctx)\n : addValue(ctx.values, source.language || data.language || 'english'));\n};\n\nexport const getSearchText = (\n ctx: ToSQLCtx,\n data: QueryData,\n source: QuerySourceItem,\n quotedAs?: string,\n forHeadline?: boolean,\n): MaybeArray<string> => {\n let sql = source.textSQL;\n if (sql) return sql;\n\n if ('in' in source) {\n if (typeof source.in === 'string') {\n sql = columnToSqlNotSelect(\n ctx,\n data,\n data.selectShape,\n source.in,\n quotedAs,\n );\n } else if (Array.isArray(source.in)) {\n sql = `concat_ws(' ', ${source.in\n .map((column) =>\n columnToSqlNotSelect(ctx, data, data.selectShape, column, quotedAs),\n )\n .join(', ')})`;\n } else {\n sql = [];\n for (const key in source.in) {\n sql.push(\n columnToSqlNotSelect(ctx, data, data.selectShape, key, quotedAs),\n );\n }\n }\n } else if ('vector' in source) {\n if (forHeadline) {\n throw new Error(\n 'Cannot use a search based on a vector column for a search headline',\n );\n }\n\n sql = columnToSqlNotSelect(\n ctx,\n data,\n data.selectShape,\n source.vector,\n quotedAs,\n );\n } else {\n if (typeof source.text === 'string') {\n sql = addValue(ctx.values, source.text);\n } else {\n sql = source.text.toSQL(ctx, quotedAs);\n }\n }\n\n return (source.textSQL = sql);\n};\n\nconst getTsVector = (\n ctx: ToSQLCtx,\n data: QueryData,\n lang: string,\n source: QuerySourceItem,\n quotedAs?: string,\n): string => {\n const text = getSearchText(ctx, data, source, quotedAs);\n\n if ('in' in source) {\n if (typeof source.in === 'string' || Array.isArray(source.in)) {\n return `to_tsvector(${lang}, ${text})`;\n } else {\n let tsVector = '';\n let i = 0;\n for (const key in source.in) {\n tsVector =\n (tsVector ? `${tsVector} || ` : '') +\n `setweight(to_tsvector(${lang}, ${text[i++]}), ${addValue(\n ctx.values,\n source.in[key],\n )})`;\n }\n return tsVector;\n }\n } else if ('vector' in source) {\n return text as string;\n } else {\n return `to_tsvector(${lang}, ${text})`;\n }\n};\n","import { QueryData } from '../query-data';\nimport { PickQueryQ } from '../pick-query-types';\n\n// used in `from` logic to decide if convert query to sql or just write table name\nexport const checkIfASimpleQuery = (q: PickQueryQ) => {\n if (\n (q.q.returnType && q.q.returnType !== 'all') ||\n q.q.selectAllColumns ||\n q.q.and?.length ||\n q.q.or?.length ||\n q.q.scopes\n )\n return false;\n\n const keys = Object.keys(q.q) as (keyof QueryData)[];\n return !keys.some((key) => queryKeysOfNotSimpleQuery.includes(key));\n};\n\nconst queryKeysOfNotSimpleQuery: (keyof QueryData)[] = [\n 'with',\n 'as',\n 'from',\n 'select',\n 'distinct',\n 'only',\n 'join',\n 'group',\n 'having',\n 'window',\n 'union',\n 'order',\n 'limit',\n 'offset',\n 'for',\n];\n","import { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { QueryData, QueryDataFromItem } from '../../query-data';\nimport { moveMutativeQueryToCte } from '../cte/cte.sql';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { isExpression } from '../../expressions/expression';\nimport { getQueryAs } from '../as/as';\nimport { searchSourcesToSql } from '../../extra-features/search/search.sql';\nimport {\n getQueryRelationAliasForAs,\n quoteFromWithSchema,\n quoteTableWithSchema,\n quoteTableWithSchemaAndAlias,\n} from '../../sql/sql';\nimport { checkIfASimpleQuery } from '../../sql/check-if-a-simple-query';\nimport { getQuerySchema } from '../storage/storage';\n\nlet fromQuery: SubQueryForSql | undefined;\n\nexport const pushFromAndAs = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n data: QueryData,\n quotedAs?: string,\n): SubQueryForSql | undefined => {\n let sql = 'FROM ';\n\n const from = getFrom(ctx, query, data, quotedAs);\n sql += from;\n\n if (data.sources) {\n sql = searchSourcesToSql(ctx, data, data.sources, sql, quotedAs);\n }\n\n ctx.sql.push(sql);\n\n if (fromQuery) {\n const fq = fromQuery;\n fromQuery = undefined;\n return fq;\n }\n return;\n};\n\nconst getFrom = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n data: QueryData,\n quotedAs?: string,\n) => {\n fromQuery = undefined;\n\n if (data.from) {\n const { from } = data;\n if (Array.isArray(from)) {\n return from\n .map((item) => fromToSql(ctx, query, data, item, quotedAs))\n .join(', ');\n }\n\n return fromToSql(ctx, query, data, from, quotedAs);\n }\n\n let sql = quoteTableWithSchema(query);\n const alias = getQueryRelationAliasForAs(query, data.as);\n\n if (alias) {\n sql += ` ${alias}`;\n }\n\n if (data.only) sql = `ONLY ${sql}`;\n\n return sql;\n};\n\nconst fromToSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n data: QueryData,\n from: QueryDataFromItem,\n quotedAs?: string,\n) => {\n let only: boolean | undefined;\n let sql;\n if (typeof from === 'object') {\n if (isExpression(from)) {\n sql = from.toSQL(ctx, quotedAs) + ' ' + quotedAs;\n } else {\n only = from.q.only;\n\n if (!from.table) {\n sql = `(${moveMutativeQueryToCte(ctx, from)})`;\n }\n // if the query contains more than just schema return (SELECT ...)\n else if (!checkIfASimpleQuery(from)) {\n sql = `(${moveMutativeQueryToCte(ctx, from)}) ${\n quotedAs || `\"${getQueryAs(from)}\"`\n }`;\n } else {\n sql = quoteTableWithSchemaAndAlias(from);\n }\n\n fromQuery = from;\n }\n } else {\n sql = quoteFromWithSchema(getQuerySchema(query), from);\n }\n\n return (only === undefined ? data.only : only) ? `ONLY ${sql}` : sql;\n};\n","import { ToSQLCtx } from '../../sql/to-sql';\nimport { templateLiteralToSQL } from '../../expressions/raw-sql';\nimport { QueryData } from '../../query-data';\nimport { Expression, TemplateLiteralArgs } from '../../expressions/expression';\n\nexport type HavingItem = TemplateLiteralArgs | Expression[];\n\nexport const pushHavingSql = (\n ctx: ToSQLCtx,\n query: QueryData,\n quotedAs?: string,\n) => {\n const conditions = havingToSql(ctx, query, quotedAs);\n if (conditions?.length) ctx.sql.push('HAVING', conditions);\n};\n\nexport const havingToSql = (\n ctx: ToSQLCtx,\n query: QueryData,\n quotedAs?: string,\n): string | undefined => {\n return query.having\n ?.map((it) =>\n 'raw' in it[0]\n ? templateLiteralToSQL(it as TemplateLiteralArgs, ctx, quotedAs)\n : it\n .map((item) => (item as Expression).toSQL(ctx, quotedAs))\n .join(' AND '),\n )\n .join(' AND ');\n};\n","import { columnToSqlNotSelect } from '../../sql/column-to-sql';\nimport { ToSQLCtx } from '../../sql/to-sql';\nimport { QueryData } from '../../query-data';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { addValue, emptyObject } from '../../../utils';\nimport { OrderTsQueryConfig } from '../../extra-features/search/search.sql';\n\nexport type SortDir = 'ASC' | 'DESC' | 'ASC NULLS FIRST' | 'DESC NULLS LAST';\n\nexport type OrderItem = string | { [K: string]: SortDir } | Expression;\n\nexport const pushOrderBySql = (\n ctx: ToSQLCtx,\n data: QueryData,\n quotedAs: string | undefined,\n order: Exclude<QueryData['order'], undefined>,\n) => {\n ctx.sql.push(\n `ORDER BY ${order\n .map((item) => orderByToSql(ctx, data, item, quotedAs))\n .join(', ')}`,\n );\n};\n\nexport const orderByToSql = (\n ctx: ToSQLCtx,\n data: QueryData,\n order: OrderItem,\n quotedAs?: string,\n) => {\n if (typeof order === 'string') {\n return addOrder(ctx, data, order, quotedAs);\n }\n\n if (isExpression(order)) {\n return order.toSQL(ctx, quotedAs);\n }\n\n const sql: string[] = [];\n for (const key in order) {\n const value = order[key];\n sql.push(addOrder(ctx, data, key, quotedAs, value as SortDir));\n }\n return sql.join(', ');\n};\n\nconst addOrder = (\n ctx: ToSQLCtx,\n data: QueryData,\n column: string,\n quotedAs?: string,\n dir?: SortDir | OrderTsQueryConfig,\n): string => {\n if (data.sources?.[column]) {\n const search = data.sources[column];\n const order: OrderTsQueryConfig =\n dir ||\n (!search.order || search.order === true ? emptyObject : search.order);\n\n return `${order.coverDensity ? 'ts_rank_cd' : 'ts_rank'}(${\n order.weights ? `${addValue(ctx.values, `{${order.weights}}`)}, ` : ''\n }${search.vectorSQL}, \"${column}\"${\n order.normalization !== undefined\n ? `, ${addValue(ctx.values, order.normalization)}`\n : ''\n }) ${order.dir || 'DESC'}`;\n }\n\n return `${columnToSqlNotSelect(ctx, data, data.selectShape, column, quotedAs, true)} ${\n dir || 'ASC'\n }`;\n};\n","import { rawOrColumnToSql } from '../../sql/column-to-sql';\nimport { orderByToSql, OrderItem } from '../order/order.sql';\nimport { QueryData } from '../../query-data';\nimport { ToSQLCtx } from '../../sql/to-sql';\nimport {\n Expression,\n isExpression,\n SelectableOrExpression,\n} from '../../expressions/expression';\n\nexport interface WindowItem {\n [K: string]: WindowDeclaration | Expression;\n}\n\nexport interface WindowDeclaration {\n partitionBy?: SelectableOrExpression | SelectableOrExpression[];\n order?: OrderItem;\n}\n\nexport const windowToSql = (\n ctx: ToSQLCtx,\n data: QueryData,\n window: string | WindowDeclaration | Expression,\n quotedAs?: string,\n) => {\n if (typeof window === 'string') return `\"${window}\"`;\n\n if (isExpression(window)) return `(${window.toSQL(ctx, quotedAs)})`;\n\n const sql: string[] = [];\n if (window.partitionBy) {\n sql.push(\n `PARTITION BY ${\n Array.isArray(window.partitionBy)\n ? window.partitionBy\n .map((partitionBy) =>\n rawOrColumnToSql(\n ctx,\n data,\n data.selectShape,\n partitionBy,\n quotedAs,\n undefined,\n true,\n ),\n )\n .join(', ')\n : rawOrColumnToSql(\n ctx,\n data,\n data.selectShape,\n window.partitionBy,\n quotedAs,\n undefined,\n true,\n )\n }`,\n );\n }\n\n if (window.order) {\n sql.push(`ORDER BY ${orderByToSql(ctx, data, window.order, quotedAs)}`);\n }\n\n return `(${sql.join(' ')})`;\n};\n","import { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { Query } from '../../query';\nimport { ToSQLCtx } from '../../sql/to-sql';\nimport { moveMutativeQueryToCte } from '../cte/cte.sql';\n\nexport interface UnionItem {\n a: SubQueryForSql | Expression;\n k: UnionKind;\n // true to not wrap the union member into parens.\n p?: boolean;\n}\n\nexport interface UnionSet {\n b: Query;\n u: UnionItem[];\n}\n\nexport type UnionKind =\n | 'UNION'\n | 'UNION ALL'\n | 'INTERSECT'\n | 'INTERSECT ALL'\n | 'EXCEPT'\n | 'EXCEPT ALL';\n\nexport interface QueryDataUnion {\n b: SubQueryForSql;\n u: UnionItem[];\n // true to not wrap the first union query into parens.\n p?: boolean;\n}\n\nexport const pushUnionSql = (\n ctx: ToSQLCtx,\n union: QueryDataUnion,\n quotedAs?: string,\n) => {\n const { b } = union;\n const s = moveMutativeQueryToCte(ctx, b);\n ctx.sql.push(union.p ? s : `(${s})`);\n\n for (const u of union.u) {\n const s = isExpression(u.a)\n ? u.a.toSQL(ctx, quotedAs)\n : moveMutativeQueryToCte(ctx, u.a);\n ctx.sql.push(`${u.k} ${u.p ? s : '(' + s + ')'}`);\n }\n};\n","import { isExpression } from '../../expressions/expression';\nimport { QueryData } from '../../query-data';\nimport { ToSQLCtx } from '../../sql/to-sql';\n\nexport const pushForSql = (\n ctx: ToSQLCtx,\n q: QueryData,\n type: QueryData['type'],\n quotedAs?: string,\n) => {\n if (q.for && (type !== 'upsert' || !q.upsertSecond)) {\n ctx.sql.push('FOR', q.for.type);\n const { tableNames } = q.for;\n if (tableNames) {\n ctx.sql.push(\n 'OF',\n isExpression(tableNames)\n ? tableNames.toSQL(ctx, quotedAs)\n : tableNames.map((x) => `\"${x}\"`).join(', '),\n );\n }\n if (q.for.mode) ctx.sql.push(q.for.mode);\n }\n};\n","import { IsQuery, Query } from '../query';\nimport { QueryData, QueryType } from '../query-data';\nimport { QueryBuilder } from '../db';\nimport {\n addWithToSql,\n ctesToSql,\n setFreeTopCteAs,\n TopCTE,\n} from '../basic-features/cte/cte.sql';\nimport { SubQueryForSql } from '../internal-features/sub-query/sub-query-for-sql';\nimport { makeInsertSql } from '../basic-features/mutate/insert.sql';\nimport { pushUpdateSql } from '../basic-features/mutate/update.sql';\nimport { pushDeleteSql } from '../basic-features/mutate/delete.sql';\nimport { _clone } from '../basic-features/clone/clone';\nimport { _queryInsert } from '../basic-features/mutate/create';\nimport { JoinItem } from '../basic-features/join/join.sql';\nimport { makeRowToJson, makeSql } from '../sql/sql';\nimport { MoreThanOneRowError } from '../errors';\nimport { QueryInternal } from '../query-internal';\nimport { RawSql } from '../expressions/raw-sql';\nimport { setMutativeQueriesSelectRelationsStateOnSql } from '../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\nimport { Sql } from '../sql/sql';\nimport { moveMutativeQueryToCteBase } from '../basic-features/cte/move-mutative-query-to-cte-base.sql';\nimport { pushDistinctSql } from '../basic-features/distinct/distinct.sql';\nimport { setSqlCtxSelectList } from '../basic-features/select/select.sql';\nimport { pushFromAndAs } from '../basic-features/from/fromAndAs.sql';\nimport { pushJoinSql } from '../basic-features/join/join.sql';\nimport { pushWhereStatementSql } from '../basic-features/where/where.sql';\nimport { columnToSqlNotSelect } from './column-to-sql';\nimport { pushHavingSql } from '../basic-features/having/having.sql';\nimport { windowToSql } from '../basic-features/window/window.sql';\nimport { pushOrderBySql } from '../basic-features/order/order.sql';\nimport { pushLimitOffsetSql } from '../basic-features/limit-offset/limit-offset.sql';\nimport { addTableHook } from '../extra-features/hooks/hooks.sql';\nimport { RunAfterQuery } from './sql';\nimport { HasCteHooks, TableHook } from '../basic-features/select/hook-select';\nimport { isExpression } from '../expressions/expression';\nimport { pushUnionSql } from '../basic-features/union/union.sql';\nimport { pushForSql } from '../basic-features/for/for.sql';\nimport { setCurrentDefaultSchema } from '../basic-features/storage/storage';\nimport { MutativeQueriesSelectRelationsSqlState } from '../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\nimport { emptyArray } from '../../utils';\n\ninterface ToSqlOptionsInternal {\n hasNonSelect?: boolean;\n // selected value in JOIN LATERAL will have an alias to reference it from SELECT\n aliasValue?: true;\n // for insert batching logic: skip a batch check when is inside a WITH subquery\n skipBatchCheck?: true;\n selectedCount?: number;\n selectList?: string[];\n}\n\nexport interface ToSqlValues {\n values: unknown[];\n}\n\nexport interface TopToSqlCtx\n extends ToSqlOptionsInternal, HasCteHooks, ToSqlValues {\n topCtx: TopToSqlCtx;\n topCTE?: TopCTE;\n tableHook?: TableHook;\n mutativeQueriesSelectRelationsSqlState?: MutativeQueriesSelectRelationsSqlState;\n cteHookTopNullSelectAppended?: boolean;\n}\n\nexport interface ToSQLCtx extends ToSqlOptionsInternal, ToSqlValues {\n topCtx: TopToSqlCtx;\n qb: QueryBuilder;\n q: QueryData;\n sql: string[];\n selectedCount: number;\n cteName?: string;\n wrapAs?: string;\n}\n\nexport interface ToSQLQuery extends IsQuery {\n __isQuery: Query['__isQuery'];\n q: Query['q'];\n qb: Query['qb'];\n table?: Query['table'];\n internal: QueryInternal;\n relations: Query['relations'];\n withData: Query['withData'];\n clone: Query['clone'];\n baseQuery: Query['baseQuery'];\n returnType: Query['returnType'];\n result: Query['result'];\n shape: Query['shape'];\n}\n\nexport interface ToSql {\n (\n table: ToSQLQuery,\n type: QueryType,\n topCtx?: TopToSqlCtx,\n isSubSql?: boolean,\n cteName?: string,\n calledByThen?: boolean,\n dontAddTableHook?: boolean,\n ): Sql;\n}\n\nexport const newToSqlCtx = (query: ToSQLQuery): ToSQLCtx => {\n const ctx = {\n topCtx: undefined as unknown as TopToSqlCtx,\n qb: query.qb,\n q: query.q,\n sql: [],\n values: [],\n selectedCount: 0,\n };\n\n ctx.topCtx = ctx;\n\n return ctx;\n};\n\nexport const toSql: ToSql = (\n table,\n type,\n topCtx,\n isSubSql,\n cteName,\n calledByThen,\n dontAddTableHook,\n) => {\n const query = table.q;\n const sql: string[] = [];\n const values = topCtx?.values || [];\n const ctx: ToSQLCtx = {\n topCtx: topCtx!,\n qb: table.qb,\n q: query,\n sql,\n values,\n aliasValue: topCtx?.aliasValue,\n skipBatchCheck: topCtx?.skipBatchCheck,\n hasNonSelect: topCtx?.hasNonSelect,\n selectedCount: 0,\n cteName,\n };\n\n if (topCtx) {\n if (type) topCtx.hasNonSelect = true;\n } else {\n ctx.topCtx = ctx as TopToSqlCtx;\n if (!calledByThen) {\n setCurrentDefaultSchema(table.internal.asyncStorage.getStore()?.schema);\n }\n }\n\n ctesToSql(ctx, query.with);\n\n let result: Sql;\n\n let selectKeywordPos: number | undefined;\n let prependedSelectParenthesis: boolean | undefined;\n\n let fromQuery: SubQueryForSql | undefined;\n\n if (query.asFns) {\n let as;\n if (isSubSql) {\n as = cteName || setFreeTopCteAs(ctx);\n } else {\n as = ctx.wrapAs = setFreeTopCteAs(ctx);\n }\n for (const fn of query.asFns) {\n fn(as);\n }\n }\n\n if (type && type !== 'upsert') {\n const tableName = table.table ?? query.as;\n if (!tableName) throw new Error(`Table is missing for ${type}`);\n\n if (type === 'insert') {\n result = makeInsertSql(ctx, table, query, `\"${tableName}\"`, isSubSql);\n } else {\n const quotedAs = `\"${query.as || tableName}\"`;\n\n if (type === 'update') {\n result = pushUpdateSql(ctx, table, query, quotedAs, isSubSql);\n } else if (type === 'delete') {\n result = pushDeleteSql(ctx, table, query, quotedAs, isSubSql);\n } else {\n throw new Error(`Unsupported query type ${type}`);\n }\n }\n } else {\n let selectSqlPos: number | undefined;\n let runAfterQuery: RunAfterQuery | undefined;\n let skipSelect: boolean | undefined;\n if (type === 'upsert') {\n const upsertUpdate = query.upsertUpdate && query.updateData;\n if (isSubSql || query.upsertSecond) {\n skipSelect = true;\n\n const upsertOrCreate = _clone(table as Query);\n\n // it expected for update to not find records, do not throw if not found\n if (upsertOrCreate.q.returnType === 'oneOrThrow') {\n upsertOrCreate.q.returnType = 'one';\n } else if (upsertOrCreate.q.returnType === 'valueOrThrow') {\n upsertOrCreate.q.returnType = 'value';\n }\n\n const { as, makeSql: makeFirstSql } = moveMutativeQueryToCteBase(\n toSql,\n ctx,\n upsertOrCreate as unknown as SubQueryForSql,\n upsertUpdate ? 'update' : null,\n );\n query.upsertUpdateAsFns?.forEach((fn) => fn(as));\n\n upsertOrCreate.q.or = upsertOrCreate.q.scopes = undefined;\n\n upsertOrCreate.q.and = [\n // use raw SQL rather than _queryWhereNotExists to avoid soft delete being appended\n new RawSql(`NOT EXISTS (SELECT 1 FROM \"${as}\")`),\n ];\n\n if (query.upsertInsert) {\n const insertData = query.upsertInsert();\n _queryInsert(upsertOrCreate as never, insertData as never);\n upsertOrCreate.q.type = 'upsert';\n }\n\n upsertOrCreate.q.with = query.upsertCreateWith;\n upsertOrCreate.q.appendQueries = query.upsertCreateAppendQueries;\n upsertOrCreate.q.asFns = query.upsertCreateAsFns;\n\n const { makeSql: makeSecondSql } = moveMutativeQueryToCteBase(\n toSql,\n ctx,\n upsertOrCreate as unknown as SubQueryForSql,\n 'insert',\n );\n\n sql.push(makeFirstSql(isSubSql), 'UNION ALL', makeSecondSql(isSubSql));\n } else {\n const second = _clone(table);\n second.q.upsertSecond = true;\n // let's call before hooks only once for upsert\n second.q.before = undefined;\n runAfterQuery = (queryResult) => {\n if (queryResult.rowCount) {\n second.q.upsertSecond = undefined;\n if (queryResult.rowCount > 1) {\n throw new MoreThanOneRowError(\n second,\n `Only one row was expected to find, found ${queryResult.rowCount} rows.`,\n );\n }\n return;\n }\n\n return second\n .then((result) => ({ result }))\n .finally(() => {\n second.q.upsertSecond = undefined;\n });\n };\n\n if (upsertUpdate) {\n const result = toSql(table, 'update', topCtx, isSubSql);\n if ('text' in result) {\n result.runAfterQuery = runAfterQuery;\n }\n return result;\n }\n }\n }\n\n const quotedAs =\n (query.as || table.table) && `\"${query.as || table.table}\"`;\n\n if (query.union) {\n pushUnionSql(ctx, query.union, quotedAs);\n } else if (!skipSelect) {\n selectKeywordPos = sql.length;\n sql.push('SELECT');\n\n if (query.distinct) {\n pushDistinctSql(ctx, table, query.distinct, quotedAs);\n }\n\n selectSqlPos = sql.length - 1;\n\n const aliases = query.group ? [] : undefined;\n setSqlCtxSelectList(ctx, table, query, quotedAs, isSubSql, aliases);\n\n fromQuery =\n ((table.table || query.from) &&\n pushFromAndAs(ctx, table, query, quotedAs)) ||\n undefined;\n\n if (query.join) {\n pushJoinSql(\n ctx,\n table,\n query as QueryData & { join: JoinItem[] },\n quotedAs,\n );\n }\n\n if (query.and || query.or || query.scopes) {\n pushWhereStatementSql(ctx, table, query, quotedAs);\n }\n\n if (query.group) {\n const group = query.group.map((item) => {\n if (isExpression(item)) {\n return item.toSQL(ctx, quotedAs);\n } else {\n const i = (aliases as string[]).indexOf(item as string);\n return i !== -1\n ? i + 1\n : columnToSqlNotSelect(\n ctx,\n table.q,\n table.shape,\n item as string,\n quotedAs,\n );\n }\n });\n sql.push(`GROUP BY ${group.join(', ')}`);\n }\n\n if (query.having) pushHavingSql(ctx, query, quotedAs);\n\n if (query.window) {\n const window: string[] = [];\n for (const item of query.window) {\n for (const key in item) {\n window.push(\n `\"${key}\" AS ${windowToSql(ctx, query, item[key], quotedAs)}`,\n );\n }\n }\n sql.push(`WINDOW ${window.join(', ')}`);\n }\n }\n\n if (query.order) {\n pushOrderBySql(ctx, query, quotedAs, query.order);\n }\n\n pushLimitOffsetSql(ctx, query, fromQuery);\n\n pushForSql(ctx, query, type, quotedAs);\n\n addTableHook(\n ctx,\n table,\n query,\n query.hookSelect,\n undefined,\n dontAddTableHook,\n );\n\n // compose select in the last moment because NULL for CTE selects\n // can be added by sub queries added in where or in other places\n if (selectSqlPos !== undefined && ctx.selectList?.length) {\n sql[selectSqlPos] += ' ' + ctx.selectList.join(', ');\n }\n\n if (selectKeywordPos !== undefined && !isSubSql && ctx.topCtx.cteHooks) {\n sql[selectKeywordPos] = '(' + sql[selectKeywordPos];\n prependedSelectParenthesis = true;\n }\n\n result = makeSql(ctx, type, isSubSql, runAfterQuery);\n }\n\n if (!ctx.cteName) {\n result.tableHook = ctx.topCtx.tableHook;\n if (!topCtx) {\n setMutativeQueriesSelectRelationsStateOnSql(ctx, result);\n }\n }\n\n if (!isSubSql) {\n if (ctx.topCtx.cteHooks && 'text' in result) {\n result.cteHooks = ctx.topCtx.cteHooks;\n\n if (ctx.topCtx.cteHooks.hasSelect) {\n if (prependedSelectParenthesis) {\n result.text += ')';\n }\n\n const { tableHooks, ensureCount } = ctx.topCtx.cteHooks;\n\n const keyValues = [\n ...(tableHooks\n ? Object.entries(tableHooks).map(\n ([cteName, data]) =>\n `'${cteName}', (SELECT json_agg(${makeRowToJson(\n ctx,\n cteName,\n data.shape,\n false,\n true,\n )}) FROM \"${cteName}\")`,\n )\n : emptyArray),\n ...(ensureCount\n ? Object.entries(ensureCount).map(\n ([cteName, item]) =>\n `'#${cteName}', CASE WHEN ${\n 'count' in item\n ? `(SELECT count(*) FROM \"${cteName}\") < ${item.count}`\n : `(SELECT \"${cteName}\".\"${item.jsonNotNull}\" FROM \"${cteName}\") IS NULL`\n } THEN (SELECT 'not-found')::int END`,\n )\n : emptyArray),\n ];\n\n result.text += ` UNION ALL SELECT ${'NULL, '.repeat(\n ctx.selectedCount || 0,\n )}json_build_object(${keyValues.join(', ')})`;\n }\n }\n }\n\n if ('text' in result) addWithToSql(ctx, result, isSubSql);\n\n return result;\n};\n","import { emptyObject, RecordUnknown, setFreeAlias } from '../../../utils';\nimport { Expression } from '../../expressions/expression';\nimport { toSql, ToSQLCtx } from '../../sql/to-sql';\nimport { QueryData, WithItems } from '../../query-data';\nimport { Column } from '../../../columns';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { moveMutativeQueryToCteBase } from './move-mutative-query-to-cte-base.sql';\nimport { setMoveMutativeQueryToCte } from '../../../columns/operators';\nimport { getSqlText, SingleSql, SingleSqlItem } from '../../sql/sql';\n\nexport interface WithDataItem {\n table: string;\n shape: Column.QueryColumns;\n}\n\nexport interface WithDataItems {\n [K: string]: WithDataItem;\n}\n\nexport interface CteItem {\n // name\n n: string | ((as: string) => void);\n // options\n o?: CteOptions;\n // query\n q?: SubQueryForSql;\n // sql\n s?: Expression;\n // prepend: false by default\n p?: boolean;\n}\n\nexport interface CteOptions {\n columns?: string[];\n recursive?: true;\n materialized?: true;\n notMaterialized?: true;\n}\n\nexport interface TopCTE {\n names: RecordUnknown;\n stack: string[][];\n append: string[][];\n}\n\nconst newTopCte = (ctx: ToSQLCtx): TopCTE => ({\n names: { ...ctx.q.withShapes, ...ctx.q.joinedShapes },\n stack: [],\n append: [],\n});\n\nexport const getTopCteSize = ({\n topCtx: { topCTE },\n}: ToSQLCtx): number | undefined => topCTE?.append.length;\n\nexport const setTopCteSize = ({ topCtx }: ToSQLCtx, size?: number) => {\n if (topCtx.topCTE) {\n if (size) {\n topCtx.topCTE.append.length = size;\n } else {\n topCtx.topCTE = undefined;\n }\n }\n};\n\nexport const ctesToSql = (ctx: ToSQLCtx, ctes?: WithItems): void => {\n if (!ctes) return;\n\n for (const item of ctes) {\n const place = item.p ? 'before' : 'after';\n if (ctx !== ctx.topCtx && item.q?.q.type) {\n addTopCte(place, ctx, item.q, item.q.q.type, item.n);\n } else {\n addTopCteInternal(place, ctx, item, item.q?.q.type);\n }\n }\n};\n\nexport const cteToSqlGiveAs = (\n ctx: ToSQLCtx,\n item: CteItem,\n type: QueryData['type'],\n dontAddTableHook?: boolean,\n): { as: string; sql: string } => {\n let inner: string;\n\n let as;\n if (typeof item.n === 'string') {\n as = item.n;\n } else {\n if (ctx === ctx.topCtx) {\n const topCTE = (ctx.topCtx.topCTE ??= newTopCte(ctx));\n as = setFreeAlias(topCTE.names, 'q', true);\n item.n(as);\n } else {\n // TODO\n throw new Error('not implemented yet');\n }\n }\n\n if (item.q) {\n inner = getSqlText(\n toSql(item.q, type, ctx.topCtx, true, as, undefined, dontAddTableHook),\n );\n } else {\n inner = (item.s as Expression).toSQL(ctx.topCtx, `\"${as}\"`);\n }\n\n const o = item.o ?? (emptyObject as CteOptions);\n return {\n as,\n sql: `${o.recursive ? 'RECURSIVE ' : ''}\"${as}\"${\n o.columns ? `(${o.columns.map((x) => `\"${x}\"`).join(', ')})` : ''\n } AS ${\n o.materialized\n ? 'MATERIALIZED '\n : o.notMaterialized\n ? 'NOT MATERIALIZED '\n : ''\n }(${inner})`,\n };\n};\n\nexport const cteToSql = (\n ctx: ToSQLCtx,\n item: CteItem,\n type: QueryData['type'],\n dontAddTableHook?: boolean,\n): string => cteToSqlGiveAs(ctx, item, type, dontAddTableHook).sql;\n\nexport const setFreeTopCteAs = (ctx: ToSQLCtx) => {\n const topCTE = (ctx.topCtx.topCTE ??= newTopCte(ctx));\n const as = setFreeAlias(topCTE.names, 'q', true);\n topCTE.names[as] = true;\n return as;\n};\n\nexport const addTopCteSql = (\n ctx: ToSQLCtx,\n as: string | undefined,\n sql: string,\n): string => {\n const topCTE = (ctx.topCtx.topCTE ??= newTopCte(ctx));\n\n as ??= setFreeAlias(topCTE.names, 'q', true);\n topCTE.names[as] = true;\n\n const target =\n topCTE.stack[topCTE.stack.length - 1] ||\n (topCTE.append[topCTE.append.length] = []);\n\n target.push(as + ' AS (' + sql + ')');\n return as;\n};\n\nexport const addTopCte = (\n place: 'before' | 'after',\n ctx: ToSQLCtx,\n q: SubQueryForSql,\n type: QueryData['type'],\n as?: string | ((as: string) => void),\n dontAddTableHook?: boolean,\n): string => {\n const topCTE = (ctx.topCtx.topCTE ??= newTopCte(ctx));\n\n if (typeof as !== 'string') {\n const name = setFreeAlias(topCTE.names, 'q', true);\n\n if (as) {\n as(name);\n }\n\n as = name;\n }\n\n addTopCteInternal(place, ctx, { n: as, q }, type, dontAddTableHook);\n\n return as;\n};\n\nconst addTopCteInternal = (\n place: 'before' | 'after',\n ctx: ToSQLCtx,\n item: CteItem,\n type: QueryData['type'],\n dontAddTableHook?: boolean,\n) => {\n const topCTE = (ctx.topCtx.topCTE ??= newTopCte(ctx));\n\n const target =\n (place === 'before' && topCTE.stack[topCTE.stack.length - 1]) ||\n (topCTE.append[topCTE.append.length] = []);\n\n const prepend: string[] = [];\n topCTE.stack.push(prepend);\n\n const sql = cteToSql(ctx, item, type, dontAddTableHook); // more ctes can be appended here\n\n target.push(...prepend, sql);\n\n topCTE.stack.pop();\n};\n\nexport const addWithToSql = (\n ctx: ToSQLCtx,\n sql: SingleSql,\n isSubSql?: boolean,\n): void => {\n if (!isSubSql && ctx.topCtx.topCTE?.append.length) {\n const sqls: string[] = [];\n for (const append of ctx.topCtx.topCTE.append) {\n sqls.push(...append);\n }\n\n sql.text = 'WITH ' + sqls.join(', ') + ' ' + sql.text;\n }\n};\n\nexport const composeCteSingleSql = (ctx: ToSQLCtx): SingleSqlItem => {\n const result = {\n text: ctx.sql.join(' '),\n values: ctx.values,\n };\n addWithToSql(ctx, result);\n return result;\n};\n\nexport interface MoveMutativeQueryToCte {\n (ctx: ToSQLCtx, query: SubQueryForSql): string;\n}\n\nexport const moveMutativeQueryToCte: MoveMutativeQueryToCte = (ctx, query) => {\n const { makeSql } = moveMutativeQueryToCteBase(toSql, ctx, query);\n return makeSql(true);\n};\n\nsetMoveMutativeQueryToCte(moveMutativeQueryToCte);\n","import { addTopCte, addTopCteSql } from '../basic-features/cte/cte.sql';\nimport { QueryData, QueryType } from '../query-data';\nimport { ToSQLCtx } from './to-sql';\n\nexport const getShouldWrapMainQueryInCte = (\n ctx: ToSQLCtx,\n q: QueryData,\n type: QueryType,\n isSubSql?: boolean,\n): boolean | undefined => {\n return (\n ((!isSubSql && type && ctx.topCtx.cteHooks) || q.appendQueries) && true\n );\n};\n\nexport const wrapMainQueryInCte = (\n ctx: ToSQLCtx,\n q: QueryData,\n isSubSql?: boolean,\n) => {\n let as: string | undefined;\n if (!isSubSql && !ctx.cteName) {\n as = addTopCteSql(ctx, ctx.wrapAs, ctx.sql.join(' '));\n }\n\n q.appendQueries?.forEach((query) =>\n addTopCte('after', ctx, query, query.q.type),\n );\n\n if (!isSubSql && !ctx.cteName) {\n const addNull = ctx.topCtx.cteHooks?.hasSelect;\n ctx.sql = [`SELECT *${addNull ? ', NULL' : ''} FROM ${as}`];\n }\n};\n","import {\n HasCteHooks,\n HasTableHook,\n} from '../basic-features/select/hook-select';\nimport { QueryResult } from '../../adapters/adapter';\nimport { PickQueryColumTypes } from '../pick-query-types';\nimport { DynamicSQLArg, StaticSQLArgs } from '../expressions/expression';\nimport {\n DynamicRawSQL,\n raw,\n RawSql,\n type RawSqlBase,\n} from '../expressions/raw-sql';\nimport { Column } from '../../columns';\nimport { ToSQLCtx, ToSQLQuery } from './to-sql';\nimport { QueryType } from '../query-data';\nimport { wrapMainQueryInCte } from './wrap-main-query-in-cte';\nimport { OrchidOrmInternalError } from '../errors';\nimport { QuerySchema } from '../basic-features/schema/schema';\nimport { getQuerySchema } from '../basic-features/storage/storage';\nimport { MutativeQueriesSelectRelationsSqlProp } from '../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\nimport { type RecordUnknown } from '../../utils';\nimport { type Query } from '../query';\n\nexport interface SqlCommonOptions\n extends HasTableHook, HasCteHooks, MutativeQueriesSelectRelationsSqlProp {}\n\nexport interface SingleSqlItem {\n // SQL string\n text: string;\n // bind values passed along with SQL string\n values?: unknown[];\n runAfterQuery?: RunAfterQuery;\n}\n\n// is executed immediately after querying SQL.\n// `then` early returns its result if `runAfterQuery` returns a result.\nexport interface RunAfterQuery {\n (queryResult: QueryResult): void | Promise<{ result: unknown }>;\n}\n\nexport interface SingleSql extends SingleSqlItem, SqlCommonOptions {}\n\nexport interface BatchSql extends SqlCommonOptions {\n // batch of sql queries, is used when there is too many binding params for insert\n batch: SingleSql[];\n}\n\n// Output type of the `toSQL` method of query objects.\n// This will be passed to database adapter to perform query.\nexport type Sql = SingleSql | BatchSql;\n\nexport const makeSql = (\n ctx: ToSQLCtx,\n type: QueryType,\n isSubSql: boolean | undefined,\n runAfterQuery?: RunAfterQuery,\n): SingleSql => {\n if (\n (!isSubSql &&\n // require type to exclude SELECT because it does not require wrapping in CTE for UNION\n type &&\n // exclude insert because insert handles this logic on its own, since it has to deal with batches\n type !== 'insert' &&\n // exclude upsert because it upsert is SELECT from a union, select doesn't require wrapping\n type !== 'upsert' &&\n ctx.topCtx.cteHooks) ||\n ctx.q.appendQueries\n ) {\n wrapMainQueryInCte(ctx, ctx.q, isSubSql);\n }\n\n return {\n text: ctx.sql.join(' '),\n values: ctx.values,\n runAfterQuery,\n };\n};\n\nexport const requireTableOrStringFrom = (query: ToSQLQuery): string => {\n const table =\n query.table ||\n (typeof query.q.from === 'string' ? query.q.from : undefined);\n\n if (!table) {\n throw new OrchidOrmInternalError(\n query,\n \"The query object does not have a table and doesn't define a `from` string\",\n );\n }\n\n return table;\n};\n\nexport const getQueryRelationAlias = (query: ToSQLQuery): string | undefined =>\n query.table && query.q.nameInDb && query.table !== query.q.nameInDb\n ? `\"${query.table}\"`\n : undefined;\n\nexport const getQueryRelationAliasForAs = (\n query: ToSQLQuery,\n as: string | undefined,\n): string | undefined => {\n if (!as) return getQueryRelationAlias(query);\n\n const nameInDb = query.q.nameInDb || requireTableOrStringFrom(query);\n return nameInDb && as !== nameInDb ? `\"${as}\"` : undefined;\n};\n\nexport const quoteTableWithSchema = (query: ToSQLQuery): string =>\n quoteFromWithSchema(\n getQuerySchema(query),\n query.q.nameInDb || requireTableOrStringFrom(query),\n );\n\nexport const quoteTableWithSchemaAndAlias = (query: ToSQLQuery): string => {\n const table = quoteTableWithSchema(query);\n const alias = getQueryRelationAlias(query);\n return alias ? `${table} ${alias}` : table;\n};\n\nexport const quoteFromWithSchema = (\n schema: QuerySchema | undefined,\n table: string,\n): string => {\n const s = typeof schema === 'function' ? schema() : schema;\n return s ? `\"${s}\".\"${table}\"` : `\"${table}\"`;\n};\n\nexport const makeRowToJson = (\n ctx: ToSQLCtx,\n table: string,\n shape: Column.Shape.Data,\n aliasName: boolean,\n includingExplicitSelect?: boolean,\n): string => {\n let isSimple = true;\n const list: string[] = [];\n\n for (const key in shape) {\n const column = shape[key];\n if (!includingExplicitSelect && column.data.explicitSelect) {\n continue;\n }\n\n const selectSql = !column.data.computed ? column.data.selectSql : undefined;\n const outputColumn = getSelectedColumnData(column);\n if (\n (aliasName && column.data.name) ||\n outputColumn.data.jsonCast ||\n selectSql\n ) {\n isSimple = false;\n }\n\n const value = selectSql\n ? selectSql.toSQL(ctx, `\"${table}\"`)\n : `\"${table}\".\"${(aliasName && column.data.name) || key}\"`;\n\n list.push(\n `'${key}', ${value}${\n outputColumn.data.jsonCast ? `::${outputColumn.data.jsonCast}` : ''\n }`,\n );\n }\n\n return isSimple\n ? `row_to_json(\"${table}\".*)`\n : `CASE WHEN to_jsonb(\"${table}\") IS NULL THEN NULL ELSE json_build_object(` +\n list.join(', ') +\n ') END';\n};\n\nexport const getSelectedColumnData = (\n column: Column.Pick.Data,\n): Column.Pick.Data => {\n return (\n (column.data.selectSql?.result.value as Column.Pick.Data | undefined) ||\n column\n );\n};\n\nexport const getSqlText = (sql: Sql) => {\n if ('text' in sql) return sql.text;\n throw new Error(`Batch SQL is not supported in this query`);\n};\n\nexport const queryToSql = (query: Query): SingleSql => {\n const sql = query.toSQL();\n if ('batch' in sql) {\n throw new OrchidOrmInternalError(\n query,\n 'Batch SQL is not supported in query definitions',\n );\n }\n\n return sql;\n};\n\nexport const rawSqlToSql = (sql: string | RawSqlBase): SingleSql => {\n if (typeof sql === 'string') return { text: sql };\n\n const values: unknown[] = [];\n return {\n text: sql.toSQL({ values }),\n values,\n };\n};\n\nexport const sqlToRawSql = (sql: SingleSql): RawSqlBase => {\n const { values } = sql;\n if (!values?.length) return raw({ raw: sql.text });\n\n const rawValues: RecordUnknown = {};\n for (let i = 0; i < values.length; i++) {\n rawValues[`queryValue${i + 1}`] = values[i];\n }\n\n return raw({\n raw: replaceSqlPlaceholders(sql.text, values.length),\n }).values(rawValues);\n};\n\nconst replaceSqlPlaceholders = (sql: string, valuesCount: number): string => {\n const parts = sql.split(\"'\");\n for (let i = 0; i < parts.length; i += 2) {\n parts[i] = parts[i].replace(/\\$(\\d+)/g, (match, index) => {\n const number = Number(index);\n return number > 0 && number <= valuesCount\n ? `$queryValue${number}`\n : match;\n });\n }\n\n return parts.join(\"'\");\n};\n\nexport class QuerySql<ColumnTypes> {\n /**\n * @deprecated: use `sql` exported from the table factory file.\n *\n * When there is a need to use a piece of raw SQL, use the `sql` exported from the table factory file, it is also attached to query objects for convenience.\n *\n * When selecting a custom SQL, specify a resulting type with `<generic>` syntax:\n *\n * ```ts\n * import { sql } from './table-factory';\n *\n * const result: { num: number }[] = await db.table.select({\n * num: sql<number>`random() * 100`,\n * });\n * ```\n *\n * In a situation when you want the result to be parsed, such as when returning a timestamp that you want to be parsed into a `Date` object, provide a column type in such a way:\n *\n * This example assumes that the `timestamp` column was overridden with `asDate` as shown in [Override column types](/guide/columns-overview#override-column-types).\n *\n * ```ts\n * import { sql } from './table-factory';\n *\n * const result: { timestamp: Date }[] = await db.table.select({\n * timestamp: sql`now()`.type((t) => t.timestamp()),\n * });\n * ```\n *\n * In some cases such as when using [from](/guide/orm-and-query-builder.html#from), setting column type via callback allows for special `where` operations:\n *\n * ```ts\n * const subQuery = db.someTable.select({\n * sum: () => sql`$a + $b`.type((t) => t.decimal()).values({ a: 1, b: 2 }),\n * });\n *\n * // `gt`, `gte`, `min`, `lt`, `lte`, `max` in `where`\n * // are allowed only for numeric columns:\n * const result = await db.$from(subQuery).where({ sum: { gte: 5 } });\n * ```\n *\n * Many query methods have a version suffixed with `Sql`, you can pass an SQL template literal directly to these methods.\n * These methods are: `whereSql`, `whereNotSql`, `orderSql`, `havingSql`, `fromSql`, `findBySql`.\n *\n * ```ts\n * await db.table.whereSql`\"someValue\" = random() * 100`;\n * ```\n *\n * Interpolating values in template literals is completely safe:\n *\n * ```ts\n * // get value from user-provided params\n * const { value } = req.params;\n *\n * // SQL injection is prevented by a library, this is safe:\n * await db.table.whereSql`column = ${value}`;\n * ```\n *\n * In the example above, TS cannot check if the table has `column` column, or if there are joined tables that have such column which will lead to error.\n * Instead, use the [column](/guide/sql-expressions#column) or [ref](/guide/sql-expressions#ref) to reference a column:\n *\n * ```ts\n * // ids will be prefixed with proper table names, no ambiguity:\n * db.table.join(db.otherTable, 'id', 'other.otherId').where`\n * ${db.table.column('id')} = 1 AND\n * ${db.otherTable.ref('id')} = 2\n * `;\n * ```\n *\n * SQL can be passed with a simple string, it's important to note that this is not safe to interpolate values in it.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * // no interpolation is okay\n * await db.table.where(sql({ raw: 'column = random() * 100' }));\n *\n * // get value from user-provided params\n * const { value } = req.params;\n *\n * // this is NOT safe, SQL injection is possible:\n * await db.table.where(sql({ raw: `column = random() * ${value}` }));\n * ```\n *\n * To inject values into `sql({ raw: '...' })` SQL strings, denote it with `$` in the string and provide `values` object.\n *\n * Use `$$` to provide column or/and table name (`column` or `ref` are preferable). Column names will be quoted so don't quote them manually.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * // get value from user-provided params\n * const { value } = req.params;\n *\n * // this is SAFE, SQL injection are prevented:\n * await db.table.where(\n * sql<boolean>({\n * raw: '$$column = random() * $value',\n * values: {\n * column: 'someTable.someColumn', // or simply 'column'\n * one: value,\n * two: 123,\n * },\n * }),\n * );\n * ```\n *\n * Summarizing:\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * // simplest form:\n * sql`key = ${value}`;\n *\n * // with resulting type:\n * sql<boolean>`key = ${value}`;\n *\n * // with column type for select:\n * sql`key = ${value}`.type((t) => t.boolean());\n *\n * // with column name via `column` method:\n * sql`${db.table.column('column')} = ${value}`;\n *\n * // raw SQL string, not allowed to interpolate values:\n * sql({ raw: 'random()' });\n *\n * // with resulting type and `raw` string:\n * sql<number>({ raw: 'random()' });\n *\n * // with column name and a value in a `raw` string:\n * sql({\n * raw: `$$column = $value`,\n * values: { column: 'columnName', value: 123 },\n * });\n *\n * // combine template literal, column type, and values:\n * sql`($one + $two) / $one`.type((t) => t.numeric()).values({ one: 1, two: 2 });\n * ```\n *\n * @param args - template literal or an object { raw: string }\n * @return object that has `type` and `values` methods\n */\n sql<T = unknown>(\n this: PickQueryColumTypes,\n ...args: StaticSQLArgs\n ): RawSql<Column.Pick.QueryColumnOfType<T>, ColumnTypes>;\n sql<T = unknown>(\n this: PickQueryColumTypes,\n ...args: [DynamicSQLArg<Column.Pick.QueryColumnOfType<T>>]\n ): DynamicRawSQL<Column.Pick.QueryColumnOfType<T>, ColumnTypes>;\n sql(this: PickQueryColumTypes, ...args: unknown[]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sql = (raw as any)(...args);\n sql.columnTypes = this.columnTypes;\n return sql;\n }\n}\n","import { JoinedShapes, QueryData } from '../query-data';\nimport { ToSQLCtx } from './to-sql';\nimport { Column } from '../../columns/column';\nimport { RecordString } from '../../utils';\nimport { ColumnsParsers } from '../query-columns/query-column-parsers';\nimport { _getQueryAliasOrName } from '../basic-features/as/as';\nimport { Expression, SelectableOrExpression } from '../expressions/expression';\nimport { getSelectedColumnData, makeRowToJson } from './sql';\nimport { SelectItem } from '../basic-features/select/select.sql';\n\n// Takes a column name without a dot and the optional column object.\n// Handles computed column, uses column.data.name when set, prefixes regular column with `quotedAs`.\n// Returns quoted key if no column is provided.\nexport function simpleColumnToSQL(\n ctx: ToSQLCtx,\n queryData: {\n valuesJoinedAs?: RecordString;\n select?: SelectItem[];\n joinedShapes?: JoinedShapes;\n getColumn?: Column;\n },\n shape: Column.QueryColumns,\n key: string,\n column?: Column.Pick.QueryColumn,\n quotedAs?: string,\n select?: true,\n as?: string,\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n useSelectList?: true,\n skipSelectSql?: true,\n skipValueToArray?: true,\n): string {\n let sql: string;\n let dontAlias: boolean | undefined;\n\n if (useSelectList && queryData.select) {\n for (const s of queryData.select) {\n if (typeof s === 'object' && 'selectAs' in s) {\n if (key in s.selectAs) {\n dontAlias = true;\n sql = simpleColumnToSQL(\n ctx,\n queryData,\n shape,\n key,\n shape[key],\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n true,\n );\n break;\n }\n }\n }\n }\n\n // @ts-ignore\n if (!sql) {\n if (!column) {\n dontAlias = key === as;\n sql = `${quotedAs ? `${quotedAs}.` : ''}\"${key}\"`;\n } else {\n if (jsonList && as) {\n jsonList[as] = column && getSelectedColumnData(column as Column);\n }\n\n const { data } = column as unknown as Column.Pick.Data;\n if (select && data.selectSql && !skipSelectSql) {\n sql = `(${data.selectSql.toSQL(ctx, quotedAs)})`;\n } else if (data.computed) {\n sql = `(${data.computed.toSQL(ctx, quotedAs)})`;\n } else {\n const name = data.name || key;\n dontAlias = name === as;\n\n if (!select) {\n const joinAs = !select && queryData.valuesJoinedAs?.[key];\n if (joinAs) {\n quotedAs = `\"${joinAs}\"`;\n }\n }\n\n sql = `${quotedAs ? `${quotedAs}.` : ''}\"${name}\"`;\n }\n }\n }\n\n if (\n !select &&\n !useSelectList &&\n (column as Column)?.data.valueToArray &&\n !(column as Column).data.skipValueToArray\n ) {\n sql += '[1]';\n } else if (queryData.getColumn?.data.valueToArray && !skipValueToArray) {\n sql = `array[${sql}]`;\n }\n\n if (as && !dontAlias) {\n sql = `${sql} \"${as}\"`;\n }\n\n return sql;\n}\n\nexport const tableColumnToSql = (\n ctx: ToSQLCtx,\n queryData: {\n valuesJoinedAs?: RecordString;\n aliases?: RecordString;\n joinedShapes?: QueryData['joinedShapes'];\n parsers?: ColumnsParsers;\n select?: SelectItem[];\n getColumn?: Column;\n },\n shape: Column.QueryColumns,\n table: string,\n key: string,\n quotedAs?: string,\n select?: true,\n as?: string,\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n skipValueToArray?: true,\n) => {\n let sql: string;\n let dontAlias: boolean | undefined;\n\n if (key === '*') {\n if (jsonList && as) {\n jsonList[as] = undefined;\n }\n\n const shape = queryData.joinedShapes?.[table];\n if (shape) {\n sql = select\n ? makeRowToJson(ctx, table, shape as never, true)\n : `\"${table}\".*`;\n } else {\n sql = `\"${table}\".\"${key}\"`;\n dontAlias = true;\n }\n } else {\n const tableName = _getQueryAliasOrName(queryData, table);\n const quoted = `\"${table}\"`;\n\n const joined = queryData.joinedShapes?.[tableName];\n\n const col = (\n joined ? joined[key] : quoted === quotedAs ? shape[key] : undefined\n ) as Column.Pick.Data | undefined;\n\n if (jsonList && as) {\n jsonList[as] = col && getSelectedColumnData(col);\n }\n\n if (col?.data.selectSql) {\n sql = `(${col.data.selectSql.toSQL(ctx, quoted)})`;\n } else if (col?.data.name) {\n sql = `\"${tableName}\".\"${col.data.name}\"`;\n } else if (col?.data.computed) {\n sql = `(${col.data.computed.toSQL(ctx, quoted)})`;\n } else {\n sql = `\"${tableName}\".\"${key}\"`;\n dontAlias = key === as;\n }\n\n if (\n !select &&\n (col as Column)?.data.valueToArray &&\n !(col as Column).data.skipValueToArray\n ) {\n sql += '[1]';\n } else if (queryData.getColumn?.data.valueToArray && !skipValueToArray) {\n sql = `array[${sql}]`;\n }\n }\n\n if (as && !dontAlias) {\n sql = `${sql} \"${as}\"`;\n }\n\n return sql;\n};\n\nexport const columnToSqlNotSelect = (\n ctx: ToSQLCtx,\n data: {\n valuesJoinedAs?: RecordString;\n aliases?: RecordString;\n joinedShapes?: QueryData['joinedShapes'];\n parsers?: ColumnsParsers;\n select?: SelectItem[];\n },\n shape: Column.QueryColumns,\n column: string,\n quotedAs?: string,\n useSelectList?: true,\n): string =>\n columnToSql(\n ctx,\n data,\n shape,\n column,\n quotedAs,\n undefined,\n undefined,\n undefined,\n useSelectList,\n true,\n );\n\nexport const columnToSql = (\n ctx: ToSQLCtx,\n data: {\n valuesJoinedAs?: RecordString;\n aliases?: RecordString;\n joinedShapes?: QueryData['joinedShapes'];\n parsers?: ColumnsParsers;\n select?: SelectItem[];\n },\n shape: Column.QueryColumns,\n column: string,\n quotedAs?: string,\n select?: true,\n as?: string,\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n useSelectList?: true,\n skipValueToArray?: true,\n): string => {\n let index = column.indexOf('.');\n if (index !== -1) {\n const table = column.slice(0, index);\n const key = column.slice(index + 1);\n return tableColumnToSql(\n ctx,\n data,\n shape,\n table,\n key,\n quotedAs,\n select,\n as,\n jsonList,\n skipValueToArray,\n );\n }\n\n return simpleColumnToSQL(\n ctx,\n data,\n shape,\n column,\n shape[column],\n quotedAs,\n select,\n as,\n jsonList,\n useSelectList,\n undefined,\n skipValueToArray,\n );\n};\n\nexport const rawOrColumnToSql = (\n ctx: ToSQLCtx,\n data: {\n joinedShapes?: JoinedShapes;\n select?: SelectItem[];\n },\n shape: Column.QueryColumns,\n expr: SelectableOrExpression,\n quotedAs: string | undefined,\n select?: true,\n skipValueToArray?: true,\n): string => {\n return typeof expr === 'string'\n ? columnToSql(\n ctx,\n data,\n shape,\n expr,\n quotedAs,\n select,\n undefined,\n undefined,\n undefined,\n skipValueToArray,\n )\n : (expr as Expression).toSQL(ctx, quotedAs);\n};\n","import {\n Query,\n SelectableOrExpressionOfType,\n SetQueryReturnsColumnOrThrow,\n} from '../../query';\nimport {\n AggregateOptions,\n makeFnExpression,\n FnExpression,\n Over,\n} from '../../expressions/fn-expression';\nimport {\n OperatorsAny,\n OperatorsArray,\n OperatorsBoolean,\n OperatorsNumber,\n OperatorsText,\n} from '../../../columns/operators';\nimport {\n BooleanColumn,\n DecimalColumn,\n IntegerColumn,\n internalSchemaConfig,\n JSONTextColumn,\n NumberAsStringBaseColumn,\n NumberBaseColumn,\n RealColumn,\n TextColumn,\n XMLColumn,\n} from '../../../columns';\nimport { Column } from '../../../columns/column';\nimport { _getSelectableColumn } from '../get/get.utils';\nimport {\n Expression,\n ExpressionOutput,\n SelectableOrExpression,\n} from '../../expressions/expression';\nimport {\n PickQuerySelectableResultRelationsWindows,\n PickQueryQ,\n PickQuerySelectable,\n} from '../../pick-query-types';\nimport { emptyArray } from '../../../utils';\nimport { SearchAggregateMethods } from '../../extra-features/search/search';\n\n// Helper function to check if we're selecting a count on this query.\n// Used in `create` to not return a full record after `count()` method.\nexport const isSelectingCount = (q: PickQueryQ) => {\n const { expr } = q.q;\n return (\n expr instanceof FnExpression && expr.fn === 'count' && expr.args[0] === '*'\n );\n};\n\n// `count` returns `bigint` type that is represented by a string.\n// This is needed to parse the value back to a number.\nconst intNullable = new IntegerColumn(internalSchemaConfig)\n .nullable()\n .parse(parseInt as never);\n\n// double-precision is represented by string in JS, parse it to float.\nconst floatNullable = new RealColumn(internalSchemaConfig)\n .nullable()\n .parse(parseFloat as never);\n\nconst booleanNullable = BooleanColumn.instanceSkipValueToArray.nullable();\n\nconst textNullable = TextColumn.instance.nullable();\n\nconst jsonTextNullable = JSONTextColumn.instance.nullable();\n\nconst xmlNullable = XMLColumn.instance.nullable();\n\nconst stringAsNumberNullable =\n new (NumberAsStringBaseColumn as unknown as typeof DecimalColumn)(\n internalSchemaConfig,\n ).nullable();\n\nintNullable.data.skipValueToArray =\n floatNullable.data.skipValueToArray =\n textNullable.data.skipValueToArray =\n jsonTextNullable.data.skipValueToArray =\n xmlNullable.data.skipValueToArray =\n stringAsNumberNullable.data.skipValueToArray =\n true;\n\nconst numericResultColumn = (\n q: unknown,\n arg: PropertyKey | Expression,\n): Column => {\n const query = q as Query;\n\n const type =\n typeof arg === 'string'\n ? _getSelectableColumn(query, arg)\n : (arg as Expression).result.value;\n\n return type instanceof NumberBaseColumn\n ? floatNullable\n : stringAsNumberNullable;\n};\n\ninterface OperatorsCount extends OperatorsNumber {\n isCount: true;\n}\n\ntype CountColumn = Column.Pick.QueryColumnOfTypeAndOps<\n 'int8',\n number,\n OperatorsCount\n>;\n\ntype CountReturn<T> = SetQueryReturnsColumnOrThrow<T, CountColumn> &\n OperatorsCount;\n\ntype SelectableDataType<\n T extends PickQuerySelectable,\n DataType extends string,\n> =\n | {\n [K in keyof T['__selectable']]: T['__selectable'][K]['column']['dataType'] extends DataType\n ? K\n : never;\n }[keyof T['__selectable']]\n | Expression<Column.Pick.QueryColumnOfDataType<DataType>>;\n\ntype NumericReturn<\n T extends PickQuerySelectable,\n Arg,\n> = Arg extends keyof T['__selectable']\n ? SetQueryReturnsColumnOrThrow<\n T,\n Column.Pick.QueryColumnOfTypeAndOps<\n T['__selectable'][Arg]['column']['dataType'],\n T['__selectable'][Arg]['column']['__type'] | null,\n OperatorsNumber\n >\n > &\n OperatorsNumber\n : Arg extends Expression\n ? SetQueryReturnsColumnOrThrow<\n T,\n Column.Pick.QueryColumnOfTypeAndOps<\n Arg['result']['value']['dataType'],\n Arg['result']['value']['__type'] | null,\n OperatorsNumber\n >\n > &\n OperatorsNumber\n : never;\n\ntype NullableNumberReturn<T, DataType> = SetQueryReturnsColumnOrThrow<\n T,\n Column.Pick.QueryColumnOfTypeAndOps<DataType, number | null, OperatorsNumber>\n> &\n OperatorsNumber;\n\nexport type BooleanQueryColumn = Column.Pick.QueryColumnOfTypeAndOps<\n 'bool',\n boolean,\n OperatorsBoolean\n>;\n\ntype BooleanNullable = Column.Pick.QueryColumnOfTypeAndOps<\n 'bool',\n boolean | null,\n OperatorsBoolean\n>;\n\ntype NullableBooleanReturn<T> = SetQueryReturnsColumnOrThrow<\n T,\n BooleanNullable\n> &\n OperatorsBoolean;\n\ntype NullableJSONAggReturn<\n T extends PickQuerySelectable,\n Arg extends SelectableOrExpression<T>,\n> = SetQueryReturnsColumnOrThrow<\n T,\n {\n dataType: 'json';\n __type: (ExpressionOutput<T, Arg>['__type'] | null)[] | null;\n __outputType: (ExpressionOutput<T, Arg>['__outputType'] | null)[] | null;\n __queryType: (ExpressionOutput<T, Arg>['__queryType'] | null)[] | null;\n operators: OperatorsArray<never>;\n }\n> &\n OperatorsArray<never>;\n\ninterface RecordSelectableOrExpression<T extends PickQuerySelectable> {\n [K: string]: SelectableOrExpression<T>;\n}\n\ntype NullableJSONObjectReturn<\n T extends PickQuerySelectable,\n Obj extends RecordSelectableOrExpression<T>,\n> = SetQueryReturnsColumnOrThrow<\n T,\n {\n dataType: 'json';\n __type:\n | {\n [K in keyof Obj]: ExpressionOutput<T, Obj[K]>['__type'];\n }\n | null;\n __outputType:\n | {\n [K in keyof Obj]: ExpressionOutput<T, Obj[K]>['__outputType'];\n }\n | null;\n __queryType:\n | {\n [K in keyof Obj]: ExpressionOutput<T, Obj[K]>['__queryType'];\n }\n | null;\n operators: OperatorsAny;\n }\n> &\n OperatorsAny;\n\ntype StringColumn = Column.Pick.QueryColumnOfTypeAndOps<\n string,\n string,\n OperatorsText\n>;\n\ntype StringNullable = Column.Pick.QueryColumnOfTypeAndOps<\n string,\n string | null,\n OperatorsText\n>;\n\ntype NullableStringReturn<T> = SetQueryReturnsColumnOrThrow<T, StringNullable> &\n OperatorsText;\n\nexport interface AggregateArgTypes {\n minMax: // bpchar, timetz not supported by ORM\n | 'citext'\n | 'date'\n | 'float4'\n | 'float8'\n | 'inet'\n | 'int2'\n | 'int4'\n | 'int8'\n | 'interval'\n | 'money'\n | 'numeric'\n | 'text'\n | 'time'\n | 'timestamp'\n | 'timestamptz';\n sum:\n | 'float4'\n | 'float8'\n | 'int2'\n | 'int4'\n | 'int8'\n | 'interval'\n | 'money'\n | 'numeric';\n avg: // unlike sum, avg has no money\n 'float4' | 'float8' | 'int2' | 'int4' | 'int8' | 'interval' | 'numeric';\n bit: 'bit' | 'int2' | 'int4' | 'int8';\n bool: 'bool';\n stringAgg: 'bytea' | 'text';\n}\n\nexport interface AggregateMethods extends SearchAggregateMethods {}\n\n// Query methods to get a single value for an aggregate function\nexport class AggregateMethods {\n /**\n * Count records with the `count` function:\n *\n * ```ts\n * // count all records:\n * const result: number = await db.table.count();\n *\n * // count records where a column is not NULL:\n * db.table.count('name');\n *\n * // see options above:\n * db.table.count('*', aggregateOptions);\n *\n * // select counts of people grouped by city\n * db.people\n * .select('city', {\n * population: (q) => q.count(),\n * })\n * .group('city');\n * ```\n *\n * @param arg - optionally, provide a column or a raw SQL for the `count` argument\n * @param options - aggregation options\n */\n count<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpression<T> = '*',\n options?: AggregateOptions<T>,\n ): CountReturn<T> {\n return makeFnExpression(\n this,\n intNullable,\n 'count',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Get the minimum value for the specified numeric column, returns number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = await db.table.min(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select min product price grouped by product category\n * db.product\n * .select('category', {\n * minPrice: (q) => q.min('price'),\n * })\n * .group('category')\n * .take();\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n min<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['minMax']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'min',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Gets the maximum value for the specified numeric column, returns number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = await db.table.max(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select max product price grouped by product category\n * db.product\n * .select('category', {\n * maxPrice: (q) => q.max('price'),\n * })\n * .group('category')\n * .take();\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n max<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['minMax']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'max',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Retrieve the sum of the values of a given numeric column, returns number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = await db.table.sum(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select sum of employee salaries grouped by years\n * db.employee\n * .select('year', {\n * yearlySalaries: (q) => q.sum('salary'),\n * })\n * .group('year');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n sum<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['sum']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'sum',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Retrieve the average value of a numeric column, it returns a number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = db.table.avg('numericColumn', aggregateOptions);\n *\n * // select average movies ratings\n * db.movie\n * .select('title', {\n * averageRating: (q) => q.avg('rating'),\n * })\n * .group('title');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n avg<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['avg']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'avg',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Bitwise `and` aggregation, returns `number` or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = db.table.bitAnd(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select grouped `bitAnd`\n * db.table\n * .select('someColumn', {\n * bitAnd: (q) => q.bitAnd('numericColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n bitAnd<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['bit']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'bit_and',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Bitwise `or` aggregation, returns `number` or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = db.table.bitOr('numericColumn', aggregateOptions);\n *\n * // select grouped `bitOr`\n * db.table\n * .select('someColumn', {\n * bitOr: (q) => q.bitOr('numericColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n bitOr<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['bit']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'bit_or',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Aggregate booleans with `and` logic, it returns `boolean` or `null` if there are no records.\n *\n * ```ts\n * const result: boolean | null = db.table.boolAnd(\n * 'booleanColumn',\n * aggregateOptions,\n * );\n *\n * // select grouped `boolAnd`\n * db.table\n * .select('someColumn', {\n * boolAnd: (q) => q.boolAnd('booleanColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - boolean column or raw SQL\n * @param options - aggregation options\n */\n boolAnd<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableDataType<T, AggregateArgTypes['bool']>,\n options?: AggregateOptions<T>,\n ): NullableBooleanReturn<T> {\n return makeFnExpression(\n this,\n booleanNullable,\n 'bool_and',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Aggregate booleans with `or` logic, it returns `boolean` or `null` if there are no records.\n *\n * ```ts\n * const result: boolean | null = db.table.boolOr(\n * 'booleanColumn',\n * aggregateOptions,\n * );\n *\n * // select grouped `boolOr`\n * db.table\n * .select('someColumn', {\n * boolOr: (q) => q.boolOr('booleanColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - boolean column or raw SQL\n * @param options - aggregation options\n */\n boolOr<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableDataType<T, AggregateArgTypes['bool']>,\n options?: AggregateOptions<T>,\n ): NullableBooleanReturn<T> {\n return makeFnExpression(\n this,\n booleanNullable,\n 'bool_or',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Equivalent to {@link boolAnd}\n */\n every<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableDataType<T, AggregateArgTypes['bool']>,\n options?: AggregateOptions<T>,\n ): NullableBooleanReturn<T> {\n return makeFnExpression(\n this,\n booleanNullable,\n 'every',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Aggregate values into an array by using `json_agg`. Returns array of values or `null` if there are no records.\n *\n * `jsonAgg` is working a bit faster, `jsonbAgg` is better only when applying JSON operations in SQL.\n *\n * ```ts\n * const idsOrNull: number[] | null = db.table.jsonAgg('id', aggregateOptions);\n *\n * const namesOrNull: string[] | null = db.table.jsonbAgg(\n * 'name',\n * aggregateOptions,\n * );\n *\n * // select grouped `jsonAgg`\n * db.table\n * .select('someColumn', {\n * jsonAgg: (q) => q.jsonAgg('anyColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - any column or raw SQL\n * @param options - aggregation options\n */\n jsonAgg<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableOrExpression<T>,\n >(\n this: T,\n arg: Arg,\n options?: AggregateOptions<T>,\n ): NullableJSONAggReturn<T, Arg> {\n return makeFnExpression(\n this,\n jsonTextNullable,\n 'json_agg',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * See {@link jsonAgg}\n */\n jsonbAgg<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableOrExpression<T>,\n >(\n this: T,\n arg: Arg,\n options?: AggregateOptions<T>,\n ): NullableJSONAggReturn<T, Arg> {\n return makeFnExpression(\n this,\n jsonTextNullable,\n 'jsonb_agg',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * It does the construction of JSON objects, keys are provided strings and values can be table columns or raw SQL expressions, and returns `object` or `null` if no records.\n *\n * `jsonObjectAgg` is different from `jsonbObjectAgg` by internal representation in the database, `jsonObjectAgg` is a bit faster as it constructs a simple string.\n *\n * ```ts\n * import { TextColumn } from './string';\n *\n * // object has type { nameAlias: string, foo: string } | null\n * const object = await db.table.jsonObjectAgg(\n * {\n * // select a column with alias\n * nameAlias: 'name',\n * // select raw SQL with alias\n * foo: sql<string>`\"bar\" || \"baz\"`,\n * },\n * aggregateOptions,\n * );\n *\n * // select aggregated object\n * db.table.select('id', {\n * object: (q) =>\n * q.jsonObjectAgg({\n * nameAlias: 'name',\n * foo: sql<string>`\"bar\" || \"baz\"`,\n * }),\n * });\n * ```\n *\n * @param arg - object where values are column names or SQL\n * @param options - aggregation options\n */\n jsonObjectAgg<\n T extends PickQuerySelectableResultRelationsWindows,\n Obj extends RecordSelectableOrExpression<T>,\n >(\n this: T,\n arg: Obj,\n options?: AggregateOptions<T>,\n ): NullableJSONObjectReturn<T, Obj> {\n return makeFnExpression(\n this,\n jsonTextNullable,\n 'json_object_agg',\n [{ pairs: arg }],\n options,\n ) as never;\n }\n\n /**\n * See {@link jsonObjectAgg}\n */\n jsonbObjectAgg<\n T extends PickQuerySelectableResultRelationsWindows,\n Obj extends RecordSelectableOrExpression<T>,\n >(\n this: T,\n arg: Obj,\n options?: AggregateOptions<T>,\n ): NullableJSONObjectReturn<T, Obj> {\n return makeFnExpression(\n this,\n jsonTextNullable,\n 'jsonb_object_agg',\n [{ pairs: arg }],\n options,\n ) as never;\n }\n\n /**\n * Select joined strings, it returns a string or `null` if no records.\n *\n * ```ts\n * const result: string | null = db.table.stringAgg(\n * 'name',\n * ', ',\n * aggregateOptions,\n * );\n *\n * // select joined strings grouped by some column\n * db.table\n * .select('someColumn', {\n * joinedNames: (q) => q.stringAgg('name', ', '),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - string column or SQL\n * @param delimiter - string to join with\n * @param options - aggration options\n */\n stringAgg<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableDataType<T, AggregateArgTypes['stringAgg']>,\n delimiter: string,\n options?: AggregateOptions<T>,\n ): NullableStringReturn<T> {\n return makeFnExpression(\n this,\n textNullable,\n 'string_agg',\n [arg, { value: delimiter }],\n options,\n ) as never;\n }\n\n /**\n * Concatenates `xml` columns, returns a `string` or `null` if no records.\n *\n * ```ts\n * const xml: string | null = await db.table.xmlAgg('xmlColumn', aggregateOptions);\n *\n * // select joined XMLs grouped by some column\n * db.table\n * .select('someColumn', {\n * joinedXMLs: (q) => q.xmlAgg('xml'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - column or SQL with XML\n * @param options - aggregation options\n */\n xmlAgg<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, StringColumn>,\n options?: AggregateOptions<T>,\n ): NullableStringReturn<T> {\n return makeFnExpression(\n this,\n xmlNullable,\n 'xmlagg',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Selects the` row_number` window function.\n *\n * Returns the number of the current row within its partition, counting from 1.\n *\n * ```ts\n * // result is of type Array<{ rowNumber: number }>\n * const result = await db.table.select({\n * rowNumber: (q) =>\n * q.rowNumber({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n rowNumber<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T, 'int8'> {\n return makeFnExpression(this, intNullable, 'row_number', emptyArray, {\n over,\n }) as never;\n }\n\n /**\n * Selects the` rank` window function.\n *\n * Returns the rank of the current row, with gaps; that is, the row_number of the first row in its peer group.\n *\n * ```ts\n * // result is of type Array<{ rank: number }>\n * const result = await db.table.select({\n * rank: (q) =>\n * q.rank({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n rank<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T, 'int8'> {\n return makeFnExpression(this, intNullable, 'rank', emptyArray, {\n over,\n }) as never;\n }\n\n /**\n * Selects the` dense_rank` window function.\n *\n * Returns the rank of the current row, without gaps; this function effectively counts peer groups.\n *\n * ```ts\n * // result is of type Array<{ denseRank: number }>\n * const result = await db.table.select({\n * denseRank: (q) =>\n * q.denseRank({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n denseRank<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T, 'int8'> {\n return makeFnExpression(this, intNullable, 'dense_rank', emptyArray, {\n over,\n }) as never;\n }\n\n /**\n * Selects the `percent_rank` window function.\n *\n * Returns the relative rank of the current row, that is (rank - 1) / (total partition rows - 1). The value thus ranges from 0 to 1 inclusive.\n *\n * ```ts\n * // result is of type Array<{ percentRank: number }>\n * const result = await db.table.select({\n * percentRank: (q) =>\n * q.percentRank({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n percentRank<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T, 'float8'> {\n return makeFnExpression(this, intNullable, 'percent_rank', emptyArray, {\n over,\n }) as never;\n }\n\n /**\n * Selects the `cume_dist` window function.\n *\n * Returns the cumulative distribution, that is (number of partition rows preceding or peers with current row) / (total partition rows). The value thus ranges from 1/N to 1.\n *\n * ```ts\n * // result is of type Array<{ cumeDist: number }>\n * const result = await db.table.select({\n * cumeDist: (q) =>\n * q.cumeDist({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n cumeDist<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T, 'float8'> {\n return makeFnExpression(this, floatNullable, 'cume_dist', emptyArray, {\n over,\n }) as never;\n }\n}\n","import {\n Query,\n SetQueryReturnsColumnOptional,\n QueryTakeOptional,\n SetQueryReturnsRowCount,\n SetQueryReturnsRowCountMany,\n QueryOrExpression,\n IsQuery,\n isQuery,\n SetQueryReturnsOneResult,\n SetQueryReturnsColumnResult,\n SetQueryResult,\n SetQueryReturnsAll,\n SetValueQueryReturnsPluckColumn,\n} from '../../query';\nimport {\n anyShape,\n Column,\n ColumnSchemaConfig,\n ColumnsShape,\n VirtualColumn,\n} from '../../../columns';\nimport { isSelectingCount } from '../aggregate/aggregate';\nimport {\n CreateFromMethodNames,\n CreateManyFromMethodNames,\n getFromSelectColumns,\n} from './create-from';\nimport { _querySelectAll } from '../select/select';\nimport { prepareSubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport {\n PickQueryDefaults,\n PickQueryHasSelect,\n PickQueryInputType,\n PickQueryQ,\n PickQueryRelations,\n PickQueryResult,\n PickQueryReturnType,\n PickQueryRelationsDataForCreate,\n PickQueryRelationsDataForCreateOptional,\n PickQueryShape,\n PickQueryUniqueProperties,\n PickQueryWithData,\n} from '../../pick-query-types';\nimport { EmptyObject, FnUnknownToUnknown, RecordUnknown } from '../../../utils';\nimport { RelationConfigDataForCreate } from '../../relations';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { _getQueryFreeAlias, _setQueryAlias } from '../as/as';\nimport { _clone } from '../clone/clone';\n\nimport { joinSubQuery } from '../join/join';\nimport { resolveSubQueryCallback } from '../../internal-features/sub-query/sub-query';\nimport { OrchidOrmInternalError } from '../../errors';\nimport { OnConflictMerge } from './insert.sql';\nimport { ToSQLQuery } from '../../sql/to-sql';\nimport { QueryData } from '../../query-data';\nimport { throwIfReadOnly } from '../../query.utils';\n\nexport interface CreateSelf\n extends\n PickQueryHasSelect,\n PickQueryDefaults,\n PickQueryResult,\n PickQueryRelations,\n PickQueryRelationsDataForCreate,\n PickQueryRelationsDataForCreateOptional,\n PickQueryWithData,\n PickQueryReturnType,\n PickQueryShape,\n PickQueryUniqueProperties,\n PickQueryInputType,\n Query.Pick.IsNotReadOnly {}\n\n// Type of argument for `create`, `createMany`, optional argument for `createOneFrom`,\n// `defaults` use a Partial of it.\n//\n// It maps `__inputType` of the table into object to accept a corresponding type,\n// or raw SQL per column, or a sub-query for a column.\n//\n// It allows to omit `belongsTo` foreign keys when a `belongsTo` record is provided by a relation name.\n// For example, it allows to create with `db.book.create({ authorId: 123 })`\n// or with `db.book.create({ author: authorData })`\n//\n// It enables all forms of relation operations such as nested `create`, `connect`, etc.\nexport type CreateData<T extends CreateSelf> =\n EmptyObject extends T['relations']\n ? // if no relations, don't load TS with extra calculations\n CreateDataWithDefaults<T, keyof T['__defaults']>\n : CreateRelationsData<T>;\n\nexport type CreateDataOmit<\n T extends CreateSelf,\n OmitKeys,\n> = EmptyObject extends T['relations']\n ? // if no relations, don't load TS with extra calculations\n CreateDataWithDefaultsOmit<T, keyof T['__defaults'], OmitKeys>\n : CreateRelationsDataOmit<T, OmitKeys>;\n\ntype CreateDataWithDefaults<\n T extends CreateSelf,\n Defaults extends PropertyKey,\n> = {\n [K in keyof T['__inputType'] as K extends Defaults\n ? never\n : K]: K extends Defaults ? never : CreateColumn<T, K>;\n} & {\n [K in Defaults]?: K extends keyof T['__inputType']\n ? CreateColumn<T, K>\n : never;\n};\n\ntype CreateDataWithDefaultsOmit<\n T extends CreateSelf,\n Defaults extends PropertyKey,\n OmitKeys,\n> = {\n [K in keyof T['__inputType'] as K extends Defaults | OmitKeys\n ? never\n : K]: K extends Defaults ? never : CreateColumn<T, K>;\n} & {\n [K in Defaults as K extends OmitKeys\n ? never\n : K]?: K extends keyof T['__inputType'] ? CreateColumn<T, K> : never;\n};\n\n// Foreign key columns marked as writable via `makeColumnWritable`, which\n// should not be omitted from `create` data.\ntype WritableForeignKeys<\n T extends CreateSelf,\n AllFKeys extends PropertyKey,\n> = AllFKeys extends infer K\n ? K extends keyof T['shape']\n ? T['shape'][K] extends { data: { makeColumnWritable: true } }\n ? K\n : never\n : never\n : never;\n\n// Type of available variants to provide for a specific column when creating\nexport type CreateColumn<\n T extends CreateSelf,\n K extends keyof T['__inputType'],\n> = T['__inputType'][K] | ((q: T) => QueryOrExpression<T['__inputType'][K]>);\n\n// Combine data of the table with data that can be set for relations\nexport type CreateRelationsData<T extends CreateSelf> =\n // Data except `belongsTo` foreignKeys: { name: string, fooId: number } -> { name: string }\n CreateDataWithDefaultsOmit<\n T,\n keyof T['__defaults'],\n Exclude<\n T['relations'][keyof T['relations']]['omitForeignKeyInCreate'],\n WritableForeignKeys<\n T,\n T['relations'][keyof T['relations']]['omitForeignKeyInCreate']\n >\n >\n > &\n // Intersect create data per foreign key column, while same-column\n // belongsTo relations stay in a shared union.\n CreateRelationsDataOmittingFKeys<T, T['relationsDataForCreate']> &\n T['relationsDataForCreateOptional'];\n\nexport type CreateRelationsDataOmit<T extends CreateSelf, OmitKeys> =\n // Data except `belongsTo` foreignKeys: { name: string, fooId: number } -> { name: string }\n CreateDataWithDefaultsOmit<\n T,\n keyof T['__defaults'],\n | Exclude<\n T['relations'][keyof T['relations']]['omitForeignKeyInCreate'],\n WritableForeignKeys<\n T,\n T['relations'][keyof T['relations']]['omitForeignKeyInCreate']\n >\n >\n | OmitKeys\n > &\n // Intersect create data per foreign key column, while same-column\n // belongsTo relations stay in a shared union.\n CreateRelationsDataOmittingFKeys<T, T['relationsDataForCreate']> &\n T['relationsDataForCreateOptional'];\n\n// Intersection of create data grouped by column/relation.\n// For belongsTo relations sharing a column this produces:\n// { fooId: number } | { foo: object } | { activeFoo: object }.\nexport type CreateRelationsDataOmittingFKeys<\n T extends CreateSelf,\n Data,\n> = EmptyObject extends Data\n ? EmptyObject\n : // Based on UnionToIntersection from here https://stackoverflow.com/a/50375286\n {\n [K in keyof Data]: CreateRelationDataOmittingFKeys<T, Data[K]>;\n }[keyof Data] extends (u: infer Obj) => void // must be handled as a function argument, belongsTo.test relies on this\n ? Obj\n : never;\n\ntype CreateRelationDataOmittingFKeys<T extends CreateSelf, Union> = (\n u: Union extends RelationConfigDataForCreate\n ? // omit relation columns if they are in defaults, is tested in factory.test.ts\n Union['columns'] extends keyof T['__defaults']\n ? Pick<\n CreateDataWithDefaults<T, keyof T['__defaults']>,\n Union['columns']\n > &\n Partial<Union['nested']>\n :\n | (Pick<\n {\n [P in keyof T['__inputType']]: CreateColumn<T, P>;\n },\n Union['columns'] & keyof T['__inputType']\n > & {\n [K in keyof Union['nested']]?: never;\n })\n | Union['nested']\n : // hasOne, hasMany, hasAndBelongsToMany\n Union,\n) => void;\n\n// `create` method output type\n// - if `count` method is preceding `create`, will return 0 or 1 if created.\n// - If the query returns multiple, forces it to return one record.\n// - if it is a `pluck` query, forces it to return a single value\nexport type CreateResult<T extends CreateSelf, Data> = T extends {\n isCount: true;\n}\n ? T\n : T['returnType'] extends undefined | 'all'\n ? SetQueryReturnsOneResult<T, NarrowCreateResult<T, Data>>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumnResult<T, NarrowCreateResult<T, Data>>\n : SetQueryResult<T, NarrowCreateResult<T, Data>>;\n\n// `insert` method output type\n// - query returns inserted row count by default.\n// - returns a record with selected columns if the query has a select.\n// - if the query returns multiple, forces it to return one record.\n// - if it is a `pluck` query, forces it to return a single value\ntype InsertResult<T extends CreateSelf, Data> = T['__hasSelect'] extends true\n ? T['returnType'] extends undefined | 'all'\n ? SetQueryReturnsOneResult<T, NarrowCreateResult<T, Data>>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumnResult<T, NarrowCreateResult<T, Data>>\n : SetQueryResult<T, NarrowCreateResult<T, Data>>\n : SetQueryReturnsRowCount<T>;\n\n// `createMany` method output type\n// - if `count` method is preceding `create`, will return 0 or 1 if created.\n// - If the query returns a single record, forces it to return multiple.\n// - otherwise, query result remains as is.\ntype CreateManyResult<T extends CreateSelf> = T extends { isCount: true }\n ? T\n : T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAll<T>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetValueQueryReturnsPluckColumn<T>\n : T;\n\n// `insertMany` method output type\n// - query returns inserted row count by default.\n// - returns records with selected columns if the query has a select.\n// - if the query returns a single record, forces it to return multiple records.\ntype InsertManyResult<T extends CreateSelf> = T['__hasSelect'] extends true\n ? T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAll<T>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetValueQueryReturnsPluckColumn<T>\n : T\n : SetQueryReturnsRowCountMany<T>;\n\n/**\n * When creating a record with a *belongs to* nested record,\n * un-nullify foreign key columns of the result.\n *\n * The same should work as well with any non-null columns passed to `create`, but it's to be implemented later.\n */\ntype NarrowCreateResult<\n T extends CreateSelf,\n Data,\n> = EmptyObject extends T['relations']\n ? T['result']\n : {\n [K in keyof T['result']]: true extends {\n [R in keyof T['relations']]: K extends T['relations'][R]['omitForeignKeyInCreate']\n ? R extends keyof Data\n ? true\n : T['relations'][R]['omitForeignKeyInCreate'] extends keyof Data\n ?\n | null\n | undefined extends Data[T['relations'][R]['omitForeignKeyInCreate']]\n ? never\n : true\n : never\n : never;\n }[keyof T['relations']]\n ? Column.Pick.QueryColumnOfTypeAndOps<\n string,\n Exclude<T['result'][K]['__outputType'], null>,\n T['result'][K]['operators']\n >\n : T['result'][K];\n };\n\n// `onConflictDoNothing()` method output type:\n// overrides query return type from 'oneOrThrow' to 'one', from 'valueOrThrow' to 'value',\n// because `ignore` won't return any data in case of a conflict.\ntype IgnoreResult<T extends CreateSelf> = T['returnType'] extends 'oneOrThrow'\n ? QueryTakeOptional<T>\n : T['returnType'] extends 'valueOrThrow'\n ? SetQueryReturnsColumnOptional<T, T['result']['value']>\n : T;\n\n// Argument of `onConflict`, can be:\n// - a unique column name\n// - an array of unique column names\n// - raw or other kind of Expression\ntype OnConflictArg<T extends PickQueryUniqueProperties> =\n | T['internal']['uniqueColumnNames']\n | T['internal']['uniqueColumnTuples']\n | Expression\n | { constraint: T['internal']['uniqueConstraints'] };\n\nexport type AddQueryDefaults<\n T extends CreateSelf,\n DefaultKeys extends PropertyKey,\n> = {\n [K in keyof T]: K extends '__defaults'\n ? { [K in keyof T['__defaults'] | DefaultKeys]: true }\n : T[K];\n};\n\n/**\n * Used by ORM to access the context of current create query.\n * Is passed to the `create` method of a {@link VirtualColumn}\n */\nexport interface CreateCtx {\n columns: Map<string, number>;\n returnTypeAll?: true;\n resultAll: RecordUnknown[];\n}\n\n// Type of `encode` of columns.\ninterface RecordEncoder {\n [K: string]: FnUnknownToUnknown;\n}\n\n// Function called by all `create` methods to override query select.\n// Clears select if query returning nothing or a count.\n// Otherwise, selects all if query doesn't have select.\nexport const createSelect = (q: Query) => {\n if (q.q.returnType === 'void' || isSelectingCount(q)) {\n q.q.select = undefined;\n } else if (!q.q.select) {\n _querySelectAll(q);\n q.q.returning = true;\n }\n};\n\ninterface CreateHandler {\n column: {\n create(\n query: CreateSelf,\n ctx: CreateCtx,\n items: RecordUnknown[],\n rowIndexes: number[],\n count: number,\n ): void;\n };\n rowIndexes: number[];\n}\n\ninterface CreateHandlers {\n [columnName: string]: CreateHandler;\n}\n\n/**\n * Processes arguments of data to create.\n * If the passed key is for a {@link VirtualColumn}, calls `create` of the virtual column.\n * Otherwise, ignores keys that aren't relevant to the table shape,\n * collects columns to the `ctx.columns` set, collects columns encoders.\n *\n * @param q - query object.\n * @param item - argument of data to create.\n * @param rowIndex - index of record's data in `createMany` args array.\n * @param ctx - context of create query to be shared with a {@link VirtualColumn}.\n * @param encoders - to collect `encode`s of columns.\n * @param createHandlers - collects column `create` functions per column having it, and collects row indexes having a value for this column\n */\nconst processCreateItem = (\n q: CreateSelf,\n item: RecordUnknown,\n rowIndex: number,\n ctx: CreateCtx,\n encoders: RecordEncoder,\n createHandlers: CreateHandlers,\n) => {\n const shape = (q as Query).shape as ColumnsShape;\n for (const key in item) {\n const column = shape[key];\n if (!column) continue;\n\n if (column.data.virtual) {\n const virtual = column as VirtualColumn<ColumnSchemaConfig>;\n if (virtual.create) {\n if (createHandlers[key]) {\n createHandlers[key].rowIndexes.push(rowIndex);\n } else {\n createHandlers[key] = {\n column: virtual,\n rowIndexes: [rowIndex],\n } as CreateHandler;\n }\n }\n continue;\n }\n\n throwOnReadOnly(q, column, key);\n\n let value = item[key];\n\n if (typeof value === 'function') {\n value = item[key] = resolveSubQueryCallback(\n q as unknown as ToSQLQuery,\n value as (q: ToSQLQuery) => ToSQLQuery,\n );\n\n if (isQuery(value)) {\n value = item[key] = joinSubQuery(\n q as Query,\n prepareSubQueryForSql(q as Query, value as Query),\n );\n }\n }\n\n if (\n !ctx.columns.has(key) &&\n ((column && !column.data.readOnly) || shape === anyShape) &&\n value !== undefined\n ) {\n ctx.columns.set(key, ctx.columns.size);\n encoders[key] = column?.data.encode as FnUnknownToUnknown;\n }\n }\n};\n\nconst runCreateHandlers = (\n q: CreateSelf,\n ctx: CreateCtx,\n data: RecordUnknown[],\n createHandlers: CreateHandlers,\n) => {\n const count = data.length;\n for (const key in createHandlers) {\n const { column, rowIndexes } = createHandlers[key];\n const items = rowIndexes.map((i) => data[i]);\n column.create(q, ctx, items, rowIndexes, count);\n }\n};\n\nexport const throwOnReadOnly = (\n q: unknown,\n column: Column.Pick.Data,\n key: string,\n) => {\n if (column.data.appReadOnly || column.data.readOnly) {\n throw new OrchidOrmInternalError(\n q as Query,\n 'Trying to insert a readonly column',\n { column: key },\n );\n }\n};\n\n// Creates a new context of create query.\nexport const createCtx = (): CreateCtx => ({\n columns: new Map(),\n resultAll: undefined as unknown as RecordUnknown[],\n});\n\n/**\n * Processes arguments of `create`, `insert`, `createOneFrom` and `insertOneFrom` when it has data.\n * Apply defaults that may be present on a query object to the data.\n * Maps data object into array of values, encodes values when the column has an encoder.\n *\n * @param q - query object.\n * @param data - argument with data for create.\n * @param ctx - context of the create query.\n */\nexport const handleOneData = (\n q: CreateSelf,\n data: RecordUnknown,\n ctx: CreateCtx,\n): { columns: string[]; values: unknown[][] } => {\n const encoders: RecordEncoder = {};\n const defaults = (q as Query).q.defaults;\n\n data = defaults ? { ...defaults, ...data } : { ...data };\n\n const createHandlers: CreateHandlers = {};\n\n processCreateItem(q, data, 0, ctx, encoders, createHandlers);\n\n runCreateHandlers(q, ctx, [data], createHandlers);\n\n const columns = Array.from(ctx.columns.keys());\n const values = [\n columns.map((key) =>\n // undefined values were stripped and no need to check for them\n encoders[key] && !isExpression(data[key]) && data[key] !== null\n ? encoders[key](data[key])\n : data[key],\n ),\n ];\n\n return { columns, values };\n};\n\n/**\n * Processes arguments of `createMany`, `insertMany`.\n * Apply defaults that may be present on a query object to the data.\n * Maps data objects into array of arrays of values, encodes values when the column has an encoder.\n *\n * @param q - query object.\n * @param data - arguments with data for create.\n * @param ctx - context of the create query.\n */\nexport const handleManyData = (\n q: CreateSelf,\n data: RecordUnknown[],\n ctx: CreateCtx,\n): { columns: string[]; values: unknown[][] } => {\n const encoders: RecordEncoder = {};\n const defaults = (q as Query).q.defaults;\n\n data = data.map(\n defaults ? (item) => ({ ...defaults, ...item }) : (item) => ({ ...item }),\n );\n\n const createHandlers: CreateHandlers = {};\n\n const len = data.length;\n for (let i = 0; i < len; i++) {\n processCreateItem(q, data[i], i, ctx, encoders, createHandlers);\n }\n\n runCreateHandlers(q, ctx, data, createHandlers);\n\n const values = Array(data.length);\n const columns = Array.from(ctx.columns.keys());\n\n for (let i = 0; i < len; i++) {\n const item = data[i];\n (values as unknown[][])[i] = columns.map((key) =>\n encoders[key] && item[key] !== undefined && !isExpression(item[key])\n ? encoders[key](item[key])\n : item[key],\n );\n }\n\n return { columns, values };\n};\n\n/**\n * Core function that is used by all `create` and `insert` methods.\n * Sets query `type` to `insert` for `toSQL` to know it's for inserting.\n * Sets query columns and values.\n * Sets query kind, which is checked by `update` method when returning a query from callback.\n * Overrides query return type according to what is current create method supposed to return.\n *\n * @param self - query object.\n * @param columns - columns list of all values.\n * @param insertFrom - query of `createFrom` and alike\n * @param values - array of arrays matching columns\n * @param many - whether it's for creating one or many.\n * @param queryMany - whether is createForEachFrom\n */\nexport const insert = (\n self: CreateSelf,\n {\n columns,\n insertFrom,\n values,\n }: {\n insertFrom?: IsQuery;\n columns: string[];\n values: QueryData['values'];\n },\n many?: boolean,\n queryMany?: boolean,\n) => {\n const { q } = self as unknown as { q: QueryData };\n\n if (!q.select?.length) {\n q.returning = true;\n }\n\n q.type = 'insert';\n\n insertFrom = insertFrom\n ? (q.insertFrom = prepareSubQueryForSql(self as never, insertFrom as Query))\n : q.insertFrom;\n\n if (insertFrom) {\n if (q.insertFrom) {\n const obj = getFromSelectColumns(\n self,\n q.insertFrom,\n {\n columns,\n values,\n },\n queryMany,\n );\n columns = obj.columns;\n values = obj.values;\n q.queryColumnsCount = obj.queryColumnsCount;\n }\n\n if (values.length > 1) {\n const insertValuesAs = _getQueryFreeAlias(q, 'v');\n _setQueryAlias(self as Query, 'v', insertValuesAs);\n\n q.insertValuesAs = insertValuesAs;\n }\n }\n\n q.columns = columns;\n q.values = values;\n\n const { select, returnType } = q;\n\n if (!select) {\n if (returnType !== 'void') {\n q.returnType = 'valueOrThrow';\n if (many) q.returningMany = true;\n }\n } else if (many) {\n if (returnType === 'one' || returnType === 'oneOrThrow') {\n q.returnType = 'all';\n } else if (returnType === 'value' || returnType === 'valueOrThrow') {\n q.returnType = 'pluck';\n }\n } else if (!returnType || returnType === 'all') {\n q.returnType = insertFrom ? (insertFrom as Query).q.returnType : 'one';\n } else if (returnType === 'pluck') {\n q.returnType = 'valueOrThrow';\n }\n\n return self;\n};\n\nexport const _queryCreate = <T extends CreateSelf, Data extends CreateData<T>>(\n q: T,\n data: Data,\n): CreateResult<T, Data> => {\n throwIfReadOnly(q as unknown as Query);\n createSelect(q as unknown as Query);\n return _queryInsert(q, data) as never;\n};\n\nexport const _queryInsert = <T extends CreateSelf, Data extends CreateData<T>>(\n query: T,\n data: Data,\n): InsertResult<T, Data> => {\n throwIfReadOnly(query as unknown as Query);\n const ctx = createCtx();\n const obj = handleOneData(query, data, ctx) as {\n columns: string[];\n values: QueryData['values'];\n };\n\n return insert(query, obj) as never;\n};\n\nexport const _queryCreateMany = <T extends CreateSelf>(\n q: T,\n data: CreateData<T>[],\n): CreateManyResult<T> => {\n throwIfReadOnly(q as unknown as Query);\n createSelect(q as unknown as Query);\n return _queryInsertMany(q, data as never) as never;\n};\n\nexport const _queryInsertMany = <T extends CreateSelf>(\n q: T,\n data: CreateData<T>[],\n): InsertManyResult<T> => {\n throwIfReadOnly(q as unknown as Query);\n const ctx = createCtx();\n let result = insert(q, handleManyData(q, data, ctx), true) as never;\n if (!data.length) result = (result as Query).none() as never;\n return result;\n};\n\nexport const _queryDefaults = <\n T extends CreateSelf,\n Data extends Partial<CreateData<T>>,\n>(\n q: T,\n data: Data,\n): AddQueryDefaults<T, keyof Data> => {\n (q as unknown as Query).q.defaults = data;\n return q as never;\n};\n\n/**\n * Names of all create methods,\n * is used in relational query to remove these methods if chained relation shouldn't have them,\n * for the case of has one/many through.\n */\nexport type CreateMethodsNames =\n | 'create'\n | 'insert'\n | 'createMany'\n | 'insertMany'\n | CreateFromMethodNames;\n\nexport type CreateManyMethodsNames =\n | 'createMany'\n | 'insertMany'\n | CreateManyFromMethodNames;\n\ntype ExtraPropertiesAreNotAllowed<\n T extends CreateSelf,\n Data,\n> = keyof Data extends keyof T['__inputType'] | keyof T['relations']\n ? Data\n : `Extra properties are not allowed: ${Exclude<\n keyof Data,\n keyof T['__inputType'] | keyof T['relations']\n > &\n string}`;\n\nexport class QueryCreate {\n /**\n * `create` and `insert` create a single record.\n *\n * Use `select`, `selectAll`, `get`, or `pluck` alongside `create` or `insert` to\n * specify returning columns.\n *\n * Each column may accept a specific value, a raw SQL, or a query that returns a single value.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * const oneRecord = await db.table.create({\n * name: 'John',\n * password: '1234',\n * });\n *\n * // When using `.onConflictDoNothing()`,\n * // the record may be not created and the `createdCount` will be 0.\n * const createdCount = await db.table.insert(data).onConflictDoNothing();\n *\n * await db.table.create({\n * // raw SQL\n * column1: () => sql`'John' || ' ' || 'Doe'`,\n *\n * // query that returns a single value\n * // returning multiple values will result in Postgres error\n * column2: () => db.otherTable.get('someColumn'),\n *\n * // nesting creates, updates, deletes produces a single SQL\n * column4: () => db.otherTable.create(data).get('someColumn'),\n * column5: (q) => q.relatedTable.find(id).update(data).get('someColumn'),\n * });\n * ```\n *\n * Creational methods can be used in {@link WithMethods.with} expressions:\n *\n * ```ts\n * db.$qb\n * // create a record in one table\n * .with('a', db.table.select('id').create(data))\n * // create a record in other table using the first table record id\n * .with('b', (q) =>\n * db.otherTable.select('id').create({\n * ...otherData,\n * aId: () => q.from('a').get('id'),\n * }),\n * )\n * .from('b');\n * ```\n */\n create<T extends CreateSelf, Data extends CreateData<T>>(\n this: T,\n data: ExtraPropertiesAreNotAllowed<T, Data>,\n ): CreateResult<T, Data> {\n return _queryCreate(_clone(this) as unknown as T, data as never) as never;\n }\n\n /**\n * Works exactly as {@link create}, except that it returns inserted row count by default.\n */\n insert<T extends CreateSelf, Data extends CreateData<T>>(\n this: T,\n data: ExtraPropertiesAreNotAllowed<T, Data>,\n ): InsertResult<T, Data> {\n return _queryInsert(_clone(this) as unknown as T, data as never) as never;\n }\n\n /**\n * `createMany` and `insertMany` will create a batch of records.\n *\n * Each column may be set with a specific value, a raw SQL, or a query, the same as in {@link create}.\n *\n * In case one of the objects has fewer fields, the `DEFAULT` SQL keyword will be placed in its place in the `VALUES` statement.\n *\n * ```ts\n * const manyRecords = await db.table.createMany([\n * { key: 'value', otherKey: 'other value' },\n * { key: 'value' }, // default will be used for `otherKey`\n * ]);\n *\n * // `createdCount` will be 3.\n * const createdCount = await db.table.insertMany([data, data, data]);\n * ```\n *\n * When nesting creates, a separate create query will be executed for every time it's used:\n *\n * ```ts\n * // will be performed twice, even though it is defined once\n * const nestedCreate = db.otherTable.create(data).get('column');\n *\n * await db.table.createMany([{ column: nestedCreate }, { column: nestedCreate }]);\n * ```\n *\n * Because of a limitation of Postgres protocol, queries having more than **65535** of values are going to fail in runtime.\n * To solve this seamlessly, `OrchidORM` will automatically batch such queries, and wrap them into a transaction, unless they are already in a transaction.\n *\n * ```ts\n * // OK: executes 2 inserts wrapped into a transaction\n * await db.table.createMany(\n * Array.from({ length: 65536 }, () => ({ text: 'text' })),\n * );\n * ```\n *\n * However, this only works in the case shown above. This **won't** work if you're using the `createMany` in `with` statement,\n * or if the insert is used as a sub-query in other query part.\n *\n * @param data - array of records data, may have values, raw SQL, queries, relation operations\n */\n createMany<T extends CreateSelf>(\n this: T,\n data: CreateData<T>[],\n ): CreateManyResult<T> {\n return _queryCreateMany(_clone(this) as unknown as T, data) as never;\n }\n\n /**\n * Works exactly as {@link createMany}, except that it returns inserted row count by default.\n *\n * @param data - array of records data, may have values, raw SQL, queries, relation operations\n */\n insertMany<T extends CreateSelf>(\n this: T,\n data: CreateData<T>[],\n ): InsertManyResult<T> {\n return _queryInsertMany(_clone(this) as unknown as T, data) as never;\n }\n\n /**\n * `defaults` allows setting values that will be used later in `create`.\n *\n * Columns provided in `defaults` are marked as optional in the following `create`.\n *\n * Default data is the same as in {@link create} and {@link createMany},\n * so you can provide a raw SQL, or a query with a query.\n *\n * ```ts\n * // Will use firstName from defaults and lastName from create argument:\n * db.table\n * .defaults({\n * firstName: 'first name',\n * lastName: 'last name',\n * })\n * .create({\n * lastName: 'override the last name',\n * });\n * ```\n *\n * @param data - default values for `create` and `createMany` which will follow `defaults`\n */\n defaults<T extends CreateSelf, Data extends Partial<CreateData<T>>>(\n this: T,\n data: Data,\n ): AddQueryDefaults<T, keyof Data> {\n return _queryDefaults(_clone(this) as never, data as never);\n }\n\n /**\n * By default, violating unique constraint will cause the creative query to throw,\n * you can define what to do on a conflict: to ignore it, or to merge the existing record with a new data.\n *\n * A conflict occurs when a table has a primary key or a unique index on a column,\n * or a composite primary key unique index on a set of columns,\n * and a row being created has the same value as a row that already exists in the table in this column(s).\n *\n * Use {@link onConflictDoNothing} to suppress the error and continue without updating the record,\n * or the `merge` to update the record with new values automatically,\n * or the `set` to specify own values for the update.\n *\n * `onConflict` only accepts column names that are defined in `primaryKey` or `unique` in the table definition.\n * To specify a constraint, its name also must be explicitly set in `primaryKey` or `unique` in the table code.\n *\n * Postgres has a limitation that a single `INSERT` query can have only a single `ON CONFLICT` clause that can target only a single unique constraint\n * for updating the record.\n *\n * If your table has multiple potential reasons for unique constraint violation, such as username and email columns in a user table,\n * consider using `upsert` instead.\n *\n * ```ts\n * // leave `onConflict` without argument to ignore or merge on any conflict\n * db.table.create(data).onConflictDoNothing();\n *\n * // single column:\n * // (this requires a composite primary key or unique index, see below)\n * db.table.create(data).onConflict('email').merge();\n *\n * // array of columns:\n * db.table.create(data).onConflict(['email', 'name']).merge();\n *\n * // constraint name\n * db.table.create(data).onConflict({ constraint: 'unique_index_name' }).merge();\n *\n * // raw SQL expression:\n * db.table\n * .create(data)\n * .onConflict(sql`(email) where condition`)\n * .merge();\n * ```\n *\n * :::info\n * A primary key or a unique index for a **single** column can be fined on a column:\n *\n * ```ts\n * export const MyTable = defineTable('myTable', (t) => ({\n * pkey: t.uuid().primaryKey(),\n * unique: t.string().unique(),\n * }));\n * ```\n *\n * But for composite primary keys or indexes (having multiple columns), define it in a separate function:\n *\n * ```ts\n * export const MyTable = defineTable('myTable', (t) => ({\n * one: t.integer(),\n * two: t.string(),\n * three: t.boolean(),\n * }))\n * .primaryKey(['one', 'two'])\n * .unique(['two', 'three']);\n * ```\n * :::\n *\n * You can use the `sql` function exported from your table factory file in onConflict.\n * It can be useful to specify a condition when you have a partial index:\n *\n * ```ts\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * active: true,\n * })\n * // ignore only when having conflicting email and when active is true.\n * .onConflict(sql`(email) where active`)\n * .ignore();\n * ```\n *\n * For `merge` and `set`, you can append `where` to update data only for the matching rows:\n *\n * ```ts\n * const timestamp = Date.now();\n *\n * db.table\n * .create(data)\n * .onConflict('email')\n * .set({\n * name: 'John Doe',\n * updatedAt: timestamp,\n * })\n * .where({ updatedAt: { lt: timestamp } });\n * ```\n *\n * @param arg - optionally provide an array of columns\n */\n onConflict<T extends CreateSelf, Arg extends OnConflictArg<T>>(\n this: T,\n arg: Arg,\n ): OnConflictQueryBuilder<T, Arg> {\n return new OnConflictQueryBuilder(this, arg as never);\n }\n\n /**\n * Use `onConflictDoNothing` to suppress unique constraint violation error when creating a record.\n *\n * Adds `ON CONFLICT (columns) DO NOTHING` clause to the insert statement, columns are optional.\n *\n * Can also accept a constraint name.\n *\n * ```ts\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * })\n * // on any conflict:\n * .onConflictDoNothing()\n * // or, for a specific column:\n * .onConflictDoNothing('email')\n * // or, for a specific constraint:\n * .onConflictDoNothing({ constraint: 'unique_index_name' });\n * ```\n *\n * When there is a conflict, nothing can be returned from the database, so `onConflictDoNothing` adds `| undefined` part to the response type.\n *\n * ```ts\n * const maybeRecord: RecordType | undefined = await db.table\n * .create(data)\n * .onConflictDoNothing();\n *\n * const maybeId: number | undefined = await db.table\n * .get('id')\n * .create(data)\n * .onConflictDoNothing();\n * ```\n *\n * When creating multiple records, only created records will be returned. If no records were created, array will be empty:\n *\n * ```ts\n * // array can be empty\n * const arr = await db.table.createMany([data, data, data]).onConflictDoNothing();\n * ```\n */\n onConflictDoNothing<T extends CreateSelf, Arg extends OnConflictArg<T>>(\n this: T,\n arg?: Arg,\n ): IgnoreResult<T> {\n const q = _clone(this);\n q.q.onConflict = {\n target: arg as never,\n };\n\n if (q.q.returnType === 'oneOrThrow') {\n q.q.returnType = 'one';\n } else if (q.q.returnType === 'valueOrThrow') {\n q.q.returnType = 'value';\n }\n\n return q as never;\n }\n}\n\ntype OnConflictSet<T extends CreateSelf> = {\n [K in keyof T['__inputType']]?:\n | T['__inputType'][K]\n | (() => QueryOrExpression<T['__inputType'][K]>);\n};\n\nexport class OnConflictQueryBuilder<\n T extends CreateSelf,\n Arg extends OnConflictArg<T> | undefined,\n> {\n constructor(\n private query: T,\n private onConflict: Arg,\n ) {}\n\n /**\n * Available only after `onConflict`.\n *\n * Updates the record with a given data when conflict occurs.\n *\n * ```ts\n * db.table\n * .create(data)\n * .onConflict('email')\n * .set({\n * // supports plain values and SQL expressions\n * key: 'value',\n * fromSql: () => sql`custom sql`,\n * })\n * // to update records only on certain conditions\n * .where({ ...certainConditions });\n * ```\n *\n * @param set - object containing new column values\n */\n set(set: OnConflictSet<T>): T {\n let resolved: RecordUnknown | undefined;\n for (const key in set) {\n const column = this.query.shape[key] as unknown as Column.Pick.Data;\n if (column) throwOnReadOnly(this.query, column, key);\n\n if (typeof set[key] === 'function') {\n if (!resolved) resolved = { ...set };\n\n resolved[key] = (set[key] as () => unknown)();\n }\n }\n\n (this.query as unknown as Query).q.onConflict = {\n target: this.onConflict as never,\n set: resolved || set,\n };\n return this.query;\n }\n\n /**\n * Available only after `onConflict`.\n *\n * Use this method to merge all the data you have passed into `create` to update the existing record on conflict.\n *\n * If the table has columns with **dynamic** default values, such values will be applied as well.\n *\n * You can exclude certain columns from being merged by passing the `except` option.\n *\n * ```ts\n * // merge the full data\n * db.table.create(data).onConflict('email').merge();\n *\n * // merge only a single column\n * db.table.create(data).onConflict('email').merge('name');\n *\n * // merge multiple columns\n * db.table.create(data).onConflict('email').merge(['name', 'quantity']);\n *\n * // merge all columns except some\n * db.table\n * .create(data)\n * .onConflict('email')\n * .merge({ except: ['name', 'quantity'] });\n *\n * // merge can be applied also for batch creates\n * db.table.createMany([data1, data2, data2]).onConflict('email').merge();\n *\n * // update records only on certain conditions\n * db.table\n * .create(data)\n * .onConflict('email')\n * .merge()\n * .where({ ...certainConditions });\n * ```\n *\n * @param merge - no argument will merge all data, or provide a column(s) to merge, or provide `except` to update all except some.\n */\n merge(\n merge?:\n | keyof T['shape']\n | (keyof T['shape'])[]\n | { except: keyof T['shape'] | (keyof T['shape'])[] },\n ): T {\n (this.query as unknown as PickQueryQ).q.onConflict = {\n target: this.onConflict as never,\n merge: merge as OnConflictMerge,\n };\n return this.query;\n }\n}\n","import { Column } from '../../../columns/column';\nimport {\n createCtx,\n CreateData,\n CreateDataOmit,\n createSelect,\n CreateSelf,\n handleManyData,\n handleOneData,\n insert,\n throwOnReadOnly,\n} from './create';\nimport {\n Query,\n SetQueryReturnsRowCount,\n SetQueryReturnsRowCountMany,\n queryTypeWithLimitOne,\n IsQuery,\n SetQueryReturnsAll,\n SetQueryReturnsOne,\n SetQueryReturnsColumn,\n SetValueQueryReturnsPluckColumn,\n} from '../../query';\nimport { QueryData } from '../../query-data';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { MaybeArray, RecordUnknown } from '../../../utils';\nimport { _clone } from '../clone/clone';\nimport { throwIfReadOnly } from '../../query.utils';\n\nexport type CreateFromMethodNames =\n | 'createOneFrom'\n | 'insertOneFrom'\n | CreateManyFromMethodNames;\n\nexport type CreateManyFromMethodNames =\n | 'createManyFrom'\n | 'insertManyFrom'\n | 'createForEachFrom'\n | 'insertForEachFrom';\n\ninterface QueryReturningOne extends IsQuery {\n result: Column.QueryColumns;\n returnType: 'one' | 'oneOrThrow';\n}\n\ntype CreateRawOrFromResult<T extends CreateSelf> = T extends { isCount: true }\n ? T\n : T['returnType'] extends undefined | 'all'\n ? SetQueryReturnsOne<T>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumn<T>\n : T;\n\ntype InsertRawOrFromResult<T extends CreateSelf> = T['__hasSelect'] extends true\n ? T['returnType'] extends undefined | 'all'\n ? SetQueryReturnsOne<T>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumn<T>\n : T\n : SetQueryReturnsRowCount<T>;\n\ntype CreateManyFromResult<T extends CreateSelf> = T extends {\n isCount: true;\n}\n ? T\n : T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAll<T>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetValueQueryReturnsPluckColumn<T>\n : T;\n\ntype InsertManyFromResult<T extends CreateSelf> = T['__hasSelect'] extends true\n ? T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAll<T>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetValueQueryReturnsPluckColumn<T>\n : T\n : SetQueryReturnsRowCountMany<T>;\n\n/**\n * Is used by all create from queries methods.\n * Collects columns and values from the inner query and optionally from the given data,\n * calls {@link insert} with a 'from' kind of create query.\n *\n * @param query - query object.\n * @param from - inner query from which to create new records.\n * @param many - whether is createManyFrom or createForEachFrom.\n * @param queryMany - whether is createForEachFrom\n * @param data - optionally passed custom data when creating a single record.\n */\nconst insertFrom = (\n query: CreateSelf,\n from: IsQuery,\n many?: boolean,\n queryMany?: boolean,\n data?: MaybeArray<RecordUnknown>,\n): CreateSelf => {\n throwIfReadOnly(query as unknown as Query);\n\n const ctx = createCtx();\n\n const obj =\n data &&\n (Array.isArray(data)\n ? handleManyData(query, data, ctx)\n : handleOneData(query, data, ctx));\n\n return insert(\n query,\n {\n insertFrom: from,\n columns: obj?.columns || [],\n values: obj?.values || [],\n },\n many,\n queryMany,\n );\n};\n\n/**\n * Function to collect column names from the inner query of create `from` methods.\n *\n * @param q - the creating query\n * @param from - inner query to grab the columns from.\n * @param obj - optionally passed object with specific data, only available when creating a single record.\n * @param many - whether it's for `createForEachFrom`. If no, throws if the inner query returns multiple records.\n */\nexport const getFromSelectColumns = (\n q: CreateSelf,\n from: SubQueryForSql,\n obj?: {\n columns: string[];\n values: QueryData['values'];\n },\n many?: boolean,\n): {\n columns: string[];\n queryColumnsCount: number;\n values: unknown[][];\n} => {\n if (!many && !queryTypeWithLimitOne[from.q.returnType as string]) {\n throw new Error(\n 'Cannot create based on a query which returns multiple records',\n );\n }\n\n const queryColumns = new Set<string>();\n from.q.select?.forEach((item) => {\n if (typeof item === 'string') {\n const index = item.indexOf('.');\n queryColumns.add(index === -1 ? item : item.slice(index + 1));\n } else if (item && 'selectAs' in item) {\n for (const column in item.selectAs) {\n queryColumns.add(column);\n }\n }\n });\n\n const allColumns = new Set<string>(queryColumns);\n const queryColumnsCount = queryColumns.size;\n const allValues: unknown[][] = [];\n if (obj?.columns) {\n for (const objectValues of obj.values) {\n const values: unknown[] = [];\n allValues.push(values);\n\n obj.columns.forEach((column, i) => {\n if (!queryColumns.has(column)) {\n allColumns.add(column);\n values.push(objectValues[i]);\n }\n });\n }\n }\n\n for (const key of queryColumns) {\n const column = q.shape[key] as unknown as Column.Pick.Data;\n if (column) throwOnReadOnly(from, column, key);\n }\n\n return {\n columns: [...allColumns],\n queryColumnsCount,\n values: allValues,\n };\n};\n\nexport const _queryCreateOneFrom = <\n T extends CreateSelf,\n Q extends QueryReturningOne,\n>(\n q: T,\n query: Q,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n): CreateRawOrFromResult<T> => {\n createSelect(q as unknown as Query);\n return insertFrom(q, query, false, false, data) as never;\n};\n\nexport const _queryInsertOneFrom = <\n T extends CreateSelf,\n Q extends QueryReturningOne,\n>(\n q: T,\n query: Q,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n): InsertRawOrFromResult<T> => {\n return insertFrom(q, query, false, false, data) as never;\n};\n\nexport const _queryCreateManyFrom = <\n T extends CreateSelf,\n Q extends QueryReturningOne,\n>(\n q: T,\n query: Q,\n data: Omit<CreateData<T>, keyof Q['result']>[],\n): CreateManyFromResult<T> => {\n createSelect(q as unknown as Query);\n return insertFrom(q, query, true, false, data) as never;\n};\n\nexport const _queryInsertManyFrom = <\n T extends CreateSelf,\n Q extends QueryReturningOne,\n>(\n q: T,\n query: Q,\n data: Omit<CreateData<T>, keyof Q['result']>[],\n): InsertManyFromResult<T> => {\n return insertFrom(q, query, true, false, data) as never;\n};\n\nexport const _queryCreateForEachFrom = <T extends CreateSelf>(\n q: T,\n query: IsQuery,\n): CreateManyFromResult<T> => {\n createSelect(q as unknown as Query);\n return insertFrom(q, query, true, true) as never;\n};\n\nexport const _queryInsertForEachFrom = <T extends CreateSelf>(\n q: T,\n query: IsQuery,\n): InsertManyFromResult<T> => {\n return insertFrom(q, query, true, true) as never;\n};\n\nexport class QueryCreateFrom {\n /**\n * Inserts a single record based on a query that selects a single record.\n *\n * Performs a single SQL query based on `INSERT ... SELECT ... FROM`.\n *\n * See {@link createManyFrom} to insert multiple records based on a single record query,\n * and {@link createForEachFrom} to insert a record per every one found by the query.\n *\n * The first argument is a query of a **single** record, it should have `find`, `take`, or similar.\n *\n * The second optional argument is a data which will be merged with columns returned by the query.\n *\n * The data for the second argument is the same as in {@link create}.\n *\n * Columns with runtime defaults (defined with a callback) are supported here.\n * The value for such a column will be injected unless selected from a related table or provided in a data object.\n *\n * ```ts\n * const oneRecord = await db.table.createOneFrom(\n * db.relatedTable\n * // use select to map columns from one table to another\n * .select({\n * // relatedTable's id will be inserted as \"relatedId\"\n * relatedId: 'id',\n * })\n * .findBy({ key: 'value' }),\n * // optional argument:\n * {\n * key: 'value',\n * // supports sql, nested select, create, update, delete queries\n * fromSql: () => sql`custom sql`,\n * fromQuery: () => db.otherTable.find(id).update(data).get('column'),\n * fromRelated: (q) => q.relatedTable.create(data).get('column'),\n * },\n * );\n * ```\n *\n * The query above will produce such a SQL (omitting `from*` values):\n *\n * ```sql\n * INSERT INTO \"table\"(\"relatedId\", \"key\")\n * SELECT \"relatedTable\".\"id\" AS \"relatedId\", 'value'\n * FROM \"relatedTable\"\n * WHERE \"relatedTable\".\"key\" = 'value'\n * LIMIT 1\n * RETURNING *\n * ```\n *\n * @param query - query to create new records from\n * @param data - additionally you can set some columns\n */\n createOneFrom<T extends CreateSelf, Q extends QueryReturningOne>(\n this: T,\n query: Q,\n data?: CreateDataOmit<\n T,\n Q['result'] extends never ? never : keyof Q['result']\n >,\n ): CreateRawOrFromResult<T> {\n return _queryCreateOneFrom(_clone(this) as never, query, data as never);\n }\n\n /**\n * Works exactly as {@link createOneFrom}, except that it returns inserted row count by default.\n *\n * @param query - query to create new records from\n * @param data - additionally you can set some columns\n */\n insertOneFrom<T extends CreateSelf, Q extends QueryReturningOne>(\n this: T,\n query: Q,\n data?: CreateDataOmit<\n T,\n Q['result'] extends never ? never : keyof Q['result']\n >,\n ): InsertRawOrFromResult<T> {\n return _queryInsertOneFrom(_clone(this) as never, query, data as never);\n }\n\n /**\n * Inserts multiple records based on a query that selects a single record.\n *\n * Performs a single SQL query based on `INSERT ... SELECT ... FROM`.\n *\n * See {@link createOneFrom} to insert a single record based on a single record query,\n * and {@link createForEachFrom} to insert a record per every one found by the query.\n *\n * The first argument is a query of a **single** record, it should have `find`, `take`, or similar.\n *\n * The second argument is array of objects to be merged with columns returned by the query.\n *\n * The data for the second argument is the same as in {@link createMany}.\n *\n * Columns with runtime defaults (defined with a callback) are supported here.\n * The value for such a column will be injected unless selected from a related table or provided in a data object.\n *\n * ```ts\n * const twoRecords = await db.table.createManyFrom(\n * db.relatedTable\n * // use select to map columns from one table to another\n * .select({\n * // relatedTable's id will be inserted as \"relatedId\"\n * relatedId: 'id',\n * })\n * .findBy({ key: 'value' }),\n * [\n * {\n * key: 'value 1',\n * // supports sql, nested select, create, update, delete queries\n * fromSql: () => sql`custom sql`,\n * fromQuery: () => db.otherTable.find(id).update(data).get('column'),\n * fromRelated: (q) => q.relatedTable.create(data).get('column'),\n * },\n * {\n * key: 'value 2',\n * },\n * ],\n * );\n * ```\n *\n * The query above will produce such a SQL (omitting `from*` values):\n *\n * ```sql\n * WITH \"relatedTable\" AS (\n * SELECT \"relatedTable\".\"id\" AS \"relatedId\", 'value'\n * FROM \"relatedTable\"\n * WHERE \"relatedTable\".\"key\" = 'value'\n * LIMIT 1\n * )\n * INSERT INTO \"table\"(\"relatedId\", \"key\")\n * SELECT \"relatedTable\".*, v.\"key\"::text\n * FROM \"relatedTable\", (VALUES ('value1'), ('value2')) v(\"key\")\n * RETURNING *\n * ```\n *\n * @param query - query to create new records from\n * @param data - array of records to create\n */\n createManyFrom<T extends CreateSelf, Q extends QueryReturningOne>(\n this: T,\n query: Q,\n data: CreateDataOmit<\n T,\n Q['result'] extends never ? never : keyof Q['result']\n >[],\n ): CreateManyFromResult<T> {\n return _queryCreateManyFrom(_clone(this) as never, query, data as never);\n }\n\n /**\n * Works exactly as {@link createManyFrom}, except that it returns inserted row count by default.\n *\n * @param query - query to create new records from\n * @param data - array of records to create\n */\n insertManyFrom<T extends CreateSelf, Q extends QueryReturningOne>(\n this: T,\n query: Q,\n data: CreateDataOmit<\n T,\n Q['result'] extends never ? never : keyof Q['result']\n >[],\n ): InsertManyFromResult<T> {\n return _queryInsertManyFrom(_clone(this) as never, query, data as never);\n }\n\n /**\n * Inserts a single record per every record found in a given query.\n *\n * Performs a single SQL query based on `INSERT ... SELECT ... FROM`.\n *\n * Unlike {@link createOneFrom}, it doesn't accept second argument with data.\n *\n * Runtime defaults cannot work with it.\n *\n * ```ts\n * const manyRecords = await db.table.createForEachFrom(\n * db.relatedTable.select({ relatedId: 'id' }).where({ key: 'value' }),\n * );\n * ```\n *\n * @param query - query to create new records from\n */\n createForEachFrom<T extends CreateSelf>(\n this: T,\n query: IsQuery,\n ): CreateManyFromResult<T> {\n return _queryCreateForEachFrom(_clone(this) as never, query);\n }\n\n /**\n * Works exactly as {@link createForEachFrom}, except that it returns inserted row count by default.\n *\n * @param query - query to create new records from\n */\n insertForEachFrom<T extends CreateSelf>(\n this: T,\n query: IsQuery,\n ): InsertManyFromResult<T> {\n return _queryInsertForEachFrom(_clone(this) as never, query);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"internal.js","names":["toArray","noop","emptyObject","emptyArray","singleQuote","quoteObjectKey","toCamelCase","objectHasValues","toSnakeCase","getFreeAlias","setFreeAlias","Expression","isExpression","Expression","emptyObject","Expression","prepareSubQueryForSql","isExpression","RawSql","Expression","isRawSQL","rawSqlToCode","DynamicRawSQL","emptyObject","raw","setColumnData","setCurrentColumnName","consumeColumnName","Column","emptyObject","raw","addCode","isRawSQL","rawSqlToCode","singleQuote","indexInnerToCode","indexToCode","excludeInnerToCode","excludeToCode","emptyObject","toArray","toSnakeCase","CustomTypeColumn","Column","Operators","singleQuote","setColumnData","DomainColumn","EnumColumn","Column","Operators","setColumnParse","setColumnParseNull","getDateAsNumberFn","getDateAsDateFn","Column","Operators","DateColumn","TimestampColumn","TimestampTZColumn","TimeColumn","IntervalColumn","ArrayColumn","Column","Operators","JSONColumn","Column","Operators","JSONTextColumn","internalSchemaConfig","Column","Operators","DecimalColumn","SmallIntColumn","setColumnData","IntegerColumn","BigIntColumn","RealColumn","DoublePrecisionColumn","SmallSerialColumn","SerialColumn","BigSerialColumn","defaultSchemaConfig","setColumnParse","setColumnParseNull","setColumnData","getDateAsNumberFn","getDateAsDateFn","EnumColumn","ArrayColumn","noop","JSONColumn","JSONTextColumn","SmallIntColumn","IntegerColumn","RealColumn","SmallSerialColumn","SerialColumn","BigIntColumn","DecimalColumn","DoublePrecisionColumn","BigSerialColumn","MoneyColumn","VarCharColumn","TextColumn","StringColumn","CitextColumn","DateColumn","TimestampColumn","TimestampTZColumn","internalSchemaConfig","BooleanColumn","Column","internalSchemaConfig","Operators","moveMutativeQueryToCte","prepareSubQueryForSql","BooleanColumn","Expression","isExpression","emptyArray","Operators","Column","Operators","VarCharColumn","StringColumn","TextColumn","internalSchemaConfig","ByteaColumn","PointColumn","LineColumn","LsegColumn","BoxColumn","PathColumn","PolygonColumn","CircleColumn","MoneyColumn","CidrColumn","InetColumn","MacAddrColumn","MacAddr8Column","BitColumn","BitVaryingColumn","TsVectorColumn","toSnakeCase","quoteObjectKey","setColumnData","TsQueryColumn","RawSql","UUIDColumn","XMLColumn","CitextColumn","RawSql","raw","PostgisGeographyPointColumn","Column","Operators","makeColumnTypes","ByteaColumn","TimeColumn","IntervalColumn","BooleanColumn","PointColumn","LineColumn","LsegColumn","BoxColumn","PathColumn","PolygonColumn","CircleColumn","CidrColumn","InetColumn","MacAddrColumn","MacAddr8Column","BitColumn","BitVaryingColumn","TsVectorColumn","TsQueryColumn","UUIDColumn","XMLColumn","CustomTypeColumn","DomainColumn","PostgisGeographyPointColumn","VirtualColumn","Column","Operators","UnknownColumn","VirtualColumn","internalSchemaConfig","emptyObject","UnknownColumn","pushQueryValueImmutable","getClonedQueryData","_clone","getQueryAs","getFreeAlias","#query","#columnsCache","getQuerySchema","getQuerySchema","getQueryAs","quoteTableWithSchema","RawSql","isExpression","Expression","getDriverErrorCode","getPrimaryKeys","getFreeAlias","_clone","emptyArray","getDriverErrorCode","prepareSubQueryForSql","isExpression","prepareSubQueryForSql","getShapeFromSelect","getQueryAs","cloneQueryBaseUnscoped","getClonedQueryData","prepareSubQueryForSql","isExpression","_queryWhere","_queryWhere","getQueryAs","_clone","getClonedQueryData","prepareSubQueryForSql","getQueryAs","getSqlText","setColumnData","getShapeFromSelect","isExpression","RawSql","cloneQueryBaseUnscoped","UnknownColumn","prepareSubQueryForSql","getShapeFromSelect","setColumnData","JSONTextColumn","internalSchemaConfig","getQueryAs","isExpression","Operators","Expression","UnknownColumn","getQueryAs","cloneQueryBaseUnscoped","_clone","addTopCte","getShapeFromSelect","getQueryAs","getSqlText","prepareSubQueryForSql","_clone","getQueryAs","isExpression","getFreeAlias","RawSql","getQueryAs","isExpression","toArray","quoteTableWithSchema","RawSql","toArray","emptyArray","isExpression","_clone","getPrimaryKeys","quoteTableWithSchema","emptyObject","isExpression","quoteTableWithSchema","isRawSQL","quoteTableWithSchema","isExpression","getQueryAs","getQuerySchema","isExpression","emptyObject","isExpression","isExpression","isExpression","_clone","RawSql","isExpression","emptyArray","setFreeAlias","getSqlText","emptyObject","addTopCteSql","addTopCte","addTopCteSql","addTopCte","quoteTableWithSchema","getQuerySchema","getSqlText","IntegerColumn","internalSchemaConfig","RealColumn","BooleanColumn","TextColumn","JSONTextColumn","XMLColumn","prepareSubQueryForSql","isExpression","_queryInsert"],"sources":["../src/utils.ts","../src/query/expressions/expression.ts","../src/query/expressions/sql-join-expression.ts","../src/query/expressions/sql-ref-expression.ts","../src/query/expressions/raw-sql.ts","../src/columns/column.ts","../src/query/query.ts","../src/columns/column-data-types.ts","../src/columns/code.ts","../src/query/query-columns/query-column-parsers.ts","../src/columns/column-types/custom-type.ts","../src/columns/column-types/enum.ts","../src/columns/column.utils.ts","../src/columns/column-types/date-time.ts","../src/columns/column-types/array.ts","../src/columns/column-types/json.ts","../src/columns/column-types/number.ts","../src/columns/default-schema-config.ts","../src/columns/column-types/boolean.ts","../src/columns/operators.ts","../src/columns/column-types/string.ts","../src/columns/timestamps.ts","../src/columns/column-types/postgis.ts","../src/columns/column-types.ts","../src/columns/column-types/virtual.ts","../src/columns/column-types/unknown.ts","../src/columns/any-shape.ts","../src/query/query-data.ts","../src/query/basic-features/clone/clone.ts","../src/query/basic-features/as/as.ts","../src/query/query-columns/query-columns.ts","../src/query/errors.ts","../src/adapters/features/sql-session-context.ts","../src/query/basic-features/storage/storage.ts","../src/query/basic-features/join/join.sql.ts","../src/query/expressions/select-item-expression.ts","../src/query/query.utils.ts","../src/query/basic-features/transaction/transaction.ts","../src/query/extra-features/hooks/hooks.ts","../src/query/extra-features/data-transform/transform.ts","../src/query/extra-features/computed/computed.ts","../src/adapters/adapter.ts","../src/query/query-columns/primary-keys.ts","../src/query/extra-features/scope/scope.ts","../src/query/internal-features/mutative-queries-select-relation/mutative-queries-select-relations.result-handler.ts","../src/query/then/then.ts","../src/query/extra-features/none/none.ts","../src/query/internal-features/sub-query/sub-query-for-sql.ts","../src/query/basic-features/from/from.ts","../src/query/basic-features/wrap/wrap.ts","../src/query/relations.ts","../src/query/basic-features/where/where.ts","../src/query/extra-features/chain/chain.ts","../src/query/internal-features/sub-query/sub-query.ts","../src/query/basic-features/join/join.ts","../src/query/basic-features/select/hook-select.ts","../src/query/internal-features/mutative-queries-select-relation/mutative-queries-select-relations.qb.ts","../src/query/basic-features/select/select.utils.ts","../src/query/basic-features/get/get.utils.ts","../src/query/basic-features/json/json.utils.ts","../src/query/basic-features/cte/move-mutative-query-to-cte-base.sql.ts","../src/query/extra-features/hooks/hooks.sql.ts","../src/query/internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql.ts","../src/query/basic-features/select/select.sql.ts","../src/query/basic-features/where/where.sql.ts","../src/query/sql/sql-constants.ts","../src/query/basic-features/mutate/insert.sql.ts","../src/query/basic-features/limit-offset/limit-offset.sql.ts","../src/query/basic-features/mutate/update.sql.ts","../src/query/basic-features/mutate/delete.sql.ts","../src/query/basic-features/distinct/distinct.sql.ts","../src/query/extra-features/search/search.sql.ts","../src/query/sql/check-if-a-simple-query.ts","../src/query/basic-features/from/fromAndAs.sql.ts","../src/query/basic-features/having/having.sql.ts","../src/query/basic-features/order/order.sql.ts","../src/query/basic-features/window/window.sql.ts","../src/query/basic-features/union/union.sql.ts","../src/query/basic-features/for/for.sql.ts","../src/query/sql/to-sql.ts","../src/query/basic-features/cte/cte.sql.ts","../src/query/sql/wrap-main-query-in-cte.ts","../src/query/sql/sql.ts","../src/query/sql/column-to-sql.ts","../src/query/basic-features/aggregate/aggregate.ts","../src/query/basic-features/mutate/create.ts","../src/query/basic-features/mutate/create-from.ts"],"sourcesContent":["import url from 'node:url';\nimport path from 'node:path';\nimport { SingleSqlItem } from './query';\n\nexport type UnionToIntersection<U> =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (U extends any ? (x: U) => void : never) extends (x: infer I) => void\n ? I\n : never;\n\n// It may be a value or an array of such values.\nexport type MaybeArray<T> = T | T[];\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport interface FnUnknownToUnknown {\n (a: unknown): unknown;\n}\n\n// Utility type to store info to know which keys are available.\n// Use it for cases where you'd want to pick a string union,\n// this record type solves the same use case, but is better at handling the empty case.\nexport interface RecordKeyTrue {\n [K: string]: true;\n}\n\nexport interface RecordString {\n [K: string]: string;\n}\n\nexport interface RecordStringOrNumber {\n [K: string]: string | number;\n}\n\nexport interface RecordOptionalString {\n [K: string]: string | undefined;\n}\n\nexport interface RecordUnknown {\n [K: string]: unknown;\n}\n\nexport interface RecordBoolean {\n [K: string]: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ShallowSimplify<T> = T extends any ? { [K in keyof T]: T[K] } : T;\n\n/**\n * Merge methods from multiple class into another class.\n * @param derivedCtor - target class to merge methods into\n * @param constructors - classes to merge methods from\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function applyMixins(targetClass: any, mixinClasses: any[]) {\n const target = targetClass.prototype;\n for (const mixinClass of mixinClasses) {\n for (const key of Object.getOwnPropertyNames(mixinClass.prototype)) {\n if (key !== 'constructor') {\n target[key] = mixinClass.prototype[key];\n }\n }\n }\n}\n\n/**\n * Join array of strings with '', ignoring empty strings, false, undefined.\n * @param strings - array of strings, or false, or undefined\n */\nexport const joinTruthy = (...strings: (string | false | undefined)[]) => {\n return strings.filter((string) => string).join('');\n};\n\n/**\n * When array is passed, it is returned as is, otherwise, returns a new array with the provided value.\n * @param item - array or a value to turn into array\n */\nexport const toArray = <T>(item: T) =>\n (Array.isArray(item) ? item : [item]) as unknown as T extends unknown[]\n ? T\n : [T];\n\n// Shared doing nothing function\nexport const noop = () => {};\n\nexport const returnArg = <T>(a: T) => a;\n\nexport type EmptyObject = {};\n// Shared empty object to avoid unnecessary allocations\nexport const emptyObject = {};\n\n// Type of empty array\nexport type EmptyTuple = [];\n// Shared empty array to avoid unnecessary allocations\nexport const emptyArray = [];\n\n/**\n * Push a value into an array in the object if it's defined, or set a new array with a single value into the object.\n * Does not mutate the array.\n *\n * @param obj - object that can contain the array by the key\n * @param key - key to access an array in the object\n * @param value - value to push into the array\n */\nexport const pushOrNewArrayToObjectImmutable = (\n obj: object,\n key: string | number,\n value: unknown,\n) => {\n (obj as RecordUnknown)[key] = (obj as RecordUnknown)[key]\n ? [...((obj as RecordUnknown)[key] as unknown[]), value]\n : [value];\n};\n\n/**\n * Set value into the object in data, create the object if it doesn't yet exist.\n * Does not mutate the object.\n *\n * @param q - object\n * @param object - query data key to get the object\n * @param key - object key to set the value into\n * @param value - value to set by the key\n */\nexport const setObjectValueImmutable = <T>(\n q: T,\n object: string,\n key: PropertyKey,\n value: unknown,\n): T => {\n (q as RecordUnknown)[object] = {\n ...((q as RecordUnknown)[object] as RecordUnknown),\n [key]: value,\n };\n return q;\n};\n\nexport const spreadObjectValues = (\n q: object,\n object: string,\n value: RecordUnknown,\n) => {\n (q as RecordUnknown)[object] = {\n ...((q as RecordUnknown)[object] as RecordUnknown),\n ...value,\n };\n};\n\n/**\n * Push value into an array if it's defined, or return a new array with a single value.\n * @param arr - array to push into, or `undefined`\n * @param value - value to push into the array\n */\nexport const pushOrNewArray = <Arr extends unknown[]>(\n arr: Arr | undefined,\n value: Arr[number],\n): Arr => {\n if (arr) {\n arr.push(value);\n return arr;\n } else {\n return [value] as Arr;\n }\n};\n\n/**\n * For code generation: quote a string with a single quote, escape characters.\n * @param s - string to quote\n */\nexport const singleQuote = (s: string) => {\n return `'${s.replaceAll('\\\\', '\\\\\\\\').replaceAll(\"'\", \"\\\\'\")}'`;\n};\n\n/**\n * For code generation: quote string with a backtick, escape characters.\n * @param s - string to quote\n */\nexport const backtickQuote = (s: string) => {\n return `\\`${s.replaceAll('\\\\', '\\\\\\\\').replaceAll('`', '\\\\`')}\\``;\n};\n\n/**\n * For code generation: stringify array of strings using a single quote.\n * @param arr\n */\nexport const singleQuoteArray = (arr: string[]) => {\n return `[${arr.map(singleQuote).join(', ')}]`;\n};\n\n/**\n * For code generation: some strings must be quoted when used as an object key.\n * This function quotes the strings when needed.\n * @param key - object key to quote\n * @param toCamel - change to camel case\n */\nexport const quoteObjectKey = (key: string, toCamel: boolean | undefined) => {\n if (toCamel) key = toCamelCase(key);\n return /^[a-zA-Z_$][\\w$]*$/.test(key) ? key : singleQuote(key);\n};\n\n/**\n * Check if the object has no values that are not `undefined`.\n * @param obj\n */\nexport const isObjectEmpty = (obj: object) => !objectHasValues(obj);\n\n/**\n * Check if the object has at least one value that is not `undefined`.\n * Nulls counts.\n * @param obj - any object\n */\nexport const objectHasValues = (obj?: object) => {\n if (!obj) return false;\n for (const key in obj) {\n if (obj[key as keyof typeof obj] !== undefined) return true;\n }\n return false;\n};\n\n/**\n * If we simply log file path as it is, it may be not clickable in the terminal.\n * On Windows, it is clickable as it is, so it is returned as is.\n * On Linux (at least in my JetBrains editor terminal) it's transformed to URL format to be clickable.\n * @param path - file path\n */\nexport const pathToLog = (path: string) => {\n return process.platform === 'win32'\n ? path\n : url.pathToFileURL(path).toString();\n};\n\n/**\n * Translate a string to camelCase\n * @param str - string to translate\n */\nexport const toCamelCase = (str: string) => {\n return str\n .replace(/^_+/g, '')\n .replace(/_+./g, (a) => a[a.length - 1].toUpperCase())\n .replace(/_+$/g, '');\n};\n\n/**\n * Translate a string to a PascalCase\n * @param str - string to translate\n */\nexport const toPascalCase = (str: string) => {\n const camel = toCamelCase(str);\n return camel[0].toUpperCase() + camel.slice(1);\n};\n\n/**\n * Translate a string to a snake_case.\n * @param str - string to translate\n */\nexport const toSnakeCase = (str: string) => {\n return str.replace(/[A-Z]/g, (a, i) => `${i ? '_' : ''}${a.toLowerCase()}`);\n};\n\n/**\n * Compare two values deeply.\n * undefined and empty object are considered to be equal.\n * @param a - any value\n * @param b - any value\n */\nexport const deepCompare = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n\n if (typeof a !== typeof b) {\n if (a === undefined && typeof b === 'object') {\n a = emptyObject;\n } else if (typeof a === 'object' && b === undefined) {\n b = emptyObject;\n } else {\n return false;\n }\n }\n\n if (typeof a === 'object') {\n if (a === null) {\n return b === null;\n }\n\n if (Array.isArray(a)) {\n if (!Array.isArray(b) || a.length !== b.length) {\n return false;\n }\n\n return a.every((item, i) => deepCompare(item, (b as unknown[])[i]));\n }\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n for (const key in a) {\n if (!deepCompare((a as RecordUnknown)[key], (b as RecordUnknown)[key])) {\n return false;\n }\n }\n\n for (const key in b as RecordUnknown) {\n if (!(key in a) && (b as RecordUnknown)[key] !== undefined) {\n return false;\n }\n }\n\n return true;\n }\n\n return a === b;\n};\n\n/**\n * Returns a relative path to use as an `import` source to import one file from another.\n * @param from - TS file where we want to place the `import`\n * @param to - TS file that we're importing\n */\nexport const getImportPath = (from: string, to: string) => {\n const rel = path\n .relative(path.dirname(from), to)\n .split(path.sep)\n .join(path.posix.sep);\n\n const importPath =\n rel.startsWith('./') || rel.startsWith('../') ? rel : `./${rel}`;\n\n return importPath.replace(/\\.[tj]s$/, '');\n};\n\n/**\n * Get stack trace to collect info about who called the function\n */\nexport const getStackTrace = (): NodeJS.CallSite[] | undefined => {\n let stack: NodeJS.CallSite[] | undefined;\n const original = Error.prepareStackTrace;\n Error.prepareStackTrace = (_, s) => (stack = s as NodeJS.CallSite[]);\n new Error().stack;\n Error.prepareStackTrace = original;\n return stack;\n};\n\n/**\n * Get a file path of the function which called the function which called this `getCallerFilePath`.\n * Determines file path by error stack trace, skips any paths that are located in `node_modules`.\n * @param stack - optionally provide an existing stack trace\n */\nexport const getCallerFilePath = (\n stack = getStackTrace(),\n): string | undefined => {\n if (stack) {\n const coreLibFile = stack[0]?.getFileName();\n let i = 1;\n if (stack[1]?.getFileName() === coreLibFile) {\n i++;\n }\n // other orchid library that called the function in this file\n const libFile = stack[i]?.getFileName();\n const libDir = libFile && path.dirname(libFile);\n for (; i < stack.length; i++) {\n const item = stack[i];\n let file = item.getFileName();\n if (\n !file ||\n // skip files in the caller orchid library\n path.dirname(file) === libDir ||\n // skip any files in the node_modules\n /\\bnode_modules\\b/.test(file)\n ) {\n continue;\n }\n\n // on Windows with ESM file is file:///C:/path/to/file.ts\n // it is not a valid URL\n if (/file:\\/\\/\\/\\w+:\\//.test(file)) {\n file = decodeURI(file.slice(8));\n } else {\n try {\n file = new URL(file).pathname;\n } catch {}\n }\n\n return file;\n }\n }\n\n return;\n};\n\n/**\n * Call function passing `this` as an argument,\n * micro-optimization for `map` and `forEach` to not define temporary inline function\n * ```ts\n * arrayOfFns.map(callWithThis, argument)\n * ```\n * @param cb\n */\nexport const callWithThis = function <T, R>(this: T, cb: (arg: T) => R): R {\n return cb(this);\n};\n\nexport const pick = <T, Keys extends keyof T>(\n obj: T,\n keys: Keys[],\n): Pick<T, Keys> => {\n const res = {} as T;\n for (const key of keys) {\n res[key] = obj[key];\n }\n return res;\n};\n\nexport const omit = <T, Keys extends keyof T>(\n obj: T,\n keys: Keys[],\n): Omit<T, Keys> => {\n const res = { ...obj };\n for (const key of keys) {\n delete res[key];\n }\n return res;\n};\n\nexport const addValue = (values: unknown[], value: unknown) => {\n values.push(value);\n return `$${values.length}`;\n};\n\nexport const getFreeAlias = (\n obj: RecordUnknown | undefined,\n as: string,\n): string => {\n if (obj?.[as]) {\n let suffix = 2;\n let name;\n while (obj[(name = as + suffix)]) {\n suffix++;\n }\n as = name;\n }\n return as;\n};\n\nexport const setFreeAlias = (\n obj: RecordUnknown,\n as: string,\n value: unknown,\n): string => {\n const key = getFreeAlias(obj, as);\n obj[key] = value;\n return key;\n};\n\nexport const getFreeSetAlias = (\n set: Set<string>,\n as: string,\n start = 2,\n): string => {\n if (set.has(as)) {\n let suffix = start;\n let name;\n while (set.has((name = as + suffix))) {\n suffix++;\n }\n as = name;\n }\n return as;\n};\n\nexport const exhaustive = (_: never) => {\n throw new Error('Condition was not exhaustive');\n};\n\nexport const pluralize = (w: string, count: number, append = 's') => {\n return count === 1 ? w : w + append;\n};\n\nexport const isIterable = (x: unknown): x is Iterable<unknown> =>\n !!(\n x &&\n typeof x === 'object' &&\n typeof x[Symbol.iterator as never] === 'function'\n );\n\nexport const colors = {\n yellow: (s: string) => `\\x1b[33m${s}\\x1b[0m`,\n green: (s: string) => `\\x1b[32m${s}\\x1b[0m`,\n red: (s: string) => `\\x1b[31m${s}\\x1b[0m`,\n blue: (s: string) => `\\x1b[34m${s}\\x1b[0m`,\n bright: (s: string) => `\\x1b[1m${s}\\x1b[0m`,\n blueBold: (s: string) => `\\x1b[1m\\x1b[34m${s}\\x1b[0m`,\n yellowBold: (s: string) => `\\x1b[1m\\x1b[33m${s}\\x1b[0m`,\n greenBold: (s: string) => `\\x1b[1m\\x1b[32m${s}\\x1b[0m`,\n pale: (s: string) => `\\x1b[2m${s}\\x1b[0m`,\n};\n\nexport const commitSql: SingleSqlItem = {\n text: 'COMMIT',\n};\n\nexport const rollbackSql: SingleSqlItem = {\n text: 'ROLLBACK',\n};\n\nexport const quoteIdentifier = (role: string): string => {\n return `\"${role.replace(/\"/g, '\"\"')}\"`;\n};\n","import {\n EmptyObject,\n pushOrNewArrayToObjectImmutable,\n RecordUnknown,\n} from '../../utils';\nimport { Column } from '../../columns/column';\nimport { OperatorToSQL } from '../../columns/operators';\nimport { HasBeforeAndBeforeSet } from '../internal-features/sub-query/sub-query-for-sql';\nimport { PickQuerySelectable } from '../pick-query-types';\nimport { QueryBeforeHook } from '../query-data';\nimport { ToSqlValues } from '../sql/to-sql';\nimport type { QueryDataTransform } from '../extra-features/data-transform/transform';\n\nexport type SelectableOrExpression<\n T extends PickQuerySelectable = PickQuerySelectable,\n C extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n> = '*' | keyof T['__selectable'] | Expression<C>;\n\nexport type SelectableOrExpressions<\n T extends PickQuerySelectable = PickQuerySelectable,\n C extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n> = ('*' | keyof T['__selectable'] | Expression<C>)[];\n\nexport type ExpressionOutput<\n T extends PickQuerySelectable,\n Expr extends SelectableOrExpression<T>,\n> = Expr extends keyof T['__selectable']\n ? T['__selectable'][Expr]['column']\n : Expr extends Expression\n ? Expr['result']['value']\n : never;\n\n// The chain array is used to store a sequence of operators and their arguments, one be one.\n// For example, expression of numeric type may be chained to `lt`, `gt` and similar functions.\nexport type ExpressionChain = (OperatorToSQL | unknown)[];\n\nexport interface ExpressionData extends HasBeforeAndBeforeSet {\n chain?: ExpressionChain;\n expr?: Expression;\n before?: QueryBeforeHook[];\n dynamicBefore?: boolean;\n getColumn?: Column;\n transform?: QueryDataTransform[];\n}\n\n// Base class for the raw SQL and other classes that can produce SQL\nexport abstract class Expression<\n T extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n> {\n // `result` contains an instance of a column type.\n // Starts with underscore to allow having `type` method\n abstract result: { value: T };\n\n abstract q: ExpressionData;\n\n // used in update to prevent non-select sub-queries\n declare meta: { kind: 'select' };\n\n // Produce SQL string by calling `makeSQL` and applying operators from the `q.chain`, push query variables into given `values` array.\n toSQL(ctx: ToSqlValues, quotedAs?: string): string {\n let sql = this.makeSQL(ctx, quotedAs);\n if (this.q.chain) {\n const { chain } = this.q;\n for (let i = 0, len = chain.length; i < len; i += 2) {\n sql = (chain[i] as OperatorToSQL)(\n sql,\n chain[i + 1] as never,\n ctx,\n quotedAs,\n );\n }\n }\n\n return sql;\n }\n\n /**\n * Transform the expression value after loading it.\n *\n * It is meant to transform expressions selected by a query.\n *\n * @param fn - function to transform expression value with\n */\n transform<\n Self extends {\n result: { value: Column.Pick.QueryColumn };\n q: ExpressionData;\n },\n Result,\n >(\n this: Self,\n fn: (\n input: Self['result']['value']['__type'],\n queryData: ExpressionData,\n ) => Result,\n ): Omit<Self, 'result'> & {\n result: { value: Column.Pick.QueryColumnOfType<Result> };\n } {\n pushOrNewArrayToObjectImmutable(this.q, 'transform', fn);\n return this as never;\n }\n\n // `makeSQL` should be implemented on subclasses of Expression to return SQL of the expression.\n // Result of `makeSQL` will be chained with operators by `toSQL`.\n abstract makeSQL(ctx: ToSqlValues, quotedAs?: string): string;\n}\n\n// Check if the unknown thing is an Expression\nexport const isExpression = (arg: unknown): arg is Expression =>\n arg instanceof Expression;\n\n// Object representing SQL query.\n// Constructed by `toSQL`, passed to adapter.query and adapter.array\nexport type TemplateLiteralArgs = [\n strings: TemplateStringsArray,\n ...values: unknown[],\n];\n\n// Check if arguments are a template literal.\nexport const isTemplateLiteralArgs = (\n args: unknown[],\n): args is TemplateLiteralArgs =>\n Array.isArray(args[0]) && 'raw' in args[0] && Array.isArray(args[0].raw);\n\n// Argument type for `sql` function.\n// It can take a template literal, an object `{ raw: string, values?: Record<string, unknown> }`,\n// or a function to build SQL lazily.\nexport type SQLArgs = StaticSQLArgs | [DynamicSQLArg<Column.Pick.QueryColumn>];\n\n// Function for sql method to build SQL lazily (dynamically).\n// May be used for computed column to build a different SQL in different executions.\nexport interface DynamicSQLArg<T extends Column.Pick.QueryColumn> {\n (sql: (...args: StaticSQLArgs) => Expression<T>): Expression<T>;\n}\n\n// SQL arguments for a non-lazy SQL expression.\nexport type StaticSQLArgs =\n | TemplateLiteralArgs\n | [{ raw: string; values?: RawSQLValues }];\n\n// Record of values to pass and store in a RawSql instance.\nexport type RawSQLValues = RecordUnknown;\n\n// `type` method to be used in both static and dynamic variants of SQL expressions.\nexport abstract class ExpressionTypeMethod {\n // Define the resulting column type for the raw SQL.\n type<\n T extends {\n q: { expr?: Expression };\n columnTypes: unknown;\n },\n C extends Column.Pick.QueryColumn,\n >(\n this: T,\n fn: (types: T['columnTypes']) => C,\n ): // Omit is optimal\n Omit<T, 'result'> & { result: { value: C } } {\n const column = fn(this.columnTypes) as unknown as Column;\n (this.q.expr as Expression).result.value = column;\n Object.assign(\n 'baseQuery' in this ? (this.baseQuery as EmptyObject) : this,\n column.operators,\n );\n return this as never;\n }\n}\n\nexport const templateLiteralSQLToCode = (sql: TemplateLiteralArgs): string => {\n let code = '`';\n\n const parts = sql[0];\n let i = 0;\n for (let last = parts.length - 1; i < last; i++) {\n code += parts[i] + `\\${${sql[i + 1]}}`;\n }\n code += parts[i];\n\n return code + '`';\n};\n","import { Column } from '../../columns/column';\nimport { emptyObject } from '../../utils';\nimport { ToSqlValues } from '../sql/to-sql';\nimport { Expression, ExpressionData, ExpressionTypeMethod } from './expression';\nimport { type RawSqlBase } from './raw-sql';\n\nexport interface SqlJoinExpression<T extends Column.Pick.QueryColumn>\n extends Expression<T>, ExpressionTypeMethod {}\n\nexport class SqlJoinExpression<\n T extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n> extends Expression<T> {\n result = { value: emptyObject as T };\n q: ExpressionData = { expr: this };\n\n constructor(\n public items: readonly unknown[],\n public separator?: RawSqlBase,\n ) {\n super();\n }\n\n makeSQL(ctx: ToSqlValues, quotedAs?: string): string {\n let sql = '';\n\n for (let i = 0; i < this.items.length; i++) {\n if (i > 0) {\n sql += this.separator ? this.separator.toSQL(ctx, quotedAs) : ', ';\n }\n\n const item = this.items[i];\n if (item instanceof Expression) {\n sql += item.toSQL(ctx, quotedAs);\n } else {\n ctx.values.push(item);\n sql += `$${ctx.values.length}`;\n }\n }\n\n return sql;\n }\n}\n\nSqlJoinExpression.prototype.type = ExpressionTypeMethod.prototype.type;\n","import { Expression, ExpressionData } from './expression';\nimport { Column } from '../../columns/column';\n\n/**\n * Expression for a SQL identifier reference.\n * Used to safely quote identifiers in raw SQL queries.\n */\nexport class SqlRefExpression extends Expression {\n result = { value: {} as Column.Pick.QueryColumn };\n q: ExpressionData = { expr: this };\n\n constructor(public name: string) {\n super();\n }\n\n makeSQL() {\n // Quote a SQL identifier (table name, column name, schema name, etc.).\n // Handle dots to support qualified names like \"schema.table\" → \"schema\".\"table\".\n // Escape double quotes by doubling them.\n return `\"${this.name.replaceAll('\"', '\"\"').replaceAll('.', '\".\"')}\"`;\n }\n}\n","import {\n DynamicSQLArg,\n Expression,\n ExpressionData,\n ExpressionTypeMethod,\n isExpression,\n isTemplateLiteralArgs,\n RawSQLValues,\n SQLArgs,\n StaticSQLArgs,\n TemplateLiteralArgs,\n templateLiteralSQLToCode,\n} from './expression';\nimport { SqlJoinExpression } from './sql-join-expression';\nimport { SqlRefExpression } from './sql-ref-expression';\nimport { Column } from '../../columns/column';\nimport { ColumnSchemaConfig } from '../../columns/column-schema';\nimport { DefaultColumnTypes } from '../../columns/column-types';\nimport { ToSQLCtx, ToSqlValues } from '../sql/to-sql';\nimport { emptyObject, RecordUnknown } from '../../utils';\nimport { PrepareSubQueryForSql } from '../internal-features/sub-query/sub-query-for-sql';\nimport { SQLQueryArgs } from '../db-sql-query';\n\nlet prepareSubQueryForSql: PrepareSubQueryForSql;\nexport const setRawSqlPrepareSubQueryForSql = (fn: PrepareSubQueryForSql) => {\n prepareSubQueryForSql = fn;\n};\n\n// reuse array to track which variables were used in the SQL, to throw when there are some unused.\nconst used: string[] = [];\nconst literalValues: number[] = [];\n\nexport const templateLiteralToSQL = (\n template: TemplateLiteralArgs,\n ctx: ToSqlValues,\n quotedAs?: string,\n): string => {\n let sql = '';\n const { values } = ctx;\n const parts = template[0];\n literalValues.length = 0;\n\n let i = 0;\n for (let last = parts.length - 1; i < last; i++) {\n sql += parts[i];\n\n const value = template[i + 1];\n if (isExpression(value)) {\n sql += value.toSQL(ctx, quotedAs);\n } else {\n values.push(value);\n literalValues.push(sql.length);\n sql += `$${values.length}`;\n }\n }\n\n return sql + parts[i];\n};\n\nexport interface RawSqlBase<\n T extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n> extends Expression<T> {\n _sql: string | TemplateLiteralArgs;\n _values?: RawSQLValues;\n}\n\n// RawSql extends both Expression and ExpressionTypeMethod, so it needs a separate interface.\nexport interface RawSql<\n T extends Column.Pick.QueryColumn,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n ColumnTypes,\n>\n extends Expression<T>, RawSqlBase<T>, ExpressionTypeMethod {}\n\nexport class RawSql<\n T extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n ColumnTypes = DefaultColumnTypes<ColumnSchemaConfig>,\n> extends Expression<T> {\n // Column type instance, it is assigned directly to the prototype of RawSql class.\n declare result: { value: T };\n // Column types are stored to be passed to the `type` callback.\n declare columnTypes: ColumnTypes;\n q: ExpressionData;\n _sql: string | TemplateLiteralArgs;\n _values?: RawSQLValues;\n\n constructor(\n sql: string | TemplateLiteralArgs,\n values?: RawSQLValues,\n type?: T,\n ) {\n super();\n this.q = { expr: this };\n this._sql = sql;\n this._values = values;\n this.result = { value: type as T };\n if (type) {\n Object.assign(this, type.operators);\n }\n }\n\n // Attach query variables to the raw SQL.\n values<Self extends RawSqlBase>(this: Self, values: RawSQLValues): Self {\n this._values = values;\n return this;\n }\n\n // Produce SQL string, push query variables into given `values` array.\n makeSQL(ctx: ToSqlValues, quotedAs?: string): string {\n let sql;\n const isTemplate = typeof this._sql !== 'string';\n\n if (isTemplate) {\n sql = templateLiteralToSQL(\n this._sql as TemplateLiteralArgs,\n ctx,\n quotedAs,\n );\n } else {\n sql = this._sql as string;\n }\n\n const data = this._values;\n if (!data) {\n return sql;\n }\n\n const { values } = ctx;\n const arr = sql.split(\"'\");\n const len = arr.length;\n used.length = 0;\n for (let i = 0; i < len; i += 2) {\n arr[i] = arr[i].replace(/\\$\\$?(\\w+)/g, (match, key, i) => {\n if (isTemplate && literalValues.includes(i)) return match;\n\n const value = data[key];\n if (value === undefined) {\n throw new Error(`Query variable \\`${key}\\` is not provided`);\n }\n\n used.push(key);\n\n if (match.length - key.length === 2) {\n if (typeof value !== 'string') {\n throw new Error(\n `Expected string value for $$${key} SQL keyword, got ${typeof value}`,\n );\n }\n\n return `\"${value.replace('\"', '\"\"').replace('.', '\".\"')}\"`;\n }\n\n values.push(value);\n return `$${values.length}`;\n });\n }\n\n if (used.length > 0 && used.length < Object.keys(data).length) {\n for (const key in data) {\n if (!used.includes(key)) {\n throw new Error(`Query variable \\`${key}\\` is unused`);\n }\n }\n }\n\n return arr.join(\"'\");\n }\n}\n\n// Check if something is a raw SQL.\nexport const isRawSQL = (arg: unknown): arg is RawSqlBase =>\n arg instanceof RawSql;\n\nRawSql.prototype.type = ExpressionTypeMethod.prototype.type;\n\ninterface RawSqlToCodeCtx {\n t: string;\n sql?: string;\n isSqlUsed?: boolean;\n}\n\n// Convert raw SQL to code for a code generator.\nexport const rawSqlToCode = (\n rawSql: RawSqlBase,\n ctx: string | RawSqlToCodeCtx,\n): string => {\n const { _sql: sql, _values: values } = rawSql;\n let code: string;\n\n if (typeof ctx === 'string') {\n code = `${ctx}.sql`;\n } else {\n ctx.isSqlUsed = true;\n code = ctx.sql ?? `${ctx.t}.sql`;\n }\n\n code +=\n typeof sql === 'string'\n ? values\n ? `({ raw: '${sql.replace(/'/g, \"\\\\'\")}' })`\n : `\\`${sql.replace(/`/g, '\\\\`')}\\``\n : templateLiteralSQLToCode(sql);\n\n if (values) {\n code += `.values(${JSON.stringify(values)})`;\n }\n\n return code;\n};\n\n// `DynamicRawSQL` extends both `Expression` and `ExpressionTypeMethod`, so it needs a separate interface.\nexport interface DynamicRawSQL<T extends Column.Pick.QueryColumn>\n extends Expression<T>, ExpressionTypeMethod {}\n\n// Calls the given function to get inner SQL each time when converting to SQL.\nexport class DynamicRawSQL<\n T extends Column.Pick.QueryColumn,\n ColumnTypes = DefaultColumnTypes<ColumnSchemaConfig>,\n> extends Expression<T> {\n declare columnTypes: ColumnTypes;\n result: { value: T } = emptyObject as { value: T };\n q: ExpressionData;\n dynamicBefore = true;\n\n constructor(public fn: DynamicSQLArg<T>) {\n super();\n this.q = { expr: this };\n }\n\n // Calls the given function to get SQL from it.\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n const expr = this.fn(raw as never);\n this.q.beforeSet = this.q.before = undefined;\n const prepared = prepareSubQueryForSql(\n this,\n expr as never,\n ) as unknown as Expression;\n return prepared.toSQL(ctx, quotedAs);\n }\n}\n\nDynamicRawSQL.prototype.type = ExpressionTypeMethod.prototype.type;\n\n/**\n * @deprecated use `sql` instead\n */\nexport function raw<T = never>(\n ...args: StaticSQLArgs\n): RawSql<Column.Pick.QueryColumnOfType<T>>;\n/**\n * @deprecated use `sql` instead\n */\nexport function raw<T = never>(\n ...args: [DynamicSQLArg<Column.Pick.QueryColumnOfType<T>>]\n): DynamicRawSQL<Column.Pick.QueryColumnOfType<T>>;\nexport function raw(...args: SQLArgs) {\n return isTemplateLiteralArgs(args)\n ? new RawSql(args)\n : typeof args[0] === 'function'\n ? new DynamicRawSQL(args[0])\n : new RawSql(args[0].raw, args[0].values);\n}\n\n// Raw SQL count(*) to apply directly to `QueryData.select`.\nexport const countSelect = [new RawSql('count(*)')];\n\nexport function sqlQueryArgsToExpression(args: SQLQueryArgs): RawSqlBase {\n return Array.isArray(args[0])\n ? new RawSql(args as TemplateLiteralArgs)\n : (args[0] as never);\n}\n\nexport interface SqlFn {\n <\n T,\n Args extends\n | TemplateLiteralArgs\n | [sql: string]\n | [values: RecordUnknown, sql?: string],\n >(\n this: T,\n ...args: Args\n ): Args extends [RecordUnknown]\n ? (...sql: TemplateLiteralArgs) => RawSql<Column.Pick.QueryColumn, T>\n : RawSql<Column.Pick.QueryColumn, T>;\n\n /**\n * `sql.join` builds a SQL list from values and expressions.\n * Plain values are bound as query parameters, while SQL expressions render as SQL.\n *\n * Use it for SQL constructs such as `ARRAY[...]`, `IN (...)`, function arguments,\n * or tuple lists. The default separator is `, `. Provide a SQL expression as the\n * custom separator when a different separator is needed.\n *\n * ```ts\n * await db.user.whereSql`\"id\" IN (${sql.join([1, 2, 3])})`;\n * ```\n *\n * ```ts\n * await db.user.whereSql`\n * (${sql.join([sql.ref('name'), sql.ref('age')])}) IN (${sql.join(\n * users.map((user) => sql`(${user.name}, ${user.age})`),\n * )})\n * `;\n * ```\n *\n * ```ts\n * await db.user.select({\n * displayName: (q) =>\n * sql<string>`concat(${sql.join(\n * [q.column('firstName'), q.column('lastName')],\n * sql` || ' ' || `,\n * )})`,\n * });\n * ```\n */\n join<T = unknown>(\n items: readonly unknown[],\n separator?: RawSqlBase,\n ): SqlJoinExpression<Column.Pick.QueryColumnOfType<T>>;\n\n /**\n * `sql.ref` quotes a SQL identifier such as a table name, column name, or schema name.\n * Use it when you need to dynamically reference an identifier in raw SQL.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * const schema = 'my_schema';\n *\n * // Produces: SET LOCAL search_path TO \"my_schema\"\n * await db.$query`SET LOCAL search_path TO ${sql.ref(schema)}`\n * ```\n *\n * It handles dots to support qualified names:\n *\n * ```ts\n * // \"my_schema\".\"my_table\"\n * sql.ref('my_schema.my_table');\n * ```\n */\n ref(name: string): SqlRefExpression;\n unsafe(sql: string | number | boolean): UnsafeSqlExpression;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const sqlFn: SqlFn = ((...args: any[]): any => {\n const arg = args[0];\n if (Array.isArray(arg)) {\n return new RawSql(args as TemplateLiteralArgs);\n }\n\n if (typeof args[0] === 'string') {\n return new RawSql(args[0]);\n }\n\n if (args[1] !== undefined) {\n return new RawSql(args[1], arg);\n }\n\n return (...args: TemplateLiteralArgs) =>\n new RawSql(args, arg as RecordUnknown);\n}) as SqlFn;\n\nsqlFn.ref = (name) => new SqlRefExpression(name);\nsqlFn.join = (items, separator) => new SqlJoinExpression(items, separator);\nsqlFn.unsafe = (sql) => new UnsafeSqlExpression(sql);\n\nexport class UnsafeSqlExpression extends Expression {\n declare result: { value: Column.Pick.QueryColumn };\n q: ExpressionData;\n\n constructor(public sql: string | number | boolean) {\n super();\n this.q = { expr: this };\n }\n\n makeSQL(): string {\n return String(this.sql);\n }\n}\n","import { Query } from '../query/query';\nimport { emptyObject, RecordString, RecordUnknown } from '../utils';\nimport {\n Expression,\n RawSQLValues,\n StaticSQLArgs,\n TemplateLiteralArgs,\n templateLiteralSQLToCode,\n} from '../query/expressions/expression';\nimport { raw, RawSqlBase } from '../query/expressions/raw-sql';\nimport { TableData } from '../tableData';\nimport { ColumnTypeSchemaArg } from './column-schema';\nimport { Code, ColumnToCodeCtx } from './code';\n\nimport { Operator } from './operators';\nimport { PickQueryInputType } from '../query/pick-query-types';\nimport { QueryHookUtils } from '../query/extra-features/hooks/hooks';\nimport type { ColumnDataComputedProp } from '../query';\nimport type { SelectSqlColumn } from '../query/extra-features/select-sql/select-sql';\nimport type { ColumnRefExpression } from '../query/expressions/column-ref-expression';\nimport type { QuerySchema } from '../query/basic-features/schema/schema';\n\nexport namespace Column {\n // marks the column as a primary, this typing is used in onConflict logic\n export interface IsPrimaryKey<Name extends string> {\n data: {\n primaryKey: Name;\n };\n }\n\n // marks the column as unique, this typing is used in onConflict logic\n export type IsUnique<Name extends string> = {\n data: {\n unique: Name;\n };\n };\n\n export type Nullable<T extends Column.Pick.ForNullable> = {\n [K in keyof T]: K extends '__type'\n ? T['__type'] | null\n : K extends '__inputType'\n ? T['__inputType'] | null\n : K extends '__outputType'\n ?\n | T['__outputType']\n | (unknown extends T['__nullType'] ? null : T['__nullType'])\n : K extends '__queryType'\n ? T['__queryType'] | null\n : K extends 'data'\n ? T['data'] & DataNullable\n : K extends 'operators'\n ? {\n [K in keyof T['operators']]: K extends\n | 'equals'\n | 'not'\n | 'isDistinctFrom'\n | 'isNotDistinctFrom'\n ? Operator<T['__queryType'] | null, T>\n : T['operators'][K];\n }\n : T[K];\n };\n\n // marks the column as a nullable, adds `null` type to `type` and `__inputType`\n export type NullableWithSchema<\n T extends Column.Pick.ForNullable,\n InputSchema,\n OutputSchema,\n QuerySchema,\n > = {\n [K in keyof T]: K extends '__type'\n ? T['__type'] | null\n : K extends '__inputType'\n ? T['__inputType'] | null\n : K extends 'inputSchema'\n ? InputSchema\n : K extends '__outputType'\n ?\n | T['__outputType']\n | (unknown extends T['__nullType'] ? null : T['__nullType'])\n : K extends 'outputSchema'\n ? OutputSchema\n : K extends '__queryType'\n ? T['__queryType'] | null\n : K extends 'querySchema'\n ? QuerySchema\n : K extends 'data'\n ? T['data'] & DataNullable\n : K extends 'operators'\n ? {\n [K in keyof T['operators']]: K extends\n | 'equals'\n | 'not'\n | 'isDistinctFrom'\n | 'isNotDistinctFrom'\n ? Operator<T['__queryType'] | null, T>\n : T['operators'][K];\n }\n : T[K];\n };\n\n export type QueryColumnToNullable<C> = {\n [K in keyof C]: K extends '__outputType' | '__queryType'\n ? C[K] | null\n : C[K];\n };\n\n export type QueryColumnToOptional<C> = {\n [K in keyof C]: K extends '__outputType' ? C[K] | undefined : C[K];\n };\n\n interface DataNullable {\n isNullable: true;\n optional: true;\n }\n\n // allow `null` in .where({ column: { equals: null } }) and the same for equality-style operators\n export interface OperatorsNullable<Column extends Column.Pick.QueryColumn> {\n equals: Operator<Column['__queryType'] | null, Column>;\n not: Operator<Column['__queryType'] | null, Column>;\n isDistinctFrom: Operator<Column['__queryType'] | null, Column>;\n isNotDistinctFrom: Operator<Column['__queryType'] | null, Column>;\n }\n\n // change the input type of the column\n export type Encode<T, InputSchema, Input> = {\n [K in keyof T]: K extends '__inputType'\n ? Input\n : K extends 'inputSchema'\n ? InputSchema\n : T[K];\n };\n\n // change the output type of the column\n export type Parse<T extends Pick.ForParse, OutputSchema, Output> = {\n [K in keyof T]: K extends '__outputType'\n ? null extends T['__type']\n ?\n | (Output extends null ? never : Output)\n | (unknown extends T['__nullType'] ? null : T['__nullType'])\n : Output\n : K extends 'outputSchema'\n ? null extends T['__type']\n ? OutputSchema | T['nullSchema']\n : OutputSchema\n : T[K];\n };\n\n // change the output type of null value\n export type ParseNull<\n T extends Column.Pick.ForParseNull,\n NullSchema,\n NullType,\n > = {\n [K in keyof T]: K extends '__outputType'\n ? null extends T['__type']\n ? Exclude<T['__outputType'], null> | NullType\n : T['__outputType']\n : K extends '__nullType'\n ? NullType\n : K extends 'outputSchema'\n ? null extends T['__type']\n ? T['outputSchema'] | NullSchema\n : T['outputSchema']\n : K extends 'nullSchema'\n ? NullSchema\n : T[K];\n };\n\n // adds default type to the column\n // removes the default if the Value is null\n export type HasDefault<T extends Column.Pick.Data> = T & Column.Data.Default;\n\n type DefaultSelectData<T extends Column.Data, Value> = {\n [K in keyof T]: K extends 'explicitSelect'\n ? Value extends true\n ? false\n : true\n : T[K];\n };\n\n // whether to select column by default or with *\n export type DefaultSelect<\n T extends Column.Pick.Data,\n Value extends boolean,\n > = {\n [K in keyof T]: K extends 'data'\n ? DefaultSelectData<T['data'], Value>\n : T[K];\n };\n\n export interface IsAppReadOnly {\n data: {\n appReadOnly: true;\n };\n }\n\n export type Generated<T extends Column.Pick.Data> = {\n [K in keyof T]: K extends 'data'\n ? {\n [K in keyof T['data']]: K extends 'default' ? true : T['data'][K];\n }\n : K extends '__inputType'\n ? never\n : T[K];\n };\n\n export interface Branded<Token extends true | string = true> {\n data: {\n branded: Token;\n };\n }\n\n export namespace Pick {\n export interface Data {\n data: Column.Data;\n }\n\n export interface Type {\n __type: unknown;\n }\n\n export interface OutputType {\n __outputType: unknown;\n }\n\n export interface InputType {\n __inputType: unknown;\n }\n\n export interface DataAndInputType extends Data, InputType {}\n\n export interface NullType {\n __nullType: unknown;\n }\n\n export interface OutputTypeAndOperators extends OutputType {\n operators: unknown;\n }\n\n export interface DataAndDataType extends Data {\n dataType: string;\n }\n\n // Use a lightweight column type across the query builder, this helps TS significantly.\n //\n export interface QueryColumn extends OutputType {\n dataType: string;\n __type: unknown;\n __queryType: unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n operators: any;\n }\n\n export interface QueryColumnOfType<T> {\n dataType: string;\n __type: T;\n __outputType: T;\n __queryType: T;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n operators: any;\n }\n\n export interface QueryColumnOfTypeAndOps<DataType, T, Ops> {\n dataType: DataType;\n __type: T;\n __outputType: T;\n __queryType: T;\n operators: Ops;\n }\n\n export interface QueryColumnOfDataType<\n T extends string,\n > extends QueryColumn {\n dataType: T;\n }\n\n export interface QueryInit extends QueryColumn, InputType {\n data: Column.QueryData;\n }\n\n export interface OutputSchema {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n outputSchema: any;\n }\n\n export interface NullSchema {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nullSchema: any;\n }\n\n export interface TypeSchemas extends OutputSchema, NullSchema {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputSchema: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n querySchema: any;\n }\n\n export interface ForNullable\n extends Data, Type, InputType, OutputType, TypeSchemas {\n __nullType: unknown;\n __queryType: unknown;\n operators: unknown;\n }\n\n export interface ForParse extends Type, NullType, NullSchema {}\n\n export interface ForParseNull extends Type, OutputType, OutputSchema {}\n\n export interface ForValidation extends TypeSchemas, DataAndDataType {}\n }\n\n export namespace Shape {\n export interface Data {\n [K: string]: Column.Pick.Data;\n }\n\n export interface QueryInit {\n [K: string]: Column.Pick.QueryInit;\n }\n\n export interface ForValidation {\n [K: string]: Column.Pick.ForValidation;\n }\n }\n\n export interface QueryColumns {\n [K: string]: Column.Pick.QueryColumn;\n }\n\n export interface QueryColumnsInit {\n [K: string]: Pick.QueryInit;\n }\n\n export namespace ForeignKey {\n export interface TableParamInstance {\n schema?: string;\n table: string;\n nameInDb?: string;\n columns: { shape: unknown };\n }\n\n export interface TableParamInstanceInput {\n schema?: QuerySchema;\n table?: string;\n nameInDb?: string;\n columns: { shape: unknown };\n }\n\n export interface TableParamWithInstance {\n instance(): TableParamInstanceInput;\n }\n\n export interface TableParamWithData {\n data: { columns: unknown };\n instance(): TableParamInstanceInput;\n }\n\n // minimal table class type to use in the foreign key option\n export type TableParam =\n | (new () => TableParamInstance)\n | TableParamWithInstance\n | TableParamWithData;\n\n // string union of available column names of the table\n export type ColumnNameOfTable<Table extends Column.ForeignKey.TableParam> =\n Table extends { data: { columns: infer R } }\n ? keyof R\n : Table extends { instance(): { columns: { shape: infer R } } }\n ? keyof R\n : Table extends new () => { columns: { shape: infer R } }\n ? keyof R\n : never;\n }\n\n export namespace Error {\n // Can be used to customize required and invalidType validation error message on any column.\n // must be a type, because of zod typing\n export interface Messages {\n required?: string;\n invalidType?: string;\n }\n\n export interface Message {\n message?: string;\n }\n\n // Parameter of column types to customize an error message.\n export type StringOrMessage = string | Message;\n }\n\n export interface InputOutputQueryTypes {\n __inputType: unknown;\n __outputType: unknown;\n __queryType: unknown;\n }\n\n export interface InputOutputQueryTypesWithSchemas extends InputOutputQueryTypes {\n inputSchema: unknown;\n outputSchema: unknown;\n querySchema: unknown;\n }\n\n export interface QueryData {\n explicitSelect?: boolean;\n primaryKey?: string;\n unique?: string;\n optional?: true;\n isNullable?: true;\n default?: unknown;\n name?: string;\n readOnly?: boolean;\n appReadOnly: true | undefined;\n branded: true | string | undefined;\n }\n\n // type of data for ColumnType\n export interface Data extends ColumnDataComputedProp {\n // column key is assigned when instantiating a table interface\n key: string;\n\n // name of the column in the database, if different from the code\n name?: string;\n\n // true when is nullable or has a default\n optional: true | undefined;\n\n // is null value allowed\n isNullable?: true;\n\n // true for primary key, string for primary key with a custom name\n primaryKey?: string;\n\n // if column has a default value, then it can be omitted in `create` method\n default: unknown;\n\n // to hide default from generated code\n defaultDefault: unknown;\n\n // if the `default` is a function, instantiating table query will set `runtimeDefault` to wrap the `default` function with `encode` if it is set.\n runtimeDefault?(): unknown;\n\n // column should not be implicitly selected\n explicitSelect?: boolean;\n\n // parse and encode a column to use it `as` another column\n as?: Column.Pick.Data;\n\n unique?: string;\n\n // hook for modifying base query object of the table\n // used for automatic updating of `updatedAt`\n modifyQuery?(q: Query, column: Column.Pick.Data): void;\n\n // raw database check expression\n checks?: Column.Data.Check[];\n\n // if the column is of domain or other user-defined type\n isOfCustomType?: boolean;\n\n // error messages: key is camelCased version of Zod, like invalidType, and the value is the message\n errors?: RecordString;\n\n // identify whether this column is from `timestamps()` helper for codegen purposes\n defaultTimestamp?: 'createdAt' | 'updatedAt';\n\n // alias of the type used as a column function name\n alias?: string;\n\n // name of extension that contains the column type, if it's not standard\n extension?: string;\n\n // encode value passed to `create` to an appropriate value for a database\n encode?(input: any): unknown; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n // parse value from a database into what is preferred by the app\n parse?(input: any): unknown; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n // parse value from a database when it is an element of database array type\n parseItem?(input: string): unknown;\n\n // replaces selected nulls with custom values\n parseNull?(): unknown;\n\n // this is used to cast column types in SQL when wrapping rows as JSON.\n // decimal and similar columns have to be casted to text to not loose precision.\n jsonCast?: string;\n\n // removes the column from update and create, it's for generated and computed columns\n readOnly?: boolean;\n\n // removes the column from update and create, but it is still allowed to be set in the hooks\n appReadOnly: true | undefined;\n\n // set a value on create\n setOnCreate?(arg: QueryHookUtils<PickQueryInputType>): unknown;\n\n // set a value on update\n setOnUpdate?(arg: QueryHookUtils<PickQueryInputType>): unknown;\n\n // set a value on save\n setOnSave?(arg: QueryHookUtils<PickQueryInputType>): unknown;\n\n // postgres internal number modifier, it can be present on custom types.\n typmod?: number;\n\n // virtual columns are read only, and they are ignored in update in create,\n // unlike unknown column that is extending virtual\n virtual?: true;\n\n maxChars?: number;\n numericPrecision?: number;\n numericScale?: number;\n dateTimePrecision?: number;\n validationDefault?: unknown;\n indexes?: TableData.ColumnIndex[];\n excludes?: TableData.ColumnExclude[];\n comment?: string;\n collate?: string;\n compression?: string;\n foreignKeys?: TableData.ColumnReferences[];\n identity?: TableData.Identity;\n // raw SQL for generated columns\n generated?: Data.Generated;\n // computed and generated columns are readonly\n readonly?: boolean;\n valueToArray?: boolean;\n skipValueToArray?: boolean;\n branded: true | string | undefined;\n }\n\n export namespace Data {\n export interface Default {\n data: {\n default: true;\n optional: true;\n };\n }\n\n export interface Check {\n sql: RawSqlBase;\n name?: string;\n }\n\n export interface Generated {\n toSQL(\n ctx: { values: unknown[]; snakeCase: boolean | undefined },\n quotedAs?: string,\n ): string;\n\n toCode(): string;\n }\n }\n\n interface AsTypeArgWithType<Schema> {\n type: Schema;\n input?: Schema;\n output?: Schema;\n query?: Schema;\n }\n\n interface AsTypeArgWithoutType<Schema> {\n input: Schema;\n output: Schema;\n query: Schema;\n }\n\n export type AsTypeArg<Schema> =\n | AsTypeArgWithType<Schema>\n | AsTypeArgWithoutType<Schema>;\n}\n\nexport const getForeignKeyTableInstance = (\n table: Column.ForeignKey.TableParam,\n): Column.ForeignKey.TableParamInstance => {\n const item = 'instance' in table ? table.instance() : new table();\n\n if (!item.table)\n throw new Error('Referenced table is missing table property');\n\n return {\n ...item,\n schema: typeof item.schema === 'function' ? item.schema() : item.schema,\n table: item.table,\n };\n};\n\n// change column type and all schemas to nullable\nexport function makeColumnNullable<\n T extends Column.Pick.ForNullable,\n InputSchema,\n OutputSchema,\n QuerySchema,\n>(\n column: T,\n inputSchema: InputSchema,\n outputSchema: OutputSchema,\n querySchema: QuerySchema,\n) {\n const c = setColumnData(column, 'isNullable', true) as unknown as Column;\n c.inputSchema = inputSchema;\n c.outputSchema = outputSchema;\n c.querySchema = querySchema;\n return c as unknown as Column.NullableWithSchema<\n T,\n InputSchema,\n OutputSchema,\n QuerySchema\n >;\n}\n\n// clone column type and set data to it\nexport const setColumnData = <\n T extends Column.Pick.Data,\n K extends keyof T['data'],\n>(\n q: T,\n key: K,\n value: T['data'][K],\n): T => {\n const cloned = Object.create(q);\n cloned.data = { ...q.data, [key]: value };\n return cloned;\n};\n\n// clone column type and push data to array property of it\nexport const pushColumnData = <\n T extends Column.Pick.Data,\n K extends keyof T['data'],\n>(\n q: T,\n key: K,\n value: unknown,\n) => {\n const arr = q.data[key as keyof typeof q.data] as unknown[];\n return setColumnData(\n q,\n key,\n (arr ? [...arr, value] : [value]) as unknown as T['data'][K],\n );\n};\n\n// Clone a column or a JSON type and set the value in its data.\nexport const setDataValue = <\n T extends Column.Pick.Data,\n Key extends string,\n Value,\n>(\n item: T,\n key: Key,\n value: Value,\n params?: Column.Error.StringOrMessage,\n): T => {\n const cloned = Object.create(item);\n cloned.data = { ...item.data, [key]: value };\n\n if (params && (typeof params === 'string' || params.message)) {\n (cloned.data.errors ??= {})[key] =\n typeof params === 'string' ? params : params.message;\n }\n\n return cloned as T;\n};\n\n// current name of the column, set by `name` method\nlet currentName: string | undefined;\n\n// set current name of the column\nexport function setCurrentColumnName(name: string): void {\n currentName = name;\n}\n\n// consume column name: reset current name and return the value it contained\nexport const consumeColumnName = () => {\n const name = currentName;\n currentName = undefined;\n return name;\n};\n\n// by default, updatedAt and createdAt timestamps are defaulted to now()\nconst defaultNowFn = 'now()';\n\n// stores SQL to use as default for updatedAt and createdAt\nlet currentNowFn = defaultNowFn;\n\n// change default SQL for updatedAt and createdAt\nexport const setDefaultNowFn = (sql: string) => {\n currentNowFn = sql;\n};\n\n// get default SQL for updatedAt and createdAt\nexport const getDefaultNowFn = () => currentNowFn;\n\n// reset default SQL for updatedAt and createdAt to now()\nexport const resetDefaultNowFn = () => {\n currentNowFn = defaultNowFn;\n};\n\n// default language for full text search\nlet defaultLanguage = 'english';\n\n// set default language for full text search\nexport const setDefaultLanguage = (lang?: string) => {\n defaultLanguage = lang || 'english';\n};\n\n// get default language for full text search\nexport const getDefaultLanguage = () => defaultLanguage;\n\nexport abstract class Column {\n abstract __schema: ColumnTypeSchemaArg;\n\n // name of the type in a database\n abstract dataType: string;\n\n // operators supported by the type, that are available in `where` method\n // oxlint-disable-next-line typescript/no-explicit-any\n abstract operators: any;\n\n // turn the column into TS code, used for code generation\n abstract toCode(ctx: ColumnToCodeCtx, key: string): Code;\n\n // Type returned from a database before parsing, it is an output type of db.\n // Unlike `__queryType`, it cannot be a union.\n abstract __type: unknown;\n\n // allowed type for creating and updating, it is processed by `encode` function when it's defined.\n abstract __inputType: unknown;\n\n // type returned from a database and processed by `parse` function when it's defined.\n abstract __outputType: unknown;\n\n // Allowed type to use in `where` and other query methods.\n // Input type of db: timestamp can be sent as a string, a number, or Date (serialized by `pg` driver).\n // It is **not** processed by the ORM, only by a database driver.\n abstract __queryType: unknown;\n\n declare __nullType: unknown;\n declare nullSchema: unknown;\n abstract inputSchema: unknown;\n abstract outputSchema: unknown;\n abstract querySchema: unknown;\n\n // data of the column that specifies column characteristics and validations\n data: Column.Data;\n\n error: this['__schema']['error'];\n\n _parse?: (input: unknown) => unknown;\n\n constructor(\n schema: ColumnTypeSchemaArg,\n // type for validation lib for inserting and updating records\n // public inputSchema: InputSchema = undefined as InputSchema,\n inputSchema: unknown,\n // type for validation lib for selected data\n outputSchema: unknown = inputSchema,\n // type for validation lib for validating filters\n querySchema: unknown = inputSchema,\n ) {\n (this as unknown as RecordUnknown).inputSchema = inputSchema;\n (this as unknown as RecordUnknown).outputSchema = outputSchema;\n (this as unknown as RecordUnknown).querySchema = querySchema;\n this.parse = schema.parse;\n this.parseNull = schema.parseNull;\n this.encode = schema.encode;\n this.asType = schema.asType;\n this.narrowType = schema.narrowType;\n this.narrowAllTypes = schema.narrowAllTypes;\n this.nullable = schema.nullable;\n this.error = schema.error;\n const name = consumeColumnName();\n this.data = (name ? { name } : {}) as Column.Data;\n }\n\n /**\n * Set a default value to a column. Columns that have defaults become optional when creating a record.\n *\n * If you provide a value or a raw SQL, such default should be set on the column in migration to be applied on a database level.\n *\n * Or you can specify a callback that returns a value. This function will be called for each creating record. Such a default won't be applied to a database.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * // values as defaults:\n * int: t.integer().default(123),\n * text: t.text().default('text'),\n *\n * // raw SQL default:\n * timestamp: t.timestamp().default(t.sql`now()`),\n *\n * // runtime default, each new records gets a new random value:\n * random: t.numeric().default(() => Math.random()),\n * }));\n * ```\n *\n * @param value - default value or a function returning a value\n */\n default<\n T extends Column.Pick.DataAndInputType,\n Value extends\n | T['__inputType']\n | null\n | RawSqlBase\n | (() => T['__inputType']),\n >(this: T, value: Value): Column.HasDefault<T> {\n return setColumnData(this, 'default', value) as never;\n }\n\n /**\n * Use `hasDefault` to let the column be omitted when creating records.\n *\n * It's better to use {@link default} instead so the value is explicit and serves as a hint.\n */\n hasDefault<T extends Column.Pick.Data>(this: T): Column.HasDefault<T> {\n return this as never;\n }\n\n /**\n * Set a database-level validation check to a column. `check` accepts a raw SQL.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * // validate rank to be from 1 to 10\n * rank: t.integer().check(t.sql`1 >= \"rank\" AND \"rank\" <= 10`),\n * // constraint name can be passed as a second argument\n * column: t.integer().check(t.sql`...`, 'check_name'),\n * // a single column can have multiple checks\n * multiChecksColumn: t\n * .integer()\n * .check(t.sql`...`)\n * .check(t.sql`...`, 'optional_name'),\n * }));\n * });\n * ```\n *\n * @param sql - raw SQL expression\n * @param name - to specify a constraint name\n */\n check<T extends Column.Pick.Data>(\n this: T,\n sql: RawSqlBase,\n name?: string,\n ): T {\n return pushColumnData(this, 'checks', { sql, name });\n }\n\n /**\n * Use `nullable` to mark the column as nullable. By default, all columns are required.\n *\n * Nullable columns are optional when creating records.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * name: t.integer().nullable(),\n * }));\n * ```\n */\n nullable: this['__schema']['nullable'];\n\n /**\n * Set a custom function to process value for the column when creating or updating a record.\n *\n * The type of `input` argument will be used as the type of the column when creating and updating.\n *\n * If you have a validation library [installed and configured](/guide/columns-validation-methods.html),\n * first argument is a schema to validate the input.\n *\n * ```ts\n * import { z } from 'zod';\n *\n * export const Table = defineTable('table', (t) => ({\n * // encode boolean, number, or string to text before saving\n * column: t\n * .string()\n * // when having validation library, the first argument is a validation schema\n * .encode(\n * z.boolean().or(z.number()).or(z.string()),\n * (input: boolean | number | string) => String(input),\n * )\n * // no schema argument otherwise\n * .encode((input: boolean | number | string) => String(input)),\n * }));\n *\n * // numbers and booleans will be converted to a string:\n * await db.table.create({ column: 123 });\n * await db.table.create({ column: true });\n * await db.table.where({ column: 'true' }).update({ column: false });\n * ```\n *\n * @param fn - function to encode value for a database, argument type is specified by you, return type must be compatible with a database\n */\n encode: this['__schema']['encode'];\n\n /**\n * Set a custom function to process value after loading it from a database.\n *\n * The type of input is the type of column before `.parse`, the resulting type will replace the type of column.\n *\n * If you have a validation library [installed and configured](/guide/columns-validation-methods.html),\n * first argument is a schema for validating the output.\n *\n * For handling `null` values use {@link parseNull} instead or in addition.\n *\n * ```ts\n * import { z } from 'zod';\n * import { number, integer } from 'valibot';\n *\n * export const Table = defineTable('table', (t) => ({\n * columnZod: t\n * .string()\n * // when having validation library, the first argument is a schema\n * .parse(z.number().int(), (input) => parseInt(input))\n * // no schema argument otherwise\n * .parse((input) => parseInt(input)),\n *\n * columnValibot: t\n * .string()\n * .parse(number([integer()]), (input) => parseInt(input))\n * .parse((input) => parseInt(input)),\n * }));\n *\n * // column will be parsed to a number\n * const value: number = await db.table.get('column');\n * ```\n *\n * @param fn - function to parse a value from the database, argument is the type of this column, return type is up to you\n */\n parse: this['__schema']['parse'];\n\n /**\n * Use `parseNull` to specify runtime defaults at selection time.\n *\n * The `parseNull` function is only triggered for `nullable` columns.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * column: t\n * .integer()\n * .parse(String) // parse non-nulls to string\n * .parseNull(() => false), // replace nulls with false\n * .nullable(),\n * }));\n *\n * const record = await db.table.take()\n * record.column // can be a string or boolean, not null\n * ```\n *\n * If you have a validation library [installed and configured](/guide/columns-validation-methods),\n * first argument is a schema for validating the output.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * column: t\n * .integer()\n * .parse(z.string(), String) // parse non-nulls to string\n * .parseNull(z.literal(false), () => false) // replace nulls with false\n * .nullable(),\n * }));\n *\n * const record = await db.table.take();\n * record.column; // can be a string or boolean, not null\n *\n * Table.outputSchema().parse({\n * column: false, // the schema expects strings or `false` literals, not nulls\n * });\n * ```\n */\n parseNull: this['__schema']['parseNull'];\n\n /**\n * This method changes a column type without modifying its behavior.\n * This is needed when converting columns to a validation schema, the converter will pick a different type specified by `.as`.\n *\n * Before calling `.as` need to use `.encode` with the input of the same type as the input of the target column,\n * and `.parse` which returns the correct type.\n *\n * ```ts\n * // column has the same type as t.integer()\n * const column = t\n * .string()\n * .encode((input: number) => input)\n * .parse((text) => parseInt(text))\n * .as(t.integer());\n * ```\n *\n * @param column - other column type to inherit from\n */\n as<\n T extends {\n __inputType: unknown;\n __outputType: unknown;\n data: Column.Data;\n },\n C extends {\n __inputType: T['__inputType'];\n __outputType: T['__outputType'];\n },\n >(this: T, column: C): C {\n return setColumnData(\n this,\n 'as',\n column as unknown as T['data']['as'],\n ) as unknown as C;\n }\n\n /**\n * @deprecated use narrowType instead\n */\n asType: this['__schema']['asType'];\n\n /**\n * `narrowType` narrows TypeScript types of a column. It sets input, output, query type altogether.\n *\n * For example, to narrow a `string` type to a union of string literals.\n *\n * When _not_ integrating with [validation libraries](/guide/columns-validation-methods), `narrowType` has the following syntax:\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * size: t.string().narrowType((t) => t<'small' | 'medium' | 'large'>()),\n * }));\n *\n * // size will be typed as 'small' | 'medium' | 'large'\n * const size = await db.table.get('size');\n * ```\n *\n * - `input` is for `create`, `update` methods.\n * - `output` is for the data that is loaded from a database and parsed if the column has `parse`.\n * - `query` is used in `where` and other query methods, it should be compatible with the actual database column type.\n *\n * When integrating with a [validation library](/guide/columns-validation-methods), also provide validation schemas:\n *\n * ```ts\n * const sizeSchema = z.union([\n * z.literal('small'),\n * z.literal('medium'),\n * z.literal('large'),\n * ]);\n *\n * export const Table = defineTable('table', (t) => ({\n * size: t.text().narrowType(sizeSchema),\n * }));\n *\n * // size will be typed as 'small' | 'medium' | 'large'\n * const size = await db.table.get('size');\n * ```\n *\n * @deprecated use `type` instead\n */\n narrowType: this['__schema']['narrowType'];\n\n /**\n * Allows to narrow different TypeScript types of a column granularly.\n *\n * Use it when the column's input is different from output.\n *\n * When _not_ integrating with [validation libraries](/guide/columns-validation-methods), `narrowAllTypes` has the following syntax:\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * size: t.string().narrowAllTypes((t) =>\n * t<{\n * // what types are accepted when creating/updating\n * input: 'small' | 'medium' | 'large';\n * // how types are retured from a database\n * output: 'small' | 'medium' | 'large';\n * // what types the column accepts in `where` and similar\n * query: 'small' | 'medium' | 'large';\n * }>(),\n * ),\n * }));\n *\n * // size will be typed as 'small' | 'medium' | 'large'\n * const size = await db.table.get('size');\n * ```\n *\n * - `input` is for `create`, `update` methods.\n * - `output` is for the data that is loaded from a database and parsed if the column has `parse`.\n * - `query` is used in `where` and other query methods, it should be compatible with the actual database column type.\n *\n * When integrating with a [validation library](/guide/columns-validation-methods), also provide validation schemas:\n *\n * ```ts\n * const sizeSchema = z.union([\n * z.literal('small'),\n * z.literal('medium'),\n * z.literal('large'),\n * ]);\n *\n * export const Table = defineTable('table', (t) => ({\n * size: t.text().narrowAllTypes({\n * input: sizeSchema,\n * output: sizeSchema,\n * query: sizeSchema,\n * }),\n * }));\n *\n * // size will be typed as 'small' | 'medium' | 'large'\n * const size = await db.table.get('size');\n * ```\n *\n * @deprecated use `type`, `inputType`, `outputType`, `queryType` instead\n */\n narrowAllTypes: this['__schema']['narrowAllTypes'];\n\n brand<T, Token extends true | string = true>(\n this: T,\n _token?: Token,\n ): T & Column.Branded<Token> {\n return this as never;\n }\n\n input<\n T extends { inputSchema: unknown },\n InputSchema extends this['__schema']['__schemaType'],\n >(\n this: T,\n fn: (schema: T['inputSchema']) => InputSchema,\n ): { [K in keyof T]: K extends 'inputSchema' ? InputSchema : T[K] } {\n const cloned = Object.create(this);\n cloned.inputSchema = fn(this.inputSchema);\n return cloned;\n }\n\n output<\n T extends { outputSchema: unknown },\n OutputSchema extends this['__schema']['__schemaType'],\n >(\n this: T,\n fn: (schema: T['outputSchema']) => OutputSchema,\n ): { [K in keyof T]: K extends 'outputSchema' ? OutputSchema : T[K] } {\n const cloned = Object.create(this);\n cloned.outputSchema = fn(this.outputSchema);\n return cloned;\n }\n\n query<\n T extends { querySchema: unknown },\n QuerySchema extends this['__schema']['__schemaType'],\n >(\n this: T,\n fn: (schema: T['querySchema']) => QuerySchema,\n ): { [K in keyof T]: K extends 'querySchema' ? QuerySchema : T[K] } {\n const cloned = Object.create(this);\n cloned.querySchema = fn(this.querySchema);\n return cloned;\n }\n\n /**\n * Set a database column name.\n *\n * @param name - name of the column in database.\n */\n name<T extends Column.Pick.Data>(this: T, name: string): T {\n return setColumnData(this, 'name', name);\n }\n\n /**\n * Append `select(false)` to a column to exclude it from the default selection.\n * It won't be selected with `selectAll` or `select('*')` as well.\n *\n * ```ts\n * export const UserTable = defineTable('user', (t) => ({\n * id: t.identity().primaryKey(),\n * name: t.string(),\n * password: t.string().select(false),\n * }));\n *\n * // only id and name are selected, without password\n * const user = await db.user.find(123);\n *\n * // password is still omitted, even with the wildcard\n * const same = await db.user.find(123).select('*');\n *\n * const comment = await db.comment.find(123).select({\n * // password is omitted in the sub-selects as well\n * author: (q) => q.author,\n * });\n *\n * // password is omitted here as well\n * const created = await db.user.create(userData);\n * ```\n *\n * Such a column can only be selected explicitly.\n *\n * ```ts\n * const userWithPassword = await db.user.find(123).select('*', 'password');\n * ```\n */\n select<T extends Column.Pick.Data, Value extends boolean>(\n this: T,\n value: Value,\n ): Column.DefaultSelect<T, Value> {\n return setColumnData(this, 'explicitSelect', !value) as never;\n }\n\n /**\n * Set SQL to use when selecting this column.\n *\n * The column remains a regular writable database column. Create, update,\n * filters, ordering, grouping, and migrations still use the physical column.\n */\n selectSql<T extends Column.Pick.DataAndDataType, Expr extends Expression>(\n this: T,\n fn: (column: ColumnRefExpression<T & Column.Pick.QueryColumn>) => Expr,\n ): SelectSqlColumn<T, Expr> {\n return setColumnData(this, 'selectSqlFn', fn as never) as never;\n }\n\n /**\n * Forbid the column to be used in [create](/guide/create-update-delete.html#create-insert) and [update](/guide/create-update-delete.html#update) methods.\n *\n * `readOnly` column is still can be set from a [hook](http://localhost:5173/guide/hooks.html#set-values-before-create-or-update).\n *\n * `readOnly` column can be used together with a `default`.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * column: t.string().default(() => 'default value'),\n * another: t.string().nullable().readOnly(),\n * })).init((orm: typeof db, hooks) => {\n * hooks.beforeSave(({ columns, set }) => {\n * if (columns.include('column')) {\n * set({ another: 'value' });\n * }\n * });\n * });\n *\n * // later in the code\n * db.table.create({ column: 'value' }); // TS error, runtime error\n * ```\n */\n readOnly<T>(this: T): T & Column.IsAppReadOnly {\n return setColumnData(this as never, 'appReadOnly', true as never) as never;\n }\n\n /**\n * Set a column value when creating a record.\n * This works for [readOnly](#readonly) columns as well.\n *\n * If no value or undefined is returned, the hook won't have any effect.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * some: t.number(),\n * column: t\n * .string()\n * .setOnCreate(({ columns }) =>\n * columns.include('some') ? 'value' : undefined,\n * ),\n * }));\n * ```\n */\n setOnCreate<T extends Column.Pick.QueryInit>(\n this: T,\n fn: (arg: QueryHookUtils<PickQueryInputType>) => T['__inputType'] | void,\n ): T {\n return setColumnData(this as never, 'setOnCreate', fn as never) as never;\n }\n\n /**\n * Set a column value when updating a record.\n * This works for [readOnly](#readonly) columns as well.\n *\n * If no value or undefined is returned, the hook won't have any effect.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * some: t.number(),\n * column: t\n * .string()\n * .setOnUpdate(({ columns }) =>\n * columns.include('some') ? 'value' : undefined,\n * ),\n * }));\n * ```\n */\n setOnUpdate<T extends Column.Pick.QueryInit>(\n this: T,\n fn: (arg: QueryHookUtils<PickQueryInputType>) => T['__inputType'] | void,\n ): T {\n return setColumnData(this as never, 'setOnUpdate', fn as never) as never;\n }\n\n /**\n * Set a column value when creating or updating a record.\n * This works for [readOnly](#readonly) columns as well.\n *\n * If no value or undefined is returned, the hook won't have any effect.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * some: t.number(),\n * column: t\n * .string()\n * .setOnSave(({ columns }) =>\n * columns.include('some') ? 'value' : undefined,\n * ),\n * }));\n * ```\n */\n setOnSave<T extends Column.Pick.QueryInit>(\n this: T,\n fn: (arg: QueryHookUtils<PickQueryInputType>) => T['__inputType'] | void,\n ): T {\n return setColumnData(this as never, 'setOnSave', fn as never) as never;\n }\n\n /**\n * Mark the column as a primary key.\n * This column type becomes an argument of the `.find` method.\n * So if the primary key is of `integer` type (`identity` or `serial`), `.find` will accept the number,\n * or if the primary key is of `UUID` type, `.find` will expect a string.\n *\n * Using `primaryKey` on a `uuid` column will automatically add a [gen_random_uuid](https://www.postgresql.org/docs/current/functions-uuid.html) default.\n *\n * ```ts\n * export const Table = defineTable('table', (t) => ({\n * id: t.uuid().primaryKey(),\n * // optionally, specify a database-level constraint name:\n * id: t.uuid().primaryKey('primary_key_name'),\n * }));\n *\n * // primary key can be used by `find` later:\n * db.table.find('97ba9e78-7510-415a-9c03-23d440aec443');\n * ```\n *\n * @param name - to specify a constraint name\n */\n primaryKey<T extends Column.Pick.Data, Name extends string>(\n this: T,\n name?: Name,\n ): T & Column.IsPrimaryKey<Name> {\n return setColumnData(this, 'primaryKey', name ?? (true as never)) as never;\n }\n\n /**\n * Defines a reference between different tables to enforce data integrity.\n *\n * In [snakeCase](/guide/orm-and-query-builder.html#snakecase-option) mode, columns of both tables are translated to a snake_case.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * otherId: t.integer().foreignKey('otherTableName', 'columnName'),\n * }));\n * });\n * ```\n *\n * In the migration it's different from OrchidORM table code where a callback with a table is expected:\n *\n * ```ts\n * export const SomeTable = defineTable('someTable', (t) => ({\n * otherTableId: t.integer().foreignKey(() => OtherTable, 'id'),\n * }));\n * ```\n *\n * Optionally you can pass the third argument to `foreignKey` with options:\n *\n * ```ts\n * type ForeignKeyOptions = {\n * // name of the constraint\n * name?: string;\n * // see database docs for MATCH in FOREIGN KEY\n * match?: 'FULL' | 'PARTIAL' | 'SIMPLE';\n *\n * onUpdate?: 'NO ACTION' | 'RESTRICT' | 'CASCADE' | 'SET NULL' | 'SET DEFAULT';\n * onDelete?: 'NO ACTION' | 'RESTRICT' | 'CASCADE' | 'SET NULL' | 'SET DEFAULT';\n * };\n * ```\n *\n * ## composite foreign key\n *\n * Set foreign key from multiple columns in the current table to corresponding columns in the other table.\n *\n * The first argument is an array of columns in the current table, the second argument is another table name, the third argument is an array of columns in another table, and the fourth argument is for options.\n *\n * Options are the same as in a single-column foreign key.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.integer(),\n * name: t.string(), // string is varchar(255)\n * ...t.foreignKey(\n * ['id', 'name'],\n * 'otherTable',\n * ['foreignId', 'foreignName'],\n * {\n * name: 'constraintName',\n * match: 'FULL',\n * onUpdate: 'RESTRICT',\n * onDelete: 'CASCADE',\n * },\n * ),\n * }));\n * });\n * ```\n *\n * @param fn - function returning a table class\n * @param column - column in the foreign table to connect with\n * @param options - {@link ForeignKeyOptions}\n */\n foreignKey<T, Table extends Column.ForeignKey.TableParam>(\n this: T,\n fn: () => Table,\n column: Column.ForeignKey.ColumnNameOfTable<Table>,\n options?: TableData.References.Options,\n ): T;\n foreignKey<T, Table extends string, Column extends string>(\n this: T,\n table: Table,\n column: Column,\n options?: TableData.References.Options,\n ): T;\n foreignKey(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fnOrTable: any,\n column: string,\n options: TableData.References.Options = emptyObject,\n ) {\n return pushColumnData(this, 'foreignKeys', {\n fnOrTable,\n foreignColumns: [column],\n options,\n });\n }\n\n // format the column into the database type\n toSQL(): string {\n return this.dataType;\n }\n\n /**\n * Add an index to the column.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * // add an index to the name column with default settings:\n * name: t.text().index(),\n * // options are described below:\n * name: t.text().index({ ...options }),\n * // with a database-level name:\n * name: t.text().index({ name: 'custom_index_name', ...indexOptions }),\n * }));\n * });\n * ```\n *\n * Possible options are:\n *\n * ```ts\n * type IndexOptions = {\n * name?: string,\n * // NULLS NOT DISTINCT: availabe in Postgres 15+, makes sense only for unique index\n * nullsNotDistinct?: true;\n * // index algorithm to use such as GIST, GIN\n * using?: string;\n * // specify collation:\n * collate?: string;\n * // see `opclass` in the Postgres document for creating the index\n * opclass?: string;\n * // specify index order such as ASC NULLS FIRST, DESC NULLS LAST\n * order?: string;\n * // include columns to an index to optimize specific queries\n * include?: MaybeArray<string>;\n * // see \"storage parameters\" in the Postgres document for creating an index, for example, 'fillfactor = 70'\n * with?: string;\n * // The tablespace in which to create the index. If not specified, default_tablespace is consulted, or temp_tablespaces for indexes on temporary tables.\n * tablespace?: string;\n * // WHERE clause to filter records for the index\n * where?: string;\n * // mode is for dropping the index\n * mode?: 'CASCADE' | 'RESTRICT';\n * };\n * ```\n *\n * @param args\n */\n index<T extends Column.Pick.Data>(\n this: T,\n ...args: [options?: TableData.Index.ColumnArg]\n ): T {\n const a = args as\n | [options?: RecordUnknown]\n | [name: string, options?: RecordUnknown];\n\n return pushColumnData(this, 'indexes', {\n options:\n (typeof a[0] === 'string' ? { ...a[1], name: a[0] } : a[0]) ??\n emptyObject,\n });\n }\n\n /**\n * `searchIndex` is designed for [full text search](/guide/text-search).\n *\n * It can accept the same options as a regular `index`, but it is `USING GIN` by default, and it is concatenating columns into a `tsvector` database type.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * title: t.text(),\n * body: t.text(),\n * ...t.searchIndex(['title', 'body']),\n * }));\n * });\n * ```\n *\n * Produces the following index ('english' is a default language, see [full text search](/guide/text-search.html#language) for changing it):\n *\n * ```sql\n * CREATE INDEX \"table_title_body_idx\" ON \"table\" USING GIN (to_tsvector('english', \"title\" || ' ' || \"body\"))\n * ```\n *\n * You can set different search weights (`A` to `D`) on different columns inside the index:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * title: t.text(),\n * body: t.text(),\n * ...t.searchIndex([\n * { column: 'title', weight: 'A' },\n * { column: 'body', weight: 'B' },\n * ]),\n * }));\n * });\n * ```\n *\n * When the table has localized columns,\n * you can define different indexes for different languages by setting the `language` parameter:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * titleEn: t.text(),\n * bodyEn: t.text(),\n * titleFr: t.text(),\n * bodyFr: t.text(),\n * ...t.searchIndex(['titleEn', 'bodyEn'], { language: 'english' }),\n * ...t.searchIndex(['titleFr', 'bodyFr'], { language: 'french' }),\n * }));\n * });\n * ```\n *\n * Alternatively, different table records may correspond to a single language,\n * then you can define a search index that relies on a language column by using `languageColumn` parameter:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * lang: t.type('regconfig'),\n * title: t.text(),\n * body: t.text(),\n * ...t.searchIndex(['title', 'body'], { languageColumn: 'lang' }),\n * }));\n * });\n * ```\n *\n * It can be more efficient to use a [generated](/guide/migration-column-methods.html#generated-column) column instead of indexing text column in the way described above,\n * and to set a `searchIndex` on it:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * id: t.identity().primaryKey(),\n * title: t.text(),\n * body: t.text(),\n * generatedTsVector: t.tsvector().generated(['title', 'body']).searchIndex(),\n * }));\n * });\n * ```\n *\n * Produces the following index:\n *\n * ```sql\n * CREATE INDEX \"table_generatedTsVector_idx\" ON \"table\" USING GIN (\"generatedTsVector\")\n * ```\n *\n * @param options - index options\n */\n searchIndex<T extends { data: Column['data']; dataType: string }>(\n this: T,\n ...args: [options?: TableData.Index.TsVectorColumnArg]\n ): T {\n const a = args as\n | [options?: RecordUnknown]\n | [name: string, options?: RecordUnknown];\n\n return pushColumnData(this, 'indexes', {\n options: {\n ...(typeof a[0] === 'string' ? { ...a[1], name: a[0] } : a[0]),\n ...(this.dataType === 'tsvector'\n ? { using: 'GIN' }\n : { tsVector: true }),\n },\n });\n }\n\n unique<\n T extends Column.Pick.Data,\n const Options extends TableData.Index.UniqueColumnArg,\n >(\n this: T,\n ...args: [options?: Options]\n ): T & Column.IsUnique<Options['name'] & string> {\n const a = args as\n | [options?: RecordUnknown]\n | [name: string, options?: RecordUnknown];\n\n return pushColumnData(this, 'indexes', {\n options: {\n ...(typeof a[0] === 'string' ? { ...a[1], name: a[0] } : a[0]),\n unique: true,\n },\n }) as never;\n }\n\n /**\n * Add [EXCLUDE constraint](https://www.postgresql.org/docs/current/sql-createtable.html#SQL-CREATETABLE-EXCLUDE) to the column.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * // exclude rows with overlapping time ranges, && is for the `WITH` operator\n * timeRange: t.type('tstzrange').exclude('&&'),\n * // with a database-level name:\n * timeRange: t.type('tstzrange').exclude('&&', 'no_overlap'),\n * // with options:\n * timeRange: t.type('tstzrange').exclude('&&', { ...options }),\n * // with name and options:\n * name: t.type('tstzrange').exclude('&&', 'no_overlap', { ...options }),\n * }));\n * });\n * ```\n *\n * Possible options are:\n *\n * ```ts\n * interface ExcludeColumnOptions {\n * // specify collation:\n * collate?: string;\n * // see `opclass` in the Postgres document for creating the index\n * opclass?: string;\n * // specify index order such as ASC NULLS FIRST, DESC NULLS LAST\n * order?: string;\n * // algorithm to use such as GIST, GIN\n * using?: string;\n * // EXCLUDE creates an index under the hood, include columns to the index\n * include?: MaybeArray<string>;\n * // see \"storage parameters\" in the Postgres document for creating an index, for example, 'fillfactor = 70'\n * with?: string;\n * // The tablespace in which to create the constraint. If not specified, default_tablespace is consulted, or temp_tablespaces for indexes on temporary tables.\n * tablespace?: string;\n * // WHERE clause to filter records for the constraint\n * where?: string;\n * // for dropping the index at a down migration\n * dropMode?: DropMode;\n * }\n * ```\n */\n exclude<T extends Column.Pick.Data>(\n this: T,\n op: string,\n ...args: [options?: TableData.Exclude.ColumnArg]\n ): T {\n const a = args as\n | [options?: RecordUnknown]\n | [name: string, options?: RecordUnknown];\n\n return pushColumnData(this, 'excludes', {\n with: op,\n options:\n (typeof a[0] === 'string' ? { ...a[1], name: a[0] } : a[0]) ??\n emptyObject,\n });\n }\n\n comment<T extends Column.Pick.Data>(this: T, comment: string): T {\n return setColumnData(this, 'comment', comment);\n }\n\n compression<T extends Column.Pick.Data>(this: T, compression: string): T {\n return setColumnData(this, 'compression', compression);\n }\n\n collate<T extends Column.Pick.Data>(this: T, collate: string): T {\n return setColumnData(this, 'collate', collate);\n }\n\n modifyQuery<T extends Column.Pick.Data>(this: T, cb: (q: Query) => void): T {\n return setColumnData(this, 'modifyQuery', cb);\n }\n\n /**\n * Define a generated column. `generated` accepts a raw SQL.\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('table', (t) => ({\n * two: t.integer().generated`1 + 1`,\n * }));\n * });\n * ```\n *\n * @param args - raw SQL\n */\n generated<T extends Column.Pick.Data>(\n this: T,\n ...args: StaticSQLArgs\n ): Column.Generated<T> {\n const sql = raw(...args);\n const column = setColumnData(this, 'generated', {\n toSQL(ctx, quoted) {\n return sql.toSQL(ctx, quoted);\n },\n\n toCode() {\n let sql = '.generated';\n\n if (Array.isArray(args[0])) {\n sql += templateLiteralSQLToCode(args as TemplateLiteralArgs);\n } else {\n const { raw, values } = args[0] as {\n raw: string;\n values?: RawSQLValues;\n };\n sql += `({ raw: '${raw.replace(/'/g, \"\\\\'\")}'${\n values ? `, values: ${JSON.stringify(values)}` : ''\n } })`;\n }\n\n return sql;\n },\n });\n column.data.readOnly = true;\n return column as never;\n }\n}\n","import { QueryMethods } from './query-methods';\nimport { QueryData } from './query-data';\nimport { QueryBuilder } from './db';\nimport { Column } from '../columns/column';\nimport { WithDataItems } from './basic-features/cte/cte.sql';\nimport { ColumnsShape } from '../columns';\nimport { QueryInternal } from './query-internal';\nimport {\n PickQueryResult,\n PickQueryResultReturnType,\n PickQueryReturnType,\n PickQuerySelectable,\n PickQueryShape,\n PickQueryTable,\n} from './pick-query-types';\nimport { EmptyObject, RecordKeyTrue, RecordUnknown } from '../utils';\nimport {\n RelationsBase,\n RelationsDataForCreateBase,\n RelationsDataForCreateOptionalBase,\n} from './relations';\nimport { QueryError, QueryErrorName } from './errors';\nimport { Expression } from './expressions/expression';\nimport { GetStringArg } from './basic-features/get/get.utils';\nimport { QueryHasWhere } from './basic-features/where/where';\nimport {\n QueryCatch,\n QueryThen,\n QueryThenByQuery,\n QueryThenShallowSimplify,\n QueryThenShallowSimplifyArr,\n QueryThenShallowSimplifyOptional,\n} from './then/then';\nimport { Order as OrderNamespace } from './basic-features/order/order';\nexport type { Rls, RlsPolicy } from './extra-features/rls/rls.db';\nimport { Grant } from './extra-features/grants/grants.db';\n\nexport interface DbExtension {\n name: string;\n version?: string;\n}\n\nexport interface GeneratorIgnore {\n schemas?: string[];\n enums?: string[];\n domains?: string[];\n extensions?: string[];\n tables?: string[];\n /** Regular views to ignore during migration generation. */\n views?: (string | RegExp)[];\n grants?: Grant.Ignore;\n}\n\nexport interface DbDomainArg<ColumnTypes> {\n (columnTypes: ColumnTypes): Column;\n}\n\nexport interface DbDomainArgRecord {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [K: string]: DbDomainArg<any>;\n}\n\nexport type SelectableFromShape<\n Shape extends Column.QueryColumns,\n Table extends string | undefined,\n> = { [K in keyof Shape]: { as: K; column: Shape[K] } } & {\n [K in keyof Shape & string as `${Table}.${K}`]: {\n as: K;\n column: Shape[K];\n };\n};\n\nexport type QueryReturnType =\n | QueryReturnTypeAll\n | 'one'\n | 'oneOrThrow'\n | 'rows'\n | 'pluck'\n | 'value'\n | 'valueOrThrow'\n | 'void';\n\nexport type QueryReturnTypeAll = undefined | 'all';\n\nexport type QueryReturnTypeOptional = 'one' | 'value';\n\nexport interface QueryHasSelect {\n __hasSelect: true;\n}\n\nexport interface IsQuery {\n __isQuery: true;\n}\n\n// affects on typing of `chain`\nexport interface IsSubQuery {\n __subQuery: true;\n}\n\nexport interface IsQueries {\n [K: string]: IsQuery;\n}\n\nexport interface QueryOrExpression<T> {\n result: { value: Column.Pick.QueryColumnOfType<T> };\n}\n\n// query metadata that is stored only on TS side, not available in runtime\nexport interface QuerySelectable {\n [K: PropertyKey]: { as: string; column: Column.Pick.QueryColumn };\n}\n\nexport interface Query\n extends\n IsQuery,\n PickQueryTable,\n PickQueryShape,\n PickQuerySelectable,\n QueryMethods<unknown> {\n __as: string;\n\n // Commented out for TS optimizations purposes:\n // Single relations (belongsTo, hasOne) returns one when subQuery is true, returns many otherwise.\n // It is of type `true | undefined` when is set.\n // __subQuery: boolean;\n // Union of available full text search aliases to use in `headline` and in `order`.\n // __tsQuery?: string;\n\n // return type of `create`, `update`, `delete` depends on whether the query has select\n __hasSelect: boolean;\n // `update` and `delete` require the query to have `where`.\n // Calling `.all()` is also setting `__hasWhere` to true.\n __hasWhere: boolean;\n // Record<string, true> where keys are columns with defaults for `create` to make them optional.\n __defaults: EmptyObject;\n // Used to determine what scopes are available on the table.\n __scopes: EmptyObject;\n // union of columns to select by default or with *\n __defaultSelect: PropertyKey;\n result: Column.QueryColumns;\n withData: WithDataItems;\n baseQuery: Query;\n internal: QueryInternal;\n returnType: QueryReturnType;\n qb: QueryBuilder;\n columnTypes: unknown;\n __inputType: RecordUnknown;\n q: QueryData;\n then: QueryThen<unknown>;\n catch: QueryCatch;\n windows: EmptyObject;\n relations: RelationsBase;\n relationsDataForCreate: RelationsDataForCreateBase;\n relationsDataForCreateOptional: RelationsDataForCreateOptionalBase;\n relationQueries: IsQueries;\n error: new (\n message: string,\n length: number,\n name: QueryErrorName,\n ) => QueryError;\n\n __readOnly: true | undefined;\n __materialized: true | undefined;\n}\n\nexport namespace Query {\n export interface NotReadOnlyQuery extends Query {\n __readOnly: undefined;\n }\n\n export interface MaterializedQuery extends Query {\n __materialized: true;\n }\n\n export namespace Order {\n export type Arg<T extends OrderNamespace.ArgThis> = OrderNamespace.Arg<T>;\n export type Args<T extends OrderNamespace.ArgThis> = OrderNamespace.Args<T>;\n }\n\n export namespace Pick {\n export interface ReturnType {\n returnType: QueryReturnType;\n }\n\n export interface SingleValueResult {\n result: { value: Column.Pick.OutputType };\n returnType: 'value' | 'valueOrThrow';\n }\n\n export interface IsNotReadOnly {\n __readOnly: undefined;\n }\n\n export interface IsMaterialized {\n __materialized: true;\n }\n }\n}\n\nexport type SelectableOfType<T extends PickQuerySelectable, Type> = {\n [K in keyof T['__selectable']]: T['__selectable'][K]['column']['__type'] extends Type | null\n ? K\n : never;\n}[keyof T['__selectable']];\n\nexport type SelectableOrExpressionOfType<\n T extends PickQuerySelectable,\n C extends Column.Pick.Type,\n> =\n | SelectableOfType<T, C['__type']>\n | Expression<Column.Pick.QueryColumnOfType<C['__type'] | null>>;\n\nexport const queryTypeWithLimitOne: RecordKeyTrue = {\n one: true,\n oneOrThrow: true,\n value: true,\n valueOrThrow: true,\n};\n\n// Change the query type to return multiple object records.\n// It wraps the query with `WhereResult` to allow updating and deleting all records when the `all` method is used.\nexport type SetQueryReturnsAll<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'all'\n : K extends 'then'\n ? QueryThenShallowSimplifyArr<ColumnsShape.Output<T['result']>>\n : T[K];\n} & QueryHasWhere;\n\nexport type SetQueryReturnsAllResult<\n T extends PickQueryResult,\n Result extends Column.QueryColumns,\n> = {\n [K in keyof T]: K extends 'returnType'\n ? 'all'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThenShallowSimplifyArr<T['result']>\n : T[K];\n} & QueryHasWhere;\n\nexport type QueryTakeOptional<T extends PickQueryResultReturnType> =\n T['returnType'] extends 'value' | 'pluck' | 'void'\n ? T\n : T['returnType'] extends 'valueOrThrow'\n ? {\n [K in keyof T]: K extends 'returnType'\n ? 'value'\n : K extends 'then'\n ? QueryThen<T['result']['value']['__outputType'] | undefined>\n : T[K];\n }\n : {\n [K in keyof T]: K extends 'returnType'\n ? 'one'\n : K extends 'then'\n ? QueryThenShallowSimplifyOptional<\n ColumnsShape.Output<T['result']>\n >\n : T[K];\n };\n\nexport type QueryManyTakeOptional<T extends PickQueryResultReturnType> = {\n [K in keyof T]: K extends 'returnType'\n ? 'one'\n : K extends 'then'\n ? QueryThenShallowSimplifyOptional<ColumnsShape.Output<T['result']>>\n : T[K];\n};\n\nexport type QueryRequire<T extends PickQueryResultReturnType> =\n T['returnType'] extends QueryReturnTypeAll | 'valueOrThrow' | 'pluck' | 'void'\n ? T\n : T['returnType'] extends 'value'\n ? {\n [K in keyof T]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<\n Exclude<T['result']['value']['__outputType'], undefined>\n >\n : T[K];\n }\n : {\n [K in keyof T]: K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'then'\n ? QueryThenShallowSimplify<ColumnsShape.Output<T['result']>>\n : T[K];\n };\n\nexport type QueryTake<T extends PickQueryResultReturnType> =\n T['returnType'] extends 'valueOrThrow' | 'pluck' | 'void'\n ? T\n : T['returnType'] extends 'value'\n ? {\n [K in keyof T]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<\n Exclude<T['result']['value']['__outputType'], undefined>\n >\n : T[K];\n }\n : {\n [K in keyof T]: K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'then'\n ? QueryThenShallowSimplify<ColumnsShape.Output<T['result']>>\n : T[K];\n };\n\nexport type QueryManyTake<T extends PickQueryResultReturnType> = {\n [K in keyof T]: K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'then'\n ? QueryThenShallowSimplify<ColumnsShape.Output<T['result']>>\n : T[K];\n};\n\nexport type SetQueryReturnsOne<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'then'\n ? QueryThenShallowSimplify<ColumnsShape.Output<T['result']>>\n : T[K];\n};\n\nexport type SetQueryReturnsOneResult<\n T extends PickQueryResult,\n Result extends Column.QueryColumns,\n> = {\n [K in keyof T]: K extends 'returnType'\n ? 'oneOrThrow'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThenShallowSimplify<ColumnsShape.Output<Result>>\n : T[K];\n};\n\nexport type SetQueryReturnsRows<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'rows'\n : K extends 'then'\n ? QueryThen<ColumnsShape.Output<T['result']>[keyof T['result']][][]>\n : T[K];\n};\n\nexport type SetQueryReturnsPluck<\n T extends PickQuerySelectable,\n S extends keyof T['__selectable'] | Expression,\n> = S extends keyof T['__selectable']\n ? {\n [K in keyof T]: K extends '__hasSelect'\n ? true\n : K extends 'result'\n ? {\n pluck: T['__selectable'][S]['column'];\n }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'then'\n ? QueryThen<T['__selectable'][S]['column']['__outputType'][]>\n : T[K];\n }\n : {\n [K in keyof T]: K extends '__hasSelect'\n ? true\n : K extends 'result'\n ? {\n pluck: S extends Expression ? S['result']['value'] : never;\n }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'then'\n ? QueryThen<\n (S extends Expression\n ? S['result']['value']['__outputType']\n : never)[]\n >\n : T[K];\n };\n\nexport type SetValueQueryReturnsPluckColumn<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'result'\n ? { pluck: T['result']['value'] }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'then'\n ? QueryThen<T['result']['value']['__outputType'][]>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsPluckColumnResult<\n T extends PickQueryResult,\n Result extends Column.QueryColumns,\n> = {\n [K in keyof T]: K extends 'result'\n ? { pluck: T['result']['value'] }\n : K extends 'returnType'\n ? 'pluck'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<T['result']['value']['__outputType'][]>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsValueOrThrow<\n T extends PickQuerySelectable,\n Arg extends keyof T['__selectable'],\n> = SetQueryReturnsColumnOrThrow<T, T['__selectable'][Arg]['column']> &\n T['__selectable'][Arg]['column']['operators'];\n\nexport type SetValueQueryReturnsValueOrThrow<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<T['result']['value']['__outputType']>\n : T[K];\n};\n\nexport type SetQueryReturnsValueOptional<\n T extends PickQuerySelectable,\n Arg extends GetStringArg<T>,\n> = SetQueryReturnsColumnOptional<\n T,\n {\n [K in keyof T['__selectable'][Arg]['column']]: K extends '__outputType'\n ? T['__selectable'][Arg]['column'][K] | undefined\n : T['__selectable'][Arg]['column'][K];\n }\n> &\n Omit<T['__selectable'][Arg]['column']['operators'], 'equals' | 'not'> &\n Column.OperatorsNullable<T['__selectable'][Arg]['column']>;\n\nexport type SetQueryReturnsColumnOrThrow<\n T,\n Column extends Column.Pick.OutputType,\n> = {\n [K in keyof T]: K extends 'result'\n ? { value: Column }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<Column['__outputType']>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsColumnOptional<\n T,\n Column extends Column.Pick.OutputType,\n> = {\n [K in keyof T]: K extends 'result'\n ? { value: Column }\n : K extends 'returnType'\n ? 'value'\n : K extends 'then'\n ? QueryThen<Column['__outputType'] | undefined>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsColumn<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'result'\n ? { value: T['result']['pluck'] }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<T['result']['pluck']['__outputType']>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsColumnResult<\n T extends PickQueryResult,\n Result extends Column.QueryColumns,\n> = {\n [K in keyof T]: K extends 'result'\n ? { value: T['result']['pluck'] }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThen<Result['pluck']['__outputType']>\n : T[K];\n} & QueryHasSelect;\n\nexport type SetQueryReturnsRowCount<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'result'\n ? { value: Column.Pick.QueryColumnOfType<number> }\n : K extends 'then'\n ? QueryThen<number>\n : T[K];\n};\n\nexport type SetQueryReturnsRowCountMany<T extends PickQueryResult> = {\n [K in keyof T]: K extends 'returnType'\n ? 'pluck'\n : K extends 'result'\n ? { pluck: Column.Pick.QueryColumnOfType<number> }\n : K extends 'then'\n ? QueryThen<number>\n : T[K];\n};\n\nexport type SetQueryReturnsVoid<T> = {\n [K in keyof T]: K extends 'returnType'\n ? 'void'\n : K extends 'then'\n ? QueryThen<void>\n : T[K];\n};\n\nexport type SetQueryResult<\n T extends PickQueryReturnType,\n Result extends Column.QueryColumns,\n> = {\n [K in keyof T]: K extends 'result'\n ? Result\n : K extends 'then'\n ? QueryThenByQuery<T, Result>\n : T[K];\n};\n\nexport interface ReturnsQueryOrExpression<T> {\n (): QueryOrExpression<T>;\n}\n\nexport interface QueryOrExpressionBooleanOrNullResult {\n result: { value: Column.Pick.QueryColumnOfType<boolean | null> };\n}\n\nexport const isQueryReturnsAll = (q: Query) =>\n !q.q.returnType || q.q.returnType === 'all';\n\nexport const isQuery = (q: unknown): q is IsQuery =>\n !!q && typeof q === 'object' && '__isQuery' in q && q.__isQuery === true;\n","import { Column } from './column';\n\n// method names for numeric columns and JSON types to generate methods' code\nexport const numberMethodNames: (keyof AdditionalNumberData)[] = [\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'step',\n 'int',\n 'finite',\n 'safe',\n];\n\nexport interface AdditionalNumberData {\n lt?: number;\n lte?: number;\n gt?: number;\n gte?: number;\n step?: number;\n int?: boolean;\n finite?: boolean;\n safe?: boolean;\n}\n\n// numeric column and JSON type data for validations\nexport interface BaseNumberData extends Column.Data, AdditionalNumberData {}\n\n// method names for string columns and JSON types to generate methods' code\nexport const stringMethodNames: (keyof AdditionalStringData)[] = [\n 'nonEmpty',\n 'min',\n 'max',\n 'length',\n 'email',\n 'url',\n 'emoji',\n 'uuid',\n 'cuid',\n 'cuid2',\n 'ulid',\n 'regex',\n 'includes',\n 'startsWith',\n 'endsWith',\n 'datetime',\n 'ipv4',\n 'ipv6',\n 'trim',\n 'toLowerCase',\n 'toUpperCase',\n];\n\nexport interface AdditionalStringData {\n min?: number;\n max?: number;\n length?: number;\n email?: boolean;\n url?: boolean;\n emoji?: boolean;\n uuid?: boolean;\n cuid?: boolean;\n cuid2?: boolean;\n ulid?: boolean;\n regex?: RegExp;\n includes?: string;\n startsWith?: string;\n endsWith?: string;\n datetime?: {\n offset?: boolean;\n precision?: number;\n };\n ipv4?: true;\n ipv6?: true;\n nonEmpty?: boolean;\n trim?: boolean;\n toLowerCase?: boolean;\n toUpperCase?: boolean;\n}\n\n// string column and JSON type data for validations\nexport interface StringData extends Column.Data, AdditionalStringData {}\n\n// method names for date columns to generate methods' code\nexport const dateMethodNames: (keyof AdditionalDateData)[] = ['min', 'max'];\n\nexport interface AdditionalDateData {\n min?: Date;\n max?: Date;\n}\n\n// date column data for validations\nexport interface DateColumnData extends Column.Data, AdditionalDateData {}\n\n// method names for array column and JSON type to generate methods' code\nexport const arrayMethodNames: (keyof ArrayMethodsData)[] = [\n 'min',\n 'max',\n 'length',\n 'nonEmpty',\n];\n\n// array column and JSON type data for validations\nexport interface ArrayMethodsData {\n min?: number;\n max?: number;\n length?: number;\n nonEmpty?: boolean;\n}\n\nexport interface ArrayMethodsDataForBaseColumn\n extends Column.Data, ArrayMethodsData {}\n","import { Column, getForeignKeyTableInstance } from './column';\nimport {\n emptyArray,\n emptyObject,\n objectHasValues,\n quoteObjectKey,\n RecordKeyTrue,\n RecordString,\n singleQuote,\n singleQuoteArray,\n toArray,\n toSnakeCase,\n} from '../utils';\nimport { TableData } from '../tableData';\nimport {\n arrayMethodNames,\n ArrayMethodsDataForBaseColumn,\n BaseNumberData,\n DateColumnData,\n dateMethodNames,\n numberMethodNames,\n StringData,\n stringMethodNames,\n} from './column-data-types';\nimport { isRawSQL, rawSqlToCode } from '../query/expressions/raw-sql';\n\n// Type for composing code pieces for the code generation\nexport type Code = string | Codes;\nexport type Codes = Code[];\n\nexport interface ColumnToCodeCtx {\n t: string;\n table: string;\n currentSchema: string;\n migration?: boolean;\n snakeCase?: boolean;\n sql?: string;\n isSqlUsed?: boolean;\n}\n\n/**\n * Push code: this will append a code string to the last code array element when possible.\n * @param code - array of code to push into\n * @param add - code to push\n */\nexport const addCode = (code: Code[], add: Code) => {\n if (typeof add === 'object') {\n code.push(add);\n } else {\n const last = code.length - 1;\n if (typeof code[last] === 'string') {\n code[last] = code[last] + add;\n } else {\n code.push(add);\n }\n }\n};\n\n/**\n * Convert the code item into string.\n *\n * @param code - code item\n * @param tabs - each new line will be prefixed with the tabs. Each element of the code represents a new line\n * @param shift - array elements of the given code will be shifted with this sting\n */\nexport const codeToString = (\n code: Code,\n tabs: string,\n shift: string,\n): string => {\n if (typeof code === 'string') return `${tabs}${code}`;\n\n const lines: string[] = [];\n for (const item of code) {\n if (typeof item === 'string') {\n lines.push(`${tabs}${item}`);\n } else {\n lines.push(codeToString(item, tabs + shift, shift));\n }\n }\n\n return lines.length ? lines.join('\\n') : '';\n};\n\n/**\n * Convert a column default value into code string.\n *\n * @param t - column types variable name\n * @param value - column default\n */\nexport const columnDefaultArgumentToCode = (\n ctx: string | ColumnToCodeCtx,\n value: unknown,\n): string => {\n if (typeof value === 'object' && value && isRawSQL(value)) {\n return rawSqlToCode(value, ctx);\n } else if (typeof value === 'function') {\n return value.toString();\n } else if (typeof value === 'string') {\n return singleQuote(value);\n } else {\n return JSON.stringify(value);\n }\n};\n\n/**\n * Build a function that will generate a code for a specific column type.\n *\n * @param methodNames - array of column method names to convert to code\n * @param skip - allows skipping some methods\n * @param aliases - provide aliases for specific methods\n */\nexport const columnMethodsToCode = <T extends Column.Data>(\n methodNames: (keyof T)[],\n skip?: RecordKeyTrue,\n aliases?: RecordString,\n) => {\n return (\n data: T,\n migration: boolean | undefined,\n skipLocal?: RecordKeyTrue,\n ) => {\n return migration\n ? ''\n : methodNames\n .map((key) =>\n (skipLocal || skip)?.[key as string] ||\n (key === 'min' &&\n (data as { nonEmpty?: boolean }).nonEmpty &&\n (data as { min?: number }).min === 1)\n ? ''\n : columnMethodToCode(data, key, aliases?.[key as string]),\n )\n .join('');\n };\n};\n\n/**\n * Converts a single column method into code\n *\n * @param data - column `data` object that has info about applied methods\n * @param key - name of the method\n * @param name - optional alias for this method\n */\nconst columnMethodToCode = <T extends Column.Data, K extends keyof T>(\n data: T,\n key: K,\n name: string = key as string,\n): string => {\n const param = data[key];\n if (param === undefined) return '';\n\n const error = data.errors?.[key as string];\n\n let params;\n if (typeof param === 'object' && param && param?.constructor === Object) {\n const props: string[] = [];\n for (const key in param) {\n if (key === 'message') continue;\n\n const value = (param as T)[key as keyof T];\n if (value !== undefined) {\n props.push(\n `${key}: ${typeof value === 'string' ? singleQuote(value) : value}`,\n );\n }\n }\n\n if (error) props.push(`message: ${singleQuote(error)}`);\n\n params = props.length ? `{ ${props.join(', ')} }` : '';\n } else {\n params =\n param === true\n ? ''\n : typeof param === 'string'\n ? singleQuote(param)\n : param instanceof Date\n ? `new Date('${param.toISOString()}')`\n : param;\n\n if (error) {\n if (param !== true) params += ', ';\n params += singleQuote(error);\n }\n }\n\n return `.${name}(${params})`;\n};\n\n// Function to encode string column methods\nexport const stringDataToCode =\n columnMethodsToCode<StringData>(stringMethodNames);\n\n// Function to encode numeric column methods.\n// `int` method is skipped because it's defined by the column type itself.\n// Alias `lte` and `gte` to `max` and `min` for readability.\nexport const numberDataToCode = columnMethodsToCode<BaseNumberData>(\n numberMethodNames,\n undefined,\n { lte: 'max', gte: 'min' },\n);\n\n// Function to encode date column methods\nexport const dateDataToCode =\n columnMethodsToCode<DateColumnData>(dateMethodNames);\n// Function to encode array column methods\nexport const arrayDataToCode =\n columnMethodsToCode<ArrayMethodsDataForBaseColumn>(arrayMethodNames);\n\n/**\n * Converts column type and JSON type custom errors into code\n *\n * @param errors - custom error messages\n */\nexport const columnErrorMessagesToCode = (errors: RecordString): Code => {\n const props: Code[] = [];\n\n if (errors.required) {\n props.push(`required: ${singleQuote(errors.required)},`);\n }\n\n if (errors.invalidType) {\n props.push(`invalidType: ${singleQuote(errors.invalidType)},`);\n }\n\n const code: Code[] = [];\n\n if (!props.length) return code;\n\n addCode(code, '.error({');\n code.push(props);\n addCode(code, '})');\n\n return code;\n};\n\nexport const isDefaultTimeStamp = (item: Column.Pick.DataAndDataType) => {\n if (item.dataType !== 'timestamptz') return false;\n\n const def = item.data.default;\n if (!isRawSQL(def)) return false;\n\n return typeof def._sql === 'string' && def._sql.startsWith('now()');\n};\n\nconst combineCodeElements = (input: Code): Code => {\n if (typeof input === 'string') return input;\n\n const output: Code = [];\n let i = -1;\n\n for (const item of input) {\n if (typeof item === 'string') {\n if (typeof output[i] === 'string') {\n output[i] += item;\n } else {\n output[++i] = item;\n }\n } else {\n output[++i] = combineCodeElements(item);\n }\n }\n\n return output;\n};\n\nexport const columnsShapeToCode = (\n ctx: ColumnToCodeCtx,\n shape: Column.Shape.QueryInit,\n): Codes => {\n const hasTimestamps =\n // migration should capture the current `nowSQL`, it can be changed later by user\n !ctx.migration &&\n 'createdAt' in shape &&\n isDefaultTimeStamp(\n shape.createdAt as unknown as Column.Pick.DataAndDataType,\n ) &&\n 'updatedAt' in shape &&\n isDefaultTimeStamp(\n shape.updatedAt as unknown as Column.Pick.DataAndDataType,\n );\n\n const code: Code = [];\n\n for (const key in shape) {\n if (hasTimestamps && (key === 'createdAt' || key === 'updatedAt')) continue;\n\n const column = shape[key];\n const name = column.data.name;\n if (name === key) column.data.name = undefined;\n\n code.push(\n ...combineCodeElements([\n `${quoteObjectKey(key, ctx.snakeCase)}: `,\n ...toArray((shape[key] as Column).toCode(ctx, key)),\n ',',\n ]),\n );\n\n if (name === key) column.data.name = name;\n }\n\n if (hasTimestamps) {\n code.push(`...${ctx.t}.timestamps(),`);\n }\n\n return code;\n};\n\nexport const pushTableDataCode = (code: Codes, ast: TableData): Codes => {\n const lines: Codes[] = [\n ast.primaryKey && [primaryKeyInnerToCode(ast.primaryKey, 't') + ','],\n ...(ast.indexes?.map((x) => indexToCode(x, 't')) || emptyArray),\n ...(ast.excludes?.map((x) => excludeToCode(x, 't')) || emptyArray),\n ...(ast.constraints?.map((x) => constraintToCode(x, 't', true)) ||\n emptyArray),\n ].filter((x): x is string[] => !!x);\n\n if (lines.length > 1) {\n code.push('(t) => [', ...lines, '],');\n } else if (lines[0].length === 1 && typeof lines[0][0] === 'string') {\n code.push('(t) => ' + lines[0][0]);\n } else {\n code.push('(t) => ', lines[0]);\n }\n\n return code;\n};\n\nexport const primaryKeyInnerToCode = (\n primaryKey: TableData.PrimaryKey,\n t: string,\n): string => {\n const name = primaryKey.name;\n\n return `${t}.primaryKey([${primaryKey.columns.map(singleQuote).join(', ')}]${\n name ? `, ${singleQuote(name)}` : ''\n })`;\n};\n\nconst indexOrExcludeToCode =\n <T extends TableData.Index | TableData.Exclude>(\n innerToCode: (item: T, t: string) => Codes,\n ) =>\n (item: T, t: string, prefix?: string) => {\n const code = innerToCode(item, t);\n if (prefix) code[0] = prefix + code[0];\n const last = code[code.length - 1];\n if (typeof last === 'string' && !last.endsWith(',')) addCode(code, ',');\n return code;\n };\n\nexport const indexInnerToCode = (index: TableData.Index, t: string): Codes => {\n const code: Codes = [\n `${t}.${\n index.options.tsVector\n ? 'searchIndex'\n : index.options.unique\n ? 'unique'\n : 'index'\n }(`,\n ];\n\n const columnOptions = ['collate', 'opclass', 'order', 'weight'] as const;\n\n const indexOptionsKeys: (undefined | keyof TableData.Index.Options)[] = [\n index.options.tsVector ? 'unique' : undefined,\n 'name',\n 'using',\n 'nullsNotDistinct',\n 'deferrable',\n 'include',\n 'with',\n 'tablespace',\n 'where',\n 'language',\n 'languageColumn',\n 'dropMode',\n ];\n\n const hasOptions = indexOptionsKeys.some((key) => key && index.options[key]);\n\n const columnsMultiline = index.columns.some((column) => {\n for (const key in column) {\n if (key !== 'column' && column[key as keyof typeof column] !== undefined)\n return true;\n }\n return false;\n });\n\n if (columnsMultiline) {\n const objects: Codes = [];\n\n for (const column of index.columns) {\n const expr = 'expression' in column ? column.expression : column.column;\n\n let hasOptions = false;\n for (const key in column) {\n if (key !== 'column') {\n hasOptions = true;\n }\n }\n\n if (!hasOptions) {\n objects.push(`${singleQuote(expr)},`);\n } else {\n const props: Codes = [\n `${'expression' in column ? 'expression' : 'column'}: ${singleQuote(\n expr,\n )},`,\n ];\n for (const key of columnOptions) {\n const value = column[key];\n if (value !== undefined) {\n props.push(`${key}: ${singleQuote(value)},`);\n }\n }\n\n objects.push('{', props, '},');\n }\n }\n\n code.push(['[', objects, hasOptions ? '],' : ']']);\n } else {\n addCode(\n code,\n `[${index.columns\n .map((it) => singleQuote((it as { column: string }).column))\n .join(', ')}]`,\n );\n }\n\n if (hasOptions) {\n if (columnsMultiline) {\n code.push(['{']);\n } else {\n addCode(code, ', {');\n }\n\n const options: string[] = [];\n for (const key of indexOptionsKeys) {\n if (!key) continue;\n\n const value = index.options[key];\n if (value === null || value === undefined) continue;\n\n options.push(\n `${key}: ${\n Array.isArray(value)\n ? singleQuoteArray(value)\n : typeof value === 'string'\n ? singleQuote(value)\n : value\n },`,\n );\n }\n\n if (columnsMultiline) {\n code.push([options, '},']);\n } else {\n code.push(options);\n addCode(code, '}');\n }\n }\n\n if (columnsMultiline) {\n code.push('),');\n } else {\n addCode(code, ')');\n }\n\n return code;\n};\n\nexport const indexToCode = indexOrExcludeToCode(indexInnerToCode);\n\nexport const excludeInnerToCode = (\n item: TableData.Exclude,\n t: string,\n): Codes => {\n const code: Codes = [`${t}.exclude(`];\n\n const columnOptions = ['collate', 'opclass', 'order', 'with'] as const;\n\n const optionsKeys: (undefined | keyof TableData.Exclude.Options)[] = [\n 'name',\n 'using',\n 'include',\n 'with',\n 'tablespace',\n 'where',\n 'dropMode',\n ];\n\n const hasOptions = optionsKeys.some((key) => key && item.options[key]);\n\n const objects: Codes = [];\n\n for (const column of item.columns) {\n const expr = 'expression' in column ? column.expression : column.column;\n\n const props: Codes = [\n `${'expression' in column ? 'expression' : 'column'}: ${singleQuote(\n expr,\n )},`,\n ];\n for (const key of columnOptions) {\n const value = column[key];\n if (value !== undefined) {\n props.push(`${key}: ${singleQuote(value)},`);\n }\n }\n\n objects.push('{', props, '},');\n }\n\n code.push(['[', objects, hasOptions ? '],' : ']']);\n\n if (hasOptions) {\n code.push(['{']);\n\n const options: string[] = [];\n for (const key of optionsKeys) {\n if (!key) continue;\n\n const value = item.options[key];\n if (value === null || value === undefined) continue;\n\n options.push(\n `${key}: ${\n Array.isArray(value)\n ? singleQuoteArray(value)\n : typeof value === 'string'\n ? singleQuote(value)\n : value\n },`,\n );\n }\n\n code.push([options, '},']);\n }\n\n code.push('),');\n\n return code;\n};\n\nexport const excludeToCode = indexOrExcludeToCode(excludeInnerToCode);\n\nexport const constraintToCode = (\n item: TableData.Constraint,\n t: string,\n m?: boolean,\n prefix?: string,\n ctx?: ColumnToCodeCtx,\n): Codes => {\n const code = constraintInnerToCode(item, t, m, ctx);\n if (prefix) code[0] = prefix + code[0];\n const last = code[code.length - 1];\n if (typeof last === 'string' && !last.endsWith(','))\n code[code.length - 1] += ',';\n return code;\n};\n\nexport const constraintInnerToCode = (\n item: TableData.Constraint,\n t: string,\n m?: boolean,\n ctx?: ColumnToCodeCtx,\n): Codes => {\n if (item.references) {\n return [\n `${t}.foreignKey(`,\n referencesArgsToCode(item.references, item.name, m),\n '),',\n ];\n }\n\n return [\n `${t}.check(${rawSqlToCode(item.check as TableData.Check, ctx ?? t)}${\n item.name ? `, ${singleQuote(item.name)}` : ''\n })`,\n ];\n};\n\nexport const referencesArgsToCode = (\n {\n columns,\n fnOrTable,\n foreignColumns,\n options,\n }: Exclude<TableData.Constraint['references'], undefined>,\n name: string | false = options?.name || false,\n m?: boolean,\n): Codes => {\n const args: Codes = [];\n\n args.push(`${singleQuoteArray(columns)},`);\n\n if (m && typeof fnOrTable !== 'string') {\n const { schema, table } = getForeignKeyTableInstance(fnOrTable());\n fnOrTable = schema ? `${schema}.${table}` : table;\n }\n\n args.push(\n `${\n typeof fnOrTable === 'string'\n ? singleQuote(fnOrTable)\n : fnOrTable.toString()\n },`,\n );\n\n args.push(`${singleQuoteArray(foreignColumns)},`);\n\n if (objectHasValues(options) || name) {\n const lines: string[] = [];\n if (name) lines.push(`name: ${singleQuote(name)},`);\n for (const key in options) {\n if (key === 'name') continue;\n const value = options[key as keyof typeof options];\n if (value) lines.push(`${key}: ${singleQuote(value)},`);\n }\n args.push('{', lines, '},');\n }\n\n return args;\n};\n\nexport const columnForeignKeysToCode = (\n foreignKeys: TableData.ColumnReferences[],\n migration: boolean | undefined,\n): Codes => {\n const code: Codes = [];\n for (const foreignKey of foreignKeys) {\n addCode(code, `.foreignKey(`);\n for (const part of foreignKeyArgumentToCode(foreignKey, migration)) {\n addCode(code, part);\n }\n addCode(code, ')');\n }\n return code;\n};\n\nexport const foreignKeyArgumentToCode = (\n {\n fnOrTable,\n foreignColumns,\n options = emptyObject,\n }: TableData.ColumnReferences,\n migration: boolean | undefined,\n): Codes => {\n const code: Code = [];\n\n if (migration && typeof fnOrTable !== 'string') {\n const { schema, table } = getForeignKeyTableInstance(fnOrTable());\n fnOrTable = schema ? `${schema}.${table}` : table;\n }\n\n code.push(\n typeof fnOrTable === 'string'\n ? singleQuote(fnOrTable)\n : fnOrTable.toString(),\n );\n\n addCode(code, `, ${singleQuote(foreignColumns[0])}`);\n\n const hasOptions =\n options.name || options.match || options.onUpdate || options.onDelete;\n\n if (hasOptions) {\n const arr: string[] = [];\n\n if (options.name) arr.push(`name: ${singleQuote(options.name)},`);\n if (options.match) arr.push(`match: ${singleQuote(options.match)},`);\n if (options.onUpdate)\n arr.push(`onUpdate: ${singleQuote(options.onUpdate)},`);\n if (options.onDelete)\n arr.push(`onDelete: ${singleQuote(options.onDelete)},`);\n\n addCode(code, ', {');\n code.push(arr);\n addCode(code, '}');\n }\n\n return code;\n};\n\nexport const columnIndexesToCode = (\n items: Exclude<Column.Data['indexes'], undefined>,\n): Codes => {\n const code: Codes = [];\n for (const { options } of items) {\n addCode(code, `.${options.unique ? 'unique' : 'index'}(`);\n\n const arr = [\n options.name && `name: ${singleQuote(options.name)},`,\n options.collate && `collate: ${singleQuote(options.collate)},`,\n options.opclass && `opclass: ${singleQuote(options.opclass)},`,\n options.order && `order: ${singleQuote(options.order)},`,\n options.using && `using: ${singleQuote(options.using)},`,\n options.include &&\n `include: ${\n typeof options.include === 'string'\n ? singleQuote(options.include)\n : `[${options.include.map(singleQuote).join(', ')}]`\n },`,\n options.nullsNotDistinct && `nullsNotDistinct: true,`,\n options.deferrable && `deferrable: ${singleQuote(options.deferrable)},`,\n options.with && `with: ${singleQuote(options.with)},`,\n options.tablespace && `tablespace: ${singleQuote(options.tablespace)},`,\n options.where && `where: ${singleQuote(options.where)},`,\n ].filter((x): x is string => !!x);\n\n if (arr.length) {\n addCode(code, '{');\n addCode(code, arr);\n addCode(code, '}');\n }\n\n addCode(code, ')');\n }\n return code;\n};\n\nexport const columnExcludesToCode = (\n items: Exclude<Column.Data['excludes'], undefined>,\n): Codes => {\n const code: Codes = [];\n for (const { options, with: w } of items) {\n addCode(code, `.exclude('${w}'`);\n\n const arr = [\n options.name && `name: ${singleQuote(options.name)},`,\n options.collate && `collate: ${singleQuote(options.collate)},`,\n options.opclass && `opclass: ${singleQuote(options.opclass)},`,\n options.order && `order: ${singleQuote(options.order)},`,\n options.using && `using: ${singleQuote(options.using)},`,\n options.include &&\n `include: ${\n typeof options.include === 'string'\n ? singleQuote(options.include)\n : `[${options.include.map(singleQuote).join(', ')}]`\n },`,\n options.with && `with: ${singleQuote(options.with)},`,\n options.tablespace && `tablespace: ${singleQuote(options.tablespace)},`,\n options.where && `where: ${singleQuote(options.where)},`,\n ].filter((x): x is string => !!x);\n\n if (arr.length) {\n addCode(code, ', {');\n addCode(code, arr);\n addCode(code, '}');\n }\n\n addCode(code, ')');\n }\n return code;\n};\n\nexport const columnCheckToCode = (\n ctx: ColumnToCodeCtx,\n checks: Column.Data.Check[],\n): string => {\n return checks\n .map(\n ({ sql, name }) =>\n `.check(${rawSqlToCode(sql, ctx)}${name ? `, '${name}'` : ''})`,\n )\n .join('');\n};\n\nexport const identityToCode = (\n identity: TableData.Identity,\n dataType?: string,\n) => {\n const code: Codes = [];\n\n if (dataType === 'integer') {\n code.push(`identity(`);\n } else {\n code.push(`${dataType}().identity(`);\n }\n\n const props: string[] = [];\n if (identity.always) props.push(`always: true,`);\n if (identity.increment && identity.increment !== 1)\n props.push(`increment: ${identity.increment},`);\n if (identity.start && identity.start !== 1)\n props.push(`start: ${identity.start},`);\n if (identity.min) props.push(`min: ${identity.min},`);\n if (identity.max) props.push(`max: ${identity.max},`);\n if (identity.cache && identity.cache !== 1)\n props.push(`cache: ${identity.cache},`);\n if (identity.cycle) props.push(`cycle: true,`);\n\n if (props.length) {\n addCode(code, '{');\n code.push(props, '}');\n }\n\n addCode(code, ')');\n\n return code;\n};\n\nexport const columnCode = (\n type: Column,\n ctx: ColumnToCodeCtx,\n key: string,\n code: Code,\n): Code => {\n const { data } = type;\n\n code = toArray(code);\n\n let prepend = `${ctx.t}.`;\n const keyName = ctx.snakeCase ? toSnakeCase(key) : key;\n const name = data.name ?? keyName;\n if (name !== keyName) {\n prepend += `name(${singleQuote(name)}).`;\n }\n\n if (typeof code[0] === 'string') {\n code[0] = `${prepend}${code[0]}`;\n } else {\n code[0].unshift(prepend);\n }\n\n if (data.generated) {\n addCode(code, data.generated.toCode());\n }\n\n if (data.primaryKey) {\n addCode(\n code,\n `.primaryKey(${\n data.primaryKey === (true as never) ? '' : singleQuote(data.primaryKey)\n })`,\n );\n }\n\n if (data.foreignKeys) {\n for (const part of columnForeignKeysToCode(\n data.foreignKeys,\n ctx.migration,\n )) {\n addCode(code, part);\n }\n }\n\n if (data.explicitSelect) addCode(code, '.select(false)');\n\n if (data.isNullable) addCode(code, '.nullable()');\n\n if (data.as && !ctx.migration) {\n addCode(code, `.as(${(data.as as Column).toCode(ctx, key)})`);\n }\n\n if (\n data.default !== undefined &&\n data.default !== data.defaultDefault &&\n (!ctx.migration || typeof data.default !== 'function')\n ) {\n addCode(\n code,\n `.default(${columnDefaultArgumentToCode(ctx, data.default)})`,\n );\n }\n\n if (data.indexes) {\n for (const part of columnIndexesToCode(data.indexes)) {\n addCode(code, part);\n }\n }\n\n if (data.excludes) {\n for (const part of columnExcludesToCode(data.excludes)) {\n addCode(code, part);\n }\n }\n\n if (data.comment) addCode(code, `.comment(${singleQuote(data.comment)})`);\n\n if (data.checks) {\n addCode(code, columnCheckToCode(ctx, data.checks));\n }\n\n if (data.errors) {\n for (const part of columnErrorMessagesToCode(data.errors)) {\n addCode(code, part);\n }\n }\n\n const { validationDefault } = data;\n if (validationDefault) {\n addCode(\n code,\n `.validationDefault(${\n typeof validationDefault === 'function'\n ? validationDefault.toString()\n : typeof validationDefault === 'string'\n ? singleQuote(validationDefault)\n : JSON.stringify(validationDefault)\n })`,\n );\n }\n\n if (data.compression)\n addCode(code, `.compression(${singleQuote(data.compression)})`);\n\n if (data.collate) addCode(code, `.collate(${singleQuote(data.collate)})`);\n\n if (data.modifyQuery && !ctx.migration)\n addCode(code, `.modifyQuery(${data.modifyQuery.toString()})`);\n\n return code.length === 1 && typeof code[0] === 'string' ? code[0] : code;\n};\n","import {\n FnUnknownToUnknown,\n MaybePromise,\n setObjectValueImmutable,\n} from '../../utils';\nimport { HookSelect } from '../basic-features/select/hook-select';\nimport { Query, QueryReturnType } from '../query';\nimport { Column } from '../../columns';\nimport { PickQueryQ } from '../pick-query-types';\nimport { Expression } from '../expressions/expression';\n\nexport interface PickQueryDataParsers {\n // column parsers that are applied by default, when not selecting anything\n defaultParsers?: ColumnsParsers;\n // parsers added for selected items\n parsers?: ColumnsParsers;\n // parsers for nested records\n batchParsers?: BatchParsers;\n}\n\n// function to parse a single column after loading the data\nexport type ColumnParser = FnUnknownToUnknown;\n\nexport interface BatchParserPathEntry {\n key: string;\n returnType: QueryReturnType;\n}\n\n// To parse all returned rows. Unlike column parser, can return a promise.\nexport interface BatchParser {\n path: BatchParserPathEntry[];\n fn: (\n path: BatchParserPathEntry[],\n queryResult: { rows: unknown[] },\n ) => MaybePromise<void>;\n}\n\n// set of value parsers\n// key is a name of a selected column,\n// 'v' is a special name for a single-value queries parser\nexport type ColumnsParsers = { [K in string]?: ColumnParser };\n\n// set of batch parsers\n// is only triggered when loading all,\n// or when using `hookSelect` or computed columns that convert response to `all` internally.\n// key is a name of a selected column\nexport type BatchParsers = BatchParser[];\n\n/**\n * generic utility to add a parser to the query object\n * @param query - the query object, it will be mutated\n * @param key - the name of the column in the data loaded by the query\n * @param parser - function to process the value of the column with.\n */\nexport const setParserToQuery = (\n query: { parsers?: ColumnsParsers },\n key: string,\n parser?: ColumnParser,\n) => {\n if (parser) {\n if (query.parsers) query.parsers[key] = parser;\n else query.parsers = { [key]: parser };\n } else if (query.parsers) {\n delete query.parsers[key];\n }\n};\n\n/**\n * similar to setParserToQuery,\n * but if the parser for the column is already set,\n * this will wrap it with HOC to additionally parse with a provided function\n * @param query - the query object, it will be mutated\n * @param key - the name of the column in the data loaded by the query\n * @param parser - function to process the value of the column with.\n */\nexport const overrideParserInQuery = (\n query: { parsers?: ColumnsParsers },\n key: string,\n parser: ColumnParser,\n) => {\n if (query.parsers) {\n const existing = query.parsers[key];\n query.parsers[key] = existing\n ? (value: unknown) => parser(existing(value))\n : parser;\n } else query.parsers = { [key]: parser } as ColumnsParsers;\n};\n\nexport const getQueryParsers = (q: Query, hookSelect?: HookSelect) => {\n if (hookSelect) {\n const parsers = { ...q.q.parsers };\n const { defaultParsers } = q.q;\n if (defaultParsers) {\n for (const [key, value] of hookSelect) {\n const parser = defaultParsers[key];\n if (parser) {\n parsers[value.as || key] = parser;\n }\n }\n }\n return parsers;\n }\n\n return q.q.select ? q.q.parsers : q.q.defaultParsers;\n};\n\nexport const addColumnParserToQuery = (\n q: { parsers?: ColumnsParsers },\n key: string,\n column: Column.Pick.QueryColumn,\n) => {\n if ((column as Column)._parse) {\n setObjectValueImmutable(q, 'parsers', key, (column as Column)._parse);\n }\n};\n\nexport const setValueParserToQuery = (\n q: { parsers?: ColumnsParsers },\n column: Column.Pick.QueryColumn,\n) => {\n addColumnParserToQuery(q, 'v', column);\n};\n\nexport const getValueParser = (parsers?: ColumnsParsers) => {\n return parsers?.v;\n};\n\nexport const setValueParser = (\n q: PickQueryDataParsers,\n parser: ColumnParser | undefined,\n) => {\n setObjectValueImmutable(q, 'parsers', 'v', parser);\n};\n\n// export const setValueParserForSelectedString = (\n// query: PickQueryQAndInternal,\n// arg: string,\n// as: string | undefined,\n// ) => setParserForSelectedString(query, arg, as, 'v');\n\n// add a parser for a raw expression column\n// is used by .select and .get methods\nexport const addParserForRawExpression = (\n q: PickQueryQ,\n key: string,\n raw: Expression,\n) => {\n if (raw.result.value) addColumnParserToQuery(q.q, key, raw.result.value);\n};\n","import { singleQuote } from '../../utils';\nimport { Column, setColumnData } from '../column';\nimport { Code, columnCode, ColumnToCodeCtx } from '../code';\nimport { Operators } from '../operators';\nimport { ColumnSchemaConfig } from '../column-schema';\n\n// for a user-defined type, or for unsupported yet type from some module\nexport class CustomTypeColumn<\n Schema extends ColumnSchemaConfig,\n> extends Column {\n declare __schema: Schema;\n operators = Operators.any;\n declare __type: unknown;\n declare __inputType: unknown;\n declare inputSchema: ReturnType<Schema['unknown']>;\n declare __outputType: unknown;\n declare outputSchema: ReturnType<Schema['unknown']>;\n declare __queryType: unknown;\n declare querySchema: ReturnType<Schema['unknown']>;\n declare data: Column.Data;\n public dataType: string;\n\n constructor(\n schema: Schema,\n public typeName: string,\n public typeSchema?: string,\n extension?: string,\n ) {\n super(\n schema,\n schema.unknown() as never,\n schema.unknown() as never,\n schema.unknown() as never,\n );\n this.dataType = typeSchema ? typeSchema + '.' + typeName : typeName;\n this.data.isOfCustomType = true;\n this.data.extension = extension;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const {\n dataType,\n data: { typmod },\n } = this;\n\n return columnCode(\n this,\n ctx,\n key,\n `type(${singleQuote(\n (dataType.startsWith(ctx.currentSchema)\n ? dataType.slice(ctx.currentSchema.length + 1)\n : dataType) +\n (typmod !== undefined && typmod !== -1 && !dataType.includes('(')\n ? `(${typmod})`\n : ''),\n )})`,\n );\n }\n\n as<\n T extends {\n __inputType: unknown;\n __outputType: unknown;\n data: Column.Data;\n },\n C extends {\n __inputType: T['__inputType'];\n __outputType: T['__outputType'];\n },\n >(this: T, column: C): C {\n const c = column as unknown as Column.Pick.TypeSchemas;\n const extended = setColumnData(\n this,\n 'as',\n column as unknown as T['data']['as'],\n ) as unknown as Column.Pick.TypeSchemas;\n\n extended.inputSchema = c.inputSchema;\n extended.outputSchema = c.outputSchema;\n extended.querySchema = c.querySchema;\n\n return extended as never;\n }\n}\n\n// domain column type: https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-user-defined-data-types/\nexport class DomainColumn<\n Schema extends ColumnSchemaConfig,\n> extends CustomTypeColumn<Schema> {\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `domain(${singleQuote(this.dataType)})`);\n }\n}\n","import { Column } from '../column';\nimport { columnCode, ColumnToCodeCtx } from '../code';\nimport { Code } from '../code';\nimport { Operators } from '../operators';\nimport { ColumnTypeSchemaArg } from '../column-schema';\n\nexport class EnumColumn<\n Schema extends ColumnTypeSchemaArg,\n SchemaType extends Schema['__schemaType'],\n const T extends readonly string[],\n> extends Column {\n declare __schema: Schema;\n operators = Operators.ordinalText;\n declare __type: T[number];\n declare __inputType: T[number];\n declare inputSchema: SchemaType;\n declare __outputType: T[number];\n declare outputSchema: SchemaType;\n declare __queryType: T[number];\n declare querySchema: SchemaType;\n dataType = 'enum';\n\n constructor(\n schema: Schema,\n public enumName: string,\n public options: T,\n schemaType: SchemaType,\n ) {\n super(schema, schemaType);\n this.inputSchema = this.outputSchema = this.querySchema = schemaType;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const options = ctx.migration\n ? ''\n : `, [${this.options.map((option) => `'${option}'`).join(', ')}]`;\n return columnCode(this, ctx, key, `enum('${this.enumName}'${options})`);\n }\n\n toSQL() {\n const name = this.enumName;\n const index = name.indexOf('.');\n return `\"${\n index === -1 ? name : `${name.slice(0, index)}\".\"${name.slice(index + 1)}`\n }\"`;\n }\n}\n","import { Column } from './column';\nimport { DomainColumn } from './column-types/custom-type';\nimport { EnumColumn } from './column-types/enum';\n\nexport interface DbStructureDomainsMap {\n [K: string]: Column;\n}\n\nexport const setColumnDefaultParse = (\n column: Column.Pick.Data,\n parse: (input: any) => unknown, // eslint-disable-line @typescript-eslint/no-explicit-any\n) => {\n column.data.parse = parse;\n (column as Column)._parse = (input: unknown) =>\n input === null ? null : parse(input);\n};\n\nexport const setColumnParse = (\n column: Column.Pick.Data,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fn: (input: any) => unknown,\n outputSchema?: unknown,\n) => {\n const c = Object.create(column);\n c.outputSchema = outputSchema;\n c.data = { ...column.data, parse: fn };\n\n const { parseNull } = column.data;\n c._parse = parseNull\n ? (input: unknown) => (input === null ? parseNull() : fn(input))\n : (input: unknown) => (input === null ? null : fn(input));\n\n return c;\n};\n\nexport const setColumnParseNull = (\n column: Column.Pick.Data,\n //\n fn: () => unknown,\n nullSchema?: unknown,\n) => {\n const c = Object.create(column);\n c.nullSchema = nullSchema;\n c.data = { ...column.data, parseNull: fn };\n\n const { parse } = column.data;\n c._parse = parse\n ? (input: unknown) => (input === null ? fn() : parse(input))\n : (input: unknown) => (input === null ? fn() : input);\n\n return c;\n};\n\nexport const setColumnDefaultEncode = (\n column: Column.Pick.Data,\n fn: (input: any) => unknown, // eslint-disable-line @typescript-eslint/no-explicit-any\n) => {\n column.data.encode = fn;\n};\n\nexport const setColumnEncode = (\n column: Column.Pick.Data,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fn: (input: any) => unknown,\n inputSchema?: unknown,\n) => {\n const c = Object.create(column);\n c.inputSchema = inputSchema;\n c.data = { ...column.data, encode: fn };\n return c;\n};\n\nexport const getColumnBaseType = (\n column: Column.Pick.Data,\n domainsMap: DbStructureDomainsMap,\n type: string,\n) => {\n return column instanceof EnumColumn\n ? 'text'\n : column instanceof DomainColumn\n ? domainsMap[column.dataType]?.dataType\n : type;\n};\n","import { Column } from '../column';\nimport { joinTruthy } from '../../utils';\nimport { Code, ColumnToCodeCtx, dateDataToCode } from '../code';\nimport { columnCode } from '../code';\nimport { Operators } from '../operators';\nimport { DateColumnData } from '../column-data-types';\nimport { ColumnSchemaConfig } from '../column-schema';\nimport { PostgresInterval } from '../../adapters/driver-adapter-shared';\nimport { setColumnDefaultParse } from '../column.utils';\n\nexport type DateColumnInput = string | number | Date;\n\nconst dateToString = (value: Date): string => value.toISOString();\n\n// encode string, number, or Date to a Date object,\nconst dateTimeEncode = (value: DateColumnInput) => {\n return typeof value === 'number' ? new Date(value) : value;\n};\n\n// In Bun, it is Date normally, but string in case of nested json\nconst parseStringOrDateToNumber = (value: unknown): number =>\n typeof value === 'string' ? Date.parse(value) : (value as Date).getTime();\n\nexport const getDateAsNumberFn = (column: {\n data: Column.Data;\n dateParsedByDriver?: boolean;\n}) =>\n column.dateParsedByDriver\n ? parseStringOrDateToNumber\n : (Date.parse as (input: unknown) => number);\n\n// parse a date string to date object, with respect to null\nconst parseDateToDate = (value: unknown): Date => new Date(value as string);\n\n// In Bun, it is Date normally, but string in case of nested json\nconst parseStringOrDateToDate = (value: unknown): Date =>\n typeof value === 'string' ? new Date(value) : (value as Date);\n\nexport const getDateAsDateFn = (column: {\n data: Column.Data;\n dateParsedByDriver?: boolean;\n}) => (column.dateParsedByDriver ? parseStringOrDateToDate : parseDateToDate);\n\n// common class for Date and DateTime columns\nexport abstract class DateBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends Column {\n declare __schema: Schema;\n declare __type: string;\n declare __inputType: DateColumnInput;\n declare inputSchema: ReturnType<Schema['stringNumberDate']>;\n declare data: DateColumnData;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: DateColumnInput;\n declare querySchema: ReturnType<Schema['stringNumberDate']>;\n operators = Operators.date;\n asNumber: Schema['dateAsNumber'];\n asDate: Schema['dateAsDate'];\n\n constructor(\n schema: Schema,\n public dateParsedByDriver?: boolean,\n ) {\n super(\n schema,\n schema.stringNumberDate() as never,\n schema.stringSchema() as never,\n schema.stringNumberDate() as never,\n );\n if (dateParsedByDriver) {\n this._parse = dateToString as never;\n }\n this.asNumber = schema.dateAsNumber;\n this.asDate = schema.dateAsDate;\n this.data.encode = dateTimeEncode;\n }\n}\n\n// date\t4 bytes\tdate (no time of day)\t4713 BC\t5874897 AD 1 day\nexport class DateColumn<\n Schema extends ColumnSchemaConfig,\n> extends DateBaseColumn<Schema> {\n dataType = 'date' as const;\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(\n this,\n ctx,\n key,\n `date()${dateDataToCode(this.data, ctx.migration)}`,\n );\n }\n}\n\nexport abstract class DateTimeBaseClass<\n Schema extends ColumnSchemaConfig,\n> extends DateBaseColumn<Schema> {\n declare data: DateColumnData & { dateTimePrecision?: number };\n\n constructor(\n schema: Schema,\n dateTimePrecision?: number,\n dateParsedByDriver?: boolean,\n ) {\n super(schema, dateParsedByDriver);\n this.data.dateTimePrecision = dateTimePrecision;\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.dateTimePrecision !== undefined &&\n `(${this.data.dateTimePrecision})`,\n );\n }\n}\n\nexport abstract class DateTimeTzBaseClass<\n Schema extends ColumnSchemaConfig,\n> extends DateTimeBaseClass<Schema> {\n abstract baseDataType: string;\n\n toSQL() {\n return joinTruthy(\n this.baseDataType,\n this.data.dateTimePrecision !== undefined &&\n `(${this.data.dateTimePrecision})`,\n ' with time zone',\n );\n }\n}\n\nconst timestampToCode = (\n self:\n | TimestampColumn<ColumnSchemaConfig>\n | TimestampTZColumn<ColumnSchemaConfig>,\n ctx: ColumnToCodeCtx,\n key: string,\n) => {\n const { dateTimePrecision: p } = self.data;\n\n const { defaultTimestamp } = self.data;\n // migrations should capture the current `nowSQL`, it can be changed by user later.\n if (!ctx.migration && defaultTimestamp) {\n const noTz = self instanceof TimestampColumn ? 'NoTZ' : '';\n\n const def = self.data.default;\n const modifyQuery = self.data.modifyQuery;\n self.data.default = undefined;\n self.data.modifyQuery = undefined;\n\n const code = columnCode(\n self,\n ctx,\n key,\n `timestamps${noTz}(${\n p && p !== 6 ? p : ''\n }).${defaultTimestamp}${dateDataToCode(self.data, ctx.migration)}`,\n );\n\n self.data.default = def;\n self.data.modifyQuery = modifyQuery;\n\n return code;\n } else {\n return columnCode(\n self,\n ctx,\n key,\n `${self instanceof TimestampColumn ? 'timestampNoTZ' : 'timestamp'}(${\n p && p !== 6 ? p : ''\n })${dateDataToCode(self.data, ctx.migration)}`,\n );\n }\n};\n\n// timestamp [ (p) ] [ without time zone ]\t8 bytes\tboth date and time (no time zone)\t4713 BC\t294276 AD\t1 microsecond\nexport class TimestampColumn<\n Schema extends ColumnSchemaConfig,\n> extends DateTimeBaseClass<Schema> {\n dataType = 'timestamp' as const;\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return timestampToCode(this, ctx, key);\n }\n}\n\n// timestamp [ (p) ] with time zone\t8 bytes\tboth date and time, with time zone\t4713 BC\t294276 AD\t1 microsecond\nexport class TimestampTZColumn<\n Schema extends ColumnSchemaConfig,\n> extends DateTimeTzBaseClass<Schema> {\n dataType = 'timestamptz' as const;\n baseDataType = 'timestamp' as const;\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return timestampToCode(this, ctx, key);\n }\n}\n\n// time [ (p) ] [ without time zone ]\t8 bytes\ttime of day (no date)\t00:00:00\t24:00:00\t1 microsecond\nexport class TimeColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n declare __type: string;\n declare __inputType: ReturnType<Schema['stringSchema']>;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare data: DateColumnData & { dateTimePrecision?: number };\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n dataType = 'time' as const;\n operators = Operators.time;\n\n constructor(schema: Schema, dateTimePrecision?: number) {\n super(schema, schema.stringSchema() as never);\n this.data.dateTimePrecision = dateTimePrecision;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { dateTimePrecision } = this.data;\n return columnCode(\n this,\n ctx,\n key,\n `time(${dateTimePrecision || ''})${dateDataToCode(\n this.data,\n ctx.migration,\n )}`,\n );\n }\n}\n\nconst addIntervalPart = (\n parts: string[],\n value: number | undefined,\n unit: string,\n) => {\n if (value) {\n parts.push(`${value} ${unit}`);\n }\n};\n\nconst serializePostgresInterval = (\n input: Partial<PostgresInterval>,\n): string => {\n const parts: string[] = [];\n\n addIntervalPart(parts, input.years, 'years');\n addIntervalPart(parts, input.months, 'months');\n addIntervalPart(parts, input.days, 'days');\n addIntervalPart(parts, input.hours, 'hours');\n addIntervalPart(parts, input.minutes, 'minutes');\n addIntervalPart(parts, input.seconds, 'seconds');\n addIntervalPart(parts, input.milliseconds, 'milliseconds');\n\n return parts.length ? parts.join(' ') : '0 seconds';\n};\n\n// interval [ fields ] [ (p) ]\t16 bytes\ttime interval\t-178000000 years\t178000000 years\t1 microsecond\nexport class IntervalColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n declare __type: PostgresInterval;\n declare data: Column.Data & { fields?: string; precision?: number };\n declare __inputType: Partial<PostgresInterval>;\n declare inputSchema: ReturnType<Schema['timeInterval']>;\n declare __outputType: PostgresInterval;\n declare outputSchema: ReturnType<Schema['timeInterval']>;\n declare __queryType: PostgresInterval;\n declare querySchema: ReturnType<Schema['timeInterval']>;\n dataType = 'interval' as const;\n operators = Operators.date;\n\n constructor(\n schema: Schema,\n fields?: string,\n precision?: number,\n parse?: (input: string) => PostgresInterval,\n ) {\n super(schema, schema.timeInterval() as never);\n this.data.fields = fields;\n this.data.precision = precision;\n if (parse) {\n setColumnDefaultParse(this, parse);\n }\n this.data.encode = serializePostgresInterval;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { fields, precision } = this.data;\n return columnCode(\n this,\n ctx,\n key,\n `interval(${[fields && `'${fields}'`, precision && String(precision)]\n .filter((part) => part)\n .join(', ')})`,\n );\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.fields && ` ${this.data.fields}`,\n this.data.precision !== undefined && ` (${this.data.precision})`,\n );\n }\n}\n","import { Column } from '../column';\nimport {\n addCode,\n Code,\n arrayDataToCode,\n Codes,\n ColumnToCodeCtx,\n} from '../code';\nimport { columnCode } from '../code';\nimport { Operators, OperatorsArray } from '../operators';\nimport { setColumnDefaultEncode } from '../column.utils';\nimport { ArrayMethodsData } from '../column-data-types';\nimport { ColumnSchemaConfig, ColumnTypeSchemaArg } from '../column-schema';\n\nexport interface ArrayColumnValue {\n __type: unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n inputSchema: any;\n __inputType: unknown;\n __outputType: unknown;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n outputSchema: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n __queryType: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n querySchema: any;\n toSQL(): string;\n toCode(ctx: ColumnToCodeCtx, key: string): Code;\n data: Column.Data;\n}\n\nexport interface ArrayData<Item extends ArrayColumnValue>\n extends Column.Data, ArrayMethodsData {\n item: Item;\n arrayDims: number;\n}\n\nexport class ArrayColumn<\n Schema extends ColumnTypeSchemaArg,\n Item extends ArrayColumnValue,\n InputType,\n OutputType,\n QueryType,\n> extends Column {\n declare __schema: Schema;\n dataType = 'array' as const;\n operators = Operators.array as OperatorsArray<Item['__queryType']>;\n declare data: ArrayData<Item>;\n declare __type: Item['__type'][];\n declare __inputType: Item['__type'][];\n declare inputSchema: InputType;\n declare __outputType: Item['__outputType'][];\n declare outputSchema: OutputType;\n declare __queryType: Item['__queryType'][];\n declare querySchema: QueryType;\n\n constructor(\n schema: Schema,\n item: Item,\n __inputType: InputType,\n defaultEncode?: (input: unknown) => unknown,\n __outputType?: OutputType,\n __queryType?: QueryType,\n ) {\n super(schema, __inputType, __outputType, __queryType);\n\n // array items cannot be non-nullable, postgres limitation\n item.data.isNullable = true;\n\n if (defaultEncode) {\n setColumnDefaultEncode(this, defaultEncode);\n }\n\n this.data.item = item instanceof ArrayColumn ? item.data.item : item;\n this.data.name = item.data.name;\n this.data.arrayDims =\n item instanceof ArrayColumn ? item.data.arrayDims + 1 : 1;\n }\n\n toSQL(): string {\n return this.data.item.toSQL() + '[]'.repeat(this.data.arrayDims);\n }\n\n toCode(\n this: ArrayColumn<\n ColumnSchemaConfig,\n ArrayColumnValue,\n unknown,\n unknown,\n unknown\n >,\n ctx: ColumnToCodeCtx,\n key: string,\n ): Code {\n let open = 'array(';\n let close = ')';\n for (let i = 1; i < this.data.arrayDims; i++) {\n open += `${ctx.t}.array(`;\n close += ')';\n }\n\n const code: Codes = [open];\n\n const { item } = this.data;\n const clonedItem = Object.create(item);\n const { isNullable: _, ...dataWithoutNullable } = item.data;\n clonedItem.data = dataWithoutNullable;\n addCode(code, clonedItem.toCode(ctx, key));\n\n addCode(code, `${close}${arrayDataToCode(this.data, ctx.migration)}`);\n return columnCode(this, ctx, key, code);\n }\n}\n","import { Column } from '../column';\nimport { columnCode, ColumnToCodeCtx } from '../code';\nimport { Operators } from '../operators';\nimport { Code } from '../code';\nimport {\n DefaultSchemaConfig,\n internalSchemaConfig,\n} from '../default-schema-config';\nimport { ColumnTypeSchemaArg } from '../column-schema';\n\nexport const encodeJson = (x: unknown) => (x === null ? x : JSON.stringify(x));\n\n// Type of JSON column (jsonb).\nexport class JSONColumn<\n T,\n Schema extends ColumnTypeSchemaArg,\n InputSchema = Schema['__schemaType'],\n> extends Column {\n declare __schema: Schema;\n dataType = 'jsonb' as const;\n declare __type: T;\n declare __inputType: T;\n declare inputSchema: InputSchema;\n declare __outputType: T;\n declare outputSchema: InputSchema;\n declare __queryType: T;\n declare querySchema: InputSchema;\n operators = Operators.json;\n\n constructor(\n schema: Schema,\n __inputType: InputSchema,\n encodedByDriver = true,\n ) {\n super(schema, __inputType as InputSchema);\n if (!encodedByDriver) {\n this.data.encode = encodeJson;\n }\n this.data.parseItem = JSON.parse;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `json()`);\n }\n}\n\n// JSON non-binary type, stored as a text in the database, so it doesn't have rich functionality.\nexport class JSONTextColumn<\n T,\n Schema extends ColumnTypeSchemaArg,\n InputSchema = Schema['__schemaType'],\n> extends Column {\n declare __schema: Schema;\n dataType = 'json' as const;\n declare __type: T;\n declare __inputType: T;\n declare inputSchema: InputSchema;\n declare __outputType: T;\n declare outputSchema: InputSchema;\n declare __queryType: T;\n declare querySchema: InputSchema;\n operators = Operators.text;\n\n private static _instance:\n | JSONTextColumn<unknown, DefaultSchemaConfig>\n | undefined;\n static get instance() {\n return (this._instance ??= new JSONTextColumn(\n internalSchemaConfig,\n undefined,\n ));\n }\n\n constructor(schema: Schema, __inputType: InputSchema) {\n super(schema, __inputType as InputSchema);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `jsonText()`);\n }\n}\n","import { Column, setColumnData } from '../column';\nimport {\n Code,\n numberDataToCode,\n addCode,\n Codes,\n ColumnToCodeCtx,\n} from '../code';\nimport { columnCode, identityToCode } from '../code';\nimport { Operators } from '../operators';\nimport { TableData } from '../../tableData';\nimport { BaseNumberData } from '../column-data-types';\nimport { ColumnSchemaConfig } from '../column-schema';\nimport { joinTruthy } from '../../utils';\n\nexport interface NumberColumnData extends BaseNumberData, Column.Data {\n identity?: TableData.Identity;\n}\n\nexport interface SerialColumnData extends NumberColumnData {\n default: true;\n}\n\nexport abstract class NumberBaseColumn<\n Schema extends ColumnSchemaConfig,\n SchemaType extends Schema['__schemaType'],\n> extends Column {\n declare __schema: Schema;\n declare __type: number;\n declare __inputType: number;\n declare inputSchema: SchemaType;\n declare data: NumberColumnData;\n declare __outputType: number;\n declare outputSchema: SchemaType;\n declare __queryType: number;\n declare querySchema: SchemaType;\n operators = Operators.number;\n}\n\nexport abstract class IntegerBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberBaseColumn<Schema, ReturnType<Schema['int']>> {\n declare data: NumberColumnData;\n declare querySchema: ReturnType<Schema['int']>;\n constructor(schema: Schema) {\n super(schema, schema.int() as never);\n this.data.int = true;\n }\n}\n\nexport abstract class NumberAsStringBaseColumn<\n Schema extends ColumnSchemaConfig,\n InputType = string | number,\n> extends Column {\n declare __schema: Schema;\n declare __type: string;\n declare __inputType: InputType;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.number;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: InputType;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n declare data: Column.Data;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n this.data.jsonCast = 'text';\n }\n}\n\nexport interface DecimalColumnData extends Column.Data {\n numericPrecision?: number;\n numericScale?: number;\n}\n\n// exact numeric of selectable precision\nexport class DecimalColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema> {\n declare data: DecimalColumnData;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.number;\n dataType = 'numeric' as const;\n\n constructor(\n schema: Schema,\n numericPrecision?: number,\n numericScale?: number,\n ) {\n super(schema);\n this.data.numericPrecision = numericPrecision;\n this.data.numericScale = numericScale;\n this.data.alias = 'decimal';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { numericPrecision, numericScale } = this.data;\n return columnCode(\n this,\n ctx,\n key,\n `decimal(${numericPrecision || ''}${\n numericScale ? `, ${numericScale}` : ''\n })`,\n );\n }\n\n toSQL() {\n const { numericPrecision, numericScale } = this.data;\n\n return joinTruthy(\n this.dataType,\n numericPrecision\n ? numericScale\n ? `(${numericPrecision}, ${numericScale})`\n : `(${numericPrecision})`\n : undefined,\n );\n }\n}\n\nconst skipNumberMethods = { int: true } as const;\n\nconst intToCode = (\n column: Column,\n ctx: ColumnToCodeCtx,\n key: string,\n alias: string,\n): Code => {\n let code: Codes;\n\n if (column.data.identity) {\n code = identityToCode(column.data.identity, alias);\n } else {\n code = [`${alias}()`];\n }\n\n addCode(\n code,\n numberDataToCode(column.data, ctx.migration, skipNumberMethods),\n );\n\n return columnCode(column, ctx, key, code);\n};\n\n// signed two-byte integer\nexport class SmallIntColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int2' as const;\n declare querySchema: ReturnType<Schema['int']>;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'smallint';\n this.data.parseItem = parseInt;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return intToCode(this, ctx, key, 'smallint');\n }\n\n identity<T extends Column.Pick.Data>(\n this: T,\n options: TableData.Identity = {},\n ): Column.HasDefault<T> {\n return setColumnData(this, 'identity', options) as never;\n }\n}\n\n// signed four-byte integer\nexport class IntegerColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int4' as const;\n declare querySchema: ReturnType<Schema['int']>;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'integer';\n this.data.parseItem = parseInt;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return intToCode(this, ctx, key, 'integer');\n }\n\n identity<T extends Column.Pick.Data>(\n this: T,\n options: TableData.Identity = {},\n ): Column.HasDefault<T> {\n return setColumnData(this, 'identity', options) as never;\n }\n}\n\n// signed eight-byte integer\nexport class BigIntColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema, string | number | bigint> {\n dataType = 'int8' as const;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'bigint';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return intToCode(this, ctx, key, 'bigint');\n }\n\n identity<T extends Column.Pick.Data>(\n this: T,\n options: TableData.Identity = {},\n ): Column.HasDefault<T> {\n return setColumnData(this, 'identity', options) as never;\n }\n}\n\n// single precision floating-point number (4 bytes)\nexport class RealColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberBaseColumn<Schema, ReturnType<Schema['number']>> {\n dataType = 'float4' as const;\n declare querySchema: ReturnType<Schema['number']>;\n\n constructor(schema: Schema) {\n super(schema, schema.number() as never);\n this.data.alias = 'real';\n this.data.parseItem = parseFloat;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(\n this,\n ctx,\n key,\n `real()${numberDataToCode(this.data, ctx.migration)}`,\n );\n }\n}\n\n// double precision floating-point number (8 bytes)\nexport class DoublePrecisionColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema> {\n dataType = 'float8' as const;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'doublePrecision';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `doublePrecision()`);\n }\n}\n\n// autoincrementing two-byte integer\nexport class SmallSerialColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int2' as const;\n declare data: SerialColumnData;\n declare querySchema: ReturnType<Schema['int']>;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.int = true;\n this.data.alias = 'smallSerial';\n this.data.parseItem = parseInt;\n }\n\n toSQL() {\n return 'smallserial';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(\n this,\n ctx,\n key,\n `smallSerial()${numberDataToCode(\n this.data,\n ctx.migration,\n skipNumberMethods,\n )}`,\n );\n }\n}\n\n// autoincrementing four-byte integer\nexport class SerialColumn<\n Schema extends ColumnSchemaConfig,\n> extends IntegerBaseColumn<Schema> {\n dataType = 'int4' as const;\n declare data: SerialColumnData;\n declare querySchema: ReturnType<Schema['int']>;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.int = true;\n this.data.alias = 'serial';\n this.data.parseItem = parseInt;\n }\n\n toSQL() {\n return 'serial';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(\n this,\n ctx,\n key,\n `serial()${numberDataToCode(\n this.data,\n ctx.migration,\n skipNumberMethods,\n )}`,\n );\n }\n}\n\n// autoincrementing eight-byte integer\nexport class BigSerialColumn<\n Schema extends ColumnSchemaConfig,\n> extends NumberAsStringBaseColumn<Schema> {\n dataType = 'int8' as const;\n declare data: SerialColumnData;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n\n constructor(schema: Schema) {\n super(schema);\n this.data.alias = 'bigint';\n }\n\n toSQL() {\n return 'bigserial';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `bigSerial()`);\n }\n}\n","import {\n DateColumn,\n getDateAsDateFn,\n getDateAsNumberFn,\n TimestampColumn,\n TimestampTZColumn,\n} from './column-types/date-time';\nimport { EnumColumn } from './column-types/enum';\nimport { ArrayColumn, ArrayColumnValue } from './column-types/array';\nimport { JSONColumn, JSONTextColumn } from './column-types/json';\nimport {\n BigIntColumn,\n BigSerialColumn,\n DecimalColumn,\n DoublePrecisionColumn,\n IntegerColumn,\n RealColumn,\n SerialColumn,\n SmallIntColumn,\n SmallSerialColumn,\n} from './column-types/number';\nimport {\n CitextColumn,\n MoneyColumn,\n StringColumn,\n TextColumn,\n VarCharColumn,\n} from './column-types/string';\nimport { Column, setColumnData } from './column';\nimport { setColumnParse, setColumnParseNull } from './column.utils';\nimport { ColumnSchemaConfig } from './column-schema';\nimport { MaybeArray, noop } from '../utils';\nimport { AdapterSchemaConfigOptions } from '../adapters/adapter';\n\nexport interface DefaultSchemaConfig extends ColumnSchemaConfig<Column> {\n nullable<T extends Column.Pick.ForNullable>(this: T): Column.Nullable<T>;\n\n parse<T extends Column.Pick.ForParse, Output>(\n this: T,\n fn: (input: T['__type']) => Output,\n ): Column.Parse<T, unknown, Output>;\n\n parseNull<T extends Column.Pick.ForParseNull, Output>(\n this: T,\n fn: () => Output,\n ): Column.ParseNull<T, unknown, Output>;\n\n encode<T extends Column.Pick.Type, Input>(\n this: T,\n fn: (input: Input) => unknown,\n ): Column.Encode<T, unknown, Input>;\n\n /**\n * @deprecated use narrowType instead\n */\n asType<\n T,\n Types extends {\n type: unknown;\n __inputType: unknown;\n __outputType: unknown;\n __queryType: unknown;\n },\n >(\n this: T,\n //\n _fn: (\n type: <Type, Input = Type, Output = Type, Query = Type>() => {\n type: Type;\n __inputType: Input;\n __outputType: Output;\n __queryType: Query;\n },\n ) => Types,\n ): {\n [K in keyof T]: K extends '__type'\n ? Types['type']\n : K extends keyof Types\n ? Types[K]\n : T[K];\n };\n\n narrowType<\n T extends Column.InputOutputQueryTypes,\n Types extends Column.InputOutputQueryTypes,\n >(\n this: T,\n //\n _fn: (\n type: <\n Type extends T['__inputType'] extends T['__outputType'] &\n T['__queryType']\n ? T['__outputType'] & T['__queryType'] // generated column case\n : T['__inputType'] & T['__outputType'] & T['__queryType'],\n >() => {\n __inputType: T['__inputType'] extends never ? never : Type;\n __outputType: Type;\n __queryType: Type;\n },\n ) => Types,\n ): { [K in keyof T]: K extends keyof Types ? Types[K] : T[K] };\n\n narrowAllTypes<\n T extends Column.InputOutputQueryTypes,\n Types extends Column.InputOutputQueryTypes,\n >(\n this: T,\n //\n _fn: (\n type: <\n Types extends {\n input?: T['__inputType'];\n output?: T['__outputType'];\n query?: T['__queryType'];\n },\n >() => {\n __inputType: undefined extends Types['input']\n ? T['__inputType']\n : Types['input'];\n __outputType: undefined extends Types['output']\n ? T['__outputType']\n : Types['output'];\n __queryType: undefined extends Types['query']\n ? T['__queryType']\n : Types['query'];\n },\n ) => Types,\n ): { [K in keyof T]: K extends keyof Types ? Types[K] : T[K] };\n\n dateAsNumber<T extends Column.Pick.ForParse>(\n this: T,\n ): Column.Parse<T, unknown, number>;\n dateAsDate<T extends Column.Pick.ForParse>(\n this: T,\n ): Column.Parse<T, unknown, Date>;\n\n enum<const T extends readonly [string, ...string[]]>(\n dataType: string,\n type: T,\n ): EnumColumn<DefaultSchemaConfig, unknown, T>;\n\n array<Item extends ArrayColumnValue>(\n item: Item,\n ): ArrayColumn<DefaultSchemaConfig, Item, unknown, unknown, unknown>;\n\n json<T>(): JSONColumn<\n // (#286) the default type shouldn't conform to a function,\n // because otherwise `update` can't differentiate between a function and non-function value\n unknown extends T ? MaybeArray<string | number | boolean | object> : T,\n DefaultSchemaConfig\n >;\n\n jsonText<T>(): JSONTextColumn<\n // (#286) the default type shouldn't conform to a function,\n // because otherwise `update` can't differentiate between a function and non-function value\n unknown extends T ? MaybeArray<string | number | boolean | object> : T,\n DefaultSchemaConfig\n >;\n\n inputSchema(): undefined;\n outputSchema(): undefined;\n querySchema(): undefined;\n updateSchema(): undefined;\n pkeySchema(): undefined;\n\n smallint(): SmallIntColumn<DefaultSchemaConfig>;\n integer(): IntegerColumn<DefaultSchemaConfig>;\n real(): RealColumn<DefaultSchemaConfig>;\n smallSerial(): SmallSerialColumn<DefaultSchemaConfig>;\n serial(): SerialColumn<DefaultSchemaConfig>;\n\n bigint(): BigIntColumn<DefaultSchemaConfig>;\n decimal(\n precision?: number,\n scale?: number,\n ): DecimalColumn<DefaultSchemaConfig>;\n doublePrecision(): DoublePrecisionColumn<DefaultSchemaConfig>;\n bigSerial(): BigSerialColumn<DefaultSchemaConfig>;\n money(): MoneyColumn<DefaultSchemaConfig>;\n varchar(limit?: number): VarCharColumn<DefaultSchemaConfig>;\n text(): TextColumn<DefaultSchemaConfig>;\n string(limit?: number): StringColumn<DefaultSchemaConfig>;\n citext(): CitextColumn<DefaultSchemaConfig>;\n\n date(): DateColumn<DefaultSchemaConfig>;\n timestampNoTZ(precision?: number): TimestampColumn<DefaultSchemaConfig>;\n timestamp(precision?: number): TimestampTZColumn<DefaultSchemaConfig>;\n}\n\nexport const defaultSchemaConfig = (\n options?: AdapterSchemaConfigOptions,\n): DefaultSchemaConfig => {\n const schemaConfig = {\n intervalParse: options?.intervalParse,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parse(fn: (input: any) => unknown) {\n return setColumnParse(this as never, fn);\n },\n parseNull(fn: () => unknown) {\n return setColumnParseNull(this as never, fn);\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n encode(fn: (input: any) => unknown) {\n return setColumnData(this as Column.Pick.Data, 'encode', fn);\n },\n asType() {\n return this as never;\n },\n narrowType() {\n return this as never;\n },\n narrowAllTypes() {\n return this as never;\n },\n dateAsNumber(this: { data: Column.Data; parse(fn: unknown): unknown }) {\n return this.parse(getDateAsNumberFn(this)) as never;\n },\n dateAsDate(this: { data: Column.Data; parse(fn: unknown): unknown }) {\n return this.parse(getDateAsDateFn(this)) as never;\n },\n enum<const T extends readonly [string, ...string[]]>(\n dataType: string,\n type: T,\n ) {\n return new EnumColumn(schemaConfig, dataType, type, undefined);\n },\n array<Item extends ArrayColumnValue>(item: Item) {\n return new ArrayColumn(\n schemaConfig,\n item,\n undefined,\n options?.arrayEncode,\n );\n },\n boolean: noop,\n buffer: noop,\n unknown: noop,\n never: noop,\n stringSchema: noop,\n stringMin: noop,\n stringMax: noop,\n stringMinMax: noop,\n number: noop,\n int: noop,\n stringNumberDate: noop,\n timeInterval: noop,\n bit: noop,\n uuid: noop,\n nullable(this: Column.Pick.ForNullable) {\n return setColumnData(this, 'isNullable', true);\n },\n json() {\n return new JSONColumn(\n schemaConfig,\n undefined,\n options?.jsonEncodedByDriver,\n );\n },\n jsonText() {\n return new JSONTextColumn(schemaConfig, undefined);\n },\n setErrors: noop,\n\n smallint: () => new SmallIntColumn(schemaConfig),\n integer: () => new IntegerColumn(schemaConfig),\n real: () => new RealColumn(schemaConfig),\n smallSerial: () => new SmallSerialColumn(schemaConfig),\n serial: () => new SerialColumn(schemaConfig),\n\n bigint: () => new BigIntColumn(schemaConfig),\n decimal: (precision?: number, scale?: number) =>\n new DecimalColumn(schemaConfig, precision, scale),\n doublePrecision: () => new DoublePrecisionColumn(schemaConfig),\n bigSerial: () => new BigSerialColumn(schemaConfig),\n money: () => new MoneyColumn(schemaConfig),\n varchar: (limit: number) => new VarCharColumn(schemaConfig, limit),\n text: () => new TextColumn(schemaConfig),\n string: (limit?: number) => new StringColumn(schemaConfig, limit),\n citext: () => new CitextColumn(schemaConfig),\n\n date: () => new DateColumn(schemaConfig, options?.dateParsedByDriver),\n timestampNoTZ: (precision?: number) =>\n new TimestampColumn(schemaConfig, precision, options?.dateParsedByDriver),\n timestamp: (precision?: number) =>\n new TimestampTZColumn(\n schemaConfig,\n precision,\n options?.dateParsedByDriver,\n ),\n\n geographyPointSchema: noop,\n } as unknown as DefaultSchemaConfig;\n\n return schemaConfig;\n};\n\nexport const internalSchemaConfig = defaultSchemaConfig();\n","import { Column } from '../column';\nimport { columnCode, ColumnToCodeCtx } from '../code';\nimport { Code } from '../code';\nimport { Operators } from '../operators';\nimport {\n DefaultSchemaConfig,\n internalSchemaConfig,\n} from '../default-schema-config';\nimport { ColumnSchemaConfig } from '../column-schema';\n\n// 1 byte, true or false\nexport class BooleanColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'bool' as const;\n operators = Operators.boolean;\n declare __type: boolean;\n declare __inputType: boolean;\n declare inputSchema: ReturnType<Schema['boolean']>;\n declare __outputType: boolean;\n declare outputSchema: ReturnType<Schema['boolean']>;\n declare __queryType: boolean;\n declare querySchema: ReturnType<Schema['boolean']>;\n\n private static _instance: BooleanColumn<DefaultSchemaConfig> | undefined;\n static get instance() {\n return (this._instance ??= new BooleanColumn(internalSchemaConfig));\n }\n\n private static _instanceSkipValueToArray:\n | BooleanColumn<DefaultSchemaConfig>\n | undefined;\n static get instanceSkipValueToArray() {\n let instance = this._instanceSkipValueToArray;\n if (!instance) {\n instance = this._instanceSkipValueToArray = Object.create(this.instance);\n instance!.data.skipValueToArray = true;\n }\n return instance!;\n }\n\n constructor(schema: Schema) {\n super(schema, schema.boolean() as never);\n this.data.alias = 'boolean';\n this.data.parseItem = parseItem;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, 'boolean()');\n }\n}\n\nconst parseItem = (input: string) => input[0] === 't';\n","import { IsQuery, Query, SetQueryReturnsColumnOrThrow } from '../query/query';\nimport { Column } from './column';\nimport { ToSQLCtx } from '../query/sql/to-sql';\nimport { MoveMutativeQueryToCte } from '../query/basic-features/cte/cte.sql';\nimport {\n ArgWithBeforeAndBeforeSet,\n PrepareSubQueryForSql,\n} from '../query/internal-features/sub-query/sub-query-for-sql';\nimport { Db } from '../query/db';\nimport {\n PickQueryColumTypes,\n PickQueryQ,\n PickQueryResult,\n PickQueryResultColumnTypes,\n} from '../query/pick-query-types';\nimport {\n addValue,\n emptyArray,\n isIterable,\n MaybeArray,\n RecordUnknown,\n} from '../utils';\nimport { Expression, isExpression } from '../query/expressions/expression';\nimport { BooleanQueryColumn } from '../query/basic-features/aggregate/aggregate';\nimport { QueryThen } from '../query';\nimport {\n setValueParserToQuery,\n getValueParser,\n setValueParser,\n} from '../query/query-columns/query-column-parsers';\nimport { BooleanColumn } from './column-types/boolean';\n\n// workaround for circular dependencies between columns and sql\nlet moveMutativeQueryToCte: MoveMutativeQueryToCte;\nexport const setMoveMutativeQueryToCte = (fn: MoveMutativeQueryToCte) => {\n moveMutativeQueryToCte = fn;\n};\n\nlet prepareSubQueryForSql: PrepareSubQueryForSql;\nexport const setPrepareSubQueryForSql = (fn: PrepareSubQueryForSql) => {\n prepareSubQueryForSql = fn;\n};\n\nlet dbClass: typeof Db;\nexport const setDb = (db: typeof Db) => {\n dbClass = db;\n};\n\n/**\n * Function to turn the operator expression into SQL.\n *\n * @param key - SQL of the target to apply operator for, can be a quoted column name or an SQL expression wrapped with parens.\n * @param args - arguments of operator function.\n * @param ctx - context object for SQL conversions, for collecting query variables.\n * @param quotedAs - quoted table name.\n */\nexport interface OperatorToSQL {\n (key: string, args: [unknown], ctx: unknown, quotedAs?: string): string;\n}\n\n// Operator function type.\n// Table.count().gt(10) <- here `.gt(10)` is this operator function.\n// It discards previously defined column type operators and applies new ones,\n// for a case when operator gives a different column type.\nexport interface Operator<\n Value,\n Column extends Column.Pick.OutputTypeAndOperators =\n Column.Pick.OutputTypeAndOperators,\n> {\n <T extends PickQueryResult>(\n this: T,\n arg: Value,\n ): {\n [K in Exclude<\n keyof T,\n keyof T['result']['value']['operators']\n >]: K extends 'result'\n ? { value: Column }\n : K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'then'\n ? QueryThen<Column['__outputType']>\n : T[K];\n } & Column['operators'];\n // argument type of the function\n _opType: Value;\n}\n\n// Extend query object with given operator methods, so that user can call `gt` after calling `count`.\n// If query already has the same operators, nothing is changed.\n// Previously defined operators, if any, are **not** dropped from the query.\nexport function setQueryOperators(query: IsQuery, operators: RecordUnknown) {\n const q = (query as unknown as PickQueryQ).q;\n\n if (q.operators !== operators) {\n q.operators = operators;\n Object.assign(query, operators);\n }\n\n return query;\n}\n\n/**\n * Makes operator function that has `_op` property.\n *\n * @param _op - function to turn the operator call into SQL.\n */\nconst make = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _op: (key: string, args: any, ctx: ToSQLCtx, quotedAs?: string) => string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any => {\n return Object.assign(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function (this: PickQueryQ, value: any) {\n const { q } = this;\n\n const val = prepareOpArg(this, value);\n (q.chain ??= []).push(_op, val || value);\n\n // parser might be set by a previous type, but is not needed for boolean\n if (getValueParser(q.parsers)) {\n setValueParser(q, undefined);\n }\n\n q.getColumn = BooleanColumn.instance;\n\n // turn `this.result.value` to boolean,\n // preserve existing column name if it is set\n if (this instanceof Expression && this.result) {\n let column;\n if (this.result.value?.data.name) {\n column = Object.create(BooleanColumn.instance);\n column.data = { ...column.data, name: this.result.value.data.name };\n } else {\n column = BooleanColumn.instance;\n }\n this.result.value = column;\n }\n\n return setQueryOperators(this as never, boolean as never);\n },\n {\n // function to turn the operator expression into SQL\n _op,\n },\n //\n ) as never;\n};\n\n// is different from `make` by `(q.chain ??= []).push(_op, value -> args)`\nconst makeVarArg = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n _op: (key: string, args: any[], ctx: ToSQLCtx, quotedAs?: string) => string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any => {\n return Object.assign(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n function (this: PickQueryQ, ...args: any[]) {\n const { q } = this;\n\n args.forEach((arg, i) => {\n const val = prepareOpArg(this, arg);\n if (val) args[i] = val;\n });\n\n (q.chain ??= []).push(_op, args);\n\n // parser might be set by a previous type, but is not needed for boolean\n if (getValueParser(q.parsers)) {\n setValueParser(q, undefined);\n }\n\n return setQueryOperators(this as never, boolean as never);\n },\n {\n // function to turn the operator expression into SQL\n _op,\n },\n //\n ) as never;\n};\n\nexport const prepareOpArg = (q: unknown, arg: unknown) => {\n return arg instanceof dbClass\n ? prepareSubQueryForSql(q as ArgWithBeforeAndBeforeSet, arg as Query)\n : undefined;\n};\n\n// Handles array, expression object, query object to insert into sql.\n// Saves values to `ctx.values`.\nconst quoteValue = (\n arg: unknown,\n ctx: ToSQLCtx,\n quotedAs: string | undefined,\n IN?: boolean,\n): string => {\n if (arg && typeof arg === 'object') {\n if (IN && isIterable(arg)) {\n return `(${(Array.isArray(arg) ? arg : [...arg])\n .map((value) => addValue(ctx.values, value))\n .join(', ')})`;\n }\n\n if (isExpression(arg)) {\n return arg.toSQL(ctx, quotedAs);\n }\n\n if ('toSQL' in arg) {\n return `(${moveMutativeQueryToCte(ctx, arg as never)})`;\n }\n\n if (!(arg instanceof Date) && !Array.isArray(arg)) {\n arg = JSON.stringify(arg);\n }\n }\n\n return addValue(ctx.values, arg);\n};\n\nconst quoteLikeValue = (\n arg: unknown,\n ctx: ToSQLCtx,\n quotedAs: string | undefined,\n jsonArray?: boolean,\n): string => {\n if (arg && typeof arg === 'object') {\n if (!jsonArray && Array.isArray(arg)) {\n return `(${arg.map((value) => addValue(ctx.values, value)).join(', ')})`;\n }\n\n if (isExpression(arg)) {\n return arg.toSQL(ctx, quotedAs);\n }\n\n if ('toSQL' in arg) {\n return `replace(replace((${moveMutativeQueryToCte(\n ctx,\n arg as never,\n )}), '%', '\\\\\\\\%'), '_', '\\\\\\\\_')`;\n }\n }\n\n return addValue(ctx.values, (arg as string).replace(/[%_]/g, '\\\\$&'));\n};\n\n// common operators that exist for any types\ninterface Base<Value> {\n __hasSelect: true;\n equals: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n not: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n isDistinctFrom: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n isNotDistinctFrom: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n in: Operator<Value[] | IsQuery | Expression, BooleanQueryColumn>;\n notIn: Operator<Value[] | IsQuery | Expression, BooleanQueryColumn>;\n}\n\nconst base = {\n equals: make((key, value, ctx, quotedAs) =>\n value === null\n ? `${key} IS NULL`\n : `${key} = ${quoteValue(value, ctx, quotedAs)}`,\n ),\n not: make((key, value, ctx, quotedAs) =>\n value === null\n ? `${key} IS NOT NULL`\n : `${key} <> ${quoteValue(value, ctx, quotedAs)}`,\n ),\n isDistinctFrom: make(\n (key, value, ctx, quotedAs) =>\n `${key} IS DISTINCT FROM ${quoteValue(value, ctx, quotedAs)}`,\n ),\n isNotDistinctFrom: make(\n (key, value, ctx, quotedAs) =>\n `${key} IS NOT DISTINCT FROM ${quoteValue(value, ctx, quotedAs)}`,\n ),\n in: make((key, value, ctx, quotedAs) =>\n Array.isArray(value) && !value.length\n ? 'false'\n : `${key} IN ${quoteValue(value, ctx, quotedAs, true)}`,\n ),\n notIn: make((key, value, ctx, quotedAs) =>\n Array.isArray(value) && !value.length\n ? 'true'\n : `NOT ${key} IN ${quoteValue(value, ctx, quotedAs, true)}`,\n ),\n} as Base<unknown>;\n\ninterface OperatorsBooleanSelf extends OperatorsBoolean {\n result: { value: BooleanQueryColumn };\n}\n\n// Numeric, date, and time can be compared with `lt`, `gt`, so it's generic.\nexport interface Ord<Value> extends Base<Value> {\n lt: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n lte: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n gt: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n gte: Operator<Value | IsQuery | Expression, BooleanQueryColumn>;\n between: Operator<\n [Value | IsQuery | Expression, Value | IsQuery | Expression],\n BooleanQueryColumn\n >;\n}\n\nexport type OperatorsNumber = Ord<number>;\n\nconst ord = {\n ...base,\n lt: make(\n (key, value, ctx, quotedAs) =>\n `${key} < ${quoteValue(value, ctx, quotedAs)}`,\n ),\n lte: make(\n (key, value, ctx, quotedAs) =>\n `${key} <= ${quoteValue(value, ctx, quotedAs)}`,\n ),\n gt: make(\n (key, value, ctx, quotedAs) =>\n `${key} > ${quoteValue(value, ctx, quotedAs)}`,\n ),\n gte: make(\n (key, value, ctx, quotedAs) =>\n `${key} >= ${quoteValue(value, ctx, quotedAs)}`,\n ),\n between: make(\n (key, [from, to], ctx, quotedAs) =>\n `${key} BETWEEN ${quoteValue(from, ctx, quotedAs)} AND ${quoteValue(\n to,\n ctx,\n quotedAs,\n )}`,\n ),\n} as OperatorsNumber;\n\n// Boolean type operators\nexport interface OperatorsBoolean extends Ord<boolean> {\n and: Operator<OperatorsBooleanSelf, BooleanQueryColumn>;\n or: Operator<OperatorsBooleanSelf, BooleanQueryColumn>;\n}\n\nconst boolean = {\n ...ord,\n and: make(\n (key, value, ctx, quotedAs) =>\n `${key} AND ${value.q.expr.toSQL(ctx, quotedAs)}`,\n ),\n or: make(\n (key, value, ctx, quotedAs) =>\n `(${key}) OR (${value.q.expr.toSQL(ctx, quotedAs)})`,\n ),\n} as unknown as OperatorsBoolean;\n\n// Text type operators\nexport interface OperatorsText extends Base<string> {\n contains: Operator<string | IsQuery | Expression, BooleanQueryColumn>;\n containsSensitive: Operator<\n string | IsQuery | Expression,\n BooleanQueryColumn\n >;\n startsWith: Operator<string | IsQuery | Expression, BooleanQueryColumn>;\n startsWithSensitive: Operator<\n string | IsQuery | Expression,\n BooleanQueryColumn\n >;\n endsWith: Operator<string | IsQuery | Expression, BooleanQueryColumn>;\n endsWithSensitive: Operator<\n string | IsQuery | Expression,\n BooleanQueryColumn\n >;\n}\n\nconst text = {\n ...base,\n contains: make(\n (key, value, ctx, quotedAs) =>\n `${key} ILIKE '%' || ${quoteLikeValue(value, ctx, quotedAs)} || '%'`,\n ),\n containsSensitive: make(\n (key, value, ctx, quotedAs) =>\n `${key} LIKE '%' || ${quoteLikeValue(value, ctx, quotedAs)} || '%'`,\n ),\n startsWith: make(\n (key, value, ctx, quotedAs) =>\n `${key} ILIKE ${quoteLikeValue(value, ctx, quotedAs)} || '%'`,\n ),\n startsWithSensitive: make(\n (key, value, ctx, quotedAs) =>\n `${key} LIKE ${quoteLikeValue(value, ctx, quotedAs)} || '%'`,\n ),\n endsWith: make(\n (key, value, ctx, quotedAs) =>\n `${key} ILIKE '%' || ${quoteLikeValue(value, ctx, quotedAs)}`,\n ),\n endsWithSensitive: make(\n (key, value, ctx, quotedAs) =>\n `${key} LIKE '%' || ${quoteLikeValue(value, ctx, quotedAs)}`,\n ),\n} as OperatorsText;\n\nexport interface OperatorsOrdinalText extends Ord<string>, OperatorsText {}\n\nconst ordinalText = {\n ...ord,\n ...text,\n} as OperatorsOrdinalText;\n\ninterface JsonPathQueryOptions {\n vars?: RecordUnknown;\n silent?: boolean;\n}\n\ninterface JsonPathQueryTypeOptions<\n T extends PickQueryColumTypes,\n C extends Column.Pick.QueryColumn,\n> extends JsonPathQueryOptions {\n type?: (types: T['columnTypes']) => C;\n}\n\ninterface JsonPathQuery {\n /**\n * Selects a value from JSON data using a JSON path.\n *\n * Calls the [jsonb_path_query_first](https://www.postgresql.org/docs/current/functions-json.html) Postgres function.\n *\n * Type can be provided via `{ type: (t) => t.columnType() }` options, by default the type is `unknown`.\n *\n * Optionally takes `vars` and `silent` parameters, see [Postgres docs](https://www.postgresql.org/docs/current/functions-json.html) for details.\n *\n * The `type` option sets the output type when selecting a value,\n * also it makes specific operators available in `where`, so that you can apply `contains` if the type is text, and `gt` if the type is numeric.\n *\n * ```ts\n * // query a single value from a JSON data,\n * // because of the provided type, string JSON value will be parsed to a Date object.\n * const value = await db.table\n * .get('data')\n * .jsonPathQueryFirst('$.path.to.date', { type: (t) => t.date().asDate() });\n *\n * // using it in a select\n * const records = await db.table.select({\n * date: (q) =>\n * q.get('data').jsonPathQueryFirst('$[*] ? (@ = key)', {\n * type: (t) => t.integer(),\n * // defining `vars` and `silent`\n * vars: { key: 'key' },\n * silent: true,\n * }),\n * });\n *\n * // using it in `where`\n * const filtered = await db.table.where((q) =>\n * // filtering records by the `name` property from the `data` JSON column\n * q.get('data').jsonPathQueryFirst('$.name').equals('name'),\n * );\n *\n * // using it in update\n * await db.table.find(id).update({\n * // using data property to set the `name` column\n * name: (q) =>\n * q.get('data').jsonPathQueryFirst('$.name', { type: (t) => t.string() }),\n * });\n *\n * // filtering records to contain 'word' in the json property \"name\"\n * await db.table.where((q) =>\n * q\n * .get('data')\n * .jsonPathQueryFirst('$.name', { type: (t) => t.string() })\n * .contains('word'),\n * );\n * ```\n *\n * @param path - JSON path\n * @param options - can have type, vars, silent\n */\n <\n T extends PickQueryResultColumnTypes,\n C extends Column.Pick.QueryColumn = Column.Pick.QueryColumnOfTypeAndOps<\n string,\n unknown,\n OperatorsAny\n >,\n >(\n this: T,\n path: string,\n options?: JsonPathQueryTypeOptions<T, C>,\n ): Omit<\n SetQueryReturnsColumnOrThrow<T, C>,\n keyof T['result']['value']['operators']\n > &\n C['operators'];\n\n // disallow it from `where`\n _opType: never;\n}\n\n// JSON type operators\nexport interface OperatorsJson extends Ord<unknown> {\n jsonPathQueryFirst: JsonPathQuery;\n jsonSupersetOf: Operator<unknown | IsQuery | Expression, BooleanQueryColumn>;\n jsonSubsetOf: Operator<unknown | IsQuery | Expression, BooleanQueryColumn>;\n jsonSet: {\n /**\n * Returns a JSON value/object/array where a given value is set at the given path.\n * The path is a key or an array of keys to access the value.\n *\n * Calls the [jsonb_set](https://www.postgresql.org/docs/current/functions-json.html) Postgres function.\n *\n * It can be used in all contexts on a single JSON value.\n *\n * ```ts\n * await db.table.find(id).update({\n * data: (q) => q.get('data').jsonSet(['path', 'to', 'value'], 'new value'),\n * // supports sql for the value\n * data: (q) => q.get('data').jsonSet(['path', 'to', 'value'], sql`'new value'`),\n * });\n * ```\n *\n * @param path - key or array of keys\n * @param value - value to set\n */\n <T extends PickQueryResult>(\n this: T,\n path: MaybeArray<string | number>,\n value: unknown,\n ): T;\n // disallow it from `where`\n _opType: never;\n };\n jsonReplace: {\n /**\n * The same as {@link jsonSet}, but sets the last argument of `jsonb_set` to false,\n * so this function only has effect when the value already existed in the JSON.\n *\n * ```ts\n * await db.table.find(id).update({\n * // data.path.to.value will be updated only if it already was defined\n * data: (q) => q.get('data').jsonReplace(['path', 'to', 'value'], 'new value'),\n * // supports sql for the value\n * data: (q) =>\n * q.get('data').jsonReplace(['path', 'to', 'value'], sql`'new value'`),\n * });\n * ```\n *\n * @param path - key or array of keys\n * @param value - value to set\n */\n <T extends PickQueryResult>(\n this: T,\n path: MaybeArray<string | number>,\n value: unknown,\n ): T;\n // disallow it from `where`\n _opType: never;\n };\n jsonInsert: {\n /**\n * Inserts a value into a given position of JSON array and returns the whole array.\n * The path is a key or an array of keys to access the value.\n *\n * If a value exists at the given path, the value is not replaced.\n *\n * Provide `{ after: true }` option to insert a value after a given position.\n *\n * Calls the [jsonb_insert](https://www.postgresql.org/docs/current/functions-json.html) Postgres function.\n *\n * It can be used in all contexts on a single JSON value.\n *\n * ```ts\n * // update the record with data { tags: ['two'] } to have data { tags: ['one', 'two'] }\n * await db.table.find(id).update({\n * data: (q) => q.get('data').jsonInsert(['tags', 0], 'one'),\n * // supports sql for the value\n * data: (q) => q.get('data').jsonInsert(['tags', 0], sql`'one'`),\n * });\n *\n * // add 'three' after 'two'\n * await db.table.find(id).update({\n * data: (q) => q.get('data').jsonInsert(['tags', 1], 'three', { after: true }),\n * });\n * ```\n *\n * @param path - key or array of keys\n * @param value - value to insert\n * @param options - can have `after: true`\n */\n <T extends PickQueryResult>(\n this: T,\n path: MaybeArray<string | number>,\n value: unknown,\n options?: { after?: boolean },\n ): T;\n // disallow it from `where`\n _opType: never;\n };\n jsonRemove: {\n /**\n * Remove a value from a JSON object or array at a given path.\n * The path is a key or an array of keys to access the value.\n *\n * Uses the [#-](https://www.postgresql.org/docs/current/functions-json.html) Postgres operator.\n *\n * It can be used in all contexts on a single JSON value.\n *\n * ```ts\n * // the record has data { tags: ['one', 'two'] }\n * // removing the first tag, the data will be { tags: ['two'] }\n * const result = await db.table.find(id).update({\n * data: (q) => q.get('data').jsonRemove(['tags', 0]),\n * });\n * ```\n *\n * @param path - key or array of keys\n */\n <T extends PickQueryResult>(this: T, path: MaybeArray<string | number>): T;\n // disallow it from `where`\n _opType: never;\n };\n}\n\nconst encodeJsonPath = (ctx: ToSQLCtx, path: MaybeArray<string | number>) =>\n addValue(ctx.values, `{${Array.isArray(path) ? path.join(', ') : path}}`);\n\nconst jsonPathQueryOp = (\n key: string,\n [path, options]: [path: string, options?: JsonPathQueryOptions],\n ctx: ToSQLCtx,\n) =>\n `jsonb_path_query_first(${key}, ${addValue(ctx.values, path)}${\n options?.vars\n ? `, ${addValue(ctx.values, JSON.stringify(options.vars))}${\n options.silent ? ', true' : ''\n }`\n : options?.silent\n ? ', NULL, true'\n : ''\n })`;\n\nconst shouldEncodeJson = (ctx: ToSQLCtx) =>\n ctx.q.adapter.driverAdapter.schemaConfig?.jsonEncodedByDriver === false;\n\nconst quoteJsonValue = (\n arg: unknown,\n ctx: ToSQLCtx,\n quotedAs: string | undefined,\n IN?: boolean,\n): string => {\n if (arg && typeof arg === 'object') {\n if (IN && Array.isArray(arg)) {\n return `(${arg\n .map((value) =>\n shouldEncodeJson(ctx)\n ? addValue(ctx.values, JSON.stringify(value))\n : addValue(ctx.values, value),\n )\n .join(', ')})`;\n }\n\n if (Array.isArray(arg)) {\n return shouldEncodeJson(ctx)\n ? addValue(ctx.values, JSON.stringify(arg))\n : addValue(ctx.values, arg);\n }\n\n if (isExpression(arg)) {\n return 'to_jsonb(' + arg.toSQL(ctx, quotedAs) + ')';\n }\n\n if ('toSQL' in arg) {\n return `to_jsonb((${moveMutativeQueryToCte(ctx, arg as never)}))`;\n }\n }\n\n return shouldEncodeJson(ctx)\n ? addValue(ctx.values, JSON.stringify(arg))\n : addValue(ctx.values, arg);\n};\n\nconst serializeJsonValue = (\n arg: unknown,\n ctx: ToSQLCtx,\n quotedAs: string | undefined,\n): string => {\n if (arg && typeof arg === 'object') {\n if (isExpression(arg)) {\n return 'to_jsonb(' + arg.toSQL(ctx, quotedAs) + ')';\n }\n\n if ('toSQL' in arg) {\n return `to_jsonb((${moveMutativeQueryToCte(ctx, arg as never)}))`;\n }\n }\n\n return addValue(ctx.values, JSON.stringify(arg));\n};\n\nconst json = {\n ...ord,\n equals: make((key, value, ctx, quotedAs) =>\n value === null\n ? `nullif(${key}, 'null'::jsonb) IS NULL`\n : `${key} = ${quoteJsonValue(value, ctx, quotedAs)}`,\n ),\n not: make((key, value, ctx, quotedAs) =>\n value === null\n ? `nullif(${key}, 'null'::jsonb) IS NOT NULL`\n : `${key} != ${quoteJsonValue(value, ctx, quotedAs)}`,\n ),\n isDistinctFrom: make(\n (key, value, ctx, quotedAs) =>\n `${key} IS DISTINCT FROM ${quoteJsonValue(value, ctx, quotedAs)}`,\n ),\n isNotDistinctFrom: make(\n (key, value, ctx, quotedAs) =>\n `${key} IS NOT DISTINCT FROM ${quoteJsonValue(value, ctx, quotedAs)}`,\n ),\n in: make((key, value, ctx, quotedAs) =>\n Array.isArray(value) && !value.length\n ? 'false'\n : `${key} IN ${quoteJsonValue(value, ctx, quotedAs, true)}`,\n ),\n notIn: make((key, value, ctx, quotedAs) =>\n Array.isArray(value) && !value.length\n ? 'true'\n : `NOT ${key} IN ${quoteJsonValue(value, ctx, quotedAs, true)}`,\n ),\n jsonPathQueryFirst: Object.assign(\n function (\n this: IsQuery,\n path: string,\n options?: JsonPathQueryTypeOptions<\n PickQueryColumTypes,\n Column.Pick.QueryColumn\n >,\n ) {\n const { q, columnTypes } = this as Query;\n const chain = (q.chain ??= []);\n chain.push(jsonPathQueryOp, [path, options]);\n\n if (getValueParser(q.parsers)) {\n setValueParser(q, undefined);\n }\n\n if (options?.type) {\n const type = options.type(columnTypes);\n setValueParserToQuery(q, type);\n\n // push the type cast `::type` only if operator is applied\n chain.push = (...args: unknown[]) => {\n chain.push = Array.prototype.push;\n chain.push((s: string) => `${s}::${type.dataType}`, emptyArray);\n return chain.push(...args);\n };\n\n return setQueryOperators(this, type.operators);\n }\n\n return this;\n },\n { _op: jsonPathQueryOp },\n ) as never,\n jsonSupersetOf: make(\n (key, value, ctx, quotedAs) =>\n `${key} @> ${quoteValue(value, ctx, quotedAs)}`,\n ),\n jsonSubsetOf: make(\n (key, value, ctx, quotedAs) =>\n `${key} <@ ${quoteValue(value, ctx, quotedAs)}`,\n ),\n jsonSet: makeVarArg(\n (key, [path, value], ctx, quotedAs) =>\n `jsonb_set(${key}, ${encodeJsonPath(ctx, path)}, ${serializeJsonValue(\n value,\n ctx,\n quotedAs,\n )})`,\n ),\n jsonReplace: makeVarArg(\n (key, [path, value], ctx, quotedAs) =>\n `jsonb_set(${key}, ${encodeJsonPath(ctx, path)}, ${serializeJsonValue(\n value,\n ctx,\n quotedAs,\n )}, false)`,\n ),\n jsonInsert: makeVarArg(\n (key, [path, value, options], ctx, quotedAs) =>\n `jsonb_insert(${key}, ${encodeJsonPath(ctx, path)}, ${serializeJsonValue(\n value,\n ctx,\n quotedAs,\n )}${options?.after ? ', true' : ''})`,\n ),\n jsonRemove: makeVarArg(\n (key, [path], ctx) => `(${key} #- ${encodeJsonPath(ctx, path)})`,\n ),\n} as OperatorsJson;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type OperatorsAny = Base<any>;\nexport type OperatorsDate = Ord<Date | string>;\n\nexport type OperatorsTime = Ord<string>;\n\nexport interface OperatorsArray<T> extends Ord<T[]> {\n has: Operator<T | IsQuery | Expression, BooleanQueryColumn>;\n hasEvery: Operator<T[] | IsQuery | Expression, BooleanQueryColumn>;\n hasSome: Operator<T[] | IsQuery | Expression, BooleanQueryColumn>;\n containedIn: Operator<T[] | IsQuery | Expression, BooleanQueryColumn>;\n length: {\n _opType:\n | number\n | {\n [K in Exclude<\n keyof OperatorsNumber,\n '__hasSelect'\n >]?: OperatorsNumber[K]['_opType'];\n };\n };\n}\n\nconst array = {\n ...ord,\n has: make(\n (key, value, ctx, quotedAs) =>\n `${quoteValue(value, ctx, quotedAs)} = ANY(${key})`,\n ),\n hasEvery: make(\n (key, value, ctx, quotedAs) =>\n `${key} @> ${quoteValue(value, ctx, quotedAs)}`,\n ),\n hasSome: make(\n (key, value, ctx, quotedAs) =>\n `${key} && ${quoteValue(value, ctx, quotedAs)}`,\n ),\n containedIn: make(\n (key, value, ctx, quotedAs) =>\n `${key} <@ ${quoteValue(value, ctx, quotedAs)}`,\n ),\n length: make((key, value, ctx, quotedAs) => {\n const expr = `COALESCE(array_length(${key}, 1), 0)`;\n return typeof value === 'number'\n ? `${expr} = ${quoteValue(value, ctx, quotedAs)}`\n : Object.keys(value)\n .map((key) =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (ord as any)[key]._op(expr, value[key], ctx, quotedAs),\n )\n .join(' AND ');\n }),\n} as OperatorsArray<unknown>;\n\n// `Operators` has operators grouped by types. To be used by column classes.\nexport const Operators: {\n any: OperatorsAny;\n ordinalText: OperatorsOrdinalText;\n boolean: OperatorsBoolean;\n number: OperatorsNumber;\n date: OperatorsDate;\n time: OperatorsTime;\n text: OperatorsText;\n json: OperatorsJson;\n array: OperatorsArray<unknown>;\n} = {\n any: base,\n boolean,\n ordinalText,\n number: ord,\n date: ord,\n time: ord,\n text,\n json,\n array,\n} as never;\n","import { Column, getDefaultLanguage, setColumnData } from '../column';\nimport { NumberColumnData } from './number';\nimport { Code, ColumnToCodeCtx, stringDataToCode } from '../code';\nimport { columnCode } from '../code';\nimport { RawSql } from '../../query/expressions/raw-sql';\nimport { Operators, OperatorsOrdinalText, OperatorsText } from '../operators';\nimport { setColumnDefaultParse } from '../column.utils';\nimport {\n DefaultSchemaConfig,\n internalSchemaConfig,\n} from '../default-schema-config';\nimport { StringData } from '../column-data-types';\nimport { ColumnSchemaConfig } from '../column-schema';\nimport {\n joinTruthy,\n quoteObjectKey,\n RecordString,\n toSnakeCase,\n} from '../../utils';\nimport { StaticSQLArgs } from '../../query/expressions/expression';\nimport { SearchWeightRecord } from '../../query';\n\nexport type TextColumnData = StringData;\n\nexport abstract class TextBaseColumn<\n Schema extends ColumnSchemaConfig,\n Ops = OperatorsText,\n> extends Column {\n declare __schema: Schema;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare data: TextColumnData;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text as Ops;\n\n constructor(\n schema: Schema,\n schemaType: ReturnType<\n Schema['stringSchema']\n > = schema.stringSchema() as never,\n ) {\n super(schema, schemaType);\n }\n}\n\nexport abstract class LimitedTextBaseColumn<\n Schema extends ColumnSchemaConfig,\n> extends TextBaseColumn<Schema, OperatorsOrdinalText> {\n declare data: TextColumnData & { maxChars?: number };\n operators = Operators.ordinalText;\n\n constructor(schema: Schema, limit?: number) {\n super(\n schema,\n (limit !== undefined\n ? schema.stringMax(limit)\n : schema.stringSchema()) as never,\n );\n this.data.maxChars = limit;\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.maxChars !== undefined && `(${this.data.maxChars})`,\n );\n }\n}\n\n// character varying(n), varchar(n) variable-length with limit\nexport class VarCharColumn<\n Schema extends ColumnSchemaConfig,\n> extends LimitedTextBaseColumn<Schema> {\n dataType = 'varchar' as const;\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { maxChars } = this.data;\n return columnCode(\n this,\n ctx,\n key,\n `varchar(${maxChars ?? ''})${stringDataToCode(this.data, ctx.migration)}`,\n );\n }\n}\n\nexport class StringColumn<\n Schema extends ColumnSchemaConfig,\n> extends VarCharColumn<Schema> {\n constructor(schema: Schema, limit = 255) {\n super(schema, limit);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n let max: number | undefined = this.data.maxChars;\n if (max === 255) max = undefined;\n return columnCode(\n this,\n ctx,\n key,\n `string(${max ?? ''})${stringDataToCode(this.data, ctx.migration)}`,\n );\n }\n}\n\nconst textColumnToCode = (\n column: TextBaseColumn<ColumnSchemaConfig> & {\n data: TextColumnData & { minArg?: number; maxArg?: number };\n },\n ctx: ColumnToCodeCtx,\n key: string,\n) => {\n const data = { ...column.data };\n let args = '';\n const hasMax = data.maxArg !== undefined && data.max === data.maxArg;\n if ((data.minArg !== undefined && data.min === data.minArg) || hasMax) {\n if (data.minArg !== 0 || (hasMax && data.max !== Infinity)) {\n args += data.minArg;\n }\n delete data.min;\n if (hasMax) {\n if (data.maxArg !== Infinity) {\n args += `, ${data.maxArg}`;\n }\n delete data.max;\n }\n }\n return columnCode(\n column,\n ctx,\n key,\n `${column.dataType}(${args})${stringDataToCode(data, ctx.migration)}`,\n );\n};\n\n// text\tvariable unlimited length\nexport class TextColumn<\n Schema extends ColumnSchemaConfig,\n> extends TextBaseColumn<Schema, OperatorsOrdinalText> {\n dataType = 'text' as const;\n declare data: TextColumnData & { minArg?: number; maxArg?: number };\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.ordinalText;\n\n private static _instance: TextColumn<DefaultSchemaConfig> | undefined;\n static get instance() {\n return (this._instance ??= new TextColumn(internalSchemaConfig));\n }\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return textColumnToCode(this, ctx, key);\n }\n}\n\nconst byteaParse = (val: unknown) =>\n typeof val === 'string' ? Buffer.from(val.slice(2), 'hex') : val;\n\n// To store binary strings\nexport class ByteaColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'bytea' as const;\n operators = Operators.ordinalText;\n declare __type: string;\n declare __inputType: Buffer;\n declare inputSchema: ReturnType<Schema['buffer']>;\n declare __outputType: Buffer;\n declare outputSchema: ReturnType<Schema['buffer']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n\n constructor(schema: Schema) {\n super(schema, schema.buffer() as never);\n setColumnDefaultParse(this, byteaParse);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `bytea()`);\n }\n}\n\n// point\t16 bytes\tPoint on a plane\t(x,y)\nexport class PointColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'point' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `point()`);\n }\n}\n\n// line\t32 bytes\tInfinite line\t{A,B,C}\nexport class LineColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'line' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `line()`);\n }\n}\n\n// lseg\t32 bytes\tFinite line segment\t((x1,y1),(x2,y2))\nexport class LsegColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'lseg' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `lseg()`);\n }\n}\n\n// box\t32 bytes\tRectangular box\t((x1,y1),(x2,y2))\nexport class BoxColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'box' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `box()`);\n }\n}\n\n// path\t16+16n bytes\tClosed path (similar to polygon)\t((x1,y1),...)\n// path\t16+16n bytes\tOpen path\t[(x1,y1),...)\nexport class PathColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'path' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `path()`);\n }\n}\n\n// polygon\t40+16n bytes\tPolygon (similar to closed path)\t((x1,y1),...)\nexport class PolygonColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'polygon' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `polygon()`);\n }\n}\n\n// circle\t24 bytes\tCircle\t<(x,y),r> (center point and radius)\nexport class CircleColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'circle' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `circle()`);\n }\n}\n\nexport class MoneyColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'money' as const;\n declare __type: string;\n declare data: NumberColumnData;\n declare __inputType: string | number;\n declare inputSchema: ReturnType<Schema['number']>;\n declare __outputType: number;\n declare outputSchema: ReturnType<Schema['number']>;\n declare __queryType: string | number;\n declare querySchema: ReturnType<Schema['number']>;\n operators = Operators.number;\n\n constructor(schema: Schema) {\n super(schema, schema.number() as never);\n setColumnDefaultParse(this, moneyParse);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `money()`);\n }\n}\n\nconst moneyParse = Object.assign(\n function (input: unknown) {\n return input === null\n ? input\n : parseFloat((input as string).replace(/,/g, '').replace(/\\$/g, ''));\n },\n {\n hideFromCode: true,\n },\n);\n\n// cidr\t7 or 19 bytes\tIPv4 and IPv6 networks\nexport class CidrColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'cidr' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `cidr()`);\n }\n}\n\n// inet\t7 or 19 bytes\tIPv4 and IPv6 hosts and networks\nexport class InetColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'inet' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `inet()`);\n }\n}\n\n// macaddr\t6 bytes\tMAC addresses\nexport class MacAddrColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'macaddr' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `macaddr()`);\n }\n}\n\n// macaddr8\t8 bytes\tMAC addresses (EUI-64 format)\nexport class MacAddr8Column<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'macaddr8' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `macaddr8()`);\n }\n}\n\n// Bit strings are strings of 1's and 0's.\n// They can be used to store or visualize bit masks.\n// There are two SQL bit types: bit(n) and bit varying(n), where n is a positive integer.\nexport class BitColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'bit' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['bit']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['bit']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['bit']>;\n operators = Operators.ordinalText;\n declare data: Column.Data & { length: number };\n\n constructor(schema: Schema, length: number) {\n super(schema, schema.bit(length) as ReturnType<Schema['bit']>);\n this.data.length = length;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { length } = this.data;\n return columnCode(this, ctx, key, `bit(${length})`);\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.length !== undefined && `(${this.data.length})`,\n );\n }\n}\n\nexport class BitVaryingColumn<\n Schema extends ColumnSchemaConfig,\n> extends Column {\n declare __schema: Schema;\n dataType = 'varbit' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['bit']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['bit']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['bit']>;\n operators = Operators.ordinalText;\n declare data: Column.Data & { length?: number };\n\n constructor(schema: Schema, length?: number) {\n super(schema, schema.bit(length) as ReturnType<Schema['bit']>);\n this.data.length = length;\n this.data.alias = 'bitVarying';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n const { length } = this.data;\n return columnCode(this, ctx, key, `bitVarying(${length ?? ''})`);\n }\n\n toSQL() {\n return joinTruthy(\n this.dataType,\n this.data.length !== undefined && `(${this.data.length})`,\n );\n }\n}\n\ntype TsVectorGeneratedColumns = string[] | SearchWeightRecord;\n\n// A tsvector value is a sorted list of distinct lexemes\nexport class TsVectorColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'tsvector' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.ordinalText;\n\n constructor(\n schema: Schema,\n public defaultLanguage = getDefaultLanguage(),\n ) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `tsvector()`);\n }\n\n /**\n * For `tsvector` column type, it can also accept language (optional) and columns:\n *\n * ```ts\n * import { change } from '../dbScript';\n *\n * change(async (db) => {\n * await db.createTable('post', (t) => ({\n * id: t.id(),\n * title: t.text(),\n * body: t.text(),\n * // join title and body into a single ts_vector\n * generatedTsVector: t.tsvector().generated(['title', 'body']).searchIndex(),\n * // with language:\n * spanishTsVector: t\n * .tsvector()\n * .generated('spanish', ['title', 'body'])\n * .searchIndex(),\n * }));\n * });\n * ```\n *\n * @param args\n */\n generated<T extends Column.Pick.Data>(\n this: T,\n ...args:\n | StaticSQLArgs\n | [language: string, columns: TsVectorGeneratedColumns]\n | [columns: TsVectorGeneratedColumns]\n ): Column.Generated<T> {\n const arg = args[0];\n // early return on StaticSQLArgs case\n if (typeof arg === 'object' && 'raw' in arg) {\n return super.generated(...(args as StaticSQLArgs)) as never;\n }\n\n const toSQL: Column.Data.Generated['toSQL'] = (ctx) => {\n const first = args[0];\n const target = typeof first === 'string' ? (args[1] as string[]) : first;\n\n const language =\n typeof first === 'string'\n ? first\n : (this as unknown as TsVectorColumn<ColumnSchemaConfig>)\n .defaultLanguage;\n\n const { snakeCase } = ctx;\n\n let sql;\n if (Array.isArray(target)) {\n const columns =\n target.length === 1\n ? `\"${snakeCase ? toSnakeCase(target[0]) : target[0]}\"`\n : target\n .map(\n (column) =>\n `coalesce(\"${\n snakeCase ? toSnakeCase(column) : column\n }\", '')`,\n )\n .join(` || ' ' || `);\n\n sql = `to_tsvector('${language}', ${columns})`;\n } else {\n for (const key in target) {\n sql =\n (sql ? sql + ' || ' : '(') +\n `setweight(to_tsvector('${language}', coalesce(\"${\n snakeCase ? toSnakeCase(key) : key\n }\", '')), '${(target as RecordString)[key]}')`;\n }\n if (sql) {\n sql += ')';\n } else {\n throw new Error('Empty target in the text search generated column');\n }\n }\n\n return sql;\n };\n\n const toCode = (): string => {\n let code = '.generated(';\n\n const first = args[0];\n let target;\n if (typeof first === 'string') {\n code += `'${first}', `;\n target = args[1] as string[];\n } else {\n target = args[0];\n }\n\n if (Array.isArray(target)) {\n code += `[${target.map((x) => `'${x}'`).join(', ')}]`;\n } else {\n const pairs: string[] = [];\n for (const key in target as RecordString) {\n pairs.push(\n `${quoteObjectKey(key, false)}: '${(target as RecordString)[key]}'`,\n );\n }\n code += `{ ${pairs.join(', ')} }`;\n }\n\n return code + ')';\n };\n\n const column = setColumnData(this, 'generated', {\n toSQL,\n toCode,\n });\n column.data.readOnly = true;\n return column as never;\n }\n}\n\n// A tsquery value stores lexemes that are to be searched for\nexport class TsQueryColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'tsquery' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `tsquery()`);\n }\n}\n\nconst uuidDefaultSQL = 'gen_random_uuid()';\nconst uuidDefault = new RawSql(uuidDefaultSQL);\n\n// uuid stores Universally Unique Identifiers (UUID)\nexport class UUIDColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'uuid' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['uuid']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['uuid']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['uuid']>;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.uuid() as never);\n this.data.defaultDefault = uuidDefault;\n }\n\n /**\n * see {@link Column.primaryKey}\n */\n primaryKey<T extends Column.Pick.Data, Name extends string>(\n this: T,\n name?: Name,\n ): // using & bc otherwise the return type doesn't match `primaryKey` in ColumnType and TS complains\n T & {\n data: { primaryKey: Name };\n } & Column.Data.Default {\n const column = super.primaryKey(name);\n if (!column.data.default) column.data.default = uuidDefault;\n return column as never;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `uuid()`);\n }\n}\n\n// xml data type can be used to store XML data\nexport class XMLColumn<Schema extends ColumnSchemaConfig> extends Column {\n declare __schema: Schema;\n dataType = 'xml' as const;\n declare __type: string;\n declare __inputType: string;\n declare inputSchema: ReturnType<Schema['stringSchema']>;\n declare __outputType: string;\n declare outputSchema: ReturnType<Schema['stringSchema']>;\n declare __queryType: string;\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.text;\n\n private static _instance: XMLColumn<DefaultSchemaConfig> | undefined;\n static get instance() {\n return (this._instance ??= new XMLColumn(internalSchemaConfig));\n }\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `xml()`);\n }\n}\n\n// citext is a postgres extension\nexport class CitextColumn<\n Schema extends ColumnSchemaConfig,\n> extends TextBaseColumn<Schema, OperatorsOrdinalText> {\n declare __schema: Schema;\n dataType = 'citext' as const;\n declare data: TextColumnData & { minArg?: number; maxArg?: number };\n declare querySchema: ReturnType<Schema['stringSchema']>;\n operators = Operators.ordinalText;\n\n constructor(schema: Schema) {\n super(schema, schema.stringSchema() as never);\n this.data.extension = 'citext';\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return textColumnToCode(this, ctx, key);\n }\n}\n","import { pushOrNewArrayToObjectImmutable, RecordUnknown } from '../utils';\nimport { Column, getDefaultNowFn } from './column';\nimport { RawSql } from '../query/expressions/raw-sql';\n\n// Column types returned by `...t.timestamps()` and variations.\nexport interface Timestamps<T extends Column.Pick.Data> {\n // Timestamp column with a `now()` default\n createdAt: Column.HasDefault<T>;\n // Timestamp column with a `now()` default, and it's being updated on every record update.\n updatedAt: Column.HasDefault<T>;\n}\n\n// Simplified SQL type that returns raw SQL as it is, without dealing with SQL variables.\nclass SimpleRawSQL extends RawSql {\n // Simply returning SQL provided in the constructor.\n makeSQL(): string {\n return this._sql as string;\n }\n}\n\n// Construct a simplified raw SQL.\nconst raw = (sql: string) => new SimpleRawSQL(sql);\n\nexport interface TimestampHelpers {\n /**\n * Add `createdAt` and `updatedAt` timestamps. Both have `now()` as a default, `updatedAt` is automatically updated during update.\n */\n timestamps<T extends Column.Pick.Data>(this: {\n timestamp(): T;\n }): Timestamps<T>;\n\n /**\n * The same as {@link timestamps}, for the timestamp without time zone time.\n */\n timestampsNoTZ<T extends Column.Pick.Data>(this: {\n timestampNoTZ(): T;\n }): Timestamps<T>;\n}\n\nconst makeTimestamps = <T extends Column.Pick.Data>(timestamp: () => T) => {\n const now = getDefaultNowFn();\n const nowRaw = raw(now);\n const updatedAt = (timestamp() as unknown as Column).default(nowRaw);\n let updater:\n | ((data: (RecordUnknown | (() => void))[]) => RecordUnknown | undefined)\n | undefined;\n\n updatedAt.data.modifyQuery = (q: unknown, column: Column.Pick.Data) => {\n if (!updater) {\n const key = column.data.key;\n updater = (data) => {\n if (\n data.some((item) => {\n return typeof item !== 'function' && item[key];\n })\n )\n return;\n\n return { [column.data.key]: nowRaw };\n };\n }\n\n pushOrNewArrayToObjectImmutable(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (q as any).q,\n 'updateData',\n updater,\n );\n };\n updatedAt.data.defaultTimestamp = 'updatedAt';\n\n const createdAt = (timestamp() as unknown as Column).default(nowRaw);\n createdAt.data.defaultTimestamp = 'createdAt';\n\n return {\n createdAt,\n updatedAt,\n } as never;\n};\n\nexport const timestampHelpers: TimestampHelpers = {\n timestamps<T extends Column.Pick.Data>(this: {\n timestamp(): T;\n }): Timestamps<T> {\n return makeTimestamps(this.timestamp);\n },\n\n timestampsNoTZ<T extends Column.Pick.Data>(this: {\n timestampNoTZ(): T;\n }): Timestamps<T> {\n return makeTimestamps(this.timestampNoTZ);\n },\n};\n","import { Code, ColumnToCodeCtx } from '../code';\nimport { Column } from '../column';\nimport { Operators } from '../operators';\nimport { columnCode } from '../code';\nimport { setColumnDefaultParse } from '../column.utils';\nimport { ColumnSchemaConfig } from '../column-schema';\n\nconst defaultSrid = 4326;\n\nexport interface PostgisPoint {\n lon: number;\n lat: number;\n srid?: number;\n}\n\nconst encode = ({ srid = defaultSrid, lon, lat }: PostgisPoint): string => {\n const arr = new Uint8Array(25);\n const view = new DataView(arr.buffer);\n\n // first byte 01 indicates little-endian\n view.setInt8(0, 1);\n\n // geometry type Point\n view.setInt8(1, 1);\n // it's a part of geom type, not sure why it's 32\n view.setInt8(4, 32);\n\n view.setUint32(5, srid, true);\n view.setFloat64(9, lon, true);\n view.setFloat64(17, lat, true);\n\n return uint8ArrToHex(arr);\n};\n\nexport class PostgisGeographyPointColumn<\n Schema extends ColumnSchemaConfig,\n> extends Column {\n declare __schema: Schema;\n dataType = 'geography(Point)';\n declare __type: PostgisPoint;\n declare __inputType: PostgisPoint;\n declare inputSchema: ReturnType<Schema['geographyPointSchema']>;\n declare __outputType: PostgisPoint;\n declare outputSchema: ReturnType<Schema['geographyPointSchema']>;\n declare __queryType: PostgisPoint;\n declare querySchema: ReturnType<Schema['geographyPointSchema']>;\n operators = Operators.any;\n\n // It is used by test-factory\n static encode = encode;\n\n static isDefaultPoint(typmod: number) {\n return typmodType(typmod) === 'Point' && typmodSrid(typmod) === defaultSrid;\n }\n\n constructor(schema: Schema) {\n super(schema, schema.geographyPointSchema() as never);\n setColumnDefaultParse(this, parse);\n this.data.encode = encode;\n }\n\n toCode(ctx: ColumnToCodeCtx, key: string): Code {\n return columnCode(this, ctx, key, `geography.point()`);\n }\n}\n\nconst parse = (input: string): PostgisPoint => {\n const bytes = new Uint8Array(20);\n for (let i = 0; i < 40; i += 2) {\n bytes[i / 2] = parseInt(input.slice(10 + i, 12 + i), 16);\n }\n const view = new DataView(bytes.buffer);\n\n const srid = view.getUint32(0, true);\n const lon = view.getFloat64(4, true);\n const lat = view.getFloat64(12, true);\n\n return srid === defaultSrid\n ? { lon, lat }\n : {\n lon,\n lat,\n srid,\n };\n};\n\nconst typmodGetType = (typmod: number) => (typmod & 0x000000fc) >> 2;\n\nconst lwtypeName = (type: number) =>\n [\n 'Unknown',\n 'Point',\n 'LineString',\n 'Polygon',\n 'MultiPoint',\n 'MultiLineString',\n 'MultiPolygon',\n 'GeometryCollection',\n 'CircularString',\n 'CompoundCurve',\n 'CurvePolygon',\n 'MultiCurve',\n 'MultiSurface',\n 'PolyhedralSurface',\n 'Triangle',\n 'Tin',\n ][type] || 'Invalid type';\n\nconst typmodGetZ = (typmod: number) => (typmod & 0x00000002) >> 1;\n\nconst typmodGetM = (typmod: number) => typmod & 0x00000001;\n\nconst typmodType = (typmod: number) => {\n const type = typmodGetType(typmod);\n\n let s = '';\n\n if (typmod < 0 || type === 0) {\n s += 'Geometry';\n } else {\n s += lwtypeName(type);\n }\n\n if (typmod >= 0 && typmodGetZ(typmod)) s += 'Z';\n\n if (typmod >= 0 && typmodGetM(typmod)) s += 'M';\n\n return s;\n};\n\nconst typmodSrid = (typmod: number) => {\n return typmod < 0 ? 0 : ((typmod & 0x0fffff00) - (typmod & 0x10000000)) >> 8;\n};\n\nexport const postgisTypmodToSql = (typmod: number) => {\n const srid = typmodSrid(typmod);\n return typmodType(typmod) + (srid === defaultSrid ? '' : ', ' + srid);\n};\n\nlet byteToHex: string[] | undefined;\nfunction uint8ArrToHex(arr: Uint8Array) {\n if (!byteToHex) {\n byteToHex = [];\n for (let n = 0; n <= 0xff; ++n) {\n const hexOctet = n.toString(16).padStart(2, '0');\n byteToHex.push(hexOctet);\n }\n }\n\n const hexOctets = [];\n\n for (let i = 0; i < arr.length; ++i) hexOctets.push(byteToHex[arr[i]]);\n\n return hexOctets.join('');\n}\n","import { IntegerColumn } from './column-types/number';\nimport {\n BitColumn,\n BitVaryingColumn,\n BoxColumn,\n ByteaColumn,\n CidrColumn,\n CircleColumn,\n InetColumn,\n LineColumn,\n LsegColumn,\n MacAddr8Column,\n MacAddrColumn,\n PathColumn,\n PointColumn,\n PolygonColumn,\n TsQueryColumn,\n TsVectorColumn,\n UUIDColumn,\n XMLColumn,\n} from './column-types/string';\nimport { IntervalColumn, TimeColumn } from './column-types/date-time';\nimport { BooleanColumn } from './column-types/boolean';\nimport { timestampHelpers, TimestampHelpers } from './timestamps';\nimport { CustomTypeColumn, DomainColumn } from './column-types/custom-type';\nimport { RawSql, sqlFn, SqlFn } from '../query/expressions/raw-sql';\nimport { TableData } from '../tableData';\nimport { PostgisGeographyPointColumn } from './column-types/postgis';\nimport { ColumnSchemaConfig } from './column-schema';\nimport {\n Column,\n setCurrentColumnName,\n setDefaultLanguage,\n setDefaultNowFn,\n} from './column';\n\nexport const getColumnTypes = <\n ColumnTypes,\n Shape extends Column.QueryColumnsInit,\n>(\n types: ColumnTypes,\n fn: (t: ColumnTypes) => Shape,\n nowSQL: string | undefined,\n language: string | undefined,\n): Shape => {\n if (nowSQL) setDefaultNowFn(nowSQL);\n if (language) setDefaultLanguage(language);\n return fn(types);\n};\n\nexport interface DefaultColumnTypes<\n SchemaConfig extends ColumnSchemaConfig,\n> extends TimestampHelpers {\n schema: SchemaConfig;\n enum: SchemaConfig['enum'];\n array: SchemaConfig['array'];\n\n name<T>(this: T, name: string): T;\n\n sql: SqlFn;\n\n smallint: SchemaConfig['smallint'];\n integer: SchemaConfig['integer'];\n bigint: SchemaConfig['bigint'];\n numeric: SchemaConfig['decimal'];\n decimal: SchemaConfig['decimal'];\n real: SchemaConfig['real'];\n doublePrecision: SchemaConfig['doublePrecision'];\n identity(\n options?: TableData.Identity,\n ): Column.HasDefault<ReturnType<SchemaConfig['integer']>>;\n smallSerial: SchemaConfig['smallSerial'];\n serial: SchemaConfig['serial'];\n bigSerial: SchemaConfig['bigSerial'];\n money: SchemaConfig['money'];\n varchar: SchemaConfig['varchar'];\n text: SchemaConfig['text'];\n // `varchar` column with optional limit defaulting to 255.\n string: SchemaConfig['string'];\n citext: SchemaConfig['citext'];\n bytea(): ByteaColumn<SchemaConfig>;\n date: SchemaConfig['date'];\n timestampNoTZ: SchemaConfig['timestampNoTZ'];\n timestamp: SchemaConfig['timestamp'];\n time(precision?: number): TimeColumn<SchemaConfig>;\n interval(fields?: string, precision?: number): IntervalColumn<SchemaConfig>;\n boolean(): BooleanColumn<SchemaConfig>;\n point(): PointColumn<SchemaConfig>;\n line(): LineColumn<SchemaConfig>;\n lseg(): LsegColumn<SchemaConfig>;\n box(): BoxColumn<SchemaConfig>;\n path(): PathColumn<SchemaConfig>;\n polygon(): PolygonColumn<SchemaConfig>;\n circle(): CircleColumn<SchemaConfig>;\n cidr(): CidrColumn<SchemaConfig>;\n inet(): InetColumn<SchemaConfig>;\n macaddr(): MacAddrColumn<SchemaConfig>;\n macaddr8(): MacAddr8Column<SchemaConfig>;\n bit(length: number): BitColumn<SchemaConfig>;\n bitVarying(length?: number): BitVaryingColumn<SchemaConfig>;\n tsvector(): TsVectorColumn<SchemaConfig>;\n tsquery(): TsQueryColumn<SchemaConfig>;\n uuid(): UUIDColumn<SchemaConfig>;\n xml(): XMLColumn<SchemaConfig>;\n json: SchemaConfig['json'];\n jsonText: SchemaConfig['jsonText'];\n type(dataType: string): CustomTypeColumn<SchemaConfig>;\n domain(dataType: string): DomainColumn<SchemaConfig>;\n\n geography: {\n point(): PostgisGeographyPointColumn<SchemaConfig>;\n };\n}\n\nexport const makeColumnTypes = <SchemaConfig extends ColumnSchemaConfig>(\n schema: SchemaConfig,\n): DefaultColumnTypes<SchemaConfig> => {\n return {\n schema,\n enum: schema.enum,\n array: schema.array,\n\n name(name: string) {\n setCurrentColumnName(name);\n return this;\n },\n\n sql: sqlFn,\n\n smallint: schema.smallint,\n integer: schema.integer,\n bigint: schema.bigint,\n numeric: schema.decimal,\n decimal: schema.decimal,\n real: schema.real,\n doublePrecision: schema.doublePrecision,\n identity(options) {\n return (schema.integer() as IntegerColumn<SchemaConfig>).identity(\n options,\n ) as never;\n },\n smallSerial: schema.smallSerial,\n serial: schema.serial,\n bigSerial: schema.bigSerial,\n money: schema.money,\n varchar: schema.varchar,\n text: schema.text,\n string: schema.string,\n citext: schema.citext,\n bytea() {\n return new ByteaColumn<SchemaConfig>(schema);\n },\n date: schema.date,\n timestampNoTZ: schema.timestampNoTZ,\n timestamp: schema.timestamp,\n time(precision) {\n return new TimeColumn<SchemaConfig>(schema, precision);\n },\n interval(fields, precision) {\n return new IntervalColumn(\n schema,\n fields,\n precision,\n schema.intervalParse,\n );\n },\n boolean() {\n return new BooleanColumn<SchemaConfig>(schema);\n },\n point() {\n return new PointColumn<SchemaConfig>(schema);\n },\n line() {\n return new LineColumn<SchemaConfig>(schema);\n },\n lseg() {\n return new LsegColumn<SchemaConfig>(schema);\n },\n box() {\n return new BoxColumn<SchemaConfig>(schema);\n },\n path() {\n return new PathColumn<SchemaConfig>(schema);\n },\n polygon() {\n return new PolygonColumn<SchemaConfig>(schema);\n },\n circle() {\n return new CircleColumn<SchemaConfig>(schema);\n },\n cidr() {\n return new CidrColumn<SchemaConfig>(schema);\n },\n inet() {\n return new InetColumn<SchemaConfig>(schema);\n },\n macaddr() {\n return new MacAddrColumn<SchemaConfig>(schema);\n },\n macaddr8() {\n return new MacAddr8Column<SchemaConfig>(schema);\n },\n bit(length) {\n return new BitColumn<SchemaConfig>(schema, length);\n },\n bitVarying(length) {\n return new BitVaryingColumn<SchemaConfig>(schema, length);\n },\n tsvector() {\n return new TsVectorColumn<SchemaConfig>(schema);\n },\n tsquery() {\n return new TsQueryColumn<SchemaConfig>(schema);\n },\n uuid() {\n return new UUIDColumn<SchemaConfig>(schema);\n },\n xml() {\n return new XMLColumn<SchemaConfig>(schema);\n },\n json: schema.json,\n jsonText: schema.jsonText,\n type(dataType) {\n return new CustomTypeColumn<SchemaConfig>(schema, dataType);\n },\n domain(dataType) {\n return new DomainColumn<SchemaConfig>(schema, dataType);\n },\n\n geography: {\n point() {\n return new PostgisGeographyPointColumn(schema);\n },\n },\n\n ...timestampHelpers,\n };\n};\n\nRawSql.prototype.columnTypes = makeColumnTypes;\n","import { Column } from '../column';\nimport { Operators } from '../operators';\nimport { ColumnSchemaConfig } from '../column-schema';\nimport { RecordUnknown } from '../../utils';\nimport {\n CreateCtx,\n CreateSelf,\n} from '../../query/basic-features/mutate/create';\nimport { UpdateSelf } from '../../query/basic-features/mutate/update';\n\nexport abstract class VirtualColumn<\n Schema extends ColumnSchemaConfig,\n InputSchema extends Schema['__schemaType'] = ReturnType<Schema['never']>,\n> extends Column {\n declare __schema: Schema;\n dataType = '';\n declare __type: unknown;\n declare __inputType: unknown;\n declare inputSchema: InputSchema;\n declare __outputType: unknown;\n declare outputSchema: InputSchema;\n declare __queryType: unknown;\n declare querySchema: ReturnType<Schema['never']>;\n operators = Operators.any;\n\n constructor(\n schema: Schema,\n inputSchema: InputSchema = schema.never() as InputSchema,\n ) {\n super(schema, inputSchema);\n // to omit it from selection when selecting *\n this.data.explicitSelect = this.data.appReadOnly = this.data.virtual = true;\n }\n\n toCode(): never {\n throw new Error(`toCode is not implemented for virtual column`);\n }\n\n create?(\n q: CreateSelf,\n ctx: CreateCtx,\n items: unknown[],\n rowIndex: number[],\n count: number,\n ): void;\n\n update?(q: UpdateSelf, set: RecordUnknown): void;\n}\n","import { VirtualColumn } from './virtual';\nimport { RawSql } from '../../query/expressions/raw-sql';\nimport { internalSchemaConfig } from '../default-schema-config';\nimport { ColumnSchemaConfig } from '../column-schema';\n\n// unknown column is used for the case of raw SQL when user doesn't specify a column\nexport class UnknownColumn<\n Schema extends ColumnSchemaConfig,\n> extends VirtualColumn<Schema> {\n static instance = new UnknownColumn(internalSchemaConfig);\n\n selectable = true;\n\n constructor(schema: Schema) {\n super(schema, schema.unknown() as never);\n // include this column when selecting *, unlike the parent VirtualColumn\n this.data.explicitSelect =\n this.data.appReadOnly =\n this.data.virtual =\n undefined;\n }\n}\n\nRawSql.prototype.result = { value: UnknownColumn.instance };\n","import { UnknownColumn } from './column-types/unknown';\nimport { Column } from './column';\nimport { emptyObject } from '../utils';\n\nexport const anyShape = new Proxy(emptyObject, {\n get() {\n return UnknownColumn.instance;\n },\n}) as Column.QueryColumnsInit;\n","import { IsQuery, Query, QueryReturnType } from './query';\nimport { ComputedColumns } from './extra-features/computed/computed';\nimport { Column } from '../columns/column';\nimport { ColumnsShape } from '../columns/columns-shape';\nimport { CteItem } from './basic-features/cte/cte.sql';\nimport {\n HasBeforeAndBeforeSet,\n SubQueryForSql,\n} from './internal-features/sub-query/sub-query-for-sql';\nimport {\n BatchParsers,\n ColumnsParsers,\n PickQueryDataParsers,\n} from './query-columns/query-column-parsers';\nimport {\n PickQueryInputType,\n PickQueryQ,\n PickQueryTable,\n} from './pick-query-types';\nimport {\n Expression,\n ExpressionChain,\n SelectableOrExpression,\n} from './expressions/expression';\nimport { Adapter, QueryResult } from '../adapters/adapter';\nimport { HasHookSelect } from './basic-features/select/hook-select';\nimport {\n MaybeArray,\n pushOrNewArrayToObjectImmutable,\n RecordString,\n RecordUnknown,\n} from '../utils';\nimport { RelationConfigBase } from './relations';\nimport { QueryDataAliases } from './basic-features/as/as';\nimport { AfterCommitErrorHandler } from './basic-features/transaction/transaction';\nimport { Sql } from './sql/sql';\nimport { QueryDataTransform } from './extra-features/data-transform/transform';\nimport { QueryHookUtils } from './extra-features/hooks/hooks';\nimport { SelectItem } from './basic-features/select/select.sql';\nimport { QueryDataSources } from './extra-features/search/search.sql';\nimport { JoinItem, JoinItemArgs } from './basic-features/join/join.sql';\nimport { WhereItem } from './basic-features/where/where.sql';\nimport { OrderItem } from './basic-features/order/order.sql';\nimport { HavingItem } from './basic-features/having/having.sql';\nimport { WindowItem } from './basic-features/window/window.sql';\nimport { QueryDataUnion } from './basic-features/union/union.sql';\nimport {\n OnConflictMerge,\n OnConflictSet,\n OnConflictTarget,\n} from './basic-features/mutate/insert.sql';\nimport { QueryLogger, QueryLogObject } from './basic-features/log/log';\nimport { QuerySchema } from './basic-features/schema/schema';\nimport { MutativeQueriesSelectRelationsQueryData } from './internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\nimport type { ToSQLCtx } from './sql/to-sql';\n\nexport interface RecordOfColumnsShapeBase {\n [K: string]: Column.Shape.QueryInit;\n}\n\nexport interface WithConfigs {\n [K: string]: WithConfig;\n}\n\nexport interface WithConfig {\n shape: Column.Shape.QueryInit;\n computeds?: ComputedColumns;\n}\n\n// Column shapes of joined tables. Used to select, filter, order by the columns of joined tables.\nexport type JoinedShapes = RecordOfColumnsShapeBase;\n\n// Column parsers of joined tables. Used to parse the columns when selecting the column of joined tables.\nexport interface JoinedParsers {\n [K: string]: ColumnsParsers | undefined;\n}\n\nexport type QueryBeforeHook = (query: Query) => void | Promise<void>;\n\nexport type QueryBeforeActionHook = (\n utils: QueryHookUtils<PickQueryInputType>,\n) => void | Promise<void>;\n\nexport type QueryAfterHook<Data = unknown> = (\n data: Data,\n query: Query,\n) => unknown | Promise<unknown>;\n\nexport type QueryDataScopes = {\n [K: string]: QueryScopeData;\n};\n\n// Query data stored for a specific scope to be applied to the query.\n// The scope function is stored and called lazily when building SQL.\nexport type QueryScopeData = (q: Query) => {\n and?: WhereItem[];\n or?: WhereItem[][];\n};\n\nexport type QueryDataFromItem = string | SubQueryForSql | Expression;\n\nexport interface QueryDataJoinTo extends PickQueryTable, PickQueryQ {}\n\nexport interface HandleResult {\n (\n q: Query,\n returnType: QueryReturnType,\n result: QueryResult,\n sql: Sql,\n isSubQuery?: true,\n ): unknown;\n}\n\nexport type WithItems = CteItem[];\n\nexport interface JoinValueDedupItem {\n q: Query;\n a: string;\n}\n\nexport type QueryType =\n | undefined\n // the same as undefined, used only in SQL composer to override default value\n | null\n | 'upsert'\n | 'insert'\n | 'update'\n | 'delete';\n\nexport interface AsFn {\n (as: string): void;\n}\n\nexport interface SelectAllColumnExpression {\n (ctx: ToSQLCtx, quotedAs?: string): string;\n}\n\nexport type SelectAllColumn = string | SelectAllColumnExpression;\n\nexport interface QueryData\n extends\n QueryDataAliases,\n PickQueryDataParsers,\n HasHookSelect,\n MutativeQueriesSelectRelationsQueryData {\n type: QueryType;\n adapter: Adapter;\n selectShape: ColumnsShape;\n // Database relation name used when it differs from the query-facing table alias.\n nameInDb?: string;\n handleResult: HandleResult;\n // When executed in a transaction,\n // the query will be wrapped with a `SAVEPOINT x; *query*; ROLLBACK TO SAVEPOINT x (if fails)`.\n // This allows to continue working with the transaction, otherwise it would be in a failed state and wouldn't accept more queries.\n catch?: boolean;\n returnType: QueryReturnType;\n returning?: boolean;\n returningMany?: boolean;\n wrapInTransaction?: boolean;\n throwOnNotFound?: boolean;\n cteThrowOnNotFound?: boolean;\n ensureCount?: number;\n with?: WithItems;\n withShapes?: WithConfigs;\n joinTo?: QueryDataJoinTo;\n joinedShapes?: JoinedShapes;\n joinedParsers?: JoinedParsers;\n joinedBatchParsers?: { [K: string]: BatchParsers };\n joinedComputeds?: { [K: string]: ComputedColumns | undefined };\n joined?: { [K: string]: Query };\n joinedForSelect?: string;\n innerJoinLateral?: true;\n // to select values with `get` or aggregate them when they were joined inside `select`.\n // joined table name is implicit in such a case.\n valuesJoinedAs?: RecordString;\n schema?: QuerySchema;\n select?: SelectItem[];\n selectCache?: { sql: string; aliases: string[] };\n selectAllColumns?: SelectAllColumn[];\n /**\n * Subset of the `shape` that only includes columns with no `data.explicitSelect`.\n */\n selectAllShape: RecordUnknown;\n /**\n * column type for query with 'value' or 'valueOrThrow' return type\n * Is needed in {@link getShapeFromSelect} to get shape of sub-select that returns a single value.\n */\n getColumn?: Column.Pick.QueryColumn;\n // expr when a single value is returned from the query, when using `get`, or functions.\n expr?: Expression;\n from?: MaybeArray<QueryDataFromItem>;\n updateFrom?: JoinItemArgs;\n sources?: QueryDataSources;\n and?: WhereItem[];\n or?: WhereItem[][];\n order?: OrderItem[];\n // It is used for ORM relations that are known to return a single record to omit `LIMIT` and `OFFSET` from SQL.\n returnsOne?: true;\n // It is used by `joinQueryChainHOF`\n // to remove `LIMIT` and `OFFSET`\n // from the inner query and apply it to the outer query for grouping-ordering reasons.\n useFromLimitOffset?: true;\n coalesceValue?: unknown | Expression;\n notFoundDefault?: unknown;\n defaults?: RecordUnknown;\n // available computed columns, this can be set when selecting from a `with` expression\n runtimeComputeds?: ComputedColumns;\n // selected computed columns\n selectedComputeds?: ComputedColumns;\n // a set for deduplication of hooks added dynamically from the sub queries\n beforeSet?: Set<QueryBeforeHook>;\n // regular before are executed before SQL is generated,\n // but in some cases (dynamic aka lazy SQL) this is impossible,\n // such queries need a second round of `before` hooks to execute after SQL generation.\n dynamicBefore?: HasBeforeAndBeforeSet[];\n // run functions before any query\n before?: QueryBeforeHook[];\n // run functions after any query\n after?: QueryAfterHook[];\n // run functions before create\n beforeCreate?: QueryBeforeHook[];\n // run functions after create in transaction\n afterCreate?: QueryAfterHook[];\n // run functions after create commit\n afterCreateCommit?: QueryAfterHook[];\n // additional select for afterCreate hooks\n afterCreateSelect?: Set<string>;\n // run functions before update\n beforeUpdate?: QueryBeforeHook[];\n // run functions after update in transaction\n afterUpdate?: QueryAfterHook[];\n // run functions after update commit\n afterUpdateCommit?: QueryAfterHook[];\n // additional select for afterUpdate hooks\n afterUpdateSelect?: Set<string>;\n // run functions after create or update in transaction\n afterSave?: QueryAfterHook[];\n // run functions after create or update commit\n afterSaveCommit?: QueryAfterHook[];\n // run functions before delete\n beforeDelete?: QueryBeforeHook[];\n // run functions after delete in transaction\n afterDelete?: QueryAfterHook[];\n // run functions after delete commit\n afterDeleteCommit?: QueryAfterHook[];\n // additional select for afterDelete hooks\n afterDeleteSelect?: Set<string>;\n // catch after commit hooks errors, letting query to return its result\n catchAfterCommitErrors?: AfterCommitErrorHandler[];\n // log settings\n log?: QueryLogObject;\n // logger with `log`, `warn`, `error`\n logger: QueryLogger;\n // convert query into prepared statement automatically as an optimization\n autoPreparedStatements?: boolean;\n // functions to transform query result after loading data\n transform?: QueryDataTransform[];\n // default language for the full text search\n language?: string;\n // Is set for query arg inside `select`, `where`, and others callbacks.\n // It is used by ORM to skip applying a join to the query when `subQuery` is true,\n // the join will be applied after callback is resolved.\n // 1 for the same query, 2 for relation queries returned from the callback.\n subQuery?: number;\n // once there is a hasMany or hasAndBelongsToMany in the chain,\n // the following belongTo and hasOne must also return multiple\n chainMultiple?: boolean;\n // Chained relations, such as `db.user.messages.chat` are stored into array.\n relChain?: { query: Query; rel: RelationConfigBase }[];\n /**\n * Stores current operator functions available for the query.\n * Is needed to remove these operators from query object when changing the query type, see {@link setQueryOperators}.\n */\n operators?: RecordUnknown;\n // Track the applied scopes, this is used when removing the scope from the query.\n scopes?: { [K: string]: QueryScopeData };\n // to allow updating or deleting all records\n all?: true;\n\n chain?: ExpressionChain;\n\n // It is used by `joinQueryChainHOF` to customize the outer query of a chained relation.\n outerQuery?: Query;\n\n // `set` data for insert or update that was set from a `before*` hook\n hookCreateSet?: RecordUnknown[];\n hookUpdateSet?: RecordUnknown[];\n\n appendQueries?: SubQueryForSql[];\n asFns?: AsFn[];\n\n /** select and upsert **/\n\n distinct?: SelectableOrExpression[];\n only?: boolean;\n join?: JoinItem[];\n joinValueDedup?: Map<string, JoinValueDedupItem>;\n group?: (string | Expression)[];\n having?: HavingItem[];\n window?: WindowItem[];\n union?: QueryDataUnion;\n limit?: number;\n offset?: number;\n for?: {\n type: 'UPDATE' | 'NO KEY UPDATE' | 'SHARE' | 'KEY SHARE';\n tableNames?: string[] | Expression;\n mode?: 'NO WAIT' | 'SKIP LOCKED';\n };\n\n /** upsert **/\n\n // upsert does 2 queries: simple find/update, then a union of find/update and insert.\n // this signals SQL code to run the second query for the same query object.\n upsertUpdate?: boolean;\n upsertSecond?: boolean;\n upsertUpdateAsFns?: AsFn[];\n upsertCreateWith?: WithItems;\n upsertCreateAppendQueries?: SubQueryForSql[];\n upsertCreateAsFns?: AsFn[];\n // only for tha data function, it's called only in toSQL after the first query is made.\n upsertInsert?(): unknown;\n\n /** insert **/\n\n columns: string[];\n insertFrom?: SubQueryForSql;\n insertValuesAs?: string;\n queryColumnsCount?: number;\n values: unknown[][];\n onConflict?: {\n target?: OnConflictTarget;\n set?: OnConflictSet;\n merge?: OnConflictMerge;\n };\n\n /** update **/\n\n updateData?: UpdateQueryDataItem[];\n updateMany?: UpdateManyQueryData;\n}\n\nexport interface UpdateManyQueryData {\n primaryKeys: string[];\n setColumns: string[];\n data: RecordUnknown[];\n strict?: boolean;\n}\n\nexport interface UpdateQueryDataObject {\n [K: string]: Expression | { op: string; arg: unknown } | unknown;\n}\n\nexport interface UpdatedAtDataInjector {\n (data: UpdateQueryDataItem[]): UpdateQueryDataObject | void;\n}\n\nexport type UpdateQueryDataItem = UpdateQueryDataObject | UpdatedAtDataInjector;\n\nexport interface PickQueryDataShapeAndJoinedShapes {\n shape: Column.Shape.QueryInit;\n joinedShapes?: JoinedShapes;\n}\n\nexport interface PickQueryDataShapeAndJoinedShapesAndAliases\n extends PickQueryDataShapeAndJoinedShapes, QueryDataAliases {}\n\n/**\n * Push a new element into an array in the query data - immutable version\n *\n * @param q - query\n * @param key - key to get the array\n * @param value - new element to push\n */\nexport const pushQueryValueImmutable = <T extends IsQuery>(\n q: T,\n key: string,\n value: unknown,\n): T => {\n pushOrNewArrayToObjectImmutable(\n (q as unknown as { q: object }).q,\n key,\n value,\n );\n return q;\n};\n\nexport const getClonedQueryData = (query: QueryData): QueryData => {\n return { ...query };\n};\n","import { Query } from '../../query';\nimport { PickQueryQ } from '../../pick-query-types';\nimport { getClonedQueryData } from '../../query-data';\n\n/**\n * Call `.clone()` on a supposed query object\n */\nexport const _clone = (q: unknown): Query => (q as unknown as Query).clone();\n\nexport class QueryClone {\n /**\n * Clones the current query chain, useful for re-using partial query snippets in other queries without mutating the original.\n *\n * Used under the hood, and not really needed on the app side.\n */\n clone<T>(this: T): T {\n const cloned = Object.create((this as unknown as Query).baseQuery);\n cloned.q = getClonedQueryData((this as unknown as PickQueryQ).q);\n return cloned;\n }\n}\n","import { PickQueryQ, PickQuerySelectableShapeAs } from '../../pick-query-types';\nimport { getFreeAlias, RecordString } from '../../../utils';\nimport { Query } from '../../query';\n\nimport { _clone } from '../clone/clone';\nimport { QueryData } from '../../query-data';\n\ninterface PickQueryDataAliases {\n aliases?: RecordString;\n}\n\nexport interface QueryDataAliases extends PickQueryDataAliases {\n as?: string;\n // stores `aliases` of the parent query object when the current query object is withing a query callback.\n outerAliases?: RecordString;\n}\n\nexport type SetQueryTableAlias<\n T extends PickQuerySelectableShapeAs,\n As extends string,\n> = {\n [K in keyof T]: K extends '__selectable'\n ? Omit<T['__selectable'], `${T['__as']}.${keyof T['shape'] & string}`> & {\n [K in keyof T['shape'] & string as `${As}.${K}`]: {\n as: K;\n column: T['shape'][K];\n };\n }\n : K extends '__as'\n ? As\n : T[K];\n};\n\nexport type AsQueryArg = PickQuerySelectableShapeAs;\n\n/** getters **/\n\nexport const getQueryAs = (q: { table?: string; q: { as?: string } }) => {\n return q.q.as || (q.table as string);\n};\n\nexport const requireQueryAs = (q: { table?: string; q: { as?: string } }) => {\n const as = getQueryAs(q);\n if (!as) throw new Error(`Table name or alias is missing`);\n return as;\n};\n\nexport const _getQueryAs = (q: Query): string | undefined => q.q.as;\n\nexport const _getQueryFreeAlias = (q: QueryDataAliases, as: string): string =>\n q.aliases ? getFreeAlias(q.aliases, as) : as;\n\nexport const _checkIfAliased = (\n q: Query,\n as: string,\n name: string,\n): boolean => {\n return q.q.aliases?.[as] === name;\n};\n\nexport const _getQueryAliasOrName = (\n q: PickQueryDataAliases,\n as: string,\n): string => {\n return q.aliases?.[as] || as;\n};\n\nexport const _getQueryOuterAliases = (\n q: QueryDataAliases,\n): RecordString | undefined => {\n return q.outerAliases;\n};\n\n/** setters **/\n\nexport const _setQueryAs = <T extends AsQueryArg, As extends string>(\n self: T,\n as: As,\n): SetQueryTableAlias<T, As> => {\n const { q } = self as unknown as PickQueryQ;\n q.as = as;\n q.aliases = {\n ...q.aliases!,\n [as]: _getQueryFreeAlias(q, as),\n };\n\n return self as never;\n};\n\nexport const _setQueryAlias = (q: Query, name: string, as: string): void => {\n q.q.aliases = { ...q.q.aliases, [as]: name };\n};\n\nexport const _setSubQueryAliases = (q: Query): void => {\n q.q.outerAliases = q.q.aliases;\n};\n\n/**\n * Is used in `chain`: combines query and its relation aliases,\n * stores the result to the relation query data.\n */\nexport const _applyRelationAliases = (\n query: Query,\n relQueryData: QueryData,\n): void => {\n const aliases = query.q.as\n ? { ...query.q.aliases }\n : { ...query.q.aliases, [query.table as string]: query.table as string };\n\n const relAliases = relQueryData.aliases!; // is always set for a relation\n for (const as in relAliases) {\n aliases[as] = getFreeAlias(aliases, as);\n }\n relQueryData.as = aliases[relQueryData.as!]; // `as` is always set for a relation;\n relQueryData.aliases = aliases;\n};\n\nexport const _copyQueryAliasToQuery = (\n fromQuery: Query,\n toQuery: Query,\n key: string,\n): string => {\n const name = _getQueryAliasOrName(fromQuery.q, key);\n if (name !== key) {\n _setQueryAlias(toQuery, name, key);\n }\n return name;\n};\n\nexport abstract class QueryAsMethods {\n /**\n * Sets table alias:\n *\n * ```ts\n * db.table.as('u').select('u.name');\n *\n * // Can be used in the join:\n * db.table.join(db.profile.as('p'), 'p.userId', 'user.id');\n * ```\n *\n * @param as - alias for the table of this query\n */\n as<T extends AsQueryArg, As extends string>(\n this: T,\n as: As,\n ): SetQueryTableAlias<T, As> {\n return _setQueryAs(_clone(this), as) as never;\n }\n}\n","import { Column } from '../../columns';\nimport { Query } from '../query';\n\nexport interface QueryInternalColumnNameToKey {\n // cache `columnNameToKey` method that's available on table instances\n columnNameToKeyMap?: Map<string, string>;\n}\n\n/**\n * In snake case mode, or when columns have custom names,\n * use this method to exchange a db column name to its runtime key.\n */\nexport const queryColumnNameToKey = (\n q: Query,\n name: string,\n): string | undefined => {\n let map = q.internal.columnNameToKeyMap;\n if (!map) {\n q.internal.columnNameToKeyMap = map = new Map<string, string>();\n\n const { shape } = q;\n for (const key in q.shape) {\n const column = shape[key];\n map.set((column as Column.Pick.QueryInit).data.name ?? key, key);\n }\n }\n\n return map.get(name);\n};\n","import { RecordUnknown } from '../utils';\nimport { PickQueryShape } from './pick-query-types';\nimport { IsQuery, Query } from './query';\nimport { queryColumnNameToKey } from './query-columns/query-columns';\n\nexport abstract class OrchidOrmError extends Error {}\n\n/**\n * When we search for a single record, and it is not found, it can either throw an error, or return `undefined`.\n *\n * Unlike other database libraries, `Orchid ORM` decided to throw errors by default when using methods `take`, `find`, `findBy`, `get` and the record is not found.\n * It is a [good practice](https://github.com/goldbergyoni/nodebestpractices/blob/master/sections/errorhandling/centralizedhandling.md) to catch common errors in a centralized place (see [global error handling](https://orchid-orm.netlify.app/guide/error-handling.html#global-error-handling)), and this allows for a more concise code.\n *\n * If it's more suitable to get the `undefined` value instead of throwing, use `takeOptional`, `findOptional`, `findByOptional`, `getOptional` instead.\n */\nexport class NotFoundError extends OrchidOrmError {\n // `#query` is private to prevent it from serializing to not cause problems to test runner reports\n // it is exposed with `getQuery` method which prevents this problem from both Vitest and Jest.\n // Exposing it with `get query()` still leaves the issue in Vitest.\n readonly #query: Query;\n\n constructor(query: IsQuery, message = 'Record is not found') {\n super(message);\n this.#query = query as Query;\n }\n\n getQuery() {\n return this.#query;\n }\n}\n\nexport class OrchidOrmInternalError extends Error {\n // `#query` is private to prevent it from serializing to not cause problems to test runner reports\n // it is exposed with `getQuery` method which prevents this problem from both Vitest and Jest.\n // Exposing it with `get query()` still leaves the issue in Vitest.\n readonly #query: Query;\n\n constructor(\n query: IsQuery,\n message?: string,\n public data?: RecordUnknown,\n ) {\n super(message);\n this.#query = query as Query;\n }\n\n getQuery() {\n return this.#query;\n }\n}\n\nexport type QueryErrorName =\n | 'parseComplete'\n | 'bindComplete'\n | 'closeComplete'\n | 'noData'\n | 'portalSuspended'\n | 'replicationStart'\n | 'emptyQuery'\n | 'copyDone'\n | 'copyData'\n | 'rowDescription'\n | 'parameterDescription'\n | 'parameterStatus'\n | 'backendKeyData'\n | 'notification'\n | 'readyForQuery'\n | 'commandComplete'\n | 'dataRow'\n | 'copyInResponse'\n | 'copyOutResponse'\n | 'authenticationOk'\n | 'authenticationMD5Password'\n | 'authenticationCleartextPassword'\n | 'authenticationSASL'\n | 'authenticationSASLContinue'\n | 'authenticationSASLFinal'\n | 'error'\n | 'notice';\n\nexport abstract class QueryError<\n T extends PickQueryShape = PickQueryShape,\n> extends OrchidOrmInternalError {\n declare message: string;\n declare length?: number;\n declare name: QueryErrorName;\n declare stack: string | undefined;\n code: string | undefined;\n detail: string | undefined;\n severity: string | undefined;\n hint: string | undefined;\n position: string | undefined;\n internalPosition: string | undefined;\n internalQuery: string | undefined;\n where: string | undefined;\n schema: string | undefined;\n table: string | undefined;\n column: string | undefined;\n dataType: string | undefined;\n constraint: string | undefined;\n file: string | undefined;\n line: string | undefined;\n routine: string | undefined;\n\n get isUnique() {\n return this.code === '23505';\n }\n\n #columnsCache?: { [K in keyof T['shape']]?: true };\n get columns() {\n if (this.#columnsCache) return this.#columnsCache;\n\n const columns: { [K in keyof T['shape']]?: true } = {};\n\n if (this.detail) {\n const list = this.detail.match(/\\((.*)\\)=/)?.[1];\n if (list) {\n list.split(', ').forEach((item) => {\n const column = (\n item.startsWith('\"') ? item.slice(1, -1) : item\n ) as keyof T['shape'];\n\n const key =\n queryColumnNameToKey(this.getQuery(), column as string) ?? column;\n columns[key as keyof T['shape']] = true;\n });\n }\n }\n\n return (this.#columnsCache = columns);\n }\n}\n\nexport class MoreThanOneRowError extends OrchidOrmInternalError {\n constructor(query: IsQuery, message?: string) {\n super(query, message);\n }\n}\n\nexport class UnhandledTypeError extends OrchidOrmInternalError {\n constructor(query: IsQuery, value: never) {\n super(query, `Unhandled type: ${JSON.stringify(value)} received`);\n }\n}\n\n/**\n * Error thrown when attempting to nest SQL session scopes.\n * Nested withOptions/$withOptions calls that supply role or setConfig while an outer\n * scope already has SQL session state defined will throw this error.\n */\nexport class NestedSqlSessionError extends OrchidOrmInternalError {\n constructor(query: IsQuery) {\n super(\n query,\n 'Cannot nest SQL session scopes. Outer scope already has role or setConfig defined.',\n );\n }\n}\n\nexport class CannotMutateReadOnlyTableError extends OrchidOrmInternalError {\n constructor(query: IsQuery) {\n super(query, 'Cannot mutate a readonly table.');\n }\n}\n","import { type IsQuery } from '../../query';\nimport { NestedSqlSessionError } from '../../query/errors';\nimport { type PickQueryQ } from '../../query/pick-query-types';\nimport { type QueryResult } from '../adapter';\nimport { quoteIdentifier } from '../../utils';\n\nexport interface SqlSessionState {\n /**\n * Postgres role for SQL session context.\n *\n * `$withOptions` applies it around query execution; transaction options apply\n * it with transaction-local semantics.\n */\n role?: string;\n /**\n * Postgres custom settings for SQL session context.\n *\n * `$withOptions` applies them around query execution; transaction options\n * apply them with transaction-local semantics.\n */\n setConfig?: Record<string, string | number | boolean>;\n}\n\nexport interface SqlSessionContextSetupResult {\n roleSetupSql?: string;\n configSetupSql?: string;\n captureRoleSql?: string;\n captureConfigSql?: string;\n captureConfigValues?: string[];\n}\n\nexport interface SqlSessionContextQueryFn {\n (sql: string, values?: unknown[]): Promise<QueryResult>;\n}\n\ninterface CapturedSessionState {\n previousRole?: string;\n previousConfigs?: Record<string, string | null>;\n}\n\nconst hasSqlSessionContextOptions = (options: SqlSessionState): boolean => {\n return options.role !== undefined || options.setConfig !== undefined;\n};\n\nconst hasActiveSqlSessionContext = (\n state: SqlSessionState | undefined,\n): boolean => {\n if (!state) return false;\n return state.role !== undefined || state.setConfig !== undefined;\n};\n\nconst buildConfigRestoreExpression = (\n key: string,\n value: string | null | undefined,\n): string => {\n const escapedKey = key.replace(/'/g, \"''\");\n if (value === null || value === undefined) {\n value = '';\n }\n return `set_config('${escapedKey}', '${value.replace(/'/g, \"''\")}', false) as \"${key}\"`;\n};\n\nexport const sqlSessionContextSetStorageOptions = (\n query: PickQueryQ,\n state: SqlSessionState | undefined,\n options: SqlSessionState,\n result: SqlSessionState,\n): void => {\n if (\n hasSqlSessionContextOptions(options) &&\n hasActiveSqlSessionContext(state)\n ) {\n throw new NestedSqlSessionError(query as unknown as IsQuery);\n }\n\n if (options.role !== undefined) {\n result.role = options.role;\n }\n\n if (options.setConfig) {\n result.setConfig = options.setConfig;\n }\n};\n\nexport const sqlSessionContextMergeStorageState = (\n state: SqlSessionState | undefined,\n options: SqlSessionState | undefined,\n): SqlSessionState | undefined => {\n if (!options) return state;\n\n return {\n role: options.role ?? state?.role,\n setConfig: options.setConfig ?? state?.setConfig,\n };\n};\n\nexport const sqlSessionContextGetStateFromAsyncState = (\n state: SqlSessionState | undefined,\n): SqlSessionState | undefined => {\n return state?.role || state?.setConfig ? state : undefined;\n};\n\nexport const sqlSessionContextComputeSetup = (\n desired: SqlSessionState | undefined,\n): SqlSessionContextSetupResult | undefined => {\n if (!desired) return undefined;\n\n const role = desired.role;\n const hasRole = role !== undefined;\n const { setConfig } = desired;\n const configKeys = setConfig && Object.keys(setConfig);\n const hasConfig = configKeys && configKeys.length > 0;\n\n if (!hasRole && !hasConfig) return undefined;\n\n const result: SqlSessionContextSetupResult = {};\n\n if (hasRole) {\n result.roleSetupSql = `SET ROLE ${quoteIdentifier(role)}`;\n result.captureRoleSql = 'SELECT current_user';\n }\n\n if (hasConfig && setConfig) {\n result.captureConfigValues = configKeys;\n const captureColumns = configKeys\n .map((key, i) => `current_setting($${i + 1}, true) as \"${key}\"`)\n .join(', ');\n result.captureConfigSql = `SELECT ${captureColumns}`;\n\n const setColumns = configKeys\n .map((key) => {\n const value = setConfig[key];\n return `set_config('${key.replace(/'/g, \"''\")}', '${typeof value === 'string' ? value.replace(/'/g, \"''\") : value}', false) as \"${key}\"`;\n })\n .join(', ');\n result.configSetupSql = `SELECT ${setColumns}`;\n }\n\n return result;\n};\n\nexport const sqlSessionContextBuildConfigRestoreBatchSql = (\n configs: Record<string, string | null | undefined>,\n): string | undefined => {\n const keys = Object.keys(configs);\n if (keys.length === 0) return undefined;\n\n const expressions = keys\n .map((key) => buildConfigRestoreExpression(key, configs[key]))\n .join(', ');\n return `SELECT ${expressions}`;\n};\n\nexport const sqlSessionContextHasState = (\n state: SqlSessionState | undefined,\n): boolean => {\n if (!state) return false;\n return (\n state.role !== undefined ||\n (state.setConfig !== undefined && Object.keys(state.setConfig).length > 0)\n );\n};\n\nexport const sqlSessionContextExecute = async <T extends QueryResult>(\n query: SqlSessionContextQueryFn,\n setup: SqlSessionContextSetupResult | undefined,\n mainQuery: () => Promise<T>,\n): Promise<T> => {\n if (!setup) {\n return mainQuery();\n }\n\n const captured: CapturedSessionState = {};\n const {\n captureRoleSql,\n roleSetupSql,\n captureConfigSql,\n captureConfigValues,\n configSetupSql,\n } = setup;\n\n const setupPromises: Promise<unknown>[] = [];\n\n if (captureRoleSql) {\n setupPromises.push(\n query(captureRoleSql).then((res) => {\n captured.previousRole = (res.rows[0] as unknown[])?.[0] as string;\n }),\n );\n setupPromises.push(query(roleSetupSql!));\n }\n\n if (captureConfigSql && captureConfigValues && configSetupSql) {\n captured.previousConfigs = {};\n const previousConfigs = captured.previousConfigs;\n setupPromises.push(\n query(captureConfigSql, captureConfigValues).then((res) => {\n const row = res.rows[0] as unknown[];\n captureConfigValues.forEach((key, i) => {\n previousConfigs[key] = row[i] as string | null;\n });\n }),\n );\n setupPromises.push(query(configSetupSql));\n }\n\n try {\n await Promise.all(setupPromises);\n return await mainQuery();\n } finally {\n const cleanupPromises: Promise<unknown>[] = [];\n\n if (roleSetupSql && captured.previousRole !== undefined) {\n cleanupPromises.push(\n query(`SET ROLE ${quoteIdentifier(captured.previousRole)}`),\n );\n }\n\n if (captured.previousConfigs) {\n const restoreSql = sqlSessionContextBuildConfigRestoreBatchSql(\n captured.previousConfigs,\n );\n if (restoreSql) {\n cleanupPromises.push(query(restoreSql));\n }\n }\n\n await Promise.all(cleanupPromises);\n }\n};\n","import { logParamToLogObject, QueryLogObject } from '../log/log';\nimport {\n AdapterTransactionOptions,\n TransactionAdapter,\n TransactionAfterCommitHook,\n} from '../../../adapters/adapter';\nimport {\n sqlSessionContextMergeStorageState,\n sqlSessionContextSetStorageOptions,\n} from '../../../adapters/features/sql-session-context';\nimport type { SqlSessionState } from '../../../adapters/features/sql-session-context';\nimport { PickQueryQ, PickQueryQAndInternal } from '../../pick-query-types';\nimport { QuerySchema } from '../schema/schema';\n\nexport type { SqlSessionState } from '../../../adapters/features/sql-session-context';\n\nexport interface AsyncState extends SqlSessionState {\n // Database adapter that is connected to a currently running transaction.\n transactionAdapter?: TransactionAdapter;\n // Number of transaction nesting.\n // Top transaction has id = 0, transaction inside of transaction will have id = 1, and so on.\n transactionId?: number;\n // Array of data and functions to call after commit.\n // 1st element is a query result, 2nd element is a query object, 3rd element is array of functions to call with the query result and object.\n afterCommit?: TransactionAfterCommitHook[];\n // To log all the queries after inside the storage scope\n log?: QueryLogObject;\n // number of test transaction wrapping the current one\n testTransactionCount?: number;\n // sequential number for catching save-points\n catchI?: number;\n // a db schema to use by default\n schema?: QuerySchema;\n // Effective transaction role for transaction-scoped SQL session context.\n transactionRole?: SqlSessionState['role'];\n // Effective transaction set_config map for transaction-scoped SQL session context.\n transactionSetConfig?: SqlSessionState['setConfig'];\n}\n\nexport interface StorageOptions extends SqlSessionState {\n log?: boolean;\n schema?: QuerySchema;\n}\n\nexport interface ProcessedStorageOptions extends SqlSessionState {\n log?: QueryLogObject;\n schema?: QuerySchema;\n}\n\nexport const processStorageOptions = (\n query: PickQueryQ,\n state: AsyncState | undefined,\n { log: enableLog, ...options }: StorageOptions,\n): AdapterTransactionOptions | undefined => {\n const log =\n enableLog === undefined\n ? query.q.log\n : logParamToLogObject(query.q.logger, enableLog);\n\n const result = options as ProcessedStorageOptions;\n\n if (log) result.log = log;\n if ('schema' in options) result.schema = options.schema;\n\n sqlSessionContextSetStorageOptions(query, state, options, result);\n\n return result;\n};\n\nlet currentDefaultSchema: string | undefined;\nexport const setCurrentDefaultSchema = (schema: QuerySchema | undefined) => {\n currentDefaultSchema = typeof schema === 'function' ? schema() : schema;\n};\n\nexport const getQuerySchema = (query: PickQueryQ) =>\n query.q.schema || currentDefaultSchema;\n\nexport class QueryStorage {\n async withOptions<Result>(\n this: PickQueryQAndInternal,\n options: StorageOptions,\n cb: () => Promise<Result>,\n ): Promise<Result> {\n const state = this.internal.asyncStorage.getStore();\n const opts = processStorageOptions(this, state, options);\n const sqlSessionState = sqlSessionContextMergeStorageState(state, opts);\n\n // Build new state if options were processed\n const newState: AsyncState = opts\n ? {\n ...state,\n log: opts.log ?? state?.log,\n schema: opts.schema ?? state?.schema,\n ...sqlSessionState,\n }\n : (undefined as unknown as AsyncState);\n\n // If no options were processed, run with the existing state or directly if no state\n return !opts\n ? state\n ? this.internal.asyncStorage.run(state, cb)\n : cb()\n : this.internal.asyncStorage.run(newState, cb);\n }\n}\n","import {\n columnToSqlNotSelect,\n rawOrColumnToSql,\n} from '../../sql/column-to-sql';\nimport { IsQuery, Query } from '../../query';\nimport { whereToSql } from '../where/where.sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { JoinedShapes, QueryData } from '../../query-data';\nimport { RawSql } from '../../expressions/raw-sql';\nimport { Column } from '../../../columns/column';\nimport { moveMutativeQueryToCte } from '../cte/cte.sql';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { _getQueryAliasOrName, getQueryAs } from '../as/as';\nimport { addValue, RecordString, RecordUnknown } from '../../../utils';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport {\n getQueryRelationAliasForAs,\n quoteFromWithSchema,\n quoteTableWithSchema,\n requireTableOrStringFrom,\n} from '../../sql/sql';\nimport { getQuerySchema } from '../storage/storage';\nimport { SelectItem } from '../select/select.sql';\nimport { ColumnsShape } from '../../../columns';\n\nexport type SimpleJoinItemNonSubQueryArgs =\n | [{ [K: string]: string | Expression } | Expression | true]\n | [leftColumn: string | Expression, rightColumn: string | Expression]\n | [\n leftColumn: string | Expression,\n op: string,\n rightColumn: string | Expression,\n ];\n\nexport type JoinItemArgs =\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // lateral join query\n l: SubQueryForSql;\n // as\n a: string;\n // \"inner join\" by checking `IS NOT NULL` in the `ON`\n i?: boolean;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // relation query from `relation.joinQuery`\n j: IsQuery;\n // join a sub query, is not applicable in whereExists\n s: boolean;\n // callback result, if callback is present\n r?: IsQuery;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // `with` item name\n w: string;\n // callback result\n r: IsQuery;\n // join a sub query, is not applicable in whereExists\n s: boolean;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // `with` item name\n w: string;\n // join arguments\n a: SimpleJoinItemNonSubQueryArgs;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // joining query\n q: IsQuery;\n // join a sub query, is not applicable in whereExists\n s: boolean;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // joining query\n q: IsQuery;\n // callback result\n r: IsQuery;\n // join a sub query, is not applicable in whereExists\n s: boolean;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c?: Column.QueryColumns;\n // joining query\n q: IsQuery;\n // join arguments\n a: SimpleJoinItemNonSubQueryArgs;\n // join a sub query, is not applicable in whereExists\n s: boolean;\n }\n | {\n // `updateFrom`: forbid LATERAL\n u?: true;\n c: Column.Shape.Data;\n // alias\n a: string;\n // array of values, item is a record\n d: RecordUnknown[];\n };\n\nexport interface JoinItem {\n type: string;\n args: JoinItemArgs;\n}\n\ntype ItemOf2Or3Length =\n | [leftColumn: string | Expression, rightColumn: string | Expression]\n | [\n leftColumn: string | Expression,\n op: string,\n rightColumn?: string | Expression,\n ];\n\ninterface SqlJoinItem {\n target: string;\n on?: string;\n}\n\nexport const processJoinItem = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: {\n selectShape: ColumnsShape;\n joinedShapes?: JoinedShapes;\n as?: string;\n outerAliases?: RecordString;\n aliases?: RecordString;\n },\n args: JoinItemArgs,\n quotedAs: string | undefined,\n): SqlJoinItem => {\n let target: string;\n let on: string | undefined;\n\n const forbidLateral = 'u' in args;\n\n // lateral\n if ('l' in args) {\n const { aliasValue } = ctx;\n ctx.aliasValue = true;\n\n target = `(${moveMutativeQueryToCte(ctx, args.l)}) \"${_getQueryAliasOrName(\n query,\n args.a,\n )}\"`;\n\n on = `${args.i ? `\"${args.a}\".\"${args.a}\" IS NOT NULL` : 'true'}`;\n\n ctx.aliasValue = aliasValue;\n } else if ('j' in args) {\n const { j, s, r } = args as {\n j: SubQueryForSql;\n s: boolean;\n r?: Query;\n };\n\n const joinTable = j.q.nameInDb || requireTableOrStringFrom(j);\n target = quoteFromWithSchema(getQuerySchema(j), joinTable);\n\n const as = j.q.as as string;\n const joinAs = `\"${as}\"`;\n const alias = getQueryRelationAliasForAs(j, as);\n if (alias) {\n target += ` ${alias}`;\n }\n\n if (r && s) {\n target = subJoinToSql(\n ctx,\n j,\n `\"${joinTable}\"`,\n !forbidLateral,\n joinAs,\n true,\n );\n } else {\n on = whereToSql(ctx, j, j.q, joinAs);\n }\n } else if ('w' in args) {\n const { w } = args;\n target = `\"${w}\"`;\n\n if ('r' in args) {\n const { s, r } = args as {\n w: string;\n s: boolean;\n r: SubQueryForSql;\n };\n if (s) {\n target = subJoinToSql(ctx, r, target, !forbidLateral, target);\n } else {\n on = whereToSql(ctx, r as unknown as Query, r.q, target);\n }\n } else {\n on = processArgs(\n args.a,\n ctx,\n query,\n target,\n (query.joinedShapes as JoinedShapes)[w],\n quotedAs,\n );\n }\n } else if ('d' in args) {\n const shape = args.c;\n const { values } = ctx;\n\n target = `(VALUES ${args.d\n .map((x) => {\n return (\n '(' +\n Object.entries(shape)\n .map(([key, column]) => {\n const value = x[key];\n return (\n addValue(\n values,\n value === null || value === undefined\n ? null\n : column.data.encode\n ? column.data.encode(value)\n : value,\n ) +\n '::' +\n (column as Column).dataType\n );\n })\n .join(', ') +\n ')'\n );\n })\n .join(', ')}) \"${args.a}\"(${Object.entries(shape)\n .map(([key, column]) => `\"${column.data.name || key}\"`)\n .join(', ')})`;\n } else {\n const { q, s } = args as {\n q: SubQueryForSql;\n s: boolean;\n };\n let joinAs;\n\n if ('r' in args) {\n const { r } = args as {\n q: Query;\n s: boolean;\n r: Query;\n };\n\n const res = getArgQueryTarget(ctx, q, s && !forbidLateral, s, s);\n target = res.target;\n joinAs = res.joinAs;\n\n if (!s || forbidLateral) {\n on = whereToSql(ctx, r, r.q, `\"${getQueryAs(r)}\"`);\n }\n } else {\n const res = getArgQueryTarget(ctx, q, false, s);\n target = res.target;\n joinAs = res.joinAs;\n\n if ('a' in args) {\n on = processArgs(args.a, ctx, query, joinAs, q.shape, quotedAs);\n }\n }\n\n // if it's a sub query, WHERE conditions are already in the sub query\n if (!s) {\n const whereSql = whereToSql(\n ctx,\n q,\n {\n ...q.q,\n joinedShapes: {\n ...query.joinedShapes,\n ...q.q.joinedShapes,\n [(table.q.as || table.table) as string]: table.q.selectShape,\n },\n },\n joinAs,\n );\n if (whereSql) {\n if (on) on += ` AND ${whereSql}`;\n else on = whereSql;\n }\n }\n }\n\n return { target, on };\n};\n\nconst getArgQueryTarget = (\n ctx: ToSQLCtx,\n first: SubQueryForSql,\n lateral: boolean,\n joinSubQuery: boolean,\n cloned?: boolean,\n) => {\n const joinQuery = first.q;\n\n const quotedFrom =\n typeof joinQuery.from === 'string' ? `\"${joinQuery.from}\"` : undefined;\n\n let joinAs = quotedFrom || `\"${first.table}\"`;\n\n const qAs = joinQuery.as ? `\"${joinQuery.as}\"` : undefined;\n const aliasToAdd = getQueryRelationAliasForAs(first, joinQuery.as);\n\n if (joinSubQuery) {\n return {\n target: subJoinToSql(ctx, first, joinAs, lateral, qAs, cloned),\n joinAs: qAs || joinAs,\n };\n } else {\n let target = quotedFrom || quoteTableWithSchema(first);\n if (aliasToAdd) {\n joinAs = aliasToAdd;\n target += ` ${aliasToAdd}`;\n }\n return { target, joinAs };\n }\n};\n\nconst subJoinToSql = (\n ctx: ToSQLCtx,\n jq: SubQueryForSql,\n innerAs: string,\n lateral: boolean,\n outerAs?: string,\n cloned?: boolean,\n) => {\n if (!jq.q.select && jq.q.selectAllColumns) {\n if (!cloned) jq = jq.clone();\n jq.q.select = [new RawSql(`${innerAs}.*`)];\n }\n\n const sql = `(${moveMutativeQueryToCte(ctx, jq)}) ${outerAs || innerAs}`;\n return lateral ? `LATERAL ${sql}` : sql;\n};\n\nconst processArgs = (\n args: SimpleJoinItemNonSubQueryArgs,\n ctx: ToSQLCtx,\n query: {\n joinedShapes?: JoinedShapes;\n select?: SelectItem[];\n selectShape: ColumnsShape;\n },\n joinAs: string,\n joinShape: Column.QueryColumns,\n quotedAs?: string,\n): string | undefined => {\n return args.length\n ? args.length === 1\n ? getObjectOrRawConditions(\n ctx,\n query,\n args[0],\n quotedAs,\n joinAs,\n joinShape,\n )\n : getConditionsFor3Or4LengthItem(\n ctx,\n query,\n joinAs,\n quotedAs,\n args as ItemOf2Or3Length,\n joinShape,\n )\n : undefined;\n};\n\nconst getConditionsFor3Or4LengthItem = (\n ctx: ToSQLCtx,\n query: {\n joinedShapes?: JoinedShapes;\n select?: SelectItem[];\n selectShape: ColumnsShape;\n },\n target: string,\n quotedAs: string | undefined,\n args: ItemOf2Or3Length,\n joinShape: Column.QueryColumns,\n): string => {\n const [leftColumn, opOrRightColumn, maybeRightColumn] = args;\n\n const op = maybeRightColumn ? opOrRightColumn : '=';\n const rightColumn = maybeRightColumn ? maybeRightColumn : opOrRightColumn;\n\n return `${rawOrColumnToSql(\n ctx,\n query,\n joinShape,\n leftColumn,\n target,\n )} ${op} ${rawOrColumnToSql(ctx, query, query.selectShape, rightColumn, quotedAs)}`;\n};\n\nconst getObjectOrRawConditions = (\n ctx: ToSQLCtx,\n query: {\n joinedShapes?: JoinedShapes;\n select?: SelectItem[];\n selectShape: ColumnsShape;\n },\n data: { [K: string]: string | Expression } | Expression | true,\n quotedAs: string | undefined,\n joinAs: string,\n joinShape: Column.QueryColumns,\n): string => {\n if (data === true) {\n return 'true';\n } else if (isExpression(data)) {\n return data.toSQL(ctx, quotedAs);\n } else {\n const pairs: string[] = [];\n const shape = query.selectShape;\n\n for (const key in data) {\n const value = data[key];\n\n pairs.push(\n `${columnToSqlNotSelect(\n ctx,\n query,\n joinShape,\n key,\n joinAs,\n )} = ${rawOrColumnToSql(ctx, query, shape, value, quotedAs)}`,\n );\n }\n\n return pairs.join(', ');\n }\n};\n\nexport const pushJoinSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryData & {\n join: JoinItem[];\n },\n quotedAs?: string,\n) => {\n const joinSet = query.join.length > 1 ? new Set<string>() : null;\n\n for (const item of query.join) {\n const { target, on = 'true' } = processJoinItem(\n ctx,\n table,\n query,\n item.args,\n quotedAs,\n );\n\n const sql = `${item.type} ${target} ON ${on}`;\n\n if (joinSet) {\n if (joinSet.has(sql)) continue;\n joinSet.add(sql);\n }\n\n ctx.sql.push(sql);\n }\n};\n","import { selectAllSql } from '../basic-features/select/select.sql';\nimport { columnToSql } from '../sql/column-to-sql';\nimport { Column } from '../../columns/column';\nimport { Expression, ExpressionData } from './expression';\nimport { ToSQLCtx, ToSQLQuery } from '../sql/to-sql';\nimport { QueryData } from '../query-data';\n\n/**\n * Expression that can turn a {@link SelectItem} (except {@link SelectAs}) into SQL.\n * Used by `get` to have an expression that can be chained with operators.\n */\nexport class SelectItemExpression<\n T extends Column.Pick.QueryColumn = Column.Pick.QueryColumn,\n> extends Expression<T> {\n result: { value: T };\n q: ExpressionData;\n\n constructor(\n public query: ToSQLQuery,\n public item: string | Expression,\n value?: T,\n ) {\n super();\n this.result = { value: value as T };\n this.q = query.q as ExpressionData;\n if (value) Object.assign(this, value.operators);\n }\n\n // `makeSQL` acts similarly to how select args are handled\n makeSQL(ctx: ToSQLCtx, quotedAs?: string): string {\n const q = this.q as QueryData;\n return typeof this.item === 'string'\n ? this.item === '*'\n ? selectAllSql(q, quotedAs, undefined, ctx).join(', ')\n : columnToSql(\n ctx,\n q,\n q.selectShape,\n this.item,\n quotedAs,\n true,\n undefined,\n undefined,\n undefined,\n true,\n )\n : this.item.toSQL(ctx, quotedAs);\n }\n}\n","import {\n IsQuery,\n Query,\n QueryTake,\n QueryTakeOptional,\n SetQueryReturnsAll,\n SetQueryReturnsRows,\n} from './query';\nimport { emptyObject, getFreeAlias, RecordUnknown } from '../utils';\nimport {\n CannotMutateReadOnlyTableError,\n OrchidOrmInternalError,\n} from './errors';\nimport {\n PickQueryQ,\n PickQueryQAndBaseQuery,\n PickQueryResult,\n PickQueryResultReturnType,\n} from './pick-query-types';\nimport { _checkIfAliased } from './basic-features/as/as';\n\nimport { getClonedQueryData } from './query-data';\nimport { Column } from '../columns';\n\n/**\n * Push all elements of given array into the array in the query data,\n * set given array if there is no array yet in the query data.\n * Not mutating the array.\n *\n * @param q - query\n * @param key - key to get the array\n * @param value - array with values\n */\nexport const pushQueryArrayImmutable = <T extends PickQueryQ>(\n q: T,\n key: string,\n value: unknown[],\n): T => {\n const arr = (q.q as unknown as RecordUnknown)[key] as unknown[];\n (q.q as unknown as RecordUnknown)[key] = arr ? [...arr, ...value] : value;\n return q;\n};\n\n/**\n * Set value into the object in query data, create the object if it doesn't yet exist.\n * Does not mutate the object.\n *\n * @param q - query\n * @param object - query data key to get the object\n * @param key - object key to set the value into\n * @param value - value to set by the key\n */\nexport const setQueryObjectValueImmutable = <T extends PickQueryQ>(\n q: T,\n object: string,\n key: string,\n value: unknown,\n): T => {\n (q.q as unknown as RecordUnknown)[object] = {\n ...((q.q as unknown as RecordUnknown)[object] as RecordUnknown),\n [key]: value,\n };\n return q as unknown as T;\n};\n\n/**\n * Throw runtime error when delete or update has no where conditions\n *\n * @param q - query\n * @param method - 'update' or 'delete'\n */\nexport const throwIfNoWhere = (q: PickQueryQ, method: string): void => {\n if (!q.q.or && !q.q.and && !q.q.scopes && !q.q.all) {\n throw new OrchidOrmInternalError(\n q as Query,\n `Dangerous ${method} without conditions`,\n );\n }\n};\n\nexport const throwIfJoinLateral = (q: PickQueryQ, method: string): void => {\n if (q.q.join?.some((x) => Array.isArray(x) || ('s' in x.args && x.args.s))) {\n throw new OrchidOrmInternalError(\n q as Query,\n `Cannot join a complex query in ${method}`,\n );\n }\n};\n\nexport const throwIfReadOnly = (query: Query): void => {\n if (query.internal.readOnly) {\n throw new CannotMutateReadOnlyTableError(query);\n }\n};\n\nexport const throwOnReadOnlyUpdate = (\n query: unknown,\n column: Column.Pick.Data,\n key: string,\n) => {\n if (column.data.appReadOnly || column.data.readOnly) {\n throw new OrchidOrmInternalError(\n query as Query,\n 'Trying to update a readonly column',\n { column: key },\n );\n }\n};\n\n// Searches if a given name is already taken, if it is taken it suffixes it with an increment.\n// Stores an empty object under this key and this alias to the query data.\nexport const saveAliasedShape = (\n q: IsQuery,\n as: string,\n key: 'joinedShapes' | 'withShapes',\n): string => {\n const shapes = (q as Query).q[key];\n\n as = getFreeAlias(shapes, as);\n\n setQueryObjectValueImmutable(q as Query, key, as, emptyObject);\n\n return as;\n};\n\n/**\n * Extend query prototype with new methods.\n * The query and its data are cloned (with Object.create).\n *\n * @param q - query object to extend from\n * @param methods - methods to add\n */\nexport const extendQuery = <\n T extends PickQueryQAndBaseQuery,\n Methods extends RecordUnknown,\n>(\n q: T,\n methods: Methods,\n): T & Methods => {\n const base = Object.create(q.baseQuery);\n base.baseQuery = base;\n\n Object.assign(base, methods);\n\n const cloned = Object.create(base);\n cloned.q = getClonedQueryData(q.q);\n\n return cloned as T & Methods;\n};\n\nexport const _queryAll = <T extends PickQueryResult>(\n q: T,\n): SetQueryReturnsAll<T> => {\n (q as unknown as PickQueryQ).q.returnType = 'all';\n (q as unknown as PickQueryQ).q.all = true;\n return q as never;\n};\n\nexport const _queryTake = <T extends PickQueryResultReturnType>(\n query: T,\n): QueryTake<T> => {\n const q = (query as unknown as PickQueryQ).q;\n switch (q.returnType) {\n case 'valueOrThrow':\n case 'pluck':\n case 'void':\n break;\n case 'value': {\n q.returnType = 'valueOrThrow';\n break;\n }\n default: {\n q.returnType = 'oneOrThrow';\n }\n }\n return query as never;\n};\n\nexport const _queryTakeOptional = <T extends PickQueryResultReturnType>(\n query: T,\n): QueryTakeOptional<T> => {\n const q = (query as unknown as PickQueryQ).q;\n switch (q.returnType) {\n case 'value':\n case 'pluck':\n case 'void':\n break;\n case 'valueOrThrow': {\n q.returnType = 'value';\n break;\n }\n default: {\n q.returnType = 'one';\n }\n }\n return query as never;\n};\n\nexport const _queryExec = <T extends IsQuery>(q: T) => {\n (q as unknown as PickQueryQ).q.returnType = 'void';\n return q as never;\n};\n\nexport const _queryRows = <T extends PickQueryResult>(\n q: T,\n): SetQueryReturnsRows<T> => {\n (q as unknown as PickQueryQ).q.returnType = 'rows';\n return q as never;\n};\n\nexport const getFullColumnTable = (\n q: IsQuery,\n column: string,\n index: number,\n as: string | undefined,\n): string => {\n const table = column.slice(0, index);\n return as && table !== as && _checkIfAliased(q as Query, table, as as string)\n ? (as as string)\n : table;\n};\n","import { Query } from '../../query';\nimport {\n AfterCommitStandaloneHook,\n SqlSessionState,\n TransactionAdapter,\n} from '../../../adapters/adapter';\nimport { emptyObject } from '../../../utils';\nimport { OrchidOrmError } from '../../errors';\nimport { PickQueryQAndInternal } from '../../pick-query-types';\nimport { _clone } from '../clone/clone';\nimport { AsyncState, processStorageOptions } from '../storage/storage';\nimport { QuerySchema } from '../schema/schema';\n\nexport interface AsyncTransactionState extends AsyncState {\n transactionAdapter: TransactionAdapter;\n transactionId: number;\n}\n\nexport type IsolationLevel =\n | 'SERIALIZABLE'\n | 'REPEATABLE READ'\n | 'READ COMMITTED'\n | 'READ UNCOMMITTED';\n\nexport interface TransactionOptions extends SqlSessionState {\n /**\n * Enable or disable logging for all queries in the transaction.\n */\n log?: boolean;\n /**\n * Default schema to use for queries in the transaction.\n */\n schema?: QuerySchema;\n /**\n * Postgres isolation level for the top-level transaction.\n */\n level?: IsolationLevel;\n /**\n * Whether the top-level transaction should be read-only.\n */\n readOnly?: boolean;\n /**\n * Whether the top-level transaction should be deferrable.\n */\n deferrable?: boolean;\n /**\n * Postgres role to apply for the transaction callback.\n *\n * Nested transactions can temporarily replace the parent transaction role.\n */\n role?: SqlSessionState['role'];\n /**\n * Postgres custom settings to apply for the transaction callback.\n *\n * Nested transaction settings are shallow-merged over the parent transaction\n * settings while the nested callback runs.\n */\n setConfig?: SqlSessionState['setConfig'];\n}\n\nexport interface AfterCommitErrorFulfilledResult extends PromiseFulfilledResult<unknown> {\n name?: string;\n}\n\nexport interface AfterCommitErrorRejectedResult extends PromiseRejectedResult {\n name?: string;\n}\n\nexport type AfterCommitErrorResult =\n | AfterCommitErrorFulfilledResult\n | AfterCommitErrorRejectedResult;\n\n/**\n * `AfterCommitError` is thrown when one of after commit hooks throws.\n *\n * ```ts\n * interface AfterCommitError extends OrchidOrmError {\n * // the result of transaction functions\n * result: unknown;\n *\n * // Promise.allSettled result + optional function names\n * hookResults: (\n * | {\n * status: 'fulfilled';\n * value: unknown;\n * name?: string;\n * }\n * | {\n * status: 'rejected';\n * reason: any; // the error object thrown by a hook\n * name?: string;\n * }\n * )[];\n * }\n * ```\n *\n * Use `function name() {}` function syntax for hooks to give them names,\n * so later they can be identified when handling after commit errors.\n *\n * ```ts\n * export const SomeTable = defineTable('someTable', (t) => ({\n * ...someColumns,\n * })).init((orm: typeof db, hooks) => {\n * // anonymous funciton - has no name\n * hooks.afterCreateCommit([], async () => {\n * // ...\n * });\n *\n * // named function\n * hooks.afterCreateCommit([], function myHook() {\n * // ...\n * });\n * });\n * ```\n */\nexport class AfterCommitError extends OrchidOrmError {\n constructor(\n public result: unknown,\n public hookResults: AfterCommitErrorResult[],\n ) {\n super('After commit hooks have failed');\n }\n}\n\nexport type AfterCommitErrorHandler = (\n error: AfterCommitError,\n) => void | Promise<void>;\n\nexport const _runAfterCommitHooks = async (\n result: unknown,\n promises: unknown[],\n getHookNames: () => string[],\n catchAfterCommitErrors: AfterCommitErrorHandler[] | undefined,\n) => {\n const hookResults = await Promise.allSettled(promises);\n if (hookResults.some((result) => result.status === 'rejected')) {\n const hookNames = getHookNames();\n\n for (const [i, r] of hookResults.entries()) {\n (r as AfterCommitErrorResult).name = hookNames[i];\n }\n\n const err = new AfterCommitError(result, hookResults);\n if (!catchAfterCommitErrors) throw err;\n\n for (const fn of catchAfterCommitErrors) {\n try {\n fn(err);\n } catch {}\n }\n }\n};\n\n/**\n * Check if inside transaction started by user (not test transaction).\n */\nexport const isInUserTransaction = (\n trx: AsyncState | undefined,\n): trx is AsyncState =>\n trx?.transactionId !== undefined &&\n // when inside test transactions, compare transaction counts to ensure there is a user transaction.\n (!trx.testTransactionCount || trx.transactionId >= trx.testTransactionCount);\n\nexport class QueryTransaction {\n /**\n * In Orchid ORM the method is `$transaction`, when using `pqb` on its own it is `transaction`.\n *\n * `COMMIT` happens automatically after the callback was successfully resolved, and `ROLLBACK` is done automatically if the callback fails.\n *\n * Let's consider the case of transferring money from one user to another:\n *\n * ```ts\n * export const transferMoney = async (\n * fromId: number,\n * toId: number,\n * amount: number,\n * ) => {\n * try {\n * // db.$transaction returns data that is returned from the callback\n * // result here is senderRemainder\n * const result = await db.$transaction(async () => {\n * const sender = await db.user.find(fromId);\n * const senderRemainder = sender.balance - amount;\n * if (senderRemainder < 0) {\n * throw new Error('Sender does not have enough money');\n * }\n *\n * await db.user.find(fromId).decrement({\n * balance: amount,\n * });\n * await db.user.find(toId).increment({\n * balance: amount,\n * });\n *\n * return senderRemainder;\n * });\n * } catch (error) {\n * // handle transaction error\n * }\n * };\n * ```\n *\n * It performs 3 queries in a single transaction: load sender record, decrement sender's balance, increment receiver's balance.\n *\n * If sender or receiver record doesn't exist, it will throw `NotFound` error, and there is an error thrown when sender's balance is too low.\n * In such case, the transaction will be rolled back and no changes will be applied to the database.\n *\n * Internally, ORM relies on [AsyncLocalStorage](https://nodejs.org/api/async_context.html#class-asynclocalstorage) feature of node.js,\n * it allows passing the transaction object implicitly. So that any query that is done inside of callback, will run inside a transaction.\n *\n * ## nested transactions\n *\n * Transactions can be nested one in another.\n * The top level transaction is the real one,\n * and the nested ones are emulated with [savepoint](https://www.postgresql.org/docs/current/sql-savepoint.html) instead of `BEGIN`\n * and [release savepoint](https://www.postgresql.org/docs/current/sql-release-savepoint.html) instead of `COMMIT`.\n *\n * Use [ensureTransaction](#ensuretransaction) to run all queries in a single transaction.\n *\n * ```ts\n * const result = await db.$transaction(async () => {\n * await db.table.create(...one);\n *\n * const result = await db.$transaction(async () => {\n * await db.table.create(...two);\n * return 123;\n * });\n *\n * await db.table.create(...three);\n *\n * return result;\n * });\n *\n * // result is returned from the inner transaction\n * result === 123;\n * ```\n *\n * If the inner transaction throws an error, and it is caught by `try/catch` of outer transaction,\n * it performs [rollback to savepoint](https://www.postgresql.org/docs/current/sql-rollback-to.html)\n * and the outer transaction can continue:\n *\n * ```ts\n * class CustomError extends Error {}\n *\n * await db.$transaction(async () => {\n * try {\n * await db.$transaction(async () => {\n * throw new CustomError();\n * });\n * } catch (err) {\n * if (err instanceof CustomError) {\n * // ignore this error\n * return;\n * }\n * throw err;\n * }\n *\n * // this transaction can continue\n * await db.table.create(...data);\n * });\n * ```\n *\n * If the error in the inner transaction is not caught, all nested transactions are rolled back and aborted.\n *\n * ## SQL session context in transactions\n *\n * Pass `role` and `setConfig` in transaction options to apply Postgres SQL session context for the whole transaction:\n *\n * ```ts\n * await db.$transaction(\n * {\n * role: 'app_user',\n * setConfig: {\n * 'app.tenant_id': tenantId,\n * 'app.user_id': userId,\n * },\n * },\n * async () => {\n * const project = await db.project.find(projectId);\n *\n * await db.project.find(projectId).update({ lastViewedAt: new Date() });\n *\n * return project;\n * },\n * );\n * ```\n *\n * This is different from `$withOptions({ role, setConfig }, cb)`.\n * `$withOptions` is query-scoped and reconciles SQL session state around each query.\n * Transaction options are applied once for the transaction and are useful for request-scoped RLS work that is already transaction-bound.\n *\n * Nested transactions can temporarily override the parent transaction role and config.\n * When the nested transaction finishes, Orchid restores the parent transaction context before the outer callback continues.\n */\n transaction<Result>(\n this: PickQueryQAndInternal,\n cb: () => Promise<Result>,\n ): Promise<Result>;\n transaction<Result>(\n this: PickQueryQAndInternal,\n options: IsolationLevel | TransactionOptions,\n cb: () => Promise<Result>,\n ): Promise<Result>;\n async transaction<Result>(\n this: PickQueryQAndInternal,\n cbOrOptions: IsolationLevel | TransactionOptions | (() => Promise<Result>),\n cb?: () => Promise<Result>,\n ): Promise<Result> {\n let options: TransactionOptions;\n let fn: () => Promise<Result>;\n if (typeof cbOrOptions === 'function') {\n options = emptyObject as TransactionOptions;\n fn = cbOrOptions;\n } else {\n options =\n typeof cbOrOptions === 'object' ? cbOrOptions : { level: cbOrOptions };\n fn = cb as () => Promise<Result>;\n }\n\n let opts = processStorageOptions(this, undefined, options);\n\n return this.q.adapter.transaction(this.internal.asyncStorage, opts, fn);\n }\n\n /**\n * Use the `$ensureTransaction` when you want to ensure the sequence of queries is running in a transaction, but there is no need for Postgres [savepoints](https://www.postgresql.org/docs/current/sql-savepoint.html).\n *\n * ```ts\n * async function updateUserBalance(userId: string, amount: number) {\n * await db.$ensureTransaction(async () => {\n * await db.transfer.create({ userId, amount })\n * await db.user.find(userId).increment({ balance: amount })\n * })\n * }\n *\n * async function saveDeposit(userId: string, deposit: { ... }) {\n * await db.$ensureTransaction(async () => {\n * await db.deposit.create(deposit)\n * // transaction in updateUserBalance won't be started\n * await updateUserBalance(userId, deposit.amount)\n * })\n * }\n * ```\n */\n ensureTransaction<Result>(\n this: PickQueryQAndInternal,\n cb: () => Promise<Result>,\n ): Promise<Result> {\n const trx = this.internal.asyncStorage.getStore();\n if (trx) return cb();\n\n return (\n QueryTransaction.prototype.transaction as (cb: unknown) => Promise<Result>\n ).call(this, cb) as Promise<Result>;\n }\n\n isInTransaction(): boolean {\n const trx = (this as unknown as Query).internal.asyncStorage.getStore();\n\n return isInUserTransaction(trx);\n }\n\n /**\n * Schedules a hook to run after the outermost transaction commits:\n *\n * ```ts\n * await db.$transaction(async () => {\n * await db.table.create(data)\n * await db.table.where({ ...conditions }).update({ key: 'value' })\n *\n * db.$afterCommit(() => { // can be sync or async\n * console.log('after commit')\n * })\n * })\n * ```\n *\n * If used outside the transaction, the hook will be executed almost immediately, on the next microtask:\n *\n * ```ts\n * db.$afterCommit(async () => { // can be sync or async\n * console.log('after commit')\n * })\n * ```\n *\n * If the callback has no `try/catch` and throws an error,\n * this will cause `uncaughtException` if the callback is sync and `unhandledRejection` if it is async.\n */\n afterCommit(this: Query, hook: AfterCommitStandaloneHook): void {\n const trx = this.internal.asyncStorage.getStore();\n if (isInUserTransaction(trx)) {\n (trx.afterCommit ??= []).push(hook);\n } else {\n queueMicrotask(hook);\n }\n }\n\n /**\n * Whenever a query in a transaction fails, the transaction is transitioned to a failed state, no further queries are possible.\n *\n * Use [catchUniqueError](/guide/error-handling.html#catchuniqueerror) to handle uniqueness errors,\n * the following examples do not use it to illustrate error handling.\n *\n * ```ts\n * // This transaction is going to fail\n * db.$transaction(async () => {\n * try {\n * // imagine it fails because the username is already taken\n * await db.user.insert({ username: 'taken' });\n * } catch (err) {\n * // even though the query is wrapped in a try-catch, the transaction fails anyway\n * }\n * });\n * ```\n *\n * You can use `catch` method on a query instead of `try-catch` to surpass the problem.\n * The following transaction won't fail:\n *\n * ```ts\n * // Transaction succeeds\n * db.$transaction(async () => {\n * const result = await db.user.insert({ username: 'taken' }).catch(() => 'failed');\n *\n * if (result === 'failed') {\n * await db.user.insert({ username: 'another' });\n * }\n * });\n * ```\n *\n * This is because when using `catch` method, `OrchidORM` will wrap the query with a savepoint.\n *\n * Alternatively, you can use the `recoverable()` method:\n *\n * ```ts\n * // Transaction succeeds\n * db.$transaction(async () => {\n * try {\n * await db.user.insert({ username: 'taken' }).recoverable();\n * } catch (err) {\n * await db.user.insert({ username: 'another' });\n * }\n * });\n * ```\n */\n recoverable<T>(this: T): T {\n const q = _clone(this);\n q.q.catch = true;\n return q as T;\n }\n}\n","import {\n IsQuery,\n Query,\n QueryOrExpression,\n QueryReturnType,\n} from '../../query';\nimport { AfterCommitErrorHandler } from '../../basic-features/transaction/transaction';\nimport { Column } from '../../../columns';\nimport {\n PickQueryInputType,\n PickQueryQ,\n PickQueryShape,\n} from '../../pick-query-types';\nimport { _clone } from '../../basic-features/clone/clone';\nimport { emptyArray, RecordString, RecordUnknown } from '../../../utils';\nimport { QueryBatchResult } from '../../basic-features/select/select.utils';\nimport {\n pushQueryValueImmutable,\n QueryAfterHook,\n QueryBeforeActionHook,\n QueryBeforeHook,\n} from '../../query-data';\n\n// A function type for after-hook. Constructs type of data argument based on selected columns.\nexport type AfterHook<\n Select extends PropertyKey[],\n Shape extends Column.QueryColumns,\n> = QueryAfterHook<\n {\n [K in Select[number]]: K extends keyof Shape\n ? Shape[K]['__outputType']\n : never;\n }[]\n>;\n\n// Hook argument for selecting columns: array of column names of the table.\nexport type HookSelectArg<T extends PickQueryShape> = (keyof T['shape'] &\n string)[];\n\n// Possible action types to attach hook for.\nexport type HookAction = 'Create' | 'Update' | 'Save' | 'Delete';\n\n// Save `before` hook into the query.\nconst before = <T>(q: T, key: HookAction, cb: QueryBeforeHook): T =>\n pushQueryValueImmutable(q as IsQuery, `before${key}`, cb) as never;\n\n// Save `after` hook into the query: this saves the function and the hook selection into the query data.\nconst after = <T extends PickQueryShape, S extends HookSelectArg<T>>(\n query: T,\n key: HookAction,\n select: S,\n cb: AfterHook<S, T['shape']>,\n commit?: boolean,\n): T => {\n const q = query as unknown as PickQueryQ;\n pushQueryValueImmutable(\n q as never,\n `after${key}${commit ? 'Commit' : ''}`,\n cb,\n );\n\n if (key === 'Save') {\n addSelect(q, 'Create', select);\n addSelect(q, 'Update', select);\n } else {\n addSelect(q, key, select);\n }\n\n return query;\n};\n\nconst addSelect = (\n q: PickQueryQ,\n key: 'Create' | 'Update' | 'Delete',\n select: string[],\n) => {\n const prop = `after${key}Select` as const;\n const set = (q.q[prop] = new Set(q.q[prop]));\n for (const column of select) {\n set.add(column);\n }\n};\n\nexport const _queryHookBeforeQuery = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeHook,\n): T => {\n return pushQueryValueImmutable(q as never, 'before', cb);\n};\n\nexport const _queryHookAfterQuery = <T extends PickQueryShape>(\n q: T,\n cb: QueryAfterHook,\n): T => {\n return pushQueryValueImmutable(q as never, 'after', cb);\n};\n\nexport const _hookSelectColumns = (\n query: Query,\n columns: string[],\n asFn: (as: string[]) => void,\n) => {\n const hookSelect = (query.q.hookSelect = new Map(\n query.q.hookSelect && [...query.q.hookSelect],\n ));\n\n const aliases: string[] = [];\n const addAlias = (as: string) => {\n aliases.push(as);\n if (aliases.length === columns.length) {\n asFn(aliases);\n }\n };\n\n for (const column of columns) {\n const item = hookSelect.get(column);\n hookSelect.set(column, {\n ...item,\n select: column,\n onAs: [...(item?.onAs || emptyArray), addAlias],\n });\n }\n};\n\nexport class QueryHookUtils<T extends PickQueryInputType> {\n constructor(\n public query: IsQuery,\n public columns: string[],\n private key: 'hookCreateSet' | 'hookUpdateSet',\n ) {}\n\n set = (data: {\n [K in keyof T['__inputType']]?:\n | T['__inputType'][K]\n | (() => QueryOrExpression<T['__inputType'][K]>);\n }) => {\n const set: RecordUnknown = {};\n for (const key in data) {\n if (data[key] !== undefined) {\n set[key] = data[key];\n }\n }\n pushQueryValueImmutable(this.query, this.key, set);\n };\n}\n\nexport const finalizeNestedHookSelect = (\n batches: QueryBatchResult[],\n returnType: QueryReturnType,\n tempColumns: Set<string> | undefined,\n renames: RecordString | undefined,\n key: string,\n) => {\n if (renames) {\n for (const { data } of batches) {\n for (const record of data) {\n if (record) {\n for (const a in renames) {\n record[a] = record[renames[a]];\n }\n }\n }\n }\n }\n\n if (tempColumns?.size) {\n for (const { data } of batches) {\n for (const record of data) {\n if (record) {\n for (const key of tempColumns) {\n delete record[key];\n }\n }\n }\n }\n }\n\n if (returnType === 'one' || returnType === 'oneOrThrow') {\n for (const batch of batches) {\n batch.data = batch.data[0];\n }\n } else if (returnType === 'pluck') {\n for (const { data } of batches) {\n for (let i = 0; i < data.length; i++) {\n data[i] = data[i][key];\n }\n }\n } else if (returnType === 'value' || returnType === 'valueOrThrow') {\n for (const item of batches) {\n item.parent[item.key] = item.data[0]?.[key];\n }\n }\n};\n\nexport const _queryHookBeforeCreate = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeActionHook,\n): T => {\n return before(q, 'Create', (q) =>\n cb(new QueryHookUtils(q, q.q.columns, 'hookCreateSet')),\n );\n};\n\nexport const _queryHookAfterCreate = (\n q: PickQueryShape,\n select: HookSelectArg<PickQueryShape>,\n cb: AfterHook<HookSelectArg<PickQueryShape>, Column.QueryColumns>,\n): PickQueryShape => {\n return after(q, 'Create', select, cb);\n};\n\nexport const _queryHookAfterCreateCommit = (\n q: PickQueryShape,\n select: HookSelectArg<PickQueryShape>,\n cb: AfterHook<HookSelectArg<PickQueryShape>, PickQueryShape['shape']>,\n): PickQueryShape => {\n return after(q, 'Create', select, cb, true);\n};\n\nexport const _queryHookBeforeUpdate = <T extends PickQueryShape>(\n q: T,\n cb: QueryBeforeActionHook,\n): T => {\n return before(q, 'Update', (q) => {\n const columns = new Set<string>();\n\n if (q.q.updateData) {\n for (const item of q.q.updateData) {\n if (typeof item === 'object') {\n for (const key in item) {\n columns.add(key);\n }\n }\n }\n }\n\n if (q.q.updateMany) {\n for (const key of q.q.updateMany.setColumns) {\n columns.add(key);\n }\n }\n\n return cb(new QueryHookUtils(q, [...columns], 'hookUpdateSet'));\n });\n};\n\nexport const _queryHookAfterUpdate = (\n q: PickQueryShape,\n select: HookSelectArg<PickQueryShape>,\n cb: AfterHook<HookSelectArg<PickQueryShape>, PickQueryShape['shape']>,\n): PickQueryShape => {\n return after(q, 'Update', select, cb);\n};\n\nexport const _queryHookAfterUpdateCommit = (\n q: PickQueryShape,\n select: HookSelectArg<PickQueryShape>,\n cb: AfterHook<HookSelectArg<PickQueryShape>, PickQueryShape['shape']>,\n): PickQueryShape => {\n return after(q, 'Update', select, cb, true);\n};\n\nexport const _queryHookBeforeSave = (\n q: PickQueryShape,\n cb: QueryBeforeActionHook,\n): PickQueryShape => {\n return _queryHookBeforeUpdate(_queryHookBeforeCreate(q, cb), cb);\n};\n\nexport const _queryHookAfterSave = (\n q: PickQueryShape,\n select: HookSelectArg<PickQueryShape>,\n cb: AfterHook<HookSelectArg<PickQueryShape>, PickQueryShape['shape']>,\n): PickQueryShape => {\n return after(q, 'Save', select, cb);\n};\n\nexport const _queryAfterSaveCommit = (\n q: PickQueryShape,\n select: HookSelectArg<PickQueryShape>,\n cb: AfterHook<HookSelectArg<PickQueryShape>, PickQueryShape['shape']>,\n): PickQueryShape => {\n return after(q, 'Save', select, cb, true);\n};\n\nexport const _queryHookBeforeDelete = (\n q: PickQueryShape,\n cb: QueryBeforeHook,\n): PickQueryShape => {\n return before(q, 'Delete', cb);\n};\n\nexport const _queryHookAfterDelete = (\n q: PickQueryShape,\n select: HookSelectArg<PickQueryShape>,\n cb: AfterHook<HookSelectArg<PickQueryShape>, PickQueryShape['shape']>,\n): PickQueryShape => {\n return after(q, 'Delete', select, cb);\n};\n\nexport const _queryHookAfterDeleteCommit = (\n q: PickQueryShape,\n select: HookSelectArg<PickQueryShape>,\n cb: AfterHook<HookSelectArg<PickQueryShape>, PickQueryShape['shape']>,\n): PickQueryShape => {\n return after(q, 'Delete', select, cb, true);\n};\n\nexport abstract class QueryHooks {\n /**\n * Run the function before any kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeQuery<T>(this: T, cb: QueryBeforeHook): T {\n return _queryHookBeforeQuery(_clone(this), cb) as T;\n }\n\n /**\n * Run the function after any kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n *\n * @param cb - function to call, first argument is the query result of type `unknown`, second argument is a query object\n */\n afterQuery<T>(this: T, cb: QueryAfterHook): T {\n return _queryHookAfterQuery(_clone(this), cb) as T;\n }\n\n /**\n * Run the function before a `create` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeCreate<T>(this: T, cb: QueryBeforeActionHook): T {\n return _queryHookBeforeCreate(_clone(this), cb) as T;\n }\n\n /**\n * Run the function after a `create` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterCreate<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterCreate(_clone(this), select, cb) as never;\n }\n\n /**\n * Run the function after transaction for a `create` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterCreateCommit<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterCreateCommit(_clone(this), select, cb) as never;\n }\n\n /**\n * Run the function before an `update` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeUpdate<T>(this: T, cb: QueryBeforeActionHook): T {\n return _queryHookBeforeUpdate(_clone(this), cb) as T;\n }\n\n /**\n * Run the function after an `update` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n * If no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterUpdate<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterUpdate(_clone(this), select, cb) as never;\n }\n\n /**\n * Run the function after transaction for an `update` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n * If no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterUpdateCommit<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterUpdateCommit(_clone(this), select, cb) as never;\n }\n\n /**\n * Run the function before a `create` or an `update` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeSave<T>(this: T, cb: QueryBeforeActionHook): T {\n return _queryHookBeforeSave(_clone(this), cb) as T;\n }\n\n /**\n * Run the function after a `create` or an `update` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n * For the `update` query, if no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterSave<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterSave(_clone(this), select, cb) as never;\n }\n\n /**\n * Run the function after transaction for a `create` or an `update` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n * For the `update` query, if no records were updated, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterSaveCommit<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryAfterSaveCommit(_clone(this), select, cb) as never;\n }\n\n /**\n * Run the function before a `delete` kind of query.\n *\n * @param cb - function to call, first argument is a query object\n */\n beforeDelete<T>(this: T, cb: QueryBeforeHook): T {\n return _queryHookBeforeDelete(_clone(this), cb) as T;\n }\n\n /**\n * Run the function after a `delete` kind of query.\n * Enforces wrapping the query into a transaction.\n * The function will run after the query is succeeded, but before the transaction commit.\n * Queries inside the function will run in the same transaction as the target query.\n * If no records were deleted, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterDelete<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterDelete(_clone(this), select, cb) as never;\n }\n\n /**\n * Run the function after transaction for a `delete` kind of query will be committed.\n * If the query wasn't wrapped in a transaction, will run after the query.\n * If no records were deleted, the hook *won't* run.\n *\n * @param select - list of columns to select for the hook\n * @param cb - function to call, first argument is the query result with selected columns, second argument is a query object\n */\n afterDeleteCommit<T extends PickQueryShape, S extends HookSelectArg<T>>(\n this: T,\n select: S,\n cb: AfterHook<S, T['shape']>,\n ): T {\n return _queryHookAfterDeleteCommit(_clone(this), select, cb) as never;\n }\n\n /**\n * Add `catchAfterCommitError` to the query to catch possible errors that are coming from after commit hooks.\n *\n * When it is used, the transaction will return its result disregarding of a failed hook.\n *\n * Without `catchAfterCommitError`, the transaction function throws and won't return result.\n * Result is still accessible from the error object [AfterCommitError](#AfterCommitError).\n *\n * ```ts\n * const result = await db\n * .$transaction(async () => {\n * return db.table.create(data);\n * })\n * .catchAfterCommitError((err) => {\n * // err is instance of AfterCommitError (see below)\n * })\n * // can be added multiple times, all catchers will be executed\n * .catchAfterCommitError((err) => {});\n *\n * // result is available even if an after commit hook has failed\n * result.id;\n * ```\n */\n catchAfterCommitError<T>(this: T, fn: AfterCommitErrorHandler): T {\n const q = _clone(this);\n pushQueryValueImmutable(q, 'catchAfterCommitErrors', fn);\n return q as T;\n }\n}\n","import { Column } from '../../../columns';\nimport { IsQuery, QueryReturnType } from '../../query';\nimport { _clone } from '../../basic-features/clone/clone';\nimport { QueryBatchResult } from '../../basic-features/select/select.utils';\nimport { pushQueryValueImmutable, QueryData } from '../../query-data';\nimport { QueryThen } from '../../then/then';\n\n// result transformer: function for `transform`, object for `map`\nexport type QueryDataTransform =\n | QueryDataTransformFn\n | {\n map: (record: unknown, index: number, array: unknown) => unknown;\n thisArg?: unknown;\n };\n\ninterface QueryDataTransformFn {\n (data: unknown, queryData: unknown): unknown;\n}\n\n/**\n * See `transform` query method.\n * This helper applies all transform functions to a result.\n *\n * @param queryData - query data\n * @param returnType - return type of the query, for proper `map` handling\n * @param fns - array of transform functions, can be undefined\n * @param result - query result to transform\n */\nexport const applyTransforms = (\n queryData: unknown,\n returnType: QueryReturnType,\n fns: QueryDataTransform[],\n result: unknown,\n): unknown => {\n for (const fn of fns) {\n if ('map' in fn) {\n if (!returnType || returnType === 'all' || returnType === 'pluck') {\n result = (result as unknown[]).map(fn.map, fn.thisArg);\n } else if (result !== undefined) {\n result =\n result === null ? null : fn.map.call(fn.thisArg, result, 0, result);\n }\n } else {\n result = fn(result, queryData);\n }\n }\n return result;\n};\n\nexport const applyBatchTransforms = (\n q: QueryData,\n batches: QueryBatchResult[],\n) => {\n if (q.transform) {\n for (const item of batches) {\n item.parent[item.key] = applyTransforms(\n q,\n q.returnType,\n q.transform,\n item.data,\n );\n }\n }\n};\n\nexport class QueryTransform {\n /**\n * Transform the result of the query right after loading it.\n *\n * `transform` method should be called in the last order, other methods can't be chained after calling it.\n *\n * It is meant to transform the whole result of a query, for transforming individual records consider using {@link QueryMap.map}.\n *\n * The [hooks](/guide/hooks.html) that are going to run after the query will receive the query result **before** transferring.\n *\n * Consider the following example of a cursor-based pagination by `id`:\n *\n * ```ts\n * const lastId: number | undefined = req.query.cursor;\n *\n * type Result = {\n * nodes: { id: number; text: string }[];\n * cursor?: number;\n * };\n *\n * // result is only for demo, it will be inferred\n * const posts: Result = await db.post\n * .select('id', 'text')\n * .where({ id: { lt: lastId } })\n * .order({ id: 'DESC' })\n * .limit(100)\n * .transform((nodes) => ({ nodes, cursor: nodes.at(-1)?.id }));\n * ```\n *\n * You can also use the `tranform` on nested sub-queries:\n *\n * ```ts\n * type Result = {\n * nodes: {\n * id: number;\n * text: string;\n * comments: { nodes: { id: number; text: string }[]; cursor?: number };\n * }[];\n * cursor?: number;\n * };\n *\n * const postsWithComments: Result = await db.post\n * .select('id', 'text')\n * .select({\n * comments: (q) =>\n * q.comments\n * .select('id', 'text')\n * .transform((nodes) => ({ nodes, cursor: nodes.at(-1)?.id })),\n * })\n * .transform((nodes) => ({ nodes, cursor: nodes.at(-1)?.id }));\n * ```\n *\n * @param fn - function to transform query result with\n */\n transform<T extends IsQuery, Result>(\n this: T,\n fn: (\n input: T extends { then: QueryThen<infer Data> } ? Data : never,\n queryData: QueryData,\n ) => Result,\n ): {\n [K in keyof T]: K extends 'returnType'\n ? 'valueOrThrow'\n : K extends 'result'\n ? { value: Column.Pick.QueryColumnOfType<Result> }\n : K extends 'then'\n ? QueryThen<Result>\n : T[K];\n } {\n return pushQueryValueImmutable(_clone(this), 'transform', fn) as never;\n }\n}\n","import {\n IsQuery,\n QueryOrExpression,\n QueryReturnType,\n ReturnsQueryOrExpression,\n} from '../../query';\nimport { Column, UnknownColumn } from '../../../columns';\nimport { Expression } from '../../expressions/expression';\nimport {\n EmptyObject,\n FnUnknownToUnknown,\n MaybePromise,\n RecordString,\n RecordUnknown,\n} from '../../../utils';\nimport { RelationsBase } from '../../relations';\nimport { PickQueryQ, PickQueryShape } from '../../pick-query-types';\nimport { QueryBatchResult } from '../../basic-features/select/select.utils';\nimport { QueryExpressions } from '../../expressions/query-expressions';\nimport { QuerySql } from '../../sql/sql';\nimport { finalizeNestedHookSelect } from '../hooks/hooks';\nimport { applyBatchTransforms } from '../data-transform/transform';\nimport { QueryData } from '../../query-data';\nimport { ColumnDataSelectSqlProp } from '../select-sql/select-sql';\nimport { type BrandColumn } from '../../../columns/brand';\n\nexport interface ColumnDataComputedProp extends ColumnDataSelectSqlProp {\n // SQL computed-column marker used for virtual/read-only/default-excluded semantics.\n computed?: Expression;\n}\n\nexport type ComputedColumnsFromOptions<\n Table extends string | undefined,\n Shape,\n Options,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n> = Options extends { computed: (...args: any) => infer R }\n ? {\n [K in (keyof Shape | keyof R) & string]: K extends keyof Shape\n ? Shape[K]\n : K extends keyof R\n ? BrandColumn<ComputedColumnValue<R[K]>, `${Table}.${K & string}`>\n : never;\n }\n : Shape;\n\ntype ComputedColumnValue<T> = T extends\n | {\n result: {\n value: infer Value extends Column.Pick.QueryColumn;\n };\n }\n | (() => {\n result: {\n value: infer Value extends Column.Pick.QueryColumn;\n };\n })\n ? Value\n : never;\n\nexport interface ComputedOptionsConfig {\n [K: string]: QueryOrExpression<unknown> | ReturnsQueryOrExpression<unknown>;\n}\n\nexport type ComputedOptionsFactory<\n ColumnTypes,\n Shape extends Column.QueryColumns,\n> = (t: ComputedMethods<ColumnTypes, Shape>) => ComputedOptionsConfig;\n\nexport interface RuntimeComputedQueryColumn<OutputType>\n extends Column.Pick.QueryColumn {\n dataType: 'runtimeComputed';\n __type: never;\n __outputType: OutputType;\n __queryType: undefined;\n operators: { cannotQueryRuntimeComputed: never };\n}\n\nexport interface ComputedMethods<\n ColumnTypes,\n Shape extends Column.QueryColumns,\n> extends QueryComputedArg<ColumnTypes, Shape> {\n computeAtRuntime<Deps extends keyof Shape, OutputType>(\n dependsOn: Deps[],\n fn: (record: {\n [K in keyof Shape & Deps]: Shape[K]['__outputType'];\n }) => OutputType,\n ): { result: { value: RuntimeComputedQueryColumn<OutputType> } };\n\n computeBatchAtRuntime<Deps extends keyof Shape, OutputType>(\n dependsOn: Deps[],\n fn: (\n record: {\n [K in keyof Shape & Deps]: Shape[K]['__outputType'];\n }[],\n ) => MaybePromise<OutputType[]>,\n ): { result: { value: RuntimeComputedQueryColumn<OutputType> } };\n}\n\nexport class ComputedColumn {\n constructor(\n public kind: 'one' | 'many',\n public deps: string[],\n public fn: FnUnknownToUnknown,\n ) {}\n}\n\nexport interface ComputedColumns {\n [K: string]: ComputedColumn;\n}\n\nconst computeAtRuntime = (deps: string[], fn: () => void) =>\n new ComputedColumn('one', deps, fn);\nconst computeBatchAtRuntime = (deps: string[], fn: () => void) =>\n new ComputedColumn('many', deps, fn);\n\nexport interface QueryComputedArg<\n ColumnTypes,\n Shape extends Column.QueryColumns,\n>\n extends QueryExpressions, QuerySql<ColumnTypes> {\n shape: Shape;\n columnTypes: ColumnTypes;\n windows: EmptyObject;\n relations: RelationsBase;\n result: EmptyObject;\n __selectable: {\n [K in keyof Shape]: { as: string; column: Column.Pick.QueryColumn };\n };\n}\n\nexport const applyComputedColumns = (\n q: IsQuery,\n fn: ComputedOptionsFactory<never, never>,\n) => {\n (q as unknown as RecordUnknown).computeAtRuntime = computeAtRuntime;\n (q as unknown as RecordUnknown).computeBatchAtRuntime = computeBatchAtRuntime;\n\n const computed = fn(q as never);\n for (const key in computed) {\n let item = computed[key];\n if (typeof item === 'function') item = item.call(computed);\n\n item = Object.create(item);\n\n if (item instanceof ComputedColumn) {\n (q as unknown as PickQueryQ).q.runtimeComputeds = {\n ...(q as unknown as PickQueryQ).q.runtimeComputeds,\n [key]: item,\n };\n } else {\n let col = (item as QueryOrExpression<unknown>).result.value as\n | Column\n | undefined;\n if (!col) {\n (item as QueryOrExpression<unknown>).result = {\n value: (col = Object.create(UnknownColumn.instance) as Column),\n };\n col.data = { ...col.data };\n }\n\n ((q as unknown as PickQueryShape).shape as Column.QueryColumns)[key] =\n col;\n\n const { data } = col;\n data.computed = item as Expression;\n data.selectSql = item as Expression;\n data.explicitSelect = true;\n data.readOnly = true;\n\n const parse = col._parse;\n if (parse) {\n ((q as unknown as PickQueryQ).q.defaultParsers ??= {})[key] = parse;\n }\n }\n }\n\n (q as unknown as RecordUnknown).computeAtRuntime = (\n q as unknown as RecordUnknown\n ).computeBatchAtRuntime = undefined;\n};\n\nexport const processComputedResult = (query: QueryData, result: unknown) => {\n let promises: Promise<void>[] | undefined;\n\n for (const key in query.selectedComputeds) {\n const computed = query.selectedComputeds[key];\n if (computed.kind === 'one') {\n for (const record of result as RecordUnknown[]) {\n record[key] = computed.fn(record);\n }\n } else {\n const res = computed.fn(result);\n if (Array.isArray(res)) {\n saveBatchComputed(key, result, res);\n } else {\n (promises ??= []).push(\n (res as Promise<unknown[]>).then((res) =>\n saveBatchComputed(key, result, res),\n ),\n );\n }\n }\n }\n\n if (!promises) return;\n return Promise.all(promises);\n};\n\nexport const processComputedBatches = (\n query: QueryData,\n batches: QueryBatchResult[],\n originalReturnType: QueryReturnType,\n returnType: QueryReturnType,\n tempColumns: Set<string> | undefined,\n renames: RecordString | undefined,\n key: string,\n) => {\n let promises: Promise<void>[] | undefined;\n\n const plainValue =\n originalReturnType === 'value' || originalReturnType === 'valueOrThrow';\n\n for (const computedKey in query.selectedComputeds) {\n const setAsKey = plainValue ? key : computedKey;\n\n const computed = query.selectedComputeds[computedKey];\n if (computed.kind === 'one') {\n for (const { data } of batches) {\n for (const record of data) {\n if (record) {\n record[setAsKey] = computed.fn(record);\n }\n }\n }\n } else {\n for (const { data } of batches) {\n let present;\n let blanks: Set<number> | undefined;\n if (!returnType || returnType === 'all') {\n present = data;\n } else {\n present = [];\n blanks = new Set<number>();\n for (let i = 0; i < data.length; i++) {\n if (data[i]) {\n present.push(data[i]);\n } else {\n blanks.add(i);\n }\n }\n }\n\n const res = computed.fn(present);\n if (Array.isArray(res)) {\n saveBatchComputed(setAsKey, data, res, blanks);\n } else {\n (promises ??= []).push(\n (res as Promise<unknown[]>).then((res) =>\n saveBatchComputed(setAsKey, data, res, blanks),\n ),\n );\n }\n }\n }\n }\n\n if (!promises) return;\n\n return Promise.all(promises).then(() => {\n finalizeNestedHookSelect(\n batches,\n originalReturnType,\n tempColumns,\n renames,\n key,\n );\n\n applyBatchTransforms(query, batches);\n });\n};\n\nconst saveBatchComputed = (\n key: string,\n result: unknown,\n res: unknown[],\n blanks?: Set<number>,\n) => {\n const len = (result as unknown[]).length;\n const actual = res.length + (blanks?.size || 0);\n if (len !== actual) {\n throw new Error(\n `Incorrect length of batch computed result for column ${key}. Expected ${len}, received ${actual}.`,\n );\n }\n\n if (blanks) {\n for (let i = 0, r = 0; i < len; i++) {\n if (!blanks.has(i)) {\n (result as RecordUnknown[])[i][key] = res[r++];\n }\n }\n } else {\n for (let i = 0; i < len; i++) {\n (result as RecordUnknown[])[i][key] = res[i];\n }\n }\n};\n","import {\n commitSql,\n emptyArray,\n emptyObject,\n RecordString,\n RecordUnknown,\n rollbackSql,\n} from '../utils';\nimport { AsyncLocalStorage } from 'node:async_hooks';\nimport { setTimeout } from 'node:timers/promises';\nimport { QueryError } from '../query/errors';\nimport {\n AfterCommitErrorHandler,\n IsolationLevel,\n Query,\n QueryLogObject,\n QuerySchema,\n SingleSqlItem,\n} from '../query';\nimport {\n AsyncState,\n ProcessedStorageOptions,\n} from '../query/basic-features/storage/storage';\nimport {\n sqlSessionContextComputeSetup,\n sqlSessionContextExecute,\n SqlSessionContextSetupResult,\n SqlSessionState,\n} from './features/sql-session-context';\nimport {\n getResetRoleSql,\n getResetSetConfigSql,\n getSetConfigSql,\n getSetRoleSql,\n} from './adapter.utils';\nimport { _runAfterCommitHooks } from '../query/basic-features/transaction/transaction';\nimport { PostgresInterval } from './driver-adapter-shared';\n\nexport type { SqlSessionState } from './features/sql-session-context';\n\n/**\n * Generic result returning from query methods.\n */\nexport interface QueryResultRow {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [K: string]: any;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport interface QueryResult<T = any> {\n rowCount: number;\n rows: T[];\n /**\n * node-postgres and postgres-js: fields are present even for empty results.\n * Bun doesn't implement fields in the same way, fields are empty if no rows returned.\n */\n fields: {\n name: string;\n }[];\n}\n\nexport interface AdapterConfigBase {\n databaseURL?: string;\n database?: string;\n user?: string;\n password?: string | (() => string | Promise<string>);\n searchPath?: string;\n // oxlint-disable-next-line typescript/no-explicit-any - different drivers support different configs for this\n ssl?: any;\n /**\n * Postgres settings to apply when driver connections are configured.\n *\n * `searchPath` is normalized to `search_path` in this map.\n */\n setConfig?: RecordString;\n schema?: QuerySchema;\n host?: string;\n /**\n * This option may be useful in CI when database container has started, CI starts performing next steps,\n * migrations begin to apply though database may be not fully ready for connections yet.\n *\n * Set `connectRetry: true` for the default backoff strategy. It performs 10 attempts starting with 50ms delay and increases delay exponentially according to this formula:\n *\n * ```\n * (factor, defaults to 1.5) ** (currentAttempt - 1) * (delay, defaults to 50)\n * ```\n *\n * So the 2nd attempt will happen in 50ms from start, 3rd attempt in 125ms, 3rd in 237ms, and so on.\n *\n * You can customize max attempts to be made, `factor` multiplier and the starting delay by passing:\n *\n * ```ts\n * const options = {\n * databaseURL: process.env.DATABASE_URL,\n * connectRetry: {\n * attempts: 15, // max attempts\n * strategy: {\n * delay: 100, // initial delay\n * factor: 2, // multiplier for the formula above\n * }\n * }\n * };\n *\n * rakeDb(options, { ... });\n * ```\n *\n * You can pass a custom function to `strategy` to customize delay behavior:\n *\n * ```ts\n * import { setTimeout } from 'timers/promises';\n *\n * const options = {\n * databaseURL: process.env.DATABASE_URL,\n * connectRetry: {\n * attempts: 5,\n * stragegy(currentAttempt: number, maxAttempts: number) {\n * // linear: wait 100ms after 1st attempt, then 200m after 2nd, and so on.\n * return setTimeout(currentAttempt * 100);\n * },\n * },\n * };\n * ```\n */\n connectRetry?: AdapterConfigConnectRetryParam | true;\n}\n\ninterface AdapterConfigConnectRetryParam {\n attempts?: number;\n strategy?:\n | AdapterConfigConnectRetryStrategyParam\n | AdapterConfigConnectRetryStrategy;\n}\n\ninterface AdapterConfigConnectRetryStrategyParam {\n delay?: number;\n factor?: number;\n}\n\nexport interface AdapterConfigConnectRetry {\n attempts: number;\n strategy: AdapterConfigConnectRetryStrategy;\n}\n\ninterface AdapterConfigConnectRetryStrategy {\n (attempt: number, attempts: number): Promise<void> | void;\n}\n\nexport interface AdapterTransactionOptions extends ProcessedStorageOptions {\n level?: IsolationLevel;\n readOnly?: boolean;\n deferrable?: boolean;\n}\n\n// Interface of a database adapter to use for different databases.\n// This is the full interface exposed to users, including metadata methods and clone.\nexport interface Adapter {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n errorClass: new (...args: any[]) => Error;\n searchPath?: string;\n driverAdapter: DriverAdapter;\n\n // Connection state\n isInTransaction(this: Adapter): this is TransactionAdapter;\n\n // Error handling\n assignError(to: QueryError, from: Error): void;\n\n // make a query to get rows as objects\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n sqlSessionState?: SqlSessionState,\n ): Promise<QueryResult<T>>;\n\n // make a query to get rows as array of column values.\n // Selecting fields of the same names works fine with node-postgres and postgres-js,\n // but not for Bun SQL until it supports parsing fields info from Postgres response.\n arrays<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n R extends any[] = any[],\n >(\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n sqlSessionState?: SqlSessionState,\n ): Promise<QueryResult<R>>;\n\n /**\n * Run a transaction\n *\n * `options` can be `undefined`.\n */\n transaction<T>(\n asyncStorage: AsyncLocalStorage<AsyncState> | undefined,\n options: AdapterTransactionOptions | undefined,\n cb: (adapter: TransactionAdapter) => Promise<T>,\n ): Promise<T>;\n\n // close connection\n close(): Promise<void>;\n\n // Metadata methods\n getDatabase(): string;\n getUser(): string;\n getSearchPath(): string | undefined;\n getHost(): string;\n getSchema(): QuerySchema | undefined;\n\n // Clone method\n clone(params?: AdapterConfigBase): Adapter;\n}\n\n/**\n * Adapter interface for transaction contexts.\n */\nexport interface TransactionAdapter extends Adapter {\n isInTransaction(this: Adapter): this is TransactionAdapter;\n savepoint<T>(name: string, cb: () => Promise<T>): Promise<T>;\n\n /**\n * This is a workaround for postgres-js savepoint limitations.\n * Postgres-js dictates this:\n * - must use its `savepoint` method over manual `SAVEPOINT` because when doing it manually there is no way to prevent transaction from being rolled back when a query in a savepoint fails.\n * - must use its `sql` client from inside the `savepoint` method for the lifetime of the savepoint because of the reason above.\n */\n hackySavepoint<T extends QueryResultRow = QueryResultRow>(\n state: HackySavepointState,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n ): Promise<QueryResult<T>>;\n}\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype Pool = any;\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\ntype Client = any;\n\nexport interface AdapterSchemaConfigOptions {\n // true by default, node-postgres has false\n jsonEncodedByDriver?: boolean;\n // false by default, Bun has true\n dateParsedByDriver?: boolean;\n // Bun requires wrapping arrays in `sql.array`\n arrayEncode?(input: unknown): unknown;\n // node-postgres does that out of the box, postgres-js does it with default parsers, Bun provides this function\n intervalParse?(input: string): PostgresInterval;\n}\n\n/**\n * Adapter class used by runtime orchestrator to create driver-specific adapters.\n */\nexport interface DriverAdapter {\n noFieldsForArrays?: boolean;\n schemaConfig?: AdapterSchemaConfigOptions;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n errorClass: new (...args: any[]) => Error;\n errorFields: RecordString;\n configure(config: AdapterConfigBase): Pool;\n manualPool: boolean;\n borrow(pool: Pool): Client;\n release(client: Client): void;\n queryClient<T = QueryResultRow>(\n client: Client,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n ): Promise<QueryResult<T>>;\n begin<DriverClient, Result>(\n pool: Pool,\n cb: (client: DriverClient) => Promise<Result>,\n options?: string,\n ): Promise<Result>;\n savepoint<T>(\n client: Client,\n setClient: (client: Client) => void,\n name: string,\n cb: () => Promise<T>,\n ): Promise<T>;\n hackySavepoint<T extends QueryResultRow>(\n client: Client,\n setClient: (client: Client) => void,\n state: HackySavepointState,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n ): Promise<QueryResult<T>>;\n close(pool: Pool): Promise<void>;\n}\n\n/**\n * Constructor params for the shared runtime adapter orchestrator.\n */\nexport interface AdapterParams {\n /**\n * Driver-specific adapter class implementing `DriverAdapter`.\n */\n driverAdapter: DriverAdapter;\n /**\n * Base config saved by runtime and used for clone recreation.\n */\n config: AdapterConfigBase;\n}\n\n/**\n * Shared runtime adapter orchestrator over a driver-specific adapter implementation.\n */\nexport class AdapterClass implements Adapter {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n errorClass: new (...args: any[]) => Error;\n driverAdapter: DriverAdapter;\n private pool: Pool;\n private readonly config: AdapterConfigBase;\n private readonly connectionState: AdapterConnectionState;\n\n constructor(private readonly params: AdapterParams) {\n this.config = { ...params.config };\n\n if (this.config.connectRetry) {\n const connectRetryConfig = makeConnectRetryConfig(\n this.config.connectRetry === true\n ? emptyObject\n : this.config.connectRetry,\n );\n if (connectRetryConfig) {\n this.query = wrapAdapterFnWithConnectRetry(\n connectRetryConfig,\n this.query,\n );\n this.arrays = wrapAdapterFnWithConnectRetry(\n connectRetryConfig,\n this.arrays,\n );\n }\n }\n this.connectionState = createAdapterConnectionState(this.config);\n this.config = createDriverAdapterConfig(this.config, this.connectionState);\n this.driverAdapter = params.driverAdapter;\n this.pool = this.driverAdapter.configure(this.config);\n this.errorClass = this.driverAdapter.errorClass;\n }\n\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n sqlSessionState?: SqlSessionState,\n ): Promise<QueryResult<T>> {\n return runQueryHandlePool<QueryResult<T>>(\n this.pool,\n this.driverAdapter,\n text,\n values,\n sqlSessionState,\n );\n }\n\n // make a query to get rows as array of column values\n arrays<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n R extends any[] = any[],\n >(\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n sqlSessionState?: SqlSessionState,\n ): Promise<QueryResult<R>> {\n return runQueryHandlePool<QueryResult<R>>(\n this.pool,\n this.driverAdapter,\n text,\n values,\n sqlSessionState,\n true,\n );\n }\n\n clone(params?: AdapterConfigBase): Adapter {\n return new AdapterClass({\n driverAdapter: this.params.driverAdapter,\n config: cloneAdapterConfig(this.config, params),\n });\n }\n\n isInTransaction(this: Adapter): this is TransactionAdapter {\n return false;\n }\n\n getDatabase(): string {\n return this.connectionState.database as string;\n }\n\n getUser(): string {\n return this.connectionState.user as string;\n }\n\n getSearchPath(): string | undefined {\n return this.connectionState.searchPath;\n }\n\n getHost(): string {\n return this.connectionState.host as string;\n }\n\n getSchema(): QuerySchema | undefined {\n return this.connectionState.schema;\n }\n\n transaction<T>(\n asyncStorage: AsyncLocalStorage<AsyncState> | undefined,\n options: AdapterTransactionOptions | undefined,\n cb: (adapter: TransactionAdapter) => Promise<T>,\n ): Promise<T> {\n return transaction(\n asyncStorage,\n this,\n this.driverAdapter,\n this.pool,\n options,\n cb,\n );\n }\n\n close = async (): Promise<void> => {\n const { pool } = this;\n this.pool = this.driverAdapter.configure(this.config);\n await this.driverAdapter.close(pool);\n };\n\n assignError(to: QueryError, from: Error): void {\n const { errorFields } = this.driverAdapter;\n for (const key in errorFields) {\n (to as unknown as RecordUnknown)[key] = (\n from as unknown as RecordUnknown\n )[errorFields[key]];\n }\n }\n}\n\nexport interface HackySavepointStateActiveSavepoint {\n release(): Promise<void>;\n rollback(err: unknown): Promise<void>;\n}\n\nexport interface HackySavepointState {\n name: string;\n activeSavepoint?: HackySavepointStateActiveSavepoint;\n}\n\n/**\n * Shared runtime transaction adapter orchestrator over a driver-specific transaction adapter.\n */\nexport class TransactionAdapterClass implements TransactionAdapter {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n errorClass: new (...args: any[]) => Error;\n\n driverAdapter: DriverAdapter;\n\n constructor(\n private adapter: Adapter,\n private client: Client,\n ) {\n this.driverAdapter = adapter.driverAdapter;\n this.errorClass = this.adapter.errorClass;\n }\n\n query<T extends QueryResultRow = QueryResultRow>(\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n sqlSessionState?: SqlSessionState,\n ): Promise<QueryResult<T>> {\n const setup = sqlSessionContextComputeSetup(sqlSessionState);\n\n return runQueryHandleSetupAndCleanup<QueryResult<T>>(\n this.driverAdapter,\n this.client,\n text,\n values,\n setup,\n );\n }\n\n // make a query to get rows as array of column values\n arrays<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n R extends any[] = any[],\n >(\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n sqlSessionState?: SqlSessionState,\n ): Promise<QueryResult<R>> {\n const setup = sqlSessionContextComputeSetup(sqlSessionState);\n\n return runQueryHandleSetupAndCleanup<QueryResult<R>>(\n this.driverAdapter,\n this.client,\n text,\n values,\n setup,\n true,\n );\n }\n\n clone(params?: AdapterConfigBase): Adapter {\n return this.adapter.clone(params);\n }\n\n isInTransaction(this: Adapter): this is TransactionAdapter {\n return true;\n }\n\n getDatabase(): string {\n return this.adapter.getDatabase();\n }\n\n getUser(): string {\n return this.adapter.getUser();\n }\n\n getSearchPath(): string | undefined {\n return this.adapter.getSearchPath();\n }\n\n getHost(): string {\n return this.adapter.getHost();\n }\n\n getSchema(): QuerySchema | undefined {\n return this.adapter.getSchema();\n }\n\n async transaction<T>(\n asyncStorage: AsyncLocalStorage<AsyncState> | undefined,\n options: AdapterTransactionOptions | undefined,\n cb: (adapter: TransactionAdapter) => Promise<T>,\n ): Promise<T> {\n return transaction(\n asyncStorage,\n this.adapter,\n this.driverAdapter,\n this.client,\n options,\n cb,\n this,\n );\n }\n\n savepoint<T>(name: string, cb: () => Promise<T>): Promise<T> {\n return this.driverAdapter.savepoint(\n this.client,\n (client) => {\n this.client = client;\n },\n name,\n cb,\n );\n }\n\n hackySavepoint<T extends QueryResultRow = QueryResultRow>(\n state: HackySavepointState,\n text: string,\n values?: unknown[],\n arraysMode?: boolean,\n ): Promise<QueryResult<T>> {\n return this.driverAdapter.hackySavepoint(\n this.client,\n (client) => {\n this.client = client;\n },\n state,\n text,\n values,\n arraysMode,\n );\n }\n\n close(): Promise<void> {\n return this.adapter.close();\n }\n\n assignError(to: QueryError, from: Error): void {\n return this.adapter.assignError(to, from);\n }\n}\n\ninterface TransactionCtx {\n state?: AsyncState;\n logData: unknown;\n}\n\nconst transaction = <T>(\n asyncStorage: AsyncLocalStorage<AsyncState> | undefined,\n adapter: Adapter,\n driverAdapter: DriverAdapter,\n poolOrClient: Pool | Client,\n options: AdapterTransactionOptions | undefined,\n cb: (adapter: TransactionAdapter) => Promise<T>,\n transactionAdapter?: TransactionAdapter,\n): Promise<T> => {\n const sql = {\n values: emptyArray,\n } as unknown as SingleSqlItem;\n\n const log = options?.log;\n\n const state = asyncStorage?.getStore();\n\n const ctx = {\n state,\n logData: undefined as unknown,\n };\n\n const transactionId =\n state?.transactionId !== undefined ? state.transactionId + 1 : 0;\n\n const fn = (transactionAdapter: TransactionAdapter) => {\n if (log && sql.text) log.afterQuery(sql, ctx.logData);\n if (log) ctx.logData = log.beforeQuery(commitSql);\n\n if (state || !asyncStorage) {\n const parentTransactionRole = state?.transactionRole;\n const parentTransactionSetConfig = state?.transactionSetConfig;\n\n if (state) {\n state.transactionId = transactionId;\n if (options) {\n if (options.role) state.transactionRole = options.role;\n if (options.setConfig)\n state.transactionSetConfig = {\n ...state.transactionSetConfig,\n ...options.setConfig,\n };\n }\n }\n\n return Promise.resolve(cb(transactionAdapter)).finally(() => {\n if (state) {\n state.transactionId = transactionId - 1;\n state.transactionRole = parentTransactionRole;\n state.transactionSetConfig = parentTransactionSetConfig;\n }\n });\n }\n\n ctx.state = {\n ...options,\n role: undefined,\n setConfig: undefined,\n transactionAdapter,\n transactionId,\n transactionRole: options?.role,\n transactionSetConfig: options?.setConfig,\n };\n\n return asyncStorage.run(ctx.state, () => cb(transactionAdapter));\n };\n\n transactionAdapter ??= state?.transactionAdapter;\n\n if (transactionAdapter) {\n return nestedTransaction(\n adapter,\n driverAdapter,\n transactionAdapter,\n poolOrClient,\n options,\n fn,\n ctx,\n transactionId,\n );\n } else {\n return realTransaction(\n adapter,\n driverAdapter,\n poolOrClient,\n options,\n fn,\n ctx,\n sql,\n log,\n );\n }\n};\n\nconst realTransaction = async <T>(\n adapter: Adapter,\n driverAdapter: DriverAdapter,\n pool: Pool,\n options: AdapterTransactionOptions | undefined,\n cb: (adapter: TransactionAdapter) => Promise<T>,\n ctx: TransactionCtx,\n sql: SingleSqlItem,\n log?: QueryLogObject,\n) => {\n let trxOpts: string | undefined;\n if (options?.level) {\n trxOpts = `ISOLATION LEVEL ${options.level}`;\n }\n\n if (options?.readOnly !== undefined) {\n const add = `READ ${options.readOnly ? 'ONLY' : 'WRITE'}`;\n trxOpts = trxOpts ? trxOpts + ' ' + add : add;\n }\n\n if (options?.deferrable !== undefined) {\n const add = `${options.deferrable ? '' : 'NOT '}DEFERRABLE`;\n trxOpts = trxOpts ? trxOpts + ' ' + add : add;\n }\n\n if (log) {\n sql.text = trxOpts ? `BEGIN ${trxOpts}` : 'BEGIN';\n ctx.logData = log.beforeQuery(sql);\n }\n\n const result = (await driverAdapter\n .begin(\n pool,\n (client) => {\n let promises: Promise<unknown>[] | undefined;\n\n const setRoleSql = getSetRoleSql(undefined, options);\n if (setRoleSql) {\n (promises ??= []).push(driverAdapter.queryClient(client, setRoleSql));\n }\n\n const setConfigSql = getSetConfigSql(undefined, options);\n if (setConfigSql) {\n (promises ??= []).push(\n driverAdapter.queryClient(client, setConfigSql),\n );\n }\n\n const transaction = cb(new TransactionAdapterClass(adapter, client));\n\n return promises\n ? Promise.all(promises).then(() => transaction)\n : transaction;\n },\n trxOpts,\n )\n .catch((err) => {\n if (log) log.afterQuery(rollbackSql, ctx.logData);\n\n throw err;\n })) as Promise<T>;\n\n if (log) log.afterQuery(commitSql, ctx.logData);\n\n if (ctx.state) {\n // state was defined in the callback above;\n runAfterCommit(ctx.state.afterCommit, result);\n }\n\n return result;\n};\n\nconst nestedTransaction = async <T>(\n adapter: Adapter,\n driverAdapter: DriverAdapter,\n transactionAdapter: TransactionAdapter,\n client: Client,\n options: AdapterTransactionOptions | undefined,\n cb: (adapter: TransactionAdapter) => Promise<T>,\n ctx: TransactionCtx,\n transactionId: number,\n) => {\n const state = ctx.state;\n const parentRole = state?.transactionRole;\n const parentSetConfig = state?.transactionSetConfig;\n\n const result = await transactionAdapter.savepoint(\n `t${transactionId}`,\n async () => {\n const setRoleSql = getSetRoleSql(parentRole, options);\n if (setRoleSql) {\n // awaited by await below\n driverAdapter.queryClient(client, setRoleSql);\n }\n\n const setConfigSql = getSetConfigSql(parentSetConfig, options);\n if (setConfigSql) {\n // awaited by await below\n driverAdapter.queryClient(client, setConfigSql);\n }\n\n let result;\n try {\n result = await cb(new TransactionAdapterClass(adapter, client));\n // config is reverted by rollback to savepoint, role is not reverted and it is undone manually in the finally section\n } finally {\n const resetRoleSql = getResetRoleSql(parentRole, options);\n if (resetRoleSql) {\n await driverAdapter.queryClient(client, resetRoleSql);\n }\n }\n\n const resetSetConfigSql = getResetSetConfigSql(parentSetConfig, options);\n if (resetSetConfigSql) {\n // awaited by await release savepoint\n driverAdapter.queryClient(client, resetSetConfigSql);\n }\n\n return result;\n },\n );\n\n // transactionId is trx.testTransactionCount when only the test transactions are left,\n // and it's time to execute after commit hooks, because they won't be executed for test transactions.\n if (ctx.state && transactionId === ctx.state.testTransactionCount) {\n const { afterCommit } = ctx.state;\n ctx.state.afterCommit = undefined;\n runAfterCommit(afterCommit, result);\n }\n\n return result;\n};\n\n// `afterCommit` hooks are detached from the main flow, this function won't throw.\nconst runAfterCommit = (\n afterCommit: TransactionAfterCommitHook[] | undefined,\n result: unknown,\n) => {\n // to suppress throws of sync afterCommit hooks.\n queueMicrotask(async () => {\n if (afterCommit) {\n const promises = [];\n\n let catchAfterCommitErrors: AfterCommitErrorHandler[] | undefined;\n for (let i = 0, len = afterCommit.length; i < len; ) {\n const first = afterCommit[i];\n if (typeof first === 'function') {\n try {\n promises.push(first());\n } catch (err) {\n promises.push(Promise.reject(err));\n }\n i++;\n } else {\n const q = afterCommit[i + 1] as Query;\n if (q.q.catchAfterCommitErrors) {\n (catchAfterCommitErrors ??= []).push(...q.q.catchAfterCommitErrors);\n }\n\n for (const fn of afterCommit[i + 2] as AfterCommitHook[]) {\n try {\n promises.push(fn(first as unknown[], q));\n } catch (err) {\n promises.push(Promise.reject(err));\n }\n }\n i += 3;\n }\n }\n\n const getHookNames = () => {\n const hookNames = [];\n for (let i = 0, len = afterCommit.length; i < len; ) {\n const first = afterCommit[i];\n if (typeof first === 'function') {\n hookNames.push(first.name);\n i++;\n } else {\n for (const fn of afterCommit[i + 2] as AfterCommitHook[]) {\n hookNames.push(fn.name);\n }\n i += 3;\n }\n }\n return hookNames;\n };\n\n await _runAfterCommitHooks(\n result,\n promises,\n getHookNames,\n catchAfterCommitErrors,\n );\n }\n });\n};\n\nconst runQueryHandlePool = async <Result extends QueryResult = QueryResult>(\n pool: Pool,\n driverAdapter: DriverAdapter,\n text: string,\n values?: unknown[],\n // SQL session state (role and setConfig) from async storage\n sqlSessionState?: SqlSessionState,\n arraysMode?: boolean,\n client?: Client,\n): Promise<Result> => {\n const setup = sqlSessionContextComputeSetup(sqlSessionState);\n\n if (client || (!driverAdapter.manualPool && !setup)) {\n return runQueryHandleSetupAndCleanup<Result>(\n driverAdapter,\n client || pool,\n text,\n values,\n setup,\n arraysMode,\n );\n }\n\n client = await driverAdapter.borrow(pool);\n\n try {\n return await runQueryHandleSetupAndCleanup<Result>(\n driverAdapter,\n client,\n text,\n values,\n setup,\n arraysMode,\n );\n } finally {\n driverAdapter.release(client);\n }\n};\n\nconst runQueryHandleSetupAndCleanup = <\n Result extends QueryResult = QueryResult,\n>(\n driverAdapter: DriverAdapter,\n client: Client,\n text: string,\n values?: unknown[],\n setup?: SqlSessionContextSetupResult,\n arraysMode?: boolean,\n): Promise<Result> => {\n const mainQuery = () =>\n driverAdapter.queryClient(client, text, values, arraysMode);\n\n if (setup) {\n return sqlSessionContextExecute<Result>(\n (text, values) => driverAdapter.queryClient(client, text, values, true),\n setup,\n mainQuery as () => Promise<Result>,\n );\n }\n\n return mainQuery() as Promise<Result>;\n};\n\ninterface AdapterConnectionState {\n /**\n * Original config copy used for runtime metadata derivation and clone.\n */\n originalConfig: AdapterConfigBase;\n /**\n * Full connection URL when adapter config includes it.\n */\n databaseURL?: string;\n /**\n * Normalized database name derived from URL or direct config.\n */\n database?: string;\n /**\n * Normalized user name derived from URL or direct config.\n */\n user?: string;\n /**\n * Normalized password value derived from URL or direct config.\n */\n password?: string | (() => string | Promise<string>);\n /**\n * Normalized search_path derived from URL or direct config.\n */\n searchPath?: string;\n /**\n * Normalized host derived from URL or direct config.\n */\n host?: string;\n /**\n * Schema metadata from config or adapter instance.\n */\n schema?: QuerySchema;\n}\n\nconst createAdapterConnectionState = (\n config: AdapterConfigBase,\n): AdapterConnectionState => {\n const state: AdapterConnectionState = {\n originalConfig: { ...config },\n };\n\n const url = config.databaseURL ? new URL(config.databaseURL) : undefined;\n if (url) {\n state.databaseURL = url.toString();\n state.database = url.pathname.slice(1);\n state.user = url.username;\n state.password = url.password;\n state.searchPath = url.searchParams.get('searchPath') ?? config.searchPath;\n state.host = url.hostname;\n } else {\n state.database = config.database;\n state.user = config.user;\n state.password = config.password;\n state.searchPath = config.searchPath;\n state.host = config.host;\n }\n\n state.schema = config.schema;\n\n return state;\n};\n\nconst cloneAdapterConfig = (\n config: AdapterConfigBase,\n params?: AdapterConfigBase,\n): AdapterConfigBase => {\n if (!params) {\n return { ...config };\n }\n\n const clonedConfig = { ...config };\n\n if ('databaseURL' in params) {\n clonedConfig.databaseURL = params.databaseURL;\n }\n\n const url = clonedConfig.databaseURL\n ? new URL(clonedConfig.databaseURL)\n : undefined;\n if (url) {\n if ('database' in params) {\n url.pathname = `/${params.database ?? ''}`;\n }\n\n if ('user' in params) {\n url.username = params.user ?? '';\n }\n\n if ('password' in params && typeof params.password !== 'function') {\n url.password = params.password ?? '';\n }\n\n if ('searchPath' in params) {\n if (params.searchPath === undefined) {\n url.searchParams.delete('searchPath');\n } else {\n url.searchParams.set('searchPath', params.searchPath);\n }\n clonedConfig.searchPath = params.searchPath;\n }\n\n clonedConfig.databaseURL = url.toString();\n } else {\n if ('database' in params) {\n clonedConfig.database = params.database;\n }\n\n if ('user' in params) {\n clonedConfig.user = params.user;\n }\n\n if ('password' in params) {\n clonedConfig.password = params.password;\n }\n\n if ('searchPath' in params) {\n clonedConfig.searchPath = params.searchPath;\n }\n }\n\n if ('connectRetry' in params) {\n clonedConfig.connectRetry = params.connectRetry;\n }\n\n return clonedConfig;\n};\n\nconst createDriverAdapterConfig = (\n config: AdapterConfigBase,\n state: AdapterConnectionState,\n): AdapterConfigBase => {\n const setConfig: RecordString = config.setConfig\n ? { ...config.setConfig }\n : {};\n delete setConfig.search_path;\n if (state.searchPath && state.searchPath !== 'public') {\n setConfig.search_path = state.searchPath;\n }\n\n const driverConfig: AdapterConfigBase = {\n ...config,\n searchPath: state.searchPath,\n setConfig,\n };\n\n if (driverConfig.databaseURL) {\n const url = new URL(driverConfig.databaseURL);\n url.searchParams.delete('searchPath');\n\n const ssl = url.searchParams.get('ssl');\n if (ssl === 'false') {\n driverConfig.ssl = false;\n url.searchParams.delete('ssl');\n } else if (ssl === 'true') {\n driverConfig.ssl = true;\n url.searchParams.delete('ssl');\n }\n\n driverConfig.databaseURL = url.toString();\n }\n\n return driverConfig;\n};\n\n/**\n * Element of `afterCommit` transaction array. See {@link AsyncState.afterCommit}.\n */\nexport type TransactionAfterCommitHook =\n | unknown[]\n | Query\n | AfterCommitHook[]\n | AfterCommitStandaloneHook;\n\n// Function to call after transaction commit.\nexport interface AfterCommitHook {\n (data: unknown[], q: Query): unknown | Promise<unknown>;\n}\n\nexport interface AfterCommitStandaloneHook {\n (): unknown | Promise<unknown>;\n}\n\nexport const makeConnectRetryConfig = (\n config: AdapterConfigConnectRetryParam,\n): AdapterConfigConnectRetry => {\n return {\n attempts: config.attempts ?? 10,\n strategy:\n typeof config.strategy === 'function'\n ? config.strategy\n : defaultConnectRetryStrategy(config.strategy ?? emptyObject),\n };\n};\n\nexport const wrapAdapterFnWithConnectRetry = <\n // oxlint-disable-next-line typescript/no-explicit-any\n Fn extends (...args: any[]) => any,\n>(\n connectRetryConfig: AdapterConfigConnectRetry,\n fn: Fn,\n): Fn => {\n return async function (this: unknown, ...args: unknown[]) {\n let attempt = 1;\n for (;;) {\n try {\n return await fn.call(this as never, ...args);\n } catch (err) {\n if (\n !err ||\n typeof err !== 'object' ||\n (err as { code: string }).code !== 'ECONNREFUSED' ||\n attempt >= connectRetryConfig.attempts\n ) {\n throw err;\n }\n\n await connectRetryConfig.strategy(attempt, connectRetryConfig.attempts);\n attempt++;\n }\n }\n } as Fn;\n};\n\nconst defaultConnectRetryStrategy = (\n param: AdapterConfigConnectRetryStrategyParam,\n): AdapterConfigConnectRetryStrategy => {\n return (attempt) =>\n setTimeout((param.factor ?? 1.5) ** (attempt - 1) * (param.delay ?? 50));\n};\n\nexport const getDriverErrorCode = (err: object) =>\n 'errno' in err ? err.errno : (err as { code?: string }).code;\n","import { OrchidOrmInternalError } from '../errors';\nimport { Query } from '../query';\nimport { ColumnsShape } from '../../columns';\n\nexport const getPrimaryKeys = (q: Query) => {\n return (q.internal.primaryKeys ??= collectPrimaryKeys(q));\n};\n\nexport const requirePrimaryKeys = (q: Query, message: string) => {\n const primaryKeys = getPrimaryKeys(q);\n if (!primaryKeys.length) {\n throw new OrchidOrmInternalError(q, message);\n }\n return primaryKeys;\n};\n\nconst collectPrimaryKeys = (q: Query): string[] => {\n const primaryKeys = [];\n const { shape } = q;\n for (const key in shape) {\n if ((shape as ColumnsShape)[key].data.primaryKey) {\n primaryKeys.push(key);\n }\n }\n\n const pkey = q.internal.tableData.primaryKey;\n if (pkey) {\n primaryKeys.push(...pkey.columns);\n }\n\n return primaryKeys;\n};\n","import { QueryHasWhere, Where } from '../../basic-features/where/where';\nimport { Query, SelectableFromShape } from '../../query';\nimport { Column } from '../../../columns/column';\nimport {\n PickQueryScopes,\n PickQuerySelectableShapeRelationsWithData,\n} from '../../pick-query-types';\nimport { setObjectValueImmutable } from '../../../utils';\nimport { _clone } from '../../basic-features/clone/clone';\nimport { QueryDataScopes } from '../../query-data';\n\n// Scopes data stored in table instance. Doesn't change after defining a table.\nexport type QueryScopes<Keys extends string> = {\n [K in Keys]: unknown;\n};\n\nexport interface ScopeArgumentQuery<\n Table extends string | undefined,\n Shape extends Column.QueryColumns,\n>\n extends Where, PickQuerySelectableShapeRelationsWithData {\n __isQuery: true;\n table: Table;\n shape: Shape;\n __selectable: SelectableFromShape<Shape, Table>;\n}\n\nexport const _unscope = (q: Query, scope: PropertyKey): Query => {\n if (q.q.scopes) {\n q.q.scopes = { ...q.q.scopes };\n delete q.q.scopes[scope as string];\n for (const _ in q.q.scopes) {\n return q as never;\n }\n delete q.q.scopes;\n }\n\n return q as never;\n};\n\n/**\n * This feature allows defining a set of query modifiers to use it later.\n * Only [where conditions](/guide/where.html) can be set in a scope.\n * If you define a scope with name `default`, it will be applied for all table queries by default.\n *\n * ```ts\n * import { defineTable } from './table-factory';\n *\n * export const SomeTable = defineTable('some', (t) => ({\n * id: t.identity().primaryKey(),\n * hidden: t.boolean(),\n * active: t.boolean(),\n * })).scopes({\n * default: (q) => q.where({ hidden: false }),\n * active: (q) => q.where({ active: true }),\n * });\n *\n * const db = orchidORM(\n * { databaseURL: '...' },\n * {\n * some: SomeTable,\n * },\n * );\n *\n * // the default scope is applied for all queries:\n * const nonHiddenRecords = await db.some;\n * ```\n */\nexport class QueryScope {\n /**\n * See {@link QueryScope}\n *\n * Use the `scope` method to apply a pre-defined scope.\n *\n * ```ts\n * // use the `active` scope that is defined in the table:\n * await db.some.scope('active');\n * ```\n *\n * @param scope - name of the scope to apply\n */\n scope<T extends PickQueryScopes>(\n this: T,\n scope: keyof T['__scopes'],\n ): T & QueryHasWhere {\n const q = _clone(this);\n\n if (!q.q.scopes?.[scope as string]) {\n const s = (q.internal.scopes as QueryDataScopes)[scope as string];\n\n if (!s) throw new Error(`Scope ${scope as string} is not defined`);\n\n setObjectValueImmutable(q.q, 'scopes', scope, s);\n }\n\n return q as never;\n }\n\n /**\n * See {@link QueryScope}\n *\n * Remove conditions that were added by the scope from the query.\n *\n * ```ts\n * // SomeTable has a default scope, ignore it for this query:\n * await db.some.unscope('default');\n * ```\n *\n * @param scope - name of the scope to remove from the query\n */\n unscope<T extends PickQueryScopes>(this: T, scope: keyof T['__scopes']): T {\n return _unscope(_clone(this), scope) as never;\n }\n}\n","import { Query } from '../../query';\nimport {\n MutativeQueriesSelectRelationsSqlProp,\n MutativeQueriesSelectRelationsSqlState,\n MutativeQueriesSelectRelationsValue,\n} from './mutative-queries-select-relations.sql';\nimport { requirePrimaryKeys } from '../../query-columns/primary-keys';\nimport { _unscope } from '../../extra-features/scope/scope';\nimport { getFreeAlias, RecordString, RecordUnknown } from '../../../utils';\nimport {\n SelectAsValue,\n SelectItem,\n} from '../../basic-features/select/select.sql';\nimport { maybeWrappedThen, ThenSavepointState } from '../../then/then';\n\nexport const checkIfNeedResultAllForMutativeQueriesSelectRelations = (\n sql: MutativeQueriesSelectRelationsSqlProp,\n): MutativeQueriesSelectRelationsValue | undefined => {\n return sql.mutativeQueriesSelectRelationsState?.value;\n};\n\nexport const checkIfShouldReleaseSavepointForMutativeQueriesSelectRelations = (\n sql: MutativeQueriesSelectRelationsSqlProp,\n): MutativeQueriesSelectRelationsValue | undefined => {\n return sql.mutativeQueriesSelectRelationsState?.value;\n};\n\nexport const loadMutativeQueriesSelectRelations = (\n sql: MutativeQueriesSelectRelationsSqlProp,\n result: unknown,\n savepointState?: ThenSavepointState,\n renames?: RecordString,\n): Promise<void> | undefined =>\n sql.mutativeQueriesSelectRelationsState?.value\n ? loadRelations(\n sql.mutativeQueriesSelectRelationsState,\n result,\n savepointState,\n renames,\n )\n : undefined;\n\nexport const loadRelations = async (\n state: MutativeQueriesSelectRelationsSqlState,\n result: unknown,\n savepointState?: ThenSavepointState,\n renames?: RecordString,\n): Promise<void> => {\n const q = state.query as Query;\n\n const primaryKeys = requirePrimaryKeys(\n q,\n 'Cannot select a relation of a table that has no primary keys',\n );\n const selectQuery = _unscope(q, 'nonDeleted');\n // after cloning the mutating query:\n // type = undefined makes it a select query\n selectQuery.q.type = undefined;\n // returnType = undefined: need to select full objects for this relations loading logic to work,\n // will be transformed to what user requested later.\n selectQuery.q.returnType = undefined;\n // the original query can contain mutative withs, need to strip them all for selecting\n selectQuery.q.with = undefined;\n selectQuery.q.appendQueries = undefined;\n selectQuery.q.valuesJoinedAs = undefined;\n\n const matchSourceTableIds: RecordUnknown = {};\n for (const pkey of primaryKeys) {\n matchSourceTableIds[pkey] = {\n in: (result as RecordUnknown[]).map((row) => row[pkey]),\n };\n }\n (selectQuery.q.and ??= []).push(matchSourceTableIds);\n\n const relationsSelect = state.value as Record<string, Query>;\n\n const selectAs: SelectAsValue = { ...relationsSelect };\n\n const select: SelectItem[] = [{ selectAs }];\n\n const relationKeyAliases = primaryKeys.map((key) => {\n if (key in selectAs) {\n const as = getFreeAlias(selectAs, key);\n selectAs[as] = key;\n return as;\n } else {\n select.push(key);\n return key;\n }\n });\n\n selectQuery.q.select = select;\n\n const relationsResult = (await maybeWrappedThen.call(\n selectQuery,\n undefined,\n async (err) => {\n await savepointState?.activeSavepoint?.rollback(err);\n throw err;\n },\n savepointState,\n )) as RecordUnknown[];\n\n for (const row of result as RecordUnknown[]) {\n const relationRow = relationsResult.find((relationRow) => {\n return !primaryKeys.some(\n (key, i) => relationRow[relationKeyAliases[i]] !== row[key],\n );\n });\n if (relationRow) {\n Object.assign(row, relationRow);\n }\n }\n\n // when relation is loaded under the same key as a transient primary key:\n // no need to rename it because the relation was already loaded under the key name.\n if (renames) {\n for (const key in relationsSelect) {\n if (key in renames) {\n delete renames[key];\n }\n }\n }\n};\n","import { Query, QueryReturnType } from '../query';\nimport {\n _runAfterCommitHooks,\n AsyncTransactionState,\n isInUserTransaction,\n} from '../basic-features/transaction/transaction';\nimport { processComputedResult } from '../extra-features/computed/computed';\nimport { Column, ColumnsShape } from '../../columns';\nimport { HookPurpose } from '../extra-features/hooks/hooks.sql';\nimport {\n Adapter,\n AfterCommitHook,\n getDriverErrorCode,\n HackySavepointState,\n QueryResult,\n SqlSessionState,\n TransactionAdapter,\n} from '../../adapters/adapter';\nimport { sqlSessionContextGetStateFromAsyncState } from '../../adapters/features/sql-session-context';\nimport {\n callWithThis,\n commitSql,\n emptyArray,\n MaybePromise,\n RecordString,\n RecordUnknown,\n ShallowSimplify,\n} from '../../utils';\nimport {\n ColumnParser,\n ColumnsParsers,\n getQueryParsers,\n getValueParser,\n} from '../query-columns/query-column-parsers';\nimport { _clone } from '../basic-features/clone/clone';\nimport { NotFoundError, QueryError } from '../errors';\nimport { SingleSql, SingleSqlItem, Sql } from '../sql/sql';\nimport { applyTransforms } from '../extra-features/data-transform/transform';\nimport { HandleResult, QueryAfterHook, QueryBeforeHook } from '../query-data';\nimport { PickQueryReturnType } from '../pick-query-types';\nimport {\n AsyncState,\n setCurrentDefaultSchema,\n} from '../basic-features/storage/storage';\nimport {\n checkIfNeedResultAllForMutativeQueriesSelectRelations,\n checkIfShouldReleaseSavepointForMutativeQueriesSelectRelations,\n loadMutativeQueriesSelectRelations,\n} from '../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.result-handler';\n\n// This is a standard Promise['then'] method\n// copied from TS standard library because the original `then` is not decoupled from the Promise\nexport interface QueryThen<T> {\n <TResult1 = T, TResult2 = never>(\n onfulfilled?: (value: T) => TResult1 | PromiseLike<TResult1>,\n // oxlint-disable-next-line typescript/no-explicit-any\n onrejected?: (reason: any) => TResult2 | PromiseLike<TResult2>,\n ): Promise<TResult1 | TResult2>;\n} // This is a standard Promise['catch'] method\n\nexport type QueryThenShallowSimplify<T> = QueryThen<ShallowSimplify<T>>;\n\nexport type QueryThenShallowSimplifyArr<T> = QueryThen<ShallowSimplify<T>[]>;\n\nexport type QueryThenShallowSimplifyOptional<T> = QueryThen<\n ShallowSimplify<T> | undefined\n>;\n\nexport type QueryThenByQuery<\n T extends PickQueryReturnType,\n Result extends Column.QueryColumns,\n> = T['returnType'] extends undefined | 'all'\n ? QueryThenShallowSimplifyArr<ColumnsShape.Output<Result>>\n : T['returnType'] extends 'one'\n ? QueryThenShallowSimplifyOptional<ColumnsShape.Output<Result>>\n : T['returnType'] extends 'oneOrThrow'\n ? QueryThenShallowSimplify<ColumnsShape.Output<Result>>\n : T['returnType'] extends 'value'\n ? QueryThen<Result['value']['__outputType'] | undefined>\n : T['returnType'] extends 'valueOrThrow'\n ? QueryThen<Result['value']['__outputType']>\n : T['returnType'] extends 'rows'\n ? QueryThen<ColumnsShape.Output<Result>[keyof Result][][]>\n : T['returnType'] extends 'pluck'\n ? QueryThen<Result['pluck']['__outputType'][]>\n : QueryThen<void>;\n\nexport type QueryThenByReturnType<\n T extends QueryReturnType,\n Result extends Column.QueryColumns,\n> = T extends undefined | 'all'\n ? QueryThenShallowSimplifyArr<ColumnsShape.Output<Result>>\n : T extends 'one'\n ? QueryThenShallowSimplifyOptional<ColumnsShape.Output<Result>>\n : T extends 'oneOrThrow'\n ? QueryThenShallowSimplify<ColumnsShape.Output<Result>>\n : T extends 'value'\n ? QueryThen<Result['value']['__outputType'] | undefined>\n : T extends 'valueOrThrow'\n ? QueryThen<Result['value']['__outputType']>\n : T extends 'rows'\n ? QueryThen<ColumnsShape.Output<Result>[keyof Result][][]>\n : T extends 'pluck'\n ? QueryThen<Result['pluck']['__outputType'][]>\n : QueryThen<void>;\n\n// copied from TS standard library because the original `catch` is not decoupled from the Promise\nexport interface QueryCatch {\n <Q, TResult = never>(\n // oxlint-disable-next-line typescript/no-explicit-any\n this: { then: (onfulfilled?: (value: Q) => any) => any },\n // oxlint-disable-next-line typescript/no-explicit-any\n onrejected?: (reason: any) => TResult | PromiseLike<TResult>,\n ): Promise<Q | TResult>;\n}\n\nexport const queryMethodByReturnType: {\n [K in string]: 'query' | 'arrays';\n} = {\n undefined: 'query',\n all: 'query',\n rows: 'arrays',\n pluck: 'arrays',\n one: 'query',\n oneOrThrow: 'query',\n value: 'arrays',\n valueOrThrow: 'arrays',\n void: 'arrays',\n};\n\ntype Resolve = // oxlint-disable-next-line typescript/no-explicit-any\n (result: any) => any;\ntype Reject = // oxlint-disable-next-line typescript/no-explicit-any\n (error: any) => any;\n\nexport interface QueryCatchers {\n catchUniqueError<ThenResult, CatchResult>(\n // oxlint-disable-next-line typescript/no-explicit-any\n this: { then: (onfulfilled?: (value: ThenResult) => any) => any },\n fn: (reason: QueryError) => CatchResult,\n ): Promise<ThenResult | CatchResult>;\n}\n\nexport class Then implements QueryCatchers {\n catch(\n this: Query,\n // oxlint-disable-next-line typescript/no-explicit-any\n fn: (reason: any) => unknown,\n ) {\n const q = _clone(this as unknown as Query);\n q.q.catch = true;\n return q.then(undefined, fn);\n }\n\n catchUniqueError(fn: (reason: QueryError) => unknown) {\n const q = _clone(this as unknown as Query);\n q.q.catch = true;\n return q.then(undefined, (err) => {\n if (err instanceof QueryError && err.isUnique) {\n return fn(err);\n } else {\n throw err;\n }\n }) as never;\n }\n}\n\n// For storing error with the stacktrace leading to the code which calls `await query`,\n// using it later when catching query error.\nlet queryError: Error = undefined as unknown as Error;\n\n// `query.then` getter: it must be a getter to store the error with stacktrace prior to executing `await`.\nexport const getThen = function (): (\n this: Query,\n resolve?: Resolve,\n reject?: Reject,\n) => Promise<unknown> {\n queryError = new Error();\n return maybeWrappedThen;\n};\n\nObject.defineProperty(Then.prototype, 'then', {\n configurable: true,\n get: getThen,\n set(value) {\n Object.defineProperty(this, 'then', {\n value,\n });\n },\n});\n\nexport function maybeWrappedThen(\n this: Query,\n resolve?: Resolve,\n reject?: Reject,\n parentSavepoint?: ThenSavepointState,\n): Promise<unknown> {\n const { q } = this;\n\n const shouldCatch = q.catch;\n\n let beforeActionHooks: QueryBeforeHook[] | undefined;\n let afterHooks: QueryAfterHook[] | undefined;\n let afterSaveHooks: QueryAfterHook[] | undefined;\n let afterCommitHooks: QueryAfterHook[] | undefined;\n let afterSaveCommitHooks: QueryAfterHook[] | undefined;\n if (q.type) {\n if (q.type === 'insert') {\n beforeActionHooks = q.beforeCreate;\n afterHooks = q.afterCreate;\n afterSaveHooks = q.afterSave;\n afterCommitHooks = q.afterCreateCommit;\n afterSaveCommitHooks = q.afterSaveCommit;\n } else if (q.type === 'update') {\n beforeActionHooks = q.beforeUpdate;\n afterHooks = q.afterUpdate;\n afterSaveHooks = q.afterSave;\n afterCommitHooks = q.afterUpdateCommit;\n afterSaveCommitHooks = q.afterSaveCommit;\n } else if (q.type === 'upsert') {\n if (q.upsertSecond) {\n beforeActionHooks = q.beforeCreate;\n } else if (q.upsertUpdate && q.updateData) {\n beforeActionHooks = q.beforeUpdate;\n afterHooks = q.afterUpdate;\n afterSaveHooks = q.afterSave;\n afterCommitHooks = q.afterUpdateCommit;\n afterSaveCommitHooks = q.afterSaveCommit;\n }\n } else if (q.type === 'delete') {\n beforeActionHooks = q.beforeDelete;\n afterHooks = q.afterDelete;\n afterCommitHooks = q.afterDeleteCommit;\n }\n }\n\n const { before } = q;\n const beforeHooks =\n before && beforeActionHooks\n ? [...before, ...beforeActionHooks]\n : before\n ? before\n : beforeActionHooks;\n\n const state = this.internal.asyncStorage.getStore();\n if (\n (q.wrapInTransaction || (q.selectRelation && q.type) || afterHooks) &&\n !state?.transactionAdapter\n ) {\n return this.transaction(\n () =>\n new Promise((resolve, reject) => {\n const state =\n this.internal.asyncStorage.getStore() as AsyncTransactionState;\n return then(\n this,\n state.transactionAdapter,\n state,\n beforeHooks,\n afterHooks,\n afterSaveHooks,\n afterCommitHooks,\n afterSaveCommitHooks,\n resolve,\n reject,\n shouldCatch,\n parentSavepoint,\n );\n }),\n ).then(resolve, reject);\n } else {\n return then(\n this,\n state?.transactionAdapter || this.q.adapter,\n state,\n beforeHooks,\n afterHooks,\n afterSaveHooks,\n afterCommitHooks,\n afterSaveCommitHooks,\n resolve,\n reject,\n shouldCatch,\n parentSavepoint,\n );\n }\n}\n\nconst queriesNames: RecordString = {};\nlet nameI = 0;\n\nconst callAfterHook = function (\n this: [result: unknown[], q: Query],\n cb: QueryAfterHook,\n): Promise<unknown> | unknown {\n return cb(this[0], this[1]);\n};\n\nconst beginSql: SingleSqlItem = { text: 'BEGIN' };\n\nconst then = async (\n q: Query,\n adapter: Adapter,\n state?: AsyncState,\n beforeHooks?: QueryBeforeHook[],\n afterHooks?: QueryAfterHook[],\n afterSaveHooks?: QueryAfterHook[],\n afterCommitHooks?: QueryAfterHook[],\n afterSaveCommitHooks?: QueryAfterHook[],\n resolve?: // oxlint-disable-next-line typescript/no-explicit-any\n (result: any) => any,\n reject?: // oxlint-disable-next-line typescript/no-explicit-any\n (error: any) => any,\n shouldCatch?: boolean,\n parentSavepoint?: ThenSavepointState,\n): Promise<unknown> => {\n const { q: query } = q;\n\n let sql: (Sql & { name?: string }) | undefined;\n let logData: unknown | undefined;\n const log = state?.log ?? query.log;\n setCurrentDefaultSchema(state?.schema);\n\n // save error to a local variable before async operations\n const localError = queryError;\n\n try {\n if (beforeHooks) {\n await Promise.all(beforeHooks.map(callWithThis, q));\n }\n\n const localSql = (sql = q.toSQL(true));\n\n if (q.q.dynamicBefore) {\n let promises: Promise<unknown>[] | undefined;\n\n for (const data of q.q.dynamicBefore) {\n if (data.before) {\n for (const before of data.before) {\n const promise = before(q);\n if (promise) (promises ??= []).push(promise);\n }\n }\n }\n\n if (promises) await Promise.all(promises);\n }\n\n const { tableHook, cteHooks } = sql;\n const { returnType = 'all' } = query;\n const tempReturnType =\n tableHook?.select ||\n cteHooks?.hasSelect ||\n q.q.batchParsers ||\n adapter.driverAdapter.noFieldsForArrays ||\n checkIfNeedResultAllForMutativeQueriesSelectRelations(sql)\n ? 'all'\n : returnType;\n\n let result: unknown;\n let queryResult: QueryResult;\n let cteData: Record<string, unknown[]> | undefined;\n\n const startingSavepoint = setCatchingSavepoint(\n !parentSavepoint && shouldCatch && state,\n );\n\n const releasingSavepoint =\n checkIfShouldReleaseSavepointForMutativeQueriesSelectRelations(sql) ||\n parentSavepoint\n ? undefined\n : parentSavepoint || startingSavepoint;\n\n if ('text' in sql) {\n if (query.autoPreparedStatements) {\n sql.name =\n queriesNames[sql.text] ||\n (queriesNames[sql.text] = (nameI++).toString(36));\n }\n\n if (log) {\n logData = log.beforeQuery(sql);\n }\n\n const method = queryMethodByReturnType[tempReturnType];\n queryResult = await execQuery(\n adapter,\n method,\n sql,\n startingSavepoint,\n releasingSavepoint,\n sqlSessionContextGetStateFromAsyncState(state),\n );\n const { runAfterQuery } = sql;\n\n if (log) {\n log.afterQuery(sql, logData);\n // set sql to be undefined to prevent logging on error in case if afterHooks throws\n sql = undefined;\n }\n\n if (runAfterQuery) {\n const r = await runAfterQuery(queryResult);\n if (r) {\n return resolve ? resolve(r.result) : r.result;\n }\n }\n\n if (localSql.cteHooks?.hasSelect) {\n const lastRowI = queryResult.rows.length - 1;\n const lastFieldI = queryResult.fields.length - 1;\n\n const fieldName =\n method === 'query' ? queryResult.fields[lastFieldI].name : lastFieldI;\n cteData = queryResult.rows[lastRowI][fieldName];\n queryResult.fields.length = lastFieldI;\n queryResult.rowCount--;\n queryResult.rows.length = lastRowI;\n\n if (method === 'query') {\n for (const row of queryResult.rows) {\n delete row[fieldName];\n }\n } else {\n for (const row of queryResult.rows) {\n row.length = lastFieldI;\n }\n }\n }\n\n result = query.handleResult(q, tempReturnType, queryResult, localSql);\n } else {\n // autoPreparedStatements in batch doesn't seem to make sense\n\n const queryMethod = queryMethodByReturnType[tempReturnType] as 'query';\n\n const queryBatch = async (batch: SingleSql[]) => {\n const last = batch.length - 1;\n for (let i = 0; i <= last; i++) {\n sql = batch[i];\n\n if (log) {\n logData = log.beforeQuery(sql);\n }\n\n const result = await execQuery(\n adapter,\n queryMethod,\n sql,\n i === 0 ? startingSavepoint : undefined,\n i === last ? releasingSavepoint : undefined,\n sqlSessionContextGetStateFromAsyncState(state),\n );\n\n if (queryResult) {\n queryResult.rowCount += result.rowCount;\n queryResult.rows.push(...result.rows);\n } else {\n queryResult = result;\n }\n\n if (log) {\n log.afterQuery(sql, logData);\n }\n }\n\n // set sql to be undefined to prevent logging on error in case if afterHooks throws\n sql = undefined;\n };\n\n if (state) {\n await queryBatch(sql.batch);\n } else {\n const { batch } = sql;\n\n if (log) logData = log.beforeQuery(beginSql);\n await adapter.transaction(undefined, undefined, async () => {\n if (log) log.afterQuery(beginSql, logData);\n const res = await queryBatch(batch);\n if (log) logData = log.beforeQuery(commitSql);\n return res;\n });\n if (log) log.afterQuery(commitSql, logData);\n }\n\n // runAfterQuery is not called because it's only for upsert,\n // while this batch branch is for batch insert\n\n result = query.handleResult(q, tempReturnType, queryResult!, localSql);\n }\n\n // TODO: move computeds after parsing\n let tempColumns: Set<string> | undefined;\n let renames: RecordString | undefined;\n if (tableHook?.select) {\n for (const [\n column,\n { as, temp, notLoaded },\n ] of tableHook.select.entries()) {\n if (notLoaded) continue;\n\n if (as) {\n (renames ??= {})[column] = as;\n }\n\n if (temp) {\n (tempColumns ??= new Set())?.add(temp);\n }\n }\n\n if (renames) {\n for (const record of result as RecordUnknown[]) {\n for (const a in renames) {\n const value = record[renames[a]];\n record[renames[a]] = record[a];\n record[a] = value;\n }\n }\n }\n\n if (query.selectedComputeds) {\n const promise = processComputedResult(query, result);\n if (promise) await promise;\n }\n }\n\n let cteAfterHooks: (() => unknown)[] | undefined;\n let cteAfterCommitHooks: (() => unknown)[] | undefined;\n if (localSql.cteHooks) {\n // oxlint-disable-next-line typescript/no-explicit-any\n const addedAfterHooks = new Set<(data: unknown, query: any) => unknown>();\n const addedAfterCommitHooks = new Set<\n // oxlint-disable-next-line typescript/no-explicit-any\n (data: unknown, query: any) => unknown\n >();\n\n interface TableData {\n data: {\n [K in HookPurpose | 'Save']?: unknown[];\n };\n }\n\n const dataPerSubQuery = new Map<string, TableData>();\n\n for (const cteName in localSql.cteHooks.tableHooks) {\n const hook = localSql.cteHooks.tableHooks[cteName];\n\n const data = cteData?.[cteName];\n if (!data && hook.throwOnNotFound) {\n throw new NotFoundError(q, `Record for cte ${cteName} is not found`);\n }\n\n const purpose = hook.tableHook.hookPurpose as HookPurpose | undefined;\n if (!purpose) continue;\n\n let tableData = dataPerSubQuery.get(hook.table);\n if (!tableData) {\n tableData = { data: {} };\n dataPerSubQuery.set(hook.table, tableData);\n }\n\n if (data) {\n const existing = tableData.data[purpose];\n tableData.data[purpose] = existing ? [...existing, ...data] : data;\n\n if (purpose === 'Create' || purpose === 'Update') {\n tableData.data.Save = tableData.data.Save\n ? [...tableData.data.Save, ...data]\n : data;\n }\n\n let hasParsers: boolean | undefined;\n const parsers: ColumnsParsers = {};\n for (const key in hook.shape) {\n if ((hook.shape[key] as Column)._parse) {\n hasParsers = true;\n parsers[key] = (hook.shape[key] as Column)._parse;\n }\n }\n\n if (hasParsers) {\n for (const row of data) {\n parseRecord(parsers, row);\n }\n }\n }\n }\n\n for (const cteName in localSql.cteHooks.tableHooks) {\n const hook = localSql.cteHooks.tableHooks[cteName];\n const { tableHook } = hook;\n\n const purpose = tableHook.hookPurpose as HookPurpose | undefined;\n const tableData = dataPerSubQuery.get(hook.table);\n if (!purpose || !tableData) continue;\n\n for (const purpose of ['Create', 'Update', 'Delete', 'Save'] as const) {\n const data = tableData.data[purpose];\n if (!data) continue;\n\n const afterKey = `after${purpose}` as const;\n const after = tableHook[afterKey];\n if (after) {\n const arr = (cteAfterHooks ??= []);\n for (const fn of after) {\n const hookData = addedAfterHooks.has(fn);\n if (!hookData) {\n addedAfterHooks.add(fn);\n arr.push(() => fn(data, q));\n }\n }\n }\n\n const afterCommitKey = `after${purpose}Commit` as const;\n const afterCommit = tableHook[afterCommitKey];\n if (afterCommit) {\n const arr = (cteAfterCommitHooks ??= []);\n for (const fn of afterCommit) {\n const hookData = addedAfterCommitHooks.has(fn);\n if (!hookData) {\n addedAfterCommitHooks.add(fn);\n arr.push(() => fn(data, q));\n }\n }\n }\n }\n }\n }\n\n const queryAfter = query.after;\n const hasAfterHook =\n afterHooks ||\n afterSaveHooks ||\n afterCommitHooks ||\n afterSaveCommitHooks ||\n queryAfter ||\n cteAfterHooks ||\n cteAfterCommitHooks;\n if (hasAfterHook) {\n //\n if (!queryResult!.rowCount) {\n afterHooks =\n afterSaveHooks =\n afterCommitHooks =\n afterSaveCommitHooks =\n undefined;\n }\n\n if (afterHooks || afterSaveHooks || queryAfter || cteAfterHooks) {\n const args = [result, q];\n await Promise.all(\n [\n ...(afterHooks || emptyArray),\n ...(afterSaveHooks || emptyArray),\n ...(queryAfter || emptyArray),\n ...(cteAfterHooks || emptyArray),\n ].map(callAfterHook, args),\n );\n }\n\n // afterCommitHooks are executed later after transaction commit,\n // or, if we don't have transaction, they are executed intentionally after other after hooks\n if (afterCommitHooks || afterSaveCommitHooks || cteAfterCommitHooks) {\n const afterActionAndSaveCommit = (afterCommitHooks ||\n afterSaveCommitHooks) && [\n ...(afterCommitHooks || emptyArray),\n ...(afterSaveCommitHooks || emptyArray),\n ];\n\n if (isInUserTransaction(state)) {\n if (afterActionAndSaveCommit) {\n (state.afterCommit ??= []).push(\n result as unknown[],\n q,\n afterActionAndSaveCommit,\n );\n }\n\n if (cteAfterCommitHooks) {\n (state.afterCommit ??= []).push(\n result as unknown[],\n q,\n cteAfterCommitHooks,\n );\n }\n } else {\n // result can be transformed later, reference the current form to use it in hook.\n const localResult = result as unknown[];\n // to suppress throws of sync afterCommit hooks.\n queueMicrotask(async () => {\n const promises: (unknown | Promise<unknown>)[] = [];\n if (afterActionAndSaveCommit) {\n for (const fn of afterActionAndSaveCommit) {\n try {\n promises.push(\n (fn as unknown as AfterCommitHook)(localResult, q),\n );\n } catch (err) {\n promises.push(Promise.reject(err));\n }\n }\n }\n\n if (cteAfterCommitHooks) {\n for (const fn of cteAfterCommitHooks) {\n try {\n promises.push(fn());\n } catch (err) {\n promises.push(Promise.reject(err));\n }\n }\n }\n\n await _runAfterCommitHooks(\n localResult,\n promises,\n () =>\n [\n ...(afterCommitHooks || emptyArray),\n ...(cteAfterCommitHooks || emptyArray),\n ].map((h) => h.name),\n q.q.catchAfterCommitErrors,\n );\n });\n }\n }\n }\n\n const promise =\n loadMutativeQueriesSelectRelations(\n localSql,\n result,\n startingSavepoint,\n renames,\n ) ||\n /**\n * In case when we have MutativeQueriesSelectRelations, the first query does insert/update/delete,\n * it must not run batchParsers because it doesn't have the data yet.\n * The second query loads data and performs batchParsers.\n */\n //\n parseBatch(q, queryResult!);\n\n if (promise) {\n await promise;\n }\n\n // can be set by hooks or by computed columns\n if (tableHook?.select || tempReturnType !== returnType) {\n if (renames) {\n // to not mutate the original result because it's passed to hooks\n const renamedResult = Array.from({\n length: (result as RecordUnknown[]).length,\n });\n\n for (\n let i = 0, len = (result as RecordUnknown[]).length;\n i < len;\n ++i\n ) {\n const record = (result as RecordUnknown[])[i];\n const renamedRecord = (renamedResult[i] = { ...record });\n for (const a in renames) {\n // TODO: no need to assign if the one or another is in `tempColumns`\n renamedRecord[a] = record[renames[a]];\n renamedRecord[renames[a]] = record[a];\n }\n }\n\n result = renamedResult;\n }\n\n result = filterResult(\n q,\n returnType,\n //\n queryResult!,\n result,\n tempColumns,\n hasAfterHook,\n );\n }\n\n if (query.transform) {\n result = applyTransforms(query, returnType, query.transform, result);\n }\n\n return resolve ? resolve(result) : result;\n } catch (err) {\n let error;\n if (err instanceof adapter.errorClass) {\n // errno for Bun SQL, code for others\n const code = getDriverErrorCode(err);\n if (\n // a special not found error thrown by 'not-found'::int\n code === '22P02' &&\n err.message.endsWith(`\"not-found\"`)\n ) {\n error = new NotFoundError(q);\n } else {\n error = new (q.error as unknown as new () => QueryError)();\n adapter.assignError(error, err);\n }\n error.cause = localError;\n } else {\n error = err;\n if (error instanceof Error) {\n error.cause = localError;\n }\n }\n\n // shift stack by one to point to the calling code\n const stack = localError.stack;\n if (stack) {\n const from = stack.indexOf('\\n');\n if (from !== -1) {\n const to = stack.indexOf('\\n', from + 1);\n if (to !== -1) {\n localError.stack = stack.slice(0, from) + stack.slice(to);\n }\n }\n }\n\n if (log && sql) {\n log.onError(error as Error, sql as SingleSqlItem, logData);\n }\n\n if (reject) return reject(error);\n\n throw error;\n }\n};\n\nexport interface ThenSavepointState extends HackySavepointState {\n transactionAdapter: TransactionAdapter;\n}\n\nconst setCatchingSavepoint = (\n catchTrx: AsyncState | false | undefined,\n): ThenSavepointState | undefined => {\n return catchTrx && catchTrx.transactionAdapter\n ? {\n transactionAdapter: catchTrx.transactionAdapter,\n name: `s${(catchTrx.catchI = (catchTrx.catchI || 0) + 1)}`,\n }\n : undefined;\n};\n\n/**\n * Executes a query and in the case there are rows, but nothing was selected,\n * it populates the response with empty objects,\n * because user might expect empty objects to be returned for an empty select.\n */\nconst execQuery = (\n adapter: Adapter,\n method: 'query' | 'arrays',\n sql: SingleSql,\n startingSavepoint: ThenSavepointState | undefined,\n releasingSavepoint: ThenSavepointState | undefined,\n sqlSessionState: SqlSessionState | undefined,\n) => {\n let promise: Promise<QueryResult>;\n if (startingSavepoint) {\n if (releasingSavepoint) {\n promise = startingSavepoint.transactionAdapter.savepoint(\n startingSavepoint.name,\n () => {\n return (promise = adapter[method as 'query'](\n sql.text,\n sql.values,\n sqlSessionState,\n ));\n },\n );\n } else {\n promise = startingSavepoint.transactionAdapter.hackySavepoint(\n startingSavepoint,\n sql.text,\n sql.values,\n method === 'arrays',\n );\n }\n } else {\n promise = adapter[method as 'query'](sql.text, sql.values, sqlSessionState);\n }\n\n if (!startingSavepoint && releasingSavepoint) {\n promise = promise.then(async (res) => {\n await releasingSavepoint.activeSavepoint?.release();\n return res;\n });\n }\n\n return promise.then((result) => {\n if (result.rowCount && !result.rows.length) {\n result.rows.length = result.rowCount;\n result.rows.fill({});\n }\n\n return result;\n });\n};\n\nexport const handleResult: HandleResult = (\n q,\n returnType,\n result,\n sql,\n isSubQuery,\n) => {\n let parsers = getQueryParsers(q, sql.tableHook?.select);\n\n switch (returnType) {\n case 'all': {\n if (q.q.throwOnNotFound && result.rows.length === 0)\n throw new NotFoundError(q);\n\n const { rows } = result;\n\n if (q.q.returnType === 'value' || q.q.returnType === 'valueOrThrow') {\n if (!rows.length) {\n if (!q.q.select) {\n return rows;\n } else {\n if (q.q.returnType === 'valueOrThrow') {\n throw new NotFoundError(q);\n }\n return [{ value: q.q.notFoundDefault }];\n }\n }\n\n if (parsers) {\n const parser = getValueParser(parsers);\n if (parser) {\n const hookSelect = sql.tableHook?.select;\n for (const row of rows) {\n for (const key in row) {\n if (!hookSelect?.has(key)) {\n row[key] = parser(row[key]);\n }\n }\n }\n }\n }\n } else if (parsers) {\n for (const row of rows) {\n parseRecord(parsers, row);\n }\n }\n\n return rows;\n }\n case 'one': {\n const { rows } = result;\n if (!rows.length) return;\n\n if (parsers) parseRecord(parsers, rows[0]);\n\n return rows[0];\n }\n case 'oneOrThrow': {\n const { rows } = result;\n if (!rows.length) throw new NotFoundError(q);\n\n if (parsers) parseRecord(parsers, rows[0]);\n\n return rows[0];\n }\n case 'rows': {\n const { rows } = result;\n\n if (parsers) {\n parseRows(parsers, result.fields, rows);\n }\n\n return rows;\n }\n case 'pluck': {\n const { rows } = result;\n\n parsePluck(q, parsers, isSubQuery, rows);\n\n return rows;\n }\n case 'value': {\n const { rows } = result;\n\n return rows[0]?.[0] !== undefined\n ? parseValue(rows[0][0], parsers)\n : q.q.notFoundDefault;\n }\n case 'valueOrThrow': {\n if (q.q.returning) {\n if (q.q.throwOnNotFound && result.rowCount === 0) {\n throw new NotFoundError(q);\n }\n return result.rowCount;\n }\n\n const { rows } = result;\n\n if (rows[0]?.[0] === undefined) throw new NotFoundError(q);\n return parseValue(rows[0][0], parsers);\n }\n case 'void': {\n return;\n }\n }\n};\n\nconst parseBatch = (q: Query, queryResult: QueryResult): MaybePromise<void> => {\n let promises: Promise<void>[] | undefined;\n\n if (q.q.batchParsers) {\n for (const parser of q.q.batchParsers) {\n const res = parser.fn(parser.path, queryResult);\n if (res) (promises ??= []).push(res);\n }\n }\n\n return promises && (Promise.all(promises) as never);\n};\n\nexport const parseRecord = (\n parsers: ColumnsParsers, // oxlint-disable-next-line typescript/no-explicit-any\n row: any,\n): unknown => {\n for (const key in parsers) {\n if (key in row) {\n row[key] = (parsers[key] as ColumnParser)(row[key]);\n }\n }\n return row;\n};\n\nconst parseRows = (\n parsers: ColumnsParsers,\n fields: { name: string }[],\n rows: // oxlint-disable-next-line typescript/no-explicit-any\n any[],\n): void => {\n for (let i = fields.length - 1; i >= 0; i--) {\n const parser = parsers[fields[i].name];\n if (parser) {\n for (const row of rows) {\n row[i] = parser(row[i]);\n }\n }\n }\n};\n\nconst parsePluck = (\n query: Query,\n parsers: ColumnsParsers | undefined,\n isSubQuery: true | undefined,\n rows: unknown[],\n): void => {\n const valueToArray = (query.q.getColumn as Column.Pick.Data | undefined)?.data\n ?.valueToArray;\n\n const parse = parsers?.pluck;\n if (parse) {\n if (valueToArray) {\n for (let i = 0; i < rows.length; i++) {\n const value = (\n isSubQuery ? rows[i] : (rows[i] as RecordUnknown)[0]\n ) as unknown[];\n rows[i] =\n value === null\n ? undefined\n : value[0] === null\n ? null\n : parse(value[0]);\n }\n } else {\n for (let i = 0; i < rows.length; i++) {\n const value = isSubQuery ? rows[i] : (rows[i] as RecordUnknown)[0];\n rows[i] = value === null ? value : parse(value);\n }\n }\n } else if (valueToArray) {\n for (let i = 0; i < rows.length; i++) {\n const value = (\n isSubQuery ? rows[i] : (rows[i] as RecordUnknown)[0]\n ) as unknown[];\n rows[i] = value === null ? undefined : value[0];\n }\n } else if (!isSubQuery) {\n for (let i = 0; i < rows.length; i++) {\n rows[i] = (rows[i] as RecordUnknown)[0];\n }\n }\n};\n\nconst parseValue = (value: unknown, parsers?: ColumnsParsers): unknown => {\n const parse = getValueParser(parsers);\n return parse ? parse(value) : value;\n};\n\nexport const filterResult = (\n q: Query,\n returnType: QueryReturnType,\n queryResult: QueryResult,\n result: unknown,\n tempColumns: Set<string> | undefined,\n // result should not be mutated when having hooks, because hook may want to access the data later\n hasAfterHook?: unknown,\n): unknown => {\n if (returnType === 'all') {\n return filterAllResult(result, tempColumns, hasAfterHook);\n }\n\n if (returnType === 'oneOrThrow' || returnType === 'one') {\n let row = (result as RecordUnknown[])[0];\n if (!row) {\n if (returnType === 'oneOrThrow') throw new NotFoundError(q);\n return undefined;\n } else if (!tempColumns?.size) {\n return row;\n } else {\n if (hasAfterHook) row = { ...row };\n\n for (const column of tempColumns) {\n delete row[column];\n }\n\n return row;\n }\n }\n\n if (returnType === 'value') {\n return (result as RecordUnknown[])[0]?.[\n getFirstResultKey(q, queryResult) as string\n ];\n }\n\n if (returnType === 'valueOrThrow') {\n if (q.q.returning) {\n return queryResult.rowCount;\n }\n\n const row = (result as RecordUnknown[])[0];\n if (!row) throw new NotFoundError(q);\n\n return row[getFirstResultKey(q, queryResult) as string];\n }\n\n if (returnType === 'pluck') {\n const key = getFirstResultKey(q, queryResult) as string;\n return (result as RecordUnknown[]).map((row) => row[key]);\n }\n\n if (returnType === 'rows') {\n result = filterAllResult(result, tempColumns, hasAfterHook);\n return (result as RecordUnknown[]).map((record) => Object.values(record));\n }\n\n return;\n};\n\nconst getFirstResultKey = (\n q: Query,\n queryResult: QueryResult,\n): string | undefined => {\n if (q.q.select) {\n return queryResult.fields[0] ? queryResult.fields[0].name : 'value';\n } else {\n for (const key in q.q.selectedComputeds) {\n return key;\n }\n }\n return;\n};\n\nconst filterAllResult = (\n result: unknown,\n tempColumns: Set<string> | undefined,\n hasAfterHook: unknown,\n) => {\n if (tempColumns?.size) {\n if (hasAfterHook) {\n return (result as RecordUnknown[]).map((data) => {\n const record = { ...data };\n for (const key of tempColumns) {\n delete record[key];\n }\n return record;\n });\n } else {\n for (const record of result as RecordUnknown[]) {\n for (const key of tempColumns) {\n delete record[key];\n }\n }\n }\n }\n return result;\n};\n","import { Query, QueryReturnType } from '../../query';\nimport { extendQuery } from '../../query.utils';\nimport { RawSql } from '../../expressions/raw-sql';\nimport { NotFoundError } from '../../errors';\nimport { applyTransforms } from '../data-transform/transform';\nimport { pushQueryValueImmutable, QueryData } from '../../query-data';\n\nconst noneResult = (q: Query, queryData: QueryData, type: QueryReturnType) => {\n if (!type || type === 'all' || type === 'rows' || type === 'pluck') {\n return [];\n } else if (type === 'one' || type === 'value' || type === 'void') {\n return queryData.notFoundDefault;\n } else if (type === 'valueOrThrow' && queryData.returning) {\n return 0;\n } else {\n throw new NotFoundError(q);\n }\n};\n\n/**\n * Methods added to the query prototype when calling {@link QueryMethods.none}.\n */\nexport const noneMethods = {\n // `then` resolves or rejects based on a return type of the query.\n // It is `async` so it returns a chainable Promise.\n async then(\n this: Query,\n resolve?: (data?: unknown) => void,\n reject?: (err: unknown) => void,\n ) {\n try {\n let result = noneResult(this, this.q, this.q.returnType);\n\n if (this.q.transform) {\n result = applyTransforms(\n this.q,\n this.q.returnType,\n this.q.transform,\n result,\n );\n }\n\n return resolve?.(result);\n } catch (err) {\n return reject?.(err);\n }\n },\n catch(this: PromiseLike<unknown>, reject?: (err: unknown) => void) {\n return this.then(undefined, reject);\n },\n};\n\nexport const _queryNone = <T>(q: T): T => {\n if (isQueryNone(q)) return q;\n\n q = extendQuery(q as Query, noneMethods) as T;\n\n pushQueryValueImmutable(q as Query, 'and', new RawSql('false'));\n\n pushQueryValueImmutable(\n q as Query,\n 'transform',\n (_: unknown, queryData: QueryData) =>\n noneResult(q as Query, queryData, queryData.returnType),\n );\n\n return q;\n};\n\nexport const isQueryNone = (q: unknown) =>\n (q as Query).then === noneMethods.then;\n","import { pushQueryArrayImmutable } from '../../query.utils';\nimport {\n pushQueryValueImmutable,\n QueryBeforeHook,\n QueryData,\n} from '../../query-data';\nimport { ToSQLQuery } from '../../sql/to-sql';\nimport { setPrepareSubQueryForSql } from '../../../columns/operators';\nimport { setRawSqlPrepareSubQueryForSql } from '../../expressions/raw-sql';\nimport { PickQueryQ } from '../../pick-query-types';\n\nexport interface SubQueryForSql extends ToSQLQuery {\n __forSql: true;\n}\n\nexport interface HasBeforeAndBeforeSet {\n before?: QueryBeforeHook[];\n beforeSet?: QueryData['beforeSet'];\n}\n\nexport interface ArgWithBeforeAndBeforeSet {\n q: HasBeforeAndBeforeSet;\n}\n\nexport interface PrepareSubQueryForSqlArg extends PickQueryQ {\n dynamicBefore?: boolean;\n}\n\nexport interface PrepareSubQueryForSql {\n (\n mainQuery: ArgWithBeforeAndBeforeSet,\n subQuery: PrepareSubQueryForSqlArg,\n ): SubQueryForSql;\n}\n\nexport const prepareSubQueryForSql: PrepareSubQueryForSql = (\n mainQuery,\n subQuery,\n) => {\n // used in DynamicRawSql because it doesn't know what callbacks does it need before executing\n if (subQuery.dynamicBefore) {\n pushQueryValueImmutable(mainQuery as never, 'dynamicBefore', subQuery.q);\n return subQuery as never;\n }\n\n let beforeAction = subQuery.q.type\n ? subQuery.q.type === 'insert'\n ? subQuery.q.beforeCreate\n : subQuery.q.type === 'update'\n ? subQuery.q.beforeUpdate\n : subQuery.q.type === 'upsert'\n ? subQuery.q.upsertUpdate && subQuery.q.updateData\n ? subQuery.q.beforeUpdate && subQuery.q.beforeCreate\n ? [...subQuery.q.beforeUpdate, ...subQuery.q.beforeCreate]\n : subQuery.q.beforeUpdate || subQuery.q.beforeCreate\n : subQuery.q.beforeCreate\n : subQuery.q.type === 'delete'\n ? subQuery.q.beforeDelete\n : undefined\n : undefined;\n\n const { beforeSet } = subQuery.q;\n beforeAction =\n beforeAction && beforeSet\n ? [...beforeAction, ...beforeSet]\n : beforeSet\n ? [...beforeSet]\n : beforeAction;\n\n if (beforeAction) {\n const newSet = new Set(mainQuery.q.beforeSet);\n const filteredHooks = [];\n for (const hook of beforeAction) {\n if (!newSet.has(hook)) {\n newSet.add(hook);\n filteredHooks.push(hook);\n }\n }\n mainQuery.q.beforeSet = newSet;\n beforeAction = filteredHooks;\n\n if (beforeAction.length) {\n pushQueryArrayImmutable(\n mainQuery as PickQueryQ,\n 'before',\n beforeAction.map((fn) => () => fn(subQuery as never)),\n );\n }\n }\n\n return subQuery as never;\n};\n\nsetPrepareSubQueryForSql(prepareSubQueryForSql);\nsetRawSqlPrepareSubQueryForSql(prepareSubQueryForSql);\n","import { IsQuery, Query, SelectableFromShape } from '../../query';\nimport { sqlQueryArgsToExpression } from '../../expressions/raw-sql';\nimport { anyShape, Column, ColumnsShape } from '../../../columns';\nimport {\n prepareSubQueryForSql,\n SubQueryForSql,\n} from '../../internal-features/sub-query/sub-query-for-sql';\nimport {\n PickQueryAs,\n PickQueryHasSelect,\n PickQueryResultAs,\n PickQuerySelectableResultInputTypeAs,\n PickQueryQ,\n PickQueryReturnType,\n PickQuerySelectable,\n PickQueryShape,\n PickQueryWithData,\n} from '../../pick-query-types';\nimport { MaybeArray, UnionToIntersection } from '../../../utils';\nimport { getQueryAs, SetQueryTableAlias } from '../as/as';\nimport {\n ColumnsParsers,\n getQueryParsers,\n} from '../../query-columns/query-column-parsers';\nimport { isExpression } from '../../expressions/expression';\nimport { _clone } from '../clone/clone';\nimport { getShapeFromSelect } from '../select/select.utils';\nimport { WithDataItems } from '../cte/cte.sql';\nimport { SQLQueryArgs } from '../../db-sql-query';\nimport { JoinedParsers, WithConfig, WithConfigs } from '../../query-data';\nimport { QueryThenByQuery } from '../../then/then';\n\nexport interface FromQuerySelf\n extends\n PickQuerySelectable,\n PickQueryShape,\n PickQueryReturnType,\n PickQueryWithData,\n PickQueryAs,\n PickQueryHasSelect {}\n\nexport type FromArg<T extends FromQuerySelf> =\n | IsQuery\n | Exclude<keyof T['withData'], symbol | number>;\n\nexport type FromResult<\n T extends FromQuerySelf,\n Arg extends MaybeArray<FromArg<T>>,\n> = Arg extends string\n ? T['withData'] extends WithDataItems\n ? {\n [K in keyof T]: K extends '__selectable'\n ? SelectableFromShape<T['withData'][Arg]['shape'], Arg>\n : K extends 'result'\n ? T['withData'][Arg]['shape']\n : K extends 'then'\n ? QueryThenByQuery<T, T['withData'][Arg]['shape']>\n : T[K];\n }\n : SetQueryTableAlias<T, Arg>\n : Arg extends PickQuerySelectableResultInputTypeAs\n ? {\n [K in keyof T]: K extends '__defaultSelect'\n ? keyof Arg['result']\n : K extends '__selectable'\n ? SelectableFromShape<Arg['result'], Arg['__as']>\n : K extends '__as'\n ? Arg['__as']\n : K extends 'result'\n ? Arg['result']\n : K extends 'shape'\n ? Arg['result']\n : K extends '__inputType'\n ? Arg['__inputType']\n : K extends 'then'\n ? QueryThenByQuery<T, Arg['result']>\n : T[K];\n }\n : Arg extends (infer A)[]\n ? {\n [K in keyof T]: K extends '__selectable'\n ? UnionToIntersection<\n A extends string\n ? T['withData'] extends WithDataItems\n ? {\n [K in keyof T['withData'][A]['shape'] &\n string as `${A}.${K}`]: {\n as: K;\n column: T['withData'][A]['shape'][K];\n };\n }\n : never\n : A extends PickQueryResultAs\n ? {\n [K in keyof A['result'] &\n string as `${A['__as']}.${K}`]: K extends string\n ? {\n as: K;\n column: A['result'][K];\n }\n : never;\n }\n : never\n >\n : T[K];\n }\n : T;\n\nconst addWithParsers = (w: WithConfig, parsers: ColumnsParsers) => {\n for (const key in w.shape) {\n const { _parse } = w.shape[key] as Column;\n if (_parse) parsers[key] = _parse;\n }\n};\n\nexport function queryFrom<\n T extends FromQuerySelf,\n Arg extends MaybeArray<FromArg<T>>,\n>(self: T, arg: Arg): FromResult<T, Arg> {\n const data = (self as unknown as PickQueryQ).q;\n if (typeof arg === 'string') {\n data.as ||= arg;\n const w = data.withShapes?.[arg];\n data.selectShape = (w?.shape ?? anyShape) as ColumnsShape;\n data.runtimeComputeds = w?.computeds;\n\n const parsers: ColumnsParsers = {};\n data.defaultParsers = parsers;\n if (w) addWithParsers(w, parsers);\n\n const i = arg.indexOf('.');\n if (i !== -1) {\n data.schema = arg.slice(0, i);\n arg = arg.slice(i + 1) as Arg;\n } else if (w) {\n data.schema = undefined;\n }\n } else if (Array.isArray(arg)) {\n const shape = { ...data.selectShape };\n\n const joinedParsers: JoinedParsers = {};\n\n // TODO: batchParsers\n for (const item of arg) {\n if (typeof item === 'string') {\n const w = (data.withShapes as WithConfigs)[item];\n\n Object.assign(shape, w.shape);\n if (w.computeds)\n data.runtimeComputeds = { ...data.runtimeComputeds, ...w.computeds };\n\n const parsers: ColumnsParsers = {};\n joinedParsers[item] = parsers;\n addWithParsers(w, parsers);\n } else if (!isExpression(item)) {\n const sub = prepareSubQueryForSql(self as unknown as Query, item);\n Object.assign(shape, getShapeFromSelect(sub, true));\n\n const key = getQueryAs(sub);\n joinedParsers[key] = getQueryParsers(sub as unknown as Query);\n }\n }\n\n data.joinedParsers = joinedParsers;\n } else {\n const q = prepareSubQueryForSql(self as never, arg as never);\n data.as ||= q.q.as || q.table || 't';\n data.selectShape = getShapeFromSelect(q, true) as ColumnsShape;\n data.defaultParsers = getQueryParsers(q as unknown as Query);\n data.batchParsers = q.q.batchParsers;\n }\n\n data.from = arg as SubQueryForSql;\n data.selectAllColumns = data.scopes = undefined;\n\n return self as never;\n}\n\nexport function queryFromSql<T extends FromQuerySelf>(\n self: T,\n args: SQLQueryArgs,\n): T {\n const data = (self as unknown as PickQueryQ).q;\n data.as ||= 't';\n data.from = sqlQueryArgsToExpression(args);\n data.selectAllColumns = undefined;\n return self;\n}\n\nexport class FromMethods {\n /**\n * Set the `FROM` value, by default the table name is used.\n *\n * `from` determines a set of available tables and columns withing the query,\n * and thus it must not follow `select`, use `select` only after `from`.\n *\n * ```ts\n * // accepts sub-query:\n * db.table.from(db.otherTable.select('foo', 'bar'));\n *\n * // accepts alias of `WITH` expression:\n * q.with('withTable', db.table.select('id', 'name'))\n * .from('withTable')\n * // `select` is after `from`\n * .select('id', 'name');\n * ```\n *\n * `from` can accept multiple sources:\n *\n * ```ts\n * db.table\n * // add a `WITH` statement called `withTable\n * .with('withTable', db.table.select('one'))\n * // select from `withTable` and from `otherTable`\n * .from('withTable', db.otherTable.select('two'))\n * // source names and column names are properly typed when selecting\n * .select('withTable.one', 'otherTable.two');\n * ```\n *\n * @param arg - query or name of CTE table\n */\n from<T extends FromQuerySelf, Arg extends MaybeArray<FromArg<T>>>(\n this: T,\n arg: T['__hasSelect'] extends true\n ? '`select` must be placed after `from`'\n : Arg,\n ): FromResult<T, Arg> {\n return queryFrom(_clone(this), arg as never) as never;\n }\n\n /**\n * Set the `FROM` value with custom SQL:\n *\n * ```ts\n * const value = 123;\n * db.table.fromSql`value = ${value}`;\n * ```\n *\n * @param args - SQL expression\n */\n fromSql<T extends FromQuerySelf>(this: T, ...args: SQLQueryArgs): T {\n return queryFromSql(_clone(this), args as never) as never;\n }\n\n /**\n * Adds `ONLY` SQL keyword to the `FROM`.\n * When selecting from a parent table that has a table inheritance,\n * setting `only` will make it to select rows only from the parent table.\n *\n * ```ts\n * db.table.only();\n *\n * // disabling `only` after being enabled\n * db.table.only().only(false);\n * ```\n *\n * @param only - can be disabled by passing `false` if was enabled previously.\n */\n only<T>(this: T, only = true): T {\n const q = _clone(this);\n q.q.only = only;\n return q as T;\n }\n}\n","import { IsQuery, Query } from '../../query';\nimport { FromQuerySelf, queryFrom } from '../from/from';\nimport { _setQueryAs, SetQueryTableAlias } from '../as/as';\nimport { _clone } from '../clone/clone';\n\nexport type WrapQueryArg = FromQuerySelf;\n\nexport function queryWrap<\n T extends IsQuery,\n Q extends WrapQueryArg,\n As extends string = 't',\n>(self: T, query: Q, as: As = 't' as As): SetQueryTableAlias<Q, As> {\n return _setQueryAs(queryFrom(query, self) as never, as) as never;\n}\n\n/**\n * This function is useful when wrapping a query,\n * such as when doing `SELECT json_agg(t.*) FROM (...) AS t`,\n * to get rid of default scope conditions (WHERE deletedAt IS NULL)\n * that otherwise would be duplicated inside the `FROM` and after `AS t`.\n */\nexport function cloneQueryBaseUnscoped(query: Query) {\n const q = query.baseQuery.clone();\n q.q.or = q.q.and = q.q.scopes = undefined;\n return q;\n}\n\nexport class QueryWrap {\n wrap<T extends IsQuery, Q extends WrapQueryArg, As extends string = 't'>(\n this: T,\n query: Q,\n as?: As,\n ): SetQueryTableAlias<Q, As> {\n return queryWrap(this, _clone(query), as) as never;\n }\n}\n","import {\n PickQueryAs,\n PickQuerySelectable,\n PickQueryShape,\n PickQueryTable,\n PickQueryResult,\n PickQueryRelations,\n PickQueryReturnType,\n} from './pick-query-types';\nimport { RecordUnknown } from '../utils';\nimport { IsQuery, QueryManyTake, QueryManyTakeOptional } from './query';\n\nexport interface RelationJoinQuery {\n (joiningQuery: IsQuery, baseQuery: IsQuery): IsQuery;\n}\n\nexport interface RelationConfigQuery\n extends\n PickQueryResult,\n PickQuerySelectable,\n PickQueryShape,\n PickQueryTable,\n PickQueryAs,\n PickQueryRelations,\n PickQueryReturnType {}\n\nexport interface RelationConfigBase extends IsQuery {\n returnsOne: boolean;\n required?: unknown;\n query: RelationConfigQuery;\n joinQuery: RelationJoinQuery;\n reverseJoin: RelationJoinQuery;\n params: unknown;\n\n queryRelated(params: unknown): unknown;\n\n modifyRelatedQuery?(relatedQuery: IsQuery): (query: IsQuery) => void;\n\n // Omit `belongsTo` foreign keys to be able to create records\n // with `db.book.create({ authorId: 123 })`\n // or with `db.book.create({ author: authorData })`.\n // Other relation kinds have `omitForeignKeyInCreate: never`.\n omitForeignKeyInCreate: PropertyKey;\n dataForUpdate: unknown;\n dataForUpdateOne: unknown;\n primaryKeys: string[];\n}\n\nexport interface RelationConfigDataForCreate {\n columns: PropertyKey;\n nested: RecordUnknown;\n}\n\nexport interface RelationsBase {\n [relationName: string]: RelationConfigBase;\n}\n\nexport interface RelationsDataForCreateBase {\n [relationName: string]: unknown;\n}\n\nexport interface RelationsDataForCreateOptionalBase {\n [relationName: string]: unknown;\n}\n\nexport type RelationQueryMaybeSingle<T extends RelationConfigBase> =\n T['returnsOne'] extends true\n ? T['required'] extends true\n ? QueryManyTake<T['query']>\n : QueryManyTakeOptional<T['query']>\n : T['query'];\n\n/* getters */\n\nexport const isRelationQuery = (q: IsQuery): q is RelationConfigBase =>\n 'joinQuery' in q;\n","import {\n IsQuery,\n Query,\n QueryHasSelect,\n QueryOrExpressionBooleanOrNullResult,\n QueryTake,\n QueryTakeOptional,\n} from '../../query';\nimport {\n _queryTake,\n _queryTakeOptional,\n pushQueryArrayImmutable,\n} from '../../query.utils';\nimport {\n JoinArgs,\n JoinCallback,\n JoinCallbackArgs,\n JoinFirstArg,\n} from '../join/join';\nimport { sqlQueryArgsToExpression } from '../../expressions/raw-sql';\nimport { preprocessJoinArg, processJoinArgs } from '../join/process-join-args';\nimport { _queryNone } from '../../extra-features/none/none';\nimport { prepareSubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { prepareOpArg } from '../../../columns/operators';\nimport {\n PickQuerySelectableShapeRelationsWithDataAs,\n PickQueryQ,\n PickQueryRelations,\n PickQuerySelectableRelations,\n PickQuerySelectableRelationsResultReturnType,\n} from '../../pick-query-types';\nimport {\n EmptyObject,\n isIterable,\n MaybeArray,\n RecordUnknown,\n} from '../../../utils';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { _setSubQueryAliases } from '../as/as';\nimport { _clone } from '../clone/clone';\nimport { QueryExpressions } from '../../expressions/query-expressions';\nimport { resolveSubQueryCallback } from '../../internal-features/sub-query/sub-query';\nimport { OrchidOrmInternalError } from '../../errors';\nimport { SQLQueryArgs } from '../../db-sql-query';\nimport { getClonedQueryData, pushQueryValueImmutable } from '../../query-data';\n\n/*\nArgument of `where`:\n- can be an object with special keys `NOT`, `OR`, `IN`, etc.: q.where({ NOT: { key: 'value' } })\n- can be a raw SQL: q.where(q.raw`sql`)\n- can be a special query builder: q.whereNot((q) => q.whereIn(...))\n- can be a nested `where` query to be joined wth `AND`: q.where(q.where(...), q.where(...))\n- can be an object where keys are column names and values can be one of:\n - value to check for equality\n - null for `IS NULL`\n - object with column operators: q.where({ num: { gt: 5 } })\n - raw SQL: q.where({ num: q.raw`sql` })\n - sub query returning a single column: q.where({ num: db.someTable.where(...).get('column') })\n */\nexport type WhereArg<T extends PickQuerySelectableRelations> =\n | {\n [K in keyof T['__selectable'] | 'NOT' | 'OR' | 'IN']?: K extends 'NOT'\n ? WhereArg<T> | WhereArgs<T>\n : K extends 'OR'\n ? (WhereArg<T> | WhereArgs<T>)[]\n : K extends 'IN'\n ? MaybeArray<{\n columns: (keyof T['__selectable'])[];\n values: unknown[][] | IsQuery | Expression;\n }>\n :\n | T['__selectable'][K]['column']['__queryType']\n | null\n // inlined `ColumnOperators` helper\n | {\n [O in keyof T['__selectable'][K]['column']['operators']]?: T['__selectable'][K]['column']['operators'][O]['_opType'];\n }\n // inlined QueryOrExpression\n | {\n result: {\n value: {\n // simplified Column.Pick.QueryColumn\n __queryType:\n | T['__selectable'][K]['column']['__queryType']\n | null;\n };\n };\n }\n // returns inlined QueryOrExpression\n | ((q: T) => {\n result: {\n value: {\n // simplified Column.Pick.QueryColumn\n __queryType:\n | T['__selectable'][K]['column']['__queryType']\n | null;\n };\n };\n });\n }\n | ((\n q: WhereQueryBuilder<T>,\n ) => QueryOrExpressionBooleanOrNullResult | WhereQueryBuilder<T>);\n\n/**\n * Callback argument of `where`.\n * It has `where` methods (`where`, `whereNot`, `whereExists`, etc.),\n * and it has relations that you can aggregate and use a boolean comparison with, such as:\n * ```ts\n * db.table.where((q) => q.relation.count().equals(10))\n * ```\n */\nexport type WhereQueryBuilder<T extends PickQueryRelations> =\n EmptyObject extends T['relations']\n ? {\n [K in keyof T]: K extends\n | keyof Where\n | keyof QueryExpressions\n | 'table' // is needed for `useHelper`\n | 'get'\n | 'columnTypes'\n | '__selectable'\n | 'relations'\n | 'useHelper'\n | 'modify'\n // rest are required by `useHelper`\n | 'result'\n | 'returnType'\n | 'withData'\n | 'windows'\n | 'then'\n | 'none'\n ? T[K]\n : never;\n }\n : {\n [K in keyof T['relations'] | keyof T]: K extends keyof T['relations']\n ? T['relations'][K]['query']\n : K extends keyof T &\n (\n | keyof Where\n | keyof QueryExpressions\n | 'table' // is needed for `useHelper`\n | 'get'\n | 'columnTypes'\n | '__selectable'\n | 'relations'\n | 'useHelper'\n | 'modify'\n // rest are required by `useHelper`\n | 'result'\n | 'returnType'\n | 'withData'\n | 'windows'\n | 'then'\n | 'none'\n )\n ? T[K]\n : never;\n };\n\n// One or more of {@link WhereArg} or a string template for raw SQL.\nexport type WhereArgs<T extends PickQuerySelectableRelations> = WhereArg<T>[];\n\nexport type WhereNotArgs<T extends PickQuerySelectableRelations> = [\n WhereArg<T>,\n];\n\n// Argument of `whereIn`: can be a column name or a tuple with column names to search in.\nexport type WhereInColumn<T extends PickQuerySelectableRelations> =\n | keyof T['__selectable']\n | [keyof T['__selectable'], ...(keyof T['__selectable'])[]];\n\n// If `WhereInColumn` is a single column, it accepts array of values, or Query returning single column, or raw SQL expression.\n// If `WhereInColumn` is a tuple, it accepts a tuple of values described above.\nexport type WhereInValues<\n T extends PickQuerySelectableRelations,\n Column,\n> = Column extends keyof T['__selectable']\n ?\n | Iterable<T['__selectable'][Column]['column']['__queryType']>\n | IsQuery\n | Expression\n :\n | ({\n [I in keyof Column]: Column[I] extends keyof T['__selectable']\n ? T['__selectable'][Column[I]]['column']['__queryType']\n : never;\n } & {\n length: Column extends { length: number } ? Column['length'] : never;\n })[]\n | IsQuery\n | Expression;\n\n// In addition to `WhereInColumn` + `WhereInValues` where user can provide a tuple with columns and a tuple with values, enable `whereIn` with object syntax.\n// Each key is a column name, value is array of column values, or a query returning single column, or a raw SQL expression.\nexport type WhereInArg<T extends PickQuerySelectableRelations> = {\n [K in keyof T['__selectable']]?:\n | Iterable<T['__selectable'][K]['column']['__queryType']>\n | IsQuery\n | Expression;\n};\n\n// After applying `where`, attach `__hasWhere: true` to query to allow updating and deleting.\nexport interface QueryHasWhere {\n __hasWhere: true;\n}\n\ninterface QueryFnReturningSelect {\n (q: never): QueryHasSelect;\n}\n\nconst resolveCallbacksInArgs = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n) => {\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (typeof arg === 'function') {\n const qb = Object.create(q);\n qb.q = getClonedQueryData((q as unknown as PickQueryQ).q);\n qb.q.and = qb.q.or = qb.q.scopes = undefined;\n qb.q.subQuery = 1;\n _setSubQueryAliases(qb);\n\n const resolved = resolveSubQueryCallback(qb, arg as never) as never;\n args[i] = prepareSubQueryForSql(q as never, resolved) as never;\n } else if (arg.constructor === Object) {\n const copy = ((args as RecordUnknown[])[i] = {\n ...(arg as RecordUnknown),\n });\n for (const key in arg) {\n const value = arg[key as never] as RecordUnknown;\n if (typeof value === 'function') {\n let resolved = (value as (q: unknown) => unknown)(q);\n if (!isExpression(resolved)) {\n resolved = prepareSubQueryForSql(\n q as unknown as Query,\n resolved as unknown as Query,\n );\n }\n copy[key] = resolved;\n } else {\n prepareWhereObj(q, value, true);\n }\n }\n }\n }\n};\n\nconst prepareWhereObj = (\n q: PickQuerySelectableRelations,\n value: RecordUnknown,\n checkNested?: boolean,\n) => {\n for (const op in value) {\n const param = value[op];\n if (param && typeof param === 'object') {\n if (Array.isArray(param)) {\n param.forEach((item, i) => {\n const val = prepareOpArg(q, item);\n if (val) param[i] = val;\n });\n } else if (checkNested && param.constructor === Object) {\n prepareWhereObj(q, param as RecordUnknown);\n } else {\n const val = prepareOpArg(q, param);\n if (val) value[op] = val;\n }\n }\n }\n};\n\n/**\n * Mutative {@link Where.prototype.where}\n */\nexport const _queryWhere = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n): T & QueryHasWhere => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryArrayImmutable(q as never, 'and', args) as never;\n};\n\nexport const _queryFindBy = <\n T extends PickQuerySelectableRelationsResultReturnType,\n>(\n q: T,\n arg: WhereArg<T>,\n): QueryTake<T & QueryHasWhere> => {\n validateFindBy(q, arg, 'findBy');\n return _queryTake(_queryWhere(q, [arg]));\n};\n\nexport const _queryFindByOptional = <\n T extends PickQuerySelectableRelationsResultReturnType,\n>(\n q: T,\n arg: WhereArg<T>,\n): QueryTakeOptional<T & QueryHasWhere> => {\n validateFindBy(q, arg, 'findByOptional');\n return _queryTakeOptional(_queryWhere(q, [arg]));\n};\n\nconst validateFindBy = (\n q: unknown,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n arg: WhereArg<any>,\n method: string,\n) => {\n let nonEmpty: boolean | undefined;\n for (const key in arg) {\n nonEmpty = true;\n if (arg[key as keyof typeof arg] === undefined) {\n throw new OrchidOrmInternalError(\n q as never,\n `${method} was called with undefined value`,\n );\n }\n }\n if (!nonEmpty) {\n throw new OrchidOrmInternalError(\n q as never,\n `${method} was called with empty object`,\n );\n }\n};\n\n/**\n * Mutative {@link Where.prototype.whereSql}\n */\nexport const _queryWhereSql = <T>(q: T, args: SQLQueryArgs): T => {\n return pushQueryValueImmutable(\n q as never,\n 'and',\n sqlQueryArgsToExpression(args),\n ) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.whereNot}\n */\nexport const _queryWhereNot = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereNotArgs<T>,\n): T & QueryHasWhere => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryValueImmutable(q as never, 'and', {\n NOT: args,\n }) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.whereNotSql}\n */\nexport const _queryWhereNotSql = <T>(q: T, args: SQLQueryArgs): T => {\n return pushQueryValueImmutable(q as never, 'and', {\n NOT: sqlQueryArgsToExpression(args),\n }) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.whereNotExists}\n */\nexport const _queryWhereNotExists = (q: Query, arg: unknown, args: unknown) => {\n return _queryWhereNot(q, existsArgs(q, arg as never, args as never)) as never;\n};\n\nexport const _queryWhereOneOf = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n): T & QueryHasWhere => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryValueImmutable(q as never, 'and', {\n OR: args,\n }) as never;\n};\n\nexport const _queryWhereNotOneOf = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n): T => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryValueImmutable(q as never, 'and', {\n NOT: { OR: args },\n }) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.orWhere}\n */\nexport const _queryOr = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n): T & QueryHasWhere => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryArrayImmutable(\n q as never,\n 'or',\n args.map((item) => [item]),\n ) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.orWhereNot}\n */\nexport const _queryOrNot = <T extends PickQuerySelectableRelations>(\n q: T,\n args: WhereArgs<T>,\n): T & QueryHasWhere => {\n resolveCallbacksInArgs(q, args);\n\n return pushQueryArrayImmutable(\n q as never,\n 'or',\n args.map((item) => {\n return [{ NOT: item }];\n }),\n ) as never;\n};\n\n/**\n * Mutative {@link Where.prototype.whereIn}\n */\nexport const _queryWhereIn = <T>(\n q: T,\n and: boolean,\n arg: unknown,\n values: unknown[] | Iterable<unknown> | IsQuery | Expression | undefined,\n not?: boolean,\n): T & QueryHasWhere => {\n let item;\n if (values) {\n if (isIterable(values)) values = [...values];\n\n if ('length' in values && !values.length) {\n return _queryNone(q) as T & QueryHasWhere;\n }\n\n if (values instanceof (q as Query).constructor) {\n values = prepareSubQueryForSql(q as Query, values as Query);\n }\n\n if (Array.isArray(arg)) {\n item = {\n IN: {\n columns: arg,\n values,\n },\n };\n } else {\n item = { [arg as string]: { in: values } };\n }\n } else {\n item = {} as { [K: string]: { in: Iterable<unknown> } };\n for (const key in arg as { [K: string]: Iterable<unknown> }) {\n let values = (arg as { [K: string]: Iterable<unknown> })[key];\n\n if (\n ('length' in values && !values.length) ||\n ('size' in values && !values.size)\n ) {\n return _queryNone(q) as T & QueryHasWhere;\n }\n\n if (values instanceof (q as Query).constructor) {\n // TODO: add a test, not sure if `in` expects a query in this case\n values = prepareSubQueryForSql(q as Query, values as never) as never;\n }\n\n item[key] = { in: values };\n }\n }\n\n if (not) item = { NOT: item };\n\n if (and) {\n pushQueryValueImmutable(q as never, 'and', item);\n } else {\n pushQueryValueImmutable(q as never, 'or', [item]);\n }\n\n return q as never;\n};\n\n/**\n * Process arguments of `whereExists`.\n */\nconst existsArgs = (\n self: Query,\n q: JoinFirstArg<Query>,\n args: JoinArgs<Query, Query>,\n) => {\n const joinArgs = processJoinArgs(\n self,\n preprocessJoinArg(self, q) as never,\n args as never,\n false,\n undefined,\n true,\n );\n\n return [\n {\n EXISTS: joinArgs,\n },\n ] as never;\n};\n\n/**\n * Mutative {@link Where.prototype.whereExists}\n */\nexport const _queryWhereExists = <\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n>(\n q: T,\n arg: Arg,\n args: [JoinCallback<T, Arg>] | JoinArgs<T, Arg>,\n): T & QueryHasWhere => {\n return _queryWhere(\n q as never,\n existsArgs(q as unknown as Query, arg as never, args as never),\n ) as never;\n};\n\nexport class Where {\n /**\n * Constructing `WHERE` conditions:\n *\n * ```ts\n * import { sql } from './table-factory';\n *\n * db.table.where({\n * // column of the current table\n * name: 'John',\n *\n * // table name may be specified, it can be the name of a joined table\n * 'table.lastName': 'Johnsonuk',\n *\n * // object with operators, see the \"column operators\" section to see a full list of them:\n * age: {\n * gt: 30,\n * lt: 70,\n * },\n *\n * // where column equals to raw SQL\n * // import `sql` from your table factory\n * column: sql`sql expression`,\n * // or use `(q) => sql` for the same\n * column2: (q) => sql`sql expression`,\n *\n * // reference other columns in such a way:\n * firstName: (q) => q.ref('lastName'),\n * });\n * ```\n *\n * Multiple `where`s are joined with `AND`:\n *\n * ```ts\n * db.table.where({ foo: 'foo' }).where({ bar: 'bar' });\n * ```\n *\n * ```sql\n * SELECT * FROM table WHERE foo = 'foo' AND bar = 'bar'\n * ```\n *\n * `undefined` values are ignored, so you can supply a partial object with conditions:\n *\n * ```ts\n * type Params = {\n * // allow providing exact age, or lower or greater than\n * age?: number | { lt?: number; gt?: number };\n * };\n *\n * const loadRecords = async (params: Params) => {\n * // this will load all records if params is an empty object\n * const records = await db.table.where(params);\n * };\n * ```\n *\n * It supports a sub-query that is selecting a single value to compare it with a column:\n *\n * ```ts\n * db.table.where({\n * // compare `someColumn` in one table with the `column` value returned from another query.\n * someColumn: db.otherTable.where(...conditions).get('column'),\n * });\n * ```\n *\n * `where` can accept other queries and merge their conditions:\n *\n * ```ts\n * const otherQuery = db.table.where({ name: 'John' });\n *\n * db.table.where({ id: 1 }, otherQuery);\n * // this will produce WHERE \"table\".\"id\" = 1 AND \"table\".\"name' = 'John'\n * ```\n *\n * `where` supports raw SQL:\n *\n * ```ts\n * db.table.where(sql`a = b`);\n * ```\n *\n * `where` can accept a callback with a specific query builder containing all \"where\" methods such as `where`, `orWhere`, `whereNot`, `whereIn`, `whereExists`:\n *\n * ```ts\n * db.table.where((q) =>\n * q\n * .where({ name: 'Name' })\n * .orWhere({ id: 1 }, { id: 2 })\n * .whereIn('letter', ['a', 'b', 'c'])\n * .whereExists(db.message, 'authorId', 'id'),\n * );\n * ```\n *\n * `where` can accept multiple arguments, conditions are joined with `AND`:\n *\n * ```ts\n * db.table.where(\n * { id: 1 },\n * db.table.where({ name: 'John' }),\n * sql`a = b`,\n * );\n * ```\n *\n * ## where sub query\n *\n * `where` handles a special callback where you can query a relation to get some value and filter by that value.\n *\n * It is useful for a faceted search. For instance, posts have tags, and we want to find all posts that have all the given tags.\n *\n * ```ts\n * const givenTags = ['typescript', 'node.js'];\n *\n * const posts = await db.post.where(\n * (post) =>\n * post.tags // query tags of the post\n * .whereIn('tagName', givenTags) // where name of the tag is inside array\n * .count() // count how many such tags were found\n * .equals(wantedTags.length), // the count must be exactly the length of array\n * // if the post has ony `typescript` tag but not the `node.js` it will be omitted\n * );\n * ```\n *\n * This will produce an efficient SQL query:\n *\n * ```sql\n * SELECT * FROM \"post\"\n * WHERE (\n * SELECT count(*) = 3\n * FROM \"tag\" AS \"tags\"\n * WHERE \"tag\".\"tagName\" IN ('typescript', 'node.js')\n * -- join tags to the post via \"postTag\" table\n * AND EXISTS (\n * SELECT 1 FROM \"postTag\"\n * WHERE \"postTag\".\"postId\" = \"post\".\"id\"\n * AND \"postTag\".\"tagId\" = \"tag\".\"id\"\n * )\n * )\n * ```\n *\n * In the example above we use `count()`, you can also use any other aggregate method instead, such as `min`, `max`, `avg`.\n *\n * The `count()` is chained with `equals` to check for a strict equality, any other operation is also allowed, such as `not`, `lt`, `gt`.\n *\n * ## where special keys\n *\n * The object passed to `where` can contain special keys, each of the keys corresponds to its own method and takes the same value as the type of argument of the method.\n *\n * For example:\n *\n * ```ts\n * db.table.where({\n * NOT: { key: 'value' },\n * OR: [{ name: 'a' }, { name: 'b' }],\n * IN: {\n * columns: ['id', 'name'],\n * values: [\n * [1, 'a'],\n * [2, 'b'],\n * ],\n * },\n * });\n * ```\n *\n * Using methods `whereNot`, `orWhere`, `whereIn` instead of this is a shorter and cleaner way, but in some cases, such object keys way may be more convenient.\n *\n * ```ts\n * db.table.where({\n * // see .whereNot\n * NOT: { id: 1 },\n * // can be an array:\n * NOT: [{ id: 1 }, { id: 2 }],\n *\n * // see .orWhere\n * OR: [{ name: 'a' }, { name: 'b' }],\n * // can be an array:\n * // this will give id = 1 AND id = 2 OR id = 3 AND id = 4\n * OR: [\n * [{ id: 1 }, { id: 2 }],\n * [{ id: 3 }, { id: 4 }],\n * ],\n *\n * // see .in, the key syntax requires an object with columns and values\n * IN: {\n * columns: ['id', 'name'],\n * values: [\n * [1, 'a'],\n * [2, 'b'],\n * ],\n * },\n * // can be an array:\n * IN: [\n * {\n * columns: ['id', 'name'],\n * values: [\n * [1, 'a'],\n * [2, 'b'],\n * ],\n * },\n * { columns: ['someColumn'], values: [['foo', 'bar']] },\n * ],\n * });\n * ```\n *\n * ## column operators\n *\n * `where` argument can take an object where the key is the name of the operator and the value is its argument.\n *\n * Different types of columns support different sets of operators.\n *\n * All column operators can take a value of the same type as the column, a sub-query, or a raw SQL expression:\n *\n * ```ts\n * db.table.where({\n * numericColumn: {\n * // lower than 5\n * lt: 5,\n *\n * // lower than the value returned by sub-query\n * lt: db.otherTable.select('someNumber').take(),\n *\n * // raw SQL expression produces WHERE \"numericColumn\" < \"otherColumn\" + 10\n * lt: sql`\"otherColumn\" + 10`,\n * },\n * });\n * ```\n *\n * ### Any type of column operators\n *\n * `equals` is a simple `=` operator, it may be useful for comparing column value with JSON object:\n *\n * ```ts\n * db.table.where({\n * // when searching for an exact same JSON value, this won't work:\n * jsonColumn: someObject,\n *\n * // use `{ equals: ... }` instead:\n * jsonColumn: { equals: someObject },\n * });\n * ```\n *\n * `not` is `!=` (aka `<>`) not equal operator:\n *\n * ```ts\n * db.table.where({\n * anyColumn: { not: value },\n * });\n * ```\n *\n * `in` is for the `IN` operator to check if the column value is included in a list of values.\n *\n * Takes an array of the same type as a column, a sub-query that returns a list of values, or a raw SQL expression that returns a list.\n *\n * ```ts\n * db.table.where({\n * column: {\n * in: ['a', 'b', 'c'],\n *\n * // WHERE \"column\" IN (SELECT \"column\" FROM \"otherTable\")\n * in: db.otherTable.select('column'),\n *\n * in: sql`('a', 'b')`,\n * },\n * });\n * ```\n *\n * `notIn` is for the `NOT IN` operator, and takes the same arguments as `in`\n *\n * ### Numeric, Date, and Time column operators\n *\n * To compare numbers, dates, and times.\n *\n * `lt` is for `<` (lower than)\n *\n * `lte` is for `<=` (lower than or equal)\n *\n * `gt` is for `>` (greater than)\n *\n * `gte` is for `>=` (greater than or equal)\n *\n * ```ts\n * db.table.where({\n * numericColumn: {\n * gt: 5,\n * lt: 10,\n * },\n *\n * date: {\n * lte: new Date(),\n * },\n *\n * time: {\n * gte: new Date(),\n * },\n * });\n * ```\n *\n * `between` also works with numeric, dates, and time columns, it takes an array of two elements.\n *\n * Both elements can be of the same type as a column, a sub-query, or a raw SQL expression.\n *\n * ```ts\n * db.table.where({\n * column: {\n * // simple values\n * between: [1, 10],\n *\n * // sub-query and raw SQL expression\n * between: [db.otherTable.select('column').take(), sql`2 + 2`],\n * },\n * });\n * ```\n *\n * ### Text column operators\n *\n * For `text`, `varchar`, `string`, and `json` columns.\n *\n * `json` is stored as text, so it has text operators. Use the `jsonb` type for JSON operators.\n *\n * Takes a string, or sub-query returning string, or raw SQL expression as well as other operators.\n *\n * ```ts\n * db.table.where({\n * textColumn: {\n * // WHERE \"textColumn\" LIKE '%string%'\n * contains: 'string',\n * // WHERE \"textColumn\" ILIKE '%string%'\n * containsInsensitive: 'string',\n * // WHERE \"textColumn\" LIKE 'string%'\n * startsWith: 'string',\n * // WHERE \"textColumn\" ILIKE 'string%'\n * startsWithInsensitive: 'string',\n * // WHERE \"textColumn\" LIKE '%string'\n * endsWith: 'string',\n * // WHERE \"textColumn\" ILIKE '%string'\n * endsWithInsensitive: 'string',\n * },\n * });\n * ```\n *\n * ### JSONB column operators\n *\n * JSON functions are available only for the `jsonb` column, note that the `json` type has text operators instead.\n *\n * You can use [jsonPathQueryFirst](/guide/json.html#jsonpathqueryfirst) to filter by a JSON value, follow the link for details.\n *\n * The value can be of any type, it can also be returned from a sub-query, raw SQL expression.\n *\n * ```ts\n * db.table.where((q) =>\n * q.get('jsonbColumn').jsonPathQueryFirst('$.name').equals(value),\n * );\n * ```\n *\n * `jsonSupersetOf`: check if the column value is a superset of provided value.\n *\n * For instance, it is true if the column has JSON `{ \"a\": 1, \"b\": 2 }` and provided value is `{ \"a\": 1 }`.\n *\n * Takes the value of any type, or sub query which returns a single value, or a raw SQL expression.\n *\n * ```ts\n * db.table.where({\n * jsonbColumn: {\n * jsonSupersetOf: { a: 1 },\n * },\n * });\n * ```\n *\n * `jsonSubsetOf`: check if the column value is a subset of provided value.\n *\n * For instance, it is true if the column has JSON `{ \"a\": 1 }` and provided value is `{ \"a\": 1, \"b\": 2 }`.\n *\n * Takes the value of any type, or sub query which returns a single value, or a raw SQL expression.\n *\n * ```ts\n * db.table.where({\n * jsonbColumn: {\n * jsonSubsetOf: { a: 1 },\n * },\n * });\n * ```\n *\n * @param args - {@link WhereArgs}\n */\n where<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): T & QueryHasWhere {\n return _queryWhere(_clone(this), args as never) as never;\n }\n\n /**\n * Use a custom SQL expression in `WHERE` statement:\n *\n * ```ts\n * db.table.whereSql`a = b`;\n * ```\n *\n * @param args - SQL expression\n */\n whereSql<T>(this: T, ...args: SQLQueryArgs): T & QueryHasWhere {\n return _queryWhereSql(_clone(this), args as never) as never;\n }\n\n /**\n * `whereNot` takes the same argument as `where`,\n * multiple conditions are combined with `AND`,\n * the whole group of conditions is negated with `NOT`.\n *\n * ```ts\n * // find records of different colors than red\n * db.table.whereNot({ color: 'red' });\n * // WHERE NOT color = 'red'\n * db.table.whereNot({ one: 1, two: 2 });\n * // WHERE NOT (one = 1 AND two = 2)\n * ```\n *\n * @param args - {@link WhereArgs}\n */\n whereNot<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereNotArgs<T>\n ): T & QueryHasWhere {\n return _queryWhereNot(_clone(this), args as never) as never;\n }\n\n /**\n * `whereNotSql` is a version of `whereNot` accepting SQL expression:\n *\n * ```ts\n * db.table.whereNotSql`sql expression`\n * ```\n *\n * @param args - SQL expression\n */\n whereNotSql<T>(this: T, ...args: SQLQueryArgs): T {\n return _queryWhereNotSql(_clone(this), args) as never;\n }\n\n /**\n * `whereOneOf` stands for \"...**and** where one of the given is true\".\n *\n * Accepts the same arguments as `where`.\n *\n * ```ts\n * db.table.where({ id: 1 }).whereOneOf({ color: 'red' }, { color: 'blue' });\n * ```\n *\n * ```sql\n * SELECT * FROM table\n * WHERE id = 1 AND (color = 'red' OR color = 'blue')\n * ```\n *\n * Note that columns inside every argument are joined with `AND`:\n *\n * ```ts\n * db.table.whereOneOf({ id: 1, color: 'red' }, { id: 2 });\n * ```\n *\n * ```sql\n * SELECT * FROM table\n * WHERE (id = 1 AND color = 'red') OR (id = 2)\n * ```\n *\n * @param args - same arguments as in {@link where}, joined with `OR`\n */\n whereOneOf<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): T & QueryHasWhere {\n return _queryWhereOneOf(_clone(this), args as never) as never;\n }\n\n /**\n * Negative {@link whereOneOf}:\n *\n * ```ts\n * db.table.where({ id: 1 }).whereNotOneOf({ color: 'red' }, { color: 'blue' });\n * ```\n *\n * ```sql\n * SELECT * FROM table\n * WHERE id = 1 AND NOT (color = 'red' OR color = 'blue')\n * ```\n *\n * @param args - same arguments as in {@link where}, joined with `OR`\n */\n whereNotOneOf<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): T {\n return _queryWhereNotOneOf(_clone(this), args as never) as never;\n }\n\n /**\n * `orWhere` stands for \"...**or** where one of the given is true\".\n *\n * Accepts the same arguments as `where`.\n *\n * ```ts\n * db.table.where({ id: 1, color: 'red' }).orWhere({ id: 2, color: 'blue' });\n * // equivalent:\n * db.table.orWhere({ id: 1, color: 'red' }, { id: 2, color: 'blue' });\n * ```\n *\n * ```sql\n * SELECT * FROM table\n * WHERE (id = 1 AND color = 'red') OR (id = 2 AND color = 'blue')\n * ```\n *\n * @param args - same arguments as in {@link where}, joined with `OR`\n */\n orWhere<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): T & QueryHasWhere {\n return _queryOr(_clone(this), args as never) as never;\n }\n\n /**\n * `orWhereNot` takes the same arguments as {@link orWhere}, and prepends each condition with `NOT` just as {@link whereNot} does.\n *\n * @param args - {@link WhereArgs} will be prefixed with `NOT` and joined with `OR`\n */\n orWhereNot<T extends PickQuerySelectableRelations>(\n this: T,\n ...args: WhereArgs<T>\n ): T & QueryHasWhere {\n return _queryOrNot(_clone(this), args as never) as never;\n }\n\n /**\n * `whereIn` and related methods are for the `IN` operator to check for inclusion in a list of values.\n *\n * When used with a single column it works equivalent to the `in` column operator:\n *\n * ```ts\n * db.table.whereIn('column', [1, 2, 3]);\n * db.table.whereIn('column', new Set([1, 2, 3]));\n * // the same as:\n * db.table.where({ column: { in: [1, 2, 3] } });\n * db.table.where({ column: { in: new Set([1, 2, 3]) } });\n * ```\n *\n * `whereIn` can support a tuple of columns, that's what the `in` operator cannot support:\n *\n * ```ts\n * db.table.whereIn(\n * ['id', 'name'],\n * [\n * [1, 'Alice'],\n * [2, 'Bob'],\n * ],\n * );\n * ```\n *\n * It supports sub query which should return records with columns of the same type:\n *\n * ```ts\n * db.table.whereIn(['id', 'name'], db.otherTable.select('id', 'name'));\n * ```\n *\n * It supports raw SQL expression:\n *\n * ```ts\n * db.table.whereIn(['id', 'name'], sql`((1, 'one'), (2, 'two'))`);\n * ```\n *\n * When empty set of values is given, `whereIn` will resolve into a {@link QueryMethods.none} query that has a special behavior.\n *\n * ```ts\n * // following queries resolves into `none`:\n * db.table.whereIn('id', [])\n * db.table.whereIn(['id', 'name'], [])\n * db.table.whereIn({ id: [] })\n * ```\n */\n whereIn<\n T extends PickQuerySelectableRelations,\n Column extends WhereInColumn<T>,\n >(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [arg: WhereInArg<T>]\n ): T & QueryHasWhere {\n return _queryWhereIn(_clone(this), true, args[0], args[1]) as never;\n }\n\n /**\n * Takes the same arguments as {@link whereIn}.\n * Add a `WHERE IN` condition prefixed with `OR` to the query:\n *\n * ```ts\n * db.table.whereIn('a', [1, 2, 3]).orWhereIn('b', ['one', 'two']);\n * ```\n */\n orWhereIn<\n T extends PickQuerySelectableRelations,\n Column extends WhereInColumn<T>,\n >(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [WhereInArg<T>]\n ): T & QueryHasWhere {\n return _queryWhereIn(_clone(this), false, args[0], args[1]) as never;\n }\n\n /**\n * Acts as `whereIn`, but negates the condition with `NOT`:\n *\n * ```ts\n * db.table.whereNotIn('color', ['red', 'green', 'blue']);\n * ```\n */\n whereNotIn<\n T extends PickQuerySelectableRelations,\n Column extends WhereInColumn<T>,\n >(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [arg: WhereInArg<T>]\n ): T & QueryHasWhere {\n return _queryWhereIn(_clone(this), true, args[0], args[1], true) as never;\n }\n\n /**\n * Acts as `whereIn`, but prepends `OR` to the condition and negates it with `NOT`:\n *\n * ```ts\n * db.table.whereNotIn('a', [1, 2, 3]).orWhereNoIn('b', ['one', 'two']);\n * ```\n */\n orWhereNotIn<\n T extends PickQuerySelectableRelations,\n Column extends WhereInColumn<T>,\n >(\n this: T,\n ...args:\n | [column: Column, values: WhereInValues<T, Column>]\n | [arg: WhereInArg<T>]\n ): T & QueryHasWhere {\n return _queryWhereIn(_clone(this), false, args[0], args[1], true) as never;\n }\n\n /**\n * `whereExists` is for support of the `WHERE EXISTS (query)` clause.\n *\n * This method is accepting the same arguments as `join`, see the {@link Join.join} section for more details.\n *\n * ```ts\n * // find users who have accounts\n * // find by a relation name if it's defined\n * db.user.whereExists('account');\n *\n * // find users who have an account with positive balance\n * // `accounts` is a relation name\n * db.user.whereExists((q) => q.accounts.where({ balance: { gt: 0 } }));\n *\n * // find using a table and a join conditions\n * db.user.whereExists(db.account, 'account.id', 'user.id');\n *\n * // find using a query builder in a callback:\n * db.user.whereExists(db.account, (q) => q.on('account.id', '=', 'user.id'));\n * ```\n */\n whereExists<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallbackArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Cb | JoinArgs<T, Arg>\n ): Arg extends QueryFnReturningSelect\n ? { error: 'Cannot select in whereExists' }\n : Cb[0] extends QueryFnReturningSelect\n ? { error: 'Cannot select in whereExists' }\n : T & QueryHasWhere {\n return _queryWhereExists(\n _clone(this) as unknown as T,\n arg,\n args as never,\n ) as never;\n }\n\n /**\n * Acts as `whereExists`, but prepends the condition with `OR`:\n *\n * ```ts\n * // find users who have an account or a profile,\n * // imagine that the user has both `account` and `profile` relations defined.\n * db.user.whereExist('account').orWhereExists('profile');\n * ```\n */\n orWhereExists<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n >(this: T, arg: Arg, ...args: JoinArgs<T, Arg>): T & QueryHasWhere {\n const q = _clone(this);\n return _queryOr(q, existsArgs(q, arg as never, args as never)) as never;\n }\n\n /**\n * Acts as `whereExists`, but negates the condition with `NOT`:\n *\n * ```ts\n * // find users who don't have an account,\n * // image that the user `belongsTo` or `hasOne` account.\n * db.user.whereNotExist('account');\n * ```\n *\n * @param arg - relation name, or a query object, or a `with` table alias, or a callback returning a query object.\n * @param args - no arguments needed when the first argument is a relation name, or conditions to join the table with.\n */\n whereNotExists<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n >(this: T, arg: Arg, ...args: JoinArgs<T, Arg>): T & QueryHasWhere {\n const q = _clone(this);\n return _queryWhereNotExists(q, arg, args);\n }\n\n /**\n * Acts as `whereExists`, but prepends the condition with `OR` and negates it with `NOT`:\n *\n * ```ts\n * // find users who don't have an account OR who don't have a profile\n * // imagine that the user has both `account` and `profile` relations defined.\n * db.user.whereNotExists('account').orWhereNotExists('profile');\n * ```\n */\n orWhereNotExists<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n >(this: T, arg: Arg, ...args: JoinArgs<T, Arg>): T & QueryHasWhere {\n const q = _clone(this);\n return _queryOrNot(q, existsArgs(q, arg as never, args as never)) as never;\n }\n}\n","import { IsQuery, Query } from '../../query';\nimport { _queryWhere } from '../../basic-features/where/where';\nimport { _queryAll } from '../../query.utils';\nimport { QueryData } from '../../query-data';\nimport { RelationConfigBase } from '../../relations';\nimport { _applyRelationAliases, getQueryAs } from '../../basic-features/as/as';\n\nexport const _chain = (\n fromQuery: IsQuery,\n toQuery: IsQuery,\n rel: RelationConfigBase,\n) => {\n const self = fromQuery as Query;\n const toTable = toQuery as Query;\n\n let query: Query;\n let q: QueryData;\n if (self.q.subQuery) {\n query = toTable;\n query.q.subQuery = 2;\n q = query.q as QueryData;\n\n // once there is a hasMany or hasAndBelongsToMany in the chain,\n // the following belongTo and hasOne must also return multiple\n if (\n // `select({ q => q.rel })`: on the first relation it doesn't matter if the parent has chainMultiple\n self.q.subQuery > 1 &&\n self.q.chainMultiple\n ) {\n q.returnType = q.returnsOne = q.limit = undefined;\n } else if (!((rel.query as Query).q as QueryData).returnsOne) {\n q.chainMultiple = true;\n }\n } else {\n // Relation query returns a single record in case of belongsTo or hasOne,\n // but when called as a query chain like `q.user.profile` it should return many.\n query = _queryWhere(_queryAll(toTable), [\n {\n EXISTS: { q: rel.reverseJoin(self, toTable) },\n },\n ]);\n\n q = query.q as QueryData;\n\n q.returnType = q.returnsOne = q.limit = undefined;\n }\n\n if (self.q.relChain) {\n q.relChain = [...self.q.relChain, { query: self, rel }];\n } else {\n q.relChain = [{ query: self, rel }];\n }\n\n _applyRelationAliases(self, q);\n\n q.joinedShapes = {\n [getQueryAs(self)]: self.q.selectShape,\n ...self.q.joinedShapes,\n };\n\n rel.modifyRelatedQuery?.(query)?.(self);\n\n return query;\n};\n","import type { Query } from '../../query';\nimport { _clone } from '../../basic-features/clone/clone';\nimport { _chain } from '../../extra-features/chain/chain';\nimport { _setSubQueryAliases } from '../../basic-features/as/as';\nimport { ToSQLQuery } from '../../sql/to-sql';\nimport { getClonedQueryData } from '../../query-data';\n\n/**\n * In `select`, `update`, `create` it's possible to pass a callback with a sub-query.\n * This function resolves such a sub-query.\n *\n * @param q - main query object to pass to a callback as argument\n * @param cb - sub-query callback\n */\nexport const resolveSubQueryCallback = (\n q: ToSQLQuery,\n cb: (q: ToSQLQuery) => ToSQLQuery,\n): ToSQLQuery => {\n let base;\n // `with` can pass a generic `qb` here, it has no table.\n // Do not memoize anything into `internal` of a common `qb`,\n // because it is common and will be re-used.\n if (q.table) {\n base = q.internal.callbackArg;\n if (!base) {\n base = Object.create(q.baseQuery) as Query;\n base.baseQuery = base;\n\n const { relations } = q;\n for (const key in relations) {\n Object.defineProperty(base, key, {\n get() {\n const rel = relations[key as string];\n const relQuery = _clone(rel.query);\n relQuery.q.withShapes = this.q.withShapes;\n return _chain(this, relQuery, rel);\n },\n });\n }\n\n q.internal.callbackArg = base;\n }\n } else {\n base = q;\n }\n\n const arg = Object.create(base);\n\n arg.q = getClonedQueryData(q.q);\n arg.q.subQuery = 1;\n // Deleting `with` because sub-query should duplicate WITH statements of the parent query in its SQL\n arg.q.with = arg.q.relChain = undefined;\n _setSubQueryAliases(arg);\n\n return cb(arg as Query);\n};\n","import {\n IsQuery,\n Query,\n QuerySelectable,\n SelectableFromShape,\n} from '../../query';\nimport { Column, setColumnData } from '../../../columns/column';\nimport { ColumnsShape } from '../../../columns';\nimport {\n PickQuerySelectableResultRelationsWithDataReturnType,\n PickQueryResultRelationsWithDataReturnTypeShape,\n PickQuerySelectableShapeRelationsWithDataAs,\n PickQueryQ,\n PickQueryRelationsWithData,\n PickQueryTable,\n PickQueryResultAs,\n PickQueryShapeAsRelations,\n PickQuerySelectable,\n PickQuerySelectableRelationsResultReturnType,\n PickQuerySelectableShape,\n PickQuerySelectableColumnTypes,\n PickQuerySelectableResultAs,\n PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n PickQuerySelectableShapeRelationsWithDataAsResultReturnType,\n PickQueryHasSelectResultShapeAsRelations,\n PickQuerySelectableRelations,\n PickQueryResultAsRelations,\n PickQueryRelations,\n} from '../../pick-query-types';\nimport {\n EmptyObject,\n EmptyTuple,\n pushOrNewArrayToObjectImmutable,\n setObjectValueImmutable,\n} from '../../../utils';\nimport { getQueryAs } from '../as/as';\nimport { Expression } from '../../expressions/expression';\nimport { _clone } from '../clone/clone';\nimport {\n prepareSubQueryForSql,\n SubQueryForSql,\n} from '../../internal-features/sub-query/sub-query-for-sql';\nimport { _queryNone, isQueryNone } from '../../extra-features/none/none';\nimport {\n addColumnParserToQuery,\n BatchParsers,\n ColumnsParsers,\n getQueryParsers,\n} from '../../query-columns/query-column-parsers';\nimport { preprocessJoinArg, processJoinArgs } from './process-join-args';\nimport { getIsJoinSubQuery } from '../../sql/get-is-join-sub-query';\nimport { getShapeFromSelect } from '../select/select.utils';\nimport { WithDataItem } from '../cte/cte.sql';\nimport {\n isRelationQuery,\n RelationConfigBase,\n RelationsBase,\n} from '../../relations';\nimport { ComputedColumns } from '../../extra-features/computed/computed';\nimport { throwIfJoinLateral } from '../../query.utils';\nimport { resolveSubQueryCallback } from '../../internal-features/sub-query/sub-query';\nimport { SelectAs, SelectAsValue, SelectItem } from '../select/select.sql';\nimport { JoinItemArgs } from './join.sql';\nimport { getSqlText } from '../../sql/sql';\nimport { JoinValueDedupItem, pushQueryValueImmutable } from '../../query-data';\nimport { ToSQLQuery } from '../../sql/to-sql';\nimport { QueryThenByQuery } from '../../then/then';\n\n// Type of column names of a `with` table, to use to join a `with` table by these columns.\n// Union of `with` column names that may be prefixed with a `with` table name.\ntype WithSelectable<W extends WithDataItem> =\n | keyof W['shape']\n | `${W['table']}.${keyof W['shape'] & string}`;\n\n/**\n * The first argument of all `join` and `joinLateral` methods.\n * See argument of {@link join}.\n */\nexport type JoinFirstArg<T extends PickQueryRelationsWithData> =\n | PickQueryResultAs\n | keyof T['relations']\n | keyof T['withData']\n | ((q: {\n [K in keyof T['relations']]: T['relations'][K]['query'];\n }) => PickQueryResultAs)\n | FnPickQueryResultAs;\n\ninterface FnPickQueryResultAs {\n (): PickQueryResultAs;\n}\n\n/**\n * Arguments of `join` methods (not `joinLateral`).\n * See {@link join}\n */\nexport type JoinArgs<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n> = Arg extends PickQueryResultAs\n ?\n // Available arguments when joining a query object. Can be:\n // - an object where keys are columns of the joined table and values are columns of the main table or a raw SQL.\n // - raw SQL expression\n // - `true` to join without conditions\n // - pair of columns, first is of the joined table, second is of main table\n // - string tuple of a column of a joined table, operator string such as '=' or '!=', and a column of the main table\n | [\n conditions:\n | {\n [K in JoinSelectable<Arg>]:\n | keyof T['__selectable']\n | Expression;\n }\n | Expression,\n ]\n | [\n leftColumn: JoinSelectable<Arg> | Expression,\n rightColumn: keyof T['__selectable'] | Expression,\n ]\n | [\n leftColumn: JoinSelectable<Arg> | Expression,\n op: string,\n rightColumn: keyof T['__selectable'] | Expression,\n ]\n : Arg extends keyof T['withData']\n ? JoinWithArgs<T, T['withData'][Arg]>\n : EmptyTuple;\n\n/**\n * Column names of the joined table that can be used to join.\n * Derived from 'result', not from 'shape',\n * because if the joined table has a specific selection, it will be wrapped like:\n * ```sql\n * JOIN (SELECT something FROM joined) joined ON joined.something = ...\n * ```\n * And the selection becomes available to use in the `ON` and to select from the joined table.\n */\ntype JoinSelectable<Q extends PickQueryResultAs> =\n | keyof Q['result']\n | `${Q['__as']}.${keyof Q['result'] & string}`;\n\n// Available arguments when joining a `with` table. Can be:\n// - an object where keys are columns of the `with` table and values are columns of the main table or a raw SQL\n// - raw SQL expression\n// - pair of columns, first is of the `with` table, second is of main table\n// - string tuple of a column of a `with` table, operator string such as '=' or '!=', and a column of the main table\ntype JoinWithArgs<T extends PickQuerySelectable, Arg extends WithDataItem> =\n | [\n conditions:\n | {\n [K in WithSelectable<Arg>]: keyof T['__selectable'] | Expression;\n }\n | Expression,\n ]\n | [\n leftColumn: WithSelectable<Arg> | Expression,\n rightColumn: keyof T['__selectable'] | Expression,\n ]\n | [\n leftColumn: WithSelectable<Arg> | Expression,\n op: string,\n rightColumn: keyof T['__selectable'] | Expression,\n ];\n\nexport type JoinResultRequireMain<\n T extends PickQuerySelectable,\n JoinedSelectable,\n> = {\n // is optimal\n [K in keyof T]: K extends '__selectable'\n ? T['__selectable'] & JoinedSelectable\n : T[K];\n};\n\n/**\n * Result of all `join` methods, not `joinLateral`.\n * Adds joined table columns from its 'result' to the '__selectable' of the query.\n */\nexport type JoinResult<\n T extends PickQuerySelectableRelationsResultReturnType,\n Joined extends PickQuerySelectableRelations,\n RequireMain,\n> = RequireMain extends true\n ? {\n // is optimal, same as JoinResultRequireMain above, inlined for fewer instantiations.\n [K in keyof T]: K extends '__selectable'\n ? T['__selectable'] & Joined['__selectable']\n : K extends 'relations'\n ? {\n [K in\n | keyof T['relations']\n | keyof Joined['relations']]: K extends keyof Joined['relations']\n ? Joined['relations'][K]\n : T['relations'][K];\n }\n : T[K];\n }\n : {\n [K in keyof T]: K extends '__selectable'\n ? {\n [K in keyof T['__selectable']]: {\n as: T['__selectable'][K]['as'];\n column: Column.QueryColumnToNullable<\n T['__selectable'][K]['column']\n >;\n };\n } & Joined['__selectable'] // & is optimal\n : K extends 'result'\n ? // nullable result: inlined for optimization\n {\n [K in keyof T['result']]: Column.QueryColumnToNullable<\n T['result'][K]\n >;\n }\n : K extends 'then'\n ? QueryThenByQuery<\n T,\n // nullable result: inlined for optimization\n {\n [K in keyof T['result']]: Column.QueryColumnToNullable<\n T['result'][K]\n >;\n }\n >\n : K extends 'relations'\n ? {\n [K in\n | keyof T['relations']\n | keyof Joined['relations']]: K extends keyof Joined['relations']\n ? Joined['relations'][K]\n : T['relations'][K];\n }\n : T[K];\n };\n\n/**\n * Calls {@link JoinResult} with either callback result, if join has a callback,\n * or with a query derived from the first join argument.\n */\nexport type JoinResultFromArgs<\n T extends PickQuerySelectableResultRelationsWithDataReturnType,\n Arg,\n Args extends unknown[],\n RequireJoined,\n RequireMain,\n> = JoinResult<\n T,\n // .join(db.table, () => query)\n Args[0] extends GenericJoinCallback\n ? JoinResultSelectable<\n ReturnType<Args[0]>['result'],\n ReturnType<Args[0]>['__as'],\n ReturnType<Args[0]>['relations'],\n RequireJoined\n >\n : // .join(db.table, ...)\n Arg extends PickQueryHasSelectResultShapeAsRelations\n ? JoinResultSelectable<\n Arg['__hasSelect'] extends true\n ? // If joined query has select, computed values won't be available, use `result` as is\n Arg['result']\n : // If no select, allow using computed values by setting result to shape\n Arg['shape'],\n Arg['__as'],\n Arg['relations'],\n RequireJoined\n >\n : // .join('rel-name')\n Arg extends keyof T['relations']\n ? JoinResultSelectable<\n T['relations'][Arg]['query']['shape'],\n T['relations'][Arg]['query']['__as'],\n T['relations'][Arg]['query']['relations'],\n RequireJoined\n >\n : // .join((q) => q.relation)\n // .join(() => db.table)\n Arg extends FirstArgCallback\n ? JoinResultSelectable<\n ReturnType<Arg>['shape'],\n ReturnType<Arg>['__as'],\n ReturnType<Arg>['relations'],\n RequireJoined\n >\n : // .join('cte-name')\n Arg extends keyof T['withData']\n ? T['withData'][Arg] extends WithDataItem\n ? JoinResultSelectable<\n T['withData'][Arg]['shape'],\n T['withData'][Arg]['table'],\n EmptyObject,\n RequireJoined\n >\n : never\n : never,\n RequireMain\n>;\n\ninterface GenericJoinCallback {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (...args: any[]): PickQueryResultAsRelations;\n}\ninterface FirstArgCallback {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (...args: any[]): PickQueryShapeAsRelations;\n}\n\n/**\n * Result of all `joinLateral` methods.\n * Adds joined table columns from its 'result' to the '__selectable' of the query.\n *\n * @param T - query type to join to\n * @param Arg - first arg of join, see {@link JoinFirstArg}\n * @param RequireJoined - when false, joined table shape will be mapped to make all columns optional\n */\nexport type JoinLateralResult<\n T extends PickQuerySelectable,\n As extends string,\n Result extends Column.QueryColumns,\n JoinedRelations extends RelationsBase,\n RequireJoined,\n> = JoinAddSelectable<\n T,\n JoinResultSelectable<Result, As, JoinedRelations, RequireJoined>\n>;\n\n/**\n * Build `selectable` type for joined table.\n *\n * When `RequireJoined` parameter is false,\n * the result type of the joined table will be mapped to make all columns optional.\n *\n * Callback may override the joined table alias.\n *\n * The resulting selectable receives all joined table columns prefixed with the table name or alias,\n * and a star prefixed with the table name or alias to select all joined columns.\n */\nexport type JoinResultSelectable<\n // Interestingly, accepting T and inlining T['result'] adds a LOT (~823k) instantiations\n Result extends Column.QueryColumns,\n As extends string,\n JoinedRelations,\n RequireJoined,\n> = RequireJoined extends true\n ? {\n __selectable: {\n [K in '*' | (keyof Result & string) as `${As}.${K}`]: K extends '*'\n ? {\n as: As;\n column: ColumnsShape.MapToObjectColumn<Result>;\n }\n : {\n as: K;\n column: Result[K];\n };\n };\n relations: {\n [K in keyof JoinedRelations &\n string as `${As}.${K}`]: JoinedRelations[K];\n };\n }\n : {\n __selectable: {\n [K in '*' | (keyof Result & string) as `${As}.${K}`]: K extends '*'\n ? {\n as: As;\n column: ColumnsShape.MapToNullableObjectColumn<Result>;\n }\n : {\n as: K;\n column: Column.QueryColumnToNullable<Result[K]>;\n };\n };\n relations: {\n [K in keyof JoinedRelations &\n string as `${As}.${K}`]: JoinedRelations[K];\n };\n };\n\n// Replace the '__selectable' of the query with the given selectable.\ntype JoinAddSelectable<\n T extends PickQuerySelectable,\n Joined extends PickQuerySelectableRelations,\n> = {\n // is optimal\n [K in keyof T]: K extends '__selectable'\n ? T['__selectable'] & Joined['__selectable']\n : T[K];\n};\n\n/**\n * Map the first argument of `join` or `joinLateral` to a query type.\n *\n * `with` table arg is mapped into `QueryBase`,\n * query arg is returned as is,\n * relation name is replaced with a relation table.\n */\nexport type JoinArgToQuery<\n T extends PickQueryRelationsWithData,\n Arg extends JoinFirstArg<T>,\n> = Arg extends keyof T['withData']\n ? T['withData'][Arg] extends WithDataItem\n ? /**\n * Map the `with` table first argument of `join` or `joinLateral` to a query type.\n * Constructs `selectable` based on `with` table shape.\n */\n {\n [K in 'result' | '__as' | keyof T]: K extends '__as'\n ? T['withData'][Arg]['table']\n : K extends '__selectable'\n ? {\n [K in keyof T['withData'][Arg]['shape'] &\n string as `${T['withData'][Arg]['table']}.${K}`]: {\n as: K;\n column: T['withData'][Arg]['shape'][K];\n };\n }\n : K extends 'result'\n ? T['withData'][Arg]['shape']\n : K extends keyof T\n ? T[K]\n : never;\n }\n : never\n : Arg extends PickQuerySelectableResultAs\n ? Arg\n : Arg extends keyof T['relations']\n ? T['relations'][Arg]['query']\n : Arg extends JoinArgToQueryCallback\n ? ReturnType<Arg>\n : never;\n\ninterface JoinArgToQueryCallback {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (...args: any[]): IsQuery;\n}\n\n/**\n * Type of the `join` callback (not `joinLateral`).\n *\n * Receives a query builder that can access columns of both the main and the joined table.\n *\n * The query builder is limited to `or` and `where` methods only.\n *\n * Callback must return a query builder.\n */\nexport interface JoinCallback<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n> {\n (q: JoinQueryBuilder<T, JoinArgToQuery<T, Arg>>): IsQuery;\n}\n\nexport type JoinCallbackArgs<\n T extends PickQuerySelectableShapeRelationsWithDataAs,\n Arg extends JoinFirstArg<T>,\n> = [cb?: JoinCallback<T, Arg> | true];\n\n/**\n * After getting a query from a sub-query callback,\n * join it to the main query in case it's a relation query.\n *\n * If it's not a relation query, it will be returned as is.\n *\n * @param q - main query object\n * @param sub - sub-query query object\n */\nexport const joinSubQuery = (q: ToSQLQuery, sub: ToSQLQuery): SubQueryForSql =>\n prepareSubQueryForSql(\n q as Query,\n (isRelationQuery(sub) ? sub.joinQuery(sub, q) : sub) as never,\n );\n\nexport const _joinReturningArgs = <\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n RequireJoined extends boolean,\n>(\n query: T,\n require: RequireJoined,\n first:\n | JoinFirstArg<never>\n // is used by `joinQueryChainHOF` in ORM\n | { _internalJoin: Query },\n args: JoinArgs<Query, JoinFirstArg<Query>>,\n forbidLateral?: boolean,\n): JoinItemArgs | undefined => {\n let joinKey: string | undefined;\n let joined: Query | undefined;\n let shape: Column.QueryColumns | undefined;\n let parsers: ColumnsParsers | undefined;\n let batchParsers: BatchParsers | undefined;\n let computeds: ComputedColumns | undefined;\n let joinSubQuery = false;\n let joinTo = query as unknown as Query;\n\n first = preprocessJoinArg(query, first as JoinFirstArg<never>) as Query;\n\n if (typeof first === 'object') {\n let isInternalJoin;\n if ('_internalJoin' in first) {\n isInternalJoin = true;\n first = first._internalJoin as JoinFirstArg<never>;\n }\n\n if (require && isQueryNone(first)) {\n return;\n }\n\n const q = first as Query;\n if (!isInternalJoin) {\n joinSubQuery = getIsJoinSubQuery(q);\n }\n\n joinKey = q.q.as || q.table;\n if (joinKey) {\n joined = q;\n shape = getShapeFromSelect(q, joinSubQuery && !!q.q.select);\n parsers = getQueryParsers(q);\n batchParsers = q.q.batchParsers;\n computeds = q.q.runtimeComputeds;\n\n if (joinSubQuery) {\n first = q.clone() as JoinFirstArg<Query>;\n (first as Query).shape = shape as never;\n }\n }\n } else {\n joinKey = first as string;\n\n const relation = query.relations[joinKey];\n if (relation) {\n joined = relation.query as Query;\n shape = getShapeFromSelect(relation.query as never);\n const r = prepareSubQueryForSql(query as never, relation.query as Query);\n parsers = getQueryParsers(r as unknown as Query);\n batchParsers = r.q.batchParsers;\n computeds = r.q.runtimeComputeds;\n } else {\n const i = joinKey.indexOf('.');\n if (i === -1) {\n const w = (query as unknown as PickQueryQ).q.withShapes?.[joinKey];\n shape = w?.shape;\n computeds = w?.computeds;\n // TODO batchParsers\n\n if (shape) {\n // clone the shape to mutate it below; in other cases the shape is newly created\n if (!require) shape = { ...shape };\n\n const arg = { parsers: {} as ColumnsParsers };\n for (const key in shape) {\n addColumnParserToQuery(arg, key, shape[key]);\n }\n }\n } else {\n const joinedRelKey = joinKey.slice(0, i);\n const joinedQuery = (query as unknown as PickQueryQ).q.joined?.[\n joinedRelKey\n ] as Query;\n joinTo = joinedQuery;\n joinKey = first = joinKey.slice(i + 1);\n const relation = joinedQuery.relations[first];\n joined = relation.query as Query;\n shape = getShapeFromSelect(relation.query as never);\n const r = prepareSubQueryForSql(\n query as never,\n relation.query as Query,\n );\n parsers = getQueryParsers(r as unknown as Query);\n batchParsers = r.q.batchParsers;\n computeds = r.q.runtimeComputeds;\n }\n }\n }\n\n const joinArgs = processJoinArgs(\n joinTo,\n first,\n args,\n joinSubQuery,\n shape,\n false,\n joinKey,\n forbidLateral,\n );\n\n if ('r' in joinArgs) {\n joinKey = getQueryAs(joinArgs.r as never);\n if (joined && joinKey !== getQueryAs(joined)) {\n joined = _clone(joined);\n joined.q.as = joinKey;\n }\n }\n\n if (require && 'r' in joinArgs && isQueryNone(joinArgs.r)) {\n return;\n } else if (joinKey && 's' in joinArgs && joinArgs.s) {\n const j = (\n 'j' in joinArgs\n ? (joinArgs.r ?? joinArgs.j)\n : 'r' in joinArgs\n ? joinArgs.r\n : joinArgs.q\n ) as Query;\n\n const jq = j.q;\n if (jq.select || !jq.selectAllColumns) {\n const { q } = query as unknown as PickQueryQ;\n\n // if 2nd argument callback is present, and it has select,\n // re-assign the columns shape from it.\n if ('r' in joinArgs && joinArgs.r) {\n joinArgs.c = shape = getShapeFromSelect(j, true);\n }\n\n if (joined) setObjectValueImmutable(q, 'joined', joinKey, joined);\n setObjectValueImmutable(q, 'joinedShapes', joinKey, shape);\n setObjectValueImmutable(q, 'joinedParsers', joinKey, getQueryParsers(j));\n\n if (jq.batchParsers) {\n setObjectValueImmutable(\n jq,\n 'joinedBatchParsers',\n joinKey,\n jq.batchParsers,\n );\n }\n\n setObjectValueImmutable(\n q,\n 'joinedComputeds',\n joinKey,\n jq.runtimeComputeds,\n );\n } else {\n addAllShapesAndParsers(\n query,\n joinKey,\n joined,\n shape,\n parsers,\n batchParsers,\n computeds,\n );\n }\n } else {\n addAllShapesAndParsers(\n query,\n joinKey,\n joined,\n shape,\n parsers,\n batchParsers,\n computeds,\n );\n }\n\n return joinArgs;\n};\n\nconst addAllShapesAndParsers = (\n query: unknown,\n joinKey?: string,\n joined?: PickQueryRelations,\n shape?: Column.QueryColumns,\n parsers?: ColumnsParsers,\n batchParsers?: BatchParsers,\n computeds?: ComputedColumns,\n) => {\n if (!joinKey) return;\n\n const { q } = query as PickQueryQ;\n\n if (joined) setObjectValueImmutable(q, 'joined', joinKey, joined);\n setObjectValueImmutable(q, 'joinedShapes', joinKey, shape);\n setObjectValueImmutable(q, 'joinedParsers', joinKey, parsers);\n\n if (batchParsers) {\n setObjectValueImmutable(q, 'joinedBatchParsers', joinKey, batchParsers);\n }\n\n setObjectValueImmutable(q, 'joinedComputeds', joinKey, computeds);\n};\n\n/**\n * Generic function to construct all JOIN queries.\n * Add a shape of the joined table into `joinedShapes`.\n * Add column parsers of the joined table into `joinedParsers`.\n * Add join data into `join` of the query data.\n *\n * @param query - query object to join to\n * @param require - true for INNER kind of JOIN\n * @param type - SQL of the JOIN kind: JOIN, LEFT JOIN, RIGHT JOIN, etc.\n * @param first - the first argument of join: join target\n * @param args - rest join arguments: columns to join with, or a callback\n */\nexport const _join = (\n query: PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n require: boolean,\n type: string,\n first:\n | JoinFirstArg<never>\n // is used by `joinQueryChainHOF` in ORM\n | { _internalJoin: Query },\n args: JoinArgs<Query, JoinFirstArg<Query>>,\n): never => {\n const joinArgs = _joinReturningArgs(query, require, first, args);\n if (!joinArgs) {\n return _queryNone(query) as never;\n }\n\n pushQueryValueImmutable(query as never, 'join', {\n type,\n args: joinArgs,\n });\n\n if ((query as unknown as PickQueryQ).q.type === 'delete') {\n throwIfJoinLateral(\n query as never,\n (query as unknown as PickQueryQ).q.type as string,\n );\n }\n\n return query as never;\n};\n\nexport const _joinLateralProcessArg = (\n q: Query,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n arg: JoinFirstArg<any>,\n cb: (\n q: JoinQueryBuilder<PickQuerySelectableShape, PickQuerySelectableResultAs>,\n ) => {\n table: string;\n result: Column.QueryColumns;\n },\n): Query => {\n let relation: RelationConfigBase | undefined;\n if (typeof arg === 'string') {\n relation = q.relations[arg];\n if (relation) {\n arg = _clone(relation.query);\n } else {\n const w = q.q.withShapes?.[arg];\n if (w) {\n const t = Object.create((q as unknown as Query).qb);\n t.table = arg;\n t.shape = w.shape;\n t.computeds = w.computeds;\n t.q = {\n ...t.q,\n shape: w.shape,\n };\n t.baseQuery = t;\n arg = t;\n }\n }\n }\n\n let result = resolveSubQueryCallback(\n arg as Query,\n cb as never,\n ) as unknown as Query;\n\n if (relation) {\n result = relation.joinQuery(\n result as unknown as Query,\n q as unknown as Query,\n ) as unknown as Query;\n }\n\n return result;\n};\n\n/**\n * Generic function to construct all JOIN LATERAL queries.\n * Adds a shape of the joined table into `joinedShapes`.\n * Adds column parsers of the joined table into `joinedParsers`.\n * Adds join data into `join` of the query data.\n *\n * @param self - query object to join to\n * @param type - SQL of the JOIN kind: JOIN or LEFT JOIN\n * @param joinQuery - join target: a query, or a relation name, or a `with` table name, or a callback returning a query.\n * @param as - alias of the joined table, it is set the join lateral happens when selecting a relation in `select`\n * @param innerJoinLateral - add `ON p.r IS NOT NULL` check to have INNER JOIN like experience when sub-selecting arrays.\n */\nexport const _joinLateral = (\n self: PickQueryResultRelationsWithDataReturnTypeShape,\n type: string,\n joinQuery: Query,\n as?: string,\n innerJoinLateral?: boolean,\n): string | undefined => {\n const query = self as Query;\n\n joinQuery = prepareSubQueryForSql(self as Query, joinQuery) as never;\n joinQuery.q.joinTo = query;\n\n as ||= getQueryAs(joinQuery);\n setObjectValueImmutable(\n query.q,\n 'joinedComputeds',\n as,\n joinQuery.q.runtimeComputeds,\n );\n\n const joinArgs = {\n l: joinQuery,\n a: as,\n i: innerJoinLateral,\n };\n\n const joinAs = (as || joinQuery.q.as || joinQuery.table) as string;\n\n const joinValue =\n joinQuery.q.returnType === 'value' ||\n joinQuery.q.returnType === 'valueOrThrow';\n\n let joinValueAs: string | undefined;\n let joinValueSelect: SelectItem | undefined;\n let existingValue: JoinValueDedupItem | undefined;\n\n if (joinValue) {\n const map = query.q.joinValueDedup\n ? new Map(query.q.joinValueDedup)\n : new Map<string, JoinValueDedupItem>();\n query.q.joinValueDedup = map;\n\n const select = joinQuery.q.select as SelectItem[];\n joinValueSelect = select[0];\n joinQuery.q.select = [];\n const dedupKey = getSqlText(joinQuery.toSQL());\n joinQuery.q.select = select;\n\n existingValue = map.get(dedupKey);\n if (existingValue) {\n joinValueAs = existingValue.a as string;\n } else {\n joinValueAs = joinAs;\n map.set(dedupKey, { q: joinQuery, a: as });\n }\n }\n\n if (!existingValue) {\n const joinedAs = getQueryAs(query);\n setObjectValueImmutable(\n joinQuery.q,\n 'joinedShapes',\n joinedAs,\n query.q.selectShape,\n );\n }\n\n const joinedShapeMayHaveNames =\n (joinQuery.table && joinQuery.q.joinedShapes?.[joinQuery.table]) ||\n joinQuery.q.joinedShapes?.[joinAs];\n\n // unname joined shape columns because the columns are aliased inside JOIN LATERAL\n let joinedShape: Column.QueryColumns | undefined;\n if (joinedShapeMayHaveNames) {\n joinedShape = {};\n for (const key in joinedShapeMayHaveNames) {\n const column = joinedShapeMayHaveNames[key];\n joinedShape[key] = column.data.name\n ? setColumnData(column as never, 'name', undefined as never)\n : column;\n }\n }\n\n const shape = joinedShape || getShapeFromSelect(joinQuery, true);\n\n setObjectValueImmutable(query.q, 'joinedShapes', joinAs, shape);\n\n if (joinValue) {\n setObjectValueImmutable(query.q, 'valuesJoinedAs', joinAs, joinValueAs);\n }\n\n setObjectValueImmutable(\n query.q,\n 'joinedParsers',\n joinValueAs || joinAs,\n getQueryParsers(joinQuery),\n );\n\n if (joinQuery.q.batchParsers) {\n setObjectValueImmutable(\n query.q,\n 'joinedBatchParsers',\n joinAs,\n joinQuery.q.batchParsers,\n );\n }\n\n if (joinValueAs) {\n if (existingValue) {\n existingValue.q.q.select = [\n {\n selectAs: {\n ...((existingValue.q.q.select![0] as SelectAs)\n .selectAs as SelectAsValue),\n [joinAs]: joinValueSelect as never,\n },\n },\n ];\n\n return joinValueAs;\n }\n\n joinQuery.q.select = [\n { selectAs: { [joinValueAs]: joinValueSelect as string } },\n ];\n }\n\n pushQueryValueImmutable(query, 'join', {\n type: `${type} LATERAL`,\n args: joinArgs,\n });\n\n return joinAs;\n};\n\nexport class QueryJoin {\n /**\n * ## Select relation\n *\n * Before joining a table, consider if selecting a relation is enough for your case:\n *\n * ```ts\n * // select users with profiles\n * // result type is Array<{ name: string, profile: Profile }>\n * await db.user.select('name', {\n * profile: (q) => q.profile,\n * });\n *\n * // select posts with counts of comments, filter and order by comments count\n * // result type is Array<Post & { commentsCount: number }>\n * await db.post\n * .select('*', {\n * commentsCount: (q) => q.comments.count(),\n * })\n * .where({ commentsCount: { gt: 10 } })\n * .order({ commentsCount: 'DESC' });\n *\n * // select authors with array of their book titles\n * // result type is Array<Author & { books: string[] }>\n * await db.author.select('*', {\n * books: (q) => q.books.pluck('title'),\n * });\n * ```\n *\n * Internally, such selects will use `LEFT JOIN LATERAL` to join a relation.\n * If you're loading users with profiles (one-to-one relation), and some users don't have a profile, `profile` property will have `NULL` for such users.\n * If you want to load only users that have profiles, and filter out the rest, add `.join()` method to the relation without arguments:\n *\n * ```ts\n * // load only users who have a profile\n * await db.user.select('*', {\n * profile: (q) => q.profile.join(),\n * });\n *\n * // load only users who have a specific profile\n * await db.user.select('*', {\n * profile: (q) => q.profile.join().where({ age: { gt: 20 } }),\n * });\n * ```\n *\n * You can also use this `.join()` method on the one-to-many relations, and records with empty array will be filtered out:\n *\n * ```ts\n * // posts that have no tags won't be loaded\n * // result type is Array<Post & { tags: Tag[] }>\n * db.post.select('*', {\n * tags: (q) => q.tags.join(),\n * });\n * ```\n *\n * # join\n *\n * `join` methods allows to join other tables, relations by name, [with](/guide/advanced-queries#with) statements, sub queries.\n *\n * All the `join` methods accept the same arguments, but returning type is different because with `join` it's guaranteed to load joined table, and with `leftJoin` the joined table columns may be `NULL` when no matching record was found.\n *\n * For the following examples, imagine you have a `User` table with `id` and `name`, and `Message` table with `id`, `text`, messages belongs to user via `userId` column:\n *\n * ```ts\n * export const UserTable = defineTable('user', (t) => ({\n * id: t.identity().primaryKey(),\n * name: t.text(),\n * })).relations((user) => ({\n * messages: user('id').hasMany(() => MessageTable('userId')),\n * }));\n *\n * export const MessageTable = defineTable('message', (t) => ({\n * id: t.identity().primaryKey(),\n * userId: t.integer(),\n * text: t.text(),\n * ...t.timestamps(),\n * })).relations((message) => ({\n * user: message('userId').belongsTo(() => UserTable('id')),\n * }));\n * ```\n *\n * `join` is a method for SQL `JOIN`, which is equivalent to `INNER JOIN`, `LEFT INNERT JOIN`.\n *\n * When no matching record is found, it will skip records of the main table.\n *\n * ### join relation\n *\n * When relations are defined between the tables, you can join them by a relation name.\n * Joined table can be references from `where` and `select` by a relation name.\n *\n * ```ts\n * const result = await db.user\n * .join('messages')\n * // after joining a table, you can use it in `where` conditions:\n * .where({ 'messages.text': { startsWith: 'Hi' } })\n * .select(\n * 'name', // name is User column, table name may be omitted\n * 'messages.text', // text is the Message column, and the table name is required\n * );\n *\n * // result has the following type:\n * const ok: { name: string; text: string }[] = result;\n * ```\n *\n * The first argument can also be a callback, where instead of relation name as a string you're picking it as a property of `q`.\n * In such a way, you can alias the relation with `as`, add `where` conditions, use other query methods.\n *\n * ```ts\n * const result = await db.user.join((q) =>\n * q.messages.as('m').where({ text: 'some text' }),\n * );\n * ```\n *\n * Optionally, you can pass a second callback argument, it makes `on` and `orOn` methods available.\n *\n * But remember that when joining a relation, the relevant `ON` conditions are already handled automatically.\n *\n * ```ts\n * const result = await db.user.join(\n * (q) => q.messages.as('m'),\n * (q) =>\n * q\n * .on('messages.text', 'user.name') // additionally, match message with user name\n * .where({ text: 'some text' }), // you can add `where` in a second callback as well.\n * );\n * ```\n *\n * ### join a relation of the joined\n *\n * After joining a relation or a table:\n *\n * ```ts\n * db.post.join('comments');\n *\n * db.post.join(() => db.comment);\n * ```\n *\n * You can join a relation of that joined table:\n *\n * ```ts\n * db.post.join('comments').join('comments.author');\n *\n * db.post.join(() => db.comment).join('comment.author');\n * ```\n *\n * Note that in the first case it's `comments` - a relation name, while in the second case it is a table name.\n *\n * ### joins deduplication\n *\n * When joining the same table with the same condition more than once, duplicated joins will be ignored:\n *\n * ```ts\n * // joining a relation\n * db.post.join('comments').join('comments');\n *\n * // joining a table with a condition\n * db.post\n * .join('comments', 'comments.postId', 'post.id')\n * .join('comments', 'comments.postId', 'post.id');\n * ```\n *\n * Both queries will produce SQL with only 1 join\n *\n * ```sql\n * SELECT * FROM post JOIN comments ON comments.postId = post.id\n * ```\n *\n * However, this is only possible if the join has no dynamic values:\n *\n * ```ts\n * db.post\n * .join('comments', (q) => q.where({ rating: { gt: 5 } }))\n * .join('comments', (q) => q.where({ rating: { gt: 5 } }));\n * ```\n *\n * Both joins above have the same `{ gt: 5 }`, but still, the `5` is a dynamic value and in this case joins will be duplicated,\n * resulting in a database error.\n *\n * ### select full joined records\n *\n * `select` supports selecting a full record of a previously joined table by passing a table name with `.*` at the end:\n *\n * ```ts\n * const result = await db.book.join('author').select('title', {\n * author: 'author.*',\n * });\n *\n * // result has the following type:\n * const ok: {\n * // title of the book\n * title: string;\n * // a full author record is included:\n * author: { id: number; name: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * It works fine for `1:1` (`belongsTo`, `hasOne`) relations, but it may have an unexpected result for `1:M` or `M:M` (`hasMany`, `hasAndBelongsToMany`) relations.\n * For any kind of relation, it results in one main table record with data of exactly one joined table record, i.e. when selecting in this way, the records **won't** be collected into arrays.\n *\n * ```ts\n * const result = await db.user\n * .join('messages')\n * .where({ 'messages.text': { startsWith: 'Hi' } })\n * .select('name', { messages: 'messages.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included:\n * messages: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * Because it's a one-to-many relation, one user has many messages, the user data will be duplicated for different messages data:\n *\n * | name | msg |\n * | ------ | ------------------------------ |\n * | user 1 | `{ id: 1, text: 'message 1' }` |\n * | user 1 | `{ id: 2, text: 'message 2' }` |\n * | user 1 | `{ id: 3, text: 'message 3' }` |\n *\n * ### join table\n *\n * If relation wasn't defined, provide a `db.table` instance and specify columns for the join.\n * Joined table can be references from `where` and `select` by a table name.\n *\n * ```ts\n * db.user\n * .join(db.message, 'userId', 'user.id')\n * .where({ 'message.text': { startsWith: 'Hi' } })\n * .select('name', 'message.text');\n * ```\n *\n * The name of the joining table can be omitted, but not the name of the main table:\n *\n * ```ts\n * db.user.join(db.message, 'userId', 'user.id');\n * ```\n *\n * Joined table can have an alias for referencing it further:\n *\n * ```ts\n * db.user\n * .join(db.message.as('m'), 'message.userId', 'user.id')\n * .where({ 'm.text': { startsWith: 'Hi' } })\n * .select('name', 'm.text');\n * ```\n *\n * Joined table can be selected as an object as well as the relation join above:\n *\n * ```ts\n * const result = await db.user\n * .join(db.message.as('m'), 'message.userId', 'user.id')\n * .where({ 'm.text': { startsWith: 'Hi' } })\n * .select('name', { msg: 'm.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included as msg:\n * msg: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * You can provide a custom comparison operator\n *\n * ```ts\n * db.user.join(db.message, 'userId', '!=', 'user.id');\n * ```\n *\n * Join can accept raw SQL for the `ON` part of join:\n *\n * ```ts\n * db.user.join(\n * db.message,\n * // `sql` can be imported from your table factory file\n * sql`lower(\"message\".\"text\") = lower(\"user\".\"name\")`,\n * );\n * ```\n *\n * Join can accept raw SQL instead of columns:\n *\n * ```ts\n * db.user.join(\n * db.message,\n * sql`lower(\"message\".\"text\")`,\n * sql`lower(\"user\".\"name\")`,\n * );\n *\n * // with operator:\n * db.user.join(\n * db.message,\n * sql`lower(\"message\".\"text\")`,\n * '!=',\n * sql`lower(\"user\".\"name\")`,\n * );\n * ```\n *\n * To join based on multiple columns, you can provide an object where keys are joining table columns, and values are main table columns or a raw SQL:\n *\n * ```ts\n * db.user.join(db.message, {\n * 'message.userId': 'user.id',\n *\n * // joined table name may be omitted\n * userId: 'user.id',\n *\n * // value can be a raw SQL expression:\n * text: sql`lower(\"user\".\"name\")`,\n * });\n * ```\n *\n * Join all records without conditions by providing `true`:\n *\n * ```ts\n * db.user.join(db.message, true);\n * ```\n *\n * Join methods can accept a callback with a special query builder that has `on` and `orOn` methods for handling advanced cases:\n *\n * ```ts\n * db.user.join(\n * db.message,\n * (q) =>\n * q\n * .on('message.userId', 'user.id')\n * // joined table name may be omitted\n * .on('userId', 'user.id')\n * // operator can be specified:\n * .on('userId', '!=', 'user.id')\n * // operator can be specified with table names as well:\n * .on('message.userId', '!=', 'user.id')\n * // `.orOn` takes the same arguments as `.on` and acts like `.or`:\n * .on('userId', 'user.id') // where message.userId = user.id\n * .orOn('text', 'user.name'), // or message.text = user.name\n * );\n * ```\n *\n * Column names in the where conditions are applied for the joined table, but you can specify a table name to add a condition for the main table.\n *\n * ```ts\n * db.user.join(db.message, (q) =>\n * q\n * .on('userId', 'user.id')\n * .where({\n * // not prefixed column name is for joined table:\n * text: { startsWith: 'hello' },\n * // specify a table name to set condition on the main table:\n * 'user.name': 'Bob',\n * })\n * // id is a column of a joined table Message\n * .whereIn('id', [1, 2, 3])\n * // condition for id of a user\n * .whereIn('user.id', [4, 5, 6]),\n * );\n * ```\n *\n * The query above will generate the following SQL (simplified):\n *\n * ```sql\n * SELECT * FROM \"user\"\n * JOIN \"message\"\n * ON \"message\".\"userId\" = \"user\".\"id\"\n * AND \"message\".\"text\" ILIKE 'hello%'\n * AND \"user\".\"name\" = 'Bob'\n * AND \"message\".\"id\" IN (1, 2, 3)\n * AND \"user\".\"id\" IN (4, 5, 6)\n * ```\n *\n * The join argument can be a query with `select`, `where`, and other methods. In such case, it will be handled as a sub query:\n *\n * ```ts\n * db.user.join(\n * db.message\n * .select('id', 'userId', 'text')\n * .where({ text: { startsWith: 'Hi' } })\n * .as('t'),\n * 'userId',\n * 'user.id',\n * );\n * ```\n *\n * It will produce such SQL:\n *\n * ```sql\n * SELECT * FROM \"user\"\n * JOIN (\n * SELECT \"t\".\"id\", \"t\".\"userId\", \"t\".\"text\"\n * FROM \"message\" AS \"t\"\n * ) \"t\" ON \"t\".\"userId\" = \"user\".\"id\"\n * ```\n *\n * ## implicit join lateral\n *\n * `JOIN`'s source expression that comes before `ON` cannot access other tables, but in some cases this may be needed.\n *\n * For example, let's consider joining last 10 messages of a user:\n *\n * ```ts\n * await db.user.join('messages', (q) => q.order({ createdAt: 'DESC' }).limit(10));\n * ```\n *\n * When the `join`'s callback returns a more complex query than the one that simply applies certain conditions,\n * it will implicitly generate a `JOIN LATERAL` SQL query, as the following:\n *\n * ```sql\n * SELECT *\n * FROM \"user\"\n * JOIN LATERAL (\n * SELECT *\n * FROM \"message\" AS \"messages\"\n * WHERE \"message\".\"userId\" = \"user\".\"id\"\n * ORDER BY \"message\".\"createdAt\" DESC\n * LIMIT 10\n * ) \"messages\" ON true\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n join<\n T extends PickQuerySelectableShapeRelationsWithDataAsResultReturnType,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallbackArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Cb | JoinArgs<T, Arg>\n ): JoinResultFromArgs<T, Arg, Cb, true, true> {\n return _join(\n _clone(this),\n true,\n 'JOIN',\n arg as never,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\n }\n\n /**\n * `leftJoin` is a method for SQL `LEFT JOIN`, which is equivalent to `OUTER JOIN`, `LEFT OUTER JOIN`.\n *\n * When no matching record is found, it will fill joined table columns with `NULL` values in the result rows.\n *\n * Works just like `join`, except for result type that may have `null`:\n *\n * ```ts\n * const result = await db.user\n * .leftJoin('messages')\n * .select('name', 'messages.text');\n *\n * // the same query, but joining table explicitly\n * const result2: typeof result = await db.user\n * .leftJoin(db.message, 'userId', 'user.id')\n * .select('name', 'message.text');\n *\n * // result has the following type:\n * const ok: { name: string; text: string | null }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n leftJoin<\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallbackArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Cb | JoinArgs<T, Arg>\n ): JoinResultFromArgs<T, Arg, Cb, false, true> {\n return _join(\n _clone(this),\n false,\n 'LEFT JOIN',\n arg as never,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\n }\n\n /**\n * `rightJoin` is a method for SQL `RIGHT JOIN`, which is equivalent to `RIGHT OUTER JOIN`.\n *\n * Takes the same arguments as `json`.\n *\n * It will load all records from the joining table, and fill the main table columns with `null` when no match is found.\n *\n * The columns of the table you're joining to are becoming nullable when using `rightJoin`.\n *\n * ```ts\n * const result = await db.user\n * .rightJoin('messages')\n * .select('name', 'messages.text');\n *\n * // even though name is not a nullable column, it becomes nullable after using rightJoin\n * const ok: { name: string | null; text: string }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n rightJoin<\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallbackArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Cb | JoinArgs<T, Arg>\n ): JoinResultFromArgs<T, Arg, Cb, true, false> {\n return _join(\n _clone(this),\n true,\n 'RIGHT JOIN',\n arg as never,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\n }\n\n /**\n * `fullJoin` is a method for SQL `FULL JOIN`, which is equivalent to `FULL OUTER JOIN`.\n *\n * Takes the same arguments as `json`.\n *\n * It will load all records from the joining table, both sides of the join may result in `null` values when there is no match.\n *\n * All columns become nullable after using `fullJoin`.\n *\n * ```ts\n * const result = await db.user\n * .rightJoin('messages')\n * .select('name', 'messages.text');\n *\n * // all columns can be null\n * const ok: { name: string | null; text: string | null }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param args - {@link JoinArgs}\n */\n fullJoin<\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n Arg extends JoinFirstArg<T>,\n Cb extends JoinCallbackArgs<T, Arg>,\n >(\n this: T,\n arg: Arg,\n ...args: Cb | JoinArgs<T, Arg>\n ): JoinResultFromArgs<T, Arg, Cb, false, false> {\n return _join(\n _clone(this),\n false,\n 'FULL JOIN',\n arg as never,\n args as any, // eslint-disable-line @typescript-eslint/no-explicit-any\n ) as never;\n }\n\n /**\n * `joinLateral` allows joining a table with a sub-query that can reference the main table of current query and the other joined tables.\n *\n * First argument is the other table you want to join, or a name of relation, or a name of `with` defined table.\n *\n * Second argument is a callback where you can reference other tables using `on` and `orOn`, select columns, do `where` conditions, and use any other query methods to build a sub-query.\n *\n * Note that the regular `join` will also generate `JOIN LATERAL` SQL expression when the query returned from callback is complex enough (see the bottom of {@link join} description).\n *\n * ```ts\n * // joinLateral messages relation, alias it as `m`\n * // without aliasing you can refer to the message by a table name\n * db.user\n * .joinLateral(db.message.as('m'), (q) =>\n * q\n * // select message columns\n * .select('text')\n * // join the message to the user, column names can be prefixed with table names\n * .on('authorId', 'user.id')\n * // message columns are available without prefixing,\n * // outer table columns are available with a table name\n * .where({ text: 'some text', 'user.name': 'name' })\n * .order({ createdAt: 'DESC' }),\n * )\n * // only selected message columns are available in select and where\n * .select('id', 'name', 'm.text')\n * .where({ 'm.text': messageData.text });\n * ```\n *\n * As well as simple `join`, `joinLateral` can select an object of full joined record:\n *\n * ```ts\n * // join by relation name\n * const result = await db.user\n * .joinLateral('messages', (q) => q.as('message')) // alias to 'message'\n * .select('name', { message: 'message.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included:\n * message: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * `message` can be aliased withing the `select` as well as in case of a simple `join`:\n *\n * ```ts\n * // join by relation name\n * const result = await db.user\n * .joinLateral('messages', (q) => q.as('message')) // alias to 'message'\n * .select('name', { msg: 'message.*' });\n *\n * // result has the following type:\n * const ok: {\n * name: string;\n * // full message is included as msg:\n * msg: { id: number; text: string; updatedAt: Date; createdAt: Date };\n * }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param cb - callback for shaping the joined query\n */\n joinLateral<\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n Arg extends JoinFirstArg<T>,\n As extends string,\n Result extends Column.QueryColumns,\n JoinedRelations extends RelationsBase,\n >(\n this: T,\n arg: Arg,\n cb: (q: JoinQueryBuilder<T, JoinArgToQuery<T, Arg>>) => {\n __as: As;\n result: Result;\n relations: JoinedRelations;\n },\n ): JoinLateralResult<T, As, Result, JoinedRelations, true> {\n const q = _clone(this);\n _joinLateral(\n q,\n 'JOIN',\n _joinLateralProcessArg(q, arg as never, cb as never),\n );\n return q as never;\n }\n\n /**\n * The same as {@link joinLateral}, but when no records found for the join it will result in `null`:\n *\n * ```ts\n * const result = await db.user\n * .leftJoinLateral('messages', (q) => q.as('message'))\n * .select('name', 'message.text');\n *\n * // result has the following type:\n * const ok: { name: string; text: string | null }[] = result;\n * ```\n *\n * @param arg - {@link JoinFirstArg}\n * @param cb - callback for shaping the joined query\n */\n leftJoinLateral<\n T extends PickQuerySelectableResultRelationsWithDataReturnTypeShapeAs,\n Arg extends JoinFirstArg<T>,\n As extends string,\n Result extends Column.QueryColumns,\n JoinedRelations extends RelationsBase,\n >(\n this: T,\n arg: Arg,\n cb: (q: JoinQueryBuilder<T, JoinArgToQuery<T, Arg>>) => {\n __as: As;\n result: Result;\n relations: JoinedRelations;\n },\n ): JoinLateralResult<T, As, Result, JoinedRelations, false> {\n const q = _clone(this);\n _joinLateral(\n q,\n 'LEFT JOIN',\n _joinLateralProcessArg(q, arg as never, cb as never),\n );\n return q as never;\n }\n\n /**\n * This method may be useful\n * for combining with [createForEachFrom](/guide/create-update-delete.html#createForEachFrom-insertForEachFrom).\n *\n * `createForEachFrom` creates multiple record based on a selecting query:\n *\n * ```sql\n * INSERT INTO t1(c1, c2)\n * SELECT c1, c2 FROM t2\n * ```\n *\n * Such a query inserts one record per one selected record.\n *\n * Use `joinData` to insert a multiplication of selected records and the provided data.\n *\n * ```ts\n * const data = [{ column2: 'one' }, { column2: 'two' }, { column2: 'three' }];\n *\n * await db.table.createForEachFrom(\n * db.otherTable\n * .joinData('data', (t) => ({ column2: t.text() }), data)\n * .select('otherTable.column1', 'data.column2'),\n * );\n * ```\n *\n * If the query on the other table returns 2 records,\n * and the data array contains 3 records, then 2 \\* 3 = 6 will be inserted - every combination.\n *\n * Joined data values are available in `where` just as usual.\n *\n * @param as - alias to reference joined columns\n * @param fn - declare column types\n * @param data - array of data to join\n */\n joinData<\n T extends PickQuerySelectableColumnTypes,\n As extends string,\n RecordType extends Column.QueryColumnsInit,\n Item extends ColumnsShape.Input<RecordType>,\n >(\n this: T,\n as: As,\n fn: (types: T['columnTypes']) => RecordType,\n data: Item[],\n ): {\n [K in keyof T]: K extends '__selectable'\n ? T['__selectable'] & {\n [K in keyof RecordType & string as `${As}.${K}`]: {\n as: K;\n column: RecordType[K];\n };\n }\n : T[K];\n } {\n const shape = fn(this.columnTypes);\n\n const query = _clone(this);\n\n const parsers = Object.fromEntries(\n Object.entries(shape).map(([key, column]) => [\n key,\n (column as Column)._parse,\n ]),\n );\n\n const { q } = query;\n setObjectValueImmutable(q, 'joinedShapes', as, shape);\n setObjectValueImmutable(q, 'joinedParsers', as, parsers);\n\n pushOrNewArrayToObjectImmutable(q, 'join', {\n type: 'JOIN',\n args: { a: as, c: shape, d: data },\n });\n\n return query as never;\n }\n}\n\n// Arguments of `on` and `orOn` methods inside `join` callback.\n// Takes a pair of columns to check them for equality, or a pair of columns separated with an operator such as '!='.\ntype OnArgs<S extends QuerySelectable> =\n | [leftColumn: keyof S, rightColumn: keyof S]\n | [leftColumn: keyof S, op: string, rightColumn: keyof S];\n\n// Construct an object for `ON` type of where condition.\nconst makeOnItem = (\n joinTo: PickQuerySelectable,\n joinFrom: PickQuerySelectable,\n args: OnArgs<QuerySelectable>,\n) => ({\n ON: {\n joinFrom,\n from: args[0],\n joinTo,\n to: args.length === 2 ? args[1] : args[2],\n op: args.length === 2 ? undefined : args[1],\n },\n});\n\n// Add `ON` statement.\nexport const pushQueryOnForOuter = <T extends PickQuerySelectable>(\n q: T,\n joinFrom: PickQuerySelectable,\n joinTo: PickQuerySelectable,\n leftColumn: string,\n rightColumn: string,\n): T => {\n return pushQueryValueImmutable(q as never, 'and', {\n ON: {\n joinFrom: joinTo,\n from: leftColumn,\n joinTo: joinFrom,\n to: rightColumn,\n useOuterAliases: true,\n },\n }) as never;\n};\n\n// Add `ON` statement.\nexport const pushQueryOn = <T extends PickQuerySelectable>(\n q: T,\n joinFrom: PickQuerySelectable,\n joinTo: PickQuerySelectable,\n ...on: OnArgs<QuerySelectable>\n): T => {\n return pushQueryValueImmutable(\n q as never,\n 'and',\n makeOnItem(joinFrom, joinTo, on),\n ) as never;\n};\n\n// Add `ON` statement separated from previous statements with `OR`.\nexport const pushQueryOrOn = <T extends PickQuerySelectable>(\n q: T,\n joinFrom: PickQuerySelectable,\n joinTo: PickQuerySelectable,\n ...on: OnArgs<QuerySelectable>\n) => {\n return pushQueryValueImmutable(q as never, 'or', [\n makeOnItem(joinFrom, joinTo, on),\n ]);\n};\n\n// Used by the ORM to join relations.\n// Adds a shape of relation to the `joinedShapes`, and adds an `on` statement.\nexport const addQueryOn = <T extends PickQuerySelectable>(\n query: T,\n joinFrom: PickQuerySelectable,\n joinTo: PickQuerySelectable,\n ...args: OnArgs<QuerySelectable>\n): T => {\n const cloned = _clone(query);\n\n const { q } = cloned;\n\n setObjectValueImmutable(\n q,\n 'joinedShapes',\n ((joinFrom as unknown as PickQueryQ).q.as ||\n (joinFrom as PickQueryTable).table) as string,\n (joinFrom as unknown as PickQueryQ).q.selectShape,\n );\n\n return pushQueryOn(cloned, joinFrom, joinTo, ...args) as never;\n};\n\n// To join record based on a value inside their json columns\ntype OnJsonPathEqualsArgs<S extends QuerySelectable> = [\n leftColumn: keyof S,\n leftPath: string,\n rightColumn: keyof S,\n rightPath: string,\n];\n\n/**\n * Mutative {@link OnMethods.prototype.on}\n */\nexport const _queryJoinOn = <T extends PickQuerySelectable>(\n q: T,\n args: OnArgs<T['__selectable']>,\n): T => {\n return pushQueryOn(\n q,\n (q as unknown as PickQueryQ).q.joinTo as unknown as PickQuerySelectable,\n q,\n ...args,\n );\n};\n\n/**\n * Mutative {@link OnMethods.prototype.orOn}\n */\nexport const _queryJoinOrOn = <T extends PickQuerySelectable>(\n q: T,\n args: OnArgs<T['__selectable']>,\n): T => {\n return pushQueryOrOn(\n q,\n (q as unknown as PickQueryQ).q.joinTo as unknown as PickQuerySelectable,\n q,\n ...args,\n ) as unknown as T;\n};\n\n/**\n * Mutative {@link OnMethods.prototype.onJsonPathEquals}\n */\nexport const _queryJoinOnJsonPathEquals = <T extends PickQuerySelectable>(\n q: T,\n args: OnJsonPathEqualsArgs<T['__selectable']>,\n): T => {\n return pushQueryValueImmutable(q as never, 'and', {\n ON: args,\n }) as unknown as T;\n};\n\n/**\n * Argument of join callback.\n * It is a query object of table that you're joining, with ability to select main table's columns.\n * Adds {@link OnMethods.prototype.on} method and similar to the query.\n */\nexport type JoinQueryBuilder<\n T extends PickQuerySelectableShape,\n J extends PickQuerySelectableResultAs,\n> = {\n [K in keyof J | keyof OnMethods]: K extends '__selectable'\n ? SelectableFromShape<J['result'], J['__as']> &\n Omit<T['__selectable'], keyof T['shape']>\n : K extends keyof OnMethods\n ? OnMethods[K]\n : K extends keyof J\n ? J[K]\n : never;\n};\n\nexport class OnMethods {\n /**\n * Use `on` to specify columns to join records.\n *\n * ```ts\n * q\n * .on('message.userId', 'user.id')\n * // joined table name may be omitted\n * .on('userId', 'user.id')\n * // operator can be specified:\n * .on('userId', '!=', 'user.id')\n * // operator can be specified with table names as well:\n * .on('message.userId', '!=', 'user.id')\n * ```\n *\n * @param args - columns to join with\n */\n on<T extends PickQuerySelectable>(\n this: T,\n ...args: OnArgs<T['__selectable']>\n ): T {\n return _queryJoinOn(_clone(this) as never, args);\n }\n\n /**\n * Works as {@link on}, but the added conditions will be separated from previous with `OR`.\n *\n * @param args - columns to join with\n */\n orOn<T extends PickQuerySelectable>(\n this: T,\n ...args: OnArgs<T['__selectable']>\n ): T {\n return _queryJoinOrOn(_clone(this) as never, args);\n }\n\n /**\n * Use `onJsonPathEquals` to join record based on a field of their JSON column:\n *\n * ```ts\n * db.table.join(db.otherTable, (q) =>\n * // '$.key' is a JSON path\n * q.onJsonPathEquals('otherTable.data', '$.key', 'table.data', '$.key'),\n * );\n * ```\n *\n * @param args - columns and JSON paths to join with.\n */\n onJsonPathEquals<T extends PickQuerySelectable>(\n this: T,\n ...args: OnJsonPathEqualsArgs<T['__selectable']>\n ): T {\n return _queryJoinOnJsonPathEquals(_clone(this) as never, args);\n }\n}\n","import { Column } from '../../../columns/column';\nimport { HookPurpose } from '../../extra-features/hooks/hooks.sql';\nimport { IsQuery, Query } from '../../query';\nimport { QueryAfterHook } from '../../query-data';\n\nexport interface HasCteHooks {\n cteHooks?: CteHooks;\n}\n\nexport interface CteHooks {\n hasSelect?: boolean;\n tableHooks?: CteTableHooks;\n ensureCount?: EnsureCount;\n}\n\nexport interface EnsureCount {\n [cteName: string]: EnsureCountItem;\n}\n\nexport type EnsureCountItem =\n | {\n count: number;\n }\n | {\n jsonNotNull: string;\n };\n\nexport interface CteTableHooks {\n [K: string]: CteTableHook;\n}\n\nexport interface CteTableHook {\n table: string;\n shape: Column.Shape.Data;\n tableHook: TableHook;\n throwOnNotFound?: boolean;\n}\n\nexport interface TableHook {\n hookPurpose?: HookPurpose;\n select?: HookSelect;\n afterCreate?: QueryAfterHook[];\n afterUpdate?: QueryAfterHook[];\n afterSave?: QueryAfterHook[];\n afterDelete?: QueryAfterHook[];\n afterCreateCommit?: QueryAfterHook[];\n afterUpdateCommit?: QueryAfterHook[];\n afterSaveCommit?: QueryAfterHook[];\n afterDeleteCommit?: QueryAfterHook[];\n}\n\nexport type HookSelect = Map<string, HookSelectValue>;\n\nexport interface HookSelectValue {\n select: string | { sql: string };\n as?: string;\n temp?: string;\n onAs?: ((as: string) => void)[];\n notLoaded?: boolean;\n}\n\nexport interface HasTableHook {\n tableHook?: TableHook;\n}\n\nexport interface HasHookSelect {\n // additional columns to select for `after` hooks\n hookSelect?: HookSelect;\n}\n\nexport const _addToHookSelect = (\n query: IsQuery,\n selects: string[],\n notLoaded?: boolean,\n) => {\n const { q } = query as Query;\n const map: HookSelect = (q.hookSelect = new Map(q.hookSelect));\n for (const key of selects) {\n const item = map.get(key) || { select: key };\n map.set(key, notLoaded ? { ...item, notLoaded } : item);\n }\n};\n\nexport const _addToHookSelectWithTable = (\n query: IsQuery,\n selects: string[],\n table: string,\n) => {\n const { q } = query as Query;\n const map: HookSelect = (q.hookSelect = new Map(q.hookSelect));\n for (const column of selects) {\n map.set(column, { select: `${table}.${column}` });\n }\n};\n","import { QueryData } from '../../query-data';\n\nexport const setSelectRelation = (q: QueryData) => {\n q.selectRelation = true;\n};\n","import {\n addParserForRawExpression,\n BatchParser,\n BatchParserPathEntry,\n getQueryParsers,\n getValueParser,\n setParserToQuery,\n} from '../../query-columns/query-column-parsers';\nimport { parseRecord } from '../../then/then';\nimport {\n RecordString,\n RecordUnknown,\n setObjectValueImmutable,\n spreadObjectValues,\n} from '../../../utils';\nimport {\n Column,\n internalSchemaConfig,\n JSONTextColumn,\n setColumnData,\n UnknownColumn,\n} from '../../../columns';\nimport { processComputedBatches } from '../../extra-features/computed/computed';\nimport { isQueryNone } from '../../extra-features/none/none';\nimport { cloneQueryBaseUnscoped } from '../wrap/wrap';\nimport { prepareSubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { RawSql } from '../../expressions/raw-sql';\nimport { SelectArg, SelectAsArg, SelectSelf } from './select';\nimport { _joinLateral } from '../join/join';\nimport {\n PickQueryQ,\n PickQueryQAndInternal,\n PickQuerySelectable,\n} from '../../pick-query-types';\nimport {\n Expression,\n isExpression,\n SelectableOrExpression,\n} from '../../expressions/expression';\nimport { getFullColumnTable, pushQueryArrayImmutable } from '../../query.utils';\nimport { IsQuery, Query, QueryReturnType } from '../../query';\nimport { NotFoundError } from '../../errors';\nimport { finalizeNestedHookSelect } from '../../extra-features/hooks/hooks';\nimport { applyBatchTransforms } from '../../extra-features/data-transform/transform';\nimport { resolveSubQueryCallback } from '../../internal-features/sub-query/sub-query';\nimport { isRelationQuery } from '../../relations';\nimport { _copyQueryAliasToQuery } from '../as/as';\nimport { _addToHookSelect, _addToHookSelectWithTable } from './hook-select';\nimport { SelectAsValue, SelectItem } from './select.sql';\nimport { pushQueryValueImmutable, QueryData } from '../../query-data';\nimport { ToSQLQuery } from '../../sql/to-sql';\nimport { setSelectRelation } from '../../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.qb';\nimport { _getSelectableColumn } from '../get/get.utils';\n\n// Add parsers when selecting a full joined table by name or alias.\n// It always selects a single record, not array, it's documented.\nconst addParsersForSelectJoinedWildcard = (\n q: PickQueryQ,\n arg: string,\n as: string = arg,\n) => {\n const parsers = q.q.joinedParsers?.[arg];\n if (parsers) {\n setParserToQuery(q.q, as, (row) => parseRecord(parsers, row));\n }\n\n const batchParsers = q.q.joinedBatchParsers?.[arg];\n if (batchParsers) {\n pushQueryArrayImmutable(\n q,\n 'batchParsers',\n batchParsers.map((x) => ({\n path: [{ key: as as string, returnType: 'one' }, ...x.path],\n fn: x.fn,\n })),\n );\n }\n};\n\nexport interface QueryBatchResult {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n data: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parent: any;\n key: PropertyKey;\n}\n\n// add parser for a single key-value pair of selected object\nexport const addParserForSelectItem = <T extends PickQuerySelectable>(\n query: T,\n as: string | undefined,\n key: string,\n arg: SelectableOrExpression<T> | Query,\n columnAlias?: string,\n joinQuery?: boolean,\n): string | Expression | Query | undefined => {\n if (typeof arg === 'object') {\n const { q } = arg as Query;\n\n if (q.batchParsers) {\n pushQueryArrayImmutable(\n query as unknown as Query,\n 'batchParsers',\n q.batchParsers.map((bp) => ({\n path: [{ key, returnType: q.returnType }, ...bp.path],\n fn: bp.fn,\n })),\n );\n }\n\n const parsers = isExpression(arg)\n ? undefined\n : getQueryParsers(arg as Query);\n\n if (\n parsers ||\n q.hookSelect ||\n q.transform ||\n q.returnType === 'oneOrThrow' ||\n q.returnType === 'valueOrThrow' ||\n q.returnType === 'one' ||\n q.returnType === 'value'\n ) {\n pushQueryValueImmutable(query as unknown as Query, 'batchParsers', {\n path: [{ key, returnType: q.returnType }],\n fn: (path, queryResult) => {\n const { rows } = queryResult;\n const originalReturnType = q.returnType || 'all';\n let returnType = originalReturnType;\n const { hookSelect } = q;\n const batches: QueryBatchResult[] = [];\n\n if (returnType === 'value' || returnType === 'valueOrThrow') {\n if (hookSelect) {\n batches.push = (item) => {\n // if the item has no key, it means value return was implicitly turned into 'one' return,\n // happens when getting a computed column\n if (!(key in item)) {\n returnType = returnType === 'value' ? 'one' : 'oneOrThrow';\n }\n batches.push = Array.prototype.push;\n return batches.push(item);\n };\n }\n }\n\n collectNestedSelectBatches(batches, rows, path);\n\n switch (returnType) {\n case 'all': {\n if (parsers) {\n for (const { data } of batches) {\n for (const one of data) {\n parseRecord(parsers, one);\n }\n }\n }\n break;\n }\n case 'one':\n case 'oneOrThrow': {\n if (parsers) {\n if (returnType === 'one') {\n for (const batch of batches) {\n if (batch.data) parseRecord(parsers, batch.data);\n else batch.parent[batch.key] = batch.data = undefined; // null to undefined\n }\n } else {\n for (const { data } of batches) {\n if (!data) throw new NotFoundError(arg as Query);\n parseRecord(parsers, data);\n }\n }\n } else if (returnType === 'one') {\n for (const batch of batches) {\n if (!batch.data)\n batch.parent[batch.key] = batch.data = undefined; // null to undefined\n }\n } else {\n for (const { data } of batches) {\n if (!data) throw new NotFoundError(arg as Query);\n }\n }\n\n if (hookSelect) {\n for (const batch of batches) {\n batch.data = [batch.data];\n }\n }\n\n break;\n }\n case 'pluck': {\n const parse = parsers?.pluck;\n if (parse) {\n for (const { data } of batches) {\n for (let i = 0; i < data.length; i++) {\n (data as unknown as RecordUnknown)[i] = parse(data[i]);\n }\n }\n }\n\n // not transforming data for hookSelect because it's set to load 'all' elsewhere for this case\n\n break;\n }\n case 'value':\n case 'valueOrThrow': {\n const data = (q.getColumn as Column.Pick.Data | undefined)?.data;\n const notNullable = !data?.isNullable;\n const valueToArray = data?.valueToArray;\n\n const parse = getValueParser(parsers);\n if (parse) {\n if (returnType === 'value') {\n if (valueToArray) {\n for (const item of batches) {\n item.parent[item.key] = item.data = item.data\n ? item.data[0] === null\n ? null\n : parse(item.data[0])\n : q.notFoundDefault;\n }\n } else {\n for (const item of batches) {\n item.parent[item.key] = item.data =\n item.data === null\n ? q.notFoundDefault\n : parse(item.data);\n }\n }\n } else {\n if (valueToArray) {\n for (const item of batches) {\n if (!item.data) {\n throw new NotFoundError(arg as Query);\n }\n\n item.parent[item.key] = item.data =\n item.data[0] === null ? null : parse(item.data[0]);\n }\n } else {\n for (const item of batches) {\n if (notNullable && item.data === null) {\n throw new NotFoundError(arg as Query);\n }\n\n item.parent[item.key] = item.data = parse(item.data);\n }\n }\n }\n } else if (returnType === 'value') {\n if (valueToArray) {\n for (const item of batches) {\n item.parent[item.key] = item.data = item.data\n ? item.data[0]\n : q.notFoundDefault;\n }\n } else {\n for (const item of batches) {\n if (item.data === undefined) {\n item.parent[item.key] = item.data = q.notFoundDefault;\n }\n }\n }\n } else if (valueToArray) {\n for (const item of batches) {\n if (!item.data) {\n throw new NotFoundError(arg as Query);\n }\n item.parent[item.key] = item.data = item.data[0];\n }\n } else if (notNullable) {\n for (const { data } of batches) {\n if (data === null) {\n throw new NotFoundError(arg as Query);\n }\n }\n }\n\n if (hookSelect) {\n for (const batch of batches) {\n batch.data = [batch.data];\n }\n }\n\n break;\n }\n }\n\n if (hookSelect) {\n let tempColumns: Set<string> | undefined;\n let renames: RecordString | undefined;\n for (const column of hookSelect.keys()) {\n const select = hookSelect!.get(column)!;\n\n if (select.as) (renames ??= {})[column] = select.as;\n\n if (select.temp) {\n (tempColumns ??= new Set())?.add(select.as || column);\n }\n }\n\n if (renames) {\n for (const { data } of batches) {\n for (const record of data) {\n if (record) {\n for (const a in renames) {\n const value = record[renames[a]];\n record[renames[a]] = record[a];\n record[a] = value;\n }\n }\n }\n }\n }\n\n if (q.selectedComputeds) {\n const maybePromise = processComputedBatches(\n q,\n batches,\n originalReturnType,\n returnType,\n tempColumns,\n renames,\n key,\n );\n if (maybePromise) return maybePromise;\n }\n\n finalizeNestedHookSelect(\n batches,\n originalReturnType,\n tempColumns,\n renames,\n key,\n );\n }\n\n applyBatchTransforms(q, batches);\n return;\n },\n } as BatchParser);\n }\n\n if (!joinQuery && (arg as Query).q?.subQuery && arg.q.expr) {\n arg = arg.q.expr;\n }\n\n if (isExpression(arg)) {\n addParserForRawExpression(query as never, key, arg);\n return arg;\n }\n\n return arg;\n }\n\n const joinedAs = (query as unknown as Query).q.valuesJoinedAs?.[\n arg as string\n ];\n return setParserForSelectedString(\n query as never,\n joinedAs ? joinedAs + '.' + (arg as string) : (arg as string),\n as,\n key,\n columnAlias,\n );\n};\n\nconst collectNestedSelectBatches = (\n batches: QueryBatchResult[],\n rows: unknown[],\n path: BatchParserPathEntry[],\n) => {\n const last = path.length - 1;\n const { key, returnType } = path[0];\n\n for (const row of rows) {\n processNestedSelectPathEntry(batches, path, key, returnType, 0, last, row);\n }\n};\n\nconst processNestedSelectPathEntry = (\n batches: QueryBatchResult[],\n path: BatchParserPathEntry[],\n thisKey: string,\n thisReturnType: QueryReturnType,\n i: number,\n last: number,\n parent: unknown,\n) => {\n const data = (parent as RecordUnknown)[thisKey];\n if (i === last) {\n batches.push({\n data,\n parent,\n key: thisKey,\n });\n } else {\n // Optional single relations can be null, don't descend into nested paths.\n if (!data) return;\n\n const { key, returnType } = path[++i];\n if (!thisReturnType || thisReturnType === 'all') {\n for (const row of data as unknown[]) {\n processNestedSelectPathEntry(\n batches,\n path,\n key,\n returnType,\n i,\n last,\n row,\n );\n }\n } else {\n processNestedSelectPathEntry(\n batches,\n path,\n key,\n returnType,\n i,\n last,\n data,\n );\n }\n }\n};\n\n// reuse SQL for empty array for JSON agg expressions\nconst emptyArrSQL = new RawSql(\"'[]'\");\n\n// process select argument: add parsers, join relations when needed\nexport const processSelectArg = <T extends SelectSelf>(\n q: T,\n as: string | undefined,\n arg: SelectArg<T>,\n columnAs?: string,\n): SelectItem | undefined | false => {\n const query = q as unknown as Query;\n if (typeof arg === 'string') {\n return setParserForSelectedString(query, arg, as, columnAs);\n }\n\n const selectAs: SelectAsValue = {};\n const selectShape = (query.q.selectShape = { ...query.q.selectShape });\n\n for (const key in arg as unknown as SelectAsArg<T>) {\n const item = processSelectAsArg(\n q,\n selectAs,\n as,\n key,\n (arg as unknown as SelectAsArg<T>)[key],\n key,\n );\n if (item) {\n selectShape[key] = item;\n } else if (item === false) {\n // propagate `none` state of a joined sub-query\n return false;\n }\n }\n\n return { selectAs };\n};\n\nexport const processSelectAsArg = <T extends SelectSelf>(\n q: T,\n selectAs: SelectAsValue,\n as: string | undefined,\n key: string,\n arg: SelectAsArg<T>[string],\n columnAlias?: string,\n outerReturnType?: QueryReturnType,\n): Column | undefined | false => {\n const query = q as unknown as Query;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let value = arg as any;\n let joinQuery: boolean | undefined;\n let column: Column | undefined;\n\n if (typeof value === 'function') {\n value = resolveSubQueryCallback(q as unknown as ToSQLQuery, value);\n\n if (isQueryNone(value)) {\n if (value.q.innerJoinLateral) {\n return false;\n }\n }\n\n if (isExpression(value)) {\n column = value.result.value as Column;\n } else {\n // `subQuery = 1` case is when callback returns the same query as it gets,\n // for example `q => q.get('name')`.\n const isSelfReferencingQuery =\n (value as unknown as Query).q.subQuery === 1;\n\n if (isRelationQuery(value) && !isSelfReferencingQuery) {\n joinQuery = true;\n setSelectRelation(query.q);\n\n value = value.joinQuery(value, q as unknown as IsQuery);\n\n let subQuery;\n const { returnType, innerJoinLateral } = value.q;\n if (!returnType || returnType === 'all') {\n subQuery = value.json(false);\n\n // no need to coalesce in case of inner lateral join.\n if (!innerJoinLateral) {\n value.q.coalesceValue = emptyArrSQL;\n }\n } else if (returnType === 'pluck') {\n // no select in case of plucking a computed\n subQuery = value.q.select\n ? value\n .wrap(cloneQueryBaseUnscoped(value))\n .jsonAgg(value.q.select[0])\n : value.json(false);\n\n value.q.coalesceValue = emptyArrSQL;\n } else {\n if (returnType === 'value' || returnType === 'valueOrThrow') {\n if (value.q.select) {\n // todo: investigate what is this for\n if (typeof value.q.select[0] === 'string') {\n value.q.select[0] = {\n selectAs: { r: value.q.select[0] },\n };\n }\n\n subQuery = value;\n } else {\n subQuery = value.json(false);\n }\n } else {\n subQuery = value;\n }\n }\n\n const joinLateral =\n innerJoinLateral || query.q.returnType === 'valueOrThrow';\n\n const as = _joinLateral(\n q,\n joinLateral ? 'JOIN' : 'LEFT JOIN',\n subQuery,\n key,\n // no need for `ON p.r IS NOT NULL` check when joining a single record,\n // `JOIN` will handle it on itself.\n innerJoinLateral &&\n returnType !== 'one' &&\n returnType !== 'oneOrThrow',\n );\n\n if (as) {\n value.q.joinedForSelect = _copyQueryAliasToQuery(\n value,\n q as unknown as Query,\n as,\n );\n }\n }\n\n if (value.q.getColumn?.data.skipValueToArray) {\n value.q.notFoundDefault ??= null;\n } else if (\n !value.q.type &&\n (value.q.returnType === 'value' ||\n value.q.returnType === 'valueOrThrow') &&\n !isSelfReferencingQuery\n ) {\n const column = Object.create(\n value.q.getColumn || UnknownColumn.instance,\n );\n column.data = { ...column.data, valueToArray: true };\n\n if (joinQuery) {\n // `name: undefined` for the case when the select implicitly joins, aliases the selected columns,\n // `where` uses the joined columns in conditions, and in this case `where` needs to use joined columns aliases - not their real db names.\n column.data.name = undefined;\n }\n\n value.q.getColumn = column;\n if (value.q.expr) {\n value.q.expr.q.getColumn = column;\n }\n }\n\n if (\n (outerReturnType === 'value' || isSelfReferencingQuery) &&\n value.q.returnType === 'valueOrThrow'\n ) {\n value.q.returnType = 'value';\n }\n\n column = value.q.getColumn;\n\n value = prepareSubQueryForSql(q as never, value);\n }\n } else if (typeof value === 'string') {\n const joinedAs = query.q.valuesJoinedAs?.[value];\n\n column = (\n joinedAs\n ? query.q.joinedShapes?.[joinedAs]?.value\n : _getSelectableColumn(query as never, value)\n ) as Column | undefined;\n } else {\n column = value.result.value;\n }\n\n selectAs[key] = addParserForSelectItem(\n query as never,\n as,\n key,\n value as SelectableOrExpression<T> | Query,\n columnAlias,\n joinQuery,\n );\n\n return column;\n};\n\n// process string select arg\n// adds a column parser for a column\n// when table.* string is provided, sets a parser for a joined table\nexport const setParserForSelectedString = (\n query: PickQueryQAndInternal,\n arg: string,\n as: string | undefined,\n columnAs?: string,\n columnAlias?: string,\n): string | undefined => {\n const { q } = query;\n const index = arg.indexOf('.');\n if (index === -1) {\n return selectColumn(query, q, arg, columnAs, columnAlias);\n }\n\n const table = getFullColumnTable(query as unknown as IsQuery, arg, index, as);\n const column = arg.slice(index + 1);\n\n // 'table.*' is selecting a full joined record (without computeds)\n if (column === '*') {\n addParsersForSelectJoinedWildcard(query, table, columnAs);\n return table === as ? column : arg;\n }\n\n if (table === as) {\n return selectColumn(query, q, column, columnAs, columnAlias);\n }\n\n const parser = q.joinedParsers?.[table]?.[column];\n if (parser) setParserToQuery(q, columnAs || column, parser);\n\n const batchParsers = q.joinedBatchParsers?.[table];\n if (batchParsers) {\n let cloned = false;\n for (const bp of batchParsers) {\n if (bp.path[0].key === column) {\n if (!cloned) {\n q.batchParsers = [...(q.batchParsers || [])];\n cloned = true;\n }\n q.batchParsers!.push(bp);\n }\n }\n }\n\n const computeds = q.joinedComputeds?.[table];\n if (computeds?.[column]) {\n const computed = computeds[column];\n _addToHookSelectWithTable(query, computed.deps, table);\n\n setObjectValueImmutable(q, 'selectedComputeds', column, computed);\n return;\n }\n\n return arg;\n};\n\nconst selectColumn = (\n query: PickQueryQAndInternal,\n q: QueryData,\n key: string,\n columnAs?: string,\n columnAlias?: string,\n) => {\n if (key === '*') {\n const { defaultParsers } = query.q;\n if (defaultParsers) {\n spreadObjectValues(query.q, 'parsers', defaultParsers);\n }\n } else {\n const parser = query.q.defaultParsers?.[key];\n if (parser) setObjectValueImmutable(q, 'parsers', columnAs || key, parser);\n\n if (q.runtimeComputeds?.[key]) {\n const computed = q.runtimeComputeds[key];\n _addToHookSelect(query, computed.deps);\n\n query.q.selectedComputeds = {\n ...query.q.selectedComputeds,\n [columnAlias || key]: computed,\n };\n return;\n }\n }\n\n return key;\n};\n\n// is mapping the result of a query into a columns shape\n// in this way, the result of a sub query becomes available outside of it for using in WHERE and other methods\n//\n// when isSubQuery is true, it will remove data.name of columns,\n// so that outside of the sub-query the columns are named with app-side names,\n// while db column names are encapsulated inside the sub-query\nexport const getShapeFromSelect = (\n q: IsQuery,\n isSubQuery?: boolean,\n): Column.QueryColumns => {\n const query = (q as Query).q;\n const { selectShape } = query;\n let select: SelectItem[] | undefined;\n\n if (query.selectedComputeds) {\n select = query.select ? [...query.select] : [];\n for (const key in query.selectedComputeds) {\n select.push(...query.selectedComputeds[key].deps);\n }\n } else {\n select = query.select;\n }\n\n let result: Column.QueryColumns;\n if (!select) {\n if (query.type) {\n // mutative queries with no select are returning nothing\n result = {};\n } else if (isSubQuery) {\n // when no select, and it is a sub-query, return the table shape with unnamed columns\n result = {};\n for (const key in selectShape) {\n const column = selectShape[key];\n if (!column.data.explicitSelect) {\n result[key] = column.data.name\n ? setColumnData(column, 'name', undefined)\n : column;\n }\n }\n } else {\n result = selectShape;\n }\n } else {\n result = {};\n for (const item of select) {\n if (typeof item === 'string') {\n addColumnToShapeFromSelect(\n q,\n item,\n selectShape,\n query,\n result,\n isSubQuery,\n );\n } else if (isExpression(item)) {\n result.value = item.result.value;\n } else if (item && 'selectAs' in item) {\n for (const key in item.selectAs) {\n const it = item.selectAs[key];\n if (typeof it === 'string') {\n addColumnToShapeFromSelect(\n q,\n it,\n selectShape,\n query,\n result,\n isSubQuery,\n key,\n );\n } else if (isExpression(it)) {\n result[key] = it.result.value || UnknownColumn.instance;\n } else if (it) {\n const { returnType } = it.q;\n if (returnType === 'value' || returnType === 'valueOrThrow') {\n const type = it.q.getColumn;\n result[key] = type\n ? mapSubSelectColumn(\n type as unknown as Column.Pick.Data,\n isSubQuery,\n )\n : UnknownColumn.instance;\n } else {\n result[key] = new JSONTextColumn(internalSchemaConfig, undefined);\n }\n }\n }\n }\n }\n }\n\n return result;\n};\n\n// converts selected items into a shape of columns\n// when `isSubQuery` is true, it un-names named columns\nconst addColumnToShapeFromSelect = (\n q: IsQuery,\n arg: string,\n shape: Column.QueryColumns,\n query: QueryData,\n result: Column.QueryColumns,\n isSubQuery?: boolean,\n key?: string,\n) => {\n const index = arg.indexOf('.');\n if (index !== -1) {\n const as = (q as Query).q.as || (q as Query).table;\n const table = getFullColumnTable(q, arg, index, as);\n const column = arg.slice(index + 1);\n if (table === as) {\n result[key || column] = shape[column];\n } else {\n const it = query.joinedShapes?.[table]?.[column];\n if (it)\n result[key || column] = mapSubSelectColumn(\n it as unknown as Column.Pick.Data,\n isSubQuery,\n );\n }\n } else if (arg === '*') {\n for (const key in shape) {\n if (!(shape[key] as unknown as Column.Pick.Data).data.explicitSelect) {\n result[key] = mapSubSelectColumn(\n shape[key] as unknown as Column.Pick.Data,\n isSubQuery,\n );\n }\n }\n } else {\n result[key || arg] = mapSubSelectColumn(\n shape[arg] as unknown as Column.Pick.Data,\n isSubQuery,\n );\n }\n};\n\n// un-name a column if `isSubQuery` is true\nconst mapSubSelectColumn = (column: Column.Pick.Data, isSubQuery?: boolean) => {\n // `!column` is needed for case when wrong column is passed to subquery (see issue #236)\n if (\n !isSubQuery ||\n !column ||\n (!column.data.name && !column.data.explicitSelect)\n ) {\n return column;\n }\n\n const cloned = Object.create(column);\n cloned.data = { ...column.data, name: undefined, explicitSelect: undefined };\n return cloned;\n};\n","import { SelectItemExpression } from '../../expressions/select-item-expression';\nimport { Operators, setQueryOperators } from '../../../columns/operators';\nimport { getFullColumnTable } from '../../query.utils';\nimport { Column } from '../../../columns';\nimport {\n PickQueryQ,\n PickQueryRelationsWithData,\n PickQuerySelectable,\n PickQueryShape,\n PickQueryTable,\n} from '../../pick-query-types';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport {\n IsQuery,\n Query,\n SetQueryReturnsColumnOptional,\n SetQueryReturnsColumnOrThrow,\n SetQueryReturnsValueOptional,\n SetQueryReturnsValueOrThrow,\n} from '../../query';\nimport { processSelectAsArg } from '../select/select.utils';\nimport { getQueryAs } from '../as/as';\nimport type { SelectAsFnArg } from '../select/select';\nimport { SelectAsValue } from '../select/select.sql';\n\nexport interface QueryGetSelf\n extends PickQuerySelectable, PickQueryRelationsWithData {}\n\n// `get` method argument, accepts a string for a column name or a raw SQL\nexport type GetArg<T extends QueryGetSelf> =\n | GetStringArg<T>\n | Expression\n | ((q: SelectAsFnArg<T>) => Expression | Query.Pick.SingleValueResult);\n\nexport type GetStringArg<T extends PickQuerySelectable> =\n keyof T['__selectable'] & string;\n\ntype ResolveGetArgColumn<Arg> = Arg extends Expression\n ? Arg['result']['value']\n : Arg extends (q: never) => infer R\n ? R extends Expression\n ? R['result']['value']\n : R extends Query.Pick.SingleValueResult\n ? R['result']['value']\n : never\n : never;\n\n// `get` method result: returns a column type for raw expression or a value type for string argument\nexport type GetResult<\n T extends QueryGetSelf,\n Arg extends GetArg<T>,\n> = Arg extends string\n ? SetQueryReturnsValueOrThrow<T, Arg>\n : SetQueryReturnsColumnOrThrow<T, ResolveGetArgColumn<Arg>>;\n\nexport type GetResultOptional<\n T extends QueryGetSelf,\n Arg extends GetArg<T>,\n> = Arg extends string\n ? SetQueryReturnsValueOptional<T, Arg>\n : SetQueryReturnsColumnOptional<T, ResolveGetArgColumn<Arg>>;\n\nexport const _getSelectableColumn = (\n q: IsQuery,\n arg: string,\n): Column.Pick.QueryColumn | undefined => {\n let type: Column.Pick.QueryColumn | undefined = (q as unknown as PickQueryQ).q\n .selectShape[arg];\n if (!type) {\n const index = arg.indexOf('.');\n if (index !== -1) {\n const as =\n (q as unknown as PickQueryQ).q.as || (q as PickQueryTable).table;\n\n const table = getFullColumnTable(q, arg, index, as);\n const column = arg.slice(index + 1);\n\n if (table === as) {\n type = (q as unknown as PickQueryShape).shape[column];\n } else {\n type = (q as unknown as PickQueryQ).q.joinedShapes?.[table]?.[column];\n }\n }\n }\n return type;\n};\n\n// mutate the query to get a single value\nconst _get = <\n T extends QueryGetSelf,\n R extends 'value' | 'valueOrThrow',\n Arg extends GetArg<T>,\n>(\n query: T,\n returnType: R,\n arg: Arg,\n): R extends 'value' ? GetResultOptional<T, Arg> : GetResult<T, Arg> => {\n const q = (query as unknown as PickQueryQ).q;\n\n if (q.returning) q.returning = undefined;\n\n q.returnType = returnType;\n\n let value: unknown = arg;\n\n const selectAs: SelectAsValue = {};\n let column: Column | undefined;\n const selected = processSelectAsArg(\n query as never,\n selectAs,\n getQueryAs(query as never),\n 'v',\n value as never,\n undefined,\n returnType,\n );\n if (selected !== false) {\n q.getColumn = column = selected;\n value = selectAs.v || value;\n }\n\n if (typeof value === 'string') {\n value =\n selectAs.v &&\n new SelectItemExpression(query as never, selectAs.v as string, column);\n }\n\n q.select = isExpression(value)\n ? [(q.expr = value)]\n : value\n ? [{ selectAs: { v: value as Query } }]\n : undefined;\n\n return setQueryOperators(\n query as never,\n column?.operators || Operators.any,\n ) as never;\n};\n\nexport function _queryGet<T extends QueryGetSelf, Arg extends GetArg<T>>(\n self: T,\n arg: Arg,\n): GetResult<T, Arg> {\n return _get(self, 'valueOrThrow', arg);\n}\n\nexport function _queryGetOptional<\n T extends QueryGetSelf,\n Arg extends GetArg<T>,\n>(self: T, arg: Arg): GetResultOptional<T, Arg> {\n return _get(self, 'value', arg);\n}\n","import { _queryGetOptional } from '../get/get.utils';\nimport {\n Query,\n queryTypeWithLimitOne,\n SetQueryReturnsColumnOptional,\n} from '../../query';\nimport { Column } from '../../../columns/column';\nimport { cloneQueryBaseUnscoped, queryWrap } from '../wrap/wrap';\nimport { UnknownColumn } from '../../../columns';\nimport { selectToSql } from '../select/select.sql';\nimport { Expression, ExpressionData } from '../../expressions/expression';\nimport { getQueryAs } from '../as/as';\nimport { ToSQLCtx } from '../../sql/to-sql';\n\nclass RowToJsonExpression extends Expression {\n q: ExpressionData;\n result = { value: UnknownColumn.instance };\n\n constructor(\n public from: Query,\n public one: boolean,\n public coalesce?: boolean,\n ) {\n super();\n this.q = { expr: this };\n }\n\n makeSQL(ctx: ToSQLCtx) {\n const q = this.from;\n const aliases: string[] = [];\n const jsonList: { [K: string]: Column | undefined } = {};\n const select = selectToSql(\n ctx,\n q,\n q.q,\n `\"${getQueryAs(q)}\"`,\n q.q.hookSelect,\n undefined,\n aliases,\n jsonList,\n );\n q.q.selectCache = { sql: select, aliases };\n\n let rowToJson: string;\n if (Object.values(jsonList).some((x) => x?.data.jsonCast)) {\n rowToJson = `json_build_object(${Object.entries(jsonList)\n .map(\n ([key, column]) =>\n `'${key}', t.\"${key}\"${\n column?.data.jsonCast ? `::${column.data.jsonCast}` : ''\n }`,\n )\n .join(', ')})`;\n } else {\n rowToJson = 'row_to_json(t.*)';\n }\n\n return this.one\n ? rowToJson\n : this.coalesce !== false\n ? `COALESCE(json_agg(${rowToJson}), '[]')`\n : `json_agg(${rowToJson})`;\n }\n}\n\nexport function queryJson<T>(\n self: T,\n coalesce?: boolean,\n): SetQueryReturnsColumnOptional<T, Column.Pick.QueryColumnOfType<string>> {\n const inner = (self as Query).clone();\n\n const q = queryWrap(inner, cloneQueryBaseUnscoped(inner)) as unknown as Query;\n // json_agg is used instead of jsonb_agg because it is 2x faster, according to my benchmarks\n _queryGetOptional(\n q,\n new RowToJsonExpression(\n inner,\n queryTypeWithLimitOne[(self as Query).q.returnType as string],\n coalesce,\n ),\n );\n\n // to skip LIMIT 1\n q.q.returnsOne = true;\n\n return q as never;\n}\n","import { SelectItemExpression } from '../../expressions/select-item-expression';\nimport { ToSql, ToSQLCtx } from '../../sql/to-sql';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { addTopCte } from './cte.sql';\nimport { _clone } from '../clone/clone';\nimport { getShapeFromSelect } from '../select/select.utils';\nimport { getQueryAs } from '../as/as';\nimport { getSqlText } from '../../sql/sql';\nimport { QueryType } from '../../query-data';\n\nexport const moveQueryToCte = (\n ctx: ToSQLCtx,\n query: SubQueryForSql,\n type: QueryType,\n dontAddTableHook?: boolean,\n): {\n as: string;\n makeSelectList(isSubSql?: boolean): string[];\n} => {\n const { returnType } = query.q;\n const throwOnNotFound = returnType === 'valueOrThrow';\n\n let valueAs: string | undefined;\n if (\n returnType === 'value' ||\n returnType === 'valueOrThrow' ||\n returnType === 'pluck'\n ) {\n const first = query.q.select![0];\n if (\n first instanceof SelectItemExpression &&\n typeof first.item === 'string'\n ) {\n const columnName = first.result.value?.data.name;\n // A value query from `get` must expose its app-side key from the CTE,\n // otherwise named columns return their db name and the outer CTE select cannot reference them.\n if (columnName && columnName !== first.item) {\n query = _clone(query) as unknown as SubQueryForSql;\n query.q.returnType = 'one';\n query.q.select = [{ selectAs: { [first.item]: first } }];\n if (throwOnNotFound && query.q.type !== 'upsert') {\n query.q.cteThrowOnNotFound = true;\n }\n }\n valueAs = first.item;\n } else {\n query = _clone(query) as unknown as SubQueryForSql;\n query.q.returnType = 'one';\n query.q.select = [{ selectAs: { value: query.q.select![0] as never } }];\n valueAs = 'value';\n }\n }\n\n const as = addTopCte('before', ctx, query, type, undefined, dontAddTableHook);\n\n const makeSelectList = (isSubSql?: boolean) => {\n const list: string[] = [];\n\n let selectedCount = 0;\n if (valueAs) {\n selectedCount = 1;\n list.push(`\"${as}\".\"${valueAs}\"`);\n } else if (returnType !== 'void') {\n const shape = getShapeFromSelect(query, true);\n const keys = Object.keys(shape);\n selectedCount = keys.length;\n list.push(...keys.map((key) => `\"${as}\".\"${key}\"`));\n }\n\n if (!isSubSql && ctx.topCtx.cteHooks?.hasSelect) {\n list.push('NULL::json');\n ctx.selectedCount = selectedCount;\n }\n\n return list;\n };\n\n return {\n as,\n makeSelectList,\n };\n};\n\nexport const moveMutativeQueryToCteBase = (\n toSql: ToSql,\n ctx: ToSQLCtx,\n query: SubQueryForSql,\n type = query.q.type,\n): {\n as: string;\n makeSql(isSubSql?: boolean): string;\n} => {\n if (!query.q.type) {\n const as = getQueryAs(query);\n return {\n as,\n makeSql: () => getSqlText(toSql(query, query.q.type, ctx, true)),\n };\n }\n\n const { as, makeSelectList } = moveQueryToCte(ctx, query, type);\n\n return {\n as,\n // need to be called lazily for the upsert case because `ctx.cteHooks?.hasSelect` can change after the first query\n makeSql(isSubSql) {\n return 'SELECT ' + makeSelectList(isSubSql) + ` FROM \"${as}\"`;\n },\n };\n};\n","import { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { Column } from '../../../columns/column';\nimport {\n CteHooks,\n CteTableHook,\n EnsureCountItem,\n HookSelect,\n TableHook,\n} from '../../basic-features/select/hook-select';\nimport { QueryData } from '../../query-data';\n\nexport type HookPurpose = 'Create' | 'Update' | 'Delete';\n\nexport const addTableHook = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n data: QueryData,\n select?: HookSelect,\n hookPurpose?: HookPurpose,\n dontAddTableHook?: boolean,\n): void => {\n if (data.ensureCount !== undefined && ctx.cteName) {\n const cteHooks = setCteHooks(ctx, true);\n (cteHooks.ensureCount ??= {})[ctx.cteName] = { count: data.ensureCount };\n }\n\n const afterCreate = data.afterCreate;\n const afterUpdate = data.afterUpdate;\n const afterSave = data.afterSave;\n const afterDelete = data.afterDelete;\n const afterCreateCommit = data.afterCreateCommit;\n const afterUpdateCommit = data.afterUpdateCommit;\n const afterSaveCommit = data.afterSaveCommit;\n const afterDeleteCommit = data.afterDeleteCommit;\n const throwOnNotFound =\n // Assuming that Create always returns a record, though needs to be cautions with onConflictDoNothing\n hookPurpose !== 'Create' &&\n (data.cteThrowOnNotFound ||\n data.returnType === 'oneOrThrow' ||\n data.returnType === 'valueOrThrow');\n\n const hasAfterHook =\n afterCreate ||\n afterUpdate ||\n afterSave ||\n afterDelete ||\n afterCreateCommit ||\n afterUpdateCommit ||\n afterSaveCommit ||\n afterDeleteCommit;\n\n if (!select && !hasAfterHook && !throwOnNotFound) {\n return;\n }\n\n const tableHook: TableHook = {\n hookPurpose,\n select,\n afterCreate,\n afterUpdate,\n afterSave,\n afterDelete,\n afterCreateCommit,\n afterUpdateCommit,\n afterSaveCommit,\n afterDeleteCommit,\n };\n\n if (ctx.cteName && !dontAddTableHook) {\n if (tableHook && (hasAfterHook || throwOnNotFound)) {\n const shape: Column.Shape.Data = {};\n if (tableHook.select) {\n for (const key of tableHook.select.keys()) {\n shape[key] = q.shape[key] as unknown as Column.Pick.Data;\n }\n }\n\n const item: CteTableHook = {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n table: q.table!,\n shape,\n tableHook: tableHook,\n throwOnNotFound,\n };\n\n const hasSelect = throwOnNotFound || !!tableHook.select;\n const cteHooks = setCteHooks(ctx, hasSelect);\n (cteHooks.tableHooks ??= {})[ctx.cteName] ??= item;\n }\n } else {\n ctx.topCtx.tableHook = tableHook;\n }\n};\n\nexport const setCteHooks = (ctx: ToSQLCtx, hasSelect: boolean): CteHooks => {\n if (\n hasSelect &&\n ctx.topCtx.selectList &&\n ctx.topCtx === ctx.topCtx.topCtx &&\n !ctx.topCtx.cteHookTopNullSelectAppended\n ) {\n ctx.topCtx.selectList.push('NULL');\n ctx.topCtx.cteHookTopNullSelectAppended = true;\n }\n\n if (ctx.topCtx.cteHooks) {\n if (hasSelect) ctx.topCtx.cteHooks.hasSelect = true;\n return ctx.topCtx.cteHooks;\n } else {\n return (ctx.topCtx.cteHooks = {\n hasSelect,\n });\n }\n};\n\nexport const ensureCTECount = (\n ctx: ToSQLCtx,\n cteName: string,\n countItem: EnsureCountItem,\n) => {\n (setCteHooks(ctx, true).ensureCount ??= {})[cteName] = countItem;\n};\n","import { IsQuery, Query } from '../../query';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { _clone } from '../../basic-features/clone/clone';\nimport {\n prepareSubQueryForSql,\n SubQueryForSql,\n} from '../sub-query/sub-query-for-sql';\nimport { requirePrimaryKeys } from '../../query-columns/primary-keys';\nimport {\n _addToHookSelect,\n HookSelect,\n HookSelectValue,\n} from '../../basic-features/select/hook-select';\nimport { moveQueryToCte } from '../../basic-features/cte/move-mutative-query-to-cte-base.sql';\nimport { ensureCTECount } from '../../extra-features/hooks/hooks.sql';\nimport { JoinItem } from '../../basic-features/join/join.sql';\nimport { getQueryAs } from '../../basic-features/as/as';\nimport { RecordString } from '../../../utils';\n\nexport interface MutativeQueriesSelectRelationsQueryData {\n selectRelation?: true;\n}\n\nexport interface MutativeQueriesSelectRelationsSqlProp {\n mutativeQueriesSelectRelationsState?: MutativeQueriesSelectRelationsSqlState;\n}\n\nexport interface MutativeQueriesSelectRelationsSqlState {\n query: IsQuery;\n value?: MutativeQueriesSelectRelationsValue;\n}\n\nexport interface MutativeQueriesSelectRelationsValue {\n [K: string]: IsQuery;\n}\n\nexport const newMutativeQueriesSelectRelationsSqlState = (\n query: ToSQLQuery,\n): MutativeQueriesSelectRelationsSqlState | undefined =>\n query.q.selectRelation && {\n query,\n };\n\nexport const setMutativeQueriesSelectRelationsSqlState = (\n d: MutativeQueriesSelectRelationsSqlState,\n as: string,\n rel: IsQuery,\n) => {\n (d.value ??= {})[as] = rel;\n};\n\nexport const handleInsertAndUpdateSelectRelationsSqlState = (\n ctx: ToSQLCtx,\n state: MutativeQueriesSelectRelationsSqlState | undefined,\n) => {\n if (state) {\n ctx.topCtx.mutativeQueriesSelectRelationsSqlState = state;\n }\n};\n\n// It's a workaround for soft-delete when selecting a relation.\n// if relation is selected under the same name as primary key, valuesJoinedAs will make SQL use relation instead of pkey for the condition.\n// Temporarily unsetting valuesJoinedAs.\nexport const unsetValuesJoinedAsForMutativeSelectRelations = (\n query: ToSQLQuery,\n): RecordString | undefined => {\n if (!query.q.selectRelation || !query.q.valuesJoinedAs) {\n return;\n }\n\n const { valuesJoinedAs } = query.q;\n query.q.valuesJoinedAs = undefined;\n\n return valuesJoinedAs;\n};\n\nexport const restoreValuesJoinedAsForMutativeSelectRelations = (\n query: ToSQLQuery,\n valuesJoinedAs: RecordString | undefined,\n) => {\n if (valuesJoinedAs) {\n query.q.valuesJoinedAs = valuesJoinedAs;\n }\n};\n\nexport const handleDeleteSelectRelationsSqlState = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n relationSelectState: MutativeQueriesSelectRelationsSqlState | undefined,\n):\n | {\n join: JoinItem;\n joinedShape: string;\n movedWhereToCte: boolean;\n addReturning: string;\n }\n | undefined => {\n const selectRelations = relationSelectState?.value;\n if (!selectRelations) return;\n\n const selectPrimaryKeysQuery = prepareSubQueryForSql(query, _clone(query));\n selectPrimaryKeysQuery.q.valuesJoinedAs = undefined;\n\n const primaryKeys = requirePrimaryKeys(\n query as Query,\n 'primary keys are required for selecting relation in delete',\n );\n\n _addToHookSelect(selectPrimaryKeysQuery, primaryKeys, true);\n\n const { as: cteAs } = moveQueryToCte(\n ctx,\n selectPrimaryKeysQuery as unknown as SubQueryForSql,\n undefined,\n true,\n );\n\n const relKeys = Object.keys(selectRelations);\n\n const hookSelect = selectPrimaryKeysQuery.q.hookSelect as HookSelect;\n const queryAs = getQueryAs(query);\n\n const join: JoinItem = {\n type: 'JOIN',\n args: {\n w: cteAs,\n a: [\n Object.fromEntries(\n primaryKeys.map((key) => {\n const selected = hookSelect.get(key) as HookSelectValue;\n return [\n cteAs + '.' + ((selected.as || selected.select) as string),\n `${queryAs}.${key}`,\n ];\n }),\n ),\n ],\n },\n };\n\n for (const relKey in selectRelations) {\n const rel = selectRelations[relKey] as Query;\n if (\n rel.q.returnType === 'oneOrThrow' ||\n rel.q.returnType === 'valueOrThrow'\n ) {\n ensureCTECount(ctx, cteAs, { jsonNotNull: relKey });\n }\n }\n\n return {\n join,\n joinedShape: cteAs,\n movedWhereToCte: true,\n addReturning: relKeys.map((key) => `${cteAs}.\"${key}\"`).join(', '),\n };\n};\n\nexport const setMutativeQueriesSelectRelationsStateOnSql = (\n ctx: ToSQLCtx,\n sql: MutativeQueriesSelectRelationsSqlProp,\n) => {\n sql.mutativeQueriesSelectRelationsState =\n ctx.topCtx.mutativeQueriesSelectRelationsSqlState;\n};\n","import { RawSql } from '../../expressions/raw-sql';\nimport {\n columnToSql,\n simpleColumnToSQL,\n tableColumnToSql,\n} from '../../sql/column-to-sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { QueryData, SelectAllColumn } from '../../query-data';\nimport { _queryGetOptional } from '../get/get.utils';\nimport { queryJson } from '../json/json.utils';\nimport { queryWrap } from '../wrap/wrap';\nimport { isQueryNone } from '../../extra-features/none/none';\nimport { anyShape } from '../../../columns/any-shape';\nimport { Column } from '../../../columns/column';\nimport { IntegerBaseColumn } from '../../../columns/column-types/number';\nimport { moveMutativeQueryToCte } from '../cte/cte.sql';\nimport { SelectItemExpression } from '../../expressions/select-item-expression';\nimport { HookSelect, HookSelectValue } from './hook-select';\nimport {\n addValue,\n getFreeAlias,\n isObjectEmpty,\n RecordString,\n RecordUnknown,\n} from '../../../utils';\nimport { ColumnsParsers } from '../../query-columns/query-column-parsers';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport {\n Expression,\n isExpression,\n SelectableOrExpression,\n} from '../../expressions/expression';\nimport { isRelationQuery } from '../../relations';\nimport { OrchidOrmInternalError, UnhandledTypeError } from '../../errors';\nimport { Query } from '../../query';\nimport { getSelectedColumnData, makeRowToJson } from '../../sql/sql';\nimport {\n MutativeQueriesSelectRelationsSqlState,\n setMutativeQueriesSelectRelationsSqlState,\n} from '../../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\n\nexport type SelectItem = string | SelectAs | Expression | undefined;\n\nexport interface SelectAs {\n selectAs: SelectAsValue;\n}\n\nexport interface SelectAsValue {\n [K: string]: string | Query | Expression | undefined;\n}\n\nexport const setSqlCtxSelectList = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: {\n selectShape: Column.QueryColumns;\n hookSelect?: HookSelect;\n selectCache?: QueryData['selectCache'];\n returnType?: QueryData['returnType'];\n },\n quotedAs?: string,\n isSubSql?: boolean,\n aliases?: string[],\n): void => {\n if (query.selectCache) {\n if (aliases) aliases.push(...query.selectCache.aliases);\n ctx.selectList = [query.selectCache.sql];\n } else {\n ctx.selectList = selectToSqlList(\n ctx,\n table,\n query,\n quotedAs,\n query.hookSelect,\n isSubSql,\n aliases,\n undefined,\n undefined,\n );\n\n if (!isSubSql && ctx.topCtx.cteHooks?.hasSelect) {\n ctx.selectList.push('NULL');\n }\n }\n};\n\nexport const selectToSqlList = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: {\n select?: QueryData['select'];\n selectAllColumns?: SelectAllColumn[];\n selectAllShape?: RecordUnknown;\n join?: QueryData['join'];\n hookSelect?: HookSelect;\n selectShape: Column.QueryColumns;\n parsers?: ColumnsParsers;\n joinedShapes?: QueryData['joinedShapes'];\n returnType?: QueryData['returnType'];\n getColumn?: Column;\n },\n quotedAs: string | undefined,\n hookSelect: HookSelect | undefined = query.hookSelect,\n isSubSql?: boolean,\n aliases?: string[],\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n delayedRelationSelect?: MutativeQueriesSelectRelationsSqlState,\n): string[] => {\n let selected: RecordUnknown | undefined;\n let selectedAs: RecordString | undefined;\n\n let list: string[] = [];\n\n ctx.selectedCount = 0;\n\n if (query.select) {\n for (const item of query.select) {\n if (typeof item === 'string') {\n let sql;\n if (item === '*') {\n if (hookSelect) {\n selected ??= {};\n selectedAs ??= {};\n for (const key in query.selectAllShape) {\n selected[key] = quotedAs;\n selectedAs[key] = key;\n }\n }\n\n sql = internalSelectAllSql(ctx, query, quotedAs, jsonList).join(', ');\n } else {\n ctx.selectedCount++;\n\n const index = item.indexOf('.');\n if (index !== -1) {\n const tableName = item.slice(0, index);\n const key = item.slice(index + 1);\n\n if (hookSelect?.get(key)) {\n (selected ??= {})[key] = `\"${tableName}\"`;\n (selectedAs ??= {})[key] = key;\n }\n\n sql = tableColumnToSql(\n ctx,\n query,\n query.selectShape,\n tableName,\n key,\n quotedAs,\n true,\n key === '*' ? tableName : key,\n jsonList,\n );\n } else {\n if (hookSelect?.get(item)) {\n (selected ??= {})[item] = quotedAs;\n (selectedAs ??= {})[item] = item;\n }\n\n sql = simpleColumnToSQL(\n ctx,\n query,\n query.selectShape,\n item,\n query.selectShape[item],\n quotedAs,\n true,\n item,\n jsonList,\n );\n }\n }\n\n list.push(sql);\n aliases?.push('');\n } else if (item) {\n if ('selectAs' in item) {\n const obj = item.selectAs as {\n [K: string]: SelectableOrExpression | SubQueryForSql;\n };\n for (const as in obj) {\n ctx.selectedCount++;\n\n if (hookSelect) {\n (selected ??= {})[as] = true;\n }\n\n const value = obj[as];\n if (typeof value === 'object') {\n if (isExpression(value)) {\n let sql = value.toSQL(ctx, quotedAs);\n if (value.q.getColumn?.data.valueToArray) {\n sql = `array[${sql}]`;\n }\n\n list.push(`${sql} \"${as}\"`);\n\n if (jsonList) {\n jsonList[as] = value.result\n .value as unknown as Column.Pick.Data;\n }\n\n aliases?.push(as);\n } else if (delayedRelationSelect && isRelationQuery(value)) {\n setMutativeQueriesSelectRelationsSqlState(\n delayedRelationSelect,\n as,\n value,\n );\n } else {\n pushSubQuerySql(ctx, query, value, as, list, quotedAs, aliases);\n if (jsonList) {\n jsonList[as] =\n value.q.returnType === 'value' ||\n value.q.returnType === 'valueOrThrow'\n ? ((value.q.expr?.result.value ||\n value.result?.value) as unknown as Column.Pick.Data)\n : undefined;\n }\n }\n } else if (value) {\n if (hookSelect) {\n (selectedAs ??= {})[value as string] = as;\n }\n\n list.push(\n columnToSql(\n ctx,\n table.q,\n table.q.selectShape,\n value as string,\n quotedAs,\n true,\n as,\n jsonList,\n ),\n );\n aliases?.push(as);\n }\n }\n } else {\n // selecting a single value from expression\n ctx.selectedCount++;\n let sql = item.toSQL(ctx, quotedAs);\n\n if (item.q.getColumn?.data.valueToArray) {\n sql = `array[${sql}]`;\n }\n\n // `get` column\n if (\n hookSelect &&\n item instanceof SelectItemExpression &&\n typeof item.item === 'string' &&\n item.item !== '*'\n ) {\n const i = item.item.indexOf('.');\n let key: string | undefined;\n if (i !== -1) {\n if (item.item.slice(0, i) === table.table) {\n key = item.item.slice(i + 1);\n }\n } else {\n key = item.item;\n }\n\n if (key) {\n const column = (item.q as QueryData).selectShape[key];\n (selectedAs ??= {})[key] = column?.data.name || key;\n }\n }\n\n list.push(ctx.aliasValue ? `${sql} ${quotedAs}` : sql);\n aliases?.push('');\n }\n }\n }\n }\n\n if (hookSelect) {\n for (const column of hookSelect.keys()) {\n const item = hookSelect.get(column) as HookSelectValue;\n const { select } = item;\n let sql;\n let quotedTable;\n let columnName;\n let col;\n\n if (typeof select === 'string') {\n const index = select.indexOf('.');\n if (index !== -1) {\n const tableName = select.slice(0, index);\n quotedTable = `\"${tableName}\"`;\n columnName = select.slice(index + 1);\n col = table.q.joinedShapes?.[tableName]?.[columnName] as\n | Column\n | undefined;\n sql = columnToSql(\n ctx,\n table.q,\n table.shape,\n select,\n undefined,\n true,\n undefined,\n undefined,\n undefined,\n true,\n );\n } else {\n quotedTable = quotedAs;\n columnName = select;\n col = table.shape[select] as Column | undefined;\n sql = columnToSql(\n ctx,\n table.q,\n table.shape,\n select,\n quotedAs,\n true,\n undefined,\n undefined,\n undefined,\n true,\n );\n }\n } else {\n columnName = column;\n sql = select.sql;\n }\n\n let name = columnName;\n if (selected?.[columnName]) {\n if (selected?.[columnName] === quotedTable) {\n if (!isSubSql) {\n hookSelect.delete(column);\n }\n item.onAs?.forEach((fn) => fn(columnName));\n continue;\n }\n\n name = getFreeAlias(selected, column);\n\n item.as = name;\n item.temp = name;\n sql += ` \"${name}\"`;\n item.onAs?.forEach((fn) => fn(name));\n } else if (selectedAs?.[columnName]) {\n const as = selectedAs[columnName];\n item.as = as;\n item.temp = columnName;\n item.onAs?.forEach((fn) => fn(as));\n continue;\n } else {\n if (col?.data.name || typeof select === 'object') {\n sql += ` \"${columnName}\"`;\n }\n item.temp = columnName;\n item.onAs?.forEach((fn) => fn(column));\n }\n\n if (jsonList) jsonList[name] = col;\n\n ctx.selectedCount++;\n list.push(sql);\n }\n }\n\n if (!list.length && !query.select && query.returnType !== 'void') {\n list = internalSelectAllSql(ctx, query, quotedAs, jsonList);\n }\n\n return list;\n};\n\nexport const selectToSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: {\n select?: QueryData['select'];\n selectAllColumns?: SelectAllColumn[];\n selectAllShape?: RecordUnknown;\n join?: QueryData['join'];\n hookSelect?: HookSelect;\n selectShape: Column.QueryColumns;\n parsers?: ColumnsParsers;\n joinedShapes?: QueryData['joinedShapes'];\n returnType?: QueryData['returnType'];\n },\n quotedAs: string | undefined,\n hookSelect: HookSelect | undefined = query.hookSelect,\n isSubSql?: boolean,\n aliases?: string[],\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n delayedRelationSelect?: MutativeQueriesSelectRelationsSqlState,\n): string => {\n const list = selectToSqlList(\n ctx,\n table,\n query,\n quotedAs,\n hookSelect,\n isSubSql,\n aliases,\n jsonList,\n delayedRelationSelect,\n );\n\n return list.join(', ');\n};\n\nconst internalSelectAllSql = (\n ctx: ToSQLCtx,\n query: {\n updateFrom?: unknown;\n updateMany?: unknown;\n join?: QueryData['join'];\n selectAllColumns?: SelectAllColumn[];\n selectAllShape?: RecordUnknown;\n selectShape: Column.QueryColumns;\n },\n quotedAs?: string,\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n): string[] => {\n if (jsonList) {\n for (const key in query.selectAllShape) {\n const column = query.selectAllShape[key] as Column.Pick.Data;\n jsonList[key] = getSelectedColumnData(column);\n }\n }\n\n let columnsCount: number | undefined;\n if (query.selectShape !== anyShape) {\n columnsCount = 0;\n for (const key in query.selectShape) {\n if (!(query.selectShape[key] as Column).data.explicitSelect) {\n columnsCount++;\n }\n }\n ctx.selectedCount += columnsCount;\n }\n\n return selectAllSql(query, quotedAs, columnsCount, ctx);\n};\n\nexport const selectAllSql = (\n q: {\n updateFrom?: unknown;\n updateMany?: unknown;\n join?: QueryData['join'];\n selectAllColumns?: SelectAllColumn[];\n selectAllShape?: RecordUnknown;\n selectShape: Column.QueryColumns;\n },\n quotedAs?: string,\n columnsCount?: number,\n ctx?: ToSQLCtx,\n): string[] => {\n return q.join?.length || q.updateFrom || q.updateMany\n ? q.selectAllColumns?.map((item) =>\n selectAllColumnToSql(item, ctx, quotedAs, true),\n ) || (isEmptySelect(q.selectShape, columnsCount) ? [] : [`${quotedAs}.*`])\n : q.selectAllColumns\n ? q.selectAllColumns.map((item) =>\n selectAllColumnToSql(item, ctx, quotedAs),\n )\n : isEmptySelect(q.selectShape, columnsCount)\n ? []\n : ['*'];\n};\n\nconst selectAllColumnToSql = (\n item: SelectAllColumn,\n ctx: ToSQLCtx | undefined,\n quotedAs: string | undefined,\n prefix?: true,\n): string => {\n if (typeof item !== 'string') {\n return item(ctx as ToSQLCtx, quotedAs);\n }\n\n return prefix ? `${quotedAs}.${item}` : item;\n};\n\nconst isEmptySelect = (shape: Column.QueryColumns, columnsCount?: number) =>\n columnsCount === undefined\n ? shape === anyShape\n ? false\n : isObjectEmpty(shape)\n : !columnsCount;\n\nconst pushSubQuerySql = (\n ctx: ToSQLCtx,\n mainQuery: {\n joinedShapes?: QueryData['joinedShapes'];\n },\n query: SubQueryForSql,\n as: string,\n list: string[],\n quotedAs?: string,\n aliases?: string[],\n) => {\n const { returnType = 'all' } = query.q;\n\n if (isQueryNone(query)) {\n let sql: string;\n switch (returnType) {\n case 'one':\n case 'oneOrThrow':\n case 'void':\n return;\n case 'value':\n case 'valueOrThrow':\n if (\n query.q.returning ||\n query.q.expr?.result.value instanceof IntegerBaseColumn\n ) {\n sql = '0';\n } else {\n return;\n }\n break;\n case 'all':\n case 'pluck':\n case 'rows':\n sql = `'[]'::json`;\n break;\n default:\n throw new UnhandledTypeError(query, returnType);\n }\n list.push(`${sql} \"${as}\"`);\n aliases?.push(as);\n return;\n }\n\n if (query.q.joinedForSelect) {\n let sql;\n switch (returnType) {\n case 'one':\n case 'oneOrThrow': {\n const table = query.q.joinedForSelect;\n const shape = mainQuery.joinedShapes?.[\n as\n ] as unknown as Column.Shape.Data;\n sql = makeRowToJson(ctx, table, shape, false);\n break;\n }\n case 'all':\n case 'value':\n case 'pluck':\n case 'rows':\n sql = `\"${query.q.joinedForSelect}\".\"${as}\"`;\n break;\n case 'valueOrThrow':\n if (query.q.returning) return;\n sql = `\"${query.q.joinedForSelect}\".\"${as}\"`;\n break;\n case 'void':\n return;\n default:\n throw new UnhandledTypeError(query, returnType);\n }\n\n if (sql) {\n list.push(`${coalesce(ctx, query, sql, quotedAs)} \"${as}\"`);\n aliases?.push(as);\n }\n return;\n }\n\n switch (returnType) {\n case 'all':\n case 'one':\n case 'oneOrThrow':\n query = queryJson(query) as unknown as typeof query;\n break;\n case 'pluck': {\n const { select } = query.q;\n const first = select?.[0];\n if (!first && query.q.runtimeComputeds?.[as]) {\n query = queryJson(query) as unknown as typeof query;\n } else if (!first) {\n throw new OrchidOrmInternalError(\n query,\n `Nothing was selected for pluck`,\n );\n } else {\n const cloned = query.clone();\n cloned.q.select = [{ selectAs: { c: first } }] as SelectItem[];\n query = queryWrap(\n cloned,\n cloned.baseQuery.clone(),\n ) as unknown as SubQueryForSql;\n _queryGetOptional(\n query as never,\n new RawSql(`COALESCE(json_agg(\"c\"), '[]')`),\n );\n }\n break;\n }\n case 'value':\n case 'valueOrThrow':\n if (!query.q.returning && query.q.runtimeComputeds?.[as]) {\n query = queryJson(query) as unknown as typeof query;\n }\n break;\n case 'rows':\n case 'void':\n break;\n default:\n throw new UnhandledTypeError(query, returnType);\n }\n\n list.push(\n `${coalesce(\n ctx,\n query,\n `(${moveMutativeQueryToCte(ctx, query)})`,\n quotedAs,\n )} \"${as}\"`,\n );\n};\n\nconst coalesce = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n sql: string,\n quotedAs?: string,\n) => {\n const { coalesceValue } = query.q;\n if (coalesceValue !== undefined) {\n const value = isExpression(coalesceValue)\n ? coalesceValue.toSQL(ctx, quotedAs)\n : addValue(ctx.values, coalesceValue);\n return `COALESCE(${sql}, ${value})`;\n }\n\n return sql;\n};\n","import { Query } from '../../query';\nimport { columnToSqlNotSelect } from '../../sql/column-to-sql';\nimport { JoinItemArgs, processJoinItem } from '../join/join.sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { JoinedShapes, QueryData, QueryScopeData } from '../../query-data';\nimport { Column } from '../../../columns/column';\nimport { SelectItem, selectToSql } from '../select/select.sql';\nimport { OperatorToSQL } from '../../../columns/operators';\nimport { moveMutativeQueryToCte } from '../cte/cte.sql';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { _getQueryOuterAliases, getQueryAs, QueryDataAliases } from '../as/as';\nimport { ColumnsParsers } from '../../query-columns/query-column-parsers';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport {\n addValue,\n MaybeArray,\n RecordString,\n RecordUnknown,\n toArray,\n} from '../../../utils';\nimport { WhereSearchItem } from '../../extra-features/search/search.sql';\nimport { joinSubQuery } from '../join/join';\nimport { ColumnsShape } from '../../../columns';\n\nexport type WhereItem =\n | {\n [K: string]:\n | unknown\n | { [K: string]: unknown | SubQueryForSql | Expression }\n | Expression;\n\n NOT?: MaybeArray<WhereItem>;\n AND?: MaybeArray<WhereItem>;\n OR?: MaybeArray<WhereItem>[];\n IN?: MaybeArray<WhereInItem>;\n EXISTS?: MaybeArray<JoinItemArgs>;\n ON?: WhereOnItem | WhereJsonPathEqualsItem;\n SEARCH?: MaybeArray<WhereSearchItem>;\n }\n | Query\n | Expression;\n\nexport interface WhereInItem {\n columns: string[];\n values: unknown[][] | SubQueryForSql | Expression;\n}\n\nexport type WhereJsonPathEqualsItem = [\n leftColumn: string,\n leftPath: string,\n rightColumn: string,\n rightPath: string,\n];\n\nexport interface WhereOnItem {\n joinFrom: WhereOnJoinItem;\n from: string;\n joinTo: WhereOnJoinItem;\n to: string;\n useOuterAliases?: true;\n op?: string;\n}\n\nexport type WhereOnJoinItem = { table?: string; q: { as?: string } } | string;\n\ninterface QueryDataForWhere extends QueryDataAliases {\n and?: QueryData['and'];\n or?: QueryData['or'];\n selectShape: QueryData['selectShape'];\n joinedShapes?: QueryData['joinedShapes'];\n scopes?: { [K: string]: QueryScopeData };\n outerAliases?: QueryData['outerAliases'];\n parsers?: ColumnsParsers;\n valuesJoinedAs?: RecordString;\n}\n\ninterface QueryDataWithLanguage extends QueryDataForWhere {\n language?: QueryData['language'];\n}\n\nexport const pushWhereStatementSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n checkIfHasExplicitWhere?: { value?: boolean },\n) => {\n const res = whereToSql(\n ctx,\n table,\n query,\n quotedAs,\n undefined,\n checkIfHasExplicitWhere,\n );\n if (res) {\n ctx.sql.push('WHERE', res);\n }\n};\n\nexport const pushWhereToSql = (\n sql: string[],\n ctx: ToSQLCtx,\n table: Query,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n) => {\n const res = whereToSql(ctx, table, query, quotedAs, parens);\n if (res) {\n sql.push(res);\n }\n};\n\nexport const whereToSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n checkIfHasExplicitWhere?: { value?: boolean },\n): string | undefined => {\n let sql: string | undefined;\n\n if (query.scopes) {\n sql = andOrToSql(ctx, table, query, quotedAs, true);\n\n if (checkIfHasExplicitWhere && sql) {\n checkIfHasExplicitWhere.value = true;\n }\n\n const data = Object.create(query);\n for (const key in query.scopes) {\n const scope = query.scopes[key];\n const scopeResult = scope(table.baseQuery);\n data.and = scopeResult.and;\n data.or = scopeResult.or;\n const scopeSql = andOrToSql(ctx, table, data, quotedAs, true);\n if (scopeSql) {\n sql = sql ? sql + ' AND ' + scopeSql : scopeSql;\n\n if (\n checkIfHasExplicitWhere &&\n key !== 'default' &&\n key !== 'nonDeleted'\n ) {\n checkIfHasExplicitWhere.value = true;\n }\n }\n }\n } else {\n sql = andOrToSql(ctx, table, query, quotedAs, parens);\n\n if (checkIfHasExplicitWhere && sql) {\n checkIfHasExplicitWhere.value = true;\n }\n }\n\n return sql;\n};\n\nconst andOrToSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n): string | undefined => {\n let sql;\n if (query.or) {\n const ors = query.and?.length ? [query.and, ...query.or] : query.or;\n sql = ors\n .map((and) => processAnds(and, ctx, table, query, quotedAs))\n .join(' OR ');\n } else if (query.and) {\n sql = processAnds(query.and, ctx, table, query, quotedAs);\n } else {\n return;\n }\n\n return parens && sql ? `(${sql})` : sql;\n};\n\nconst processAnds = (\n and: WhereItem[],\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataForWhere,\n quotedAs?: string,\n parens?: boolean,\n): string | undefined => {\n const ands: string[] = [];\n for (const data of and) {\n processWhere(ands, ctx, table, query, data, quotedAs);\n }\n if (!ands.length) return;\n\n const sql = ands.join(' AND ');\n return parens && ands.length > 1 ? `(${sql})` : sql;\n};\n\nconst processWhere = (\n ands: string[],\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n query: QueryDataWithLanguage,\n data: WhereItem,\n quotedAs?: string,\n) => {\n if ('prototype' in data || 'baseQuery' in data) {\n const query = data as Query;\n if (query.q.expr) {\n if (query.q.subQuery === 1) {\n ands.push(selectToSql(ctx, table, query.q, quotedAs));\n } else {\n const q = joinSubQuery(table, query);\n q.q.select = [query.q.expr];\n ands.push(`(${moveMutativeQueryToCte(ctx, q)})`);\n }\n } else {\n const as = getQueryAs(query);\n pushWhereToSql(ands, ctx, query, query.q, as && `\"${as}\"`, true);\n }\n return;\n }\n\n if (isExpression(data)) {\n ands.push(`(${data.toSQL(ctx, quotedAs)})`);\n return;\n }\n\n for (const key in data) {\n const value = (data as RecordUnknown)[key];\n if (value === undefined) continue;\n\n if (key === 'AND') {\n const arr = toArray(value as MaybeArray<WhereItem>);\n const sql = processAnds(arr, ctx, table, query, quotedAs);\n if (sql) ands.push(sql);\n } else if (key === 'OR') {\n const arr = (value as MaybeArray<WhereItem>[]).map(toArray);\n const sqls = arr.reduce<string[]>((acc, and) => {\n const sql = processAnds(and, ctx, table, query, quotedAs);\n if (sql) acc.push(sql);\n return acc;\n }, []);\n if (sqls.length) ands.push(`(${sqls.join(' OR ')})`);\n } else if (key === 'NOT') {\n const arr = toArray(value as MaybeArray<WhereItem>);\n ands.push(`NOT ${processAnds(arr, ctx, table, query, quotedAs, true)}`);\n } else if (key === 'ON') {\n if (Array.isArray(value)) {\n const item = value as WhereJsonPathEqualsItem;\n const leftColumn = columnToSqlNotSelect(\n ctx,\n query,\n query.selectShape,\n item[0],\n quotedAs,\n );\n\n const leftPath = item[1];\n const rightColumn = columnToSqlNotSelect(\n ctx,\n query,\n query.selectShape,\n item[2],\n quotedAs,\n );\n\n const rightPath = item[3];\n\n ands.push(\n `jsonb_path_query_first(${leftColumn}, ${addValue(\n ctx.values,\n leftPath,\n )}) = jsonb_path_query_first(${rightColumn}, ${addValue(\n ctx.values,\n rightPath,\n )})`,\n );\n } else {\n const item = value as WhereOnItem;\n const joinAs = `\"${getJoinItemSource(item.joinFrom)}\"`;\n\n const q: OnColumnToSQLQuery = item.useOuterAliases\n ? {\n joinedShapes: query.joinedShapes,\n aliases: _getQueryOuterAliases(query),\n selectShape: query.selectShape,\n }\n : query;\n\n ands.push(\n `${onColumnToSql(ctx, q, joinAs, item.from)} ${\n item.op || '='\n } ${onColumnToSql(ctx, q, joinAs, item.to)}`,\n );\n }\n } else if (key === 'IN') {\n toArray(value as MaybeArray<WhereInItem>).forEach((item) => {\n pushIn(ctx, query, ands, quotedAs, item);\n });\n } else if (key === 'EXISTS') {\n const joinItems = (\n Array.isArray((value as unknown[])[0]) ? value : [value]\n ) as JoinItemArgs[];\n\n const joinSet = joinItems.length > 1 ? new Set<string>() : null;\n\n for (const args of joinItems) {\n const { target, on } = processJoinItem(\n ctx,\n table,\n query,\n args,\n quotedAs,\n );\n\n const sql = `EXISTS (SELECT 1 FROM ${target}${\n on ? ` WHERE ${on}` : ''\n })`;\n if (joinSet) {\n if (joinSet.has(sql)) continue;\n joinSet.add(sql);\n }\n\n ands.push(sql);\n }\n } else if (key === 'SEARCH') {\n const search = value as WhereSearchItem;\n ands.push(`${search.vectorSQL} @@ \"${search.as}\"`);\n } else if (\n typeof value === 'object' &&\n value &&\n !(value instanceof Date) &&\n !Array.isArray(value)\n ) {\n whereExprOrQuery(ctx, ands, query, key, value, quotedAs);\n } else {\n const column = columnToSqlNotSelect(\n ctx,\n query,\n query.selectShape,\n key,\n quotedAs,\n );\n ands.push(\n `${column} ${\n value === null ? 'IS NULL' : `= ${addValue(ctx.values, value)}`\n }`,\n );\n }\n }\n};\n\nconst whereExprOrQuery = (\n ctx: ToSQLCtx,\n ands: string[],\n query: QueryDataForWhere,\n key: string,\n value: object,\n quotedAs?: string,\n) => {\n if (isExpression(value)) {\n ands.push(\n `${columnToSqlNotSelect(\n ctx,\n query,\n query.selectShape,\n key,\n quotedAs,\n )} = ${value.toSQL(ctx, quotedAs)}`,\n );\n } else {\n let column: Column.Pick.QueryColumn | undefined = query.selectShape[key];\n if (!column) {\n const index = key.indexOf('.');\n if (index === -1) {\n column = query.joinedShapes?.[key]?.value;\n } else if (index !== -1) {\n const table = key.slice(0, index);\n const name = key.slice(index + 1);\n const quoted = `\"${table}\"`;\n\n column = (\n quotedAs === quoted\n ? query.selectShape[name]\n : query.joinedShapes?.[table]?.[name]\n ) as typeof column;\n }\n }\n\n if (!column) {\n throw new Error(`Unknown column ${key} provided to condition`);\n }\n\n const quotedColumn = columnToSqlNotSelect(\n ctx,\n query,\n query.selectShape,\n key,\n quotedAs,\n );\n\n if (value instanceof ctx.qb.constructor) {\n const subQuerySql = moveMutativeQueryToCte(ctx, value as SubQueryForSql);\n\n ands.push(`${quotedColumn} = (${subQuerySql})`);\n } else {\n for (const op in value) {\n const operator = (column.operators as RecordUnknown)[op];\n if (!operator) {\n throw new Error(`Unknown operator ${op} provided to condition`);\n }\n\n if (value[op as keyof typeof value] === undefined) continue;\n\n ands.push(\n `${(operator as unknown as { _op: OperatorToSQL })._op(\n quotedColumn as string,\n value[op as keyof typeof value],\n ctx,\n quotedAs,\n )}`,\n );\n }\n }\n }\n};\n\ninterface OnColumnToSQLQuery {\n joinedShapes?: QueryData['joinedShapes'];\n aliases?: QueryData['aliases'];\n selectShape: ColumnsShape;\n select?: SelectItem[];\n}\n\nconst onColumnToSql = (\n ctx: ToSQLCtx,\n query: OnColumnToSQLQuery,\n joinAs: string,\n column: string,\n) => columnToSqlNotSelect(ctx, query, query.selectShape, column, joinAs);\n\nconst getJoinItemSource = (joinItem: WhereOnJoinItem) => {\n return typeof joinItem === 'string' ? joinItem : getQueryAs(joinItem);\n};\n\nconst pushIn = (\n ctx: ToSQLCtx,\n query: {\n selectShape: ColumnsShape;\n joinedShapes?: JoinedShapes;\n select?: SelectItem[];\n },\n ands: string[],\n quotedAs: string | undefined,\n arg: {\n columns: string[];\n values: unknown[][] | SubQueryForSql | Expression;\n },\n) => {\n // if there are multiple columns, make `(col1, col2) IN ((1, 2), (3, 4))`,\n // otherwise, make `col IN (1, 2, 3)`\n const multiple = arg.columns.length > 1;\n\n let value: string;\n\n if (Array.isArray(arg.values)) {\n value = `${arg.values\n .map(\n multiple\n ? (arr) =>\n `(${arr.map((value) => addValue(ctx.values, value)).join(', ')})`\n : (arr) =>\n `${arr.map((value) => addValue(ctx.values, value)).join(', ')}`,\n )\n .join(', ')}`;\n\n value = `(${value})`;\n } else if (isExpression(arg.values)) {\n value = arg.values.toSQL(ctx, quotedAs);\n } else {\n value = `(${moveMutativeQueryToCte(ctx, arg.values)})`;\n }\n\n const columnsSql = arg.columns\n .map((column) =>\n columnToSqlNotSelect(ctx, query, query.selectShape, column, quotedAs),\n )\n .join(', ');\n\n ands.push(`${multiple ? `(${columnsSql})` : columnsSql} IN ${value}`);\n};\n","export const MAX_BINDING_PARAMS = 65533;\n","import { pushWhereStatementSql } from '../where/where.sql';\nimport { SelectAsValue, SelectItem, selectToSql } from '../select/select.sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { pushQueryValueImmutable, QueryData } from '../../query-data';\nimport { Db } from '../../db';\nimport { RawSql } from '../../expressions/raw-sql';\nimport { MAX_BINDING_PARAMS } from '../../sql/sql-constants';\nimport {\n composeCteSingleSql,\n getTopCteSize,\n moveMutativeQueryToCte,\n setTopCteSize,\n} from '../cte/cte.sql';\nimport { Column } from '../../../columns/column';\nimport {\n addTableHook,\n HookPurpose,\n} from '../../extra-features/hooks/hooks.sql';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { moveQueryToCte } from '../cte/move-mutative-query-to-cte-base.sql';\nimport { isRelationQuery } from '../../relations';\nimport {\n getQueryRelationAliasForAs,\n quoteTableWithSchema,\n SingleSqlItem,\n Sql,\n} from '../../sql/sql';\nimport {\n addValue,\n emptyArray,\n pushOrNewArray,\n RecordUnknown,\n toArray,\n} from '../../../utils';\nimport { OrchidOrmInternalError } from '../../errors';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { HookSelect } from '../select/hook-select';\nimport { getPrimaryKeys } from '../../query-columns/primary-keys';\nimport { _clone } from '../clone/clone';\nimport { Query } from '../../query';\nimport {\n getShouldWrapMainQueryInCte,\n wrapMainQueryInCte,\n} from '../../sql/wrap-main-query-in-cte';\nimport {\n MutativeQueriesSelectRelationsSqlState,\n newMutativeQueriesSelectRelationsSqlState,\n handleInsertAndUpdateSelectRelationsSqlState,\n} from '../../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\nimport { ColumnsShape } from '../../../columns';\n\nexport type OnConflictTarget =\n | string\n | string[]\n | Expression\n | { constraint: string };\n\nexport type OnConflictSet = RecordUnknown;\n\nexport type OnConflictMerge = string | string[] | { except: string | string[] };\n\ninterface InsertSqlState {\n ctx: ToSQLCtx;\n q: ToSQLQuery;\n query: QueryData;\n quotedAs: string;\n returningQuotedAs: string;\n isSubSql?: boolean;\n relationSelectState?: MutativeQueriesSelectRelationsSqlState;\n returningPos: number;\n insertSql: string;\n selectFromSql?: string;\n}\n\ninterface InsertValuesSqlState extends InsertSqlState {\n valuesPrepend: string;\n valuesSql: string[];\n valuesAppend: string;\n}\n\nexport const makeInsertSql = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n query: QueryData,\n quotedAs: string,\n isSubSql?: boolean,\n): Sql => {\n let { columns } = query;\n const shape = q.shape as ColumnsShape;\n const { hookCreateSet } = query;\n const QueryClass = ctx.qb.constructor as unknown as Db;\n\n let { insertFrom, queryColumnsCount, values } = query;\n\n let hookSetSql: string | undefined;\n if (hookCreateSet) {\n ({ hookSetSql, columns, insertFrom, queryColumnsCount, values } =\n processHookSet(\n ctx,\n q,\n values,\n hookCreateSet,\n columns,\n QueryClass,\n quotedAs,\n ));\n }\n\n const quotedColumns = columns.map(\n (column) => `\"${shape[column]?.data.name || column}\"`,\n );\n\n let runtimeDefaults: (() => unknown)[] | undefined;\n let runtimeDefaultColumns: string[] | undefined;\n if (q.internal.runtimeDefaultColumns) {\n runtimeDefaults = [];\n runtimeDefaultColumns = [];\n for (const key of q.internal.runtimeDefaultColumns) {\n if (!columns.includes(key)) {\n const column = shape[key];\n columns.push(key);\n quotedColumns.push(`\"${column.data.name || key}\"`);\n runtimeDefaults.push(column.data.runtimeDefault as () => unknown);\n runtimeDefaultColumns.push(key);\n }\n }\n }\n\n if (quotedColumns.length === 0) {\n const key = Object.keys(q.shape)[0];\n if (key) {\n const column = q.shape[key] as unknown as Column.Pick.Data;\n quotedColumns[0] = `\"${column?.data.name || key}\"`;\n\n // for `create({})` case: `{}` is transformed into `[[]]`,\n // we replace it with `[[undefined]]`, and it generates SQL `VALUES (DEFAULT)`\n if (Array.isArray(values) && Array.isArray(values[0])) {\n values = values.map(() => [undefined]);\n }\n }\n }\n\n // `insertWith` queries are applied only once, need to ignore if `ctx.hasNonSelect` is changed below.\n const hasNonSelect = ctx.hasNonSelect;\n const returningQuotedAs = query.as ? `\"${query.as}\"` : quotedAs;\n const insertAlias = getQueryRelationAliasForAs(q, query.as);\n quotedAs = insertAlias || quotedAs;\n\n const sqlState: InsertSqlState = {\n ctx,\n q,\n query,\n quotedAs,\n returningQuotedAs,\n isSubSql,\n returningPos: 0,\n insertSql: `INSERT INTO ${quoteTableWithSchema(q)}${\n insertAlias ? ` AS ${insertAlias}` : ''\n }${quotedColumns.length ? '(' + quotedColumns.join(', ') + ')' : ''}`,\n };\n ctx.sql.push(null as never, null as never);\n\n const hasOnConflictWhere = pushOnConflictSql(\n ctx,\n q,\n query,\n quotedAs,\n columns,\n quotedColumns,\n runtimeDefaultColumns,\n );\n\n const upsert = query.type === 'upsert';\n\n if (upsert || (insertFrom && !isRelationQuery(q)) || hasOnConflictWhere) {\n pushWhereStatementSql(ctx, q, query, quotedAs);\n }\n\n sqlState.relationSelectState = newMutativeQueriesSelectRelationsSqlState(q);\n\n sqlState.returningPos = ctx.sql.length;\n\n let insertManyFromValuesAs: string | undefined;\n if (insertFrom) {\n if (values.length < 2) {\n const q = insertFrom.clone();\n\n if (values[0]?.length) {\n pushQueryValueImmutable(\n q,\n 'select',\n new RawSql(\n encodeRow(\n ctx,\n ctx.values,\n QueryClass,\n values[0],\n runtimeDefaults,\n quotedAs,\n ),\n ),\n );\n }\n\n ctx.sql[1] = moveMutativeQueryToCte(ctx, q);\n } else {\n const { as, makeSelectList } = moveQueryToCte(\n ctx,\n insertFrom,\n insertFrom.q.type,\n );\n\n const selectList = makeSelectList(true);\n\n insertManyFromValuesAs = query.insertValuesAs;\n selectList.push(\n ...columns.slice(queryColumnsCount || 0).map((key) => {\n const column = shape[key];\n return column\n ? `${insertManyFromValuesAs}.\"${column.data.name || key}\"::${\n column.dataType\n }`\n : `${insertManyFromValuesAs}.\"${key}\"`;\n }),\n );\n\n sqlState.selectFromSql = ` SELECT ${selectList.join(', ')} FROM \"${as}\",`;\n }\n }\n\n if (!insertFrom || insertManyFromValuesAs) {\n const valuesSqlState = sqlState as InsertValuesSqlState;\n valuesSqlState.valuesSql = [];\n valuesSqlState.valuesPrepend =\n (insertManyFromValuesAs ? '(' : '') + (upsert ? 'SELECT ' : 'VALUES ');\n valuesSqlState.valuesAppend = insertManyFromValuesAs\n ? `) ${insertManyFromValuesAs}(${quotedColumns\n .slice(queryColumnsCount || 0)\n .join(', ')})`\n : '';\n\n let ctxValues = ctx.values;\n const restValuesLen = ctxValues.length;\n let currentValuesLen = restValuesLen;\n let batch: SingleSqlItem[] | undefined;\n const { skipBatchCheck } = ctx;\n\n for (let i = 0; i < values.length; i++) {\n const topCteSize = getTopCteSize(ctx);\n\n ctx.skipBatchCheck = true;\n\n let encodedRow = encodeRow(\n ctx,\n ctxValues,\n QueryClass,\n values[i],\n runtimeDefaults,\n quotedAs,\n hookSetSql,\n );\n ctx.skipBatchCheck = skipBatchCheck;\n\n if (!upsert) encodedRow = '(' + encodedRow + ')';\n\n if (ctxValues.length > MAX_BINDING_PARAMS) {\n if (ctxValues.length - currentValuesLen > MAX_BINDING_PARAMS) {\n throw new Error(\n `Too many parameters for a single insert row, max is ${MAX_BINDING_PARAMS}`,\n );\n }\n\n if (!skipBatchCheck) {\n setTopCteSize(ctx, topCteSize);\n\n // save current batch\n applySqlState(sqlState);\n\n ctxValues.length = currentValuesLen;\n\n batch = pushOrNewArray(batch, composeCteSingleSql(ctx));\n\n // reset sql and values for the next batch, repeat the last cycle\n ctx.topCtx.topCTE = undefined;\n ctxValues = ctx.values = [];\n valuesSqlState.valuesSql.length = 0;\n i--;\n continue;\n }\n }\n\n currentValuesLen = ctxValues.length;\n valuesSqlState.valuesSql.push(encodedRow);\n }\n\n if (batch) {\n if (hasNonSelect) {\n throw new OrchidOrmInternalError(\n q,\n `Cannot insert many records when having a non-select sub-query`,\n );\n }\n\n applySqlState(sqlState);\n\n batch.push(composeCteSingleSql(ctx));\n\n handleInsertAndUpdateSelectRelationsSqlState(\n ctx,\n sqlState.relationSelectState,\n );\n\n return {\n batch,\n };\n }\n }\n\n applySqlState(sqlState);\n\n handleInsertAndUpdateSelectRelationsSqlState(\n ctx,\n sqlState.relationSelectState,\n );\n\n return {\n text: ctx.sql.join(' '),\n values: ctx.values,\n };\n};\n\nconst pushOnConflictSql = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n query: QueryData,\n quotedAs: string,\n columns: string[],\n quotedColumns: string[],\n runtimeDefaultColumns?: string[],\n): boolean => {\n if (!query.onConflict) return false;\n\n const shape = q.shape as ColumnsShape;\n\n ctx.sql.push('ON CONFLICT');\n\n const { target } = query.onConflict;\n if (target) {\n if (typeof target === 'string') {\n ctx.sql.push(`(\"${shape[target]?.data.name || target}\")`);\n } else if (Array.isArray(target)) {\n ctx.sql.push(\n `(${target.reduce(\n (sql, item, i) =>\n sql + (i ? ', ' : '') + `\"${shape[item]?.data.name || item}\"`,\n '',\n )})`,\n );\n } else if ('toSQL' in target) {\n ctx.sql.push(target.toSQL(ctx, quotedAs));\n } else {\n ctx.sql.push(`ON CONSTRAINT \"${target.constraint}\"`);\n }\n }\n\n // merge: undefined should also be handled by this `if`\n if ('merge' in query.onConflict) {\n let sql: string;\n\n const { merge } = query.onConflict;\n if (merge) {\n if (typeof merge === 'string') {\n const name = shape[merge]?.data.name || merge;\n sql = `DO UPDATE SET \"${name}\" = excluded.\"${name}\"`;\n } else if ('except' in merge) {\n sql = mergeColumnsSql(columns, quotedColumns, target, [\n ...toArray(merge.except),\n ...(runtimeDefaultColumns || emptyArray),\n ]);\n } else {\n sql = `DO UPDATE SET ${merge.reduce((sql, item, i) => {\n const name = shape[item]?.data.name || item;\n return sql + (i ? ', ' : '') + `\"${name}\" = excluded.\"${name}\"`;\n }, '')}`;\n }\n } else {\n sql = mergeColumnsSql(\n columns,\n quotedColumns,\n target,\n runtimeDefaultColumns,\n );\n }\n\n ctx.sql.push(sql);\n return true;\n } else if (query.onConflict.set) {\n const { set } = query.onConflict;\n const arr: string[] = [];\n for (const key in set) {\n const val = set[key];\n const value = isExpression(val)\n ? val.toSQL(ctx, quotedAs)\n : addValue(ctx.values, val);\n\n arr.push(`\"${shape[key]?.data.name || key}\" = ${value}`);\n }\n\n ctx.sql.push('DO UPDATE SET', arr.join(', '));\n return true;\n } else {\n ctx.sql.push('DO NOTHING');\n return false;\n }\n};\n\nconst applySqlState = (\n sqlState: InsertSqlState | InsertValuesSqlState,\n): void => {\n const { ctx } = sqlState;\n\n const insertSql = sqlState.selectFromSql\n ? sqlState.insertSql + sqlState.selectFromSql\n : sqlState.insertSql;\n\n const wrapInCte = getShouldWrapMainQueryInCte(\n ctx,\n sqlState.query,\n 'insert',\n sqlState.isSubSql,\n );\n\n if ('valuesSql' in sqlState) {\n ctx.sql[1] =\n sqlState.valuesPrepend +\n sqlState.valuesSql.join(', ') +\n sqlState.valuesAppend;\n }\n\n const returning = makeReturningSql(\n ctx,\n sqlState.q,\n sqlState.query,\n sqlState.returningQuotedAs,\n sqlState.relationSelectState,\n 'Create',\n undefined,\n sqlState.isSubSql || !!ctx.topCtx.cteHooks,\n );\n\n if (returning) {\n ctx.sql[sqlState.returningPos] = 'RETURNING ' + returning;\n }\n\n ctx.sql[0] = insertSql;\n\n if (wrapInCte) {\n wrapMainQueryInCte(ctx, sqlState.query);\n }\n};\n\nconst processHookSet = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n values: unknown[][],\n hookCreateSet: RecordUnknown[],\n columns: string[],\n QueryClass: Db,\n quotedAs: string,\n): {\n hookSetSql?: string | undefined;\n columns: string[];\n insertFrom?: SubQueryForSql;\n queryColumnsCount?: number;\n values: unknown[][];\n} => {\n const hookSet: RecordUnknown = {};\n for (const item of hookCreateSet) {\n Object.assign(hookSet, item);\n }\n\n const addHookSetColumns = Object.keys(hookSet).filter(\n (key) => !columns.includes(key),\n );\n\n let insertFrom = q.q.insertFrom;\n if (insertFrom) {\n const newColumns = new Set<string>();\n const originalSelect = insertFrom.q.select;\n if (originalSelect) {\n insertFrom = _clone(insertFrom) as unknown as SubQueryForSql;\n const select: SelectItem[] = [];\n for (const s of originalSelect) {\n if (typeof s === 'string' && !hookSet[s]) {\n select.push(s);\n newColumns.add(s);\n } else if (typeof s === 'object' && 'selectAs' in s) {\n const filtered: SelectAsValue = {};\n for (const key in s.selectAs) {\n if (!hookSet[key]) {\n filtered[key] = s.selectAs[key];\n newColumns.add(key);\n }\n }\n select.push({ selectAs: filtered });\n }\n }\n insertFrom.q.select = select;\n }\n\n if (values.length) {\n const newValues: unknown[][] = [];\n\n const valuesColumnsSet = new Set<string>();\n values.forEach((originalRow, i) => {\n const valuesColumns = columns.slice(-originalRow.length);\n const row: unknown[] = [];\n newValues[i] = row;\n valuesColumns.forEach((c, i) => {\n if (!hookSet[c] && !newColumns.has(c)) {\n valuesColumnsSet.add(c);\n row.push(originalRow[i]);\n }\n });\n });\n\n for (const valueColumn of valuesColumnsSet) {\n newColumns.add(valueColumn);\n }\n\n values = newValues;\n } else {\n values = [[]];\n }\n\n columns.forEach((column) => {\n if (column in hookSet) {\n newColumns.add(column);\n\n const fromHook = {\n fromHook: encodeValue(\n ctx,\n ctx.values,\n QueryClass,\n hookSet[column],\n quotedAs,\n ),\n };\n\n for (const row of values) {\n row.push(fromHook);\n }\n }\n });\n\n const queryColumnsCount = insertFrom.q.select?.length;\n\n if (addHookSetColumns) {\n for (const key of addHookSetColumns) {\n for (const row of values) {\n row.push({\n fromHook: encodeValue(\n ctx,\n ctx.values,\n QueryClass,\n hookSet[key],\n quotedAs,\n ),\n });\n }\n }\n\n return {\n columns: [...newColumns, ...addHookSetColumns],\n insertFrom,\n queryColumnsCount,\n values,\n };\n }\n\n return { columns: [...newColumns], insertFrom, queryColumnsCount, values };\n }\n\n columns.forEach((column, i) => {\n if (column in hookSet) {\n const fromHook = {\n fromHook: encodeValue(\n ctx,\n ctx.values,\n QueryClass,\n hookSet[column],\n quotedAs,\n ),\n };\n for (const row of values) {\n row[i] = fromHook;\n }\n }\n });\n\n const hookSetSql = addHookSetColumns\n .map((key) =>\n encodeValue(\n ctx,\n ctx.values,\n QueryClass,\n (hookSet as RecordUnknown)[key],\n quotedAs,\n ),\n )\n .join(', ');\n\n return {\n hookSetSql,\n columns: addHookSetColumns ? [...columns, ...addHookSetColumns] : columns,\n values,\n };\n};\n\nconst mergeColumnsSql = (\n columns: string[],\n quotedColumns: string[],\n target: OnConflictTarget | undefined,\n except?: string[],\n): string => {\n const notExcluded: string[] = [];\n\n const exclude =\n typeof target === 'string'\n ? [target]\n : Array.isArray(target)\n ? [...target]\n : [];\n\n if (except) {\n if (typeof except === 'string') {\n exclude.push(except);\n } else {\n exclude.push(...except);\n }\n }\n\n for (let i = 0; i < columns.length; i++) {\n if (!exclude.includes(columns[i])) {\n notExcluded.push(quotedColumns[i]);\n }\n }\n\n return notExcluded.length\n ? `DO UPDATE SET ${notExcluded\n .map((column) => `${column} = excluded.${column}`)\n .join(', ')}`\n : // update whatever is the first column because DO NOTHING prevents RETURNING,\n // and we might want to return data from the insert\n `DO UPDATE SET ${quotedColumns[0]} = excluded.${quotedColumns[0]}`;\n};\n\nconst encodeRow = (\n ctx: ToSQLCtx,\n values: unknown[],\n QueryClass: Db,\n row: unknown[],\n runtimeDefaults?: (() => unknown)[],\n quotedAs?: string,\n hookSetSql?: string,\n) => {\n const arr = row.map((value) =>\n encodeValue(ctx, values, QueryClass, value, quotedAs),\n );\n\n if (runtimeDefaults) {\n for (const fn of runtimeDefaults) {\n arr.push(addValue(values, fn()));\n }\n }\n\n if (hookSetSql) arr.push(hookSetSql);\n\n return arr.join(', ');\n};\n\nconst encodeValue = (\n ctx: ToSQLCtx,\n values: unknown[],\n QueryClass: Db,\n value: unknown,\n quotedAs?: string,\n) => {\n if (value && typeof value === 'object') {\n if (isExpression(value)) {\n return value.toSQL(ctx, quotedAs);\n } else if (value instanceof (QueryClass as never)) {\n return `(${moveMutativeQueryToCte(ctx, value as SubQueryForSql)})`;\n } else if ('fromHook' in value) {\n return value.fromHook as string;\n }\n }\n\n return value === undefined ? 'DEFAULT' : addValue(values, value);\n};\n\nexport const makeReturningSql = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n data: QueryData,\n quotedAs: string,\n relationSelectState: MutativeQueriesSelectRelationsSqlState | undefined,\n hookPurpose?: HookPurpose,\n addHookPurpose?: HookPurpose,\n isSubSql?: boolean,\n): string | undefined => {\n const hookSelect = hookPurpose && data[`after${hookPurpose}Select`];\n\n const { select } = data;\n if (!q.q.hookSelect && !hookSelect?.size && !select?.length && !hookPurpose) {\n const select = hookSelect && new Map();\n\n addTableHook(ctx, q, q.q, select);\n\n ctx.selectedCount = 1;\n return returnSqlOrNull(ctx, q, isSubSql);\n }\n\n const otherCTEHookSelect =\n addHookPurpose && data[`after${addHookPurpose}Select`];\n\n let tempSelect: HookSelect | undefined;\n if (\n q.q.hookSelect ||\n hookSelect ||\n otherCTEHookSelect ||\n q.q.selectRelation\n ) {\n tempSelect = new Map(q.q.hookSelect);\n\n if (hookSelect) {\n for (const column of hookSelect) {\n if (!tempSelect.has(column)) {\n tempSelect.set(column, { select: column });\n }\n }\n }\n\n if (otherCTEHookSelect) {\n for (const column of otherCTEHookSelect) {\n if (!tempSelect.has(column)) {\n tempSelect.set(column, { select: column });\n }\n }\n }\n\n // delete loads relations in a CTE\n if (q.q.selectRelation && hookPurpose !== 'Delete') {\n for (const column of getPrimaryKeys(q as Query)) {\n if (!tempSelect.has(column)) {\n tempSelect.set(column, { select: column });\n }\n }\n }\n }\n\n let sql: string | undefined;\n if (tempSelect?.size || select?.length) {\n sql = selectToSql(\n ctx,\n q,\n data,\n quotedAs,\n tempSelect,\n isSubSql,\n undefined,\n undefined,\n relationSelectState,\n );\n }\n\n addTableHook(ctx, q, data, tempSelect, hookPurpose);\n\n if (!sql) ctx.selectedCount = 1;\n\n return returnSqlOrNull(ctx, q, isSubSql, sql);\n};\n\nconst returnSqlOrNull = (\n ctx: ToSQLCtx,\n q: ToSQLQuery,\n isSubSql?: boolean,\n sql?: string,\n): string | undefined => {\n return (\n sql ||\n (isSubSql || ctx.topCtx.cteHooks || q.q.appendQueries ? 'NULL' : undefined)\n );\n};\n","import { QueryData } from '../../query-data';\nimport { queryTypeWithLimitOne } from '../../query';\nimport { addValue } from '../../../utils';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { ToSQLCtx } from '../../sql/to-sql';\n\nexport function pushLimitOffsetSql(\n ctx: ToSQLCtx,\n query: QueryData,\n fromQuery?: SubQueryForSql,\n) {\n if (query.useFromLimitOffset) {\n const q = fromQuery?.q as QueryData;\n if (q.limit) {\n ctx.sql.push(`LIMIT ${addValue(ctx.values, q.limit)}`);\n }\n if (q.offset) {\n ctx.sql.push(`OFFSET ${addValue(ctx.values, q.offset)}`);\n }\n } else {\n pushLimitSQL(ctx.sql, ctx.values, query);\n\n if (query.offset && !query.returnsOne) {\n ctx.sql.push(`OFFSET ${addValue(ctx.values, query.offset)}`);\n }\n }\n}\n\nexport function pushLimitSQL(sql: string[], values: unknown[], q: QueryData) {\n if (!q.returnsOne) {\n if (queryTypeWithLimitOne[q.returnType as string] && !q.returning) {\n sql.push(`LIMIT 1`);\n } else if (q.limit) {\n sql.push(`LIMIT ${addValue(values, q.limit)}`);\n }\n }\n}\n","import { makeReturningSql } from './insert.sql';\nimport { pushWhereStatementSql, whereToSql } from '../where/where.sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport {\n QueryData,\n UpdateManyQueryData,\n UpdateQueryDataItem,\n UpdateQueryDataObject,\n} from '../../query-data';\nimport { Db } from '../../db';\nimport { selectToSql } from '../select/select.sql';\nimport { countSelect } from '../../expressions/raw-sql';\nimport { Query } from '../../query';\nimport { JoinItemArgs, processJoinItem } from '../join/join.sql';\nimport { moveMutativeQueryToCte, setFreeTopCteAs } from '../cte/cte.sql';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { pushLimitSQL } from '../limit-offset/limit-offset.sql';\nimport {\n getQueryRelationAliasForAs,\n makeSql,\n quoteTableWithSchema,\n Sql,\n} from '../../sql/sql';\nimport {\n addValue,\n emptyObject,\n pushOrNewArray,\n RecordUnknown,\n} from '../../../utils';\nimport { isExpression } from '../../expressions/expression';\nimport { throwOnReadOnlyUpdate } from '../../query.utils';\nimport { OrchidOrmInternalError } from '../../errors';\nimport { ensureCTECount } from '../../extra-features/hooks/hooks.sql';\nimport {\n MutativeQueriesSelectRelationsSqlState,\n newMutativeQueriesSelectRelationsSqlState,\n handleInsertAndUpdateSelectRelationsSqlState,\n restoreValuesJoinedAsForMutativeSelectRelations,\n unsetValuesJoinedAsForMutativeSelectRelations,\n} from '../../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\nimport { ColumnsShape } from 'pqb/index';\n\nexport const pushUpdateSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n isSubSql?: boolean,\n): Sql => {\n const valuesJoinedAs = unsetValuesJoinedAsForMutativeSelectRelations(query);\n\n try {\n return pushUpdateSqlWithoutValuesJoinedAs(\n ctx,\n query,\n q,\n quotedAs,\n isSubSql,\n );\n } finally {\n restoreValuesJoinedAsForMutativeSelectRelations(query, valuesJoinedAs);\n }\n};\n\nconst pushUpdateSqlWithoutValuesJoinedAs = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n isSubSql?: boolean,\n): Sql => {\n const from = quoteTableWithSchema(query);\n const alias = getQueryRelationAliasForAs(query, q.as);\n quotedAs = alias || quotedAs;\n\n const set: string[] = [];\n\n const hookSet = q.hookUpdateSet\n ? Object.fromEntries(\n q.hookUpdateSet.flatMap((item) => Object.entries(item)),\n )\n : emptyObject;\n\n const relationSelectState = newMutativeQueriesSelectRelationsSqlState(query);\n\n // User can use `set({ key: 'value' })` multiple times,\n // `usedSetKeys` is here to track what keys were already added to SQL to not add them twice.\n const usedSetKeys = new Set<string>();\n\n // Applies `hookSet`: key-values that should be set by the update hooks.\n // Adds SQL key-value pairs into `set` array.\n // Must be applied before other `set` data: the earlier one takes precedence.\n if (q.hookUpdateSet) {\n applySet(ctx, query, set, hookSet, emptyObject, usedSetKeys, quotedAs);\n }\n\n // updateData is array of update sets that's coming from `set`, `updateMany`, also `timestamps` logic are adding to it,\n // `processData` processes it into `set` array of SQL strings for key-value pairs.\n if (q.updateData) {\n processData(ctx, query, set, q.updateData, hookSet, usedSetKeys, quotedAs);\n }\n\n let updateManyValuesSql;\n if (q.updateMany) {\n for (const key of q.updateMany.primaryKeys) {\n usedSetKeys.add(key);\n }\n\n updateManyValuesSql = makeUpdateManyValuesSql(\n ctx,\n query,\n q.updateMany,\n set,\n usedSetKeys,\n quotedAs,\n );\n }\n\n // If nothing to set, make a SELECT query\n if (!set.length) {\n pushSelectForEmptySet(\n ctx,\n query,\n q,\n quotedAs,\n from,\n isSubSql,\n updateManyValuesSql,\n relationSelectState,\n );\n } else {\n ctx.sql.push(`UPDATE ${from}`);\n\n if (alias) {\n ctx.sql.push(alias);\n }\n\n ctx.sql.push('SET', set.join(', '));\n\n let fromWhereSql;\n\n if (updateManyValuesSql) {\n if (q.updateMany?.strict) {\n addUpdateManyCteForStrict(ctx, q.updateMany);\n }\n\n ctx.sql.push('FROM', updateManyValuesSql);\n } else if (q.updateFrom) {\n fromWhereSql = pushUpdateFromSql(ctx, query, q, quotedAs, q.updateFrom);\n }\n\n pushUpdateWhereSql(\n ctx,\n query,\n q,\n quotedAs,\n updateManyValuesSql || q.updateFrom,\n fromWhereSql,\n );\n\n pushUpdateReturning(\n ctx,\n query,\n q,\n quotedAs,\n 'RETURNING',\n relationSelectState,\n isSubSql,\n );\n }\n\n handleInsertAndUpdateSelectRelationsSqlState(ctx, relationSelectState);\n\n return makeSql(ctx, 'update', isSubSql);\n};\n\nconst pushSelectForEmptySet = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n from: string,\n isSubSql?: boolean,\n updateManyValuesSql?: string,\n relationSelectState?: MutativeQueriesSelectRelationsSqlState,\n) => {\n if (!q.select) {\n q.select = countSelect;\n }\n\n pushUpdateReturning(\n ctx,\n query,\n q,\n quotedAs,\n 'SELECT',\n relationSelectState,\n isSubSql,\n );\n\n let fromSql = `FROM ${from}`;\n\n const alias = getQueryRelationAliasForAs(query, q.as);\n if (alias) {\n fromSql += ` ${alias}`;\n }\n\n if (updateManyValuesSql) {\n fromSql += `, ${updateManyValuesSql}`;\n }\n\n ctx.sql.push(fromSql);\n pushWhereStatementSql(ctx, query, q, quotedAs);\n pushLimitSQL(ctx.sql, ctx.values, q);\n};\n\n// For strict variants, set up CTE infrastructure\nconst addUpdateManyCteForStrict = (\n ctx: ToSQLCtx,\n updateMany: UpdateManyQueryData,\n) => {\n const wrapAs = setFreeTopCteAs(ctx);\n ctx.wrapAs = wrapAs;\n ensureCTECount(ctx, wrapAs, { count: updateMany.data.length });\n};\n\nconst pushUpdateFromSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n updateFrom: JoinItemArgs,\n): string | undefined => {\n const { target, on } = processJoinItem(ctx, query, q, updateFrom, quotedAs);\n\n ctx.sql.push(`FROM ${target}`);\n\n let fromWhereSql = on;\n\n if (q.join) {\n const joinSet = q.join.length > 1 ? new Set<string>() : null;\n\n for (const item of q.join) {\n const { target, on } = processJoinItem(\n ctx,\n query,\n q,\n item.args,\n quotedAs,\n );\n\n if (joinSet) {\n const key = `${item.type}${target}${on}`;\n if (joinSet.has(key)) continue;\n joinSet.add(key);\n }\n\n ctx.sql.push(`${item.type} ${target} ON true`);\n\n if (on) {\n fromWhereSql = fromWhereSql ? fromWhereSql + ' AND ' + on : on;\n }\n }\n }\n\n return fromWhereSql;\n};\n\nconst pushUpdateWhereSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n from?: unknown,\n fromWhereSql?: string,\n): void => {\n const checkIfHasExplicitWhere: { value?: true } | undefined =\n q.all || from ? undefined : {};\n const mainWhereSql = whereToSql(\n ctx,\n query,\n q,\n quotedAs,\n undefined,\n checkIfHasExplicitWhere,\n );\n\n if (checkIfHasExplicitWhere && !checkIfHasExplicitWhere.value) {\n throw new OrchidOrmInternalError(\n query as Query,\n `Dangerous update without conditions`,\n );\n }\n\n const whereSql = mainWhereSql\n ? fromWhereSql\n ? mainWhereSql + ' AND ' + fromWhereSql\n : mainWhereSql\n : fromWhereSql;\n if (whereSql) {\n ctx.sql.push('WHERE', whereSql);\n }\n};\n\nconst pushUpdateReturning = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n keyword: string,\n relationSelectState: MutativeQueriesSelectRelationsSqlState | undefined,\n isSubSql?: boolean,\n) => {\n const returning = makeReturningSql(\n ctx,\n query,\n q,\n quotedAs,\n relationSelectState,\n 'Update',\n undefined,\n isSubSql,\n );\n\n if (returning) ctx.sql.push(keyword, returning);\n};\n\nconst processData = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n set: string[],\n data: UpdateQueryDataItem[],\n hookSet: RecordUnknown,\n usedSetKeys: Set<string>,\n quotedAs?: string,\n) => {\n let append: UpdateQueryDataItem[] | undefined;\n\n for (let i = data.length - 1; i >= 0; i--) {\n const item = data[i];\n if (typeof item === 'function') {\n const result = item(data);\n if (result) append = pushOrNewArray(append, result);\n } else {\n applySet(ctx, query, set, item, hookSet, usedSetKeys, quotedAs);\n }\n }\n\n if (append) {\n processData(ctx, query, set, append, hookSet, usedSetKeys, quotedAs);\n }\n};\n\nconst applySet = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n set: string[],\n item: UpdateQueryDataObject,\n skipColumns: RecordUnknown,\n usedSetKeys: Set<string>,\n quotedAs?: string,\n) => {\n const QueryClass = ctx.qb.constructor as unknown as Db;\n const shape = query.shape as ColumnsShape;\n\n for (const key in item) {\n if (usedSetKeys.has(key)) {\n continue;\n }\n\n usedSetKeys.add(key);\n\n const value = item[key];\n if (value === undefined || key in skipColumns) continue;\n\n set.push(\n `\"${shape[key].data.name || key}\" = ${processValue(\n ctx,\n query,\n QueryClass,\n key,\n value,\n quotedAs,\n )}`,\n );\n }\n};\n\nconst processValue = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n QueryClass: Db,\n key: string,\n value: UpdateQueryDataObject[string],\n quotedAs?: string,\n) => {\n if (value && typeof value === 'object') {\n if (isExpression(value)) {\n return value.toSQL(ctx, quotedAs);\n } else if (value instanceof (QueryClass as never)) {\n const subQuery = value as Query;\n if (subQuery.q.subQuery === 1) {\n return selectToSql(ctx, query, subQuery.q, quotedAs);\n }\n\n return `(${moveMutativeQueryToCte(\n ctx,\n subQuery as unknown as SubQueryForSql,\n )})`;\n } else if ('op' in value && 'arg' in value) {\n return `\"${(query.shape as ColumnsShape)[key].data.name || key}\" ${\n (value as { op: string }).op\n } ${addValue(ctx.values, (value as { arg: unknown }).arg)}`;\n }\n }\n\n return addValue(ctx.values, value);\n};\n\n// Build FROM (VALUES ...) \"v\"(\"col1\", \"col2\")\nconst makeUpdateManyValuesSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n updateMany: UpdateManyQueryData,\n set: string[],\n usedSetKeys: Set<string>,\n quotedAs: string,\n) => {\n const shape = query.shape as ColumnsShape;\n\n const keysSet = new Set<string>();\n const valueRows: string[] = [];\n const quotedColumnNames: string[] = [];\n const { data } = updateMany;\n\n for (let i = 0; i < data.length; i++) {\n const row = data[i];\n const cells: string[] = [];\n let keysInRow = 0;\n\n for (const key in row) {\n let value = row[key];\n if (value === undefined) {\n continue;\n }\n\n const column = shape[key];\n const columnName = column.data.name || key;\n\n if (column.data.virtual) continue;\n throwOnReadOnlyUpdate(query, column, key);\n\n keysInRow++;\n\n if (isExpression(value)) {\n cells.push(value.toSQL(ctx, quotedAs));\n } else {\n if (column.data.encode && value !== null) {\n value = column.data.encode(value);\n }\n\n cells.push(addValue(ctx.values, value));\n }\n\n // Cast the first VALUES row so Postgres can infer column types,\n // and collect the alias column names once.\n if (i === 0) {\n keysSet.add(key);\n cells[cells.length - 1] += `::${column.dataType}`;\n quotedColumnNames.push(`\"${columnName}\"`);\n\n if (!usedSetKeys.has(key)) {\n set.push(`\"${shape[key].data.name || key}\" = \"v\".\"${columnName}\"`);\n }\n } else if (!keysSet.has(key)) {\n throwOnDifferentColumns(query, keysSet, row, i);\n }\n }\n\n if (keysInRow < keysSet.size) {\n throwOnDifferentColumns(query, keysSet, row, i);\n }\n\n valueRows.push(`(${cells.join(', ')})`);\n }\n\n return `(VALUES ${valueRows.join(', ')}) \"v\"(${quotedColumnNames.join(\n ', ',\n )})`;\n};\n\nconst throwOnDifferentColumns = (\n query: ToSQLQuery,\n keysSet: Set<string>,\n row: RecordUnknown,\n i: number,\n) => {\n throw new OrchidOrmInternalError(\n query,\n `Row ${i} has different columns than row 0. Expected: [${[...keysSet].join(\n ', ',\n )}], got: [${Object.keys(row).join(', ')}]`,\n );\n};\n","import { pushWhereStatementSql } from '../where/where.sql';\nimport { makeReturningSql } from './insert.sql';\nimport { processJoinItem } from '../join/join.sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { QueryData } from '../../query-data';\nimport { Query } from '../../query';\nimport { isRelationQuery } from '../../relations';\nimport { OrchidOrmInternalError } from '../../errors';\nimport {\n getQueryRelationAliasForAs,\n makeSql,\n quoteTableWithSchema,\n Sql,\n} from '../../sql/sql';\nimport {\n handleDeleteSelectRelationsSqlState,\n newMutativeQueriesSelectRelationsSqlState,\n} from '../../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\nimport { anyShape } from '../../../columns';\n\nexport const pushDeleteSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n q: QueryData,\n quotedAs: string,\n isSubSql?: boolean,\n): Sql => {\n const from = quoteTableWithSchema(query);\n ctx.sql.push(`DELETE FROM ${from}`);\n\n const alias = getQueryRelationAliasForAs(query, q.as);\n if (alias) {\n ctx.sql.push(alias);\n }\n\n const relationSelectState = newMutativeQueriesSelectRelationsSqlState(query);\n\n let returning = makeReturningSql(\n ctx,\n query,\n q,\n quotedAs,\n relationSelectState,\n 'Delete',\n undefined,\n isSubSql,\n );\n\n const selectRelations = handleDeleteSelectRelationsSqlState(\n ctx,\n query,\n relationSelectState,\n );\n\n let join = q.join;\n if (selectRelations) {\n returning =\n (returning ? returning + ', ' : '') + selectRelations.addReturning;\n\n join = join ? [...join, selectRelations.join] : [selectRelations.join];\n\n q = {\n ...q,\n joinedShapes: {\n ...q.joinedShapes,\n [selectRelations.joinedShape]: anyShape,\n },\n };\n }\n\n let conditions: string | undefined;\n if (join?.length) {\n const targets: string[] = [];\n const ons: string[] = [];\n\n const joinSet = join.length > 1 ? new Set<string>() : null;\n\n for (const item of join) {\n const lateral = 'l' in item.args && item.args.l;\n if (lateral) {\n if (isRelationQuery(lateral)) {\n continue;\n }\n\n throw new OrchidOrmInternalError(\n query as Query,\n 'Join lateral is not supported in delete',\n );\n }\n\n const join = processJoinItem(ctx, query, q, item.args, quotedAs);\n\n const key = `${join.target}${join.on}`;\n if (joinSet) {\n if (joinSet.has(key)) continue;\n joinSet.add(key);\n }\n targets.push(join.target);\n if (join.on) ons.push(join.on);\n }\n\n if (targets.length) {\n ctx.sql.push(`USING ${targets.join(', ')}`);\n }\n\n conditions = ons.join(' AND ');\n }\n\n let checkIfHasExplicitWhere: { value?: boolean } | undefined;\n\n if (!selectRelations?.movedWhereToCte) {\n checkIfHasExplicitWhere = {};\n pushWhereStatementSql(ctx, query, q, quotedAs, checkIfHasExplicitWhere);\n }\n\n if (conditions) {\n if (\n !selectRelations?.movedWhereToCte &&\n (q.and?.length || q.or?.length || q.scopes)\n ) {\n ctx.sql.push('AND', conditions);\n } else {\n ctx.sql.push('WHERE', conditions);\n }\n } else if (!q.all && !checkIfHasExplicitWhere?.value) {\n throw new OrchidOrmInternalError(\n query as Query,\n `Dangerous delete without conditions`,\n );\n }\n\n if (returning) {\n ctx.sql.push('RETURNING', returning);\n }\n\n return makeSql(ctx, 'delete', isSubSql);\n};\n","import { rawOrColumnToSql } from '../../sql/column-to-sql';\nimport { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { QueryData } from '../../query-data';\n\nexport const pushDistinctSql = (\n ctx: ToSQLCtx,\n table: ToSQLQuery,\n distinct: Exclude<QueryData['distinct'], undefined>,\n quotedAs?: string,\n) => {\n ctx.sql.push('DISTINCT');\n\n if (distinct.length) {\n const columns = distinct?.map((item) =>\n rawOrColumnToSql(ctx, table.q, table.q.selectShape, item, quotedAs),\n );\n ctx.sql.push(`ON (${columns?.join(', ') || ''})`);\n }\n};\n","import { columnToSqlNotSelect } from '../../sql/column-to-sql';\nimport { SortDir } from '../../basic-features/order/order.sql';\nimport { addValue, MaybeArray } from '../../../utils';\nimport { Expression } from '../../expressions/expression';\nimport { ToSQLCtx } from '../../sql/to-sql';\nimport { QueryData } from '../../query-data';\nimport { isRawSQL } from '../../expressions/raw-sql';\n\nexport type OrderTsQueryConfig = true | OrderTsQueryConfigObject;\n\ninterface OrderTsQueryConfigObject {\n coverDensity?: boolean;\n weights?: number[];\n normalization?: number;\n dir?: SortDir;\n}\n\nexport type SearchWeight = 'A' | 'B' | 'C' | 'D';\n\nexport interface SearchWeightRecord {\n [K: string]: SearchWeight;\n}\n\nexport interface WhereSearchItem {\n as: string;\n vectorSQL: string;\n}\n\nexport type QuerySourceItem = {\n queryAs: string;\n as?: string;\n textSQL?: MaybeArray<string>;\n langSQL?: string;\n vectorSQL?: string;\n order?: OrderTsQueryConfig;\n} & (\n | {\n language?: string;\n }\n | {\n languageColumn: string;\n }\n) &\n (\n | {\n text: string | Expression;\n }\n | {\n in: MaybeArray<string> | SearchWeightRecord;\n }\n | {\n vector: string;\n }\n ) &\n (\n | {\n query: string | Expression;\n }\n | {\n plainQuery: string | Expression;\n }\n | {\n phraseQuery: string | Expression;\n }\n | {\n tsQuery: string | Expression;\n }\n );\n\nexport interface QueryDataSources {\n [K: string]: QuerySourceItem;\n}\n\nexport const searchSourcesToSql = (\n ctx: ToSQLCtx,\n data: QueryData,\n sources: QueryDataSources,\n sql: string,\n quotedAs?: string,\n): string => {\n for (const as in sources) {\n const source = sources[as];\n\n const lang = getSearchLang(ctx, data, source, quotedAs);\n source.vectorSQL = getTsVector(ctx, data, lang, source, quotedAs);\n\n let fn;\n let query;\n if ('query' in source) {\n fn = 'websearch_to_tsquery';\n query = source.query;\n } else if ('plainQuery' in source) {\n fn = 'plainto_tsquery';\n query = source.plainQuery;\n } else if ('phraseQuery' in source) {\n fn = 'phraseto_tsquery';\n query = source.phraseQuery;\n } else {\n fn = 'to_tsquery';\n query = source.tsQuery;\n }\n\n let querySql;\n if (typeof query === 'string') {\n ctx.values.push(query);\n querySql = `$${ctx.values.length}`;\n } else {\n querySql = `${query.toSQL(ctx, quotedAs)}`;\n }\n\n sql += `, ${fn}(${lang}, ${querySql}) \"${as}\"`;\n }\n return sql;\n};\n\nexport const getSearchLang = (\n ctx: ToSQLCtx,\n data: QueryData,\n source: QuerySourceItem,\n quotedAs?: string,\n): string => {\n return (source.langSQL ??=\n 'languageColumn' in source\n ? columnToSqlNotSelect(\n ctx,\n data,\n data.selectShape,\n source.languageColumn,\n quotedAs,\n )\n : isRawSQL(source.language)\n ? source.language.toSQL(ctx)\n : addValue(ctx.values, source.language || data.language || 'english'));\n};\n\nexport const getSearchText = (\n ctx: ToSQLCtx,\n data: QueryData,\n source: QuerySourceItem,\n quotedAs?: string,\n forHeadline?: boolean,\n): MaybeArray<string> => {\n let sql = source.textSQL;\n if (sql) return sql;\n\n if ('in' in source) {\n if (typeof source.in === 'string') {\n sql = columnToSqlNotSelect(\n ctx,\n data,\n data.selectShape,\n source.in,\n quotedAs,\n );\n } else if (Array.isArray(source.in)) {\n sql = `concat_ws(' ', ${source.in\n .map((column) =>\n columnToSqlNotSelect(ctx, data, data.selectShape, column, quotedAs),\n )\n .join(', ')})`;\n } else {\n sql = [];\n for (const key in source.in) {\n sql.push(\n columnToSqlNotSelect(ctx, data, data.selectShape, key, quotedAs),\n );\n }\n }\n } else if ('vector' in source) {\n if (forHeadline) {\n throw new Error(\n 'Cannot use a search based on a vector column for a search headline',\n );\n }\n\n sql = columnToSqlNotSelect(\n ctx,\n data,\n data.selectShape,\n source.vector,\n quotedAs,\n );\n } else {\n if (typeof source.text === 'string') {\n sql = addValue(ctx.values, source.text);\n } else {\n sql = source.text.toSQL(ctx, quotedAs);\n }\n }\n\n return (source.textSQL = sql);\n};\n\nconst getTsVector = (\n ctx: ToSQLCtx,\n data: QueryData,\n lang: string,\n source: QuerySourceItem,\n quotedAs?: string,\n): string => {\n const text = getSearchText(ctx, data, source, quotedAs);\n\n if ('in' in source) {\n if (typeof source.in === 'string' || Array.isArray(source.in)) {\n return `to_tsvector(${lang}, ${text})`;\n } else {\n let tsVector = '';\n let i = 0;\n for (const key in source.in) {\n tsVector =\n (tsVector ? `${tsVector} || ` : '') +\n `setweight(to_tsvector(${lang}, ${text[i++]}), ${addValue(\n ctx.values,\n source.in[key],\n )})`;\n }\n return tsVector;\n }\n } else if ('vector' in source) {\n return text as string;\n } else {\n return `to_tsvector(${lang}, ${text})`;\n }\n};\n","import { QueryData } from '../query-data';\nimport { PickQueryQ } from '../pick-query-types';\n\n// used in `from` logic to decide if convert query to sql or just write table name\nexport const checkIfASimpleQuery = (q: PickQueryQ) => {\n if (\n (q.q.returnType && q.q.returnType !== 'all') ||\n q.q.selectAllColumns ||\n q.q.and?.length ||\n q.q.or?.length ||\n q.q.scopes\n )\n return false;\n\n const keys = Object.keys(q.q) as (keyof QueryData)[];\n return !keys.some((key) => queryKeysOfNotSimpleQuery.includes(key));\n};\n\nconst queryKeysOfNotSimpleQuery: (keyof QueryData)[] = [\n 'with',\n 'as',\n 'from',\n 'select',\n 'distinct',\n 'only',\n 'join',\n 'group',\n 'having',\n 'window',\n 'union',\n 'order',\n 'limit',\n 'offset',\n 'for',\n];\n","import { ToSQLCtx, ToSQLQuery } from '../../sql/to-sql';\nimport { QueryData, QueryDataFromItem } from '../../query-data';\nimport { moveMutativeQueryToCte } from '../cte/cte.sql';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { isExpression } from '../../expressions/expression';\nimport { getQueryAs } from '../as/as';\nimport { searchSourcesToSql } from '../../extra-features/search/search.sql';\nimport {\n getQueryRelationAliasForAs,\n quoteFromWithSchema,\n quoteTableWithSchema,\n quoteTableWithSchemaAndAlias,\n} from '../../sql/sql';\nimport { checkIfASimpleQuery } from '../../sql/check-if-a-simple-query';\nimport { getQuerySchema } from '../storage/storage';\n\nlet fromQuery: SubQueryForSql | undefined;\n\nexport const pushFromAndAs = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n data: QueryData,\n quotedAs?: string,\n): SubQueryForSql | undefined => {\n let sql = 'FROM ';\n\n const from = getFrom(ctx, query, data, quotedAs);\n sql += from;\n\n if (data.sources) {\n sql = searchSourcesToSql(ctx, data, data.sources, sql, quotedAs);\n }\n\n ctx.sql.push(sql);\n\n if (fromQuery) {\n const fq = fromQuery;\n fromQuery = undefined;\n return fq;\n }\n return;\n};\n\nconst getFrom = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n data: QueryData,\n quotedAs?: string,\n) => {\n fromQuery = undefined;\n\n if (data.from) {\n const { from } = data;\n if (Array.isArray(from)) {\n return from\n .map((item) => fromToSql(ctx, query, data, item, quotedAs))\n .join(', ');\n }\n\n return fromToSql(ctx, query, data, from, quotedAs);\n }\n\n let sql = quoteTableWithSchema(query);\n const alias = getQueryRelationAliasForAs(query, data.as);\n\n if (alias) {\n sql += ` ${alias}`;\n }\n\n if (data.only) sql = `ONLY ${sql}`;\n\n return sql;\n};\n\nconst fromToSql = (\n ctx: ToSQLCtx,\n query: ToSQLQuery,\n data: QueryData,\n from: QueryDataFromItem,\n quotedAs?: string,\n) => {\n let only: boolean | undefined;\n let sql;\n if (typeof from === 'object') {\n if (isExpression(from)) {\n sql = from.toSQL(ctx, quotedAs) + ' ' + quotedAs;\n } else {\n only = from.q.only;\n\n if (!from.table) {\n sql = `(${moveMutativeQueryToCte(ctx, from)})`;\n }\n // if the query contains more than just schema return (SELECT ...)\n else if (!checkIfASimpleQuery(from)) {\n sql = `(${moveMutativeQueryToCte(ctx, from)}) ${\n quotedAs || `\"${getQueryAs(from)}\"`\n }`;\n } else {\n sql = quoteTableWithSchemaAndAlias(from);\n }\n\n fromQuery = from;\n }\n } else {\n sql = quoteFromWithSchema(getQuerySchema(query), from);\n }\n\n return (only === undefined ? data.only : only) ? `ONLY ${sql}` : sql;\n};\n","import { ToSQLCtx } from '../../sql/to-sql';\nimport { templateLiteralToSQL } from '../../expressions/raw-sql';\nimport { QueryData } from '../../query-data';\nimport { Expression, TemplateLiteralArgs } from '../../expressions/expression';\n\nexport type HavingItem = TemplateLiteralArgs | Expression[];\n\nexport const pushHavingSql = (\n ctx: ToSQLCtx,\n query: QueryData,\n quotedAs?: string,\n) => {\n const conditions = havingToSql(ctx, query, quotedAs);\n if (conditions?.length) ctx.sql.push('HAVING', conditions);\n};\n\nexport const havingToSql = (\n ctx: ToSQLCtx,\n query: QueryData,\n quotedAs?: string,\n): string | undefined => {\n return query.having\n ?.map((it) =>\n 'raw' in it[0]\n ? templateLiteralToSQL(it as TemplateLiteralArgs, ctx, quotedAs)\n : it\n .map((item) => (item as Expression).toSQL(ctx, quotedAs))\n .join(' AND '),\n )\n .join(' AND ');\n};\n","import { columnToSqlNotSelect } from '../../sql/column-to-sql';\nimport { ToSQLCtx } from '../../sql/to-sql';\nimport { QueryData } from '../../query-data';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { addValue, emptyObject } from '../../../utils';\nimport { OrderTsQueryConfig } from '../../extra-features/search/search.sql';\n\nexport type SortDir = 'ASC' | 'DESC' | 'ASC NULLS FIRST' | 'DESC NULLS LAST';\n\nexport type OrderItem = string | { [K: string]: SortDir } | Expression;\n\nexport const pushOrderBySql = (\n ctx: ToSQLCtx,\n data: QueryData,\n quotedAs: string | undefined,\n order: Exclude<QueryData['order'], undefined>,\n) => {\n ctx.sql.push(\n `ORDER BY ${order\n .map((item) => orderByToSql(ctx, data, item, quotedAs))\n .join(', ')}`,\n );\n};\n\nexport const orderByToSql = (\n ctx: ToSQLCtx,\n data: QueryData,\n order: OrderItem,\n quotedAs?: string,\n) => {\n if (typeof order === 'string') {\n return addOrder(ctx, data, order, quotedAs);\n }\n\n if (isExpression(order)) {\n return order.toSQL(ctx, quotedAs);\n }\n\n const sql: string[] = [];\n for (const key in order) {\n const value = order[key];\n sql.push(addOrder(ctx, data, key, quotedAs, value as SortDir));\n }\n return sql.join(', ');\n};\n\nconst addOrder = (\n ctx: ToSQLCtx,\n data: QueryData,\n column: string,\n quotedAs?: string,\n dir?: SortDir | OrderTsQueryConfig,\n): string => {\n if (data.sources?.[column]) {\n const search = data.sources[column];\n const order: OrderTsQueryConfig =\n dir ||\n (!search.order || search.order === true ? emptyObject : search.order);\n\n return `${order.coverDensity ? 'ts_rank_cd' : 'ts_rank'}(${\n order.weights ? `${addValue(ctx.values, `{${order.weights}}`)}, ` : ''\n }${search.vectorSQL}, \"${column}\"${\n order.normalization !== undefined\n ? `, ${addValue(ctx.values, order.normalization)}`\n : ''\n }) ${order.dir || 'DESC'}`;\n }\n\n return `${columnToSqlNotSelect(ctx, data, data.selectShape, column, quotedAs, true)} ${\n dir || 'ASC'\n }`;\n};\n","import { rawOrColumnToSql } from '../../sql/column-to-sql';\nimport { orderByToSql, OrderItem } from '../order/order.sql';\nimport { QueryData } from '../../query-data';\nimport { ToSQLCtx } from '../../sql/to-sql';\nimport {\n Expression,\n isExpression,\n SelectableOrExpression,\n} from '../../expressions/expression';\n\nexport interface WindowItem {\n [K: string]: WindowDeclaration | Expression;\n}\n\nexport interface WindowDeclaration {\n partitionBy?: SelectableOrExpression | SelectableOrExpression[];\n order?: OrderItem;\n}\n\nexport const windowToSql = (\n ctx: ToSQLCtx,\n data: QueryData,\n window: string | WindowDeclaration | Expression,\n quotedAs?: string,\n) => {\n if (typeof window === 'string') return `\"${window}\"`;\n\n if (isExpression(window)) return `(${window.toSQL(ctx, quotedAs)})`;\n\n const sql: string[] = [];\n if (window.partitionBy) {\n sql.push(\n `PARTITION BY ${\n Array.isArray(window.partitionBy)\n ? window.partitionBy\n .map((partitionBy) =>\n rawOrColumnToSql(\n ctx,\n data,\n data.selectShape,\n partitionBy,\n quotedAs,\n undefined,\n true,\n ),\n )\n .join(', ')\n : rawOrColumnToSql(\n ctx,\n data,\n data.selectShape,\n window.partitionBy,\n quotedAs,\n undefined,\n true,\n )\n }`,\n );\n }\n\n if (window.order) {\n sql.push(`ORDER BY ${orderByToSql(ctx, data, window.order, quotedAs)}`);\n }\n\n return `(${sql.join(' ')})`;\n};\n","import { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { Query } from '../../query';\nimport { ToSQLCtx } from '../../sql/to-sql';\nimport { moveMutativeQueryToCte } from '../cte/cte.sql';\n\nexport interface UnionItem {\n a: SubQueryForSql | Expression;\n k: UnionKind;\n // true to not wrap the union member into parens.\n p?: boolean;\n}\n\nexport interface UnionSet {\n b: Query;\n u: UnionItem[];\n}\n\nexport type UnionKind =\n | 'UNION'\n | 'UNION ALL'\n | 'INTERSECT'\n | 'INTERSECT ALL'\n | 'EXCEPT'\n | 'EXCEPT ALL';\n\nexport interface QueryDataUnion {\n b: SubQueryForSql;\n u: UnionItem[];\n // true to not wrap the first union query into parens.\n p?: boolean;\n}\n\nexport const pushUnionSql = (\n ctx: ToSQLCtx,\n union: QueryDataUnion,\n quotedAs?: string,\n) => {\n const { b } = union;\n const s = moveMutativeQueryToCte(ctx, b);\n ctx.sql.push(union.p ? s : `(${s})`);\n\n for (const u of union.u) {\n const s = isExpression(u.a)\n ? u.a.toSQL(ctx, quotedAs)\n : moveMutativeQueryToCte(ctx, u.a);\n ctx.sql.push(`${u.k} ${u.p ? s : '(' + s + ')'}`);\n }\n};\n","import { isExpression } from '../../expressions/expression';\nimport { QueryData } from '../../query-data';\nimport { ToSQLCtx } from '../../sql/to-sql';\n\nexport const pushForSql = (\n ctx: ToSQLCtx,\n q: QueryData,\n type: QueryData['type'],\n quotedAs?: string,\n) => {\n if (q.for && (type !== 'upsert' || !q.upsertSecond)) {\n ctx.sql.push('FOR', q.for.type);\n const { tableNames } = q.for;\n if (tableNames) {\n ctx.sql.push(\n 'OF',\n isExpression(tableNames)\n ? tableNames.toSQL(ctx, quotedAs)\n : tableNames.map((x) => `\"${x}\"`).join(', '),\n );\n }\n if (q.for.mode) ctx.sql.push(q.for.mode);\n }\n};\n","import { IsQuery, Query } from '../query';\nimport { QueryData, QueryType } from '../query-data';\nimport { QueryBuilder } from '../db';\nimport {\n addWithToSql,\n ctesToSql,\n setFreeTopCteAs,\n TopCTE,\n} from '../basic-features/cte/cte.sql';\nimport { SubQueryForSql } from '../internal-features/sub-query/sub-query-for-sql';\nimport { makeInsertSql } from '../basic-features/mutate/insert.sql';\nimport { pushUpdateSql } from '../basic-features/mutate/update.sql';\nimport { pushDeleteSql } from '../basic-features/mutate/delete.sql';\nimport { _clone } from '../basic-features/clone/clone';\nimport { _queryInsert } from '../basic-features/mutate/create';\nimport { JoinItem } from '../basic-features/join/join.sql';\nimport { makeRowToJson, makeSql } from '../sql/sql';\nimport { MoreThanOneRowError } from '../errors';\nimport { QueryInternal } from '../query-internal';\nimport { RawSql } from '../expressions/raw-sql';\nimport { setMutativeQueriesSelectRelationsStateOnSql } from '../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\nimport { Sql } from '../sql/sql';\nimport { moveMutativeQueryToCteBase } from '../basic-features/cte/move-mutative-query-to-cte-base.sql';\nimport { pushDistinctSql } from '../basic-features/distinct/distinct.sql';\nimport { setSqlCtxSelectList } from '../basic-features/select/select.sql';\nimport { pushFromAndAs } from '../basic-features/from/fromAndAs.sql';\nimport { pushJoinSql } from '../basic-features/join/join.sql';\nimport { pushWhereStatementSql } from '../basic-features/where/where.sql';\nimport { columnToSqlNotSelect } from './column-to-sql';\nimport { pushHavingSql } from '../basic-features/having/having.sql';\nimport { windowToSql } from '../basic-features/window/window.sql';\nimport { pushOrderBySql } from '../basic-features/order/order.sql';\nimport { pushLimitOffsetSql } from '../basic-features/limit-offset/limit-offset.sql';\nimport { addTableHook } from '../extra-features/hooks/hooks.sql';\nimport { RunAfterQuery } from './sql';\nimport { HasCteHooks, TableHook } from '../basic-features/select/hook-select';\nimport { isExpression } from '../expressions/expression';\nimport { pushUnionSql } from '../basic-features/union/union.sql';\nimport { pushForSql } from '../basic-features/for/for.sql';\nimport { setCurrentDefaultSchema } from '../basic-features/storage/storage';\nimport { MutativeQueriesSelectRelationsSqlState } from '../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\nimport { emptyArray } from '../../utils';\n\ninterface ToSqlOptionsInternal {\n hasNonSelect?: boolean;\n // selected value in JOIN LATERAL will have an alias to reference it from SELECT\n aliasValue?: true;\n // for insert batching logic: skip a batch check when is inside a WITH subquery\n skipBatchCheck?: true;\n selectedCount?: number;\n selectList?: string[];\n}\n\nexport interface ToSqlValues {\n values: unknown[];\n}\n\nexport interface TopToSqlCtx\n extends ToSqlOptionsInternal, HasCteHooks, ToSqlValues {\n topCtx: TopToSqlCtx;\n topCTE?: TopCTE;\n tableHook?: TableHook;\n mutativeQueriesSelectRelationsSqlState?: MutativeQueriesSelectRelationsSqlState;\n cteHookTopNullSelectAppended?: boolean;\n}\n\nexport interface ToSQLCtx extends ToSqlOptionsInternal, ToSqlValues {\n topCtx: TopToSqlCtx;\n qb: QueryBuilder;\n q: QueryData;\n sql: string[];\n selectedCount: number;\n cteName?: string;\n wrapAs?: string;\n}\n\nexport interface ToSQLQuery extends IsQuery {\n __isQuery: Query['__isQuery'];\n q: Query['q'];\n qb: Query['qb'];\n table?: Query['table'];\n internal: QueryInternal;\n relations: Query['relations'];\n withData: Query['withData'];\n clone: Query['clone'];\n baseQuery: Query['baseQuery'];\n returnType: Query['returnType'];\n result: Query['result'];\n shape: Query['shape'];\n}\n\nexport interface ToSql {\n (\n table: ToSQLQuery,\n type: QueryType,\n topCtx?: TopToSqlCtx,\n isSubSql?: boolean,\n cteName?: string,\n calledByThen?: boolean,\n dontAddTableHook?: boolean,\n ): Sql;\n}\n\nexport const newToSqlCtx = (query: ToSQLQuery): ToSQLCtx => {\n const ctx = {\n topCtx: undefined as unknown as TopToSqlCtx,\n qb: query.qb,\n q: query.q,\n sql: [],\n values: [],\n selectedCount: 0,\n };\n\n ctx.topCtx = ctx;\n\n return ctx;\n};\n\nexport const toSql: ToSql = (\n table,\n type,\n topCtx,\n isSubSql,\n cteName,\n calledByThen,\n dontAddTableHook,\n) => {\n const query = table.q;\n const sql: string[] = [];\n const values = topCtx?.values || [];\n const ctx: ToSQLCtx = {\n topCtx: topCtx!,\n qb: table.qb,\n q: query,\n sql,\n values,\n aliasValue: topCtx?.aliasValue,\n skipBatchCheck: topCtx?.skipBatchCheck,\n hasNonSelect: topCtx?.hasNonSelect,\n selectedCount: 0,\n cteName,\n };\n\n if (topCtx) {\n if (type) topCtx.hasNonSelect = true;\n } else {\n ctx.topCtx = ctx as TopToSqlCtx;\n if (!calledByThen) {\n setCurrentDefaultSchema(table.internal.asyncStorage.getStore()?.schema);\n }\n }\n\n ctesToSql(ctx, query.with);\n\n let result: Sql;\n\n let selectKeywordPos: number | undefined;\n let prependedSelectParenthesis: boolean | undefined;\n\n let fromQuery: SubQueryForSql | undefined;\n\n if (query.asFns) {\n let as;\n if (isSubSql) {\n as = cteName || setFreeTopCteAs(ctx);\n } else {\n as = ctx.wrapAs = setFreeTopCteAs(ctx);\n }\n for (const fn of query.asFns) {\n fn(as);\n }\n }\n\n if (type && type !== 'upsert') {\n const tableName = table.table ?? query.as;\n if (!tableName) throw new Error(`Table is missing for ${type}`);\n\n if (type === 'insert') {\n result = makeInsertSql(ctx, table, query, `\"${tableName}\"`, isSubSql);\n } else {\n const quotedAs = `\"${query.as || tableName}\"`;\n\n if (type === 'update') {\n result = pushUpdateSql(ctx, table, query, quotedAs, isSubSql);\n } else if (type === 'delete') {\n result = pushDeleteSql(ctx, table, query, quotedAs, isSubSql);\n } else {\n throw new Error(`Unsupported query type ${type}`);\n }\n }\n } else {\n let selectSqlPos: number | undefined;\n let runAfterQuery: RunAfterQuery | undefined;\n let skipSelect: boolean | undefined;\n if (type === 'upsert') {\n const upsertUpdate = query.upsertUpdate && query.updateData;\n if (isSubSql || query.upsertSecond) {\n skipSelect = true;\n\n const upsertOrCreate = _clone(table as Query);\n\n // it expected for update to not find records, do not throw if not found\n if (upsertOrCreate.q.returnType === 'oneOrThrow') {\n upsertOrCreate.q.returnType = 'one';\n } else if (upsertOrCreate.q.returnType === 'valueOrThrow') {\n upsertOrCreate.q.returnType = 'value';\n }\n\n const { as, makeSql: makeFirstSql } = moveMutativeQueryToCteBase(\n toSql,\n ctx,\n upsertOrCreate as unknown as SubQueryForSql,\n upsertUpdate ? 'update' : null,\n );\n query.upsertUpdateAsFns?.forEach((fn) => fn(as));\n\n upsertOrCreate.q.or = upsertOrCreate.q.scopes = undefined;\n\n upsertOrCreate.q.and = [\n // use raw SQL rather than _queryWhereNotExists to avoid soft delete being appended\n new RawSql(`NOT EXISTS (SELECT 1 FROM \"${as}\")`),\n ];\n\n if (query.upsertInsert) {\n const insertData = query.upsertInsert();\n _queryInsert(upsertOrCreate as never, insertData as never);\n upsertOrCreate.q.type = 'upsert';\n }\n\n upsertOrCreate.q.with = query.upsertCreateWith;\n upsertOrCreate.q.appendQueries = query.upsertCreateAppendQueries;\n upsertOrCreate.q.asFns = query.upsertCreateAsFns;\n\n const { makeSql: makeSecondSql } = moveMutativeQueryToCteBase(\n toSql,\n ctx,\n upsertOrCreate as unknown as SubQueryForSql,\n 'insert',\n );\n\n sql.push(makeFirstSql(isSubSql), 'UNION ALL', makeSecondSql(isSubSql));\n } else {\n const second = _clone(table);\n second.q.upsertSecond = true;\n // let's call before hooks only once for upsert\n second.q.before = undefined;\n runAfterQuery = (queryResult) => {\n if (queryResult.rowCount) {\n second.q.upsertSecond = undefined;\n if (queryResult.rowCount > 1) {\n throw new MoreThanOneRowError(\n second,\n `Only one row was expected to find, found ${queryResult.rowCount} rows.`,\n );\n }\n return;\n }\n\n return second\n .then((result) => ({ result }))\n .finally(() => {\n second.q.upsertSecond = undefined;\n });\n };\n\n if (upsertUpdate) {\n const result = toSql(table, 'update', topCtx, isSubSql);\n if ('text' in result) {\n result.runAfterQuery = runAfterQuery;\n }\n return result;\n }\n }\n }\n\n const quotedAs =\n (query.as || table.table) && `\"${query.as || table.table}\"`;\n\n if (query.union) {\n pushUnionSql(ctx, query.union, quotedAs);\n } else if (!skipSelect) {\n selectKeywordPos = sql.length;\n sql.push('SELECT');\n\n if (query.distinct) {\n pushDistinctSql(ctx, table, query.distinct, quotedAs);\n }\n\n selectSqlPos = sql.length - 1;\n\n const aliases = query.group ? [] : undefined;\n setSqlCtxSelectList(ctx, table, query, quotedAs, isSubSql, aliases);\n\n fromQuery =\n ((table.table || query.from) &&\n pushFromAndAs(ctx, table, query, quotedAs)) ||\n undefined;\n\n if (query.join) {\n pushJoinSql(\n ctx,\n table,\n query as QueryData & { join: JoinItem[] },\n quotedAs,\n );\n }\n\n if (query.and || query.or || query.scopes) {\n pushWhereStatementSql(ctx, table, query, quotedAs);\n }\n\n if (query.group) {\n const group = query.group.map((item) => {\n if (isExpression(item)) {\n return item.toSQL(ctx, quotedAs);\n } else {\n const i = (aliases as string[]).indexOf(item as string);\n return i !== -1\n ? i + 1\n : columnToSqlNotSelect(\n ctx,\n table.q,\n table.shape,\n item as string,\n quotedAs,\n );\n }\n });\n sql.push(`GROUP BY ${group.join(', ')}`);\n }\n\n if (query.having) pushHavingSql(ctx, query, quotedAs);\n\n if (query.window) {\n const window: string[] = [];\n for (const item of query.window) {\n for (const key in item) {\n window.push(\n `\"${key}\" AS ${windowToSql(ctx, query, item[key], quotedAs)}`,\n );\n }\n }\n sql.push(`WINDOW ${window.join(', ')}`);\n }\n }\n\n if (query.order) {\n pushOrderBySql(ctx, query, quotedAs, query.order);\n }\n\n pushLimitOffsetSql(ctx, query, fromQuery);\n\n pushForSql(ctx, query, type, quotedAs);\n\n addTableHook(\n ctx,\n table,\n query,\n query.hookSelect,\n undefined,\n dontAddTableHook,\n );\n\n // compose select in the last moment because NULL for CTE selects\n // can be added by sub queries added in where or in other places\n if (selectSqlPos !== undefined && ctx.selectList?.length) {\n sql[selectSqlPos] += ' ' + ctx.selectList.join(', ');\n }\n\n if (selectKeywordPos !== undefined && !isSubSql && ctx.topCtx.cteHooks) {\n sql[selectKeywordPos] = '(' + sql[selectKeywordPos];\n prependedSelectParenthesis = true;\n }\n\n result = makeSql(ctx, type, isSubSql, runAfterQuery);\n }\n\n if (!ctx.cteName) {\n result.tableHook = ctx.topCtx.tableHook;\n if (!topCtx) {\n setMutativeQueriesSelectRelationsStateOnSql(ctx, result);\n }\n }\n\n if (!isSubSql) {\n if (ctx.topCtx.cteHooks && 'text' in result) {\n result.cteHooks = ctx.topCtx.cteHooks;\n\n if (ctx.topCtx.cteHooks.hasSelect) {\n if (prependedSelectParenthesis) {\n result.text += ')';\n }\n\n const { tableHooks, ensureCount } = ctx.topCtx.cteHooks;\n\n const keyValues = [\n ...(tableHooks\n ? Object.entries(tableHooks).map(\n ([cteName, data]) =>\n `'${cteName}', (SELECT json_agg(${makeRowToJson(\n ctx,\n cteName,\n data.shape,\n false,\n true,\n )}) FROM \"${cteName}\")`,\n )\n : emptyArray),\n ...(ensureCount\n ? Object.entries(ensureCount).map(\n ([cteName, item]) =>\n `'#${cteName}', CASE WHEN ${\n 'count' in item\n ? `(SELECT count(*) FROM \"${cteName}\") < ${item.count}`\n : `(SELECT \"${cteName}\".\"${item.jsonNotNull}\" FROM \"${cteName}\") IS NULL`\n } THEN (SELECT 'not-found')::int END`,\n )\n : emptyArray),\n ];\n\n result.text += ` UNION ALL SELECT ${'NULL, '.repeat(\n ctx.selectedCount || 0,\n )}json_build_object(${keyValues.join(', ')})`;\n }\n }\n }\n\n if ('text' in result) addWithToSql(ctx, result, isSubSql);\n\n return result;\n};\n","import { emptyObject, RecordUnknown, setFreeAlias } from '../../../utils';\nimport { Expression } from '../../expressions/expression';\nimport { toSql, ToSQLCtx } from '../../sql/to-sql';\nimport { QueryData, WithItems } from '../../query-data';\nimport { Column } from '../../../columns';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { moveMutativeQueryToCteBase } from './move-mutative-query-to-cte-base.sql';\nimport { setMoveMutativeQueryToCte } from '../../../columns/operators';\nimport { getSqlText, SingleSql, SingleSqlItem } from '../../sql/sql';\n\nexport interface WithDataItem {\n table: string;\n shape: Column.QueryColumns;\n}\n\nexport interface WithDataItems {\n [K: string]: WithDataItem;\n}\n\nexport interface CteItem {\n // name\n n: string | ((as: string) => void);\n // options\n o?: CteOptions;\n // query\n q?: SubQueryForSql;\n // sql\n s?: Expression;\n // prepend: false by default\n p?: boolean;\n}\n\nexport interface CteOptions {\n columns?: string[];\n recursive?: true;\n materialized?: true;\n notMaterialized?: true;\n}\n\nexport interface TopCTE {\n names: RecordUnknown;\n stack: string[][];\n append: string[][];\n}\n\nconst newTopCte = (ctx: ToSQLCtx): TopCTE => ({\n names: { ...ctx.q.withShapes, ...ctx.q.joinedShapes },\n stack: [],\n append: [],\n});\n\nexport const getTopCteSize = ({\n topCtx: { topCTE },\n}: ToSQLCtx): number | undefined => topCTE?.append.length;\n\nexport const setTopCteSize = ({ topCtx }: ToSQLCtx, size?: number) => {\n if (topCtx.topCTE) {\n if (size) {\n topCtx.topCTE.append.length = size;\n } else {\n topCtx.topCTE = undefined;\n }\n }\n};\n\nexport const ctesToSql = (ctx: ToSQLCtx, ctes?: WithItems): void => {\n if (!ctes) return;\n\n for (const item of ctes) {\n const place = item.p ? 'before' : 'after';\n if (ctx !== ctx.topCtx && item.q?.q.type) {\n addTopCte(place, ctx, item.q, item.q.q.type, item.n);\n } else {\n addTopCteInternal(place, ctx, item, item.q?.q.type);\n }\n }\n};\n\nexport const cteToSqlGiveAs = (\n ctx: ToSQLCtx,\n item: CteItem,\n type: QueryData['type'],\n dontAddTableHook?: boolean,\n): { as: string; sql: string } => {\n let inner: string;\n\n let as;\n if (typeof item.n === 'string') {\n as = item.n;\n } else {\n if (ctx === ctx.topCtx) {\n const topCTE = (ctx.topCtx.topCTE ??= newTopCte(ctx));\n as = setFreeAlias(topCTE.names, 'q', true);\n item.n(as);\n } else {\n // TODO\n throw new Error('not implemented yet');\n }\n }\n\n if (item.q) {\n inner = getSqlText(\n toSql(item.q, type, ctx.topCtx, true, as, undefined, dontAddTableHook),\n );\n } else {\n inner = (item.s as Expression).toSQL(ctx.topCtx, `\"${as}\"`);\n }\n\n const o = item.o ?? (emptyObject as CteOptions);\n return {\n as,\n sql: `${o.recursive ? 'RECURSIVE ' : ''}\"${as}\"${\n o.columns ? `(${o.columns.map((x) => `\"${x}\"`).join(', ')})` : ''\n } AS ${\n o.materialized\n ? 'MATERIALIZED '\n : o.notMaterialized\n ? 'NOT MATERIALIZED '\n : ''\n }(${inner})`,\n };\n};\n\nexport const cteToSql = (\n ctx: ToSQLCtx,\n item: CteItem,\n type: QueryData['type'],\n dontAddTableHook?: boolean,\n): string => cteToSqlGiveAs(ctx, item, type, dontAddTableHook).sql;\n\nexport const setFreeTopCteAs = (ctx: ToSQLCtx) => {\n const topCTE = (ctx.topCtx.topCTE ??= newTopCte(ctx));\n const as = setFreeAlias(topCTE.names, 'q', true);\n topCTE.names[as] = true;\n return as;\n};\n\nexport const addTopCteSql = (\n ctx: ToSQLCtx,\n as: string | undefined,\n sql: string,\n): string => {\n const topCTE = (ctx.topCtx.topCTE ??= newTopCte(ctx));\n\n as ??= setFreeAlias(topCTE.names, 'q', true);\n topCTE.names[as] = true;\n\n const target =\n topCTE.stack[topCTE.stack.length - 1] ||\n (topCTE.append[topCTE.append.length] = []);\n\n target.push(as + ' AS (' + sql + ')');\n return as;\n};\n\nexport const addTopCte = (\n place: 'before' | 'after',\n ctx: ToSQLCtx,\n q: SubQueryForSql,\n type: QueryData['type'],\n as?: string | ((as: string) => void),\n dontAddTableHook?: boolean,\n): string => {\n const topCTE = (ctx.topCtx.topCTE ??= newTopCte(ctx));\n\n if (typeof as !== 'string') {\n const name = setFreeAlias(topCTE.names, 'q', true);\n\n if (as) {\n as(name);\n }\n\n as = name;\n }\n\n addTopCteInternal(place, ctx, { n: as, q }, type, dontAddTableHook);\n\n return as;\n};\n\nconst addTopCteInternal = (\n place: 'before' | 'after',\n ctx: ToSQLCtx,\n item: CteItem,\n type: QueryData['type'],\n dontAddTableHook?: boolean,\n) => {\n const topCTE = (ctx.topCtx.topCTE ??= newTopCte(ctx));\n\n const target =\n (place === 'before' && topCTE.stack[topCTE.stack.length - 1]) ||\n (topCTE.append[topCTE.append.length] = []);\n\n const prepend: string[] = [];\n topCTE.stack.push(prepend);\n\n const sql = cteToSql(ctx, item, type, dontAddTableHook); // more ctes can be appended here\n\n target.push(...prepend, sql);\n\n topCTE.stack.pop();\n};\n\nexport const addWithToSql = (\n ctx: ToSQLCtx,\n sql: SingleSql,\n isSubSql?: boolean,\n): void => {\n if (!isSubSql && ctx.topCtx.topCTE?.append.length) {\n const sqls: string[] = [];\n for (const append of ctx.topCtx.topCTE.append) {\n sqls.push(...append);\n }\n\n sql.text = 'WITH ' + sqls.join(', ') + ' ' + sql.text;\n }\n};\n\nexport const composeCteSingleSql = (ctx: ToSQLCtx): SingleSqlItem => {\n const result = {\n text: ctx.sql.join(' '),\n values: ctx.values,\n };\n addWithToSql(ctx, result);\n return result;\n};\n\nexport interface MoveMutativeQueryToCte {\n (ctx: ToSQLCtx, query: SubQueryForSql): string;\n}\n\nexport const moveMutativeQueryToCte: MoveMutativeQueryToCte = (ctx, query) => {\n const { makeSql } = moveMutativeQueryToCteBase(toSql, ctx, query);\n return makeSql(true);\n};\n\nsetMoveMutativeQueryToCte(moveMutativeQueryToCte);\n","import { addTopCte, addTopCteSql } from '../basic-features/cte/cte.sql';\nimport { QueryData, QueryType } from '../query-data';\nimport { ToSQLCtx } from './to-sql';\n\nexport const getShouldWrapMainQueryInCte = (\n ctx: ToSQLCtx,\n q: QueryData,\n type: QueryType,\n isSubSql?: boolean,\n): boolean | undefined => {\n return (\n ((!isSubSql && type && ctx.topCtx.cteHooks) || q.appendQueries) && true\n );\n};\n\nexport const wrapMainQueryInCte = (\n ctx: ToSQLCtx,\n q: QueryData,\n isSubSql?: boolean,\n) => {\n let as: string | undefined;\n if (!isSubSql && !ctx.cteName) {\n as = addTopCteSql(ctx, ctx.wrapAs, ctx.sql.join(' '));\n }\n\n q.appendQueries?.forEach((query) =>\n addTopCte('after', ctx, query, query.q.type),\n );\n\n if (!isSubSql && !ctx.cteName) {\n const addNull = ctx.topCtx.cteHooks?.hasSelect;\n ctx.sql = [`SELECT *${addNull ? ', NULL' : ''} FROM ${as}`];\n }\n};\n","import {\n HasCteHooks,\n HasTableHook,\n} from '../basic-features/select/hook-select';\nimport { QueryResult } from '../../adapters/adapter';\nimport { PickQueryColumTypes } from '../pick-query-types';\nimport { DynamicSQLArg, StaticSQLArgs } from '../expressions/expression';\nimport {\n DynamicRawSQL,\n raw,\n RawSql,\n type RawSqlBase,\n} from '../expressions/raw-sql';\nimport { Column } from '../../columns';\nimport { ToSQLCtx, ToSQLQuery } from './to-sql';\nimport { QueryType } from '../query-data';\nimport { wrapMainQueryInCte } from './wrap-main-query-in-cte';\nimport { OrchidOrmInternalError } from '../errors';\nimport { QuerySchema } from '../basic-features/schema/schema';\nimport { getQuerySchema } from '../basic-features/storage/storage';\nimport { MutativeQueriesSelectRelationsSqlProp } from '../internal-features/mutative-queries-select-relation/mutative-queries-select-relations.sql';\nimport { type RecordUnknown } from '../../utils';\nimport { type Query } from '../query';\n\nexport interface SqlCommonOptions\n extends HasTableHook, HasCteHooks, MutativeQueriesSelectRelationsSqlProp {}\n\nexport interface SingleSqlItem {\n // SQL string\n text: string;\n // bind values passed along with SQL string\n values?: unknown[];\n runAfterQuery?: RunAfterQuery;\n}\n\n// is executed immediately after querying SQL.\n// `then` early returns its result if `runAfterQuery` returns a result.\nexport interface RunAfterQuery {\n (queryResult: QueryResult): void | Promise<{ result: unknown }>;\n}\n\nexport interface SingleSql extends SingleSqlItem, SqlCommonOptions {}\n\nexport interface BatchSql extends SqlCommonOptions {\n // batch of sql queries, is used when there is too many binding params for insert\n batch: SingleSql[];\n}\n\n// Output type of the `toSQL` method of query objects.\n// This will be passed to database adapter to perform query.\nexport type Sql = SingleSql | BatchSql;\n\nexport const makeSql = (\n ctx: ToSQLCtx,\n type: QueryType,\n isSubSql: boolean | undefined,\n runAfterQuery?: RunAfterQuery,\n): SingleSql => {\n if (\n (!isSubSql &&\n // require type to exclude SELECT because it does not require wrapping in CTE for UNION\n type &&\n // exclude insert because insert handles this logic on its own, since it has to deal with batches\n type !== 'insert' &&\n // exclude upsert because it upsert is SELECT from a union, select doesn't require wrapping\n type !== 'upsert' &&\n ctx.topCtx.cteHooks) ||\n ctx.q.appendQueries\n ) {\n wrapMainQueryInCte(ctx, ctx.q, isSubSql);\n }\n\n return {\n text: ctx.sql.join(' '),\n values: ctx.values,\n runAfterQuery,\n };\n};\n\nexport const requireTableOrStringFrom = (query: ToSQLQuery): string => {\n const table =\n query.table ||\n (typeof query.q.from === 'string' ? query.q.from : undefined);\n\n if (!table) {\n throw new OrchidOrmInternalError(\n query,\n \"The query object does not have a table and doesn't define a `from` string\",\n );\n }\n\n return table;\n};\n\nexport const getQueryRelationAlias = (query: ToSQLQuery): string | undefined =>\n query.table && query.q.nameInDb && query.table !== query.q.nameInDb\n ? `\"${query.table}\"`\n : undefined;\n\nexport const getQueryRelationAliasForAs = (\n query: ToSQLQuery,\n as: string | undefined,\n): string | undefined => {\n if (!as) return getQueryRelationAlias(query);\n\n const nameInDb = query.q.nameInDb || requireTableOrStringFrom(query);\n return nameInDb && as !== nameInDb ? `\"${as}\"` : undefined;\n};\n\nexport const quoteTableWithSchema = (query: ToSQLQuery): string =>\n quoteFromWithSchema(\n getQuerySchema(query),\n query.q.nameInDb || requireTableOrStringFrom(query),\n );\n\nexport const quoteTableWithSchemaAndAlias = (query: ToSQLQuery): string => {\n const table = quoteTableWithSchema(query);\n const alias = getQueryRelationAlias(query);\n return alias ? `${table} ${alias}` : table;\n};\n\nexport const quoteFromWithSchema = (\n schema: QuerySchema | undefined,\n table: string,\n): string => {\n const s = typeof schema === 'function' ? schema() : schema;\n return s ? `\"${s}\".\"${table}\"` : `\"${table}\"`;\n};\n\nexport const makeRowToJson = (\n ctx: ToSQLCtx,\n table: string,\n shape: Column.Shape.Data,\n aliasName: boolean,\n includingExplicitSelect?: boolean,\n): string => {\n let isSimple = true;\n const list: string[] = [];\n\n for (const key in shape) {\n const column = shape[key];\n if (!includingExplicitSelect && column.data.explicitSelect) {\n continue;\n }\n\n const selectSql = !column.data.computed ? column.data.selectSql : undefined;\n const outputColumn = getSelectedColumnData(column);\n if (\n (aliasName && column.data.name) ||\n outputColumn.data.jsonCast ||\n selectSql\n ) {\n isSimple = false;\n }\n\n const value = selectSql\n ? selectSql.toSQL(ctx, `\"${table}\"`)\n : `\"${table}\".\"${(aliasName && column.data.name) || key}\"`;\n\n list.push(\n `'${key}', ${value}${\n outputColumn.data.jsonCast ? `::${outputColumn.data.jsonCast}` : ''\n }`,\n );\n }\n\n return isSimple\n ? `row_to_json(\"${table}\".*)`\n : `CASE WHEN to_jsonb(\"${table}\") IS NULL THEN NULL ELSE json_build_object(` +\n list.join(', ') +\n ') END';\n};\n\nexport const getSelectedColumnData = (\n column: Column.Pick.Data,\n): Column.Pick.Data => {\n return (\n (column.data.selectSql?.result.value as Column.Pick.Data | undefined) ||\n column\n );\n};\n\nexport const getSqlText = (sql: Sql) => {\n if ('text' in sql) return sql.text;\n throw new Error(`Batch SQL is not supported in this query`);\n};\n\nexport const queryToSql = (query: Query): SingleSql => {\n const sql = query.toSQL();\n if ('batch' in sql) {\n throw new OrchidOrmInternalError(\n query,\n 'Batch SQL is not supported in query definitions',\n );\n }\n\n return sql;\n};\n\nexport const rawSqlToSql = (sql: string | RawSqlBase): SingleSql => {\n if (typeof sql === 'string') return { text: sql };\n\n const values: unknown[] = [];\n return {\n text: sql.toSQL({ values }),\n values,\n };\n};\n\nexport const sqlToRawSql = (sql: SingleSql): RawSqlBase => {\n const { values } = sql;\n if (!values?.length) return raw({ raw: sql.text });\n\n const rawValues: RecordUnknown = {};\n for (let i = 0; i < values.length; i++) {\n rawValues[`queryValue${i + 1}`] = values[i];\n }\n\n return raw({\n raw: replaceSqlPlaceholders(sql.text, values.length),\n }).values(rawValues);\n};\n\nconst replaceSqlPlaceholders = (sql: string, valuesCount: number): string => {\n const parts = sql.split(\"'\");\n for (let i = 0; i < parts.length; i += 2) {\n parts[i] = parts[i].replace(/\\$(\\d+)/g, (match, index) => {\n const number = Number(index);\n return number > 0 && number <= valuesCount\n ? `$queryValue${number}`\n : match;\n });\n }\n\n return parts.join(\"'\");\n};\n\nexport class QuerySql<ColumnTypes> {\n /**\n * @deprecated: use `sql` exported from the table factory file.\n *\n * When there is a need to use a piece of raw SQL, use the `sql` exported from the table factory file, it is also attached to query objects for convenience.\n *\n * When selecting a custom SQL, specify a resulting type with `<generic>` syntax:\n *\n * ```ts\n * import { sql } from './table-factory';\n *\n * const result: { num: number }[] = await db.table.select({\n * num: sql<number>`random() * 100`,\n * });\n * ```\n *\n * In a situation when you want the result to be parsed, such as when returning a timestamp that you want to be parsed into a `Date` object, provide a column type in such a way:\n *\n * This example assumes that the `timestamp` column was overridden with `asDate` as shown in [Override column types](/guide/columns-overview#override-column-types).\n *\n * ```ts\n * import { sql } from './table-factory';\n *\n * const result: { timestamp: Date }[] = await db.table.select({\n * timestamp: sql`now()`.type((t) => t.timestamp()),\n * });\n * ```\n *\n * In some cases such as when using [from](/guide/orm-and-query-builder.html#from), setting column type via callback allows for special `where` operations:\n *\n * ```ts\n * const subQuery = db.someTable.select({\n * sum: () => sql`$a + $b`.type((t) => t.decimal()).values({ a: 1, b: 2 }),\n * });\n *\n * // `gt`, `gte`, `min`, `lt`, `lte`, `max` in `where`\n * // are allowed only for numeric columns:\n * const result = await db.$from(subQuery).where({ sum: { gte: 5 } });\n * ```\n *\n * Many query methods have a version suffixed with `Sql`, you can pass an SQL template literal directly to these methods.\n * These methods are: `whereSql`, `whereNotSql`, `orderSql`, `havingSql`, `fromSql`, `findBySql`.\n *\n * ```ts\n * await db.table.whereSql`\"someValue\" = random() * 100`;\n * ```\n *\n * Interpolating values in template literals is completely safe:\n *\n * ```ts\n * // get value from user-provided params\n * const { value } = req.params;\n *\n * // SQL injection is prevented by a library, this is safe:\n * await db.table.whereSql`column = ${value}`;\n * ```\n *\n * In the example above, TS cannot check if the table has `column` column, or if there are joined tables that have such column which will lead to error.\n * Instead, use the [column](/guide/sql-expressions#column) or [ref](/guide/sql-expressions#ref) to reference a column:\n *\n * ```ts\n * // ids will be prefixed with proper table names, no ambiguity:\n * db.table.join(db.otherTable, 'id', 'other.otherId').where`\n * ${db.table.column('id')} = 1 AND\n * ${db.otherTable.ref('id')} = 2\n * `;\n * ```\n *\n * SQL can be passed with a simple string, it's important to note that this is not safe to interpolate values in it.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * // no interpolation is okay\n * await db.table.where(sql({ raw: 'column = random() * 100' }));\n *\n * // get value from user-provided params\n * const { value } = req.params;\n *\n * // this is NOT safe, SQL injection is possible:\n * await db.table.where(sql({ raw: `column = random() * ${value}` }));\n * ```\n *\n * To inject values into `sql({ raw: '...' })` SQL strings, denote it with `$` in the string and provide `values` object.\n *\n * Use `$$` to provide column or/and table name (`column` or `ref` are preferable). Column names will be quoted so don't quote them manually.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * // get value from user-provided params\n * const { value } = req.params;\n *\n * // this is SAFE, SQL injection are prevented:\n * await db.table.where(\n * sql<boolean>({\n * raw: '$$column = random() * $value',\n * values: {\n * column: 'someTable.someColumn', // or simply 'column'\n * one: value,\n * two: 123,\n * },\n * }),\n * );\n * ```\n *\n * Summarizing:\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * // simplest form:\n * sql`key = ${value}`;\n *\n * // with resulting type:\n * sql<boolean>`key = ${value}`;\n *\n * // with column type for select:\n * sql`key = ${value}`.type((t) => t.boolean());\n *\n * // with column name via `column` method:\n * sql`${db.table.column('column')} = ${value}`;\n *\n * // raw SQL string, not allowed to interpolate values:\n * sql({ raw: 'random()' });\n *\n * // with resulting type and `raw` string:\n * sql<number>({ raw: 'random()' });\n *\n * // with column name and a value in a `raw` string:\n * sql({\n * raw: `$$column = $value`,\n * values: { column: 'columnName', value: 123 },\n * });\n *\n * // combine template literal, column type, and values:\n * sql`($one + $two) / $one`.type((t) => t.numeric()).values({ one: 1, two: 2 });\n * ```\n *\n * @param args - template literal or an object { raw: string }\n * @return object that has `type` and `values` methods\n */\n sql<T = unknown>(\n this: PickQueryColumTypes,\n ...args: StaticSQLArgs\n ): RawSql<Column.Pick.QueryColumnOfType<T>, ColumnTypes>;\n sql<T = unknown>(\n this: PickQueryColumTypes,\n ...args: [DynamicSQLArg<Column.Pick.QueryColumnOfType<T>>]\n ): DynamicRawSQL<Column.Pick.QueryColumnOfType<T>, ColumnTypes>;\n sql(this: PickQueryColumTypes, ...args: unknown[]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const sql = (raw as any)(...args);\n sql.columnTypes = this.columnTypes;\n return sql;\n }\n}\n","import { JoinedShapes, QueryData } from '../query-data';\nimport { ToSQLCtx } from './to-sql';\nimport { Column } from '../../columns/column';\nimport { RecordString } from '../../utils';\nimport { ColumnsParsers } from '../query-columns/query-column-parsers';\nimport { _getQueryAliasOrName } from '../basic-features/as/as';\nimport { Expression, SelectableOrExpression } from '../expressions/expression';\nimport { getSelectedColumnData, makeRowToJson } from './sql';\nimport { SelectItem } from '../basic-features/select/select.sql';\n\n// Takes a column name without a dot and the optional column object.\n// Handles computed column, uses column.data.name when set, prefixes regular column with `quotedAs`.\n// Returns quoted key if no column is provided.\nexport function simpleColumnToSQL(\n ctx: ToSQLCtx,\n queryData: {\n valuesJoinedAs?: RecordString;\n select?: SelectItem[];\n joinedShapes?: JoinedShapes;\n getColumn?: Column;\n },\n shape: Column.QueryColumns,\n key: string,\n column?: Column.Pick.QueryColumn,\n quotedAs?: string,\n select?: true,\n as?: string,\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n useSelectList?: true,\n skipSelectSql?: true,\n skipValueToArray?: true,\n): string {\n let sql: string;\n let dontAlias: boolean | undefined;\n\n if (useSelectList && queryData.select) {\n for (const s of queryData.select) {\n if (typeof s === 'object' && 'selectAs' in s) {\n if (key in s.selectAs) {\n dontAlias = true;\n sql = simpleColumnToSQL(\n ctx,\n queryData,\n shape,\n key,\n shape[key],\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n undefined,\n true,\n );\n break;\n }\n }\n }\n }\n\n // @ts-ignore\n if (!sql) {\n if (!column) {\n dontAlias = key === as;\n sql = `${quotedAs ? `${quotedAs}.` : ''}\"${key}\"`;\n } else {\n if (jsonList && as) {\n jsonList[as] = column && getSelectedColumnData(column as Column);\n }\n\n const { data } = column as unknown as Column.Pick.Data;\n if (select && data.selectSql && !skipSelectSql) {\n sql = `(${data.selectSql.toSQL(ctx, quotedAs)})`;\n } else if (data.computed) {\n sql = `(${data.computed.toSQL(ctx, quotedAs)})`;\n } else {\n const name = data.name || key;\n dontAlias = name === as;\n\n if (!select) {\n const joinAs = !select && queryData.valuesJoinedAs?.[key];\n if (joinAs) {\n quotedAs = `\"${joinAs}\"`;\n }\n }\n\n sql = `${quotedAs ? `${quotedAs}.` : ''}\"${name}\"`;\n }\n }\n }\n\n if (\n !select &&\n !useSelectList &&\n (column as Column)?.data.valueToArray &&\n !(column as Column).data.skipValueToArray\n ) {\n sql += '[1]';\n } else if (queryData.getColumn?.data.valueToArray && !skipValueToArray) {\n sql = `array[${sql}]`;\n }\n\n if (as && !dontAlias) {\n sql = `${sql} \"${as}\"`;\n }\n\n return sql;\n}\n\nexport const tableColumnToSql = (\n ctx: ToSQLCtx,\n queryData: {\n valuesJoinedAs?: RecordString;\n aliases?: RecordString;\n joinedShapes?: QueryData['joinedShapes'];\n parsers?: ColumnsParsers;\n select?: SelectItem[];\n getColumn?: Column;\n },\n shape: Column.QueryColumns,\n table: string,\n key: string,\n quotedAs?: string,\n select?: true,\n as?: string,\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n skipValueToArray?: true,\n) => {\n let sql: string;\n let dontAlias: boolean | undefined;\n\n if (key === '*') {\n if (jsonList && as) {\n jsonList[as] = undefined;\n }\n\n const shape = queryData.joinedShapes?.[table];\n if (shape) {\n sql = select\n ? makeRowToJson(ctx, table, shape as never, true)\n : `\"${table}\".*`;\n } else {\n sql = `\"${table}\".\"${key}\"`;\n dontAlias = true;\n }\n } else {\n const tableName = _getQueryAliasOrName(queryData, table);\n const quoted = `\"${table}\"`;\n\n const joined = queryData.joinedShapes?.[tableName];\n\n const col = (\n joined ? joined[key] : quoted === quotedAs ? shape[key] : undefined\n ) as Column.Pick.Data | undefined;\n\n if (jsonList && as) {\n jsonList[as] = col && getSelectedColumnData(col);\n }\n\n if (col?.data.selectSql) {\n sql = `(${col.data.selectSql.toSQL(ctx, quoted)})`;\n } else if (col?.data.name) {\n sql = `\"${tableName}\".\"${col.data.name}\"`;\n } else if (col?.data.computed) {\n sql = `(${col.data.computed.toSQL(ctx, quoted)})`;\n } else {\n sql = `\"${tableName}\".\"${key}\"`;\n dontAlias = key === as;\n }\n\n if (\n !select &&\n (col as Column)?.data.valueToArray &&\n !(col as Column).data.skipValueToArray\n ) {\n sql += '[1]';\n } else if (queryData.getColumn?.data.valueToArray && !skipValueToArray) {\n sql = `array[${sql}]`;\n }\n }\n\n if (as && !dontAlias) {\n sql = `${sql} \"${as}\"`;\n }\n\n return sql;\n};\n\nexport const columnToSqlNotSelect = (\n ctx: ToSQLCtx,\n data: {\n valuesJoinedAs?: RecordString;\n aliases?: RecordString;\n joinedShapes?: QueryData['joinedShapes'];\n parsers?: ColumnsParsers;\n select?: SelectItem[];\n },\n shape: Column.QueryColumns,\n column: string,\n quotedAs?: string,\n useSelectList?: true,\n): string =>\n columnToSql(\n ctx,\n data,\n shape,\n column,\n quotedAs,\n undefined,\n undefined,\n undefined,\n useSelectList,\n true,\n );\n\nexport const columnToSql = (\n ctx: ToSQLCtx,\n data: {\n valuesJoinedAs?: RecordString;\n aliases?: RecordString;\n joinedShapes?: QueryData['joinedShapes'];\n parsers?: ColumnsParsers;\n select?: SelectItem[];\n },\n shape: Column.QueryColumns,\n column: string,\n quotedAs?: string,\n select?: true,\n as?: string,\n jsonList?: { [K: string]: Column.Pick.Data | undefined },\n useSelectList?: true,\n skipValueToArray?: true,\n): string => {\n let index = column.indexOf('.');\n if (index !== -1) {\n const table = column.slice(0, index);\n const key = column.slice(index + 1);\n return tableColumnToSql(\n ctx,\n data,\n shape,\n table,\n key,\n quotedAs,\n select,\n as,\n jsonList,\n skipValueToArray,\n );\n }\n\n return simpleColumnToSQL(\n ctx,\n data,\n shape,\n column,\n shape[column],\n quotedAs,\n select,\n as,\n jsonList,\n useSelectList,\n undefined,\n skipValueToArray,\n );\n};\n\nexport const rawOrColumnToSql = (\n ctx: ToSQLCtx,\n data: {\n joinedShapes?: JoinedShapes;\n select?: SelectItem[];\n },\n shape: Column.QueryColumns,\n expr: SelectableOrExpression,\n quotedAs: string | undefined,\n select?: true,\n skipValueToArray?: true,\n): string => {\n return typeof expr === 'string'\n ? columnToSql(\n ctx,\n data,\n shape,\n expr,\n quotedAs,\n select,\n undefined,\n undefined,\n undefined,\n skipValueToArray,\n )\n : (expr as Expression).toSQL(ctx, quotedAs);\n};\n","import {\n Query,\n SelectableOrExpressionOfType,\n SetQueryReturnsColumnOrThrow,\n} from '../../query';\nimport {\n AggregateOptions,\n makeFnExpression,\n FnExpression,\n Over,\n} from '../../expressions/fn-expression';\nimport {\n OperatorsAny,\n OperatorsArray,\n OperatorsBoolean,\n OperatorsNumber,\n OperatorsText,\n} from '../../../columns/operators';\nimport {\n BooleanColumn,\n DecimalColumn,\n IntegerColumn,\n internalSchemaConfig,\n JSONTextColumn,\n NumberAsStringBaseColumn,\n NumberBaseColumn,\n RealColumn,\n TextColumn,\n XMLColumn,\n} from '../../../columns';\nimport { Column } from '../../../columns/column';\nimport { _getSelectableColumn } from '../get/get.utils';\nimport {\n Expression,\n ExpressionOutput,\n SelectableOrExpression,\n} from '../../expressions/expression';\nimport {\n PickQuerySelectableResultRelationsWindows,\n PickQueryQ,\n PickQuerySelectable,\n} from '../../pick-query-types';\nimport { emptyArray } from '../../../utils';\nimport { SearchAggregateMethods } from '../../extra-features/search/search';\n\n// Helper function to check if we're selecting a count on this query.\n// Used in `create` to not return a full record after `count()` method.\nexport const isSelectingCount = (q: PickQueryQ) => {\n const { expr } = q.q;\n return (\n expr instanceof FnExpression && expr.fn === 'count' && expr.args[0] === '*'\n );\n};\n\n// `count` returns `bigint` type that is represented by a string.\n// This is needed to parse the value back to a number.\nconst intNullable = new IntegerColumn(internalSchemaConfig)\n .nullable()\n .parse(parseInt as never);\n\n// double-precision is represented by string in JS, parse it to float.\nconst floatNullable = new RealColumn(internalSchemaConfig)\n .nullable()\n .parse(parseFloat as never);\n\nconst booleanNullable = BooleanColumn.instanceSkipValueToArray.nullable();\n\nconst textNullable = TextColumn.instance.nullable();\n\nconst jsonTextNullable = JSONTextColumn.instance.nullable();\n\nconst xmlNullable = XMLColumn.instance.nullable();\n\nconst stringAsNumberNullable =\n new (NumberAsStringBaseColumn as unknown as typeof DecimalColumn)(\n internalSchemaConfig,\n ).nullable();\n\nintNullable.data.skipValueToArray =\n floatNullable.data.skipValueToArray =\n textNullable.data.skipValueToArray =\n jsonTextNullable.data.skipValueToArray =\n xmlNullable.data.skipValueToArray =\n stringAsNumberNullable.data.skipValueToArray =\n true;\n\nconst numericResultColumn = (\n q: unknown,\n arg: PropertyKey | Expression,\n): Column => {\n const query = q as Query;\n\n const type =\n typeof arg === 'string'\n ? _getSelectableColumn(query, arg)\n : (arg as Expression).result.value;\n\n return type instanceof NumberBaseColumn\n ? floatNullable\n : stringAsNumberNullable;\n};\n\ninterface OperatorsCount extends OperatorsNumber {\n isCount: true;\n}\n\ntype CountColumn = Column.Pick.QueryColumnOfTypeAndOps<\n 'int8',\n number,\n OperatorsCount\n>;\n\ntype CountReturn<T> = SetQueryReturnsColumnOrThrow<T, CountColumn> &\n OperatorsCount;\n\ntype SelectableDataType<\n T extends PickQuerySelectable,\n DataType extends string,\n> =\n | {\n [K in keyof T['__selectable']]: T['__selectable'][K]['column']['dataType'] extends DataType\n ? K\n : never;\n }[keyof T['__selectable']]\n | Expression<Column.Pick.QueryColumnOfDataType<DataType>>;\n\ntype NumericReturn<\n T extends PickQuerySelectable,\n Arg,\n> = Arg extends keyof T['__selectable']\n ? SetQueryReturnsColumnOrThrow<\n T,\n Column.Pick.QueryColumnOfTypeAndOps<\n T['__selectable'][Arg]['column']['dataType'],\n T['__selectable'][Arg]['column']['__type'] | null,\n OperatorsNumber\n >\n > &\n OperatorsNumber\n : Arg extends Expression\n ? SetQueryReturnsColumnOrThrow<\n T,\n Column.Pick.QueryColumnOfTypeAndOps<\n Arg['result']['value']['dataType'],\n Arg['result']['value']['__type'] | null,\n OperatorsNumber\n >\n > &\n OperatorsNumber\n : never;\n\ntype NullableNumberReturn<T, DataType> = SetQueryReturnsColumnOrThrow<\n T,\n Column.Pick.QueryColumnOfTypeAndOps<DataType, number | null, OperatorsNumber>\n> &\n OperatorsNumber;\n\nexport type BooleanQueryColumn = Column.Pick.QueryColumnOfTypeAndOps<\n 'bool',\n boolean,\n OperatorsBoolean\n>;\n\ntype BooleanNullable = Column.Pick.QueryColumnOfTypeAndOps<\n 'bool',\n boolean | null,\n OperatorsBoolean\n>;\n\ntype NullableBooleanReturn<T> = SetQueryReturnsColumnOrThrow<\n T,\n BooleanNullable\n> &\n OperatorsBoolean;\n\ntype NullableJSONAggReturn<\n T extends PickQuerySelectable,\n Arg extends SelectableOrExpression<T>,\n> = SetQueryReturnsColumnOrThrow<\n T,\n {\n dataType: 'json';\n __type: (ExpressionOutput<T, Arg>['__type'] | null)[] | null;\n __outputType: (ExpressionOutput<T, Arg>['__outputType'] | null)[] | null;\n __queryType: (ExpressionOutput<T, Arg>['__queryType'] | null)[] | null;\n operators: OperatorsArray<never>;\n }\n> &\n OperatorsArray<never>;\n\ninterface RecordSelectableOrExpression<T extends PickQuerySelectable> {\n [K: string]: SelectableOrExpression<T>;\n}\n\ntype NullableJSONObjectReturn<\n T extends PickQuerySelectable,\n Obj extends RecordSelectableOrExpression<T>,\n> = SetQueryReturnsColumnOrThrow<\n T,\n {\n dataType: 'json';\n __type:\n | {\n [K in keyof Obj]: ExpressionOutput<T, Obj[K]>['__type'];\n }\n | null;\n __outputType:\n | {\n [K in keyof Obj]: ExpressionOutput<T, Obj[K]>['__outputType'];\n }\n | null;\n __queryType:\n | {\n [K in keyof Obj]: ExpressionOutput<T, Obj[K]>['__queryType'];\n }\n | null;\n operators: OperatorsAny;\n }\n> &\n OperatorsAny;\n\ntype StringColumn = Column.Pick.QueryColumnOfTypeAndOps<\n string,\n string,\n OperatorsText\n>;\n\ntype StringNullable = Column.Pick.QueryColumnOfTypeAndOps<\n string,\n string | null,\n OperatorsText\n>;\n\ntype NullableStringReturn<T> = SetQueryReturnsColumnOrThrow<T, StringNullable> &\n OperatorsText;\n\nexport interface AggregateArgTypes {\n minMax: // bpchar, timetz not supported by ORM\n | 'citext'\n | 'date'\n | 'float4'\n | 'float8'\n | 'inet'\n | 'int2'\n | 'int4'\n | 'int8'\n | 'interval'\n | 'money'\n | 'numeric'\n | 'text'\n | 'time'\n | 'timestamp'\n | 'timestamptz';\n sum:\n | 'float4'\n | 'float8'\n | 'int2'\n | 'int4'\n | 'int8'\n | 'interval'\n | 'money'\n | 'numeric';\n avg: // unlike sum, avg has no money\n 'float4' | 'float8' | 'int2' | 'int4' | 'int8' | 'interval' | 'numeric';\n bit: 'bit' | 'int2' | 'int4' | 'int8';\n bool: 'bool';\n stringAgg: 'bytea' | 'text';\n}\n\nexport interface AggregateMethods extends SearchAggregateMethods {}\n\n// Query methods to get a single value for an aggregate function\nexport class AggregateMethods {\n /**\n * Count records with the `count` function:\n *\n * ```ts\n * // count all records:\n * const result: number = await db.table.count();\n *\n * // count records where a column is not NULL:\n * db.table.count('name');\n *\n * // see options above:\n * db.table.count('*', aggregateOptions);\n *\n * // select counts of people grouped by city\n * db.people\n * .select('city', {\n * population: (q) => q.count(),\n * })\n * .group('city');\n * ```\n *\n * @param arg - optionally, provide a column or a raw SQL for the `count` argument\n * @param options - aggregation options\n */\n count<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpression<T> = '*',\n options?: AggregateOptions<T>,\n ): CountReturn<T> {\n return makeFnExpression(\n this,\n intNullable,\n 'count',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Get the minimum value for the specified numeric column, returns number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = await db.table.min(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select min product price grouped by product category\n * db.product\n * .select('category', {\n * minPrice: (q) => q.min('price'),\n * })\n * .group('category')\n * .take();\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n min<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['minMax']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'min',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Gets the maximum value for the specified numeric column, returns number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = await db.table.max(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select max product price grouped by product category\n * db.product\n * .select('category', {\n * maxPrice: (q) => q.max('price'),\n * })\n * .group('category')\n * .take();\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n max<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['minMax']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'max',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Retrieve the sum of the values of a given numeric column, returns number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = await db.table.sum(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select sum of employee salaries grouped by years\n * db.employee\n * .select('year', {\n * yearlySalaries: (q) => q.sum('salary'),\n * })\n * .group('year');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n sum<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['sum']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'sum',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Retrieve the average value of a numeric column, it returns a number or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = db.table.avg('numericColumn', aggregateOptions);\n *\n * // select average movies ratings\n * db.movie\n * .select('title', {\n * averageRating: (q) => q.avg('rating'),\n * })\n * .group('title');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n avg<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['avg']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'avg',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Bitwise `and` aggregation, returns `number` or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = db.table.bitAnd(\n * 'numericColumn',\n * aggregateOptions,\n * );\n *\n * // select grouped `bitAnd`\n * db.table\n * .select('someColumn', {\n * bitAnd: (q) => q.bitAnd('numericColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n bitAnd<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['bit']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'bit_and',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Bitwise `or` aggregation, returns `number` or `null` if there are no records.\n *\n * ```ts\n * const result: number | null = db.table.bitOr('numericColumn', aggregateOptions);\n *\n * // select grouped `bitOr`\n * db.table\n * .select('someColumn', {\n * bitOr: (q) => q.bitOr('numericColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - numeric column or raw SQL\n * @param options - aggregation options\n */\n bitOr<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableDataType<T, AggregateArgTypes['bit']>,\n >(this: T, arg: Arg, options?: AggregateOptions<T>): NumericReturn<T, Arg> {\n return makeFnExpression(\n this,\n numericResultColumn(this, arg),\n 'bit_or',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Aggregate booleans with `and` logic, it returns `boolean` or `null` if there are no records.\n *\n * ```ts\n * const result: boolean | null = db.table.boolAnd(\n * 'booleanColumn',\n * aggregateOptions,\n * );\n *\n * // select grouped `boolAnd`\n * db.table\n * .select('someColumn', {\n * boolAnd: (q) => q.boolAnd('booleanColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - boolean column or raw SQL\n * @param options - aggregation options\n */\n boolAnd<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableDataType<T, AggregateArgTypes['bool']>,\n options?: AggregateOptions<T>,\n ): NullableBooleanReturn<T> {\n return makeFnExpression(\n this,\n booleanNullable,\n 'bool_and',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Aggregate booleans with `or` logic, it returns `boolean` or `null` if there are no records.\n *\n * ```ts\n * const result: boolean | null = db.table.boolOr(\n * 'booleanColumn',\n * aggregateOptions,\n * );\n *\n * // select grouped `boolOr`\n * db.table\n * .select('someColumn', {\n * boolOr: (q) => q.boolOr('booleanColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - boolean column or raw SQL\n * @param options - aggregation options\n */\n boolOr<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableDataType<T, AggregateArgTypes['bool']>,\n options?: AggregateOptions<T>,\n ): NullableBooleanReturn<T> {\n return makeFnExpression(\n this,\n booleanNullable,\n 'bool_or',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Equivalent to {@link boolAnd}\n */\n every<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableDataType<T, AggregateArgTypes['bool']>,\n options?: AggregateOptions<T>,\n ): NullableBooleanReturn<T> {\n return makeFnExpression(\n this,\n booleanNullable,\n 'every',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Aggregate values into an array by using `json_agg`. Returns array of values or `null` if there are no records.\n *\n * `jsonAgg` is working a bit faster, `jsonbAgg` is better only when applying JSON operations in SQL.\n *\n * ```ts\n * const idsOrNull: number[] | null = db.table.jsonAgg('id', aggregateOptions);\n *\n * const namesOrNull: string[] | null = db.table.jsonbAgg(\n * 'name',\n * aggregateOptions,\n * );\n *\n * // select grouped `jsonAgg`\n * db.table\n * .select('someColumn', {\n * jsonAgg: (q) => q.jsonAgg('anyColumn'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - any column or raw SQL\n * @param options - aggregation options\n */\n jsonAgg<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableOrExpression<T>,\n >(\n this: T,\n arg: Arg,\n options?: AggregateOptions<T>,\n ): NullableJSONAggReturn<T, Arg> {\n return makeFnExpression(\n this,\n jsonTextNullable,\n 'json_agg',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * See {@link jsonAgg}\n */\n jsonbAgg<\n T extends PickQuerySelectableResultRelationsWindows,\n Arg extends SelectableOrExpression<T>,\n >(\n this: T,\n arg: Arg,\n options?: AggregateOptions<T>,\n ): NullableJSONAggReturn<T, Arg> {\n return makeFnExpression(\n this,\n jsonTextNullable,\n 'jsonb_agg',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * It does the construction of JSON objects, keys are provided strings and values can be table columns or raw SQL expressions, and returns `object` or `null` if no records.\n *\n * `jsonObjectAgg` is different from `jsonbObjectAgg` by internal representation in the database, `jsonObjectAgg` is a bit faster as it constructs a simple string.\n *\n * ```ts\n * import { TextColumn } from './string';\n *\n * // object has type { nameAlias: string, foo: string } | null\n * const object = await db.table.jsonObjectAgg(\n * {\n * // select a column with alias\n * nameAlias: 'name',\n * // select raw SQL with alias\n * foo: sql<string>`\"bar\" || \"baz\"`,\n * },\n * aggregateOptions,\n * );\n *\n * // select aggregated object\n * db.table.select('id', {\n * object: (q) =>\n * q.jsonObjectAgg({\n * nameAlias: 'name',\n * foo: sql<string>`\"bar\" || \"baz\"`,\n * }),\n * });\n * ```\n *\n * @param arg - object where values are column names or SQL\n * @param options - aggregation options\n */\n jsonObjectAgg<\n T extends PickQuerySelectableResultRelationsWindows,\n Obj extends RecordSelectableOrExpression<T>,\n >(\n this: T,\n arg: Obj,\n options?: AggregateOptions<T>,\n ): NullableJSONObjectReturn<T, Obj> {\n return makeFnExpression(\n this,\n jsonTextNullable,\n 'json_object_agg',\n [{ pairs: arg }],\n options,\n ) as never;\n }\n\n /**\n * See {@link jsonObjectAgg}\n */\n jsonbObjectAgg<\n T extends PickQuerySelectableResultRelationsWindows,\n Obj extends RecordSelectableOrExpression<T>,\n >(\n this: T,\n arg: Obj,\n options?: AggregateOptions<T>,\n ): NullableJSONObjectReturn<T, Obj> {\n return makeFnExpression(\n this,\n jsonTextNullable,\n 'jsonb_object_agg',\n [{ pairs: arg }],\n options,\n ) as never;\n }\n\n /**\n * Select joined strings, it returns a string or `null` if no records.\n *\n * ```ts\n * const result: string | null = db.table.stringAgg(\n * 'name',\n * ', ',\n * aggregateOptions,\n * );\n *\n * // select joined strings grouped by some column\n * db.table\n * .select('someColumn', {\n * joinedNames: (q) => q.stringAgg('name', ', '),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - string column or SQL\n * @param delimiter - string to join with\n * @param options - aggration options\n */\n stringAgg<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableDataType<T, AggregateArgTypes['stringAgg']>,\n delimiter: string,\n options?: AggregateOptions<T>,\n ): NullableStringReturn<T> {\n return makeFnExpression(\n this,\n textNullable,\n 'string_agg',\n [arg, { value: delimiter }],\n options,\n ) as never;\n }\n\n /**\n * Concatenates `xml` columns, returns a `string` or `null` if no records.\n *\n * ```ts\n * const xml: string | null = await db.table.xmlAgg('xmlColumn', aggregateOptions);\n *\n * // select joined XMLs grouped by some column\n * db.table\n * .select('someColumn', {\n * joinedXMLs: (q) => q.xmlAgg('xml'),\n * })\n * .group('someColumn');\n * ```\n *\n * @param arg - column or SQL with XML\n * @param options - aggregation options\n */\n xmlAgg<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n arg: SelectableOrExpressionOfType<T, StringColumn>,\n options?: AggregateOptions<T>,\n ): NullableStringReturn<T> {\n return makeFnExpression(\n this,\n xmlNullable,\n 'xmlagg',\n [arg],\n options,\n ) as never;\n }\n\n /**\n * Selects the` row_number` window function.\n *\n * Returns the number of the current row within its partition, counting from 1.\n *\n * ```ts\n * // result is of type Array<{ rowNumber: number }>\n * const result = await db.table.select({\n * rowNumber: (q) =>\n * q.rowNumber({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n rowNumber<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T, 'int8'> {\n return makeFnExpression(this, intNullable, 'row_number', emptyArray, {\n over,\n }) as never;\n }\n\n /**\n * Selects the` rank` window function.\n *\n * Returns the rank of the current row, with gaps; that is, the row_number of the first row in its peer group.\n *\n * ```ts\n * // result is of type Array<{ rank: number }>\n * const result = await db.table.select({\n * rank: (q) =>\n * q.rank({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n rank<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T, 'int8'> {\n return makeFnExpression(this, intNullable, 'rank', emptyArray, {\n over,\n }) as never;\n }\n\n /**\n * Selects the` dense_rank` window function.\n *\n * Returns the rank of the current row, without gaps; this function effectively counts peer groups.\n *\n * ```ts\n * // result is of type Array<{ denseRank: number }>\n * const result = await db.table.select({\n * denseRank: (q) =>\n * q.denseRank({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n denseRank<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T, 'int8'> {\n return makeFnExpression(this, intNullable, 'dense_rank', emptyArray, {\n over,\n }) as never;\n }\n\n /**\n * Selects the `percent_rank` window function.\n *\n * Returns the relative rank of the current row, that is (rank - 1) / (total partition rows - 1). The value thus ranges from 0 to 1 inclusive.\n *\n * ```ts\n * // result is of type Array<{ percentRank: number }>\n * const result = await db.table.select({\n * percentRank: (q) =>\n * q.percentRank({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n percentRank<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T, 'float8'> {\n return makeFnExpression(this, intNullable, 'percent_rank', emptyArray, {\n over,\n }) as never;\n }\n\n /**\n * Selects the `cume_dist` window function.\n *\n * Returns the cumulative distribution, that is (number of partition rows preceding or peers with current row) / (total partition rows). The value thus ranges from 1/N to 1.\n *\n * ```ts\n * // result is of type Array<{ cumeDist: number }>\n * const result = await db.table.select({\n * cumeDist: (q) =>\n * q.cumeDist({\n * partitionBy: 'someColumn',\n * order: { createdAt: 'ASC' },\n * }),\n * });\n * ```\n *\n * @param over - OVER clause config\n */\n cumeDist<T extends PickQuerySelectableResultRelationsWindows>(\n this: T,\n over?: Over<T>,\n ): NullableNumberReturn<T, 'float8'> {\n return makeFnExpression(this, floatNullable, 'cume_dist', emptyArray, {\n over,\n }) as never;\n }\n}\n","import {\n Query,\n SetQueryReturnsColumnOptional,\n QueryTakeOptional,\n SetQueryReturnsRowCount,\n SetQueryReturnsRowCountMany,\n QueryOrExpression,\n IsQuery,\n isQuery,\n SetQueryReturnsOneResult,\n SetQueryReturnsColumnResult,\n SetQueryResult,\n SetQueryReturnsAll,\n SetValueQueryReturnsPluckColumn,\n} from '../../query';\nimport {\n anyShape,\n Column,\n ColumnSchemaConfig,\n ColumnsShape,\n VirtualColumn,\n} from '../../../columns';\nimport { isSelectingCount } from '../aggregate/aggregate';\nimport {\n CreateFromMethodNames,\n CreateManyFromMethodNames,\n getFromSelectColumns,\n} from './create-from';\nimport { _querySelectAll } from '../select/select';\nimport { prepareSubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport {\n PickQueryDefaults,\n PickQueryHasSelect,\n PickQueryInputType,\n PickQueryQ,\n PickQueryRelations,\n PickQueryResult,\n PickQueryReturnType,\n PickQueryRelationsDataForCreate,\n PickQueryRelationsDataForCreateOptional,\n PickQueryShape,\n PickQueryUniqueProperties,\n PickQueryWithData,\n} from '../../pick-query-types';\nimport { EmptyObject, FnUnknownToUnknown, RecordUnknown } from '../../../utils';\nimport { RelationConfigDataForCreate } from '../../relations';\nimport { Expression, isExpression } from '../../expressions/expression';\nimport { _getQueryFreeAlias, _setQueryAlias } from '../as/as';\nimport { _clone } from '../clone/clone';\n\nimport { joinSubQuery } from '../join/join';\nimport { resolveSubQueryCallback } from '../../internal-features/sub-query/sub-query';\nimport { OrchidOrmInternalError } from '../../errors';\nimport { OnConflictMerge } from './insert.sql';\nimport { ToSQLQuery } from '../../sql/to-sql';\nimport { QueryData } from '../../query-data';\nimport { throwIfReadOnly } from '../../query.utils';\n\nexport interface CreateSelf\n extends\n PickQueryHasSelect,\n PickQueryDefaults,\n PickQueryResult,\n PickQueryRelations,\n PickQueryRelationsDataForCreate,\n PickQueryRelationsDataForCreateOptional,\n PickQueryWithData,\n PickQueryReturnType,\n PickQueryShape,\n PickQueryUniqueProperties,\n PickQueryInputType,\n Query.Pick.IsNotReadOnly {}\n\n// Type of argument for `create`, `createMany`, optional argument for `createOneFrom`,\n// `defaults` use a Partial of it.\n//\n// It maps `__inputType` of the table into object to accept a corresponding type,\n// or raw SQL per column, or a sub-query for a column.\n//\n// It allows to omit `belongsTo` foreign keys when a `belongsTo` record is provided by a relation name.\n// For example, it allows to create with `db.book.create({ authorId: 123 })`\n// or with `db.book.create({ author: authorData })`\n//\n// It enables all forms of relation operations such as nested `create`, `connect`, etc.\nexport type CreateData<T extends CreateSelf> =\n EmptyObject extends T['relations']\n ? // if no relations, don't load TS with extra calculations\n CreateDataWithDefaults<T, keyof T['__defaults']>\n : CreateRelationsData<T>;\n\nexport type CreateDataOmit<\n T extends CreateSelf,\n OmitKeys,\n> = EmptyObject extends T['relations']\n ? // if no relations, don't load TS with extra calculations\n CreateDataWithDefaultsOmit<T, keyof T['__defaults'], OmitKeys>\n : CreateRelationsDataOmit<T, OmitKeys>;\n\ntype CreateDataWithDefaults<\n T extends CreateSelf,\n Defaults extends PropertyKey,\n> = {\n [K in keyof T['__inputType'] as K extends Defaults\n ? never\n : K]: K extends Defaults ? never : CreateColumn<T, K>;\n} & {\n [K in Defaults]?: K extends keyof T['__inputType']\n ? CreateColumn<T, K>\n : never;\n};\n\ntype CreateDataWithDefaultsOmit<\n T extends CreateSelf,\n Defaults extends PropertyKey,\n OmitKeys,\n> = {\n [K in keyof T['__inputType'] as K extends Defaults | OmitKeys\n ? never\n : K]: K extends Defaults ? never : CreateColumn<T, K>;\n} & {\n [K in Defaults as K extends OmitKeys\n ? never\n : K]?: K extends keyof T['__inputType'] ? CreateColumn<T, K> : never;\n};\n\n// Foreign key columns marked as writable via `makeColumnWritable`, which\n// should not be omitted from `create` data.\ntype WritableForeignKeys<\n T extends CreateSelf,\n AllFKeys extends PropertyKey,\n> = AllFKeys extends infer K\n ? K extends keyof T['shape']\n ? T['shape'][K] extends { data: { makeColumnWritable: true } }\n ? K\n : never\n : never\n : never;\n\n// Type of available variants to provide for a specific column when creating\nexport type CreateColumn<\n T extends CreateSelf,\n K extends keyof T['__inputType'],\n> = T['__inputType'][K] | ((q: T) => QueryOrExpression<T['__inputType'][K]>);\n\n// Combine data of the table with data that can be set for relations\nexport type CreateRelationsData<T extends CreateSelf> =\n // Data except `belongsTo` foreignKeys: { name: string, fooId: number } -> { name: string }\n CreateDataWithDefaultsOmit<\n T,\n keyof T['__defaults'],\n Exclude<\n T['relations'][keyof T['relations']]['omitForeignKeyInCreate'],\n WritableForeignKeys<\n T,\n T['relations'][keyof T['relations']]['omitForeignKeyInCreate']\n >\n >\n > &\n // Intersect create data per foreign key column, while same-column\n // belongsTo relations stay in a shared union.\n CreateRelationsDataOmittingFKeys<T, T['relationsDataForCreate']> &\n T['relationsDataForCreateOptional'];\n\nexport type CreateRelationsDataOmit<T extends CreateSelf, OmitKeys> =\n // Data except `belongsTo` foreignKeys: { name: string, fooId: number } -> { name: string }\n CreateDataWithDefaultsOmit<\n T,\n keyof T['__defaults'],\n | Exclude<\n T['relations'][keyof T['relations']]['omitForeignKeyInCreate'],\n WritableForeignKeys<\n T,\n T['relations'][keyof T['relations']]['omitForeignKeyInCreate']\n >\n >\n | OmitKeys\n > &\n // Intersect create data per foreign key column, while same-column\n // belongsTo relations stay in a shared union.\n CreateRelationsDataOmittingFKeys<T, T['relationsDataForCreate']> &\n T['relationsDataForCreateOptional'];\n\n// Intersection of create data grouped by column/relation.\n// For belongsTo relations sharing a column this produces:\n// { fooId: number } | { foo: object } | { activeFoo: object }.\nexport type CreateRelationsDataOmittingFKeys<\n T extends CreateSelf,\n Data,\n> = EmptyObject extends Data\n ? EmptyObject\n : // Based on UnionToIntersection from here https://stackoverflow.com/a/50375286\n {\n [K in keyof Data]: CreateRelationDataOmittingFKeys<T, Data[K]>;\n }[keyof Data] extends (u: infer Obj) => void // must be handled as a function argument, belongsTo.test relies on this\n ? Obj\n : never;\n\ntype CreateRelationDataOmittingFKeys<T extends CreateSelf, Union> = (\n u: Union extends RelationConfigDataForCreate\n ? // omit relation columns if they are in defaults, is tested in factory.test.ts\n Union['columns'] extends keyof T['__defaults']\n ? Pick<\n CreateDataWithDefaults<T, keyof T['__defaults']>,\n Union['columns']\n > &\n Partial<Union['nested']>\n :\n | (Pick<\n {\n [P in keyof T['__inputType']]: CreateColumn<T, P>;\n },\n Union['columns'] & keyof T['__inputType']\n > & {\n [K in keyof Union['nested']]?: never;\n })\n | Union['nested']\n : // hasOne, hasMany, hasAndBelongsToMany\n Union,\n) => void;\n\n// `create` method output type\n// - if `count` method is preceding `create`, will return 0 or 1 if created.\n// - If the query returns multiple, forces it to return one record.\n// - if it is a `pluck` query, forces it to return a single value\nexport type CreateResult<T extends CreateSelf, Data> = T extends {\n isCount: true;\n}\n ? T\n : T['returnType'] extends undefined | 'all'\n ? SetQueryReturnsOneResult<T, NarrowCreateResult<T, Data>>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumnResult<T, NarrowCreateResult<T, Data>>\n : SetQueryResult<T, NarrowCreateResult<T, Data>>;\n\n// `insert` method output type\n// - query returns inserted row count by default.\n// - returns a record with selected columns if the query has a select.\n// - if the query returns multiple, forces it to return one record.\n// - if it is a `pluck` query, forces it to return a single value\ntype InsertResult<T extends CreateSelf, Data> = T['__hasSelect'] extends true\n ? T['returnType'] extends undefined | 'all'\n ? SetQueryReturnsOneResult<T, NarrowCreateResult<T, Data>>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumnResult<T, NarrowCreateResult<T, Data>>\n : SetQueryResult<T, NarrowCreateResult<T, Data>>\n : SetQueryReturnsRowCount<T>;\n\n// `createMany` method output type\n// - if `count` method is preceding `create`, will return 0 or 1 if created.\n// - If the query returns a single record, forces it to return multiple.\n// - otherwise, query result remains as is.\ntype CreateManyResult<T extends CreateSelf> = T extends { isCount: true }\n ? T\n : T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAll<T>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetValueQueryReturnsPluckColumn<T>\n : T;\n\n// `insertMany` method output type\n// - query returns inserted row count by default.\n// - returns records with selected columns if the query has a select.\n// - if the query returns a single record, forces it to return multiple records.\ntype InsertManyResult<T extends CreateSelf> = T['__hasSelect'] extends true\n ? T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAll<T>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetValueQueryReturnsPluckColumn<T>\n : T\n : SetQueryReturnsRowCountMany<T>;\n\n/**\n * When creating a record with a *belongs to* nested record,\n * un-nullify foreign key columns of the result.\n *\n * The same should work as well with any non-null columns passed to `create`, but it's to be implemented later.\n */\ntype NarrowCreateResult<\n T extends CreateSelf,\n Data,\n> = EmptyObject extends T['relations']\n ? T['result']\n : {\n [K in keyof T['result']]: true extends {\n [R in keyof T['relations']]: K extends T['relations'][R]['omitForeignKeyInCreate']\n ? R extends keyof Data\n ? true\n : T['relations'][R]['omitForeignKeyInCreate'] extends keyof Data\n ?\n | null\n | undefined extends Data[T['relations'][R]['omitForeignKeyInCreate']]\n ? never\n : true\n : never\n : never;\n }[keyof T['relations']]\n ? Column.Pick.QueryColumnOfTypeAndOps<\n string,\n Exclude<T['result'][K]['__outputType'], null>,\n T['result'][K]['operators']\n >\n : T['result'][K];\n };\n\n// `onConflictDoNothing()` method output type:\n// overrides query return type from 'oneOrThrow' to 'one', from 'valueOrThrow' to 'value',\n// because `ignore` won't return any data in case of a conflict.\ntype IgnoreResult<T extends CreateSelf> = T['returnType'] extends 'oneOrThrow'\n ? QueryTakeOptional<T>\n : T['returnType'] extends 'valueOrThrow'\n ? SetQueryReturnsColumnOptional<T, T['result']['value']>\n : T;\n\n// Argument of `onConflict`, can be:\n// - a unique column name\n// - an array of unique column names\n// - raw or other kind of Expression\ntype OnConflictArg<T extends PickQueryUniqueProperties> =\n | T['internal']['uniqueColumnNames']\n | T['internal']['uniqueColumnTuples']\n | Expression\n | { constraint: T['internal']['uniqueConstraints'] };\n\nexport type AddQueryDefaults<\n T extends CreateSelf,\n DefaultKeys extends PropertyKey,\n> = {\n [K in keyof T]: K extends '__defaults'\n ? { [K in keyof T['__defaults'] | DefaultKeys]: true }\n : T[K];\n};\n\n/**\n * Used by ORM to access the context of current create query.\n * Is passed to the `create` method of a {@link VirtualColumn}\n */\nexport interface CreateCtx {\n columns: Map<string, number>;\n returnTypeAll?: true;\n resultAll: RecordUnknown[];\n}\n\n// Type of `encode` of columns.\ninterface RecordEncoder {\n [K: string]: FnUnknownToUnknown;\n}\n\n// Function called by all `create` methods to override query select.\n// Clears select if query returning nothing or a count.\n// Otherwise, selects all if query doesn't have select.\nexport const createSelect = (q: Query) => {\n if (q.q.returnType === 'void' || isSelectingCount(q)) {\n q.q.select = undefined;\n } else if (!q.q.select) {\n _querySelectAll(q);\n q.q.returning = true;\n }\n};\n\ninterface CreateHandler {\n column: {\n create(\n query: CreateSelf,\n ctx: CreateCtx,\n items: RecordUnknown[],\n rowIndexes: number[],\n count: number,\n ): void;\n };\n rowIndexes: number[];\n}\n\ninterface CreateHandlers {\n [columnName: string]: CreateHandler;\n}\n\n/**\n * Processes arguments of data to create.\n * If the passed key is for a {@link VirtualColumn}, calls `create` of the virtual column.\n * Otherwise, ignores keys that aren't relevant to the table shape,\n * collects columns to the `ctx.columns` set, collects columns encoders.\n *\n * @param q - query object.\n * @param item - argument of data to create.\n * @param rowIndex - index of record's data in `createMany` args array.\n * @param ctx - context of create query to be shared with a {@link VirtualColumn}.\n * @param encoders - to collect `encode`s of columns.\n * @param createHandlers - collects column `create` functions per column having it, and collects row indexes having a value for this column\n */\nconst processCreateItem = (\n q: CreateSelf,\n item: RecordUnknown,\n rowIndex: number,\n ctx: CreateCtx,\n encoders: RecordEncoder,\n createHandlers: CreateHandlers,\n) => {\n const shape = (q as Query).shape as ColumnsShape;\n for (const key in item) {\n const column = shape[key];\n if (!column) continue;\n\n if (column.data.virtual) {\n const virtual = column as VirtualColumn<ColumnSchemaConfig>;\n if (virtual.create) {\n if (createHandlers[key]) {\n createHandlers[key].rowIndexes.push(rowIndex);\n } else {\n createHandlers[key] = {\n column: virtual,\n rowIndexes: [rowIndex],\n } as CreateHandler;\n }\n }\n continue;\n }\n\n throwOnReadOnly(q, column, key);\n\n let value = item[key];\n\n if (typeof value === 'function') {\n value = item[key] = resolveSubQueryCallback(\n q as unknown as ToSQLQuery,\n value as (q: ToSQLQuery) => ToSQLQuery,\n );\n\n if (isQuery(value)) {\n value = item[key] = joinSubQuery(\n q as Query,\n prepareSubQueryForSql(q as Query, value as Query),\n );\n }\n }\n\n if (\n !ctx.columns.has(key) &&\n ((column && !column.data.readOnly) || shape === anyShape) &&\n value !== undefined\n ) {\n ctx.columns.set(key, ctx.columns.size);\n encoders[key] = column?.data.encode as FnUnknownToUnknown;\n }\n }\n};\n\nconst runCreateHandlers = (\n q: CreateSelf,\n ctx: CreateCtx,\n data: RecordUnknown[],\n createHandlers: CreateHandlers,\n) => {\n const count = data.length;\n for (const key in createHandlers) {\n const { column, rowIndexes } = createHandlers[key];\n const items = rowIndexes.map((i) => data[i]);\n column.create(q, ctx, items, rowIndexes, count);\n }\n};\n\nexport const throwOnReadOnly = (\n q: unknown,\n column: Column.Pick.Data,\n key: string,\n) => {\n if (column.data.appReadOnly || column.data.readOnly) {\n throw new OrchidOrmInternalError(\n q as Query,\n 'Trying to insert a readonly column',\n { column: key },\n );\n }\n};\n\n// Creates a new context of create query.\nexport const createCtx = (): CreateCtx => ({\n columns: new Map(),\n resultAll: undefined as unknown as RecordUnknown[],\n});\n\n/**\n * Processes arguments of `create`, `insert`, `createOneFrom` and `insertOneFrom` when it has data.\n * Apply defaults that may be present on a query object to the data.\n * Maps data object into array of values, encodes values when the column has an encoder.\n *\n * @param q - query object.\n * @param data - argument with data for create.\n * @param ctx - context of the create query.\n */\nexport const handleOneData = (\n q: CreateSelf,\n data: RecordUnknown,\n ctx: CreateCtx,\n): { columns: string[]; values: unknown[][] } => {\n const encoders: RecordEncoder = {};\n const defaults = (q as Query).q.defaults;\n\n data = defaults ? { ...defaults, ...data } : { ...data };\n\n const createHandlers: CreateHandlers = {};\n\n processCreateItem(q, data, 0, ctx, encoders, createHandlers);\n\n runCreateHandlers(q, ctx, [data], createHandlers);\n\n const columns = Array.from(ctx.columns.keys());\n const values = [\n columns.map((key) =>\n // undefined values were stripped and no need to check for them\n encoders[key] && !isExpression(data[key]) && data[key] !== null\n ? encoders[key](data[key])\n : data[key],\n ),\n ];\n\n return { columns, values };\n};\n\n/**\n * Processes arguments of `createMany`, `insertMany`.\n * Apply defaults that may be present on a query object to the data.\n * Maps data objects into array of arrays of values, encodes values when the column has an encoder.\n *\n * @param q - query object.\n * @param data - arguments with data for create.\n * @param ctx - context of the create query.\n */\nexport const handleManyData = (\n q: CreateSelf,\n data: RecordUnknown[],\n ctx: CreateCtx,\n): { columns: string[]; values: unknown[][] } => {\n const encoders: RecordEncoder = {};\n const defaults = (q as Query).q.defaults;\n\n data = data.map(\n defaults ? (item) => ({ ...defaults, ...item }) : (item) => ({ ...item }),\n );\n\n const createHandlers: CreateHandlers = {};\n\n const len = data.length;\n for (let i = 0; i < len; i++) {\n processCreateItem(q, data[i], i, ctx, encoders, createHandlers);\n }\n\n runCreateHandlers(q, ctx, data, createHandlers);\n\n const values = Array(data.length);\n const columns = Array.from(ctx.columns.keys());\n\n for (let i = 0; i < len; i++) {\n const item = data[i];\n (values as unknown[][])[i] = columns.map((key) =>\n encoders[key] && item[key] !== undefined && !isExpression(item[key])\n ? encoders[key](item[key])\n : item[key],\n );\n }\n\n return { columns, values };\n};\n\n/**\n * Core function that is used by all `create` and `insert` methods.\n * Sets query `type` to `insert` for `toSQL` to know it's for inserting.\n * Sets query columns and values.\n * Sets query kind, which is checked by `update` method when returning a query from callback.\n * Overrides query return type according to what is current create method supposed to return.\n *\n * @param self - query object.\n * @param columns - columns list of all values.\n * @param insertFrom - query of `createFrom` and alike\n * @param values - array of arrays matching columns\n * @param many - whether it's for creating one or many.\n * @param queryMany - whether is createForEachFrom\n */\nexport const insert = (\n self: CreateSelf,\n {\n columns,\n insertFrom,\n values,\n }: {\n insertFrom?: IsQuery;\n columns: string[];\n values: QueryData['values'];\n },\n many?: boolean,\n queryMany?: boolean,\n) => {\n const { q } = self as unknown as { q: QueryData };\n\n if (!q.select?.length) {\n q.returning = true;\n }\n\n q.type = 'insert';\n\n insertFrom = insertFrom\n ? (q.insertFrom = prepareSubQueryForSql(self as never, insertFrom as Query))\n : q.insertFrom;\n\n if (insertFrom) {\n if (q.insertFrom) {\n const obj = getFromSelectColumns(\n self,\n q.insertFrom,\n {\n columns,\n values,\n },\n queryMany,\n );\n columns = obj.columns;\n values = obj.values;\n q.queryColumnsCount = obj.queryColumnsCount;\n }\n\n if (values.length > 1) {\n const insertValuesAs = _getQueryFreeAlias(q, 'v');\n _setQueryAlias(self as Query, 'v', insertValuesAs);\n\n q.insertValuesAs = insertValuesAs;\n }\n }\n\n q.columns = columns;\n q.values = values;\n\n const { select, returnType } = q;\n\n if (!select) {\n if (returnType !== 'void') {\n q.returnType = 'valueOrThrow';\n if (many) q.returningMany = true;\n }\n } else if (many) {\n if (returnType === 'one' || returnType === 'oneOrThrow') {\n q.returnType = 'all';\n } else if (returnType === 'value' || returnType === 'valueOrThrow') {\n q.returnType = 'pluck';\n }\n } else if (!returnType || returnType === 'all') {\n q.returnType = insertFrom ? (insertFrom as Query).q.returnType : 'one';\n } else if (returnType === 'pluck') {\n q.returnType = 'valueOrThrow';\n }\n\n return self;\n};\n\nexport const _queryCreate = <T extends CreateSelf, Data extends CreateData<T>>(\n q: T,\n data: Data,\n): CreateResult<T, Data> => {\n throwIfReadOnly(q as unknown as Query);\n createSelect(q as unknown as Query);\n return _queryInsert(q, data) as never;\n};\n\nexport const _queryInsert = <T extends CreateSelf, Data extends CreateData<T>>(\n query: T,\n data: Data,\n): InsertResult<T, Data> => {\n throwIfReadOnly(query as unknown as Query);\n const ctx = createCtx();\n const obj = handleOneData(query, data, ctx) as {\n columns: string[];\n values: QueryData['values'];\n };\n\n return insert(query, obj) as never;\n};\n\nexport const _queryCreateMany = <T extends CreateSelf>(\n q: T,\n data: CreateData<T>[],\n): CreateManyResult<T> => {\n throwIfReadOnly(q as unknown as Query);\n createSelect(q as unknown as Query);\n return _queryInsertMany(q, data as never) as never;\n};\n\nexport const _queryInsertMany = <T extends CreateSelf>(\n q: T,\n data: CreateData<T>[],\n): InsertManyResult<T> => {\n throwIfReadOnly(q as unknown as Query);\n const ctx = createCtx();\n let result = insert(q, handleManyData(q, data, ctx), true) as never;\n if (!data.length) result = (result as Query).none() as never;\n return result;\n};\n\nexport const _queryDefaults = <\n T extends CreateSelf,\n Data extends Partial<CreateData<T>>,\n>(\n q: T,\n data: Data,\n): AddQueryDefaults<T, keyof Data> => {\n (q as unknown as Query).q.defaults = data;\n return q as never;\n};\n\n/**\n * Names of all create methods,\n * is used in relational query to remove these methods if chained relation shouldn't have them,\n * for the case of has one/many through.\n */\nexport type CreateMethodsNames =\n | 'create'\n | 'insert'\n | 'createMany'\n | 'insertMany'\n | CreateFromMethodNames;\n\nexport type CreateManyMethodsNames =\n | 'createMany'\n | 'insertMany'\n | CreateManyFromMethodNames;\n\ntype ExtraPropertiesAreNotAllowed<\n T extends CreateSelf,\n Data,\n> = keyof Data extends keyof T['__inputType'] | keyof T['relations']\n ? Data\n : `Extra properties are not allowed: ${Exclude<\n keyof Data,\n keyof T['__inputType'] | keyof T['relations']\n > &\n string}`;\n\nexport class QueryCreate {\n /**\n * `create` and `insert` create a single record.\n *\n * Use `select`, `selectAll`, `get`, or `pluck` alongside `create` or `insert` to\n * specify returning columns.\n *\n * Each column may accept a specific value, a raw SQL, or a query that returns a single value.\n *\n * ```ts\n * import { sql } from './baseTable';\n *\n * const oneRecord = await db.table.create({\n * name: 'John',\n * password: '1234',\n * });\n *\n * // When using `.onConflictDoNothing()`,\n * // the record may be not created and the `createdCount` will be 0.\n * const createdCount = await db.table.insert(data).onConflictDoNothing();\n *\n * await db.table.create({\n * // raw SQL\n * column1: () => sql`'John' || ' ' || 'Doe'`,\n *\n * // query that returns a single value\n * // returning multiple values will result in Postgres error\n * column2: () => db.otherTable.get('someColumn'),\n *\n * // nesting creates, updates, deletes produces a single SQL\n * column4: () => db.otherTable.create(data).get('someColumn'),\n * column5: (q) => q.relatedTable.find(id).update(data).get('someColumn'),\n * });\n * ```\n *\n * Creational methods can be used in {@link WithMethods.with} expressions:\n *\n * ```ts\n * db.$qb\n * // create a record in one table\n * .with('a', db.table.select('id').create(data))\n * // create a record in other table using the first table record id\n * .with('b', (q) =>\n * db.otherTable.select('id').create({\n * ...otherData,\n * aId: () => q.from('a').get('id'),\n * }),\n * )\n * .from('b');\n * ```\n */\n create<T extends CreateSelf, Data extends CreateData<T>>(\n this: T,\n data: ExtraPropertiesAreNotAllowed<T, Data>,\n ): CreateResult<T, Data> {\n return _queryCreate(_clone(this) as unknown as T, data as never) as never;\n }\n\n /**\n * Works exactly as {@link create}, except that it returns inserted row count by default.\n */\n insert<T extends CreateSelf, Data extends CreateData<T>>(\n this: T,\n data: ExtraPropertiesAreNotAllowed<T, Data>,\n ): InsertResult<T, Data> {\n return _queryInsert(_clone(this) as unknown as T, data as never) as never;\n }\n\n /**\n * `createMany` and `insertMany` will create a batch of records.\n *\n * Each column may be set with a specific value, a raw SQL, or a query, the same as in {@link create}.\n *\n * In case one of the objects has fewer fields, the `DEFAULT` SQL keyword will be placed in its place in the `VALUES` statement.\n *\n * ```ts\n * const manyRecords = await db.table.createMany([\n * { key: 'value', otherKey: 'other value' },\n * { key: 'value' }, // default will be used for `otherKey`\n * ]);\n *\n * // `createdCount` will be 3.\n * const createdCount = await db.table.insertMany([data, data, data]);\n * ```\n *\n * When nesting creates, a separate create query will be executed for every time it's used:\n *\n * ```ts\n * // will be performed twice, even though it is defined once\n * const nestedCreate = db.otherTable.create(data).get('column');\n *\n * await db.table.createMany([{ column: nestedCreate }, { column: nestedCreate }]);\n * ```\n *\n * Because of a limitation of Postgres protocol, queries having more than **65535** of values are going to fail in runtime.\n * To solve this seamlessly, `OrchidORM` will automatically batch such queries, and wrap them into a transaction, unless they are already in a transaction.\n *\n * ```ts\n * // OK: executes 2 inserts wrapped into a transaction\n * await db.table.createMany(\n * Array.from({ length: 65536 }, () => ({ text: 'text' })),\n * );\n * ```\n *\n * However, this only works in the case shown above. This **won't** work if you're using the `createMany` in `with` statement,\n * or if the insert is used as a sub-query in other query part.\n *\n * @param data - array of records data, may have values, raw SQL, queries, relation operations\n */\n createMany<T extends CreateSelf>(\n this: T,\n data: CreateData<T>[],\n ): CreateManyResult<T> {\n return _queryCreateMany(_clone(this) as unknown as T, data) as never;\n }\n\n /**\n * Works exactly as {@link createMany}, except that it returns inserted row count by default.\n *\n * @param data - array of records data, may have values, raw SQL, queries, relation operations\n */\n insertMany<T extends CreateSelf>(\n this: T,\n data: CreateData<T>[],\n ): InsertManyResult<T> {\n return _queryInsertMany(_clone(this) as unknown as T, data) as never;\n }\n\n /**\n * `defaults` allows setting values that will be used later in `create`.\n *\n * Columns provided in `defaults` are marked as optional in the following `create`.\n *\n * Default data is the same as in {@link create} and {@link createMany},\n * so you can provide a raw SQL, or a query with a query.\n *\n * ```ts\n * // Will use firstName from defaults and lastName from create argument:\n * db.table\n * .defaults({\n * firstName: 'first name',\n * lastName: 'last name',\n * })\n * .create({\n * lastName: 'override the last name',\n * });\n * ```\n *\n * @param data - default values for `create` and `createMany` which will follow `defaults`\n */\n defaults<T extends CreateSelf, Data extends Partial<CreateData<T>>>(\n this: T,\n data: Data,\n ): AddQueryDefaults<T, keyof Data> {\n return _queryDefaults(_clone(this) as never, data as never);\n }\n\n /**\n * By default, violating unique constraint will cause the creative query to throw,\n * you can define what to do on a conflict: to ignore it, or to merge the existing record with a new data.\n *\n * A conflict occurs when a table has a primary key or a unique index on a column,\n * or a composite primary key unique index on a set of columns,\n * and a row being created has the same value as a row that already exists in the table in this column(s).\n *\n * Use {@link onConflictDoNothing} to suppress the error and continue without updating the record,\n * or the `merge` to update the record with new values automatically,\n * or the `set` to specify own values for the update.\n *\n * `onConflict` only accepts column names that are defined in `primaryKey` or `unique` in the table definition.\n * To specify a constraint, its name also must be explicitly set in `primaryKey` or `unique` in the table code.\n *\n * Postgres has a limitation that a single `INSERT` query can have only a single `ON CONFLICT` clause that can target only a single unique constraint\n * for updating the record.\n *\n * If your table has multiple potential reasons for unique constraint violation, such as username and email columns in a user table,\n * consider using `upsert` instead.\n *\n * ```ts\n * // leave `onConflict` without argument to ignore or merge on any conflict\n * db.table.create(data).onConflictDoNothing();\n *\n * // single column:\n * // (this requires a composite primary key or unique index, see below)\n * db.table.create(data).onConflict('email').merge();\n *\n * // array of columns:\n * db.table.create(data).onConflict(['email', 'name']).merge();\n *\n * // constraint name\n * db.table.create(data).onConflict({ constraint: 'unique_index_name' }).merge();\n *\n * // raw SQL expression:\n * db.table\n * .create(data)\n * .onConflict(sql`(email) where condition`)\n * .merge();\n * ```\n *\n * :::info\n * A primary key or a unique index for a **single** column can be fined on a column:\n *\n * ```ts\n * export const MyTable = defineTable('myTable', (t) => ({\n * pkey: t.uuid().primaryKey(),\n * unique: t.string().unique(),\n * }));\n * ```\n *\n * But for composite primary keys or indexes (having multiple columns), define it in a separate function:\n *\n * ```ts\n * export const MyTable = defineTable('myTable', (t) => ({\n * one: t.integer(),\n * two: t.string(),\n * three: t.boolean(),\n * }))\n * .primaryKey(['one', 'two'])\n * .unique(['two', 'three']);\n * ```\n * :::\n *\n * You can use the `sql` function exported from your table factory file in onConflict.\n * It can be useful to specify a condition when you have a partial index:\n *\n * ```ts\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * active: true,\n * })\n * // ignore only when having conflicting email and when active is true.\n * .onConflict(sql`(email) where active`)\n * .ignore();\n * ```\n *\n * For `merge` and `set`, you can append `where` to update data only for the matching rows:\n *\n * ```ts\n * const timestamp = Date.now();\n *\n * db.table\n * .create(data)\n * .onConflict('email')\n * .set({\n * name: 'John Doe',\n * updatedAt: timestamp,\n * })\n * .where({ updatedAt: { lt: timestamp } });\n * ```\n *\n * @param arg - optionally provide an array of columns\n */\n onConflict<T extends CreateSelf, Arg extends OnConflictArg<T>>(\n this: T,\n arg: Arg,\n ): OnConflictQueryBuilder<T, Arg> {\n return new OnConflictQueryBuilder(this, arg as never);\n }\n\n /**\n * Use `onConflictDoNothing` to suppress unique constraint violation error when creating a record.\n *\n * Adds `ON CONFLICT (columns) DO NOTHING` clause to the insert statement, columns are optional.\n *\n * Can also accept a constraint name.\n *\n * ```ts\n * db.table\n * .create({\n * email: 'ignore@example.com',\n * name: 'John Doe',\n * })\n * // on any conflict:\n * .onConflictDoNothing()\n * // or, for a specific column:\n * .onConflictDoNothing('email')\n * // or, for a specific constraint:\n * .onConflictDoNothing({ constraint: 'unique_index_name' });\n * ```\n *\n * When there is a conflict, nothing can be returned from the database, so `onConflictDoNothing` adds `| undefined` part to the response type.\n *\n * ```ts\n * const maybeRecord: RecordType | undefined = await db.table\n * .create(data)\n * .onConflictDoNothing();\n *\n * const maybeId: number | undefined = await db.table\n * .get('id')\n * .create(data)\n * .onConflictDoNothing();\n * ```\n *\n * When creating multiple records, only created records will be returned. If no records were created, array will be empty:\n *\n * ```ts\n * // array can be empty\n * const arr = await db.table.createMany([data, data, data]).onConflictDoNothing();\n * ```\n */\n onConflictDoNothing<T extends CreateSelf, Arg extends OnConflictArg<T>>(\n this: T,\n arg?: Arg,\n ): IgnoreResult<T> {\n const q = _clone(this);\n q.q.onConflict = {\n target: arg as never,\n };\n\n if (q.q.returnType === 'oneOrThrow') {\n q.q.returnType = 'one';\n } else if (q.q.returnType === 'valueOrThrow') {\n q.q.returnType = 'value';\n }\n\n return q as never;\n }\n}\n\ntype OnConflictSet<T extends CreateSelf> = {\n [K in keyof T['__inputType']]?:\n | T['__inputType'][K]\n | (() => QueryOrExpression<T['__inputType'][K]>);\n};\n\nexport class OnConflictQueryBuilder<\n T extends CreateSelf,\n Arg extends OnConflictArg<T> | undefined,\n> {\n constructor(\n private query: T,\n private onConflict: Arg,\n ) {}\n\n /**\n * Available only after `onConflict`.\n *\n * Updates the record with a given data when conflict occurs.\n *\n * ```ts\n * db.table\n * .create(data)\n * .onConflict('email')\n * .set({\n * // supports plain values and SQL expressions\n * key: 'value',\n * fromSql: () => sql`custom sql`,\n * })\n * // to update records only on certain conditions\n * .where({ ...certainConditions });\n * ```\n *\n * @param set - object containing new column values\n */\n set(set: OnConflictSet<T>): T {\n let resolved: RecordUnknown | undefined;\n for (const key in set) {\n const column = this.query.shape[key] as unknown as Column.Pick.Data;\n if (column) throwOnReadOnly(this.query, column, key);\n\n if (typeof set[key] === 'function') {\n if (!resolved) resolved = { ...set };\n\n resolved[key] = (set[key] as () => unknown)();\n }\n }\n\n (this.query as unknown as Query).q.onConflict = {\n target: this.onConflict as never,\n set: resolved || set,\n };\n return this.query;\n }\n\n /**\n * Available only after `onConflict`.\n *\n * Use this method to merge all the data you have passed into `create` to update the existing record on conflict.\n *\n * If the table has columns with **dynamic** default values, such values will be applied as well.\n *\n * You can exclude certain columns from being merged by passing the `except` option.\n *\n * ```ts\n * // merge the full data\n * db.table.create(data).onConflict('email').merge();\n *\n * // merge only a single column\n * db.table.create(data).onConflict('email').merge('name');\n *\n * // merge multiple columns\n * db.table.create(data).onConflict('email').merge(['name', 'quantity']);\n *\n * // merge all columns except some\n * db.table\n * .create(data)\n * .onConflict('email')\n * .merge({ except: ['name', 'quantity'] });\n *\n * // merge can be applied also for batch creates\n * db.table.createMany([data1, data2, data2]).onConflict('email').merge();\n *\n * // update records only on certain conditions\n * db.table\n * .create(data)\n * .onConflict('email')\n * .merge()\n * .where({ ...certainConditions });\n * ```\n *\n * @param merge - no argument will merge all data, or provide a column(s) to merge, or provide `except` to update all except some.\n */\n merge(\n merge?:\n | keyof T['shape']\n | (keyof T['shape'])[]\n | { except: keyof T['shape'] | (keyof T['shape'])[] },\n ): T {\n (this.query as unknown as PickQueryQ).q.onConflict = {\n target: this.onConflict as never,\n merge: merge as OnConflictMerge,\n };\n return this.query;\n }\n}\n","import { Column } from '../../../columns/column';\nimport {\n createCtx,\n CreateData,\n CreateDataOmit,\n createSelect,\n CreateSelf,\n handleManyData,\n handleOneData,\n insert,\n throwOnReadOnly,\n} from './create';\nimport {\n Query,\n SetQueryReturnsRowCount,\n SetQueryReturnsRowCountMany,\n queryTypeWithLimitOne,\n IsQuery,\n SetQueryReturnsAll,\n SetQueryReturnsOne,\n SetQueryReturnsColumn,\n SetValueQueryReturnsPluckColumn,\n} from '../../query';\nimport { QueryData } from '../../query-data';\nimport { SubQueryForSql } from '../../internal-features/sub-query/sub-query-for-sql';\nimport { MaybeArray, RecordUnknown } from '../../../utils';\nimport { _clone } from '../clone/clone';\nimport { throwIfReadOnly } from '../../query.utils';\n\nexport type CreateFromMethodNames =\n | 'createOneFrom'\n | 'insertOneFrom'\n | CreateManyFromMethodNames;\n\nexport type CreateManyFromMethodNames =\n | 'createManyFrom'\n | 'insertManyFrom'\n | 'createForEachFrom'\n | 'insertForEachFrom';\n\ninterface QueryReturningOne extends IsQuery {\n result: Column.QueryColumns;\n returnType: 'one' | 'oneOrThrow';\n}\n\ntype CreateRawOrFromResult<T extends CreateSelf> = T extends { isCount: true }\n ? T\n : T['returnType'] extends undefined | 'all'\n ? SetQueryReturnsOne<T>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumn<T>\n : T;\n\ntype InsertRawOrFromResult<T extends CreateSelf> = T['__hasSelect'] extends true\n ? T['returnType'] extends undefined | 'all'\n ? SetQueryReturnsOne<T>\n : T['returnType'] extends 'pluck'\n ? SetQueryReturnsColumn<T>\n : T\n : SetQueryReturnsRowCount<T>;\n\ntype CreateManyFromResult<T extends CreateSelf> = T extends {\n isCount: true;\n}\n ? T\n : T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAll<T>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetValueQueryReturnsPluckColumn<T>\n : T;\n\ntype InsertManyFromResult<T extends CreateSelf> = T['__hasSelect'] extends true\n ? T['returnType'] extends 'one' | 'oneOrThrow'\n ? SetQueryReturnsAll<T>\n : T['returnType'] extends 'value' | 'valueOrThrow'\n ? SetValueQueryReturnsPluckColumn<T>\n : T\n : SetQueryReturnsRowCountMany<T>;\n\n/**\n * Is used by all create from queries methods.\n * Collects columns and values from the inner query and optionally from the given data,\n * calls {@link insert} with a 'from' kind of create query.\n *\n * @param query - query object.\n * @param from - inner query from which to create new records.\n * @param many - whether is createManyFrom or createForEachFrom.\n * @param queryMany - whether is createForEachFrom\n * @param data - optionally passed custom data when creating a single record.\n */\nconst insertFrom = (\n query: CreateSelf,\n from: IsQuery,\n many?: boolean,\n queryMany?: boolean,\n data?: MaybeArray<RecordUnknown>,\n): CreateSelf => {\n throwIfReadOnly(query as unknown as Query);\n\n const ctx = createCtx();\n\n const obj =\n data &&\n (Array.isArray(data)\n ? handleManyData(query, data, ctx)\n : handleOneData(query, data, ctx));\n\n return insert(\n query,\n {\n insertFrom: from,\n columns: obj?.columns || [],\n values: obj?.values || [],\n },\n many,\n queryMany,\n );\n};\n\n/**\n * Function to collect column names from the inner query of create `from` methods.\n *\n * @param q - the creating query\n * @param from - inner query to grab the columns from.\n * @param obj - optionally passed object with specific data, only available when creating a single record.\n * @param many - whether it's for `createForEachFrom`. If no, throws if the inner query returns multiple records.\n */\nexport const getFromSelectColumns = (\n q: CreateSelf,\n from: SubQueryForSql,\n obj?: {\n columns: string[];\n values: QueryData['values'];\n },\n many?: boolean,\n): {\n columns: string[];\n queryColumnsCount: number;\n values: unknown[][];\n} => {\n if (!many && !queryTypeWithLimitOne[from.q.returnType as string]) {\n throw new Error(\n 'Cannot create based on a query which returns multiple records',\n );\n }\n\n const queryColumns = new Set<string>();\n from.q.select?.forEach((item) => {\n if (typeof item === 'string') {\n const index = item.indexOf('.');\n queryColumns.add(index === -1 ? item : item.slice(index + 1));\n } else if (item && 'selectAs' in item) {\n for (const column in item.selectAs) {\n queryColumns.add(column);\n }\n }\n });\n\n const allColumns = new Set<string>(queryColumns);\n const queryColumnsCount = queryColumns.size;\n const allValues: unknown[][] = [];\n if (obj?.columns) {\n for (const objectValues of obj.values) {\n const values: unknown[] = [];\n allValues.push(values);\n\n obj.columns.forEach((column, i) => {\n if (!queryColumns.has(column)) {\n allColumns.add(column);\n values.push(objectValues[i]);\n }\n });\n }\n }\n\n for (const key of queryColumns) {\n const column = q.shape[key] as unknown as Column.Pick.Data;\n if (column) throwOnReadOnly(from, column, key);\n }\n\n return {\n columns: [...allColumns],\n queryColumnsCount,\n values: allValues,\n };\n};\n\nexport const _queryCreateOneFrom = <\n T extends CreateSelf,\n Q extends QueryReturningOne,\n>(\n q: T,\n query: Q,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n): CreateRawOrFromResult<T> => {\n createSelect(q as unknown as Query);\n return insertFrom(q, query, false, false, data) as never;\n};\n\nexport const _queryInsertOneFrom = <\n T extends CreateSelf,\n Q extends QueryReturningOne,\n>(\n q: T,\n query: Q,\n data?: Omit<CreateData<T>, keyof Q['result']>,\n): InsertRawOrFromResult<T> => {\n return insertFrom(q, query, false, false, data) as never;\n};\n\nexport const _queryCreateManyFrom = <\n T extends CreateSelf,\n Q extends QueryReturningOne,\n>(\n q: T,\n query: Q,\n data: Omit<CreateData<T>, keyof Q['result']>[],\n): CreateManyFromResult<T> => {\n createSelect(q as unknown as Query);\n return insertFrom(q, query, true, false, data) as never;\n};\n\nexport const _queryInsertManyFrom = <\n T extends CreateSelf,\n Q extends QueryReturningOne,\n>(\n q: T,\n query: Q,\n data: Omit<CreateData<T>, keyof Q['result']>[],\n): InsertManyFromResult<T> => {\n return insertFrom(q, query, true, false, data) as never;\n};\n\nexport const _queryCreateForEachFrom = <T extends CreateSelf>(\n q: T,\n query: IsQuery,\n): CreateManyFromResult<T> => {\n createSelect(q as unknown as Query);\n return insertFrom(q, query, true, true) as never;\n};\n\nexport const _queryInsertForEachFrom = <T extends CreateSelf>(\n q: T,\n query: IsQuery,\n): InsertManyFromResult<T> => {\n return insertFrom(q, query, true, true) as never;\n};\n\nexport class QueryCreateFrom {\n /**\n * Inserts a single record based on a query that selects a single record.\n *\n * Performs a single SQL query based on `INSERT ... SELECT ... FROM`.\n *\n * See {@link createManyFrom} to insert multiple records based on a single record query,\n * and {@link createForEachFrom} to insert a record per every one found by the query.\n *\n * The first argument is a query of a **single** record, it should have `find`, `take`, or similar.\n *\n * The second optional argument is a data which will be merged with columns returned by the query.\n *\n * The data for the second argument is the same as in {@link create}.\n *\n * Columns with runtime defaults (defined with a callback) are supported here.\n * The value for such a column will be injected unless selected from a related table or provided in a data object.\n *\n * ```ts\n * const oneRecord = await db.table.createOneFrom(\n * db.relatedTable\n * // use select to map columns from one table to another\n * .select({\n * // relatedTable's id will be inserted as \"relatedId\"\n * relatedId: 'id',\n * })\n * .findBy({ key: 'value' }),\n * // optional argument:\n * {\n * key: 'value',\n * // supports sql, nested select, create, update, delete queries\n * fromSql: () => sql`custom sql`,\n * fromQuery: () => db.otherTable.find(id).update(data).get('column'),\n * fromRelated: (q) => q.relatedTable.create(data).get('column'),\n * },\n * );\n * ```\n *\n * The query above will produce such a SQL (omitting `from*` values):\n *\n * ```sql\n * INSERT INTO \"table\"(\"relatedId\", \"key\")\n * SELECT \"relatedTable\".\"id\" AS \"relatedId\", 'value'\n * FROM \"relatedTable\"\n * WHERE \"relatedTable\".\"key\" = 'value'\n * LIMIT 1\n * RETURNING *\n * ```\n *\n * @param query - query to create new records from\n * @param data - additionally you can set some columns\n */\n createOneFrom<T extends CreateSelf, Q extends QueryReturningOne>(\n this: T,\n query: Q,\n data?: CreateDataOmit<\n T,\n Q['result'] extends never ? never : keyof Q['result']\n >,\n ): CreateRawOrFromResult<T> {\n return _queryCreateOneFrom(_clone(this) as never, query, data as never);\n }\n\n /**\n * Works exactly as {@link createOneFrom}, except that it returns inserted row count by default.\n *\n * @param query - query to create new records from\n * @param data - additionally you can set some columns\n */\n insertOneFrom<T extends CreateSelf, Q extends QueryReturningOne>(\n this: T,\n query: Q,\n data?: CreateDataOmit<\n T,\n Q['result'] extends never ? never : keyof Q['result']\n >,\n ): InsertRawOrFromResult<T> {\n return _queryInsertOneFrom(_clone(this) as never, query, data as never);\n }\n\n /**\n * Inserts multiple records based on a query that selects a single record.\n *\n * Performs a single SQL query based on `INSERT ... SELECT ... FROM`.\n *\n * See {@link createOneFrom} to insert a single record based on a single record query,\n * and {@link createForEachFrom} to insert a record per every one found by the query.\n *\n * The first argument is a query of a **single** record, it should have `find`, `take`, or similar.\n *\n * The second argument is array of objects to be merged with columns returned by the query.\n *\n * The data for the second argument is the same as in {@link createMany}.\n *\n * Columns with runtime defaults (defined with a callback) are supported here.\n * The value for such a column will be injected unless selected from a related table or provided in a data object.\n *\n * ```ts\n * const twoRecords = await db.table.createManyFrom(\n * db.relatedTable\n * // use select to map columns from one table to another\n * .select({\n * // relatedTable's id will be inserted as \"relatedId\"\n * relatedId: 'id',\n * })\n * .findBy({ key: 'value' }),\n * [\n * {\n * key: 'value 1',\n * // supports sql, nested select, create, update, delete queries\n * fromSql: () => sql`custom sql`,\n * fromQuery: () => db.otherTable.find(id).update(data).get('column'),\n * fromRelated: (q) => q.relatedTable.create(data).get('column'),\n * },\n * {\n * key: 'value 2',\n * },\n * ],\n * );\n * ```\n *\n * The query above will produce such a SQL (omitting `from*` values):\n *\n * ```sql\n * WITH \"relatedTable\" AS (\n * SELECT \"relatedTable\".\"id\" AS \"relatedId\", 'value'\n * FROM \"relatedTable\"\n * WHERE \"relatedTable\".\"key\" = 'value'\n * LIMIT 1\n * )\n * INSERT INTO \"table\"(\"relatedId\", \"key\")\n * SELECT \"relatedTable\".*, v.\"key\"::text\n * FROM \"relatedTable\", (VALUES ('value1'), ('value2')) v(\"key\")\n * RETURNING *\n * ```\n *\n * @param query - query to create new records from\n * @param data - array of records to create\n */\n createManyFrom<T extends CreateSelf, Q extends QueryReturningOne>(\n this: T,\n query: Q,\n data: CreateDataOmit<\n T,\n Q['result'] extends never ? never : keyof Q['result']\n >[],\n ): CreateManyFromResult<T> {\n return _queryCreateManyFrom(_clone(this) as never, query, data as never);\n }\n\n /**\n * Works exactly as {@link createManyFrom}, except that it returns inserted row count by default.\n *\n * @param query - query to create new records from\n * @param data - array of records to create\n */\n insertManyFrom<T extends CreateSelf, Q extends QueryReturningOne>(\n this: T,\n query: Q,\n data: CreateDataOmit<\n T,\n Q['result'] extends never ? never : keyof Q['result']\n >[],\n ): InsertManyFromResult<T> {\n return _queryInsertManyFrom(_clone(this) as never, query, data as never);\n }\n\n /**\n * Inserts a single record per every record found in a given query.\n *\n * Performs a single SQL query based on `INSERT ... SELECT ... FROM`.\n *\n * Unlike {@link createOneFrom}, it doesn't accept second argument with data.\n *\n * Runtime defaults cannot work with it.\n *\n * ```ts\n * const manyRecords = await db.table.createForEachFrom(\n * db.relatedTable.select({ relatedId: 'id' }).where({ key: 'value' }),\n * );\n * ```\n *\n * @param query - query to create new records from\n */\n createForEachFrom<T extends CreateSelf>(\n this: T,\n query: IsQuery,\n ): CreateManyFromResult<T> {\n return _queryCreateForEachFrom(_clone(this) as never, query);\n }\n\n /**\n * Works exactly as {@link createForEachFrom}, except that it returns inserted row count by default.\n *\n * @param query - query to create new records from\n */\n insertForEachFrom<T extends CreateSelf>(\n this: T,\n query: IsQuery,\n ): InsertManyFromResult<T> {\n return _queryInsertForEachFrom(_clone(this) as never, query);\n }\n}\n"],"mappings":";;;;;;AAsEA,MAAa,cAAc,GAAG,YAA4C;CACxE,OAAO,QAAQ,QAAQ,WAAW,MAAM,CAAC,CAAC,KAAK,EAAE;AACnD;;;;;AAMA,MAAaA,aAAc,SACxB,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AAKrC,MAAaC,eAAa,CAAC;AAM3B,MAAaC,gBAAc,CAAC;AAK5B,MAAaC,eAAa,CAAC;;;;;;;;;AAU3B,MAAa,mCACX,KACA,KACA,UACG;CACH,IAAuB,OAAQ,IAAsB,OACjD,CAAC,GAAK,IAAsB,MAAoB,KAAK,IACrD,CAAC,KAAK;AACZ;;;;;;;;;;AAWA,MAAa,2BACX,GACA,QACA,KACA,UACM;CACN,EAAqB,UAAU;EAC7B,GAAK,EAAoB;GACxB,MAAM;CACT;CACA,OAAO;AACT;AAEA,MAAa,sBACX,GACA,QACA,UACG;CACH,EAAqB,UAAU;EAC7B,GAAK,EAAoB;EACzB,GAAG;CACL;AACF;;;;;;AAOA,MAAa,kBACX,KACA,UACQ;CACR,IAAI,KAAK;EACP,IAAI,KAAK,KAAK;EACd,OAAO;CACT,OACE,OAAO,CAAC,KAAK;AAEjB;;;;;AAMA,MAAaC,iBAAe,MAAc;CACxC,OAAO,IAAI,EAAE,WAAW,MAAM,MAAM,CAAC,CAAC,WAAW,KAAK,KAAK,EAAE;AAC/D;;;;;;;AAwBA,MAAaC,oBAAkB,KAAa,YAAiC;CAC3E,IAAI,SAAS,MAAMC,cAAY,GAAG;CAClC,OAAO,qBAAqB,KAAK,GAAG,IAAI,MAAMF,cAAY,GAAG;AAC/D;;;;;AAMA,MAAa,iBAAiB,QAAgB,CAACG,kBAAgB,GAAG;;;;;;AAOlE,MAAaA,qBAAmB,QAAiB;CAC/C,IAAI,CAAC,KAAK,OAAO;CACjB,KAAK,MAAM,OAAO,KAChB,IAAI,IAAI,SAA6B,KAAA,GAAW,OAAO;CAEzD,OAAO;AACT;;;;;AAkBA,MAAaD,iBAAe,QAAgB;CAC1C,OAAO,IACJ,QAAQ,QAAQ,EAAE,CAAC,CACnB,QAAQ,SAAS,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,YAAY,CAAC,CAAC,CACrD,QAAQ,QAAQ,EAAE;AACvB;;;;;AAeA,MAAaE,iBAAe,QAAgB;CAC1C,OAAO,IAAI,QAAQ,WAAW,GAAG,MAAM,GAAG,IAAI,MAAM,KAAK,EAAE,YAAY,GAAG;AAC5E;;;;;;;;;AA4IA,MAAa,eAAe,SAAyB,IAAsB;CACzE,OAAO,GAAG,IAAI;AAChB;AAwBA,MAAa,YAAY,QAAmB,UAAmB;CAC7D,OAAO,KAAK,KAAK;CACjB,OAAO,IAAI,OAAO;AACpB;AAEA,MAAaC,kBACX,KACA,OACW;CACX,IAAI,MAAM,KAAK;EACb,IAAI,SAAS;EACb,IAAI;EACJ,OAAO,IAAK,OAAO,KAAK,SACtB;EAEF,KAAK;CACP;CACA,OAAO;AACT;AAEA,MAAaC,kBACX,KACA,IACA,UACW;CACX,MAAM,MAAMD,eAAa,KAAK,EAAE;CAChC,IAAI,OAAO;CACX,OAAO;AACT;AA0BA,MAAa,cAAc,MACzB,CAAC,EACC,KACA,OAAO,MAAM,YACb,OAAO,EAAE,OAAO,cAAuB;AAe3C,MAAa,YAA2B,EACtC,MAAM,SACR;ACpcA,IAAsBE,eAAtB,MAEE;CAWA,MAAM,KAAkB,UAA2B;EACjD,IAAI,MAAM,KAAK,QAAQ,KAAK,QAAQ;EACpC,IAAI,KAAK,EAAE,OAAO;GAChB,MAAM,EAAE,UAAU,KAAK;GACvB,KAAK,IAAI,IAAI,GAAG,MAAM,MAAM,QAAQ,IAAI,KAAK,KAAK,GAChD,MAAO,MAAM,EAAE,CACb,KACA,MAAM,IAAI,IACV,KACA,QACF;EAEJ;EAEA,OAAO;CACT;;;;;;;;CASA,UAQE,IAMA;EACA,gCAAgC,KAAK,GAAG,aAAa,EAAE;EACvD,OAAO;CACT;AAKF;AAGA,MAAaC,kBAAgB,QAC3B,eAAeD;AAUjB,MAAa,yBACX,SAEA,MAAM,QAAQ,KAAK,EAAE,KAAK,SAAS,KAAK,MAAM,MAAM,QAAQ,KAAK,EAAE,CAAC,GAAG;AAsBzE,IAAsB,uBAAtB,MAA2C;CAEzC,KAQE,IAE2C;EAC3C,MAAM,SAAS,GAAG,KAAK,WAAW;EAClC,KAAM,EAAE,KAAoB,OAAO,QAAQ;EAC3C,OAAO,OACL,eAAe,OAAQ,KAAK,YAA4B,MACxD,OAAO,SACT;EACA,OAAO;CACT;AACF;AAEA,MAAa,4BAA4B,QAAqC;CAC5E,IAAI,OAAO;CAEX,MAAM,QAAQ,IAAI;CAClB,IAAI,IAAI;CACR,KAAK,IAAI,OAAO,MAAM,SAAS,GAAG,IAAI,MAAM,KAC1C,QAAQ,MAAM,KAAK,MAAM,IAAI,IAAI,GAAG;CAEtC,QAAQ,MAAM;CAEd,OAAO,OAAO;AAChB;ACzKA,IAAa,oBAAb,cAEUE,aAAc;CAItB,YACE,OACA,WACA;EACA,MAAM;EAHC,KAAA,QAAA;EACA,KAAA,YAAA;EALA,KAAA,SAAA,EAAE,OAAOC,cAAiB;EACf,KAAA,IAAA,EAAE,MAAM,KAAK;CAOjC;CAEA,QAAQ,KAAkB,UAA2B;EACnD,IAAI,MAAM;EAEV,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,MAAM,QAAQ,KAAK;GAC1C,IAAI,IAAI,GACN,OAAO,KAAK,YAAY,KAAK,UAAU,MAAM,KAAK,QAAQ,IAAI;GAGhE,MAAM,OAAO,KAAK,MAAM;GACxB,IAAI,gBAAgBD,cAClB,OAAO,KAAK,MAAM,KAAK,QAAQ;QAC1B;IACL,IAAI,OAAO,KAAK,IAAI;IACpB,OAAO,IAAI,IAAI,OAAO;GACxB;EACF;EAEA,OAAO;CACT;AACF;AAEA,kBAAkB,UAAU,OAAO,qBAAqB,UAAU;;;;;ACpClE,IAAa,mBAAb,cAAsCE,aAAW;CAI/C,YAAY,MAAqB;EAC/B,MAAM;EADW,KAAA,OAAA;EAHV,KAAA,SAAA,EAAE,OAAO,CAAC,EAA6B;EAC5B,KAAA,IAAA,EAAE,MAAM,KAAK;CAIjC;CAEA,UAAU;EAIR,OAAO,IAAI,KAAK,KAAK,WAAW,MAAK,MAAI,CAAC,CAAC,WAAW,KAAK,OAAK,EAAE;CACpE;AACF;ACEA,IAAIC;AACJ,MAAa,kCAAkC,OAA8B;CAC3E,0BAAwB;AAC1B;AAGA,MAAM,OAAiB,CAAC;AACxB,MAAM,gBAA0B,CAAC;AAEjC,MAAa,wBACX,UACA,KACA,aACW;CACX,IAAI,MAAM;CACV,MAAM,EAAE,WAAW;CACnB,MAAM,QAAQ,SAAS;CACvB,cAAc,SAAS;CAEvB,IAAI,IAAI;CACR,KAAK,IAAI,OAAO,MAAM,SAAS,GAAG,IAAI,MAAM,KAAK;EAC/C,OAAO,MAAM;EAEb,MAAM,QAAQ,SAAS,IAAI;EAC3B,IAAIC,eAAa,KAAK,GACpB,OAAO,MAAM,MAAM,KAAK,QAAQ;OAC3B;GACL,OAAO,KAAK,KAAK;GACjB,cAAc,KAAK,IAAI,MAAM;GAC7B,OAAO,IAAI,OAAO;EACpB;CACF;CAEA,OAAO,MAAM,MAAM;AACrB;AAiBA,IAAaC,WAAb,cAGUC,aAAc;CAStB,YACE,KACA,QACA,MACA;EACA,MAAM;EACN,KAAK,IAAI,EAAE,MAAM,KAAK;EACtB,KAAK,OAAO;EACZ,KAAK,UAAU;EACf,KAAK,SAAS,EAAE,OAAO,KAAU;EACjC,IAAI,MACF,OAAO,OAAO,MAAM,KAAK,SAAS;CAEtC;CAGA,OAA4C,QAA4B;EACtE,KAAK,UAAU;EACf,OAAO;CACT;CAGA,QAAQ,KAAkB,UAA2B;EACnD,IAAI;EACJ,MAAM,aAAa,OAAO,KAAK,SAAS;EAExC,IAAI,YACF,MAAM,qBACJ,KAAK,MACL,KACA,QACF;OAEA,MAAM,KAAK;EAGb,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH,OAAO;EAGT,MAAM,EAAE,WAAW;EACnB,MAAM,MAAM,IAAI,MAAM,GAAG;EACzB,MAAM,MAAM,IAAI;EAChB,KAAK,SAAS;EACd,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,GAC5B,IAAI,KAAK,IAAI,EAAE,CAAC,QAAQ,gBAAgB,OAAO,KAAK,MAAM;GACxD,IAAI,cAAc,cAAc,SAAS,CAAC,GAAG,OAAO;GAEpD,MAAM,QAAQ,KAAK;GACnB,IAAI,UAAU,KAAA,GACZ,MAAM,IAAI,MAAM,oBAAoB,IAAI,mBAAmB;GAG7D,KAAK,KAAK,GAAG;GAEb,IAAI,MAAM,SAAS,IAAI,WAAW,GAAG;IACnC,IAAI,OAAO,UAAU,UACnB,MAAM,IAAI,MACR,+BAA+B,IAAI,oBAAoB,OAAO,OAChE;IAGF,OAAO,IAAI,MAAM,QAAQ,MAAK,MAAI,CAAC,CAAC,QAAQ,KAAK,OAAK,EAAE;GAC1D;GAEA,OAAO,KAAK,KAAK;GACjB,OAAO,IAAI,OAAO;EACpB,CAAC;EAGH,IAAI,KAAK,SAAS,KAAK,KAAK,SAAS,OAAO,KAAK,IAAI,CAAC,CAAC,QAChD;QAAA,MAAM,OAAO,MAChB,IAAI,CAAC,KAAK,SAAS,GAAG,GACpB,MAAM,IAAI,MAAM,oBAAoB,IAAI,aAAa;EAAA;EAK3D,OAAO,IAAI,KAAK,GAAG;CACrB;AACF;AAGA,MAAaC,cAAY,QACvB,eAAeF;AAEjB,SAAO,UAAU,OAAO,qBAAqB,UAAU;AASvD,MAAaG,kBACX,QACA,QACW;CACX,MAAM,EAAE,MAAM,KAAK,SAAS,WAAW;CACvC,IAAI;CAEJ,IAAI,OAAO,QAAQ,UACjB,OAAO,GAAG,IAAI;MACT;EACL,IAAI,YAAY;EAChB,OAAO,IAAI,OAAO,GAAG,IAAI,EAAE;CAC7B;CAEA,QACE,OAAO,QAAQ,WACX,SACE,YAAY,IAAI,QAAQ,MAAM,KAAK,EAAE,QACrC,KAAK,IAAI,QAAQ,MAAM,KAAK,EAAE,MAChC,yBAAyB,GAAG;CAElC,IAAI,QACF,QAAQ,WAAW,KAAK,UAAU,MAAM,EAAE;CAG5C,OAAO;AACT;AAOA,IAAaC,kBAAb,cAGUH,aAAc;CAMtB,YAAY,IAA6B;EACvC,MAAM;EADW,KAAA,KAAA;EAJII,KAAAA,SAAAA;EAEP,KAAA,gBAAA;EAId,KAAK,IAAI,EAAE,MAAM,KAAK;CACxB;CAGA,QAAQ,KAAe,UAA2B;EAChD,MAAM,OAAO,KAAK,GAAGC,KAAY;EACjC,KAAK,EAAE,YAAY,KAAK,EAAE,SAAS,KAAA;EAKnC,OAJiBR,wBACf,MACA,IAEY,CAAC,CAAC,MAAM,KAAK,QAAQ;CACrC;AACF;AAEA,gBAAc,UAAU,OAAO,qBAAqB,UAAU;AAc9D,SAAgBQ,MAAI,GAAG,MAAe;CACpC,OAAO,sBAAsB,IAAI,IAC7B,IAAIN,SAAO,IAAI,IACf,OAAO,KAAK,OAAO,aACjB,IAAII,gBAAc,KAAK,EAAE,IACzB,IAAIJ,SAAO,KAAK,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,MAAM;AAC9C;AAGA,MAAa,cAAc,CAAC,IAAIA,SAAO,UAAU,CAAC;AAkFlD,MAAa,UAAiB,GAAG,SAAqB;CACpD,MAAM,MAAM,KAAK;CACjB,IAAI,MAAM,QAAQ,GAAG,GACnB,OAAO,IAAIA,SAAO,IAA2B;CAG/C,IAAI,OAAO,KAAK,OAAO,UACrB,OAAO,IAAIA,SAAO,KAAK,EAAE;CAG3B,IAAI,KAAK,OAAO,KAAA,GACd,OAAO,IAAIA,SAAO,KAAK,IAAI,GAAG;CAGhC,QAAQ,GAAG,SACT,IAAIA,SAAO,MAAM,GAAoB;AACzC;AAEA,MAAM,OAAO,SAAS,IAAI,iBAAiB,IAAI;AAC/C,MAAM,QAAQ,OAAO,cAAc,IAAI,kBAAkB,OAAO,SAAS;AACzE,MAAM,UAAU,QAAQ,IAAI,oBAAoB,GAAG;AAEnD,IAAa,sBAAb,cAAyCC,aAAW;CAIlD,YAAY,KAAuC;EACjD,MAAM;EADW,KAAA,MAAA;EAEjB,KAAK,IAAI,EAAE,MAAM,KAAK;CACxB;CAEA,UAAkB;EAChB,OAAO,OAAO,KAAK,GAAG;CACxB;AACF;ACgMA,MAAa,8BACX,UACyC;CACzC,MAAM,OAAO,cAAc,QAAQ,MAAM,SAAS,IAAI,IAAI,MAAM;CAEhE,IAAI,CAAC,KAAK,OACR,MAAM,IAAI,MAAM,4CAA4C;CAE9D,OAAO;EACL,GAAG;EACH,QAAQ,OAAO,KAAK,WAAW,aAAa,KAAK,OAAO,IAAI,KAAK;EACjE,OAAO,KAAK;CACd;AACF;AA2BA,MAAaM,mBAIX,GACA,KACA,UACM;CACN,MAAM,SAAS,OAAO,OAAO,CAAC;CAC9B,OAAO,OAAO;EAAE,GAAG,EAAE;GAAO,MAAM;CAAM;CACxC,OAAO;AACT;AAGA,MAAa,kBAIX,GACA,KACA,UACG;CACH,MAAM,MAAM,EAAE,KAAK;CACnB,OAAOA,gBACL,GACA,KACC,MAAM,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,KAAK,CACjC;AACF;AAyBA,IAAI;AAGJ,SAAgBC,uBAAqB,MAAoB;CACvD,cAAc;AAChB;AAGA,MAAaC,4BAA0B;CACrC,MAAM,OAAO;CACb,cAAc,KAAA;CACd,OAAO;AACT;AAMA,IAAI,eAAe;AAQnB,MAAa,wBAAwB;AAQrC,IAAI,kBAAkB;AAQtB,MAAa,2BAA2B;AAExC,IAAsBC,WAAtB,MAA6B;CAyC3B,YACE,QAGA,aAEA,eAAwB,aAExB,cAAuB,aACvB;EACA,KAAmC,cAAc;EACjD,KAAmC,eAAe;EAClD,KAAmC,cAAc;EACjD,KAAK,QAAQ,OAAO;EACpB,KAAK,YAAY,OAAO;EACxB,KAAK,SAAS,OAAO;EACrB,KAAK,SAAS,OAAO;EACrB,KAAK,aAAa,OAAO;EACzB,KAAK,iBAAiB,OAAO;EAC7B,KAAK,WAAW,OAAO;EACvB,KAAK,QAAQ,OAAO;EACpB,MAAM,OAAOD,oBAAkB;EAC/B,KAAK,OAAQ,OAAO,EAAE,KAAK,IAAI,CAAC;CAClC;;;;;;;;;;;;;;;;;;;;;;;;CAyBA,QAOW,OAAoC;EAC7C,OAAOF,gBAAc,MAAM,WAAW,KAAK;CAC7C;;;;;;CAOA,aAAsE;EACpE,OAAO;CACT;;;;;;;;;;;;;;;;;;;;;;;;;CA0BA,MAEE,KACA,MACG;EACH,OAAO,eAAe,MAAM,UAAU;GAAE;GAAK;EAAK,CAAC;CACrD;;;;;;;;;;;;;;;;;;;CA+IA,GAUW,QAAc;EACvB,OAAOA,gBACL,MACA,MACA,MACF;CACF;CAsGA,MAEE,QAC2B;EAC3B,OAAO;CACT;CAEA,MAKE,IACkE;EAClE,MAAM,SAAS,OAAO,OAAO,IAAI;EACjC,OAAO,cAAc,GAAG,KAAK,WAAW;EACxC,OAAO;CACT;CAEA,OAKE,IACoE;EACpE,MAAM,SAAS,OAAO,OAAO,IAAI;EACjC,OAAO,eAAe,GAAG,KAAK,YAAY;EAC1C,OAAO;CACT;CAEA,MAKE,IACkE;EAClE,MAAM,SAAS,OAAO,OAAO,IAAI;EACjC,OAAO,cAAc,GAAG,KAAK,WAAW;EACxC,OAAO;CACT;;;;;;CAOA,KAA0C,MAAiB;EACzD,OAAOA,gBAAc,MAAM,QAAQ,IAAI;CACzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCA,OAEE,OACgC;EAChC,OAAOA,gBAAc,MAAM,kBAAkB,CAAC,KAAK;CACrD;;;;;;;CAQA,UAEE,IAC0B;EAC1B,OAAOA,gBAAc,MAAM,eAAe,EAAW;CACvD;;;;;;;;;;;;;;;;;;;;;;;;;CA0BA,WAA+C;EAC7C,OAAOA,gBAAc,MAAe,eAAe,IAAa;CAClE;;;;;;;;;;;;;;;;;;;CAoBA,YAEE,IACG;EACH,OAAOA,gBAAc,MAAe,eAAe,EAAW;CAChE;;;;;;;;;;;;;;;;;;;CAoBA,YAEE,IACG;EACH,OAAOA,gBAAc,MAAe,eAAe,EAAW;CAChE;;;;;;;;;;;;;;;;;;;CAoBA,UAEE,IACG;EACH,OAAOA,gBAAc,MAAe,aAAa,EAAW;CAC9D;;;;;;;;;;;;;;;;;;;;;;CAuBA,WAEE,MAC+B;EAC/B,OAAOA,gBAAc,MAAM,cAAc,QAAS,IAAc;CAClE;CAqFA,WAEE,WACA,QACA,UAAwCI,eACxC;EACA,OAAO,eAAe,MAAM,eAAe;GACzC;GACA,gBAAgB,CAAC,MAAM;GACvB;EACF,CAAC;CACH;CAGA,QAAgB;EACd,OAAO,KAAK;CACd;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkDA,MAEE,GAAG,MACA;EACH,MAAM,IAAI;EAIV,OAAO,eAAe,MAAM,WAAW,EACrC,UACG,OAAO,EAAE,OAAO,WAAW;GAAE,GAAG,EAAE;GAAI,MAAM,EAAE;EAAG,IAAI,EAAE,OACxDA,cACJ,CAAC;CACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwGA,YAEE,GAAG,MACA;EACH,MAAM,IAAI;EAIV,OAAO,eAAe,MAAM,WAAW,EACrC,SAAS;GACP,GAAI,OAAO,EAAE,OAAO,WAAW;IAAE,GAAG,EAAE;IAAI,MAAM,EAAE;GAAG,IAAI,EAAE;GAC3D,GAAI,KAAK,aAAa,aAClB,EAAE,OAAO,MAAM,IACf,EAAE,UAAU,KAAK;EACvB,EACF,CAAC;CACH;CAEA,OAKE,GAAG,MAC4C;EAC/C,MAAM,IAAI;EAIV,OAAO,eAAe,MAAM,WAAW,EACrC,SAAS;GACP,GAAI,OAAO,EAAE,OAAO,WAAW;IAAE,GAAG,EAAE;IAAI,MAAM,EAAE;GAAG,IAAI,EAAE;GAC3D,QAAQ;EACV,EACF,CAAC;CACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+CA,QAEE,IACA,GAAG,MACA;EACH,MAAM,IAAI;EAIV,OAAO,eAAe,MAAM,YAAY;GACtC,MAAM;GACN,UACG,OAAO,EAAE,OAAO,WAAW;IAAE,GAAG,EAAE;IAAI,MAAM,EAAE;GAAG,IAAI,EAAE,OACxDA;EACJ,CAAC;CACH;CAEA,QAA6C,SAAoB;EAC/D,OAAOJ,gBAAc,MAAM,WAAW,OAAO;CAC/C;CAEA,YAAiD,aAAwB;EACvE,OAAOA,gBAAc,MAAM,eAAe,WAAW;CACvD;CAEA,QAA6C,SAAoB;EAC/D,OAAOA,gBAAc,MAAM,WAAW,OAAO;CAC/C;CAEA,YAAiD,IAA2B;EAC1E,OAAOA,gBAAc,MAAM,eAAe,EAAE;CAC9C;;;;;;;;;;;;;;;;CAiBA,UAEE,GAAG,MACkB;EACrB,MAAM,MAAMK,MAAI,GAAG,IAAI;EACvB,MAAM,SAASL,gBAAc,MAAM,aAAa;GAC9C,MAAM,KAAK,QAAQ;IACjB,OAAO,IAAI,MAAM,KAAK,MAAM;GAC9B;GAEA,SAAS;IACP,IAAI,MAAM;IAEV,IAAI,MAAM,QAAQ,KAAK,EAAE,GACvB,OAAO,yBAAyB,IAA2B;SACtD;KACL,MAAM,EAAE,KAAK,WAAW,KAAK;KAI7B,OAAO,YAAY,IAAI,QAAQ,MAAM,KAAK,EAAE,GAC1C,SAAS,aAAa,KAAK,UAAU,MAAM,MAAM,GAClD;IACH;IAEA,OAAO;GACT;EACF,CAAC;EACD,OAAO,KAAK,WAAW;EACvB,OAAO;CACT;AACF;ACvhDA,MAAa,wBAAuC;CAClD,KAAK;CACL,YAAY;CACZ,OAAO;CACP,cAAc;AAChB;AAkUA,MAAa,WAAW,MACtB,CAAC,CAAC,KAAK,OAAO,MAAM,YAAY,eAAe,KAAK,EAAE,cAAc;ACzhBtE,MAAa,oBAAoD;CAC/D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAiBA,MAAa,oBAAoD;CAC/D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAiCA,MAAa,kBAAgD,CAAC,OAAO,KAAK;AAW1E,MAAa,mBAA+C;CAC1D;CACA;CACA;CACA;AACF;;;;;;ACvDA,MAAaM,aAAW,MAAc,QAAc;CAClD,IAAI,OAAO,QAAQ,UACjB,KAAK,KAAK,GAAG;MACR;EACL,MAAM,OAAO,KAAK,SAAS;EAC3B,IAAI,OAAO,KAAK,UAAU,UACxB,KAAK,QAAQ,KAAK,QAAQ;OAE1B,KAAK,KAAK,GAAG;CAEjB;AACF;;;;;;;AAkCA,MAAa,+BACX,KACA,UACW;CACX,IAAI,OAAO,UAAU,YAAY,SAASC,WAAS,KAAK,GACtD,OAAOC,eAAa,OAAO,GAAG;MACzB,IAAI,OAAO,UAAU,YAC1B,OAAO,MAAM,SAAS;MACjB,IAAI,OAAO,UAAU,UAC1B,OAAOC,cAAY,KAAK;MAExB,OAAO,KAAK,UAAU,KAAK;AAE/B;;;;;;;;AASA,MAAa,uBACX,aACA,MACA,YACG;CACH,QACE,MACA,WACA,cACG;EACH,OAAO,YACH,KACA,YACG,KAAK,SACH,aAAa,KAAA,GAAQ,QACrB,QAAQ,SACN,KAAgC,YAChC,KAA0B,QAAQ,IACjC,KACA,mBAAmB,MAAM,KAAK,UAAU,IAAc,CAC5D,CAAC,CACA,KAAK,EAAE;CAChB;AACF;;;;;;;;AASA,MAAM,sBACJ,MACA,KACA,OAAe,QACJ;CACX,MAAM,QAAQ,KAAK;CACnB,IAAI,UAAU,KAAA,GAAW,OAAO;CAEhC,MAAM,QAAQ,KAAK,SAAS;CAE5B,IAAI;CACJ,IAAI,OAAO,UAAU,YAAY,SAAS,OAAO,gBAAgB,QAAQ;EACvE,MAAM,QAAkB,CAAC;EACzB,KAAK,MAAM,OAAO,OAAO;GACvB,IAAI,QAAQ,WAAW;GAEvB,MAAM,QAAS,MAAY;GAC3B,IAAI,UAAU,KAAA,GACZ,MAAM,KACJ,GAAG,IAAI,IAAI,OAAO,UAAU,WAAWA,cAAY,KAAK,IAAI,OAC9D;EAEJ;EAEA,IAAI,OAAO,MAAM,KAAK,YAAYA,cAAY,KAAK,GAAG;EAEtD,SAAS,MAAM,SAAS,KAAK,MAAM,KAAK,IAAI,EAAE,MAAM;CACtD,OAAO;EACL,SACE,UAAU,OACN,KACA,OAAO,UAAU,WACfA,cAAY,KAAK,IACjB,iBAAiB,OACf,aAAa,MAAM,YAAY,EAAE,MACjC;EAEV,IAAI,OAAO;GACT,IAAI,UAAU,MAAM,UAAU;GAC9B,UAAUA,cAAY,KAAK;EAC7B;CACF;CAEA,OAAO,IAAI,KAAK,GAAG,OAAO;AAC5B;AAGA,MAAa,mBACX,oBAAgC,iBAAiB;AAKnD,MAAa,mBAAmB,oBAC9B,mBACA,KAAA,GACA;CAAE,KAAK;CAAO,KAAK;AAAM,CAC3B;AAGA,MAAa,iBACX,oBAAoC,eAAe;AAErD,MAAa,kBACX,oBAAmD,gBAAgB;;;;;;AAOrE,MAAa,6BAA6B,WAA+B;CACvE,MAAM,QAAgB,CAAC;CAEvB,IAAI,OAAO,UACT,MAAM,KAAK,aAAaA,cAAY,OAAO,QAAQ,EAAE,EAAE;CAGzD,IAAI,OAAO,aACT,MAAM,KAAK,gBAAgBA,cAAY,OAAO,WAAW,EAAE,EAAE;CAG/D,MAAM,OAAe,CAAC;CAEtB,IAAI,CAAC,MAAM,QAAQ,OAAO;CAE1B,UAAQ,MAAM,UAAU;CACxB,KAAK,KAAK,KAAK;CACf,UAAQ,MAAM,IAAI;CAElB,OAAO;AACT;AA0YA,MAAa,2BACX,aACA,cACU;CACV,MAAM,OAAc,CAAC;CACrB,KAAK,MAAM,cAAc,aAAa;EACpC,UAAQ,MAAM,cAAc;EAC5B,KAAK,MAAM,QAAQ,yBAAyB,YAAY,SAAS,GAC/D,UAAQ,MAAM,IAAI;EAEpB,UAAQ,MAAM,GAAG;CACnB;CACA,OAAO;AACT;AAEA,MAAa,4BACX,EACE,WACA,gBACA,UAAUK,iBAEZ,cACU;CACV,MAAM,OAAa,CAAC;CAEpB,IAAI,aAAa,OAAO,cAAc,UAAU;EAC9C,MAAM,EAAE,QAAQ,UAAU,2BAA2B,UAAU,CAAC;EAChE,YAAY,SAAS,GAAG,OAAO,GAAG,UAAU;CAC9C;CAEA,KAAK,KACH,OAAO,cAAc,WACjBL,cAAY,SAAS,IACrB,UAAU,SAAS,CACzB;CAEA,UAAQ,MAAM,KAAKA,cAAY,eAAe,EAAE,GAAG;CAKnD,IAFE,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,YAAY,QAAQ,UAE/C;EACd,MAAM,MAAgB,CAAC;EAEvB,IAAI,QAAQ,MAAM,IAAI,KAAK,SAASA,cAAY,QAAQ,IAAI,EAAE,EAAE;EAChE,IAAI,QAAQ,OAAO,IAAI,KAAK,UAAUA,cAAY,QAAQ,KAAK,EAAE,EAAE;EACnE,IAAI,QAAQ,UACV,IAAI,KAAK,aAAaA,cAAY,QAAQ,QAAQ,EAAE,EAAE;EACxD,IAAI,QAAQ,UACV,IAAI,KAAK,aAAaA,cAAY,QAAQ,QAAQ,EAAE,EAAE;EAExD,UAAQ,MAAM,KAAK;EACnB,KAAK,KAAK,GAAG;EACb,UAAQ,MAAM,GAAG;CACnB;CAEA,OAAO;AACT;AAEA,MAAa,uBACX,UACU;CACV,MAAM,OAAc,CAAC;CACrB,KAAK,MAAM,EAAE,aAAa,OAAO;EAC/B,UAAQ,MAAM,IAAI,QAAQ,SAAS,WAAW,QAAQ,EAAE;EAExD,MAAM,MAAM;GACV,QAAQ,QAAQ,SAASA,cAAY,QAAQ,IAAI,EAAE;GACnD,QAAQ,WAAW,YAAYA,cAAY,QAAQ,OAAO,EAAE;GAC5D,QAAQ,WAAW,YAAYA,cAAY,QAAQ,OAAO,EAAE;GAC5D,QAAQ,SAAS,UAAUA,cAAY,QAAQ,KAAK,EAAE;GACtD,QAAQ,SAAS,UAAUA,cAAY,QAAQ,KAAK,EAAE;GACtD,QAAQ,WACN,YACE,OAAO,QAAQ,YAAY,WACvBA,cAAY,QAAQ,OAAO,IAC3B,IAAI,QAAQ,QAAQ,IAAIA,aAAW,CAAC,CAAC,KAAK,IAAI,EAAE,GACrD;GACH,QAAQ,oBAAoB;GAC5B,QAAQ,cAAc,eAAeA,cAAY,QAAQ,UAAU,EAAE;GACrE,QAAQ,QAAQ,SAASA,cAAY,QAAQ,IAAI,EAAE;GACnD,QAAQ,cAAc,eAAeA,cAAY,QAAQ,UAAU,EAAE;GACrE,QAAQ,SAAS,UAAUA,cAAY,QAAQ,KAAK,EAAE;EACxD,CAAC,CAAC,QAAQ,MAAmB,CAAC,CAAC,CAAC;EAEhC,IAAI,IAAI,QAAQ;GACd,UAAQ,MAAM,GAAG;GACjB,UAAQ,MAAM,GAAG;GACjB,UAAQ,MAAM,GAAG;EACnB;EAEA,UAAQ,MAAM,GAAG;CACnB;CACA,OAAO;AACT;AAEA,MAAa,wBACX,UACU;CACV,MAAM,OAAc,CAAC;CACrB,KAAK,MAAM,EAAE,SAAS,MAAM,OAAO,OAAO;EACxC,UAAQ,MAAM,aAAa,EAAE,EAAE;EAE/B,MAAM,MAAM;GACV,QAAQ,QAAQ,SAASA,cAAY,QAAQ,IAAI,EAAE;GACnD,QAAQ,WAAW,YAAYA,cAAY,QAAQ,OAAO,EAAE;GAC5D,QAAQ,WAAW,YAAYA,cAAY,QAAQ,OAAO,EAAE;GAC5D,QAAQ,SAAS,UAAUA,cAAY,QAAQ,KAAK,EAAE;GACtD,QAAQ,SAAS,UAAUA,cAAY,QAAQ,KAAK,EAAE;GACtD,QAAQ,WACN,YACE,OAAO,QAAQ,YAAY,WACvBA,cAAY,QAAQ,OAAO,IAC3B,IAAI,QAAQ,QAAQ,IAAIA,aAAW,CAAC,CAAC,KAAK,IAAI,EAAE,GACrD;GACH,QAAQ,QAAQ,SAASA,cAAY,QAAQ,IAAI,EAAE;GACnD,QAAQ,cAAc,eAAeA,cAAY,QAAQ,UAAU,EAAE;GACrE,QAAQ,SAAS,UAAUA,cAAY,QAAQ,KAAK,EAAE;EACxD,CAAC,CAAC,QAAQ,MAAmB,CAAC,CAAC,CAAC;EAEhC,IAAI,IAAI,QAAQ;GACd,UAAQ,MAAM,KAAK;GACnB,UAAQ,MAAM,GAAG;GACjB,UAAQ,MAAM,GAAG;EACnB;EAEA,UAAQ,MAAM,GAAG;CACnB;CACA,OAAO;AACT;AAEA,MAAa,qBACX,KACA,WACW;CACX,OAAO,OACJ,KACE,EAAE,KAAK,WACN,UAAUD,eAAa,KAAK,GAAG,IAAI,OAAO,MAAM,KAAK,KAAK,GAAG,EACjE,CAAC,CACA,KAAK,EAAE;AACZ;AAEA,MAAa,kBACX,UACA,aACG;CACH,MAAM,OAAc,CAAC;CAErB,IAAI,aAAa,WACf,KAAK,KAAK,WAAW;MAErB,KAAK,KAAK,GAAG,SAAS,aAAa;CAGrC,MAAM,QAAkB,CAAC;CACzB,IAAI,SAAS,QAAQ,MAAM,KAAK,eAAe;CAC/C,IAAI,SAAS,aAAa,SAAS,cAAc,GAC/C,MAAM,KAAK,cAAc,SAAS,UAAU,EAAE;CAChD,IAAI,SAAS,SAAS,SAAS,UAAU,GACvC,MAAM,KAAK,UAAU,SAAS,MAAM,EAAE;CACxC,IAAI,SAAS,KAAK,MAAM,KAAK,QAAQ,SAAS,IAAI,EAAE;CACpD,IAAI,SAAS,KAAK,MAAM,KAAK,QAAQ,SAAS,IAAI,EAAE;CACpD,IAAI,SAAS,SAAS,SAAS,UAAU,GACvC,MAAM,KAAK,UAAU,SAAS,MAAM,EAAE;CACxC,IAAI,SAAS,OAAO,MAAM,KAAK,cAAc;CAE7C,IAAI,MAAM,QAAQ;EAChB,UAAQ,MAAM,GAAG;EACjB,KAAK,KAAK,OAAO,GAAG;CACtB;CAEA,UAAQ,MAAM,GAAG;CAEjB,OAAO;AACT;AAEA,MAAa,cACX,MACA,KACA,KACA,SACS;CACT,MAAM,EAAE,SAAS;CAEjB,OAAOO,UAAQ,IAAI;CAEnB,IAAI,UAAU,GAAG,IAAI,EAAE;CACvB,MAAM,UAAU,IAAI,YAAYC,cAAY,GAAG,IAAI;CACnD,MAAM,OAAO,KAAK,QAAQ;CAC1B,IAAI,SAAS,SACX,WAAW,QAAQP,cAAY,IAAI,EAAE;CAGvC,IAAI,OAAO,KAAK,OAAO,UACrB,KAAK,KAAK,GAAG,UAAU,KAAK;MAE5B,KAAK,EAAE,CAAC,QAAQ,OAAO;CAGzB,IAAI,KAAK,WACP,UAAQ,MAAM,KAAK,UAAU,OAAO,CAAC;CAGvC,IAAI,KAAK,YACP,UACE,MACA,eACE,KAAK,eAAgB,OAAiB,KAAKA,cAAY,KAAK,UAAU,EACvE,EACH;CAGF,IAAI,KAAK,aACP,KAAK,MAAM,QAAQ,wBACjB,KAAK,aACL,IAAI,SACN,GACE,UAAQ,MAAM,IAAI;CAItB,IAAI,KAAK,gBAAgB,UAAQ,MAAM,gBAAgB;CAEvD,IAAI,KAAK,YAAY,UAAQ,MAAM,aAAa;CAEhD,IAAI,KAAK,MAAM,CAAC,IAAI,WAClB,UAAQ,MAAM,OAAQ,KAAK,GAAc,OAAO,KAAK,GAAG,EAAE,EAAE;CAG9D,IACE,KAAK,YAAY,KAAA,KACjB,KAAK,YAAY,KAAK,mBACrB,CAAC,IAAI,aAAa,OAAO,KAAK,YAAY,aAE3C,UACE,MACA,YAAY,4BAA4B,KAAK,KAAK,OAAO,EAAE,EAC7D;CAGF,IAAI,KAAK,SACP,KAAK,MAAM,QAAQ,oBAAoB,KAAK,OAAO,GACjD,UAAQ,MAAM,IAAI;CAItB,IAAI,KAAK,UACP,KAAK,MAAM,QAAQ,qBAAqB,KAAK,QAAQ,GACnD,UAAQ,MAAM,IAAI;CAItB,IAAI,KAAK,SAAS,UAAQ,MAAM,YAAYA,cAAY,KAAK,OAAO,EAAE,EAAE;CAExE,IAAI,KAAK,QACP,UAAQ,MAAM,kBAAkB,KAAK,KAAK,MAAM,CAAC;CAGnD,IAAI,KAAK,QACP,KAAK,MAAM,QAAQ,0BAA0B,KAAK,MAAM,GACtD,UAAQ,MAAM,IAAI;CAItB,MAAM,EAAE,sBAAsB;CAC9B,IAAI,mBACF,UACE,MACA,sBACE,OAAO,sBAAsB,aACzB,kBAAkB,SAAS,IAC3B,OAAO,sBAAsB,WAC3BA,cAAY,iBAAiB,IAC7B,KAAK,UAAU,iBAAiB,EACvC,EACH;CAGF,IAAI,KAAK,aACP,UAAQ,MAAM,gBAAgBA,cAAY,KAAK,WAAW,EAAE,EAAE;CAEhE,IAAI,KAAK,SAAS,UAAQ,MAAM,YAAYA,cAAY,KAAK,OAAO,EAAE,EAAE;CAExE,IAAI,KAAK,eAAe,CAAC,IAAI,WAC3B,UAAQ,MAAM,gBAAgB,KAAK,YAAY,SAAS,EAAE,EAAE;CAE9D,OAAO,KAAK,WAAW,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK;AACtE;;;;;;;AC/1BA,MAAa,oBACX,OACA,KACA,WACG;CACH,IAAI,QACF,IAAI,MAAM,SAAS,MAAM,QAAQ,OAAO;MACnC,MAAM,UAAU,GAAG,MAAM,OAAO;MAChC,IAAI,MAAM,SACf,OAAO,MAAM,QAAQ;AAEzB;AAuBA,MAAa,mBAAmB,GAAU,eAA4B;CACpE,IAAI,YAAY;EACd,MAAM,UAAU,EAAE,GAAG,EAAE,EAAE,QAAQ;EACjC,MAAM,EAAE,mBAAmB,EAAE;EAC7B,IAAI,gBACF,KAAK,MAAM,CAAC,KAAK,UAAU,YAAY;GACrC,MAAM,SAAS,eAAe;GAC9B,IAAI,QACF,QAAQ,MAAM,MAAM,OAAO;EAE/B;EAEF,OAAO;CACT;CAEA,OAAO,EAAE,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,EAAE;AACxC;AAEA,MAAa,0BACX,GACA,KACA,WACG;CACH,IAAK,OAAkB,QACrB,wBAAwB,GAAG,WAAW,KAAM,OAAkB,MAAM;AAExE;AAEA,MAAa,yBACX,GACA,WACG;CACH,uBAAuB,GAAG,KAAK,MAAM;AACvC;AAEA,MAAa,kBAAkB,YAA6B;CAC1D,OAAO,SAAS;AAClB;AAEA,MAAa,kBACX,GACA,WACG;CACH,wBAAwB,GAAG,WAAW,KAAK,MAAM;AACnD;AAUA,MAAa,6BACX,GACA,KACA,QACG;CACH,IAAI,IAAI,OAAO,OAAO,uBAAuB,EAAE,GAAG,KAAK,IAAI,OAAO,KAAK;AACzE;AC7IA,IAAaQ,qBAAb,cAEUC,SAAO;CAaf,YACE,QACA,UACA,YACA,WACA;EACA,MACE,QACA,OAAO,QAAQ,GACf,OAAO,QAAQ,GACf,OAAO,QAAQ,CACjB;EATO,KAAA,WAAA;EACA,KAAA,aAAA;EAdGC,KAAAA,YAAAA,YAAU;EAuBpB,KAAK,WAAW,aAAa,aAAa,MAAM,WAAW;EAC3D,KAAK,KAAK,iBAAiB;EAC3B,KAAK,KAAK,YAAY;CACxB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,MAAM,EACJ,UACA,MAAM,EAAE,aACN;EAEJ,OAAO,WACL,MACA,KACA,KACA,QAAQC,eACL,SAAS,WAAW,IAAI,aAAa,IAClC,SAAS,MAAM,IAAI,cAAc,SAAS,CAAC,IAC3C,aACD,WAAW,KAAA,KAAa,WAAW,MAAM,CAAC,SAAS,SAAS,GAAG,IAC5D,IAAI,OAAO,KACX,GACR,EAAE,EACJ;CACF;CAEA,GAUW,QAAc;EACvB,MAAM,IAAI;EACV,MAAM,WAAWC,gBACf,MACA,MACA,MACF;EAEA,SAAS,cAAc,EAAE;EACzB,SAAS,eAAe,EAAE;EAC1B,SAAS,cAAc,EAAE;EAEzB,OAAO;CACT;AACF;AAGA,IAAaC,iBAAb,cAEUL,mBAAyB;CACjC,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,UAAUG,cAAY,KAAK,QAAQ,EAAE,EAAE;CAC3E;AACF;ACvFA,IAAaG,eAAb,cAIUC,SAAO;CAYf,YACE,QACA,UACA,SACA,YACA;EACA,MAAM,QAAQ,UAAU;EAJjB,KAAA,WAAA;EACA,KAAA,UAAA;EAbGC,KAAAA,YAAAA,YAAU;EAQX,KAAA,WAAA;EAST,KAAK,cAAc,KAAK,eAAe,KAAK,cAAc;CAC5D;CAEA,OAAO,KAAsB,KAAmB;EAC9C,MAAM,UAAU,IAAI,YAChB,KACA,MAAM,KAAK,QAAQ,KAAK,WAAW,IAAI,OAAO,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;EACjE,OAAO,WAAW,MAAM,KAAK,KAAK,SAAS,KAAK,SAAS,GAAG,QAAQ,EAAE;CACxE;CAEA,QAAQ;EACN,MAAM,OAAO,KAAK;EAClB,MAAM,QAAQ,KAAK,QAAQ,GAAG;EAC9B,OAAO,IACL,UAAU,KAAK,OAAO,GAAG,KAAK,MAAM,GAAG,KAAK,EAAE,KAAK,KAAK,MAAM,QAAQ,CAAC,IACxE;CACH;AACF;ACtCA,MAAa,yBACX,QACA,UACG;CACH,OAAO,KAAK,QAAQ;CACpB,OAAmB,UAAU,UAC3B,UAAU,OAAO,OAAO,MAAM,KAAK;AACvC;AAEA,MAAaC,oBACX,QAEA,IACA,iBACG;CACH,MAAM,IAAI,OAAO,OAAO,MAAM;CAC9B,EAAE,eAAe;CACjB,EAAE,OAAO;EAAE,GAAG,OAAO;EAAM,OAAO;CAAG;CAErC,MAAM,EAAE,cAAc,OAAO;CAC7B,EAAE,SAAS,aACN,UAAoB,UAAU,OAAO,UAAU,IAAI,GAAG,KAAK,KAC3D,UAAoB,UAAU,OAAO,OAAO,GAAG,KAAK;CAEzD,OAAO;AACT;AAEA,MAAaC,wBACX,QAEA,IACA,eACG;CACH,MAAM,IAAI,OAAO,OAAO,MAAM;CAC9B,EAAE,aAAa;CACf,EAAE,OAAO;EAAE,GAAG,OAAO;EAAM,WAAW;CAAG;CAEzC,MAAM,EAAE,UAAU,OAAO;CACzB,EAAE,SAAS,SACN,UAAoB,UAAU,OAAO,GAAG,IAAI,MAAM,KAAK,KACvD,UAAoB,UAAU,OAAO,GAAG,IAAI;CAEjD,OAAO;AACT;AAEA,MAAa,0BACX,QACA,OACG;CACH,OAAO,KAAK,SAAS;AACvB;AC9CA,MAAM,gBAAgB,UAAwB,MAAM,YAAY;AAGhE,MAAM,kBAAkB,UAA2B;CACjD,OAAO,OAAO,UAAU,WAAW,IAAI,KAAK,KAAK,IAAI;AACvD;AAGA,MAAM,6BAA6B,UACjC,OAAO,UAAU,WAAW,KAAK,MAAM,KAAK,IAAK,MAAe,QAAQ;AAE1E,MAAaC,uBAAqB,WAIhC,OAAO,qBACH,4BACC,KAAK;AAGZ,MAAM,mBAAmB,UAAyB,IAAI,KAAK,KAAe;AAG1E,MAAM,2BAA2B,UAC/B,OAAO,UAAU,WAAW,IAAI,KAAK,KAAK,IAAK;AAEjD,MAAaC,qBAAmB,WAGzB,OAAO,qBAAqB,0BAA0B;AAG7D,IAAsB,iBAAtB,cAEUC,SAAO;CAcf,YACE,QACA,oBACA;EACA,MACE,QACA,OAAO,iBAAiB,GACxB,OAAO,aAAa,GACpB,OAAO,iBAAiB,CAC1B;EAPO,KAAA,qBAAA;EANGC,KAAAA,YAAAA,YAAU;EAcpB,IAAI,oBACF,KAAK,SAAS;EAEhB,KAAK,WAAW,OAAO;EACvB,KAAK,SAAS,OAAO;EACrB,KAAK,KAAK,SAAS;CACrB;AACF;AAGA,IAAaC,eAAb,cAEU,eAAuB;;;EACpB,KAAA,WAAA;;CACX,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WACL,MACA,KACA,KACA,SAAS,eAAe,KAAK,MAAM,IAAI,SAAS,GAClD;CACF;AACF;AAEA,IAAsB,oBAAtB,cAEU,eAAuB;CAG/B,YACE,QACA,mBACA,oBACA;EACA,MAAM,QAAQ,kBAAkB;EAChC,KAAK,KAAK,oBAAoB;CAChC;CAEA,QAAQ;EACN,OAAO,WACL,KAAK,UACL,KAAK,KAAK,sBAAsB,KAAA,KAC9B,IAAI,KAAK,KAAK,kBAAkB,EACpC;CACF;AACF;AAEA,IAAsB,sBAAtB,cAEU,kBAA0B;CAGlC,QAAQ;EACN,OAAO,WACL,KAAK,cACL,KAAK,KAAK,sBAAsB,KAAA,KAC9B,IAAI,KAAK,KAAK,kBAAkB,IAClC,iBACF;CACF;AACF;AAEA,MAAM,mBACJ,MAGA,KACA,QACG;CACH,MAAM,EAAE,mBAAmB,MAAM,KAAK;CAEtC,MAAM,EAAE,qBAAqB,KAAK;CAElC,IAAI,CAAC,IAAI,aAAa,kBAAkB;EACtC,MAAM,OAAO,gBAAgBC,oBAAkB,SAAS;EAExD,MAAM,MAAM,KAAK,KAAK;EACtB,MAAM,cAAc,KAAK,KAAK;EAC9B,KAAK,KAAK,UAAU,KAAA;EACpB,KAAK,KAAK,cAAc,KAAA;EAExB,MAAM,OAAO,WACX,MACA,KACA,KACA,aAAa,KAAK,GAChB,KAAK,MAAM,IAAI,IAAI,GACpB,IAAI,mBAAmB,eAAe,KAAK,MAAM,IAAI,SAAS,GACjE;EAEA,KAAK,KAAK,UAAU;EACpB,KAAK,KAAK,cAAc;EAExB,OAAO;CACT,OACE,OAAO,WACL,MACA,KACA,KACA,GAAG,gBAAgBA,oBAAkB,kBAAkB,YAAY,GACjE,KAAK,MAAM,IAAI,IAAI,GACpB,GAAG,eAAe,KAAK,MAAM,IAAI,SAAS,GAC7C;AAEJ;AAGA,IAAaA,oBAAb,cAEU,kBAA0B;;;EACvB,KAAA,WAAA;;CACX,OAAO,KAAsB,KAAmB;EAC9C,OAAO,gBAAgB,MAAM,KAAK,GAAG;CACvC;AACF;AAGA,IAAaC,sBAAb,cAEU,oBAA4B;;;EACzB,KAAA,WAAA;EACI,KAAA,eAAA;;CACf,OAAO,KAAsB,KAAmB;EAC9C,OAAO,gBAAgB,MAAM,KAAK,GAAG;CACvC;AACF;AAGA,IAAaC,eAAb,cAAmEL,SAAO;CAaxE,YAAY,QAAgB,mBAA4B;EACtD,MAAM,QAAQ,OAAO,aAAa,CAAU;EAJnC,KAAA,WAAA;EACCC,KAAAA,YAAAA,YAAU;EAIpB,KAAK,KAAK,oBAAoB;CAChC;CAEA,OAAO,KAAsB,KAAmB;EAC9C,MAAM,EAAE,sBAAsB,KAAK;EACnC,OAAO,WACL,MACA,KACA,KACA,QAAQ,qBAAqB,GAAG,GAAG,eACjC,KAAK,MACL,IAAI,SACN,GACF;CACF;AACF;AAEA,MAAM,mBACJ,OACA,OACA,SACG;CACH,IAAI,OACF,MAAM,KAAK,GAAG,MAAM,GAAG,MAAM;AAEjC;AAEA,MAAM,6BACJ,UACW;CACX,MAAM,QAAkB,CAAC;CAEzB,gBAAgB,OAAO,MAAM,OAAO,OAAO;CAC3C,gBAAgB,OAAO,MAAM,QAAQ,QAAQ;CAC7C,gBAAgB,OAAO,MAAM,MAAM,MAAM;CACzC,gBAAgB,OAAO,MAAM,OAAO,OAAO;CAC3C,gBAAgB,OAAO,MAAM,SAAS,SAAS;CAC/C,gBAAgB,OAAO,MAAM,SAAS,SAAS;CAC/C,gBAAgB,OAAO,MAAM,cAAc,cAAc;CAEzD,OAAO,MAAM,SAAS,MAAM,KAAK,GAAG,IAAI;AAC1C;AAGA,IAAaK,mBAAb,cAAuEN,SAAO;CAa5E,YACE,QACA,QACA,WACA,OACA;EACA,MAAM,QAAQ,OAAO,aAAa,CAAU;EATnC,KAAA,WAAA;EACCC,KAAAA,YAAAA,YAAU;EASpB,KAAK,KAAK,SAAS;EACnB,KAAK,KAAK,YAAY;EACtB,IAAI,OACF,sBAAsB,MAAM,KAAK;EAEnC,KAAK,KAAK,SAAS;CACrB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,MAAM,EAAE,QAAQ,cAAc,KAAK;EACnC,OAAO,WACL,MACA,KACA,KACA,YAAY,CAAC,UAAU,IAAI,OAAO,IAAI,aAAa,OAAO,SAAS,CAAC,CAAC,CAClE,QAAQ,SAAS,IAAI,CAAC,CACtB,KAAK,IAAI,EAAE,EAChB;CACF;CAEA,QAAQ;EACN,OAAO,WACL,KAAK,UACL,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,UAClC,KAAK,KAAK,cAAc,KAAA,KAAa,KAAK,KAAK,KAAK,UAAU,EAChE;CACF;AACF;AC3QA,IAAaM,gBAAb,MAAaA,sBAMHC,SAAO;CAaf,YACE,QACA,MACA,aACA,eACA,cACA,aACA;EACA,MAAM,QAAQ,aAAa,cAAc,WAAW;EAnB3C,KAAA,WAAA;EACCC,KAAAA,YAAAA,YAAU;EAqBpB,KAAK,KAAK,aAAa;EAEvB,IAAI,eACF,uBAAuB,MAAM,aAAa;EAG5C,KAAK,KAAK,OAAO,gBAAgBF,gBAAc,KAAK,KAAK,OAAO;EAChE,KAAK,KAAK,OAAO,KAAK,KAAK;EAC3B,KAAK,KAAK,YACR,gBAAgBA,gBAAc,KAAK,KAAK,YAAY,IAAI;CAC5D;CAEA,QAAgB;EACd,OAAO,KAAK,KAAK,KAAK,MAAM,IAAI,KAAK,OAAO,KAAK,KAAK,SAAS;CACjE;CAEA,OAQE,KACA,KACM;EACN,IAAI,OAAO;EACX,IAAI,QAAQ;EACZ,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK,WAAW,KAAK;GAC5C,QAAQ,GAAG,IAAI,EAAE;GACjB,SAAS;EACX;EAEA,MAAM,OAAc,CAAC,IAAI;EAEzB,MAAM,EAAE,SAAS,KAAK;EACtB,MAAM,aAAa,OAAO,OAAO,IAAI;EACrC,MAAM,EAAE,YAAY,GAAG,GAAG,wBAAwB,KAAK;EACvD,WAAW,OAAO;EAClB,UAAQ,MAAM,WAAW,OAAO,KAAK,GAAG,CAAC;EAEzC,UAAQ,MAAM,GAAG,QAAQ,gBAAgB,KAAK,MAAM,IAAI,SAAS,GAAG;EACpE,OAAO,WAAW,MAAM,KAAK,KAAK,IAAI;CACxC;AACF;ACtGA,MAAa,cAAc,MAAgB,MAAM,OAAO,IAAI,KAAK,UAAU,CAAC;AAG5E,IAAaG,eAAb,cAIUC,SAAO;CAYf,YACE,QACA,aACA,kBAAkB,MAClB;EACA,MAAM,QAAQ,WAA0B;EAf/B,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;EAQpB,IAAI,CAAC,iBACH,KAAK,KAAK,SAAS;EAErB,KAAK,KAAK,YAAY,KAAK;CAC7B;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,QAAQ;CAC5C;AACF;AAGA,IAAaC,mBAAb,MAAaA,yBAIHF,SAAO;CAef,WAAW,WAAW;EACpB,OAAQ,KAAK,cAAc,IAAIE,iBAC7BC,wBACA,KAAA,CACF;CACF;CAEA,YAAY,QAAgB,aAA0B;EACpD,MAAM,QAAQ,WAA0B;EArB/B,KAAA,WAAA;EAQCF,KAAAA,YAAAA,YAAU;CActB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,YAAY;CAChD;AACF;ACzDA,IAAsB,mBAAtB,cAGUG,SAAO;;;EAUHC,KAAAA,YAAAA,YAAU;;AACxB;AAEA,IAAsB,oBAAtB,cAEU,iBAAoD;CAG5D,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,IAAI,CAAU;EACnC,KAAK,KAAK,MAAM;CAClB;AACF;AAEA,IAAsB,2BAAtB,cAGUD,SAAO;CAYf,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,aAAa,CAAU;EARlCC,KAAAA,YAAAA,YAAU;EASpB,KAAK,KAAK,WAAW;CACvB;AACF;AAQA,IAAaC,kBAAb,cAEU,yBAAiC;CAMzC,YACE,QACA,kBACA,cACA;EACA,MAAM,MAAM;EARFD,KAAAA,YAAAA,YAAU;EACX,KAAA,WAAA;EAQT,KAAK,KAAK,mBAAmB;EAC7B,KAAK,KAAK,eAAe;EACzB,KAAK,KAAK,QAAQ;CACpB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,MAAM,EAAE,kBAAkB,iBAAiB,KAAK;EAChD,OAAO,WACL,MACA,KACA,KACA,WAAW,oBAAoB,KAC7B,eAAe,KAAK,iBAAiB,GACtC,EACH;CACF;CAEA,QAAQ;EACN,MAAM,EAAE,kBAAkB,iBAAiB,KAAK;EAEhD,OAAO,WACL,KAAK,UACL,mBACI,eACE,IAAI,iBAAiB,IAAI,aAAa,KACtC,IAAI,iBAAiB,KACvB,KAAA,CACN;CACF;AACF;AAEA,MAAM,oBAAoB,EAAE,KAAK,KAAK;AAEtC,MAAM,aACJ,QACA,KACA,KACA,UACS;CACT,IAAI;CAEJ,IAAI,OAAO,KAAK,UACd,OAAO,eAAe,OAAO,KAAK,UAAU,KAAK;MAEjD,OAAO,CAAC,GAAG,MAAM,GAAG;CAGtB,UACE,MACA,iBAAiB,OAAO,MAAM,IAAI,WAAW,iBAAiB,CAChE;CAEA,OAAO,WAAW,QAAQ,KAAK,KAAK,IAAI;AAC1C;AAGA,IAAaE,mBAAb,cAEU,kBAA0B;CAIlC,YAAY,QAAgB;EAC1B,MAAM,MAAM;EAJH,KAAA,WAAA;EAKT,KAAK,KAAK,QAAQ;EAClB,KAAK,KAAK,YAAY;CACxB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,UAAU,MAAM,KAAK,KAAK,UAAU;CAC7C;CAEA,SAEE,UAA8B,CAAC,GACT;EACtB,OAAOC,gBAAc,MAAM,YAAY,OAAO;CAChD;AACF;AAGA,IAAaC,kBAAb,cAEU,kBAA0B;CAIlC,YAAY,QAAgB;EAC1B,MAAM,MAAM;EAJH,KAAA,WAAA;EAKT,KAAK,KAAK,QAAQ;EAClB,KAAK,KAAK,YAAY;CACxB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,UAAU,MAAM,KAAK,KAAK,SAAS;CAC5C;CAEA,SAEE,UAA8B,CAAC,GACT;EACtB,OAAOD,gBAAc,MAAM,YAAY,OAAO;CAChD;AACF;AAGA,IAAaE,iBAAb,cAEU,yBAA2D;CAInE,YAAY,QAAgB;EAC1B,MAAM,MAAM;EAJH,KAAA,WAAA;EAKT,KAAK,KAAK,QAAQ;CACpB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,UAAU,MAAM,KAAK,KAAK,QAAQ;CAC3C;CAEA,SAEE,UAA8B,CAAC,GACT;EACtB,OAAOF,gBAAc,MAAM,YAAY,OAAO;CAChD;AACF;AAGA,IAAaG,eAAb,cAEU,iBAAuD;CAI/D,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,OAAO,CAAU;EAJ7B,KAAA,WAAA;EAKT,KAAK,KAAK,QAAQ;EAClB,KAAK,KAAK,YAAY;CACxB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WACL,MACA,KACA,KACA,SAAS,iBAAiB,KAAK,MAAM,IAAI,SAAS,GACpD;CACF;AACF;AAGA,IAAaC,0BAAb,cAEU,yBAAiC;CAIzC,YAAY,QAAgB;EAC1B,MAAM,MAAM;EAJH,KAAA,WAAA;EAKT,KAAK,KAAK,QAAQ;CACpB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,mBAAmB;CACvD;AACF;AAGA,IAAaC,sBAAb,cAEU,kBAA0B;CAKlC,YAAY,QAAgB;EAC1B,MAAM,MAAM;EALH,KAAA,WAAA;EAMT,KAAK,KAAK,MAAM;EAChB,KAAK,KAAK,QAAQ;EAClB,KAAK,KAAK,YAAY;CACxB;CAEA,QAAQ;EACN,OAAO;CACT;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WACL,MACA,KACA,KACA,gBAAgB,iBACd,KAAK,MACL,IAAI,WACJ,iBACF,GACF;CACF;AACF;AAGA,IAAaC,iBAAb,cAEU,kBAA0B;CAKlC,YAAY,QAAgB;EAC1B,MAAM,MAAM;EALH,KAAA,WAAA;EAMT,KAAK,KAAK,MAAM;EAChB,KAAK,KAAK,QAAQ;EAClB,KAAK,KAAK,YAAY;CACxB;CAEA,QAAQ;EACN,OAAO;CACT;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WACL,MACA,KACA,KACA,WAAW,iBACT,KAAK,MACL,IAAI,WACJ,iBACF,GACF;CACF;AACF;AAGA,IAAaC,oBAAb,cAEU,yBAAiC;CAKzC,YAAY,QAAgB;EAC1B,MAAM,MAAM;EALH,KAAA,WAAA;EAMT,KAAK,KAAK,QAAQ;CACpB;CAEA,QAAQ;EACN,OAAO;CACT;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,aAAa;CACjD;AACF;AC7JA,MAAaC,yBACX,YACwB;CACxB,MAAM,eAAe;EACnB,eAAe,SAAS;EAExB,MAAM,IAA6B;GACjC,OAAOC,iBAAe,MAAe,EAAE;EACzC;EACA,UAAU,IAAmB;GAC3B,OAAOC,qBAAmB,MAAe,EAAE;EAC7C;EAEA,OAAO,IAA6B;GAClC,OAAOC,gBAAc,MAA0B,UAAU,EAAE;EAC7D;EACA,SAAS;GACP,OAAO;EACT;EACA,aAAa;GACX,OAAO;EACT;EACA,iBAAiB;GACf,OAAO;EACT;EACA,eAAuE;GACrE,OAAO,KAAK,MAAMC,oBAAkB,IAAI,CAAC;EAC3C;EACA,aAAqE;GACnE,OAAO,KAAK,MAAMC,kBAAgB,IAAI,CAAC;EACzC;EACA,KACE,UACA,MACA;GACA,OAAO,IAAIC,aAAW,cAAc,UAAU,MAAM,KAAA,CAAS;EAC/D;EACA,MAAqC,MAAY;GAC/C,OAAO,IAAIC,cACT,cACA,MACA,KAAA,GACA,SAAS,WACX;EACF;EACA,SAASC;EACT,QAAQA;EACR,SAASA;EACT,OAAOA;EACP,cAAcA;EACd,WAAWA;EACX,WAAWA;EACX,cAAcA;EACd,QAAQA;EACR,KAAKA;EACL,kBAAkBA;EAClB,cAAcA;EACd,KAAKA;EACL,MAAMA;EACN,WAAwC;GACtC,OAAOL,gBAAc,MAAM,cAAc,IAAI;EAC/C;EACA,OAAO;GACL,OAAO,IAAIM,aACT,cACA,KAAA,GACA,SAAS,mBACX;EACF;EACA,WAAW;GACT,OAAO,IAAIC,iBAAe,cAAc,KAAA,CAAS;EACnD;EACA,WAAWF;EAEX,gBAAgB,IAAIG,iBAAe,YAAY;EAC/C,eAAe,IAAIC,gBAAc,YAAY;EAC7C,YAAY,IAAIC,aAAW,YAAY;EACvC,mBAAmB,IAAIC,oBAAkB,YAAY;EACrD,cAAc,IAAIC,eAAa,YAAY;EAE3C,cAAc,IAAIC,eAAa,YAAY;EAC3C,UAAU,WAAoB,UAC5B,IAAIC,gBAAc,cAAc,WAAW,KAAK;EAClD,uBAAuB,IAAIC,wBAAsB,YAAY;EAC7D,iBAAiB,IAAIC,kBAAgB,YAAY;EACjD,aAAa,IAAIC,cAAY,YAAY;EACzC,UAAU,UAAkB,IAAIC,gBAAc,cAAc,KAAK;EACjE,YAAY,IAAIC,aAAW,YAAY;EACvC,SAAS,UAAmB,IAAIC,eAAa,cAAc,KAAK;EAChE,cAAc,IAAIC,eAAa,YAAY;EAE3C,YAAY,IAAIC,aAAW,cAAc,SAAS,kBAAkB;EACpE,gBAAgB,cACd,IAAIC,kBAAgB,cAAc,WAAW,SAAS,kBAAkB;EAC1E,YAAY,cACV,IAAIC,oBACF,cACA,WACA,SAAS,kBACX;EAEF,sBAAsBnB;CACxB;CAEA,OAAO;AACT;AAEA,MAAaoB,yBAAuB5B,sBAAoB;AC7RxD,IAAa6B,kBAAb,MAAaA,wBAAyDC,SAAO;CAa3E,WAAW,WAAW;EACpB,OAAQ,KAAK,cAAc,IAAID,gBAAcE,sBAAoB;CACnE;CAKA,WAAW,2BAA2B;EACpC,IAAI,WAAW,KAAK;EACpB,IAAI,CAAC,UAAU;GACb,WAAW,KAAK,4BAA4B,OAAO,OAAO,KAAK,QAAQ;GACvE,SAAU,KAAK,mBAAmB;EACpC;EACA,OAAO;CACT;CAEA,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,QAAQ,CAAU;EA5B9B,KAAA,WAAA;EACCC,KAAAA,YAAAA,YAAU;EA4BpB,KAAK,KAAK,QAAQ;EAClB,KAAK,KAAK,YAAY;CACxB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,WAAW;CAC/C;AACF;AAEA,MAAM,aAAa,UAAkB,MAAM,OAAO;AClBlD,IAAIC;AACJ,MAAa,6BAA6B,OAA+B;CACvE,2BAAyB;AAC3B;AAEA,IAAIC;AACJ,MAAa,4BAA4B,OAA8B;CACrE,0BAAwB;AAC1B;AAEA,IAAI;AAgDJ,SAAgB,kBAAkB,OAAgB,WAA0B;CAC1E,MAAM,IAAK,MAAgC;CAE3C,IAAI,EAAE,cAAc,WAAW;EAC7B,EAAE,YAAY;EACd,OAAO,OAAO,OAAO,SAAS;CAChC;CAEA,OAAO;AACT;;;;;;AAOA,MAAM,QAEJ,QAEQ;CACR,OAAO,OAAO,OAEZ,SAA4B,OAAY;EACtC,MAAM,EAAE,MAAM;EAEd,MAAM,MAAM,aAAa,MAAM,KAAK;EACpC,CAAC,EAAE,UAAU,CAAC,EAAA,CAAG,KAAK,KAAK,OAAO,KAAK;EAGvC,IAAI,eAAe,EAAE,OAAO,GAC1B,eAAe,GAAG,KAAA,CAAS;EAG7B,EAAE,YAAYC,gBAAc;EAI5B,IAAI,gBAAgBC,gBAAc,KAAK,QAAQ;GAC7C,IAAI;GACJ,IAAI,KAAK,OAAO,OAAO,KAAK,MAAM;IAChC,SAAS,OAAO,OAAOD,gBAAc,QAAQ;IAC7C,OAAO,OAAO;KAAE,GAAG,OAAO;KAAM,MAAM,KAAK,OAAO,MAAM,KAAK;IAAK;GACpE,OACE,SAASA,gBAAc;GAEzB,KAAK,OAAO,QAAQ;EACtB;EAEA,OAAO,kBAAkB,MAAe,OAAgB;CAC1D,GACA,EAEE,IACF,CAEF;AACF;AAGA,MAAM,cAEJ,QAEQ;CACR,OAAO,OAAO,OAEZ,SAA4B,GAAG,MAAa;EAC1C,MAAM,EAAE,MAAM;EAEd,KAAK,SAAS,KAAK,MAAM;GACvB,MAAM,MAAM,aAAa,MAAM,GAAG;GAClC,IAAI,KAAK,KAAK,KAAK;EACrB,CAAC;EAED,CAAC,EAAE,UAAU,CAAC,EAAA,CAAG,KAAK,KAAK,IAAI;EAG/B,IAAI,eAAe,EAAE,OAAO,GAC1B,eAAe,GAAG,KAAA,CAAS;EAG7B,OAAO,kBAAkB,MAAe,OAAgB;CAC1D,GACA,EAEE,IACF,CAEF;AACF;AAEA,MAAa,gBAAgB,GAAY,QAAiB;CACxD,OAAO,eAAe,UAClBD,wBAAsB,GAAgC,GAAY,IAClE,KAAA;AACN;AAIA,MAAM,cACJ,KACA,KACA,UACA,OACW;CACX,IAAI,OAAO,OAAO,QAAQ,UAAU;EAClC,IAAI,MAAM,WAAW,GAAG,GACtB,OAAO,KAAK,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,EAAA,CAC3C,KAAK,UAAU,SAAS,IAAI,QAAQ,KAAK,CAAC,CAAC,CAC3C,KAAK,IAAI,EAAE;EAGhB,IAAIG,eAAa,GAAG,GAClB,OAAO,IAAI,MAAM,KAAK,QAAQ;EAGhC,IAAI,WAAW,KACb,OAAO,IAAIJ,yBAAuB,KAAK,GAAY,EAAE;EAGvD,IAAI,EAAE,eAAe,SAAS,CAAC,MAAM,QAAQ,GAAG,GAC9C,MAAM,KAAK,UAAU,GAAG;CAE5B;CAEA,OAAO,SAAS,IAAI,QAAQ,GAAG;AACjC;AAEA,MAAM,kBACJ,KACA,KACA,UACA,cACW;CACX,IAAI,OAAO,OAAO,QAAQ,UAAU;EAClC,IAAI,CAAC,aAAa,MAAM,QAAQ,GAAG,GACjC,OAAO,IAAI,IAAI,KAAK,UAAU,SAAS,IAAI,QAAQ,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;EAGxE,IAAII,eAAa,GAAG,GAClB,OAAO,IAAI,MAAM,KAAK,QAAQ;EAGhC,IAAI,WAAW,KACb,OAAO,oBAAoBJ,yBACzB,KACA,GACF,EAAE;CAEN;CAEA,OAAO,SAAS,IAAI,QAAS,IAAe,QAAQ,SAAS,MAAM,CAAC;AACtE;AAaA,MAAM,OAAO;CACX,QAAQ,MAAM,KAAK,OAAO,KAAK,aAC7B,UAAU,OACN,GAAG,IAAI,YACP,GAAG,IAAI,KAAK,WAAW,OAAO,KAAK,QAAQ,GACjD;CACA,KAAK,MAAM,KAAK,OAAO,KAAK,aAC1B,UAAU,OACN,GAAG,IAAI,gBACP,GAAG,IAAI,MAAM,WAAW,OAAO,KAAK,QAAQ,GAClD;CACA,gBAAgB,MACb,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,oBAAoB,WAAW,OAAO,KAAK,QAAQ,GAC9D;CACA,mBAAmB,MAChB,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,wBAAwB,WAAW,OAAO,KAAK,QAAQ,GAClE;CACA,IAAI,MAAM,KAAK,OAAO,KAAK,aACzB,MAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,SAC3B,UACA,GAAG,IAAI,MAAM,WAAW,OAAO,KAAK,UAAU,IAAI,GACxD;CACA,OAAO,MAAM,KAAK,OAAO,KAAK,aAC5B,MAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,SAC3B,SACA,OAAO,IAAI,MAAM,WAAW,OAAO,KAAK,UAAU,IAAI,GAC5D;AACF;AAoBA,MAAM,MAAM;CACV,GAAG;CACH,IAAI,MACD,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,KAAK,WAAW,OAAO,KAAK,QAAQ,GAC/C;CACA,KAAK,MACF,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,MAAM,WAAW,OAAO,KAAK,QAAQ,GAChD;CACA,IAAI,MACD,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,KAAK,WAAW,OAAO,KAAK,QAAQ,GAC/C;CACA,KAAK,MACF,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,MAAM,WAAW,OAAO,KAAK,QAAQ,GAChD;CACA,SAAS,MACN,KAAK,CAAC,MAAM,KAAK,KAAK,aACrB,GAAG,IAAI,WAAW,WAAW,MAAM,KAAK,QAAQ,EAAE,OAAO,WACvD,IACA,KACA,QACF,GACJ;AACF;AAQA,MAAM,UAAU;CACd,GAAG;CACH,KAAK,MACF,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,OAAO,MAAM,EAAE,KAAK,MAAM,KAAK,QAAQ,GAClD;CACA,IAAI,MACD,KAAK,OAAO,KAAK,aAChB,IAAI,IAAI,QAAQ,MAAM,EAAE,KAAK,MAAM,KAAK,QAAQ,EAAE,EACtD;AACF;AAqBA,MAAM,OAAO;CACX,GAAG;CACH,UAAU,MACP,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,gBAAgB,eAAe,OAAO,KAAK,QAAQ,EAAE,QAChE;CACA,mBAAmB,MAChB,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,eAAe,eAAe,OAAO,KAAK,QAAQ,EAAE,QAC/D;CACA,YAAY,MACT,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,SAAS,eAAe,OAAO,KAAK,QAAQ,EAAE,QACzD;CACA,qBAAqB,MAClB,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,QAAQ,eAAe,OAAO,KAAK,QAAQ,EAAE,QACxD;CACA,UAAU,MACP,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,gBAAgB,eAAe,OAAO,KAAK,QAAQ,GAC9D;CACA,mBAAmB,MAChB,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,eAAe,eAAe,OAAO,KAAK,QAAQ,GAC7D;AACF;AAIA,MAAM,cAAc;CAClB,GAAG;CACH,GAAG;AACL;AAuNA,MAAM,kBAAkB,KAAe,SACrC,SAAS,IAAI,QAAQ,IAAI,MAAM,QAAQ,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,EAAE;AAE1E,MAAM,mBACJ,KACA,CAAC,MAAM,UACP,QAEA,0BAA0B,IAAI,IAAI,SAAS,IAAI,QAAQ,IAAI,IACzD,SAAS,OACL,KAAK,SAAS,IAAI,QAAQ,KAAK,UAAU,QAAQ,IAAI,CAAC,IACpD,QAAQ,SAAS,WAAW,OAE9B,SAAS,SACP,iBACA,GACP;AAEH,MAAM,oBAAoB,QACxB,IAAI,EAAE,QAAQ,cAAc,cAAc,wBAAwB;AAEpE,MAAM,kBACJ,KACA,KACA,UACA,OACW;CACX,IAAI,OAAO,OAAO,QAAQ,UAAU;EAClC,IAAI,MAAM,MAAM,QAAQ,GAAG,GACzB,OAAO,IAAI,IACR,KAAK,UACJ,iBAAiB,GAAG,IAChB,SAAS,IAAI,QAAQ,KAAK,UAAU,KAAK,CAAC,IAC1C,SAAS,IAAI,QAAQ,KAAK,CAChC,CAAC,CACA,KAAK,IAAI,EAAE;EAGhB,IAAI,MAAM,QAAQ,GAAG,GACnB,OAAO,iBAAiB,GAAG,IACvB,SAAS,IAAI,QAAQ,KAAK,UAAU,GAAG,CAAC,IACxC,SAAS,IAAI,QAAQ,GAAG;EAG9B,IAAII,eAAa,GAAG,GAClB,OAAO,cAAc,IAAI,MAAM,KAAK,QAAQ,IAAI;EAGlD,IAAI,WAAW,KACb,OAAO,aAAaJ,yBAAuB,KAAK,GAAY,EAAE;CAElE;CAEA,OAAO,iBAAiB,GAAG,IACvB,SAAS,IAAI,QAAQ,KAAK,UAAU,GAAG,CAAC,IACxC,SAAS,IAAI,QAAQ,GAAG;AAC9B;AAEA,MAAM,sBACJ,KACA,KACA,aACW;CACX,IAAI,OAAO,OAAO,QAAQ,UAAU;EAClC,IAAII,eAAa,GAAG,GAClB,OAAO,cAAc,IAAI,MAAM,KAAK,QAAQ,IAAI;EAGlD,IAAI,WAAW,KACb,OAAO,aAAaJ,yBAAuB,KAAK,GAAY,EAAE;CAElE;CAEA,OAAO,SAAS,IAAI,QAAQ,KAAK,UAAU,GAAG,CAAC;AACjD;AA+JA,MAAaM,cAUT;CACF,KAAK;CACL;CACA;CACA,QAAQ;CACR,MAAM;CACN,MAAM;CACN;CACA;EA9KA,GAAG;EACH,QAAQ,MAAM,KAAK,OAAO,KAAK,aAC7B,UAAU,OACN,UAAU,IAAI,4BACd,GAAG,IAAI,KAAK,eAAe,OAAO,KAAK,QAAQ,GACrD;EACA,KAAK,MAAM,KAAK,OAAO,KAAK,aAC1B,UAAU,OACN,UAAU,IAAI,gCACd,GAAG,IAAI,MAAM,eAAe,OAAO,KAAK,QAAQ,GACtD;EACA,gBAAgB,MACb,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,oBAAoB,eAAe,OAAO,KAAK,QAAQ,GAClE;EACA,mBAAmB,MAChB,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,wBAAwB,eAAe,OAAO,KAAK,QAAQ,GACtE;EACA,IAAI,MAAM,KAAK,OAAO,KAAK,aACzB,MAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,SAC3B,UACA,GAAG,IAAI,MAAM,eAAe,OAAO,KAAK,UAAU,IAAI,GAC5D;EACA,OAAO,MAAM,KAAK,OAAO,KAAK,aAC5B,MAAM,QAAQ,KAAK,KAAK,CAAC,MAAM,SAC3B,SACA,OAAO,IAAI,MAAM,eAAe,OAAO,KAAK,UAAU,IAAI,GAChE;EACA,oBAAoB,OAAO,OACzB,SAEE,MACA,SAIA;GACA,MAAM,EAAE,GAAG,gBAAgB;GAC3B,MAAM,QAAS,EAAE,UAAU,CAAC;GAC5B,MAAM,KAAK,iBAAiB,CAAC,MAAM,OAAO,CAAC;GAE3C,IAAI,eAAe,EAAE,OAAO,GAC1B,eAAe,GAAG,KAAA,CAAS;GAG7B,IAAI,SAAS,MAAM;IACjB,MAAM,OAAO,QAAQ,KAAK,WAAW;IACrC,sBAAsB,GAAG,IAAI;IAG7B,MAAM,QAAQ,GAAG,SAAoB;KACnC,MAAM,OAAO,MAAM,UAAU;KAC7B,MAAM,MAAM,MAAc,GAAG,EAAE,IAAI,KAAK,YAAYD,YAAU;KAC9D,OAAO,MAAM,KAAK,GAAG,IAAI;IAC3B;IAEA,OAAO,kBAAkB,MAAM,KAAK,SAAS;GAC/C;GAEA,OAAO;EACT,GACA,EAAE,KAAK,gBAAgB,CACzB;EACA,gBAAgB,MACb,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,MAAM,WAAW,OAAO,KAAK,QAAQ,GAChD;EACA,cAAc,MACX,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,MAAM,WAAW,OAAO,KAAK,QAAQ,GAChD;EACA,SAAS,YACN,KAAK,CAAC,MAAM,QAAQ,KAAK,aACxB,aAAa,IAAI,IAAI,eAAe,KAAK,IAAI,EAAE,IAAI,mBACjD,OACA,KACA,QACF,EAAE,EACN;EACA,aAAa,YACV,KAAK,CAAC,MAAM,QAAQ,KAAK,aACxB,aAAa,IAAI,IAAI,eAAe,KAAK,IAAI,EAAE,IAAI,mBACjD,OACA,KACA,QACF,EAAE,SACN;EACA,YAAY,YACT,KAAK,CAAC,MAAM,OAAO,UAAU,KAAK,aACjC,gBAAgB,IAAI,IAAI,eAAe,KAAK,IAAI,EAAE,IAAI,mBACpD,OACA,KACA,QACF,IAAI,SAAS,QAAQ,WAAW,GAAG,EACvC;EACA,YAAY,YACT,KAAK,CAAC,OAAO,QAAQ,IAAI,IAAI,MAAM,eAAe,KAAK,IAAI,EAAE,EAChE;CA4EA;CACA;EAlDA,GAAG;EACH,KAAK,MACF,KAAK,OAAO,KAAK,aAChB,GAAG,WAAW,OAAO,KAAK,QAAQ,EAAE,SAAS,IAAI,EACrD;EACA,UAAU,MACP,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,MAAM,WAAW,OAAO,KAAK,QAAQ,GAChD;EACA,SAAS,MACN,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,MAAM,WAAW,OAAO,KAAK,QAAQ,GAChD;EACA,aAAa,MACV,KAAK,OAAO,KAAK,aAChB,GAAG,IAAI,MAAM,WAAW,OAAO,KAAK,QAAQ,GAChD;EACA,QAAQ,MAAM,KAAK,OAAO,KAAK,aAAa;GAC1C,MAAM,OAAO,yBAAyB,IAAI;GAC1C,OAAO,OAAO,UAAU,WACpB,GAAG,KAAK,KAAK,WAAW,OAAO,KAAK,QAAQ,MAC5C,OAAO,KAAK,KAAK,CAAC,CACf,KAAK,QAEH,IAAY,IAAI,CAAC,IAAI,MAAM,MAAM,MAAM,KAAK,QAAQ,CACvD,CAAC,CACA,KAAK,OAAO;EACrB,CAAC;CAuBD;AACF;ACh1BA,IAAsB,iBAAtB,cAGUE,SAAO;CAYf,YACE,QACA,aAEI,OAAO,aAAa,GACxB;EACA,MAAM,QAAQ,UAAU;EARdC,KAAAA,YAAAA,YAAU;CAStB;AACF;AAEA,IAAsB,wBAAtB,cAEU,eAA6C;CAIrD,YAAY,QAAgB,OAAgB;EAC1C,MACE,QACC,UAAU,KAAA,IACP,OAAO,UAAU,KAAK,IACtB,OAAO,aAAa,CAC1B;EARUA,KAAAA,YAAAA,YAAU;EASpB,KAAK,KAAK,WAAW;CACvB;CAEA,QAAQ;EACN,OAAO,WACL,KAAK,UACL,KAAK,KAAK,aAAa,KAAA,KAAa,IAAI,KAAK,KAAK,SAAS,EAC7D;CACF;AACF;AAGA,IAAaC,kBAAb,cAEU,sBAA8B;;;EAC3B,KAAA,WAAA;;CACX,OAAO,KAAsB,KAAmB;EAC9C,MAAM,EAAE,aAAa,KAAK;EAC1B,OAAO,WACL,MACA,KACA,KACA,WAAW,YAAY,GAAG,GAAG,iBAAiB,KAAK,MAAM,IAAI,SAAS,GACxE;CACF;AACF;AAEA,IAAaC,iBAAb,cAEUD,gBAAsB;CAC9B,YAAY,QAAgB,QAAQ,KAAK;EACvC,MAAM,QAAQ,KAAK;CACrB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,IAAI,MAA0B,KAAK,KAAK;EACxC,IAAI,QAAQ,KAAK,MAAM,KAAA;EACvB,OAAO,WACL,MACA,KACA,KACA,UAAU,OAAO,GAAG,GAAG,iBAAiB,KAAK,MAAM,IAAI,SAAS,GAClE;CACF;AACF;AAEA,MAAM,oBACJ,QAGA,KACA,QACG;CACH,MAAM,OAAO,EAAE,GAAG,OAAO,KAAK;CAC9B,IAAI,OAAO;CACX,MAAM,SAAS,KAAK,WAAW,KAAA,KAAa,KAAK,QAAQ,KAAK;CAC9D,IAAK,KAAK,WAAW,KAAA,KAAa,KAAK,QAAQ,KAAK,UAAW,QAAQ;EACrE,IAAI,KAAK,WAAW,KAAM,UAAU,KAAK,QAAQ,UAC/C,QAAQ,KAAK;EAEf,OAAO,KAAK;EACZ,IAAI,QAAQ;GACV,IAAI,KAAK,WAAW,UAClB,QAAQ,KAAK,KAAK;GAEpB,OAAO,KAAK;EACd;CACF;CACA,OAAO,WACL,QACA,KACA,KACA,GAAG,OAAO,SAAS,GAAG,KAAK,GAAG,iBAAiB,MAAM,IAAI,SAAS,GACpE;AACF;AAGA,IAAaE,eAAb,MAAaA,qBAEH,eAA6C;CAOrD,WAAW,WAAW;EACpB,OAAQ,KAAK,cAAc,IAAIA,aAAWC,sBAAoB;CAChE;CAEA,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,aAAa,CAAU;EAXnC,KAAA,WAAA;EAGCJ,KAAAA,YAAAA,YAAU;CAStB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,iBAAiB,MAAM,KAAK,GAAG;CACxC;AACF;AAEA,MAAM,cAAc,QAClB,OAAO,QAAQ,WAAW,OAAO,KAAK,IAAI,MAAM,CAAC,GAAG,KAAK,IAAI;AAG/D,IAAaK,gBAAb,cAAoEN,SAAO;CAYzE,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,OAAO,CAAU;EAX7B,KAAA,WAAA;EACCC,KAAAA,YAAAA,YAAU;EAWpB,sBAAsB,MAAM,UAAU;CACxC;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,SAAS;CAC7C;AACF;AAGA,IAAaM,gBAAb,cAAoEP,SAAO;CAYzE,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,aAAa,CAAU;EAXnC,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;CAItB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,SAAS;CAC7C;AACF;AAGA,IAAaO,eAAb,cAAmER,SAAO;CAYxE,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,aAAa,CAAU;EAXnC,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;CAItB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,QAAQ;CAC5C;AACF;AAGA,IAAaQ,eAAb,cAAmET,SAAO;CAYxE,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,aAAa,CAAU;EAXnC,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;CAItB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,QAAQ;CAC5C;AACF;AAGA,IAAaS,cAAb,cAAkEV,SAAO;CAYvE,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,aAAa,CAAU;EAXnC,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;CAItB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,OAAO;CAC3C;AACF;AAIA,IAAaU,eAAb,cAAmEX,SAAO;CAYxE,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,aAAa,CAAU;EAXnC,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;CAItB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,QAAQ;CAC5C;AACF;AAGA,IAAaW,kBAAb,cAAsEZ,SAAO;CAY3E,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,aAAa,CAAU;EAXnC,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;CAItB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,WAAW;CAC/C;AACF;AAGA,IAAaY,iBAAb,cAAqEb,SAAO;CAY1E,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,aAAa,CAAU;EAXnC,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;CAItB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,UAAU;CAC9C;AACF;AAEA,IAAaa,gBAAb,cAAoEd,SAAO;CAazE,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,OAAO,CAAU;EAZ7B,KAAA,WAAA;EASCC,KAAAA,YAAAA,YAAU;EAIpB,sBAAsB,MAAM,UAAU;CACxC;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,SAAS;CAC7C;AACF;AAEA,MAAM,aAAa,OAAO,OACxB,SAAU,OAAgB;CACxB,OAAO,UAAU,OACb,QACA,WAAY,MAAiB,QAAQ,MAAM,EAAE,CAAC,CAAC,QAAQ,OAAO,EAAE,CAAC;AACvE,GACA,EACE,cAAc,KAChB,CACF;AAGA,IAAac,eAAb,cAAmEf,SAAO;CAYxE,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,aAAa,CAAU;EAXnC,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;CAItB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,QAAQ;CAC5C;AACF;AAGA,IAAae,eAAb,cAAmEhB,SAAO;CAYxE,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,aAAa,CAAU;EAXnC,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;CAItB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,QAAQ;CAC5C;AACF;AAGA,IAAagB,kBAAb,cAAsEjB,SAAO;CAY3E,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,aAAa,CAAU;EAXnC,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;CAItB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,WAAW;CAC/C;AACF;AAGA,IAAaiB,mBAAb,cAAuElB,SAAO;CAY5E,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,aAAa,CAAU;EAXnC,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;CAItB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,YAAY;CAChD;AACF;AAKA,IAAakB,cAAb,cAAkEnB,SAAO;CAavE,YAAY,QAAgB,QAAgB;EAC1C,MAAM,QAAQ,OAAO,IAAI,MAAM,CAA8B;EAZpD,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;EAKpB,KAAK,KAAK,SAAS;CACrB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,MAAM,EAAE,WAAW,KAAK;EACxB,OAAO,WAAW,MAAM,KAAK,KAAK,OAAO,OAAO,EAAE;CACpD;CAEA,QAAQ;EACN,OAAO,WACL,KAAK,UACL,KAAK,KAAK,WAAW,KAAA,KAAa,IAAI,KAAK,KAAK,OAAO,EACzD;CACF;AACF;AAEA,IAAamB,qBAAb,cAEUpB,SAAO;CAaf,YAAY,QAAgB,QAAiB;EAC3C,MAAM,QAAQ,OAAO,IAAI,MAAM,CAA8B;EAZpD,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;EAKpB,KAAK,KAAK,SAAS;EACnB,KAAK,KAAK,QAAQ;CACpB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,MAAM,EAAE,WAAW,KAAK;EACxB,OAAO,WAAW,MAAM,KAAK,KAAK,cAAc,UAAU,GAAG,EAAE;CACjE;CAEA,QAAQ;EACN,OAAO,WACL,KAAK,UACL,KAAK,KAAK,WAAW,KAAA,KAAa,IAAI,KAAK,KAAK,OAAO,EACzD;CACF;AACF;AAKA,IAAaoB,mBAAb,cAAuErB,SAAO;CAY5E,YACE,QACA,kBAAyB,mBAAmB,GAC5C;EACA,MAAM,QAAQ,OAAO,aAAa,CAAU;EAFrC,KAAA,kBAAA;EAZE,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;CAOtB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,YAAY;CAChD;;;;;;;;;;;;;;;;;;;;;;;;;CA0BA,UAEE,GAAG,MAIkB;EACrB,MAAM,MAAM,KAAK;EAEjB,IAAI,OAAO,QAAQ,YAAY,SAAS,KACtC,OAAO,MAAM,UAAU,GAAI,IAAsB;EAGnD,MAAM,SAAyC,QAAQ;GACrD,MAAM,QAAQ,KAAK;GACnB,MAAM,SAAS,OAAO,UAAU,WAAY,KAAK,KAAkB;GAEnE,MAAM,WACJ,OAAO,UAAU,WACb,QACC,KACE;GAET,MAAM,EAAE,cAAc;GAEtB,IAAI;GACJ,IAAI,MAAM,QAAQ,MAAM,GAatB,MAAM,gBAAgB,SAAS,KAX7B,OAAO,WAAW,IACd,IAAI,YAAYqB,cAAY,OAAO,EAAE,IAAI,OAAO,GAAG,KACnD,OACG,KACE,WACC,aACE,YAAYA,cAAY,MAAM,IAAI,OACnC,OACL,CAAC,CACA,KAAK,aAAa,EAEiB;QACvC;IACL,KAAK,MAAM,OAAO,QAChB,OACG,MAAM,MAAM,SAAS,OACtB,0BAA0B,SAAS,eACjC,YAAYA,cAAY,GAAG,IAAI,IAChC,YAAa,OAAwB,KAAK;IAE/C,IAAI,KACF,OAAO;SAEP,MAAM,IAAI,MAAM,kDAAkD;GAEtE;GAEA,OAAO;EACT;EAEA,MAAM,eAAuB;GAC3B,IAAI,OAAO;GAEX,MAAM,QAAQ,KAAK;GACnB,IAAI;GACJ,IAAI,OAAO,UAAU,UAAU;IAC7B,QAAQ,IAAI,MAAM;IAClB,SAAS,KAAK;GAChB,OACE,SAAS,KAAK;GAGhB,IAAI,MAAM,QAAQ,MAAM,GACtB,QAAQ,IAAI,OAAO,KAAK,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;QAC9C;IACL,MAAM,QAAkB,CAAC;IACzB,KAAK,MAAM,OAAO,QAChB,MAAM,KACJ,GAAGC,iBAAe,KAAK,KAAK,EAAE,KAAM,OAAwB,KAAK,EACnE;IAEF,QAAQ,KAAK,MAAM,KAAK,IAAI,EAAE;GAChC;GAEA,OAAO,OAAO;EAChB;EAEA,MAAM,SAASC,gBAAc,MAAM,aAAa;GAC9C;GACA;EACF,CAAC;EACD,OAAO,KAAK,WAAW;EACvB,OAAO;CACT;AACF;AAGA,IAAaC,kBAAb,cAAsEzB,SAAO;CAY3E,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,aAAa,CAAU;EAXnC,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;CAItB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,WAAW;CAC/C;AACF;AAGA,MAAM,cAAc,IAAIyB,SAAO,mBAAc;AAG7C,IAAaC,eAAb,cAAmE3B,SAAO;CAYxE,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,KAAK,CAAU;EAX3B,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;EAIpB,KAAK,KAAK,iBAAiB;CAC7B;;;;CAKA,WAEE,MAIsB;EACtB,MAAM,SAAS,MAAM,WAAW,IAAI;EACpC,IAAI,CAAC,OAAO,KAAK,SAAS,OAAO,KAAK,UAAU;EAChD,OAAO;CACT;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,QAAQ;CAC5C;AACF;AAGA,IAAa2B,cAAb,MAAaA,oBAAqD5B,SAAO;CAavE,WAAW,WAAW;EACpB,OAAQ,KAAK,cAAc,IAAI4B,YAAUvB,sBAAoB;CAC/D;CAEA,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,aAAa,CAAU;EAhBnC,KAAA,WAAA;EAQCJ,KAAAA,YAAAA,YAAU;CAStB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,OAAO;CAC3C;AACF;AAGA,IAAa4B,iBAAb,cAEU,eAA6C;CAOrD,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,aAAa,CAAU;EANnC,KAAA,WAAA;EAGC5B,KAAAA,YAAAA,YAAU;EAIpB,KAAK,KAAK,YAAY;CACxB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,iBAAiB,MAAM,KAAK,GAAG;CACxC;AACF;ACnwBA,IAAM,eAAN,cAA2B6B,SAAO;CAEhC,UAAkB;EAChB,OAAO,KAAK;CACd;AACF;AAGA,MAAMC,SAAO,QAAgB,IAAI,aAAa,GAAG;AAkBjD,MAAM,kBAA8C,cAAuB;CACzE,MAAM,MAAM,gBAAgB;CAC5B,MAAM,SAASA,MAAI,GAAG;CACtB,MAAM,YAAa,UAAU,CAAC,CAAuB,QAAQ,MAAM;CACnE,IAAI;CAIJ,UAAU,KAAK,eAAe,GAAY,WAA6B;EACrE,IAAI,CAAC,SAAS;GACZ,MAAM,MAAM,OAAO,KAAK;GACxB,WAAW,SAAS;IAClB,IACE,KAAK,MAAM,SAAS;KAClB,OAAO,OAAO,SAAS,cAAc,KAAK;IAC5C,CAAC,GAED;IAEF,OAAO,GAAG,OAAO,KAAK,MAAM,OAAO;GACrC;EACF;EAEA,gCAEG,EAAU,GACX,cACA,OACF;CACF;CACA,UAAU,KAAK,mBAAmB;CAElC,MAAM,YAAa,UAAU,CAAC,CAAuB,QAAQ,MAAM;CACnE,UAAU,KAAK,mBAAmB;CAElC,OAAO;EACL;EACA;CACF;AACF;AAEA,MAAa,mBAAqC;CAChD,aAEkB;EAChB,OAAO,eAAe,KAAK,SAAS;CACtC;CAEA,iBAEkB;EAChB,OAAO,eAAe,KAAK,aAAa;CAC1C;AACF;ACrFA,MAAM,cAAc;AAQpB,MAAM,UAAU,EAAE,OAAO,aAAa,KAAK,UAAgC;CACzE,MAAM,sBAAM,IAAI,WAAW,EAAE;CAC7B,MAAM,OAAO,IAAI,SAAS,IAAI,MAAM;CAGpC,KAAK,QAAQ,GAAG,CAAC;CAGjB,KAAK,QAAQ,GAAG,CAAC;CAEjB,KAAK,QAAQ,GAAG,EAAE;CAElB,KAAK,UAAU,GAAG,MAAM,IAAI;CAC5B,KAAK,WAAW,GAAG,KAAK,IAAI;CAC5B,KAAK,WAAW,IAAI,KAAK,IAAI;CAE7B,OAAO,cAAc,GAAG;AAC1B;AAEA,IAAaC,gCAAb,cAEUC,SAAO;;EAaC,KAAA,SAAA;;CAEhB,OAAO,eAAe,QAAgB;EACpC,OAAO,WAAW,MAAM,MAAM,WAAW,WAAW,MAAM,MAAM;CAClE;CAEA,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,qBAAqB,CAAU;EAlB3C,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;EAWpB,sBAAsB,MAAM,KAAK;EACjC,KAAK,KAAK,SAAS;CACrB;CAEA,OAAO,KAAsB,KAAmB;EAC9C,OAAO,WAAW,MAAM,KAAK,KAAK,mBAAmB;CACvD;AACF;AAEA,MAAM,SAAS,UAAgC;CAC7C,MAAM,wBAAQ,IAAI,WAAW,EAAE;CAC/B,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK,GAC3B,MAAM,IAAI,KAAK,SAAS,MAAM,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE;CAEzD,MAAM,OAAO,IAAI,SAAS,MAAM,MAAM;CAEtC,MAAM,OAAO,KAAK,UAAU,GAAG,IAAI;CACnC,MAAM,MAAM,KAAK,WAAW,GAAG,IAAI;CACnC,MAAM,MAAM,KAAK,WAAW,IAAI,IAAI;CAEpC,OAAO,SAAS,cACZ;EAAE;EAAK;CAAI,IACX;EACE;EACA;EACA;CACF;AACN;AAEA,MAAM,iBAAiB,YAAoB,SAAS,QAAe;AAEnE,MAAM,cAAc,SAClB;CACE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC,CAAC,SAAS;AAEb,MAAM,cAAc,YAAoB,SAAS,MAAe;AAEhE,MAAM,cAAc,WAAmB,SAAS;AAEhD,MAAM,cAAc,WAAmB;CACrC,MAAM,OAAO,cAAc,MAAM;CAEjC,IAAI,IAAI;CAER,IAAI,SAAS,KAAK,SAAS,GACzB,KAAK;MAEL,KAAK,WAAW,IAAI;CAGtB,IAAI,UAAU,KAAK,WAAW,MAAM,GAAG,KAAK;CAE5C,IAAI,UAAU,KAAK,WAAW,MAAM,GAAG,KAAK;CAE5C,OAAO;AACT;AAEA,MAAM,cAAc,WAAmB;CACrC,OAAO,SAAS,IAAI,KAAM,SAAS,cAAe,SAAS,cAAgB;AAC7E;AAOA,IAAI;AACJ,SAAS,cAAc,KAAiB;CACtC,IAAI,CAAC,WAAW;EACd,YAAY,CAAC;EACb,KAAK,IAAI,IAAI,GAAG,KAAK,KAAM,EAAE,GAAG;GAC9B,MAAM,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;GAC/C,UAAU,KAAK,QAAQ;EACzB;CACF;CAEA,MAAM,YAAY,CAAC;CAEnB,KAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,EAAE,GAAG,UAAU,KAAK,UAAU,IAAI,GAAG;CAErE,OAAO,UAAU,KAAK,EAAE;AAC1B;ACxCA,MAAaC,qBACX,WACqC;CACrC,OAAO;EACL;EACA,MAAM,OAAO;EACb,OAAO,OAAO;EAEd,KAAK,MAAc;GACjB,uBAAqB,IAAI;GACzB,OAAO;EACT;EAEA,KAAK;EAEL,UAAU,OAAO;EACjB,SAAS,OAAO;EAChB,QAAQ,OAAO;EACf,SAAS,OAAO;EAChB,SAAS,OAAO;EAChB,MAAM,OAAO;EACb,iBAAiB,OAAO;EACxB,SAAS,SAAS;GAChB,OAAQ,OAAO,QAAQ,CAAC,CAAiC,SACvD,OACF;EACF;EACA,aAAa,OAAO;EACpB,QAAQ,OAAO;EACf,WAAW,OAAO;EAClB,OAAO,OAAO;EACd,SAAS,OAAO;EAChB,MAAM,OAAO;EACb,QAAQ,OAAO;EACf,QAAQ,OAAO;EACf,QAAQ;GACN,OAAO,IAAIC,cAA0B,MAAM;EAC7C;EACA,MAAM,OAAO;EACb,eAAe,OAAO;EACtB,WAAW,OAAO;EAClB,KAAK,WAAW;GACd,OAAO,IAAIC,aAAyB,QAAQ,SAAS;EACvD;EACA,SAAS,QAAQ,WAAW;GAC1B,OAAO,IAAIC,iBACT,QACA,QACA,WACA,OAAO,aACT;EACF;EACA,UAAU;GACR,OAAO,IAAIC,gBAA4B,MAAM;EAC/C;EACA,QAAQ;GACN,OAAO,IAAIC,cAA0B,MAAM;EAC7C;EACA,OAAO;GACL,OAAO,IAAIC,aAAyB,MAAM;EAC5C;EACA,OAAO;GACL,OAAO,IAAIC,aAAyB,MAAM;EAC5C;EACA,MAAM;GACJ,OAAO,IAAIC,YAAwB,MAAM;EAC3C;EACA,OAAO;GACL,OAAO,IAAIC,aAAyB,MAAM;EAC5C;EACA,UAAU;GACR,OAAO,IAAIC,gBAA4B,MAAM;EAC/C;EACA,SAAS;GACP,OAAO,IAAIC,eAA2B,MAAM;EAC9C;EACA,OAAO;GACL,OAAO,IAAIC,aAAyB,MAAM;EAC5C;EACA,OAAO;GACL,OAAO,IAAIC,aAAyB,MAAM;EAC5C;EACA,UAAU;GACR,OAAO,IAAIC,gBAA4B,MAAM;EAC/C;EACA,WAAW;GACT,OAAO,IAAIC,iBAA6B,MAAM;EAChD;EACA,IAAI,QAAQ;GACV,OAAO,IAAIC,YAAwB,QAAQ,MAAM;EACnD;EACA,WAAW,QAAQ;GACjB,OAAO,IAAIC,mBAA+B,QAAQ,MAAM;EAC1D;EACA,WAAW;GACT,OAAO,IAAIC,iBAA6B,MAAM;EAChD;EACA,UAAU;GACR,OAAO,IAAIC,gBAA4B,MAAM;EAC/C;EACA,OAAO;GACL,OAAO,IAAIC,aAAyB,MAAM;EAC5C;EACA,MAAM;GACJ,OAAO,IAAIC,YAAwB,MAAM;EAC3C;EACA,MAAM,OAAO;EACb,UAAU,OAAO;EACjB,KAAK,UAAU;GACb,OAAO,IAAIC,mBAA+B,QAAQ,QAAQ;EAC5D;EACA,OAAO,UAAU;GACf,OAAO,IAAIC,eAA2B,QAAQ,QAAQ;EACxD;EAEA,WAAW,EACT,QAAQ;GACN,OAAO,IAAIC,8BAA4B,MAAM;EAC/C,EACF;EAEA,GAAG;CACL;AACF;AAEA,SAAO,UAAU,cAAcxB;ACrO/B,IAAsByB,kBAAtB,cAGUC,SAAO;CAYf,YACE,QACA,cAA2B,OAAO,MAAM,GACxC;EACA,MAAM,QAAQ,WAAW;EAdhB,KAAA,WAAA;EAQCC,KAAAA,YAAAA,YAAU;EAQpB,KAAK,KAAK,iBAAiB,KAAK,KAAK,cAAc,KAAK,KAAK,UAAU;CACzE;CAEA,SAAgB;EACd,MAAM,IAAI,MAAM,8CAA8C;CAChE;AAWF;ACzCA,IAAaC,kBAAb,MAAaA,wBAEHC,gBAAsB;;EACZ,KAAA,WAAA,IAAID,gBAAcE,sBAAoB;;CAIxD,YAAY,QAAgB;EAC1B,MAAM,QAAQ,OAAO,QAAQ,CAAU;EAH5B,KAAA,aAAA;EAKX,KAAK,KAAK,iBACR,KAAK,KAAK,cACV,KAAK,KAAK,UACR,KAAA;CACN;AACF;AAEA,SAAO,UAAU,SAAS,EAAE,OAAOF,gBAAc,SAAS;ACnB1D,MAAa,WAAW,IAAI,MAAMG,eAAa,EAC7C,MAAM;CACJ,OAAOC,gBAAc;AACvB,EACF,CAAC;;;;;;;;AC6WD,MAAaC,6BACX,GACA,KACA,UACM;CACN,gCACG,EAA+B,GAChC,KACA,KACF;CACA,OAAO;AACT;AAEA,MAAaC,wBAAsB,UAAgC;CACjE,OAAO,EAAE,GAAG,MAAM;AACpB;;;;AC7XA,MAAaC,YAAU,MAAuB,EAAuB,MAAM;;AC8B3E,MAAaC,gBAAc,MAA8C;CACvE,OAAO,EAAE,EAAE,MAAO,EAAE;AACtB;AAUA,MAAa,sBAAsB,GAAqB,OACtD,EAAE,UAAUC,eAAa,EAAE,SAAS,EAAE,IAAI;AAE5C,MAAa,mBACX,GACA,IACA,SACY;CACZ,OAAO,EAAE,EAAE,UAAU,QAAQ;AAC/B;AAEA,MAAa,wBACX,GACA,OACW;CACX,OAAO,EAAE,UAAU,OAAO;AAC5B;AAEA,MAAa,yBACX,MAC6B;CAC7B,OAAO,EAAE;AACX;;AAIA,MAAa,eACX,MACA,OAC8B;CAC9B,MAAM,EAAE,MAAM;CACd,EAAE,KAAK;CACP,EAAE,UAAU;EACV,GAAG,EAAE;GACJ,KAAK,mBAAmB,GAAG,EAAE;CAChC;CAEA,OAAO;AACT;AAEA,MAAa,kBAAkB,GAAU,MAAc,OAAqB;CAC1E,EAAE,EAAE,UAAU;EAAE,GAAG,EAAE,EAAE;GAAU,KAAK;CAAK;AAC7C;AAEA,MAAa,uBAAuB,MAAmB;CACrD,EAAE,EAAE,eAAe,EAAE,EAAE;AACzB;;;;;AAMA,MAAa,yBACX,OACA,iBACS;CACT,MAAM,UAAU,MAAM,EAAE,KACpB,EAAE,GAAG,MAAM,EAAE,QAAQ,IACrB;EAAE,GAAG,MAAM,EAAE;GAAU,MAAM,QAAkB,MAAM;CAAgB;CAEzE,MAAM,aAAa,aAAa;CAChC,KAAK,MAAM,MAAM,YACf,QAAQ,MAAMA,eAAa,SAAS,EAAE;CAExC,aAAa,KAAK,QAAQ,aAAa;CACvC,aAAa,UAAU;AACzB;AAEA,MAAa,0BACX,WACA,SACA,QACW;CACX,MAAM,OAAO,qBAAqB,UAAU,GAAG,GAAG;CAClD,IAAI,SAAS,KACX,eAAe,SAAS,MAAM,GAAG;CAEnC,OAAO;AACT;;;;;ACnHA,MAAa,wBACX,GACA,SACuB;CACvB,IAAI,MAAM,EAAE,SAAS;CACrB,IAAI,CAAC,KAAK;EACR,EAAE,SAAS,qBAAqB,sBAAM,IAAI,IAAoB;EAE9D,MAAM,EAAE,UAAU;EAClB,KAAK,MAAM,OAAO,EAAE,OAAO;GACzB,MAAM,SAAS,MAAM;GACrB,IAAI,IAAK,OAAiC,KAAK,QAAQ,KAAK,GAAG;EACjE;CACF;CAEA,OAAO,IAAI,IAAI,IAAI;AACrB;ACvBA,IAAsB,iBAAtB,cAA6C,MAAM,CAAC;;;;;;;;;AAUpD,IAAa,gBAAb,cAAmC,eAAe;CAIhD;CAEA,YAAY,OAAgB,UAAU,uBAAuB;EAC3D,MAAM,OAAO;EACb,KAAKC,SAAS;CAChB;CAEA,WAAW;EACT,OAAO,KAAKA;CACd;AACF;AAEA,IAAa,yBAAb,cAA4C,MAAM;CAIhD;CAEA,YACE,OACA,SACA,MACA;EACA,MAAM,OAAO;EAFN,KAAA,OAAA;EAGP,KAAKA,SAAS;CAChB;CAEA,WAAW;EACT,OAAO,KAAKA;CACd;AACF;AA+BA,IAAsB,aAAtB,cAEU,uBAAuB;CAsB/B,IAAI,WAAW;EACb,OAAO,KAAK,SAAS;CACvB;CAEA;CACA,IAAI,UAAU;EACZ,IAAI,KAAKC,eAAe,OAAO,KAAKA;EAEpC,MAAM,UAA8C,CAAC;EAErD,IAAI,KAAK,QAAQ;GACf,MAAM,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC,GAAG;GAC9C,IAAI,MACF,KAAK,MAAM,IAAI,CAAC,CAAC,SAAS,SAAS;IACjC,MAAM,SACJ,KAAK,WAAW,IAAG,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI;IAG7C,MAAM,MACJ,qBAAqB,KAAK,SAAS,GAAG,MAAgB,KAAK;IAC7D,QAAQ,OAA2B;GACrC,CAAC;EAEL;EAEA,OAAQ,KAAKA,gBAAgB;CAC/B;AACF;AAEA,IAAa,sBAAb,cAAyC,uBAAuB;CAC9D,YAAY,OAAgB,SAAkB;EAC5C,MAAM,OAAO,OAAO;CACtB;AACF;AAEA,IAAa,qBAAb,cAAwC,uBAAuB;CAC7D,YAAY,OAAgB,OAAc;EACxC,MAAM,OAAO,mBAAmB,KAAK,UAAU,KAAK,EAAE,UAAU;CAClE;AACF;AAgBA,IAAa,iCAAb,cAAoD,uBAAuB;CACzE,YAAY,OAAgB;EAC1B,MAAM,OAAO,iCAAiC;CAChD;AACF;ACnEA,MAAa,2CACX,UACgC;CAChC,OAAO,OAAO,QAAQ,OAAO,YAAY,QAAQ,KAAA;AACnD;AC/BA,IAAI;AACJ,MAAa,2BAA2B,WAAoC;CAC1E,uBAAuB,OAAO,WAAW,aAAa,OAAO,IAAI;AACnE;AAEA,MAAaC,oBAAkB,UAC7B,MAAM,EAAE,UAAU;AC6DpB,MAAa,mBACX,KACA,OACA,OAOA,MACA,aACgB;CAChB,IAAI;CACJ,IAAI;CAEJ,MAAM,gBAAgB,OAAO;CAG7B,IAAI,OAAO,MAAM;EACf,MAAM,EAAE,eAAe;EACvB,IAAI,aAAa;EAEjB,SAAS,IAAI,uBAAuB,KAAK,KAAK,CAAC,EAAE,KAAK,qBACpD,OACA,KAAK,CACP,EAAE;EAEF,KAAK,GAAG,KAAK,IAAI,IAAI,KAAK,EAAE,KAAK,KAAK,EAAE,iBAAiB;EAEzD,IAAI,aAAa;CACnB,OAAO,IAAI,OAAO,MAAM;EACtB,MAAM,EAAE,GAAG,GAAG,MAAM;EAMpB,MAAM,YAAY,EAAE,EAAE,YAAY,yBAAyB,CAAC;EAC5D,SAAS,oBAAoBC,iBAAe,CAAC,GAAG,SAAS;EAEzD,MAAM,KAAK,EAAE,EAAE;EACf,MAAM,SAAS,IAAI,GAAG;EACtB,MAAM,QAAQ,2BAA2B,GAAG,EAAE;EAC9C,IAAI,OACF,UAAU,IAAI;EAGhB,IAAI,KAAK,GACP,SAAS,aACP,KACA,GACA,IAAI,UAAU,IACd,CAAC,eACD,QACA,IACF;OAEA,KAAK,WAAW,KAAK,GAAG,EAAE,GAAG,MAAM;CAEvC,OAAO,IAAI,OAAO,MAAM;EACtB,MAAM,EAAE,MAAM;EACd,SAAS,IAAI,EAAE;EAEf,IAAI,OAAO,MAAM;GACf,MAAM,EAAE,GAAG,MAAM;GAKjB,IAAI,GACF,SAAS,aAAa,KAAK,GAAG,QAAQ,CAAC,eAAe,MAAM;QAE5D,KAAK,WAAW,KAAK,GAAuB,EAAE,GAAG,MAAM;EAE3D,OACE,KAAK,YACH,KAAK,GACL,KACA,OACA,QACC,MAAM,aAA8B,IACrC,QACF;CAEJ,OAAO,IAAI,OAAO,MAAM;EACtB,MAAM,QAAQ,KAAK;EACnB,MAAM,EAAE,WAAW;EAEnB,SAAS,WAAW,KAAK,EACtB,KAAK,MAAM;GACV,OACE,MACA,OAAO,QAAQ,KAAK,CAAC,CAClB,KAAK,CAAC,KAAK,YAAY;IACtB,MAAM,QAAQ,EAAE;IAChB,OACE,SACE,QACA,UAAU,QAAQ,UAAU,KAAA,IACxB,OACA,OAAO,KAAK,SACV,OAAO,KAAK,OAAO,KAAK,IACxB,KACR,IACA,OACC,OAAkB;GAEvB,CAAC,CAAC,CACD,KAAK,IAAI,IACZ;EAEJ,CAAC,CAAC,CACD,KAAK,IAAI,EAAE,KAAK,KAAK,EAAE,IAAI,OAAO,QAAQ,KAAK,CAAC,CAChD,KAAK,CAAC,KAAK,YAAY,IAAI,OAAO,KAAK,QAAQ,IAAI,EAAE,CAAC,CACtD,KAAK,IAAI,EAAE;CAChB,OAAO;EACL,MAAM,EAAE,GAAG,MAAM;EAIjB,IAAI;EAEJ,IAAI,OAAO,MAAM;GACf,MAAM,EAAE,MAAM;GAMd,MAAM,MAAM,kBAAkB,KAAK,GAAG,KAAK,CAAC,eAAe,GAAG,CAAC;GAC/D,SAAS,IAAI;GACb,SAAS,IAAI;GAEb,IAAI,CAAC,KAAK,eACR,KAAK,WAAW,KAAK,GAAG,EAAE,GAAG,IAAIC,aAAW,CAAC,EAAE,EAAE;EAErD,OAAO;GACL,MAAM,MAAM,kBAAkB,KAAK,GAAG,OAAO,CAAC;GAC9C,SAAS,IAAI;GACb,SAAS,IAAI;GAEb,IAAI,OAAO,MACT,KAAK,YAAY,KAAK,GAAG,KAAK,OAAO,QAAQ,EAAE,OAAO,QAAQ;EAElE;EAGA,IAAI,CAAC,GAAG;GACN,MAAM,WAAW,WACf,KACA,GACA;IACE,GAAG,EAAE;IACL,cAAc;KACZ,GAAG,MAAM;KACT,GAAG,EAAE,EAAE;MACL,MAAM,EAAE,MAAM,MAAM,QAAmB,MAAM,EAAE;IACnD;GACF,GACA,MACF;GACA,IAAI,UACF,IAAI,IAAI,MAAM,QAAQ;QACjB,KAAK;EAEd;CACF;CAEA,OAAO;EAAE;EAAQ;CAAG;AACtB;AAEA,MAAM,qBACJ,KACA,OACA,SACA,cACA,WACG;CACH,MAAM,YAAY,MAAM;CAExB,MAAM,aACJ,OAAO,UAAU,SAAS,WAAW,IAAI,UAAU,KAAK,KAAK,KAAA;CAE/D,IAAI,SAAS,cAAc,IAAI,MAAM,MAAM;CAE3C,MAAM,MAAM,UAAU,KAAK,IAAI,UAAU,GAAG,KAAK,KAAA;CACjD,MAAM,aAAa,2BAA2B,OAAO,UAAU,EAAE;CAEjE,IAAI,cACF,OAAO;EACL,QAAQ,aAAa,KAAK,OAAO,QAAQ,SAAS,KAAK,MAAM;EAC7D,QAAQ,OAAO;CACjB;MACK;EACL,IAAI,SAAS,cAAcC,uBAAqB,KAAK;EACrD,IAAI,YAAY;GACd,SAAS;GACT,UAAU,IAAI;EAChB;EACA,OAAO;GAAE;GAAQ;EAAO;CAC1B;AACF;AAEA,MAAM,gBACJ,KACA,IACA,SACA,SACA,SACA,WACG;CACH,IAAI,CAAC,GAAG,EAAE,UAAU,GAAG,EAAE,kBAAkB;EACzC,IAAI,CAAC,QAAQ,KAAK,GAAG,MAAM;EAC3B,GAAG,EAAE,SAAS,CAAC,IAAIC,SAAO,GAAG,QAAQ,GAAG,CAAC;CAC3C;CAEA,MAAM,MAAM,IAAI,uBAAuB,KAAK,EAAE,EAAE,IAAI,WAAW;CAC/D,OAAO,UAAU,WAAW,QAAQ;AACtC;AAEA,MAAM,eACJ,MACA,KACA,OAKA,QACA,WACA,aACuB;CACvB,OAAO,KAAK,SACR,KAAK,WAAW,IACd,yBACE,KACA,OACA,KAAK,IACL,UACA,QACA,SACF,IACA,+BACE,KACA,OACA,QACA,UACA,MACA,SACF,IACF,KAAA;AACN;AAEA,MAAM,kCACJ,KACA,OAKA,QACA,UACA,MACA,cACW;CACX,MAAM,CAAC,YAAY,iBAAiB,oBAAoB;CAExD,MAAM,KAAK,mBAAmB,kBAAkB;CAChD,MAAM,cAAc,mBAAmB,mBAAmB;CAE1D,OAAO,GAAG,iBACR,KACA,OACA,WACA,YACA,MACF,EAAE,GAAG,GAAG,GAAG,iBAAiB,KAAK,OAAO,MAAM,aAAa,aAAa,QAAQ;AAClF;AAEA,MAAM,4BACJ,KACA,OAKA,MACA,UACA,QACA,cACW;CACX,IAAI,SAAS,MACX,OAAO;MACF,IAAIC,eAAa,IAAI,GAC1B,OAAO,KAAK,MAAM,KAAK,QAAQ;MAC1B;EACL,MAAM,QAAkB,CAAC;EACzB,MAAM,QAAQ,MAAM;EAEpB,KAAK,MAAM,OAAO,MAAM;GACtB,MAAM,QAAQ,KAAK;GAEnB,MAAM,KACJ,GAAG,qBACD,KACA,OACA,WACA,KACA,MACF,EAAE,KAAK,iBAAiB,KAAK,OAAO,OAAO,OAAO,QAAQ,GAC5D;EACF;EAEA,OAAO,MAAM,KAAK,IAAI;CACxB;AACF;AAEA,MAAa,eACX,KACA,OACA,OAGA,aACG;CACH,MAAM,UAAU,MAAM,KAAK,SAAS,oBAAI,IAAI,IAAY,IAAI;CAE5D,KAAK,MAAM,QAAQ,MAAM,MAAM;EAC7B,MAAM,EAAE,QAAQ,KAAK,WAAW,gBAC9B,KACA,OACA,OACA,KAAK,MACL,QACF;EAEA,MAAM,MAAM,GAAG,KAAK,KAAK,GAAG,OAAO,MAAM;EAEzC,IAAI,SAAS;GACX,IAAI,QAAQ,IAAI,GAAG,GAAG;GACtB,QAAQ,IAAI,GAAG;EACjB;EAEA,IAAI,IAAI,KAAK,GAAG;CAClB;AACF;;;;;ACvdA,IAAa,uBAAb,cAEUC,aAAc;CAItB,YACE,OACA,MACA,OACA;EACA,MAAM;EAJC,KAAA,QAAA;EACA,KAAA,OAAA;EAIP,KAAK,SAAS,EAAS,MAAW;EAClC,KAAK,IAAI,MAAM;EACf,IAAI,OAAO,OAAO,OAAO,MAAM,MAAM,SAAS;CAChD;CAGA,QAAQ,KAAe,UAA2B;EAChD,MAAM,IAAI,KAAK;EACf,OAAO,OAAO,KAAK,SAAS,WACxB,KAAK,SAAS,MACZ,aAAa,GAAG,UAAU,KAAA,GAAW,GAAG,CAAC,CAAC,KAAK,IAAI,IACnD,YACE,KACA,GACA,EAAE,aACF,KAAK,MACL,UACA,MACA,KAAA,GACA,KAAA,GACA,KAAA,GACA,IACF,IACF,KAAK,KAAK,MAAM,KAAK,QAAQ;CACnC;AACF;;;;;;;;;;ACfA,MAAa,2BACX,GACA,KACA,UACM;CACN,MAAM,MAAO,EAAE,EAA+B;CAC9C,EAAG,EAA+B,OAAO,MAAM,CAAC,GAAG,KAAK,GAAG,KAAK,IAAI;CACpE,OAAO;AACT;AAgDA,MAAa,mBAAmB,UAAuB;CACrD,IAAI,MAAM,SAAS,UACjB,MAAM,IAAI,+BAA+B,KAAK;AAElD;AAEA,MAAa,yBACX,OACA,QACA,QACG;CACH,IAAI,OAAO,KAAK,eAAe,OAAO,KAAK,UACzC,MAAM,IAAI,uBACR,OACA,sCACA,EAAE,QAAQ,IAAI,CAChB;AAEJ;AA2CA,MAAa,aACX,MAC0B;CAC1B,EAA6B,EAAE,aAAa;CAC5C,EAA6B,EAAE,MAAM;CACrC,OAAO;AACT;AAsDA,MAAa,sBACX,GACA,QACA,OACA,OACW;CACX,MAAM,QAAQ,OAAO,MAAM,GAAG,KAAK;CACnC,OAAO,MAAM,UAAU,MAAM,gBAAgB,GAAY,OAAO,EAAY,IACvE,KACD;AACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzGA,IAAa,mBAAb,cAAsC,eAAe;CACnD,YACE,QACA,aACA;EACA,MAAM,gCAAgC;EAH/B,KAAA,SAAA;EACA,KAAA,cAAA;CAGT;AACF;AAMA,MAAa,uBAAuB,OAClC,QACA,UACA,cACA,2BACG;CACH,MAAM,cAAc,MAAM,QAAQ,WAAW,QAAQ;CACrD,IAAI,YAAY,MAAM,WAAW,OAAO,WAAW,UAAU,GAAG;EAC9D,MAAM,YAAY,aAAa;EAE/B,KAAK,MAAM,CAAC,GAAG,MAAM,YAAY,QAAQ,GACvC,EAA8B,OAAO,UAAU;EAGjD,MAAM,MAAM,IAAI,iBAAiB,QAAQ,WAAW;EACpD,IAAI,CAAC,wBAAwB,MAAM;EAEnC,KAAK,MAAM,MAAM,wBACf,IAAI;GACF,GAAG,GAAG;EACR,QAAQ,CAAC;CAEb;AACF;;;;AAKA,MAAa,uBACX,QAEA,KAAK,kBAAkB,KAAA,MAEtB,CAAC,IAAI,wBAAwB,IAAI,iBAAiB,IAAI;ACfzD,MAAa,4BACX,SACA,YACA,aACA,SACA,QACG;CACH,IAAI,SACG;OAAA,MAAM,EAAE,UAAU,SACrB,KAAK,MAAM,UAAU,MACnB,IAAI,QACF,KAAK,MAAM,KAAK,SACd,OAAO,KAAK,OAAO,QAAQ;CAAA;CAOrC,IAAI,aAAa,MACV;OAAA,MAAM,EAAE,UAAU,SACrB,KAAK,MAAM,UAAU,MACnB,IAAI,QACF,KAAK,MAAM,OAAO,aAChB,OAAO,OAAO;CAAA;CAOxB,IAAI,eAAe,SAAS,eAAe,cACzC,KAAK,MAAM,SAAS,SAClB,MAAM,OAAO,MAAM,KAAK;MAErB,IAAI,eAAe,SACxB,KAAK,MAAM,EAAE,UAAU,SACrB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAC/B,KAAK,KAAK,KAAK,EAAE,CAAC;MAGjB,IAAI,eAAe,WAAW,eAAe,gBAClD,KAAK,MAAM,QAAQ,SACjB,KAAK,OAAO,KAAK,OAAO,KAAK,KAAK,EAAE,GAAG;AAG7C;;;;;;;;;;ACpKA,MAAa,mBACX,WACA,YACA,KACA,WACY;CACZ,KAAK,MAAM,MAAM,KACf,IAAI,SAAS,IACP;MAAA,CAAC,cAAc,eAAe,SAAS,eAAe,SACxD,SAAU,OAAqB,IAAI,GAAG,KAAK,GAAG,OAAO;OAChD,IAAI,WAAW,KAAA,GACpB,SACE,WAAW,OAAO,OAAO,GAAG,IAAI,KAAK,GAAG,SAAS,QAAQ,GAAG,MAAM;CAAA,OAGtE,SAAS,GAAG,QAAQ,SAAS;CAGjC,OAAO;AACT;AAEA,MAAa,wBACX,GACA,YACG;CACH,IAAI,EAAE,WACJ,KAAK,MAAM,QAAQ,SACjB,KAAK,OAAO,KAAK,OAAO,gBACtB,GACA,EAAE,YACF,EAAE,WACF,KAAK,IACP;AAGN;ACuHA,MAAa,yBAAyB,OAAkB,WAAoB;CAC1E,IAAI;CAEJ,KAAK,MAAM,OAAO,MAAM,mBAAmB;EACzC,MAAM,WAAW,MAAM,kBAAkB;EACzC,IAAI,SAAS,SAAS,OACpB,KAAK,MAAM,UAAU,QACnB,OAAO,OAAO,SAAS,GAAG,MAAM;OAE7B;GACL,MAAM,MAAM,SAAS,GAAG,MAAM;GAC9B,IAAI,MAAM,QAAQ,GAAG,GACnB,kBAAkB,KAAK,QAAQ,GAAG;QAElC,CAAC,aAAa,CAAC,EAAA,CAAG,KACf,IAA2B,MAAM,QAChC,kBAAkB,KAAK,QAAQ,GAAG,CACpC,CACF;EAEJ;CACF;CAEA,IAAI,CAAC,UAAU;CACf,OAAO,QAAQ,IAAI,QAAQ;AAC7B;AAEA,MAAa,0BACX,OACA,SACA,oBACA,YACA,aACA,SACA,QACG;CACH,IAAI;CAEJ,MAAM,aACJ,uBAAuB,WAAW,uBAAuB;CAE3D,KAAK,MAAM,eAAe,MAAM,mBAAmB;EACjD,MAAM,WAAW,aAAa,MAAM;EAEpC,MAAM,WAAW,MAAM,kBAAkB;EACzC,IAAI,SAAS,SAAS,OACf;QAAA,MAAM,EAAE,UAAU,SACrB,KAAK,MAAM,UAAU,MACnB,IAAI,QACF,OAAO,YAAY,SAAS,GAAG,MAAM;EAAA,OAK3C,KAAK,MAAM,EAAE,UAAU,SAAS;GAC9B,IAAI;GACJ,IAAI;GACJ,IAAI,CAAC,cAAc,eAAe,OAChC,UAAU;QACL;IACL,UAAU,CAAC;IACX,yBAAS,IAAI,IAAY;IACzB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAC/B,IAAI,KAAK,IACP,QAAQ,KAAK,KAAK,EAAE;SAEpB,OAAO,IAAI,CAAC;GAGlB;GAEA,MAAM,MAAM,SAAS,GAAG,OAAO;GAC/B,IAAI,MAAM,QAAQ,GAAG,GACnB,kBAAkB,UAAU,MAAM,KAAK,MAAM;QAE7C,CAAC,aAAa,CAAC,EAAA,CAAG,KACf,IAA2B,MAAM,QAChC,kBAAkB,UAAU,MAAM,KAAK,MAAM,CAC/C,CACF;EAEJ;CAEJ;CAEA,IAAI,CAAC,UAAU;CAEf,OAAO,QAAQ,IAAI,QAAQ,CAAC,CAAC,WAAW;EACtC,yBACE,SACA,oBACA,aACA,SACA,GACF;EAEA,qBAAqB,OAAO,OAAO;CACrC,CAAC;AACH;AAEA,MAAM,qBACJ,KACA,QACA,KACA,WACG;CACH,MAAM,MAAO,OAAqB;CAClC,MAAM,SAAS,IAAI,UAAU,QAAQ,QAAQ;CAC7C,IAAI,QAAQ,QACV,MAAM,IAAI,MACR,wDAAwD,IAAI,aAAa,IAAI,aAAa,OAAO,EACnG;CAGF,IAAI,QACG;OAAA,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,KAAK,KAC9B,IAAI,CAAC,OAAO,IAAI,CAAC,GACf,OAA4B,EAAE,CAAC,OAAO,IAAI;CAAA,OAI9C,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KACvB,OAA4B,EAAE,CAAC,OAAO,IAAI;AAGhD;ACu2BA,MAAaC,wBAAsB,QACjC,WAAW,MAAM,IAAI,QAAS,IAA0B;ACvpC1D,MAAaC,oBAAkB,MAAa;CAC1C,OAAQ,EAAE,SAAS,gBAAgB,mBAAmB,CAAC;AACzD;AAEA,MAAa,sBAAsB,GAAU,YAAoB;CAC/D,MAAM,cAAcA,iBAAe,CAAC;CACpC,IAAI,CAAC,YAAY,QACf,MAAM,IAAI,uBAAuB,GAAG,OAAO;CAE7C,OAAO;AACT;AAEA,MAAM,sBAAsB,MAAuB;CACjD,MAAM,cAAc,CAAC;CACrB,MAAM,EAAE,UAAU;CAClB,KAAK,MAAM,OAAO,OAChB,IAAK,MAAuB,IAAI,CAAC,KAAK,YACpC,YAAY,KAAK,GAAG;CAIxB,MAAM,OAAO,EAAE,SAAS,UAAU;CAClC,IAAI,MACF,YAAY,KAAK,GAAG,KAAK,OAAO;CAGlC,OAAO;AACT;ACJA,MAAa,YAAY,GAAU,UAA8B;CAC/D,IAAI,EAAE,EAAE,QAAQ;EACd,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,OAAO;EAC7B,OAAO,EAAE,EAAE,OAAO;EAClB,KAAK,MAAM,KAAK,EAAE,EAAE,QAClB,OAAO;EAET,OAAO,EAAE,EAAE;CACb;CAEA,OAAO;AACT;ACvBA,MAAa,yDACX,QACoD;CACpD,OAAO,IAAI,qCAAqC;AAClD;AAEA,MAAa,kEACX,QACoD;CACpD,OAAO,IAAI,qCAAqC;AAClD;AAEA,MAAa,sCACX,KACA,QACA,gBACA,YAEA,IAAI,qCAAqC,QACrC,cACE,IAAI,qCACJ,QACA,gBACA,OACF,IACA,KAAA;AAEN,MAAa,gBAAgB,OAC3B,OACA,QACA,gBACA,YACkB;CAClB,MAAM,IAAI,MAAM;CAEhB,MAAM,cAAc,mBAClB,GACA,8DACF;CACA,MAAM,cAAc,SAAS,GAAG,YAAY;CAG5C,YAAY,EAAE,OAAO,KAAA;CAGrB,YAAY,EAAE,aAAa,KAAA;CAE3B,YAAY,EAAE,OAAO,KAAA;CACrB,YAAY,EAAE,gBAAgB,KAAA;CAC9B,YAAY,EAAE,iBAAiB,KAAA;CAE/B,MAAM,sBAAqC,CAAC;CAC5C,KAAK,MAAM,QAAQ,aACjB,oBAAoB,QAAQ,EAC1B,IAAK,OAA2B,KAAK,QAAQ,IAAI,KAAK,EACxD;CAEF,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAA,CAAG,KAAK,mBAAmB;CAEnD,MAAM,kBAAkB,MAAM;CAE9B,MAAM,WAA0B,EAAE,GAAG,gBAAgB;CAErD,MAAM,SAAuB,CAAC,EAAE,SAAS,CAAC;CAE1C,MAAM,qBAAqB,YAAY,KAAK,QAAQ;EAClD,IAAI,OAAO,UAAU;GACnB,MAAM,KAAKC,eAAa,UAAU,GAAG;GACrC,SAAS,MAAM;GACf,OAAO;EACT,OAAO;GACL,OAAO,KAAK,GAAG;GACf,OAAO;EACT;CACF,CAAC;CAED,YAAY,EAAE,SAAS;CAEvB,MAAM,kBAAmB,MAAM,iBAAiB,KAC9C,aACA,KAAA,GACA,OAAO,QAAQ;EACb,MAAM,gBAAgB,iBAAiB,SAAS,GAAG;EACnD,MAAM;CACR,GACA,cACF;CAEA,KAAK,MAAM,OAAO,QAA2B;EAC3C,MAAM,cAAc,gBAAgB,MAAM,gBAAgB;GACxD,OAAO,CAAC,YAAY,MACjB,KAAK,MAAM,YAAY,mBAAmB,QAAQ,IAAI,IACzD;EACF,CAAC;EACD,IAAI,aACF,OAAO,OAAO,KAAK,WAAW;CAElC;CAIA,IAAI,SACG;OAAA,MAAM,OAAO,iBAChB,IAAI,OAAO,SACT,OAAO,QAAQ;CAAA;AAIvB;ACPA,MAAa,0BAET;CACF,WAAW;CACX,KAAK;CACL,MAAM;CACN,OAAO;CACP,KAAK;CACL,YAAY;CACZ,OAAO;CACP,cAAc;CACd,MAAM;AACR;AAeA,IAAa,OAAb,MAA2C;CACzC,MAGE,IACA;EACA,MAAM,IAAIC,SAAO,IAAwB;EACzC,EAAE,EAAE,QAAQ;EACZ,OAAO,EAAE,KAAK,KAAA,GAAW,EAAE;CAC7B;CAEA,iBAAiB,IAAqC;EACpD,MAAM,IAAIA,SAAO,IAAwB;EACzC,EAAE,EAAE,QAAQ;EACZ,OAAO,EAAE,KAAK,KAAA,IAAY,QAAQ;GAChC,IAAI,eAAe,cAAc,IAAI,UACnC,OAAO,GAAG,GAAG;QAEb,MAAM;EAEV,CAAC;CACH;AACF;AAIA,IAAI,aAAoB,KAAA;AAGxB,MAAa,UAAU,WAID;CACpB,6BAAa,IAAI,MAAM;CACvB,OAAO;AACT;AAEA,OAAO,eAAe,KAAK,WAAW,QAAQ;CAC5C,cAAc;CACd,KAAK;CACL,IAAI,OAAO;EACT,OAAO,eAAe,MAAM,QAAQ,EAClC,MACF,CAAC;CACH;AACF,CAAC;AAED,SAAgB,iBAEd,SACA,QACA,iBACkB;CAClB,MAAM,EAAE,MAAM;CAEd,MAAM,cAAc,EAAE;CAEtB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI,EAAE,MACA;MAAA,EAAE,SAAS,UAAU;GACvB,oBAAoB,EAAE;GACtB,aAAa,EAAE;GACf,iBAAiB,EAAE;GACnB,mBAAmB,EAAE;GACrB,uBAAuB,EAAE;EAC3B,OAAO,IAAI,EAAE,SAAS,UAAU;GAC9B,oBAAoB,EAAE;GACtB,aAAa,EAAE;GACf,iBAAiB,EAAE;GACnB,mBAAmB,EAAE;GACrB,uBAAuB,EAAE;EAC3B,OAAO,IAAI,EAAE,SAAS,UAChB;OAAA,EAAE,cACJ,oBAAoB,EAAE;QACjB,IAAI,EAAE,gBAAgB,EAAE,YAAY;IACzC,oBAAoB,EAAE;IACtB,aAAa,EAAE;IACf,iBAAiB,EAAE;IACnB,mBAAmB,EAAE;IACrB,uBAAuB,EAAE;GAC3B;SACK,IAAI,EAAE,SAAS,UAAU;GAC9B,oBAAoB,EAAE;GACtB,aAAa,EAAE;GACf,mBAAmB,EAAE;EACvB;;CAGF,MAAM,EAAE,WAAW;CACnB,MAAM,cACJ,UAAU,oBACN,CAAC,GAAG,QAAQ,GAAG,iBAAiB,IAChC,SACE,SACA;CAER,MAAM,QAAQ,KAAK,SAAS,aAAa,SAAS;CAClD,KACG,EAAE,qBAAsB,EAAE,kBAAkB,EAAE,QAAS,eACxD,CAAC,OAAO,oBAER,OAAO,KAAK,kBAER,IAAI,SAAS,SAAS,WAAW;EAC/B,MAAM,QACJ,KAAK,SAAS,aAAa,SAAS;EACtC,OAAO,KACL,MACA,MAAM,oBACN,OACA,aACA,YACA,gBACA,kBACA,sBACA,SACA,QACA,aACA,eACF;CACF,CAAC,CACL,CAAC,CAAC,KAAK,SAAS,MAAM;MAEtB,OAAO,KACL,MACA,OAAO,sBAAsB,KAAK,EAAE,SACpC,OACA,aACA,YACA,gBACA,kBACA,sBACA,SACA,QACA,aACA,eACF;AAEJ;AAEA,MAAM,eAA6B,CAAC;AACpC,IAAI,QAAQ;AAEZ,MAAM,gBAAgB,SAEpB,IAC4B;CAC5B,OAAO,GAAG,KAAK,IAAI,KAAK,EAAE;AAC5B;AAEA,MAAM,WAA0B,EAAE,MAAM,QAAQ;AAEhD,MAAM,OAAO,OACX,GACA,SACA,OACA,aACA,YACA,gBACA,kBACA,sBACA,SAEA,QAEA,aACA,oBACqB;CACrB,MAAM,EAAE,GAAG,UAAU;CAErB,IAAI;CACJ,IAAI;CACJ,MAAM,MAAM,OAAO,OAAO,MAAM;CAChC,wBAAwB,OAAO,MAAM;CAGrC,MAAM,aAAa;CAEnB,IAAI;EACF,IAAI,aACF,MAAM,QAAQ,IAAI,YAAY,IAAI,cAAc,CAAC,CAAC;EAGpD,MAAM,WAAY,MAAM,EAAE,MAAM,IAAI;EAEpC,IAAI,EAAE,EAAE,eAAe;GACrB,IAAI;GAEJ,KAAK,MAAM,QAAQ,EAAE,EAAE,eACrB,IAAI,KAAK,QACP,KAAK,MAAM,UAAU,KAAK,QAAQ;IAChC,MAAM,UAAU,OAAO,CAAC;IACxB,IAAI,SAAS,CAAC,aAAa,CAAC,EAAA,CAAG,KAAK,OAAO;GAC7C;GAIJ,IAAI,UAAU,MAAM,QAAQ,IAAI,QAAQ;EAC1C;EAEA,MAAM,EAAE,WAAW,aAAa;EAChC,MAAM,EAAE,aAAa,UAAU;EAC/B,MAAM,iBACJ,WAAW,UACX,UAAU,aACV,EAAE,EAAE,gBACJ,QAAQ,cAAc,qBACtB,sDAAsD,GAAG,IACrD,QACA;EAEN,IAAI;EACJ,IAAI;EACJ,IAAI;EAEJ,MAAM,oBAAoB,qBACxB,CAAC,mBAAmB,eAAe,KACrC;EAEA,MAAM,qBACJ,+DAA+D,GAAG,KAClE,kBACI,KAAA,IACA,mBAAmB;EAEzB,IAAI,UAAU,KAAK;GACjB,IAAI,MAAM,wBACR,IAAI,OACF,aAAa,IAAI,UAChB,aAAa,IAAI,SAAS,QAAA,CAAS,SAAS,EAAE;GAGnD,IAAI,KACF,UAAU,IAAI,YAAY,GAAG;GAG/B,MAAM,SAAS,wBAAwB;GACvC,cAAc,MAAM,UAClB,SACA,QACA,KACA,mBACA,oBACA,wCAAwC,KAAK,CAC/C;GACA,MAAM,EAAE,kBAAkB;GAE1B,IAAI,KAAK;IACP,IAAI,WAAW,KAAK,OAAO;IAE3B,MAAM,KAAA;GACR;GAEA,IAAI,eAAe;IACjB,MAAM,IAAI,MAAM,cAAc,WAAW;IACzC,IAAI,GACF,OAAO,UAAU,QAAQ,EAAE,MAAM,IAAI,EAAE;GAE3C;GAEA,IAAI,SAAS,UAAU,WAAW;IAChC,MAAM,WAAW,YAAY,KAAK,SAAS;IAC3C,MAAM,aAAa,YAAY,OAAO,SAAS;IAE/C,MAAM,YACJ,WAAW,UAAU,YAAY,OAAO,WAAW,CAAC,OAAO;IAC7D,UAAU,YAAY,KAAK,SAAS,CAAC;IACrC,YAAY,OAAO,SAAS;IAC5B,YAAY;IACZ,YAAY,KAAK,SAAS;IAE1B,IAAI,WAAW,SACb,KAAK,MAAM,OAAO,YAAY,MAC5B,OAAO,IAAI;SAGb,KAAK,MAAM,OAAO,YAAY,MAC5B,IAAI,SAAS;GAGnB;GAEA,SAAS,MAAM,aAAa,GAAG,gBAAgB,aAAa,QAAQ;EACtE,OAAO;GAGL,MAAM,cAAc,wBAAwB;GAE5C,MAAM,aAAa,OAAO,UAAuB;IAC/C,MAAM,OAAO,MAAM,SAAS;IAC5B,KAAK,IAAI,IAAI,GAAG,KAAK,MAAM,KAAK;KAC9B,MAAM,MAAM;KAEZ,IAAI,KACF,UAAU,IAAI,YAAY,GAAG;KAG/B,MAAM,SAAS,MAAM,UACnB,SACA,aACA,KACA,MAAM,IAAI,oBAAoB,KAAA,GAC9B,MAAM,OAAO,qBAAqB,KAAA,GAClC,wCAAwC,KAAK,CAC/C;KAEA,IAAI,aAAa;MACf,YAAY,YAAY,OAAO;MAC/B,YAAY,KAAK,KAAK,GAAG,OAAO,IAAI;KACtC,OACE,cAAc;KAGhB,IAAI,KACF,IAAI,WAAW,KAAK,OAAO;IAE/B;IAGA,MAAM,KAAA;GACR;GAEA,IAAI,OACF,MAAM,WAAW,IAAI,KAAK;QACrB;IACL,MAAM,EAAE,UAAU;IAElB,IAAI,KAAK,UAAU,IAAI,YAAY,QAAQ;IAC3C,MAAM,QAAQ,YAAY,KAAA,GAAW,KAAA,GAAW,YAAY;KAC1D,IAAI,KAAK,IAAI,WAAW,UAAU,OAAO;KACzC,MAAM,MAAM,MAAM,WAAW,KAAK;KAClC,IAAI,KAAK,UAAU,IAAI,YAAY,SAAS;KAC5C,OAAO;IACT,CAAC;IACD,IAAI,KAAK,IAAI,WAAW,WAAW,OAAO;GAC5C;GAKA,SAAS,MAAM,aAAa,GAAG,gBAAgB,aAAc,QAAQ;EACvE;EAGA,IAAI;EACJ,IAAI;EACJ,IAAI,WAAW,QAAQ;GACrB,KAAK,MAAM,CACT,QACA,EAAE,IAAI,MAAM,gBACT,UAAU,OAAO,QAAQ,GAAG;IAC/B,IAAI,WAAW;IAEf,IAAI,IACF,CAAC,YAAY,CAAC,EAAA,CAAG,UAAU;IAG7B,IAAI,MACF,CAAC,gCAAgB,IAAI,IAAI,EAAA,EAAI,IAAI,IAAI;GAEzC;GAEA,IAAI,SACF,KAAK,MAAM,UAAU,QACnB,KAAK,MAAM,KAAK,SAAS;IACvB,MAAM,QAAQ,OAAO,QAAQ;IAC7B,OAAO,QAAQ,MAAM,OAAO;IAC5B,OAAO,KAAK;GACd;GAIJ,IAAI,MAAM,mBAAmB;IAC3B,MAAM,UAAU,sBAAsB,OAAO,MAAM;IACnD,IAAI,SAAS,MAAM;GACrB;EACF;EAEA,IAAI;EACJ,IAAI;EACJ,IAAI,SAAS,UAAU;GAErB,MAAM,kCAAkB,IAAI,IAA4C;GACxE,MAAM,wCAAwB,IAAI,IAGhC;GAQF,MAAM,kCAAkB,IAAI,IAAuB;GAEnD,KAAK,MAAM,WAAW,SAAS,SAAS,YAAY;IAClD,MAAM,OAAO,SAAS,SAAS,WAAW;IAE1C,MAAM,OAAO,UAAU;IACvB,IAAI,CAAC,QAAQ,KAAK,iBAChB,MAAM,IAAI,cAAc,GAAG,kBAAkB,QAAQ,cAAc;IAGrE,MAAM,UAAU,KAAK,UAAU;IAC/B,IAAI,CAAC,SAAS;IAEd,IAAI,YAAY,gBAAgB,IAAI,KAAK,KAAK;IAC9C,IAAI,CAAC,WAAW;KACd,YAAY,EAAE,MAAM,CAAC,EAAE;KACvB,gBAAgB,IAAI,KAAK,OAAO,SAAS;IAC3C;IAEA,IAAI,MAAM;KACR,MAAM,WAAW,UAAU,KAAK;KAChC,UAAU,KAAK,WAAW,WAAW,CAAC,GAAG,UAAU,GAAG,IAAI,IAAI;KAE9D,IAAI,YAAY,YAAY,YAAY,UACtC,UAAU,KAAK,OAAO,UAAU,KAAK,OACjC,CAAC,GAAG,UAAU,KAAK,MAAM,GAAG,IAAI,IAChC;KAGN,IAAI;KACJ,MAAM,UAA0B,CAAC;KACjC,KAAK,MAAM,OAAO,KAAK,OACrB,IAAK,KAAK,MAAM,IAAI,CAAY,QAAQ;MACtC,aAAa;MACb,QAAQ,OAAQ,KAAK,MAAM,IAAI,CAAY;KAC7C;KAGF,IAAI,YACF,KAAK,MAAM,OAAO,MAChB,YAAY,SAAS,GAAG;IAG9B;GACF;GAEA,KAAK,MAAM,WAAW,SAAS,SAAS,YAAY;IAClD,MAAM,OAAO,SAAS,SAAS,WAAW;IAC1C,MAAM,EAAE,cAAc;IAEtB,MAAM,UAAU,UAAU;IAC1B,MAAM,YAAY,gBAAgB,IAAI,KAAK,KAAK;IAChD,IAAI,CAAC,WAAW,CAAC,WAAW;IAE5B,KAAK,MAAM,WAAW;KAAC;KAAU;KAAU;KAAU;IAAM,GAAY;KACrE,MAAM,OAAO,UAAU,KAAK;KAC5B,IAAI,CAAC,MAAM;KAGX,MAAM,QAAQ,UAAU,QADC;KAEzB,IAAI,OAAO;MACT,MAAM,MAAO,kBAAkB,CAAC;MAChC,KAAK,MAAM,MAAM,OAEf,IAAI,CADa,gBAAgB,IAAI,EACzB,GAAG;OACb,gBAAgB,IAAI,EAAE;OACtB,IAAI,WAAW,GAAG,MAAM,CAAC,CAAC;MAC5B;KAEJ;KAGA,MAAM,cAAc,UAAU,QADC,QAAQ;KAEvC,IAAI,aAAa;MACf,MAAM,MAAO,wBAAwB,CAAC;MACtC,KAAK,MAAM,MAAM,aAEf,IAAI,CADa,sBAAsB,IAAI,EAC/B,GAAG;OACb,sBAAsB,IAAI,EAAE;OAC5B,IAAI,WAAW,GAAG,MAAM,CAAC,CAAC;MAC5B;KAEJ;IACF;GACF;EACF;EAEA,MAAM,aAAa,MAAM;EACzB,MAAM,eACJ,cACA,kBACA,oBACA,wBACA,cACA,iBACA;EACF,IAAI,cAAc;GAEhB,IAAI,CAAC,YAAa,UAChB,aACE,iBACA,mBACA,uBACE,KAAA;GAGN,IAAI,cAAc,kBAAkB,cAAc,eAAe;IAC/D,MAAM,OAAO,CAAC,QAAQ,CAAC;IACvB,MAAM,QAAQ,IACZ;KACE,GAAI,cAAcC;KAClB,GAAI,kBAAkBA;KACtB,GAAI,cAAcA;KAClB,GAAI,iBAAiBA;IACvB,CAAC,CAAC,IAAI,eAAe,IAAI,CAC3B;GACF;GAIA,IAAI,oBAAoB,wBAAwB,qBAAqB;IACnE,MAAM,4BAA4B,oBAChC,yBAAyB,CACzB,GAAI,oBAAoBA,cACxB,GAAI,wBAAwBA,YAC9B;IAEA,IAAI,oBAAoB,KAAK,GAAG;KAC9B,IAAI,0BACF,CAAC,MAAM,gBAAgB,CAAC,EAAA,CAAG,KACzB,QACA,GACA,wBACF;KAGF,IAAI,qBACF,CAAC,MAAM,gBAAgB,CAAC,EAAA,CAAG,KACzB,QACA,GACA,mBACF;IAEJ,OAAO;KAEL,MAAM,cAAc;KAEpB,eAAe,YAAY;MACzB,MAAM,WAA2C,CAAC;MAClD,IAAI,0BACF,KAAK,MAAM,MAAM,0BACf,IAAI;OACF,SAAS,KACN,GAAkC,aAAa,CAAC,CACnD;MACF,SAAS,KAAK;OACZ,SAAS,KAAK,QAAQ,OAAO,GAAG,CAAC;MACnC;MAIJ,IAAI,qBACF,KAAK,MAAM,MAAM,qBACf,IAAI;OACF,SAAS,KAAK,GAAG,CAAC;MACpB,SAAS,KAAK;OACZ,SAAS,KAAK,QAAQ,OAAO,GAAG,CAAC;MACnC;MAIJ,MAAM,qBACJ,aACA,gBAEE,CACE,GAAI,oBAAoBA,cACxB,GAAI,uBAAuBA,YAC7B,CAAC,CAAC,KAAK,MAAM,EAAE,IAAI,GACrB,EAAE,EAAE,sBACN;KACF,CAAC;IACH;GACF;EACF;EAEA,MAAM,UACJ,mCACE,UACA,QACA,mBACA,OACF,KAOA,WAAW,GAAG,WAAY;EAE5B,IAAI,SACF,MAAM;EAIR,IAAI,WAAW,UAAU,mBAAmB,YAAY;GACtD,IAAI,SAAS;IAEX,MAAM,gBAAgB,MAAM,KAAK,EAC/B,QAAS,OAA2B,OACtC,CAAC;IAED,KACE,IAAI,IAAI,GAAG,MAAO,OAA2B,QAC7C,IAAI,KACJ,EAAE,GACF;KACA,MAAM,SAAU,OAA2B;KAC3C,MAAM,gBAAiB,cAAc,KAAK,EAAE,GAAG,OAAO;KACtD,KAAK,MAAM,KAAK,SAAS;MAEvB,cAAc,KAAK,OAAO,QAAQ;MAClC,cAAc,QAAQ,MAAM,OAAO;KACrC;IACF;IAEA,SAAS;GACX;GAEA,SAAS,aACP,GACA,YAEA,aACA,QACA,aACA,YACF;EACF;EAEA,IAAI,MAAM,WACR,SAAS,gBAAgB,OAAO,YAAY,MAAM,WAAW,MAAM;EAGrE,OAAO,UAAU,QAAQ,MAAM,IAAI;CACrC,SAAS,KAAK;EACZ,IAAI;EACJ,IAAI,eAAe,QAAQ,YAAY;GAGrC,IADaC,qBAAmB,GAG3B,MAAM,WACT,IAAI,QAAQ,SAAS,aAAa,GAElC,QAAQ,IAAI,cAAc,CAAC;QACtB;IACL,QAAQ,IAAK,EAAE,MAA0C;IACzD,QAAQ,YAAY,OAAO,GAAG;GAChC;GACA,MAAM,QAAQ;EAChB,OAAO;GACL,QAAQ;GACR,IAAI,iBAAiB,OACnB,MAAM,QAAQ;EAElB;EAGA,MAAM,QAAQ,WAAW;EACzB,IAAI,OAAO;GACT,MAAM,OAAO,MAAM,QAAQ,IAAI;GAC/B,IAAI,SAAS,IAAI;IACf,MAAM,KAAK,MAAM,QAAQ,MAAM,OAAO,CAAC;IACvC,IAAI,OAAO,IACT,WAAW,QAAQ,MAAM,MAAM,GAAG,IAAI,IAAI,MAAM,MAAM,EAAE;GAE5D;EACF;EAEA,IAAI,OAAO,KACT,IAAI,QAAQ,OAAgB,KAAsB,OAAO;EAG3D,IAAI,QAAQ,OAAO,OAAO,KAAK;EAE/B,MAAM;CACR;AACF;AAMA,MAAM,wBACJ,aACmC;CACnC,OAAO,YAAY,SAAS,qBACxB;EACE,oBAAoB,SAAS;EAC7B,MAAM,IAAK,SAAS,UAAU,SAAS,UAAU,KAAK;CACxD,IACA,KAAA;AACN;;;;;;AAOA,MAAM,aACJ,SACA,QACA,KACA,mBACA,oBACA,oBACG;CACH,IAAI;CACJ,IAAI,mBACF,IAAI,oBACF,UAAU,kBAAkB,mBAAmB,UAC7C,kBAAkB,YACZ;EACJ,OAAQ,UAAU,QAAQ,OAAkB,CAC1C,IAAI,MACJ,IAAI,QACJ,eACF;CACF,CACF;MAEA,UAAU,kBAAkB,mBAAmB,eAC7C,mBACA,IAAI,MACJ,IAAI,QACJ,WAAW,QACb;MAGF,UAAU,QAAQ,OAAkB,CAAC,IAAI,MAAM,IAAI,QAAQ,eAAe;CAG5E,IAAI,CAAC,qBAAqB,oBACxB,UAAU,QAAQ,KAAK,OAAO,QAAQ;EACpC,MAAM,mBAAmB,iBAAiB,QAAQ;EAClD,OAAO;CACT,CAAC;CAGH,OAAO,QAAQ,MAAM,WAAW;EAC9B,IAAI,OAAO,YAAY,CAAC,OAAO,KAAK,QAAQ;GAC1C,OAAO,KAAK,SAAS,OAAO;GAC5B,OAAO,KAAK,KAAK,CAAC,CAAC;EACrB;EAEA,OAAO;CACT,CAAC;AACH;AA6GA,MAAM,cAAc,GAAU,gBAAiD;CAC7E,IAAI;CAEJ,IAAI,EAAE,EAAE,cACN,KAAK,MAAM,UAAU,EAAE,EAAE,cAAc;EACrC,MAAM,MAAM,OAAO,GAAG,OAAO,MAAM,WAAW;EAC9C,IAAI,KAAK,CAAC,aAAa,CAAC,EAAA,CAAG,KAAK,GAAG;CACrC;CAGF,OAAO,YAAa,QAAQ,IAAI,QAAQ;AAC1C;AAEA,MAAa,eACX,SACA,QACY;CACZ,KAAK,MAAM,OAAO,SAChB,IAAI,OAAO,KACT,IAAI,OAAQ,QAAQ,IAAI,CAAkB,IAAI,IAAI;CAGtD,OAAO;AACT;AAkEA,MAAa,gBACX,GACA,YACA,aACA,QACA,aAEA,iBACY;CACZ,IAAI,eAAe,OACjB,OAAO,gBAAgB,QAAQ,aAAa,YAAY;CAG1D,IAAI,eAAe,gBAAgB,eAAe,OAAO;EACvD,IAAI,MAAO,OAA2B;EACtC,IAAI,CAAC,KAAK;GACR,IAAI,eAAe,cAAc,MAAM,IAAI,cAAc,CAAC;GAC1D;EACF,OAAO,IAAI,CAAC,aAAa,MACvB,OAAO;OACF;GACL,IAAI,cAAc,MAAM,EAAE,GAAG,IAAI;GAEjC,KAAK,MAAM,UAAU,aACnB,OAAO,IAAI;GAGb,OAAO;EACT;CACF;CAEA,IAAI,eAAe,SACjB,OAAQ,OAA2B,EAAE,GACnC,kBAAkB,GAAG,WAAW;CAIpC,IAAI,eAAe,gBAAgB;EACjC,IAAI,EAAE,EAAE,WACN,OAAO,YAAY;EAGrB,MAAM,MAAO,OAA2B;EACxC,IAAI,CAAC,KAAK,MAAM,IAAI,cAAc,CAAC;EAEnC,OAAO,IAAI,kBAAkB,GAAG,WAAW;CAC7C;CAEA,IAAI,eAAe,SAAS;EAC1B,MAAM,MAAM,kBAAkB,GAAG,WAAW;EAC5C,OAAQ,OAA2B,KAAK,QAAQ,IAAI,IAAI;CAC1D;CAEA,IAAI,eAAe,QAAQ;EACzB,SAAS,gBAAgB,QAAQ,aAAa,YAAY;EAC1D,OAAQ,OAA2B,KAAK,WAAW,OAAO,OAAO,MAAM,CAAC;CAC1E;AAGF;AAEA,MAAM,qBACJ,GACA,gBACuB;CACvB,IAAI,EAAE,EAAE,QACN,OAAO,YAAY,OAAO,KAAK,YAAY,OAAO,EAAE,CAAC,OAAO;MAE5D,KAAK,MAAM,OAAO,EAAE,EAAE,mBACpB,OAAO;AAIb;AAEA,MAAM,mBACJ,QACA,aACA,iBACG;CACH,IAAI,aAAa,MACf,IAAI,cACF,OAAQ,OAA2B,KAAK,SAAS;EAC/C,MAAM,SAAS,EAAE,GAAG,KAAK;EACzB,KAAK,MAAM,OAAO,aAChB,OAAO,OAAO;EAEhB,OAAO;CACT,CAAC;MAED,KAAK,MAAM,UAAU,QACnB,KAAK,MAAM,OAAO,aAChB,OAAO,OAAO;CAKtB,OAAO;AACT;ACtqCA,MAAM,cAAc,GAAU,WAAsB,SAA0B;CAC5E,IAAI,CAAC,QAAQ,SAAS,SAAS,SAAS,UAAU,SAAS,SACzD,OAAO,CAAC;MACH,IAAI,SAAS,SAAS,SAAS,WAAW,SAAS,QACxD,OAAO,UAAU;MACZ,IAAI,SAAS,kBAAkB,UAAU,WAC9C,OAAO;MAEP,MAAM,IAAI,cAAc,CAAC;AAE7B;;;;AAKA,MAAa,cAAc;CAGzB,MAAM,KAEJ,SACA,QACA;EACA,IAAI;GACF,IAAI,SAAS,WAAW,MAAM,KAAK,GAAG,KAAK,EAAE,UAAU;GAEvD,IAAI,KAAK,EAAE,WACT,SAAS,gBACP,KAAK,GACL,KAAK,EAAE,YACP,KAAK,EAAE,WACP,MACF;GAGF,OAAO,UAAU,MAAM;EACzB,SAAS,KAAK;GACZ,OAAO,SAAS,GAAG;EACrB;CACF;CACA,MAAkC,QAAiC;EACjE,OAAO,KAAK,KAAK,KAAA,GAAW,MAAM;CACpC;AACF;AAmBA,MAAa,eAAe,MACzB,EAAY,SAAS,YAAY;ACnCpC,MAAaC,2BACX,WACA,aACG;CAEH,IAAI,SAAS,eAAe;EAC1B,0BAAwB,WAAoB,iBAAiB,SAAS,CAAC;EACvE,OAAO;CACT;CAEA,IAAI,eAAe,SAAS,EAAE,OAC1B,SAAS,EAAE,SAAS,WAClB,SAAS,EAAE,eACX,SAAS,EAAE,SAAS,WAClB,SAAS,EAAE,eACX,SAAS,EAAE,SAAS,WAClB,SAAS,EAAE,gBAAgB,SAAS,EAAE,aACpC,SAAS,EAAE,gBAAgB,SAAS,EAAE,eACpC,CAAC,GAAG,SAAS,EAAE,cAAc,GAAG,SAAS,EAAE,YAAY,IACvD,SAAS,EAAE,gBAAgB,SAAS,EAAE,eACxC,SAAS,EAAE,eACb,SAAS,EAAE,SAAS,WAClB,SAAS,EAAE,eACX,KAAA,IACR,KAAA;CAEJ,MAAM,EAAE,cAAc,SAAS;CAC/B,eACE,gBAAgB,YACZ,CAAC,GAAG,cAAc,GAAG,SAAS,IAC9B,YACE,CAAC,GAAG,SAAS,IACb;CAER,IAAI,cAAc;EAChB,MAAM,SAAS,IAAI,IAAI,UAAU,EAAE,SAAS;EAC5C,MAAM,gBAAgB,CAAC;EACvB,KAAK,MAAM,QAAQ,cACjB,IAAI,CAAC,OAAO,IAAI,IAAI,GAAG;GACrB,OAAO,IAAI,IAAI;GACf,cAAc,KAAK,IAAI;EACzB;EAEF,UAAU,EAAE,YAAY;EACxB,eAAe;EAEf,IAAI,aAAa,QACf,wBACE,WACA,UACA,aAAa,KAAK,aAAa,GAAG,QAAiB,CAAC,CACtD;CAEJ;CAEA,OAAO;AACT;AAEA,yBAAyBA,uBAAqB;AAC9C,+BAA+BA,uBAAqB;ACcpD,MAAM,kBAAkB,GAAe,YAA4B;CACjE,KAAK,MAAM,OAAO,EAAE,OAAO;EACzB,MAAM,EAAE,WAAW,EAAE,MAAM;EAC3B,IAAI,QAAQ,QAAQ,OAAO;CAC7B;AACF;AAEA,SAAgB,UAGd,MAAS,KAA8B;CACvC,MAAM,OAAQ,KAA+B;CAC7C,IAAI,OAAO,QAAQ,UAAU;EAC3B,KAAK,OAAO;EACZ,MAAM,IAAI,KAAK,aAAa;EAC5B,KAAK,cAAe,GAAG,SAAS;EAChC,KAAK,mBAAmB,GAAG;EAE3B,MAAM,UAA0B,CAAC;EACjC,KAAK,iBAAiB;EACtB,IAAI,GAAG,eAAe,GAAG,OAAO;EAEhC,MAAM,IAAI,IAAI,QAAQ,GAAG;EACzB,IAAI,MAAM,IAAI;GACZ,KAAK,SAAS,IAAI,MAAM,GAAG,CAAC;GAC5B,MAAM,IAAI,MAAM,IAAI,CAAC;EACvB,OAAO,IAAI,GACT,KAAK,SAAS,KAAA;CAElB,OAAO,IAAI,MAAM,QAAQ,GAAG,GAAG;EAC7B,MAAM,QAAQ,EAAE,GAAG,KAAK,YAAY;EAEpC,MAAM,gBAA+B,CAAC;EAGtC,KAAK,MAAM,QAAQ,KACjB,IAAI,OAAO,SAAS,UAAU;GAC5B,MAAM,IAAK,KAAK,WAA2B;GAE3C,OAAO,OAAO,OAAO,EAAE,KAAK;GAC5B,IAAI,EAAE,WACJ,KAAK,mBAAmB;IAAE,GAAG,KAAK;IAAkB,GAAG,EAAE;GAAU;GAErE,MAAM,UAA0B,CAAC;GACjC,cAAc,QAAQ;GACtB,eAAe,GAAG,OAAO;EAC3B,OAAO,IAAI,CAACC,eAAa,IAAI,GAAG;GAC9B,MAAM,MAAMC,wBAAsB,MAA0B,IAAI;GAChE,OAAO,OAAO,OAAOC,qBAAmB,KAAK,IAAI,CAAC;GAElD,MAAM,MAAMC,aAAW,GAAG;GAC1B,cAAc,OAAO,gBAAgB,GAAuB;EAC9D;EAGF,KAAK,gBAAgB;CACvB,OAAO;EACL,MAAM,IAAIF,wBAAsB,MAAe,GAAY;EAC3D,KAAK,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS;EACjC,KAAK,cAAcC,qBAAmB,GAAG,IAAI;EAC7C,KAAK,iBAAiB,gBAAgB,CAAqB;EAC3D,KAAK,eAAe,EAAE,EAAE;CAC1B;CAEA,KAAK,OAAO;CACZ,KAAK,mBAAmB,KAAK,SAAS,KAAA;CAEtC,OAAO;AACT;ACzKA,SAAgB,UAId,MAAS,OAAU,KAAS,KAAsC;CAClE,OAAO,YAAY,UAAU,OAAO,IAAI,GAAY,EAAE;AACxD;;;;;;;AAQA,SAAgBE,yBAAuB,OAAc;CACnD,MAAM,IAAI,MAAM,UAAU,MAAM;CAChC,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,EAAE,SAAS,KAAA;CAChC,OAAO;AACT;ACiDA,MAAa,mBAAmB,MAC9B,eAAe;ACyIjB,MAAM,0BACJ,GACA,SACG;CACH,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACpC,MAAM,MAAM,KAAK;EACjB,IAAI,OAAO,QAAQ,YAAY;GAC7B,MAAM,KAAK,OAAO,OAAO,CAAC;GAC1B,GAAG,IAAIC,qBAAoB,EAA4B,CAAC;GACxD,GAAG,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG,EAAE,SAAS,KAAA;GACnC,GAAG,EAAE,WAAW;GAChB,oBAAoB,EAAE;GAEtB,MAAM,WAAW,wBAAwB,IAAI,GAAY;GACzD,KAAK,KAAKC,wBAAsB,GAAY,QAAQ;EACtD,OAAO,IAAI,IAAI,gBAAgB,QAAQ;GACrC,MAAM,OAAQ,KAA0B,KAAK,EAC3C,GAAI,IACN;GACA,KAAK,MAAM,OAAO,KAAK;IACrB,MAAM,QAAQ,IAAI;IAClB,IAAI,OAAO,UAAU,YAAY;KAC/B,IAAI,WAAY,MAAkC,CAAC;KACnD,IAAI,CAACC,eAAa,QAAQ,GACxB,WAAWD,wBACT,GACA,QACF;KAEF,KAAK,OAAO;IACd,OACE,gBAAgB,GAAG,OAAO,IAAI;GAElC;EACF;CACF;AACF;AAEA,MAAM,mBACJ,GACA,OACA,gBACG;CACH,KAAK,MAAM,MAAM,OAAO;EACtB,MAAM,QAAQ,MAAM;EACpB,IAAI,SAAS,OAAO,UAAU,UAC5B,IAAI,MAAM,QAAQ,KAAK,GACrB,MAAM,SAAS,MAAM,MAAM;GACzB,MAAM,MAAM,aAAa,GAAG,IAAI;GAChC,IAAI,KAAK,MAAM,KAAK;EACtB,CAAC;OACI,IAAI,eAAe,MAAM,gBAAgB,QAC9C,gBAAgB,GAAG,KAAsB;OACpC;GACL,MAAM,MAAM,aAAa,GAAG,KAAK;GACjC,IAAI,KAAK,MAAM,MAAM;EACvB;CAEJ;AACF;;;;AAKA,MAAaE,iBACX,GACA,SACsB;CACtB,uBAAuB,GAAG,IAAI;CAE9B,OAAO,wBAAwB,GAAY,OAAO,IAAI;AACxD;ACpRA,MAAa,UACX,WACA,SACA,QACG;CACH,MAAM,OAAO;CACb,MAAM,UAAU;CAEhB,IAAI;CACJ,IAAI;CACJ,IAAI,KAAK,EAAE,UAAU;EACnB,QAAQ;EACR,MAAM,EAAE,WAAW;EACnB,IAAI,MAAM;EAIV,IAEE,KAAK,EAAE,WAAW,KAClB,KAAK,EAAE,eAEP,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,KAAA;OACnC,IAAI,CAAG,IAAI,MAAgB,EAAgB,YAChD,EAAE,gBAAgB;CAEtB,OAAO;EAGL,QAAQC,cAAY,UAAU,OAAO,GAAG,CACtC,EACE,QAAQ,EAAE,GAAG,IAAI,YAAY,MAAM,OAAO,EAAE,EAC9C,CACF,CAAC;EAED,IAAI,MAAM;EAEV,EAAE,aAAa,EAAE,aAAa,EAAE,QAAQ,KAAA;CAC1C;CAEA,IAAI,KAAK,EAAE,UACT,EAAE,WAAW,CAAC,GAAG,KAAK,EAAE,UAAU;EAAE,OAAO;EAAM;CAAI,CAAC;MAEtD,EAAE,WAAW,CAAC;EAAE,OAAO;EAAM;CAAI,CAAC;CAGpC,sBAAsB,MAAM,CAAC;CAE7B,EAAE,eAAe;GACdC,aAAW,IAAI,IAAI,KAAK,EAAE;EAC3B,GAAG,KAAK,EAAE;CACZ;CAEA,IAAI,qBAAqB,KAAK,CAAC,GAAG,IAAI;CAEtC,OAAO;AACT;;;;;;;;ACjDA,MAAa,2BACX,GACA,OACe;CACf,IAAI;CAIJ,IAAI,EAAE,OAAO;EACX,OAAO,EAAE,SAAS;EAClB,IAAI,CAAC,MAAM;GACT,OAAO,OAAO,OAAO,EAAE,SAAS;GAChC,KAAK,YAAY;GAEjB,MAAM,EAAE,cAAc;GACtB,KAAK,MAAM,OAAO,WAChB,OAAO,eAAe,MAAM,KAAK,EAC/B,MAAM;IACJ,MAAM,MAAM,UAAU;IACtB,MAAM,WAAWC,SAAO,IAAI,KAAK;IACjC,SAAS,EAAE,aAAa,KAAK,EAAE;IAC/B,OAAO,OAAO,MAAM,UAAU,GAAG;GACnC,EACF,CAAC;GAGH,EAAE,SAAS,cAAc;EAC3B;CACF,OACE,OAAO;CAGT,MAAM,MAAM,OAAO,OAAO,IAAI;CAE9B,IAAI,IAAIC,qBAAmB,EAAE,CAAC;CAC9B,IAAI,EAAE,WAAW;CAEjB,IAAI,EAAE,OAAO,IAAI,EAAE,WAAW,KAAA;CAC9B,oBAAoB,GAAG;CAEvB,OAAO,GAAG,GAAY;AACxB;;;;;;;;;;AC4ZA,MAAa,gBAAgB,GAAe,QAC1CC,wBACE,GACC,gBAAgB,GAAG,IAAI,IAAI,UAAU,KAAK,CAAC,IAAI,GAClD;;;;;;;;;;;;;AA2TF,MAAa,gBACX,MACA,MACA,WACA,IACA,qBACuB;CACvB,MAAM,QAAQ;CAEd,YAAYA,wBAAsB,MAAe,SAAS;CAC1D,UAAU,EAAE,SAAS;CAErB,OAAOC,aAAW,SAAS;CAC3B,wBACE,MAAM,GACN,mBACA,IACA,UAAU,EAAE,gBACd;CAEA,MAAM,WAAW;EACf,GAAG;EACH,GAAG;EACH,GAAG;CACL;CAEA,MAAM,SAAU,MAAM,UAAU,EAAE,MAAM,UAAU;CAElD,MAAM,YACJ,UAAU,EAAE,eAAe,WAC3B,UAAU,EAAE,eAAe;CAE7B,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,IAAI,WAAW;EACb,MAAM,MAAM,MAAM,EAAE,iBAChB,IAAI,IAAI,MAAM,EAAE,cAAc,oBAC9B,IAAI,IAAgC;EACxC,MAAM,EAAE,iBAAiB;EAEzB,MAAM,SAAS,UAAU,EAAE;EAC3B,kBAAkB,OAAO;EACzB,UAAU,EAAE,SAAS,CAAC;EACtB,MAAM,WAAWC,aAAW,UAAU,MAAM,CAAC;EAC7C,UAAU,EAAE,SAAS;EAErB,gBAAgB,IAAI,IAAI,QAAQ;EAChC,IAAI,eACF,cAAc,cAAc;OACvB;GACL,cAAc;GACd,IAAI,IAAI,UAAU;IAAE,GAAG;IAAW,GAAG;GAAG,CAAC;EAC3C;CACF;CAEA,IAAI,CAAC,eAAe;EAClB,MAAM,WAAWD,aAAW,KAAK;EACjC,wBACE,UAAU,GACV,gBACA,UACA,MAAM,EAAE,WACV;CACF;CAEA,MAAM,0BACH,UAAU,SAAS,UAAU,EAAE,eAAe,UAAU,UACzD,UAAU,EAAE,eAAe;CAG7B,IAAI;CACJ,IAAI,yBAAyB;EAC3B,cAAc,CAAC;EACf,KAAK,MAAM,OAAO,yBAAyB;GACzC,MAAM,SAAS,wBAAwB;GACvC,YAAY,OAAO,OAAO,KAAK,OAC3BE,gBAAc,QAAiB,QAAQ,KAAA,CAAkB,IACzD;EACN;CACF;CAEA,MAAM,QAAQ,eAAeC,qBAAmB,WAAW,IAAI;CAE/D,wBAAwB,MAAM,GAAG,gBAAgB,QAAQ,KAAK;CAE9D,IAAI,WACF,wBAAwB,MAAM,GAAG,kBAAkB,QAAQ,WAAW;CAGxE,wBACE,MAAM,GACN,iBACA,eAAe,QACf,gBAAgB,SAAS,CAC3B;CAEA,IAAI,UAAU,EAAE,cACd,wBACE,MAAM,GACN,sBACA,QACA,UAAU,EAAE,YACd;CAGF,IAAI,aAAa;EACf,IAAI,eAAe;GACjB,cAAc,EAAE,EAAE,SAAS,CACzB,EACE,UAAU;IACR,GAAK,cAAc,EAAE,EAAE,OAAQ,EAAE,CAC9B;KACF,SAAS;GACZ,EACF,CACF;GAEA,OAAO;EACT;EAEA,UAAU,EAAE,SAAS,CACnB,EAAE,UAAU,GAAG,cAAc,gBAA0B,EAAE,CAC3D;CACF;CAEA,0BAAwB,OAAO,QAAQ;EACrC,MAAM,GAAG,KAAK;EACd,MAAM;CACR,CAAC;CAED,OAAO;AACT;ACj1BA,MAAa,oBACX,OACA,SACA,cACG;CACH,MAAM,EAAE,MAAM;CACd,MAAM,MAAmB,EAAE,aAAa,IAAI,IAAI,EAAE,UAAU;CAC5D,KAAK,MAAM,OAAO,SAAS;EACzB,MAAM,OAAO,IAAI,IAAI,GAAG,KAAK,EAAE,QAAQ,IAAI;EAC3C,IAAI,IAAI,KAAK,YAAY;GAAE,GAAG;GAAM;EAAU,IAAI,IAAI;CACxD;AACF;AAEA,MAAa,6BACX,OACA,SACA,UACG;CACH,MAAM,EAAE,MAAM;CACd,MAAM,MAAmB,EAAE,aAAa,IAAI,IAAI,EAAE,UAAU;CAC5D,KAAK,MAAM,UAAU,SACnB,IAAI,IAAI,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,SAAS,CAAC;AAEpD;AC3FA,MAAa,qBAAqB,MAAiB;CACjD,EAAE,iBAAiB;AACrB;ACoDA,MAAM,qCACJ,GACA,KACA,KAAa,QACV;CACH,MAAM,UAAU,EAAE,EAAE,gBAAgB;CACpC,IAAI,SACF,iBAAiB,EAAE,GAAG,KAAK,QAAQ,YAAY,SAAS,GAAG,CAAC;CAG9D,MAAM,eAAe,EAAE,EAAE,qBAAqB;CAC9C,IAAI,cACF,wBACE,GACA,gBACA,aAAa,KAAK,OAAO;EACvB,MAAM,CAAC;GAAE,KAAK;GAAc,YAAY;EAAM,GAAG,GAAG,EAAE,IAAI;EAC1D,IAAI,EAAE;CACR,EAAE,CACJ;AAEJ;AAWA,MAAa,0BACX,OACA,IACA,KACA,KACA,aACA,cAC4C;CAC5C,IAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,EAAE,MAAM;EAEd,IAAI,EAAE,cACJ,wBACE,OACA,gBACA,EAAE,aAAa,KAAK,QAAQ;GAC1B,MAAM,CAAC;IAAE;IAAK,YAAY,EAAE;GAAW,GAAG,GAAG,GAAG,IAAI;GACpD,IAAI,GAAG;EACT,EAAE,CACJ;EAGF,MAAM,UAAUC,eAAa,GAAG,IAC5B,KAAA,IACA,gBAAgB,GAAY;EAEhC,IACE,WACA,EAAE,cACF,EAAE,aACF,EAAE,eAAe,gBACjB,EAAE,eAAe,kBACjB,EAAE,eAAe,SACjB,EAAE,eAAe,SAEjB,0BAAwB,OAA2B,gBAAgB;GACjE,MAAM,CAAC;IAAE;IAAK,YAAY,EAAE;GAAW,CAAC;GACxC,KAAK,MAAM,gBAAgB;IACzB,MAAM,EAAE,SAAS;IACjB,MAAM,qBAAqB,EAAE,cAAc;IAC3C,IAAI,aAAa;IACjB,MAAM,EAAE,eAAe;IACvB,MAAM,UAA8B,CAAC;IAErC,IAAI,eAAe,WAAW,eAAe,gBACvC;SAAA,YACF,QAAQ,QAAQ,SAAS;MAGvB,IAAI,EAAE,OAAO,OACX,aAAa,eAAe,UAAU,QAAQ;MAEhD,QAAQ,OAAO,MAAM,UAAU;MAC/B,OAAO,QAAQ,KAAK,IAAI;KAC1B;IAAA;IAIJ,2BAA2B,SAAS,MAAM,IAAI;IAE9C,QAAQ,YAAR;KACE,KAAK;MACH,IAAI,SACF,KAAK,MAAM,EAAE,UAAU,SACrB,KAAK,MAAM,OAAO,MAChB,YAAY,SAAS,GAAG;MAI9B;KAEF,KAAK;KACL,KAAK;MACH,IAAI,SACF,IAAI,eAAe,OACjB,KAAK,MAAM,SAAS,SAClB,IAAI,MAAM,MAAM,YAAY,SAAS,MAAM,IAAI;WAC1C,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAA;WAG9C,KAAK,MAAM,EAAE,UAAU,SAAS;OAC9B,IAAI,CAAC,MAAM,MAAM,IAAI,cAAc,GAAY;OAC/C,YAAY,SAAS,IAAI;MAC3B;WAEG,IAAI,eAAe,OACnB;YAAA,MAAM,SAAS,SAClB,IAAI,CAAC,MAAM,MACT,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,KAAA;MAAA,OAG3C,KAAK,MAAM,EAAE,UAAU,SACrB,IAAI,CAAC,MAAM,MAAM,IAAI,cAAc,GAAY;MAInD,IAAI,YACF,KAAK,MAAM,SAAS,SAClB,MAAM,OAAO,CAAC,MAAM,IAAI;MAI5B;KAEF,KAAK,SAAS;MACZ,MAAM,QAAQ,SAAS;MACvB,IAAI,OACF,KAAK,MAAM,EAAE,UAAU,SACrB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAC/B,KAAmC,KAAK,MAAM,KAAK,EAAE;MAO3D;KACF;KACA,KAAK;KACL,KAAK,gBAAgB;MACnB,MAAM,OAAQ,EAAE,WAA4C;MAC5D,MAAM,cAAc,CAAC,MAAM;MAC3B,MAAM,eAAe,MAAM;MAE3B,MAAM,QAAQ,eAAe,OAAO;MACpC,IAAI,OACF,IAAI,eAAe,SACjB,IAAI,cACF,KAAK,MAAM,QAAQ,SACjB,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OACrC,KAAK,KAAK,OAAO,OACf,OACA,MAAM,KAAK,KAAK,EAAE,IACpB,EAAE;WAGR,KAAK,MAAM,QAAQ,SACjB,KAAK,OAAO,KAAK,OAAO,KAAK,OAC3B,KAAK,SAAS,OACV,EAAE,kBACF,MAAM,KAAK,IAAI;WAIzB,IAAI,cACF,KAAK,MAAM,QAAQ,SAAS;OAC1B,IAAI,CAAC,KAAK,MACR,MAAM,IAAI,cAAc,GAAY;OAGtC,KAAK,OAAO,KAAK,OAAO,KAAK,OAC3B,KAAK,KAAK,OAAO,OAAO,OAAO,MAAM,KAAK,KAAK,EAAE;MACrD;WAEA,KAAK,MAAM,QAAQ,SAAS;OAC1B,IAAI,eAAe,KAAK,SAAS,MAC/B,MAAM,IAAI,cAAc,GAAY;OAGtC,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,MAAM,KAAK,IAAI;MACrD;WAGC,IAAI,eAAe,SACpB;WAAA,cACF,KAAK,MAAM,QAAQ,SACjB,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,OACrC,KAAK,KAAK,KACV,EAAE;YAGR,KAAK,MAAM,QAAQ,SACjB,IAAI,KAAK,SAAS,KAAA,GAChB,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,EAAE;MAAA,OAIvC,IAAI,cACT,KAAK,MAAM,QAAQ,SAAS;OAC1B,IAAI,CAAC,KAAK,MACR,MAAM,IAAI,cAAc,GAAY;OAEtC,KAAK,OAAO,KAAK,OAAO,KAAK,OAAO,KAAK,KAAK;MAChD;WACK,IAAI,aACJ;YAAA,MAAM,EAAE,UAAU,SACrB,IAAI,SAAS,MACX,MAAM,IAAI,cAAc,GAAY;MAAA;MAK1C,IAAI,YACF,KAAK,MAAM,SAAS,SAClB,MAAM,OAAO,CAAC,MAAM,IAAI;MAI5B;KACF;IACF;IAEA,IAAI,YAAY;KACd,IAAI;KACJ,IAAI;KACJ,KAAK,MAAM,UAAU,WAAW,KAAK,GAAG;MACtC,MAAM,SAAS,WAAY,IAAI,MAAM;MAErC,IAAI,OAAO,IAAI,CAAC,YAAY,CAAC,EAAA,CAAG,UAAU,OAAO;MAEjD,IAAI,OAAO,MACT,CAAC,gCAAgB,IAAI,IAAI,EAAA,EAAI,IAAI,OAAO,MAAM,MAAM;KAExD;KAEA,IAAI,SACG;WAAA,MAAM,EAAE,UAAU,SACrB,KAAK,MAAM,UAAU,MACnB,IAAI,QACF,KAAK,MAAM,KAAK,SAAS;OACvB,MAAM,QAAQ,OAAO,QAAQ;OAC7B,OAAO,QAAQ,MAAM,OAAO;OAC5B,OAAO,KAAK;MACd;;KAMR,IAAI,EAAE,mBAAmB;MACvB,MAAM,eAAe,uBACnB,GACA,SACA,oBACA,YACA,aACA,SACA,GACF;MACA,IAAI,cAAc,OAAO;KAC3B;KAEA,yBACE,SACA,oBACA,aACA,SACA,GACF;IACF;IAEA,qBAAqB,GAAG,OAAO;GAEjC;EACF,CAAgB;EAGlB,IAAI,CAAC,aAAc,IAAc,GAAG,YAAY,IAAI,EAAE,MACpD,MAAM,IAAI,EAAE;EAGd,IAAIA,eAAa,GAAG,GAAG;GACrB,0BAA0B,OAAgB,KAAK,GAAG;GAClD,OAAO;EACT;EAEA,OAAO;CACT;CAEA,MAAM,WAAY,MAA2B,EAAE,iBAC7C;CAEF,OAAO,2BACL,OACA,WAAW,WAAW,MAAO,MAAkB,KAC/C,IACA,KACA,WACF;AACF;AAEA,MAAM,8BACJ,SACA,MACA,SACG;CACH,MAAM,OAAO,KAAK,SAAS;CAC3B,MAAM,EAAE,KAAK,eAAe,KAAK;CAEjC,KAAK,MAAM,OAAO,MAChB,6BAA6B,SAAS,MAAM,KAAK,YAAY,GAAG,MAAM,GAAG;AAE7E;AAEA,MAAM,gCACJ,SACA,MACA,SACA,gBACA,GACA,MACA,WACG;CACH,MAAM,OAAQ,OAAyB;CACvC,IAAI,MAAM,MACR,QAAQ,KAAK;EACX;EACA;EACA,KAAK;CACP,CAAC;MACI;EAEL,IAAI,CAAC,MAAM;EAEX,MAAM,EAAE,KAAK,eAAe,KAAK,EAAE;EACnC,IAAI,CAAC,kBAAkB,mBAAmB,OACxC,KAAK,MAAM,OAAO,MAChB,6BACE,SACA,MACA,KACA,YACA,GACA,MACA,GACF;OAGF,6BACE,SACA,MACA,KACA,YACA,GACA,MACA,IACF;CAEJ;AACF;AAGA,MAAM,cAAc,IAAIC,SAAO,MAAM;AAqCrC,MAAa,sBACX,GACA,UACA,IACA,KACA,KACA,aACA,oBAC+B;CAC/B,MAAM,QAAQ;CAEd,IAAI,QAAQ;CACZ,IAAI;CACJ,IAAI;CAEJ,IAAI,OAAO,UAAU,YAAY;EAC/B,QAAQ,wBAAwB,GAA4B,KAAK;EAEjE,IAAI,YAAY,KAAK,GACf;OAAA,MAAM,EAAE,kBACV,OAAO;EAAA;EAIX,IAAID,eAAa,KAAK,GACpB,SAAS,MAAM,OAAO;OACjB;GAGL,MAAM,yBACH,MAA2B,EAAE,aAAa;GAE7C,IAAI,gBAAgB,KAAK,KAAK,CAAC,wBAAwB;IACrD,YAAY;IACZ,kBAAkB,MAAM,CAAC;IAEzB,QAAQ,MAAM,UAAU,OAAO,CAAuB;IAEtD,IAAI;IACJ,MAAM,EAAE,YAAY,qBAAqB,MAAM;IAC/C,IAAI,CAAC,cAAc,eAAe,OAAO;KACvC,WAAW,MAAM,KAAK,KAAK;KAG3B,IAAI,CAAC,kBACH,MAAM,EAAE,gBAAgB;IAE5B,OAAO,IAAI,eAAe,SAAS;KAEjC,WAAW,MAAM,EAAE,SACf,MACG,KAAKE,yBAAuB,KAAK,CAAC,CAAC,CACnC,QAAQ,MAAM,EAAE,OAAO,EAAE,IAC5B,MAAM,KAAK,KAAK;KAEpB,MAAM,EAAE,gBAAgB;IAC1B,OACE,IAAI,eAAe,WAAW,eAAe,gBAC3C,IAAI,MAAM,EAAE,QAAQ;KAElB,IAAI,OAAO,MAAM,EAAE,OAAO,OAAO,UAC/B,MAAM,EAAE,OAAO,KAAK,EAClB,UAAU,EAAE,GAAG,MAAM,EAAE,OAAO,GAAG,EACnC;KAGF,WAAW;IACb,OACE,WAAW,MAAM,KAAK,KAAK;SAG7B,WAAW;IAIf,MAAM,cACJ,oBAAoB,MAAM,EAAE,eAAe;IAE7C,MAAM,KAAK,aACT,GACA,cAAc,SAAS,aACvB,UACA,KAGA,oBACE,eAAe,SACf,eAAe,YACnB;IAEA,IAAI,IACF,MAAM,EAAE,kBAAkB,uBACxB,OACA,GACA,EACF;GAEJ;GAEA,IAAI,MAAM,EAAE,WAAW,KAAK,kBAC1B,MAAM,EAAE,oBAAoB;QACvB,IACL,CAAC,MAAM,EAAE,SACR,MAAM,EAAE,eAAe,WACtB,MAAM,EAAE,eAAe,mBACzB,CAAC,wBACD;IACA,MAAM,SAAS,OAAO,OACpB,MAAM,EAAE,aAAaC,gBAAc,QACrC;IACA,OAAO,OAAO;KAAE,GAAG,OAAO;KAAM,cAAc;IAAK;IAEnD,IAAI,WAGF,OAAO,KAAK,OAAO,KAAA;IAGrB,MAAM,EAAE,YAAY;IACpB,IAAI,MAAM,EAAE,MACV,MAAM,EAAE,KAAK,EAAE,YAAY;GAE/B;GAEA,KACG,oBAAoB,WAAW,2BAChC,MAAM,EAAE,eAAe,gBAEvB,MAAM,EAAE,aAAa;GAGvB,SAAS,MAAM,EAAE;GAEjB,QAAQC,wBAAsB,GAAY,KAAK;EACjD;CACF,OAAO,IAAI,OAAO,UAAU,UAAU;EACpC,MAAM,WAAW,MAAM,EAAE,iBAAiB;EAE1C,SACE,WACI,MAAM,EAAE,eAAe,SAAS,EAAE,QAClC,qBAAqB,OAAgB,KAAK;CAElD,OACE,SAAS,MAAM,OAAO;CAGxB,SAAS,OAAO,uBACd,OACA,IACA,KACA,OACA,aACA,SACF;CAEA,OAAO;AACT;AAKA,MAAa,8BACX,OACA,KACA,IACA,UACA,gBACuB;CACvB,MAAM,EAAE,MAAM;CACd,MAAM,QAAQ,IAAI,QAAQ,GAAG;CAC7B,IAAI,UAAU,IACZ,OAAO,aAAa,OAAO,GAAG,KAAK,UAAU,WAAW;CAG1D,MAAM,QAAQ,mBAAmB,OAA6B,KAAK,OAAO,EAAE;CAC5E,MAAM,SAAS,IAAI,MAAM,QAAQ,CAAC;CAGlC,IAAI,WAAW,KAAK;EAClB,kCAAkC,OAAO,OAAO,QAAQ;EACxD,OAAO,UAAU,KAAK,SAAS;CACjC;CAEA,IAAI,UAAU,IACZ,OAAO,aAAa,OAAO,GAAG,QAAQ,UAAU,WAAW;CAG7D,MAAM,SAAS,EAAE,gBAAgB,MAAM,GAAG;CAC1C,IAAI,QAAQ,iBAAiB,GAAG,YAAY,QAAQ,MAAM;CAE1D,MAAM,eAAe,EAAE,qBAAqB;CAC5C,IAAI,cAAc;EAChB,IAAI,SAAS;EACb,KAAK,MAAM,MAAM,cACf,IAAI,GAAG,KAAK,EAAE,CAAC,QAAQ,QAAQ;GAC7B,IAAI,CAAC,QAAQ;IACX,EAAE,eAAe,CAAC,GAAI,EAAE,gBAAgB,CAAC,CAAE;IAC3C,SAAS;GACX;GACA,EAAE,aAAc,KAAK,EAAE;EACzB;CAEJ;CAEA,MAAM,YAAY,EAAE,kBAAkB;CACtC,IAAI,YAAY,SAAS;EACvB,MAAM,WAAW,UAAU;EAC3B,0BAA0B,OAAO,SAAS,MAAM,KAAK;EAErD,wBAAwB,GAAG,qBAAqB,QAAQ,QAAQ;EAChE;CACF;CAEA,OAAO;AACT;AAEA,MAAM,gBACJ,OACA,GACA,KACA,UACA,gBACG;CACH,IAAI,QAAQ,KAAK;EACf,MAAM,EAAE,mBAAmB,MAAM;EACjC,IAAI,gBACF,mBAAmB,MAAM,GAAG,WAAW,cAAc;CAEzD,OAAO;EACL,MAAM,SAAS,MAAM,EAAE,iBAAiB;EACxC,IAAI,QAAQ,wBAAwB,GAAG,WAAW,YAAY,KAAK,MAAM;EAEzE,IAAI,EAAE,mBAAmB,MAAM;GAC7B,MAAM,WAAW,EAAE,iBAAiB;GACpC,iBAAiB,OAAO,SAAS,IAAI;GAErC,MAAM,EAAE,oBAAoB;IAC1B,GAAG,MAAM,EAAE;KACV,eAAe,MAAM;GACxB;GACA;EACF;CACF;CAEA,OAAO;AACT;AAQA,MAAaC,wBACX,GACA,eACwB;CACxB,MAAM,QAAS,EAAY;CAC3B,MAAM,EAAE,gBAAgB;CACxB,IAAI;CAEJ,IAAI,MAAM,mBAAmB;EAC3B,SAAS,MAAM,SAAS,CAAC,GAAG,MAAM,MAAM,IAAI,CAAC;EAC7C,KAAK,MAAM,OAAO,MAAM,mBACtB,OAAO,KAAK,GAAG,MAAM,kBAAkB,IAAI,CAAC,IAAI;CAEpD,OACE,SAAS,MAAM;CAGjB,IAAI;CACJ,IAAI,CAAC,QACH,IAAI,MAAM,MAER,SAAS,CAAC;MACL,IAAI,YAAY;EAErB,SAAS,CAAC;EACV,KAAK,MAAM,OAAO,aAAa;GAC7B,MAAM,SAAS,YAAY;GAC3B,IAAI,CAAC,OAAO,KAAK,gBACf,OAAO,OAAO,OAAO,KAAK,OACtBC,gBAAc,QAAQ,QAAQ,KAAA,CAAS,IACvC;EAER;CACF,OACE,SAAS;MAEN;EACL,SAAS,CAAC;EACV,KAAK,MAAM,QAAQ,QACjB,IAAI,OAAO,SAAS,UAClB,2BACE,GACA,MACA,aACA,OACA,QACA,UACF;OACK,IAAIN,eAAa,IAAI,GAC1B,OAAO,QAAQ,KAAK,OAAO;OACtB,IAAI,QAAQ,cAAc,MAC/B,KAAK,MAAM,OAAO,KAAK,UAAU;GAC/B,MAAM,KAAK,KAAK,SAAS;GACzB,IAAI,OAAO,OAAO,UAChB,2BACE,GACA,IACA,aACA,OACA,QACA,YACA,GACF;QACK,IAAIA,eAAa,EAAE,GACxB,OAAO,OAAO,GAAG,OAAO,SAASG,gBAAc;QAC1C,IAAI,IAAI;IACb,MAAM,EAAE,eAAe,GAAG;IAC1B,IAAI,eAAe,WAAW,eAAe,gBAAgB;KAC3D,MAAM,OAAO,GAAG,EAAE;KAClB,OAAO,OAAO,OACV,mBACE,MACA,UACF,IACAA,gBAAc;IACpB,OACE,OAAO,OAAO,IAAII,iBAAeC,wBAAsB,KAAA,CAAS;GAEpE;EACF;CAGN;CAEA,OAAO;AACT;AAIA,MAAM,8BACJ,GACA,KACA,OACA,OACA,QACA,YACA,QACG;CACH,MAAM,QAAQ,IAAI,QAAQ,GAAG;CAC7B,IAAI,UAAU,IAAI;EAChB,MAAM,KAAM,EAAY,EAAE,MAAO,EAAY;EAC7C,MAAM,QAAQ,mBAAmB,GAAG,KAAK,OAAO,EAAE;EAClD,MAAM,SAAS,IAAI,MAAM,QAAQ,CAAC;EAClC,IAAI,UAAU,IACZ,OAAO,OAAO,UAAU,MAAM;OACzB;GACL,MAAM,KAAK,MAAM,eAAe,MAAM,GAAG;GACzC,IAAI,IACF,OAAO,OAAO,UAAU,mBACtB,IACA,UACF;EACJ;CACF,OAAO,IAAI,QAAQ,KACZ;OAAA,MAAM,OAAO,OAChB,IAAI,CAAE,MAAM,IAAI,CAAiC,KAAK,gBACpD,OAAO,OAAO,mBACZ,MAAM,MACN,UACF;CAAA,OAIJ,OAAO,OAAO,OAAO,mBACnB,MAAM,MACN,UACF;AAEJ;AAGA,MAAM,sBAAsB,QAA0B,eAAyB;CAE7E,IACE,CAAC,cACD,CAAC,UACA,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,KAAK,gBAEnC,OAAO;CAGT,MAAM,SAAS,OAAO,OAAO,MAAM;CACnC,OAAO,OAAO;EAAE,GAAG,OAAO;EAAM,MAAM,KAAA;EAAW,gBAAgB,KAAA;CAAU;CAC3E,OAAO;AACT;ACnyBA,MAAa,wBACX,GACA,QACwC;CACxC,IAAI,OAA6C,EAA4B,EAC1E,YAAY;CACf,IAAI,CAAC,MAAM;EACT,MAAM,QAAQ,IAAI,QAAQ,GAAG;EAC7B,IAAI,UAAU,IAAI;GAChB,MAAM,KACH,EAA4B,EAAE,MAAO,EAAqB;GAE7D,MAAM,QAAQ,mBAAmB,GAAG,KAAK,OAAO,EAAE;GAClD,MAAM,SAAS,IAAI,MAAM,QAAQ,CAAC;GAElC,IAAI,UAAU,IACZ,OAAQ,EAAgC,MAAM;QAE9C,OAAQ,EAA4B,EAAE,eAAe,MAAM,GAAG;EAElE;CACF;CACA,OAAO;AACT;AAGA,MAAM,QAKJ,OACA,YACA,QACsE;CACtE,MAAM,IAAK,MAAgC;CAE3C,IAAI,EAAE,WAAW,EAAE,YAAY,KAAA;CAE/B,EAAE,aAAa;CAEf,IAAI,QAAiB;CAErB,MAAM,WAA0B,CAAC;CACjC,IAAI;CACJ,MAAM,WAAW,mBACf,OACA,UACAC,aAAW,KAAc,GACzB,KACA,OACA,KAAA,GACA,UACF;CACA,IAAI,aAAa,OAAO;EACtB,EAAE,YAAY,SAAS;EACvB,QAAQ,SAAS,KAAK;CACxB;CAEA,IAAI,OAAO,UAAU,UACnB,QACE,SAAS,KACT,IAAI,qBAAqB,OAAgB,SAAS,GAAa,MAAM;CAGzE,EAAE,SAASC,eAAa,KAAK,IACzB,CAAE,EAAE,OAAO,KAAM,IACjB,QACE,CAAC,EAAE,UAAU,EAAE,GAAG,MAAe,EAAE,CAAC,IACpC,KAAA;CAEN,OAAO,kBACL,OACA,QAAQ,aAAaC,YAAU,GACjC;AACF;AASA,SAAgB,kBAGd,MAAS,KAAqC;CAC9C,OAAO,KAAK,MAAM,SAAS,GAAG;AAChC;ACzIA,IAAM,sBAAN,cAAkCC,aAAW;CAI3C,YACE,MACA,KACA,UACA;EACA,MAAM;EAJC,KAAA,OAAA;EACA,KAAA,MAAA;EACA,KAAA,WAAA;EALA,KAAA,SAAA,EAAE,OAAOC,gBAAc,SAAS;EAQvC,KAAK,IAAI,EAAE,MAAM,KAAK;CACxB;CAEA,QAAQ,KAAe;EACrB,MAAM,IAAI,KAAK;EACf,MAAM,UAAoB,CAAC;EAC3B,MAAM,WAAgD,CAAC;EACvD,MAAM,SAAS,YACb,KACA,GACA,EAAE,GACF,IAAIC,aAAW,CAAC,EAAE,IAClB,EAAE,EAAE,YACJ,KAAA,GACA,SACA,QACF;EACA,EAAE,EAAE,cAAc;GAAE,KAAK;GAAQ;EAAQ;EAEzC,IAAI;EACJ,IAAI,OAAO,OAAO,QAAQ,CAAC,CAAC,MAAM,MAAM,GAAG,KAAK,QAAQ,GACtD,YAAY,qBAAqB,OAAO,QAAQ,QAAQ,CAAC,CACtD,KACE,CAAC,KAAK,YACL,IAAI,IAAI,QAAQ,IAAI,GAClB,QAAQ,KAAK,WAAW,KAAK,OAAO,KAAK,aAAa,IAE5D,CAAC,CACA,KAAK,IAAI,EAAE;OAEd,YAAY;EAGd,OAAO,KAAK,MACR,YACA,KAAK,aAAa,QAChB,qBAAqB,UAAU,YAC/B,YAAY,UAAU;CAC9B;AACF;AAEA,SAAgB,UACd,MACA,UACyE;CACzE,MAAM,QAAS,KAAe,MAAM;CAEpC,MAAM,IAAI,UAAU,OAAOC,yBAAuB,KAAK,CAAC;CAExD,kBACE,GACA,IAAI,oBACF,OACA,sBAAuB,KAAe,EAAE,aACxC,QACF,CACF;CAGA,EAAE,EAAE,aAAa;CAEjB,OAAO;AACT;AC5EA,MAAa,kBACX,KACA,OACA,MACA,qBAIG;CACH,MAAM,EAAE,eAAe,MAAM;CAC7B,MAAM,kBAAkB,eAAe;CAEvC,IAAI;CACJ,IACE,eAAe,WACf,eAAe,kBACf,eAAe,SACf;EACA,MAAM,QAAQ,MAAM,EAAE,OAAQ;EAC9B,IACE,iBAAiB,wBACjB,OAAO,MAAM,SAAS,UACtB;GACA,MAAM,aAAa,MAAM,OAAO,OAAO,KAAK;GAG5C,IAAI,cAAc,eAAe,MAAM,MAAM;IAC3C,QAAQC,SAAO,KAAK;IACpB,MAAM,EAAE,aAAa;IACrB,MAAM,EAAE,SAAS,CAAC,EAAE,UAAU,GAAG,MAAM,OAAO,MAAM,EAAE,CAAC;IACvD,IAAI,mBAAmB,MAAM,EAAE,SAAS,UACtC,MAAM,EAAE,qBAAqB;GAEjC;GACA,UAAU,MAAM;EAClB,OAAO;GACL,QAAQA,SAAO,KAAK;GACpB,MAAM,EAAE,aAAa;GACrB,MAAM,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,OAAO,MAAM,EAAE,OAAQ,GAAY,EAAE,CAAC;GACtE,UAAU;EACZ;CACF;CAEA,MAAM,KAAKC,YAAU,UAAU,KAAK,OAAO,MAAM,KAAA,GAAW,gBAAgB;CAE5E,MAAM,kBAAkB,aAAuB;EAC7C,MAAM,OAAiB,CAAC;EAExB,IAAI,gBAAgB;EACpB,IAAI,SAAS;GACX,gBAAgB;GAChB,KAAK,KAAK,IAAI,GAAG,KAAK,QAAQ,EAAE;EAClC,OAAO,IAAI,eAAe,QAAQ;GAChC,MAAM,QAAQC,qBAAmB,OAAO,IAAI;GAC5C,MAAM,OAAO,OAAO,KAAK,KAAK;GAC9B,gBAAgB,KAAK;GACrB,KAAK,KAAK,GAAG,KAAK,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;EACpD;EAEA,IAAI,CAAC,YAAY,IAAI,OAAO,UAAU,WAAW;GAC/C,KAAK,KAAK,YAAY;GACtB,IAAI,gBAAgB;EACtB;EAEA,OAAO;CACT;CAEA,OAAO;EACL;EACA;CACF;AACF;AAEA,MAAa,8BACX,OACA,KACA,OACA,OAAO,MAAM,EAAE,SAIZ;CACH,IAAI,CAAC,MAAM,EAAE,MAEX,OAAO;EACL,IAFSC,aAAW,KAEnB;EACD,eAAeC,aAAW,MAAM,OAAO,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACjE;CAGF,MAAM,EAAE,IAAI,mBAAmB,eAAe,KAAK,OAAO,IAAI;CAE9D,OAAO;EACL;EAEA,QAAQ,UAAU;GAChB,OAAO,YAAY,eAAe,QAAQ,IAAI,UAAU,GAAG;EAC7D;CACF;AACF;AChGA,MAAa,gBACX,KACA,GACA,MACA,QACA,aACA,qBACS;CACT,IAAI,KAAK,gBAAgB,KAAA,KAAa,IAAI,SAAS;EACjD,MAAM,WAAW,YAAY,KAAK,IAAI;EACtC,CAAC,SAAS,gBAAgB,CAAC,EAAA,CAAG,IAAI,WAAW,EAAE,OAAO,KAAK,YAAY;CACzE;CAEA,MAAM,cAAc,KAAK;CACzB,MAAM,cAAc,KAAK;CACzB,MAAM,YAAY,KAAK;CACvB,MAAM,cAAc,KAAK;CACzB,MAAM,oBAAoB,KAAK;CAC/B,MAAM,oBAAoB,KAAK;CAC/B,MAAM,kBAAkB,KAAK;CAC7B,MAAM,oBAAoB,KAAK;CAC/B,MAAM,kBAEJ,gBAAgB,aACf,KAAK,sBACJ,KAAK,eAAe,gBACpB,KAAK,eAAe;CAExB,MAAM,eACJ,eACA,eACA,aACA,eACA,qBACA,qBACA,mBACA;CAEF,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,iBAC/B;CAGF,MAAM,YAAuB;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CAEA,IAAI,IAAI,WAAW,CAAC,kBACd;MAAA,cAAc,gBAAgB,kBAAkB;GAClD,MAAM,QAA2B,CAAC;GAClC,IAAI,UAAU,QACZ,KAAK,MAAM,OAAO,UAAU,OAAO,KAAK,GACtC,MAAM,OAAO,EAAE,MAAM;GAIzB,MAAM,OAAqB;IAEzB,OAAO,EAAE;IACT;IACW;IACX;GACF;GAEA,MAAM,YAAY,mBAAmB,CAAC,CAAC,UAAU;GACjD,MAAM,WAAW,YAAY,KAAK,SAAS;GAC3C,CAAC,SAAS,eAAe,CAAC,EAAA,CAAG,IAAI,aAAa;EAChD;QAEA,IAAI,OAAO,YAAY;AAE3B;AAEA,MAAa,eAAe,KAAe,cAAiC;CAC1E,IACE,aACA,IAAI,OAAO,cACX,IAAI,WAAW,IAAI,OAAO,UAC1B,CAAC,IAAI,OAAO,8BACZ;EACA,IAAI,OAAO,WAAW,KAAK,MAAM;EACjC,IAAI,OAAO,+BAA+B;CAC5C;CAEA,IAAI,IAAI,OAAO,UAAU;EACvB,IAAI,WAAW,IAAI,OAAO,SAAS,YAAY;EAC/C,OAAO,IAAI,OAAO;CACpB,OACE,OAAQ,IAAI,OAAO,WAAW,EAC5B,UACF;AAEJ;AAEA,MAAa,kBACX,KACA,SACA,cACG;CACH,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,gBAAgB,CAAC,EAAA,CAAG,WAAW;AACzD;ACrFA,MAAa,6CACX,UAEA,MAAM,EAAE,kBAAkB,EACxB,MACF;AAEF,MAAa,6CACX,GACA,IACA,QACG;CACH,CAAC,EAAE,UAAU,CAAC,EAAA,CAAG,MAAM;AACzB;AAEA,MAAa,gDACX,KACA,UACG;CACH,IAAI,OACF,IAAI,OAAO,yCAAyC;AAExD;AAKA,MAAa,iDACX,UAC6B;CAC7B,IAAI,CAAC,MAAM,EAAE,kBAAkB,CAAC,MAAM,EAAE,gBACtC;CAGF,MAAM,EAAE,mBAAmB,MAAM;CACjC,MAAM,EAAE,iBAAiB,KAAA;CAEzB,OAAO;AACT;AAEA,MAAa,mDACX,OACA,mBACG;CACH,IAAI,gBACF,MAAM,EAAE,iBAAiB;AAE7B;AAEA,MAAa,uCACX,KACA,OACA,wBAQe;CACf,MAAM,kBAAkB,qBAAqB;CAC7C,IAAI,CAAC,iBAAiB;CAEtB,MAAM,yBAAyBC,wBAAsB,OAAOC,SAAO,KAAK,CAAC;CACzE,uBAAuB,EAAE,iBAAiB,KAAA;CAE1C,MAAM,cAAc,mBAClB,OACA,4DACF;CAEA,iBAAiB,wBAAwB,aAAa,IAAI;CAE1D,MAAM,EAAE,IAAI,UAAU,eACpB,KACA,wBACA,KAAA,GACA,IACF;CAEA,MAAM,UAAU,OAAO,KAAK,eAAe;CAE3C,MAAM,aAAa,uBAAuB,EAAE;CAC5C,MAAM,UAAUC,aAAW,KAAK;CAEhC,MAAM,OAAiB;EACrB,MAAM;EACN,MAAM;GACJ,GAAG;GACH,GAAG,CACD,OAAO,YACL,YAAY,KAAK,QAAQ;IACvB,MAAM,WAAW,WAAW,IAAI,GAAG;IACnC,OAAO,CACL,QAAQ,OAAQ,SAAS,MAAM,SAAS,SACxC,GAAG,QAAQ,GAAG,KAChB;GACF,CAAC,CACH,CACF;EACF;CACF;CAEA,KAAK,MAAM,UAAU,iBAAiB;EACpC,MAAM,MAAM,gBAAgB;EAC5B,IACE,IAAI,EAAE,eAAe,gBACrB,IAAI,EAAE,eAAe,gBAErB,eAAe,KAAK,OAAO,EAAE,aAAa,OAAO,CAAC;CAEtD;CAEA,OAAO;EACL;EACA,aAAa;EACb,iBAAiB;EACjB,cAAc,QAAQ,KAAK,QAAQ,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,IAAI;CACnE;AACF;AAEA,MAAa,+CACX,KACA,QACG;CACH,IAAI,sCACF,IAAI,OAAO;AACf;ACjHA,MAAa,uBACX,KACA,OACA,OAMA,UACA,UACA,YACS;CACT,IAAI,MAAM,aAAa;EACrB,IAAI,SAAS,QAAQ,KAAK,GAAG,MAAM,YAAY,OAAO;EACtD,IAAI,aAAa,CAAC,MAAM,YAAY,GAAG;CACzC,OAAO;EACL,IAAI,aAAa,gBACf,KACA,OACA,OACA,UACA,MAAM,YACN,UACA,SACA,KAAA,GACA,KAAA,CACF;EAEA,IAAI,CAAC,YAAY,IAAI,OAAO,UAAU,WACpC,IAAI,WAAW,KAAK,MAAM;CAE9B;AACF;AAEA,MAAa,mBACX,KACA,OACA,OAYA,UACA,aAAqC,MAAM,YAC3C,UACA,SACA,UACA,0BACa;CACb,IAAI;CACJ,IAAI;CAEJ,IAAI,OAAiB,CAAC;CAEtB,IAAI,gBAAgB;CAEpB,IAAI,MAAM,QACH;OAAA,MAAM,QAAQ,MAAM,QACvB,IAAI,OAAO,SAAS,UAAU;GAC5B,IAAI;GACJ,IAAI,SAAS,KAAK;IAChB,IAAI,YAAY;KACd,aAAa,CAAC;KACd,eAAe,CAAC;KAChB,KAAK,MAAM,OAAO,MAAM,gBAAgB;MACtC,SAAS,OAAO;MAChB,WAAW,OAAO;KACpB;IACF;IAEA,MAAM,qBAAqB,KAAK,OAAO,UAAU,QAAQ,CAAC,CAAC,KAAK,IAAI;GACtE,OAAO;IACL,IAAI;IAEJ,MAAM,QAAQ,KAAK,QAAQ,GAAG;IAC9B,IAAI,UAAU,IAAI;KAChB,MAAM,YAAY,KAAK,MAAM,GAAG,KAAK;KACrC,MAAM,MAAM,KAAK,MAAM,QAAQ,CAAC;KAEhC,IAAI,YAAY,IAAI,GAAG,GAAG;MACxB,CAAC,aAAa,CAAC,EAAA,CAAG,OAAO,IAAI,UAAU;MACvC,CAAC,eAAe,CAAC,EAAA,CAAG,OAAO;KAC7B;KAEA,MAAM,iBACJ,KACA,OACA,MAAM,aACN,WACA,KACA,UACA,MACA,QAAQ,MAAM,YAAY,KAC1B,QACF;IACF,OAAO;KACL,IAAI,YAAY,IAAI,IAAI,GAAG;MACzB,CAAC,aAAa,CAAC,EAAA,CAAG,QAAQ;MAC1B,CAAC,eAAe,CAAC,EAAA,CAAG,QAAQ;KAC9B;KAEA,MAAM,kBACJ,KACA,OACA,MAAM,aACN,MACA,MAAM,YAAY,OAClB,UACA,MACA,MACA,QACF;IACF;GACF;GAEA,KAAK,KAAK,GAAG;GACb,SAAS,KAAK,EAAE;EAClB,OAAO,IAAI,MACT,IAAI,cAAc,MAAM;GACtB,MAAM,MAAM,KAAK;GAGjB,KAAK,MAAM,MAAM,KAAK;IACpB,IAAI;IAEJ,IAAI,YACF,CAAC,aAAa,CAAC,EAAA,CAAG,MAAM;IAG1B,MAAM,QAAQ,IAAI;IAClB,IAAI,OAAO,UAAU,UACnB,IAAIC,eAAa,KAAK,GAAG;KACvB,IAAI,MAAM,MAAM,MAAM,KAAK,QAAQ;KACnC,IAAI,MAAM,EAAE,WAAW,KAAK,cAC1B,MAAM,SAAS,IAAI;KAGrB,KAAK,KAAK,GAAG,IAAI,IAAI,GAAG,EAAE;KAE1B,IAAI,UACF,SAAS,MAAM,MAAM,OAClB;KAGL,SAAS,KAAK,EAAE;IAClB,OAAO,IAAI,yBAAyB,gBAAgB,KAAK,GACvD,0CACE,uBACA,IACA,KACF;SACK;KACL,gBAAgB,KAAK,OAAO,OAAO,IAAI,MAAM,UAAU,OAAO;KAC9D,IAAI,UACF,SAAS,MACP,MAAM,EAAE,eAAe,WACvB,MAAM,EAAE,eAAe,iBACjB,MAAM,EAAE,MAAM,OAAO,SACrB,MAAM,QAAQ,QAChB,KAAA;IAEV;SACK,IAAI,OAAO;KAChB,IAAI,YACF,CAAC,eAAe,CAAC,EAAA,CAAG,SAAmB;KAGzC,KAAK,KACH,YACE,KACA,MAAM,GACN,MAAM,EAAE,aACR,OACA,UACA,MACA,IACA,QACF,CACF;KACA,SAAS,KAAK,EAAE;IAClB;GACF;EACF,OAAO;GAEL,IAAI;GACJ,IAAI,MAAM,KAAK,MAAM,KAAK,QAAQ;GAElC,IAAI,KAAK,EAAE,WAAW,KAAK,cACzB,MAAM,SAAS,IAAI;GAIrB,IACE,cACA,gBAAgB,wBAChB,OAAO,KAAK,SAAS,YACrB,KAAK,SAAS,KACd;IACA,MAAM,IAAI,KAAK,KAAK,QAAQ,GAAG;IAC/B,IAAI;IACJ,IAAI,MAAM,IACJ;SAAA,KAAK,KAAK,MAAM,GAAG,CAAC,MAAM,MAAM,OAClC,MAAM,KAAK,KAAK,MAAM,IAAI,CAAC;IAAA,OAG7B,MAAM,KAAK;IAGb,IAAI,KAAK;KACP,MAAM,SAAU,KAAK,EAAgB,YAAY;KACjD,CAAC,eAAe,CAAC,EAAA,CAAG,OAAO,QAAQ,KAAK,QAAQ;IAClD;GACF;GAEA,KAAK,KAAK,IAAI,aAAa,GAAG,IAAI,GAAG,aAAa,GAAG;GACrD,SAAS,KAAK,EAAE;EAClB;;CAKN,IAAI,YACF,KAAK,MAAM,UAAU,WAAW,KAAK,GAAG;EACtC,MAAM,OAAO,WAAW,IAAI,MAAM;EAClC,MAAM,EAAE,WAAW;EACnB,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI;EAEJ,IAAI,OAAO,WAAW,UAAU;GAC9B,MAAM,QAAQ,OAAO,QAAQ,GAAG;GAChC,IAAI,UAAU,IAAI;IAChB,MAAM,YAAY,OAAO,MAAM,GAAG,KAAK;IACvC,cAAc,IAAI,UAAU;IAC5B,aAAa,OAAO,MAAM,QAAQ,CAAC;IACnC,MAAM,MAAM,EAAE,eAAe,UAAU,GAAG;IAG1C,MAAM,YACJ,KACA,MAAM,GACN,MAAM,OACN,QACA,KAAA,GACA,MACA,KAAA,GACA,KAAA,GACA,KAAA,GACA,IACF;GACF,OAAO;IACL,cAAc;IACd,aAAa;IACb,MAAM,MAAM,MAAM;IAClB,MAAM,YACJ,KACA,MAAM,GACN,MAAM,OACN,QACA,UACA,MACA,KAAA,GACA,KAAA,GACA,KAAA,GACA,IACF;GACF;EACF,OAAO;GACL,aAAa;GACb,MAAM,OAAO;EACf;EAEA,IAAI,OAAO;EACX,IAAI,WAAW,aAAa;GAC1B,IAAI,WAAW,gBAAgB,aAAa;IAC1C,IAAI,CAAC,UACH,WAAW,OAAO,MAAM;IAE1B,KAAK,MAAM,SAAS,OAAO,GAAG,UAAU,CAAC;IACzC;GACF;GAEA,OAAOC,eAAa,UAAU,MAAM;GAEpC,KAAK,KAAK;GACV,KAAK,OAAO;GACZ,OAAO,KAAK,KAAK;GACjB,KAAK,MAAM,SAAS,OAAO,GAAG,IAAI,CAAC;EACrC,OAAO,IAAI,aAAa,aAAa;GACnC,MAAM,KAAK,WAAW;GACtB,KAAK,KAAK;GACV,KAAK,OAAO;GACZ,KAAK,MAAM,SAAS,OAAO,GAAG,EAAE,CAAC;GACjC;EACF,OAAO;GACL,IAAI,KAAK,KAAK,QAAQ,OAAO,WAAW,UACtC,OAAO,KAAK,WAAW;GAEzB,KAAK,OAAO;GACZ,KAAK,MAAM,SAAS,OAAO,GAAG,MAAM,CAAC;EACvC;EAEA,IAAI,UAAU,SAAS,QAAQ;EAE/B,IAAI;EACJ,KAAK,KAAK,GAAG;CACf;CAGF,IAAI,CAAC,KAAK,UAAU,CAAC,MAAM,UAAU,MAAM,eAAe,QACxD,OAAO,qBAAqB,KAAK,OAAO,UAAU,QAAQ;CAG5D,OAAO;AACT;AAEA,MAAa,eACX,KACA,OACA,OAWA,UACA,aAAqC,MAAM,YAC3C,UACA,SACA,UACA,0BACW;CAaX,OAZa,gBACX,KACA,OACA,OACA,UACA,YACA,UACA,SACA,UACA,qBAGQ,CAAC,CAAC,KAAK,IAAI;AACvB;AAEA,MAAM,wBACJ,KACA,OAQA,UACA,aACa;CACb,IAAI,UACF,KAAK,MAAM,OAAO,MAAM,gBAAgB;EACtC,MAAM,SAAS,MAAM,eAAe;EACpC,SAAS,OAAO,sBAAsB,MAAM;CAC9C;CAGF,IAAI;CACJ,IAAI,MAAM,gBAAgB,UAAU;EAClC,eAAe;EACf,KAAK,MAAM,OAAO,MAAM,aACtB,IAAI,CAAE,MAAM,YAAY,IAAI,CAAY,KAAK,gBAC3C;EAGJ,IAAI,iBAAiB;CACvB;CAEA,OAAO,aAAa,OAAO,UAAU,cAAc,GAAG;AACxD;AAEA,MAAa,gBACX,GAQA,UACA,cACA,QACa;CACb,OAAO,EAAE,MAAM,UAAU,EAAE,cAAc,EAAE,aACvC,EAAE,kBAAkB,KAAK,SACvB,qBAAqB,MAAM,KAAK,UAAU,IAAI,CAChD,MAAM,cAAc,EAAE,aAAa,YAAY,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,GAAG,KACxE,EAAE,mBACA,EAAE,iBAAiB,KAAK,SACtB,qBAAqB,MAAM,KAAK,QAAQ,CAC1C,IACA,cAAc,EAAE,aAAa,YAAY,IACvC,CAAC,IACD,CAAC,GAAG;AACd;AAEA,MAAM,wBACJ,MACA,KACA,UACA,WACW;CACX,IAAI,OAAO,SAAS,UAClB,OAAO,KAAK,KAAiB,QAAQ;CAGvC,OAAO,SAAS,GAAG,SAAS,GAAG,SAAS;AAC1C;AAEA,MAAM,iBAAiB,OAA4B,iBACjD,iBAAiB,KAAA,IACb,UAAU,WACR,QACA,cAAc,KAAK,IACrB,CAAC;AAEP,MAAM,mBACJ,KACA,WAGA,OACA,IACA,MACA,UACA,YACG;CACH,MAAM,EAAE,aAAa,UAAU,MAAM;CAErC,IAAI,YAAY,KAAK,GAAG;EACtB,IAAI;EACJ,QAAQ,YAAR;GACE,KAAK;GACL,KAAK;GACL,KAAK,QACH;GACF,KAAK;GACL,KAAK;IACH,IACE,MAAM,EAAE,aACR,MAAM,EAAE,MAAM,OAAO,iBAAiB,mBAEtC,MAAM;SAEN;IAEF;GACF,KAAK;GACL,KAAK;GACL,KAAK;IACH,MAAM;IACN;GACF,SACE,MAAM,IAAI,mBAAmB,OAAO,UAAU;EAClD;EACA,KAAK,KAAK,GAAG,IAAI,IAAI,GAAG,EAAE;EAC1B,SAAS,KAAK,EAAE;EAChB;CACF;CAEA,IAAI,MAAM,EAAE,iBAAiB;EAC3B,IAAI;EACJ,QAAQ,YAAR;GACE,KAAK;GACL,KAAK,cAAc;IACjB,MAAM,QAAQ,MAAM,EAAE;IACtB,MAAM,QAAQ,UAAU,eACtB;IAEF,MAAM,cAAc,KAAK,OAAO,OAAO,KAAK;IAC5C;GACF;GACA,KAAK;GACL,KAAK;GACL,KAAK;GACL,KAAK;IACH,MAAM,IAAI,MAAM,EAAE,gBAAgB,KAAK,GAAG;IAC1C;GACF,KAAK;IACH,IAAI,MAAM,EAAE,WAAW;IACvB,MAAM,IAAI,MAAM,EAAE,gBAAgB,KAAK,GAAG;IAC1C;GACF,KAAK,QACH;GACF,SACE,MAAM,IAAI,mBAAmB,OAAO,UAAU;EAClD;EAEA,IAAI,KAAK;GACP,KAAK,KAAK,GAAG,SAAS,KAAK,OAAO,KAAK,QAAQ,EAAE,IAAI,GAAG,EAAE;GAC1D,SAAS,KAAK,EAAE;EAClB;EACA;CACF;CAEA,QAAQ,YAAR;EACE,KAAK;EACL,KAAK;EACL,KAAK;GACH,QAAQ,UAAU,KAAK;GACvB;EACF,KAAK,SAAS;GACZ,MAAM,EAAE,WAAW,MAAM;GACzB,MAAM,QAAQ,SAAS;GACvB,IAAI,CAAC,SAAS,MAAM,EAAE,mBAAmB,KACvC,QAAQ,UAAU,KAAK;QAClB,IAAI,CAAC,OACV,MAAM,IAAI,uBACR,OACA,gCACF;QACK;IACL,MAAM,SAAS,MAAM,MAAM;IAC3B,OAAO,EAAE,SAAS,CAAC,EAAE,UAAU,EAAE,GAAG,MAAM,EAAE,CAAC;IAC7C,QAAQ,UACN,QACA,OAAO,UAAU,MAAM,CACzB;IACA,kBACE,OACA,IAAIC,SAAO,+BAA+B,CAC5C;GACF;GACA;EACF;EACA,KAAK;EACL,KAAK;GACH,IAAI,CAAC,MAAM,EAAE,aAAa,MAAM,EAAE,mBAAmB,KACnD,QAAQ,UAAU,KAAK;GAEzB;EACF,KAAK;EACL,KAAK,QACH;EACF,SACE,MAAM,IAAI,mBAAmB,OAAO,UAAU;CAClD;CAEA,KAAK,KACH,GAAG,SACD,KACA,OACA,IAAI,uBAAuB,KAAK,KAAK,EAAE,IACvC,QACF,EAAE,IAAI,GAAG,EACX;AACF;AAEA,MAAM,YACJ,KACA,OACA,KACA,aACG;CACH,MAAM,EAAE,kBAAkB,MAAM;CAChC,IAAI,kBAAkB,KAAA,GAIpB,OAAO,YAAY,IAAI,IAHTF,eAAa,aAAa,IACpC,cAAc,MAAM,KAAK,QAAQ,IACjC,SAAS,IAAI,QAAQ,aAAa,EACL;CAGnC,OAAO;AACT;AC/iBA,MAAa,yBACX,KACA,OACA,OACA,UACA,4BACG;CACH,MAAM,MAAM,WACV,KACA,OACA,OACA,UACA,KAAA,GACA,uBACF;CACA,IAAI,KACF,IAAI,IAAI,KAAK,SAAS,GAAG;AAE7B;AAEA,MAAa,kBACX,KACA,KACA,OACA,OACA,UACA,WACG;CACH,MAAM,MAAM,WAAW,KAAK,OAAO,OAAO,UAAU,MAAM;CAC1D,IAAI,KACF,IAAI,KAAK,GAAG;AAEhB;AAEA,MAAa,cACX,KACA,OACA,OACA,UACA,QACA,4BACuB;CACvB,IAAI;CAEJ,IAAI,MAAM,QAAQ;EAChB,MAAM,WAAW,KAAK,OAAO,OAAO,UAAU,IAAI;EAElD,IAAI,2BAA2B,KAC7B,wBAAwB,QAAQ;EAGlC,MAAM,OAAO,OAAO,OAAO,KAAK;EAChC,KAAK,MAAM,OAAO,MAAM,QAAQ;GAC9B,MAAM,QAAQ,MAAM,OAAO;GAC3B,MAAM,cAAc,MAAM,MAAM,SAAS;GACzC,KAAK,MAAM,YAAY;GACvB,KAAK,KAAK,YAAY;GACtB,MAAM,WAAW,WAAW,KAAK,OAAO,MAAM,UAAU,IAAI;GAC5D,IAAI,UAAU;IACZ,MAAM,MAAM,MAAM,UAAU,WAAW;IAEvC,IACE,2BACA,QAAQ,aACR,QAAQ,cAER,wBAAwB,QAAQ;GAEpC;EACF;CACF,OAAO;EACL,MAAM,WAAW,KAAK,OAAO,OAAO,UAAU,MAAM;EAEpD,IAAI,2BAA2B,KAC7B,wBAAwB,QAAQ;CAEpC;CAEA,OAAO;AACT;AAEA,MAAM,cACJ,KACA,OACA,OACA,UACA,WACuB;CACvB,IAAI;CACJ,IAAI,MAAM,IAER,OADY,MAAM,KAAK,SAAS,CAAC,MAAM,KAAK,GAAG,MAAM,EAAE,IAAI,MAAM,GAAA,CAE9D,KAAK,QAAQ,YAAY,KAAK,KAAK,OAAO,OAAO,QAAQ,CAAC,CAAC,CAC3D,KAAK,MAAM;MACT,IAAI,MAAM,KACf,MAAM,YAAY,MAAM,KAAK,KAAK,OAAO,OAAO,QAAQ;MAExD;CAGF,OAAO,UAAU,MAAM,IAAI,IAAI,KAAK;AACtC;AAEA,MAAM,eACJ,KACA,KACA,OACA,OACA,UACA,WACuB;CACvB,MAAM,OAAiB,CAAC;CACxB,KAAK,MAAM,QAAQ,KACjB,aAAa,MAAM,KAAK,OAAO,OAAO,MAAM,QAAQ;CAEtD,IAAI,CAAC,KAAK,QAAQ;CAElB,MAAM,MAAM,KAAK,KAAK,OAAO;CAC7B,OAAO,UAAU,KAAK,SAAS,IAAI,IAAI,IAAI,KAAK;AAClD;AAEA,MAAM,gBACJ,MACA,KACA,OACA,OACA,MACA,aACG;CACH,IAAI,eAAe,QAAQ,eAAe,MAAM;EAC9C,MAAM,QAAQ;EACd,IAAI,MAAM,EAAE,MACV,IAAI,MAAM,EAAE,aAAa,GACvB,KAAK,KAAK,YAAY,KAAK,OAAO,MAAM,GAAG,QAAQ,CAAC;OAC/C;GACL,MAAM,IAAI,aAAa,OAAO,KAAK;GACnC,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI;GAC1B,KAAK,KAAK,IAAI,uBAAuB,KAAK,CAAC,EAAE,EAAE;EACjD;OACK;GACL,MAAM,KAAKG,aAAW,KAAK;GAC3B,eAAe,MAAM,KAAK,OAAO,MAAM,GAAG,MAAM,IAAI,GAAG,IAAI,IAAI;EACjE;EACA;CACF;CAEA,IAAIC,eAAa,IAAI,GAAG;EACtB,KAAK,KAAK,IAAI,KAAK,MAAM,KAAK,QAAQ,EAAE,EAAE;EAC1C;CACF;CAEA,KAAK,MAAM,OAAO,MAAM;EACtB,MAAM,QAAS,KAAuB;EACtC,IAAI,UAAU,KAAA,GAAW;EAEzB,IAAI,QAAQ,OAAO;GACjB,MAAM,MAAMC,UAAQ,KAA8B;GAClD,MAAM,MAAM,YAAY,KAAK,KAAK,OAAO,OAAO,QAAQ;GACxD,IAAI,KAAK,KAAK,KAAK,GAAG;EACxB,OAAO,IAAI,QAAQ,MAAM;GAEvB,MAAM,OADO,MAAkC,IAAIA,SACpC,CAAC,CAAC,QAAkB,KAAK,QAAQ;IAC9C,MAAM,MAAM,YAAY,KAAK,KAAK,OAAO,OAAO,QAAQ;IACxD,IAAI,KAAK,IAAI,KAAK,GAAG;IACrB,OAAO;GACT,GAAG,CAAC,CAAC;GACL,IAAI,KAAK,QAAQ,KAAK,KAAK,IAAI,KAAK,KAAK,MAAM,EAAE,EAAE;EACrD,OAAO,IAAI,QAAQ,OAAO;GACxB,MAAM,MAAMA,UAAQ,KAA8B;GAClD,KAAK,KAAK,OAAO,YAAY,KAAK,KAAK,OAAO,OAAO,UAAU,IAAI,GAAG;EACxE,OAAO,IAAI,QAAQ,MACjB,IAAI,MAAM,QAAQ,KAAK,GAAG;GACxB,MAAM,OAAO;GACb,MAAM,aAAa,qBACjB,KACA,OACA,MAAM,aACN,KAAK,IACL,QACF;GAEA,MAAM,WAAW,KAAK;GACtB,MAAM,cAAc,qBAClB,KACA,OACA,MAAM,aACN,KAAK,IACL,QACF;GAEA,MAAM,YAAY,KAAK;GAEvB,KAAK,KACH,0BAA0B,WAAW,IAAI,SACvC,IAAI,QACJ,QACF,EAAE,6BAA6B,YAAY,IAAI,SAC7C,IAAI,QACJ,SACF,EAAE,EACJ;EACF,OAAO;GACL,MAAM,OAAO;GACb,MAAM,SAAS,IAAI,kBAAkB,KAAK,QAAQ,EAAE;GAEpD,MAAM,IAAwB,KAAK,kBAC/B;IACE,cAAc,MAAM;IACpB,SAAS,sBAAsB,KAAK;IACpC,aAAa,MAAM;GACrB,IACA;GAEJ,KAAK,KACH,GAAG,cAAc,KAAK,GAAG,QAAQ,KAAK,IAAI,EAAE,GAC1C,KAAK,MAAM,IACZ,GAAG,cAAc,KAAK,GAAG,QAAQ,KAAK,EAAE,GAC3C;EACF;OACK,IAAI,QAAQ,MACjB,UAAQ,KAAgC,CAAC,CAAC,SAAS,SAAS;GAC1D,OAAO,KAAK,OAAO,MAAM,UAAU,IAAI;EACzC,CAAC;OACI,IAAI,QAAQ,UAAU;GAC3B,MAAM,YACJ,MAAM,QAAS,MAAoB,EAAE,IAAI,QAAQ,CAAC,KAAK;GAGzD,MAAM,UAAU,UAAU,SAAS,oBAAI,IAAI,IAAY,IAAI;GAE3D,KAAK,MAAM,QAAQ,WAAW;IAC5B,MAAM,EAAE,QAAQ,OAAO,gBACrB,KACA,OACA,OACA,MACA,QACF;IAEA,MAAM,MAAM,yBAAyB,SACnC,KAAK,UAAU,OAAO,GACvB;IACD,IAAI,SAAS;KACX,IAAI,QAAQ,IAAI,GAAG,GAAG;KACtB,QAAQ,IAAI,GAAG;IACjB;IAEA,KAAK,KAAK,GAAG;GACf;EACF,OAAO,IAAI,QAAQ,UAAU;GAC3B,MAAM,SAAS;GACf,KAAK,KAAK,GAAG,OAAO,UAAU,OAAO,OAAO,GAAG,EAAE;EACnD,OAAO,IACL,OAAO,UAAU,YACjB,SACA,EAAE,iBAAiB,SACnB,CAAC,MAAM,QAAQ,KAAK,GAEpB,iBAAiB,KAAK,MAAM,OAAO,KAAK,OAAO,QAAQ;OAClD;GACL,MAAM,SAAS,qBACb,KACA,OACA,MAAM,aACN,KACA,QACF;GACA,KAAK,KACH,GAAG,OAAO,GACR,UAAU,OAAO,YAAY,KAAK,SAAS,IAAI,QAAQ,KAAK,KAEhE;EACF;CACF;AACF;AAEA,MAAM,oBACJ,KACA,MACA,OACA,KACA,OACA,aACG;CACH,IAAID,eAAa,KAAK,GACpB,KAAK,KACH,GAAG,qBACD,KACA,OACA,MAAM,aACN,KACA,QACF,EAAE,KAAK,MAAM,MAAM,KAAK,QAAQ,GAClC;MACK;EACL,IAAI,SAA8C,MAAM,YAAY;EACpE,IAAI,CAAC,QAAQ;GACX,MAAM,QAAQ,IAAI,QAAQ,GAAG;GAC7B,IAAI,UAAU,IACZ,SAAS,MAAM,eAAe,IAAI,EAAE;QAC/B,IAAI,UAAU,IAAI;IACvB,MAAM,QAAQ,IAAI,MAAM,GAAG,KAAK;IAChC,MAAM,OAAO,IAAI,MAAM,QAAQ,CAAC;IAGhC,SACE,aAAa,IAHI,MAAM,KAInB,MAAM,YAAY,QAClB,MAAM,eAAe,MAAM,GAAG;GAEtC;EACF;EAEA,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,kBAAkB,IAAI,uBAAuB;EAG/D,MAAM,eAAe,qBACnB,KACA,OACA,MAAM,aACN,KACA,QACF;EAEA,IAAI,iBAAiB,IAAI,GAAG,aAAa;GACvC,MAAM,cAAc,uBAAuB,KAAK,KAAuB;GAEvE,KAAK,KAAK,GAAG,aAAa,MAAM,YAAY,EAAE;EAChD,OACE,KAAK,MAAM,MAAM,OAAO;GACtB,MAAM,WAAY,OAAO,UAA4B;GACrD,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,oBAAoB,GAAG,uBAAuB;GAGhE,IAAI,MAAM,QAA8B,KAAA,GAAW;GAEnD,KAAK,KACH,GAAI,SAA+C,IACjD,cACA,MAAM,KACN,KACA,QACF,GACF;EACF;CAEJ;AACF;AASA,MAAM,iBACJ,KACA,OACA,QACA,WACG,qBAAqB,KAAK,OAAO,MAAM,aAAa,QAAQ,MAAM;AAEvE,MAAM,qBAAqB,aAA8B;CACvD,OAAO,OAAO,aAAa,WAAW,WAAWD,aAAW,QAAQ;AACtE;AAEA,MAAM,UACJ,KACA,OAKA,MACA,UACA,QAIG;CAGH,MAAM,WAAW,IAAI,QAAQ,SAAS;CAEtC,IAAI;CAEJ,IAAI,MAAM,QAAQ,IAAI,MAAM,GAAG;EAC7B,QAAQ,GAAG,IAAI,OACZ,IACC,YACK,QACC,IAAI,IAAI,KAAK,UAAU,SAAS,IAAI,QAAQ,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,MAChE,QACC,GAAG,IAAI,KAAK,UAAU,SAAS,IAAI,QAAQ,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,GACpE,CAAC,CACA,KAAK,IAAI;EAEZ,QAAQ,IAAI,MAAM;CACpB,OAAO,IAAIC,eAAa,IAAI,MAAM,GAChC,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ;MAEtC,QAAQ,IAAI,uBAAuB,KAAK,IAAI,MAAM,EAAE;CAGtD,MAAM,aAAa,IAAI,QACpB,KAAK,WACJ,qBAAqB,KAAK,OAAO,MAAM,aAAa,QAAQ,QAAQ,CACtE,CAAC,CACA,KAAK,IAAI;CAEZ,KAAK,KAAK,GAAG,WAAW,IAAI,WAAW,KAAK,WAAW,MAAM,OAAO;AACtE;AC9eA,MAAa,qBAAqB;ACgFlC,MAAa,iBACX,KACA,GACA,OACA,UACA,aACQ;CACR,IAAI,EAAE,YAAY;CAClB,MAAM,QAAQ,EAAE;CAChB,MAAM,EAAE,kBAAkB;CAC1B,MAAM,aAAa,IAAI,GAAG;CAE1B,IAAI,EAAE,YAAY,mBAAmB,WAAW;CAEhD,IAAI;CACJ,IAAI,eACF,CAAC,CAAE,YAAY,SAAS,YAAY,mBAAmB,UACrD,eACE,KACA,GACA,QACA,eACA,SACA,YACA,QACF;CAGJ,MAAM,gBAAgB,QAAQ,KAC3B,WAAW,IAAI,MAAM,OAAO,EAAE,KAAK,QAAQ,OAAO,EACrD;CAEA,IAAI;CACJ,IAAI;CACJ,IAAI,EAAE,SAAS,uBAAuB;EACpC,kBAAkB,CAAC;EACnB,wBAAwB,CAAC;EACzB,KAAK,MAAM,OAAO,EAAE,SAAS,uBAC3B,IAAI,CAAC,QAAQ,SAAS,GAAG,GAAG;GAC1B,MAAM,SAAS,MAAM;GACrB,QAAQ,KAAK,GAAG;GAChB,cAAc,KAAK,IAAI,OAAO,KAAK,QAAQ,IAAI,EAAE;GACjD,gBAAgB,KAAK,OAAO,KAAK,cAA+B;GAChE,sBAAsB,KAAK,GAAG;EAChC;CAEJ;CAEA,IAAI,cAAc,WAAW,GAAG;EAC9B,MAAM,MAAM,OAAO,KAAK,EAAE,KAAK,CAAC,CAAC;EACjC,IAAI,KAAK;GAEP,cAAc,KAAK,IADJ,EAAE,MAAM,IACM,EAAE,KAAK,QAAQ,IAAI;GAIhD,IAAI,MAAM,QAAQ,MAAM,KAAK,MAAM,QAAQ,OAAO,EAAE,GAClD,SAAS,OAAO,UAAU,CAAC,KAAA,CAAS,CAAC;EAEzC;CACF;CAGA,MAAM,eAAe,IAAI;CACzB,MAAM,oBAAoB,MAAM,KAAK,IAAI,MAAM,GAAG,KAAK;CACvD,MAAM,cAAc,2BAA2B,GAAG,MAAM,EAAE;CAC1D,WAAW,eAAe;CAE1B,MAAM,WAA2B;EAC/B;EACA;EACA;EACA;EACA;EACA;EACA,cAAc;EACd,WAAW,eAAeE,uBAAqB,CAAC,IAC9C,cAAc,OAAO,gBAAgB,KACpC,cAAc,SAAS,MAAM,cAAc,KAAK,IAAI,IAAI,MAAM;CACnE;CACA,IAAI,IAAI,KAAK,MAAe,IAAa;CAEzC,MAAM,qBAAqB,kBACzB,KACA,GACA,OACA,UACA,SACA,eACA,qBACF;CAEA,MAAM,SAAS,MAAM,SAAS;CAE9B,IAAI,UAAW,cAAc,CAAC,gBAAgB,CAAC,KAAM,oBACnD,sBAAsB,KAAK,GAAG,OAAO,QAAQ;CAG/C,SAAS,sBAAsB,0CAA0C,CAAC;CAE1E,SAAS,eAAe,IAAI,IAAI;CAEhC,IAAI;CACJ,IAAI,YACF,IAAI,OAAO,SAAS,GAAG;EACrB,MAAM,IAAI,WAAW,MAAM;EAE3B,IAAI,OAAO,EAAE,EAAE,QACb,0BACE,GACA,UACA,IAAIC,SACF,UACE,KACA,IAAI,QACJ,YACA,OAAO,IACP,iBACA,QACF,CACF,CACF;EAGF,IAAI,IAAI,KAAK,uBAAuB,KAAK,CAAC;CAC5C,OAAO;EACL,MAAM,EAAE,IAAI,mBAAmB,eAC7B,KACA,YACA,WAAW,EAAE,IACf;EAEA,MAAM,aAAa,eAAe,IAAI;EAEtC,yBAAyB,MAAM;EAC/B,WAAW,KACT,GAAG,QAAQ,MAAM,qBAAqB,CAAC,CAAC,CAAC,KAAK,QAAQ;GACpD,MAAM,SAAS,MAAM;GACrB,OAAO,SACH,GAAG,uBAAuB,IAAI,OAAO,KAAK,QAAQ,IAAI,KACpD,OAAO,aAET,GAAG,uBAAuB,IAAI,IAAI;EACxC,CAAC,CACH;EAEA,SAAS,gBAAgB,WAAW,WAAW,KAAK,IAAI,EAAE,SAAS,GAAG;CACxE;CAGF,IAAI,CAAC,cAAc,wBAAwB;EACzC,MAAM,iBAAiB;EACvB,eAAe,YAAY,CAAC;EAC5B,eAAe,iBACZ,yBAAyB,MAAM,OAAO,SAAS,YAAY;EAC9D,eAAe,eAAe,yBAC1B,KAAK,uBAAuB,GAAG,cAC5B,MAAM,qBAAqB,CAAC,CAAC,CAC7B,KAAK,IAAI,EAAE,KACd;EAEJ,IAAI,YAAY,IAAI;EAEpB,IAAI,mBADkB,UAAU;EAEhC,IAAI;EACJ,MAAM,EAAE,mBAAmB;EAE3B,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;GACtC,MAAM,aAAa,cAAc,GAAG;GAEpC,IAAI,iBAAiB;GAErB,IAAI,aAAa,UACf,KACA,WACA,YACA,OAAO,IACP,iBACA,UACA,UACF;GACA,IAAI,iBAAiB;GAErB,IAAI,CAAC,QAAQ,aAAa,MAAM,aAAa;GAE7C,IAAI,UAAU,SAAA,OAA6B;IACzC,IAAI,UAAU,SAAS,mBAAA,OACrB,MAAM,IAAI,MACR,uDAAuD,oBACzD;IAGF,IAAI,CAAC,gBAAgB;KACnB,cAAc,KAAK,UAAU;KAG7B,cAAc,QAAQ;KAEtB,UAAU,SAAS;KAEnB,QAAQ,eAAe,OAAO,oBAAoB,GAAG,CAAC;KAGtD,IAAI,OAAO,SAAS,KAAA;KACpB,YAAY,IAAI,SAAS,CAAC;KAC1B,eAAe,UAAU,SAAS;KAClC;KACA;IACF;GACF;GAEA,mBAAmB,UAAU;GAC7B,eAAe,UAAU,KAAK,UAAU;EAC1C;EAEA,IAAI,OAAO;GACT,IAAI,cACF,MAAM,IAAI,uBACR,GACA,+DACF;GAGF,cAAc,QAAQ;GAEtB,MAAM,KAAK,oBAAoB,GAAG,CAAC;GAEnC,6CACE,KACA,SAAS,mBACX;GAEA,OAAO,EACL,MACF;EACF;CACF;CAEA,cAAc,QAAQ;CAEtB,6CACE,KACA,SAAS,mBACX;CAEA,OAAO;EACL,MAAM,IAAI,IAAI,KAAK,GAAG;EACtB,QAAQ,IAAI;CACd;AACF;AAEA,MAAM,qBACJ,KACA,GACA,OACA,UACA,SACA,eACA,0BACY;CACZ,IAAI,CAAC,MAAM,YAAY,OAAO;CAE9B,MAAM,QAAQ,EAAE;CAEhB,IAAI,IAAI,KAAK,aAAa;CAE1B,MAAM,EAAE,WAAW,MAAM;CACzB,IAAI,QACF,IAAI,OAAO,WAAW,UACpB,IAAI,IAAI,KAAK,KAAK,MAAM,OAAO,EAAE,KAAK,QAAQ,OAAO,GAAG;MACnD,IAAI,MAAM,QAAQ,MAAM,GAC7B,IAAI,IAAI,KACN,IAAI,OAAO,QACR,KAAK,MAAM,MACV,OAAO,IAAI,OAAO,MAAM,IAAI,MAAM,KAAK,EAAE,KAAK,QAAQ,KAAK,IAC7D,EACF,EAAE,EACJ;MACK,IAAI,WAAW,QACpB,IAAI,IAAI,KAAK,OAAO,MAAM,KAAK,QAAQ,CAAC;MAExC,IAAI,IAAI,KAAK,kBAAkB,OAAO,WAAW,EAAE;CAKvD,IAAI,WAAW,MAAM,YAAY;EAC/B,IAAI;EAEJ,MAAM,EAAE,UAAU,MAAM;EACxB,IAAI,OACF,IAAI,OAAO,UAAU,UAAU;GAC7B,MAAM,OAAO,MAAM,MAAM,EAAE,KAAK,QAAQ;GACxC,MAAM,kBAAkB,KAAK,gBAAgB,KAAK;EACpD,OAAO,IAAI,YAAY,OACrB,MAAM,gBAAgB,SAAS,eAAe,QAAQ,CACpD,GAAGC,UAAQ,MAAM,MAAM,GACvB,GAAI,yBAAyBC,YAC/B,CAAC;OAED,MAAM,iBAAiB,MAAM,QAAQ,KAAK,MAAM,MAAM;GACpD,MAAM,OAAO,MAAM,KAAK,EAAE,KAAK,QAAQ;GACvC,OAAO,OAAO,IAAI,OAAO,MAAM,IAAI,KAAK,gBAAgB,KAAK;EAC/D,GAAG,EAAE;OAGP,MAAM,gBACJ,SACA,eACA,QACA,qBACF;EAGF,IAAI,IAAI,KAAK,GAAG;EAChB,OAAO;CACT,OAAO,IAAI,MAAM,WAAW,KAAK;EAC/B,MAAM,EAAE,QAAQ,MAAM;EACtB,MAAM,MAAgB,CAAC;EACvB,KAAK,MAAM,OAAO,KAAK;GACrB,MAAM,MAAM,IAAI;GAChB,MAAM,QAAQC,eAAa,GAAG,IAC1B,IAAI,MAAM,KAAK,QAAQ,IACvB,SAAS,IAAI,QAAQ,GAAG;GAE5B,IAAI,KAAK,IAAI,MAAM,IAAI,EAAE,KAAK,QAAQ,IAAI,MAAM,OAAO;EACzD;EAEA,IAAI,IAAI,KAAK,iBAAiB,IAAI,KAAK,IAAI,CAAC;EAC5C,OAAO;CACT,OAAO;EACL,IAAI,IAAI,KAAK,YAAY;EACzB,OAAO;CACT;AACF;AAEA,MAAM,iBACJ,aACS;CACT,MAAM,EAAE,QAAQ;CAEhB,MAAM,YAAY,SAAS,gBACvB,SAAS,YAAY,SAAS,gBAC9B,SAAS;CAEb,MAAM,YAAY,4BAChB,KACA,SAAS,OACT,UACA,SAAS,QACX;CAEA,IAAI,eAAe,UACjB,IAAI,IAAI,KACN,SAAS,gBACT,SAAS,UAAU,KAAK,IAAI,IAC5B,SAAS;CAGb,MAAM,YAAY,iBAChB,KACA,SAAS,GACT,SAAS,OACT,SAAS,mBACT,SAAS,qBACT,UACA,KAAA,GACA,SAAS,YAAY,CAAC,CAAC,IAAI,OAAO,QACpC;CAEA,IAAI,WACF,IAAI,IAAI,SAAS,gBAAgB,eAAe;CAGlD,IAAI,IAAI,KAAK;CAEb,IAAI,WACF,mBAAmB,KAAK,SAAS,KAAK;AAE1C;AAEA,MAAM,kBACJ,KACA,GACA,QACA,eACA,SACA,YACA,aAOG;CACH,MAAM,UAAyB,CAAC;CAChC,KAAK,MAAM,QAAQ,eACjB,OAAO,OAAO,SAAS,IAAI;CAG7B,MAAM,oBAAoB,OAAO,KAAK,OAAO,CAAC,CAAC,QAC5C,QAAQ,CAAC,QAAQ,SAAS,GAAG,CAChC;CAEA,IAAI,aAAa,EAAE,EAAE;CACrB,IAAI,YAAY;EACd,MAAM,6BAAa,IAAI,IAAY;EACnC,MAAM,iBAAiB,WAAW,EAAE;EACpC,IAAI,gBAAgB;GAClB,aAAaC,SAAO,UAAU;GAC9B,MAAM,SAAuB,CAAC;GAC9B,KAAK,MAAM,KAAK,gBACd,IAAI,OAAO,MAAM,YAAY,CAAC,QAAQ,IAAI;IACxC,OAAO,KAAK,CAAC;IACb,WAAW,IAAI,CAAC;GAClB,OAAO,IAAI,OAAO,MAAM,YAAY,cAAc,GAAG;IACnD,MAAM,WAA0B,CAAC;IACjC,KAAK,MAAM,OAAO,EAAE,UAClB,IAAI,CAAC,QAAQ,MAAM;KACjB,SAAS,OAAO,EAAE,SAAS;KAC3B,WAAW,IAAI,GAAG;IACpB;IAEF,OAAO,KAAK,EAAE,UAAU,SAAS,CAAC;GACpC;GAEF,WAAW,EAAE,SAAS;EACxB;EAEA,IAAI,OAAO,QAAQ;GACjB,MAAM,YAAyB,CAAC;GAEhC,MAAM,mCAAmB,IAAI,IAAY;GACzC,OAAO,SAAS,aAAa,MAAM;IACjC,MAAM,gBAAgB,QAAQ,MAAM,CAAC,YAAY,MAAM;IACvD,MAAM,MAAiB,CAAC;IACxB,UAAU,KAAK;IACf,cAAc,SAAS,GAAG,MAAM;KAC9B,IAAI,CAAC,QAAQ,MAAM,CAAC,WAAW,IAAI,CAAC,GAAG;MACrC,iBAAiB,IAAI,CAAC;MACtB,IAAI,KAAK,YAAY,EAAE;KACzB;IACF,CAAC;GACH,CAAC;GAED,KAAK,MAAM,eAAe,kBACxB,WAAW,IAAI,WAAW;GAG5B,SAAS;EACX,OACE,SAAS,CAAC,CAAC,CAAC;EAGd,QAAQ,SAAS,WAAW;GAC1B,IAAI,UAAU,SAAS;IACrB,WAAW,IAAI,MAAM;IAErB,MAAM,WAAW,EACf,UAAU,YACR,KACA,IAAI,QACJ,YACA,QAAQ,SACR,QACF,EACF;IAEA,KAAK,MAAM,OAAO,QAChB,IAAI,KAAK,QAAQ;GAErB;EACF,CAAC;EAED,MAAM,oBAAoB,WAAW,EAAE,QAAQ;EAE/C,IAAI,mBAAmB;GACrB,KAAK,MAAM,OAAO,mBAChB,KAAK,MAAM,OAAO,QAChB,IAAI,KAAK,EACP,UAAU,YACR,KACA,IAAI,QACJ,YACA,QAAQ,MACR,QACF,EACF,CAAC;GAIL,OAAO;IACL,SAAS,CAAC,GAAG,YAAY,GAAG,iBAAiB;IAC7C;IACA;IACA;GACF;EACF;EAEA,OAAO;GAAE,SAAS,CAAC,GAAG,UAAU;GAAG;GAAY;GAAmB;EAAO;CAC3E;CAEA,QAAQ,SAAS,QAAQ,MAAM;EAC7B,IAAI,UAAU,SAAS;GACrB,MAAM,WAAW,EACf,UAAU,YACR,KACA,IAAI,QACJ,YACA,QAAQ,SACR,QACF,EACF;GACA,KAAK,MAAM,OAAO,QAChB,IAAI,KAAK;EAEb;CACF,CAAC;CAcD,OAAO;EACL,YAbiB,kBAChB,KAAK,QACJ,YACE,KACA,IAAI,QACJ,YACC,QAA0B,MAC3B,QACF,CACF,CAAC,CACA,KAAK,IAGG;EACT,SAAS,oBAAoB,CAAC,GAAG,SAAS,GAAG,iBAAiB,IAAI;EAClE;CACF;AACF;AAEA,MAAM,mBACJ,SACA,eACA,QACA,WACW;CACX,MAAM,cAAwB,CAAC;CAE/B,MAAM,UACJ,OAAO,WAAW,WACd,CAAC,MAAM,IACP,MAAM,QAAQ,MAAM,IAClB,CAAC,GAAG,MAAM,IACV,CAAC;CAET,IAAI,QACF,IAAI,OAAO,WAAW,UACpB,QAAQ,KAAK,MAAM;MAEnB,QAAQ,KAAK,GAAG,MAAM;CAI1B,KAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAClC,IAAI,CAAC,QAAQ,SAAS,QAAQ,EAAE,GAC9B,YAAY,KAAK,cAAc,EAAE;CAIrC,OAAO,YAAY,SACf,iBAAiB,YACd,KAAK,WAAW,GAAG,OAAO,cAAc,QAAQ,CAAC,CACjD,KAAK,IAAI,MAGZ,iBAAiB,cAAc,GAAG,cAAc,cAAc;AACpE;AAEA,MAAM,aACJ,KACA,QACA,YACA,KACA,iBACA,UACA,eACG;CACH,MAAM,MAAM,IAAI,KAAK,UACnB,YAAY,KAAK,QAAQ,YAAY,OAAO,QAAQ,CACtD;CAEA,IAAI,iBACF,KAAK,MAAM,MAAM,iBACf,IAAI,KAAK,SAAS,QAAQ,GAAG,CAAC,CAAC;CAInC,IAAI,YAAY,IAAI,KAAK,UAAU;CAEnC,OAAO,IAAI,KAAK,IAAI;AACtB;AAEA,MAAM,eACJ,KACA,QACA,YACA,OACA,aACG;CACH,IAAI,SAAS,OAAO,UAAU,UACxBD;MAAAA,eAAa,KAAK,GACpB,OAAO,MAAM,MAAM,KAAK,QAAQ;OAC3B,IAAI,iBAAkB,YAC3B,OAAO,IAAI,uBAAuB,KAAK,KAAuB,EAAE;OAC3D,IAAI,cAAc,OACvB,OAAO,MAAM;CAAA;CAIjB,OAAO,UAAU,KAAA,IAAY,YAAY,SAAS,QAAQ,KAAK;AACjE;AAEA,MAAa,oBACX,KACA,GACA,MACA,UACA,qBACA,aACA,gBACA,aACuB;CACvB,MAAM,aAAa,eAAe,KAAK,QAAQ,YAAY;CAE3D,MAAM,EAAE,WAAW;CACnB,IAAI,CAAC,EAAE,EAAE,cAAc,CAAC,YAAY,QAAQ,CAAC,QAAQ,UAAU,CAAC,aAAa;EAC3E,MAAM,SAAS,8BAAc,IAAI,IAAI;EAErC,aAAa,KAAK,GAAG,EAAE,GAAG,MAAM;EAEhC,IAAI,gBAAgB;EACpB,OAAO,gBAAgB,KAAK,GAAG,QAAQ;CACzC;CAEA,MAAM,qBACJ,kBAAkB,KAAK,QAAQ,eAAe;CAEhD,IAAI;CACJ,IACE,EAAE,EAAE,cACJ,cACA,sBACA,EAAE,EAAE,gBACJ;EACA,aAAa,IAAI,IAAI,EAAE,EAAE,UAAU;EAEnC,IAAI,YACG;QAAA,MAAM,UAAU,YACnB,IAAI,CAAC,WAAW,IAAI,MAAM,GACxB,WAAW,IAAI,QAAQ,EAAE,QAAQ,OAAO,CAAC;EAAA;EAK/C,IAAI,oBACG;QAAA,MAAM,UAAU,oBACnB,IAAI,CAAC,WAAW,IAAI,MAAM,GACxB,WAAW,IAAI,QAAQ,EAAE,QAAQ,OAAO,CAAC;EAAA;EAM/C,IAAI,EAAE,EAAE,kBAAkB,gBAAgB,UACnC;QAAA,MAAM,UAAUE,iBAAe,CAAU,GAC5C,IAAI,CAAC,WAAW,IAAI,MAAM,GACxB,WAAW,IAAI,QAAQ,EAAE,QAAQ,OAAO,CAAC;EAAA;CAIjD;CAEA,IAAI;CACJ,IAAI,YAAY,QAAQ,QAAQ,QAC9B,MAAM,YACJ,KACA,GACA,MACA,UACA,YACA,UACA,KAAA,GACA,KAAA,GACA,mBACF;CAGF,aAAa,KAAK,GAAG,MAAM,YAAY,WAAW;CAElD,IAAI,CAAC,KAAK,IAAI,gBAAgB;CAE9B,OAAO,gBAAgB,KAAK,GAAG,UAAU,GAAG;AAC9C;AAEA,MAAM,mBACJ,KACA,GACA,UACA,QACuB;CACvB,OACE,QACC,YAAY,IAAI,OAAO,YAAY,EAAE,EAAE,gBAAgB,SAAS,KAAA;AAErE;ACnxBA,SAAgB,mBACd,KACA,OACA,WACA;CACA,IAAI,MAAM,oBAAoB;EAC5B,MAAM,IAAI,WAAW;EACrB,IAAI,EAAE,OACJ,IAAI,IAAI,KAAK,SAAS,SAAS,IAAI,QAAQ,EAAE,KAAK,GAAG;EAEvD,IAAI,EAAE,QACJ,IAAI,IAAI,KAAK,UAAU,SAAS,IAAI,QAAQ,EAAE,MAAM,GAAG;CAE3D,OAAO;EACL,aAAa,IAAI,KAAK,IAAI,QAAQ,KAAK;EAEvC,IAAI,MAAM,UAAU,CAAC,MAAM,YACzB,IAAI,IAAI,KAAK,UAAU,SAAS,IAAI,QAAQ,MAAM,MAAM,GAAG;CAE/D;AACF;AAEA,SAAgB,aAAa,KAAe,QAAmB,GAAc;CAC3E,IAAI,CAAC,EAAE,YACD;MAAA,sBAAsB,EAAE,eAAyB,CAAC,EAAE,WACtD,IAAI,KAAK,SAAS;OACb,IAAI,EAAE,OACX,IAAI,KAAK,SAAS,SAAS,QAAQ,EAAE,KAAK,GAAG;CAAA;AAGnD;ACMA,MAAa,iBACX,KACA,OACA,GACA,UACA,aACQ;CACR,MAAM,iBAAiB,8CAA8C,KAAK;CAE1E,IAAI;EACF,OAAO,mCACL,KACA,OACA,GACA,UACA,QACF;CACF,UAAU;EACR,gDAAgD,OAAO,cAAc;CACvE;AACF;AAEA,MAAM,sCACJ,KACA,OACA,GACA,UACA,aACQ;CACR,MAAM,OAAOC,uBAAqB,KAAK;CACvC,MAAM,QAAQ,2BAA2B,OAAO,EAAE,EAAE;CACpD,WAAW,SAAS;CAEpB,MAAM,MAAgB,CAAC;CAEvB,MAAM,UAAU,EAAE,gBACd,OAAO,YACL,EAAE,cAAc,SAAS,SAAS,OAAO,QAAQ,IAAI,CAAC,CACxD,IACAC;CAEJ,MAAM,sBAAsB,0CAA0C,KAAK;CAI3E,MAAM,8BAAc,IAAI,IAAY;CAKpC,IAAI,EAAE,eACJ,SAAS,KAAK,OAAO,KAAK,SAASA,eAAa,aAAa,QAAQ;CAKvE,IAAI,EAAE,YACJ,YAAY,KAAK,OAAO,KAAK,EAAE,YAAY,SAAS,aAAa,QAAQ;CAG3E,IAAI;CACJ,IAAI,EAAE,YAAY;EAChB,KAAK,MAAM,OAAO,EAAE,WAAW,aAC7B,YAAY,IAAI,GAAG;EAGrB,sBAAsB,wBACpB,KACA,OACA,EAAE,YACF,KACA,aACA,QACF;CACF;CAGA,IAAI,CAAC,IAAI,QACP,sBACE,KACA,OACA,GACA,UACA,MACA,UACA,qBACA,mBACF;MACK;EACL,IAAI,IAAI,KAAK,UAAU,MAAM;EAE7B,IAAI,OACF,IAAI,IAAI,KAAK,KAAK;EAGpB,IAAI,IAAI,KAAK,OAAO,IAAI,KAAK,IAAI,CAAC;EAElC,IAAI;EAEJ,IAAI,qBAAqB;GACvB,IAAI,EAAE,YAAY,QAChB,0BAA0B,KAAK,EAAE,UAAU;GAG7C,IAAI,IAAI,KAAK,QAAQ,mBAAmB;EAC1C,OAAO,IAAI,EAAE,YACX,eAAe,kBAAkB,KAAK,OAAO,GAAG,UAAU,EAAE,UAAU;EAGxE,mBACE,KACA,OACA,GACA,UACA,uBAAuB,EAAE,YACzB,YACF;EAEA,oBACE,KACA,OACA,GACA,UACA,aACA,qBACA,QACF;CACF;CAEA,6CAA6C,KAAK,mBAAmB;CAErE,OAAO,QAAQ,KAAK,UAAU,QAAQ;AACxC;AAEA,MAAM,yBACJ,KACA,OACA,GACA,UACA,MACA,UACA,qBACA,wBACG;CACH,IAAI,CAAC,EAAE,QACL,EAAE,SAAS;CAGb,oBACE,KACA,OACA,GACA,UACA,UACA,qBACA,QACF;CAEA,IAAI,UAAU,QAAQ;CAEtB,MAAM,QAAQ,2BAA2B,OAAO,EAAE,EAAE;CACpD,IAAI,OACF,WAAW,IAAI;CAGjB,IAAI,qBACF,WAAW,KAAK;CAGlB,IAAI,IAAI,KAAK,OAAO;CACpB,sBAAsB,KAAK,OAAO,GAAG,QAAQ;CAC7C,aAAa,IAAI,KAAK,IAAI,QAAQ,CAAC;AACrC;AAGA,MAAM,6BACJ,KACA,eACG;CACH,MAAM,SAAS,gBAAgB,GAAG;CAClC,IAAI,SAAS;CACb,eAAe,KAAK,QAAQ,EAAE,OAAO,WAAW,KAAK,OAAO,CAAC;AAC/D;AAEA,MAAM,qBACJ,KACA,OACA,GACA,UACA,eACuB;CACvB,MAAM,EAAE,QAAQ,OAAO,gBAAgB,KAAK,OAAO,GAAG,YAAY,QAAQ;CAE1E,IAAI,IAAI,KAAK,QAAQ,QAAQ;CAE7B,IAAI,eAAe;CAEnB,IAAI,EAAE,MAAM;EACV,MAAM,UAAU,EAAE,KAAK,SAAS,oBAAI,IAAI,IAAY,IAAI;EAExD,KAAK,MAAM,QAAQ,EAAE,MAAM;GACzB,MAAM,EAAE,QAAQ,OAAO,gBACrB,KACA,OACA,GACA,KAAK,MACL,QACF;GAEA,IAAI,SAAS;IACX,MAAM,MAAM,GAAG,KAAK,OAAO,SAAS;IACpC,IAAI,QAAQ,IAAI,GAAG,GAAG;IACtB,QAAQ,IAAI,GAAG;GACjB;GAEA,IAAI,IAAI,KAAK,GAAG,KAAK,KAAK,GAAG,OAAO,SAAS;GAE7C,IAAI,IACF,eAAe,eAAe,eAAe,UAAU,KAAK;EAEhE;CACF;CAEA,OAAO;AACT;AAEA,MAAM,sBACJ,KACA,OACA,GACA,UACA,MACA,iBACS;CACT,MAAM,0BACJ,EAAE,OAAO,OAAO,KAAA,IAAY,CAAC;CAC/B,MAAM,eAAe,WACnB,KACA,OACA,GACA,UACA,KAAA,GACA,uBACF;CAEA,IAAI,2BAA2B,CAAC,wBAAwB,OACtD,MAAM,IAAI,uBACR,OACA,qCACF;CAGF,MAAM,WAAW,eACb,eACE,eAAe,UAAU,eACzB,eACF;CACJ,IAAI,UACF,IAAI,IAAI,KAAK,SAAS,QAAQ;AAElC;AAEA,MAAM,uBACJ,KACA,OACA,GACA,UACA,SACA,qBACA,aACG;CACH,MAAM,YAAY,iBAChB,KACA,OACA,GACA,UACA,qBACA,UACA,KAAA,GACA,QACF;CAEA,IAAI,WAAW,IAAI,IAAI,KAAK,SAAS,SAAS;AAChD;AAEA,MAAM,eACJ,KACA,OACA,KACA,MACA,SACA,aACA,aACG;CACH,IAAI;CAEJ,KAAK,IAAI,IAAI,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;EACzC,MAAM,OAAO,KAAK;EAClB,IAAI,OAAO,SAAS,YAAY;GAC9B,MAAM,SAAS,KAAK,IAAI;GACxB,IAAI,QAAQ,SAAS,eAAe,QAAQ,MAAM;EACpD,OACE,SAAS,KAAK,OAAO,KAAK,MAAM,SAAS,aAAa,QAAQ;CAElE;CAEA,IAAI,QACF,YAAY,KAAK,OAAO,KAAK,QAAQ,SAAS,aAAa,QAAQ;AAEvE;AAEA,MAAM,YACJ,KACA,OACA,KACA,MACA,aACA,aACA,aACG;CACH,MAAM,aAAa,IAAI,GAAG;CAC1B,MAAM,QAAQ,MAAM;CAEpB,KAAK,MAAM,OAAO,MAAM;EACtB,IAAI,YAAY,IAAI,GAAG,GACrB;EAGF,YAAY,IAAI,GAAG;EAEnB,MAAM,QAAQ,KAAK;EACnB,IAAI,UAAU,KAAA,KAAa,OAAO,aAAa;EAE/C,IAAI,KACF,IAAI,MAAM,IAAI,CAAC,KAAK,QAAQ,IAAI,MAAM,aACpC,KACA,OACA,YACA,KACA,OACA,QACF,GACF;CACF;AACF;AAEA,MAAM,gBACJ,KACA,OACA,YACA,KACA,OACA,aACG;CACH,IAAI,SAAS,OAAO,UAAU,UACxBC;MAAAA,eAAa,KAAK,GACpB,OAAO,MAAM,MAAM,KAAK,QAAQ;OAC3B,IAAI,iBAAkB,YAAsB;GACjD,MAAM,WAAW;GACjB,IAAI,SAAS,EAAE,aAAa,GAC1B,OAAO,YAAY,KAAK,OAAO,SAAS,GAAG,QAAQ;GAGrD,OAAO,IAAI,uBACT,KACA,QACF,EAAE;EACJ,OAAO,IAAI,QAAQ,SAAS,SAAS,OACnC,OAAO,IAAK,MAAM,MAAuB,IAAI,CAAC,KAAK,QAAQ,IAAI,IAC5D,MAAyB,GAC3B,GAAG,SAAS,IAAI,QAAS,MAA2B,GAAG;CAAA;CAI5D,OAAO,SAAS,IAAI,QAAQ,KAAK;AACnC;AAGA,MAAM,2BACJ,KACA,OACA,YACA,KACA,aACA,aACG;CACH,MAAM,QAAQ,MAAM;CAEpB,MAAM,0BAAU,IAAI,IAAY;CAChC,MAAM,YAAsB,CAAC;CAC7B,MAAM,oBAA8B,CAAC;CACrC,MAAM,EAAE,SAAS;CAEjB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACpC,MAAM,MAAM,KAAK;EACjB,MAAM,QAAkB,CAAC;EACzB,IAAI,YAAY;EAEhB,KAAK,MAAM,OAAO,KAAK;GACrB,IAAI,QAAQ,IAAI;GAChB,IAAI,UAAU,KAAA,GACZ;GAGF,MAAM,SAAS,MAAM;GACrB,MAAM,aAAa,OAAO,KAAK,QAAQ;GAEvC,IAAI,OAAO,KAAK,SAAS;GACzB,sBAAsB,OAAO,QAAQ,GAAG;GAExC;GAEA,IAAIA,eAAa,KAAK,GACpB,MAAM,KAAK,MAAM,MAAM,KAAK,QAAQ,CAAC;QAChC;IACL,IAAI,OAAO,KAAK,UAAU,UAAU,MAClC,QAAQ,OAAO,KAAK,OAAO,KAAK;IAGlC,MAAM,KAAK,SAAS,IAAI,QAAQ,KAAK,CAAC;GACxC;GAIA,IAAI,MAAM,GAAG;IACX,QAAQ,IAAI,GAAG;IACf,MAAM,MAAM,SAAS,MAAM,KAAK,OAAO;IACvC,kBAAkB,KAAK,IAAI,WAAW,EAAE;IAExC,IAAI,CAAC,YAAY,IAAI,GAAG,GACtB,IAAI,KAAK,IAAI,MAAM,IAAI,CAAC,KAAK,QAAQ,IAAI,WAAW,WAAW,EAAE;GAErE,OAAO,IAAI,CAAC,QAAQ,IAAI,GAAG,GACzB,wBAAwB,OAAO,SAAS,KAAK,CAAC;EAElD;EAEA,IAAI,YAAY,QAAQ,MACtB,wBAAwB,OAAO,SAAS,KAAK,CAAC;EAGhD,UAAU,KAAK,IAAI,MAAM,KAAK,IAAI,EAAE,EAAE;CACxC;CAEA,OAAO,WAAW,UAAU,KAAK,IAAI,EAAE,QAAQ,kBAAkB,KAC/D,IACF,EAAE;AACJ;AAEA,MAAM,2BACJ,OACA,SACA,KACA,MACG;CACH,MAAM,IAAI,uBACR,OACA,OAAO,EAAE,gDAAgD,CAAC,GAAG,OAAO,CAAC,CAAC,KACpE,IACF,EAAE,WAAW,OAAO,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,EAC3C;AACF;ACneA,MAAa,iBACX,KACA,OACA,GACA,UACA,aACQ;CACR,MAAM,OAAOC,uBAAqB,KAAK;CACvC,IAAI,IAAI,KAAK,eAAe,MAAM;CAElC,MAAM,QAAQ,2BAA2B,OAAO,EAAE,EAAE;CACpD,IAAI,OACF,IAAI,IAAI,KAAK,KAAK;CAGpB,MAAM,sBAAsB,0CAA0C,KAAK;CAE3E,IAAI,YAAY,iBACd,KACA,OACA,GACA,UACA,qBACA,UACA,KAAA,GACA,QACF;CAEA,MAAM,kBAAkB,oCACtB,KACA,OACA,mBACF;CAEA,IAAI,OAAO,EAAE;CACb,IAAI,iBAAiB;EACnB,aACG,YAAY,YAAY,OAAO,MAAM,gBAAgB;EAExD,OAAO,OAAO,CAAC,GAAG,MAAM,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,IAAI;EAErE,IAAI;GACF,GAAG;GACH,cAAc;IACZ,GAAG,EAAE;KACJ,gBAAgB,cAAc;GACjC;EACF;CACF;CAEA,IAAI;CACJ,IAAI,MAAM,QAAQ;EAChB,MAAM,UAAoB,CAAC;EAC3B,MAAM,MAAgB,CAAC;EAEvB,MAAM,UAAU,KAAK,SAAS,oBAAI,IAAI,IAAY,IAAI;EAEtD,KAAK,MAAM,QAAQ,MAAM;GACvB,MAAM,UAAU,OAAO,KAAK,QAAQ,KAAK,KAAK;GAC9C,IAAI,SAAS;IACX,IAAI,gBAAgB,OAAO,GACzB;IAGF,MAAM,IAAI,uBACR,OACA,yCACF;GACF;GAEA,MAAM,OAAO,gBAAgB,KAAK,OAAO,GAAG,KAAK,MAAM,QAAQ;GAE/D,MAAM,MAAM,GAAG,KAAK,SAAS,KAAK;GAClC,IAAI,SAAS;IACX,IAAI,QAAQ,IAAI,GAAG,GAAG;IACtB,QAAQ,IAAI,GAAG;GACjB;GACA,QAAQ,KAAK,KAAK,MAAM;GACxB,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;EAC/B;EAEA,IAAI,QAAQ,QACV,IAAI,IAAI,KAAK,SAAS,QAAQ,KAAK,IAAI,GAAG;EAG5C,aAAa,IAAI,KAAK,OAAO;CAC/B;CAEA,IAAI;CAEJ,IAAI,CAAC,iBAAiB,iBAAiB;EACrC,0BAA0B,CAAC;EAC3B,sBAAsB,KAAK,OAAO,GAAG,UAAU,uBAAuB;CACxE;CAEA,IAAI,YACF,IACE,CAAC,iBAAiB,oBACjB,EAAE,KAAK,UAAU,EAAE,IAAI,UAAU,EAAE,SAEpC,IAAI,IAAI,KAAK,OAAO,UAAU;MAE9B,IAAI,IAAI,KAAK,SAAS,UAAU;MAE7B,IAAI,CAAC,EAAE,OAAO,CAAC,yBAAyB,OAC7C,MAAM,IAAI,uBACR,OACA,qCACF;CAGF,IAAI,WACF,IAAI,IAAI,KAAK,aAAa,SAAS;CAGrC,OAAO,QAAQ,KAAK,UAAU,QAAQ;AACxC;ACpIA,MAAa,mBACX,KACA,OACA,UACA,aACG;CACH,IAAI,IAAI,KAAK,UAAU;CAEvB,IAAI,SAAS,QAAQ;EACnB,MAAM,UAAU,UAAU,KAAK,SAC7B,iBAAiB,KAAK,MAAM,GAAG,MAAM,EAAE,aAAa,MAAM,QAAQ,CACpE;EACA,IAAI,IAAI,KAAK,OAAO,SAAS,KAAK,IAAI,KAAK,GAAG,EAAE;CAClD;AACF;ACuDA,MAAa,sBACX,KACA,MACA,SACA,KACA,aACW;CACX,KAAK,MAAM,MAAM,SAAS;EACxB,MAAM,SAAS,QAAQ;EAEvB,MAAM,OAAO,cAAc,KAAK,MAAM,QAAQ,QAAQ;EACtD,OAAO,YAAY,YAAY,KAAK,MAAM,MAAM,QAAQ,QAAQ;EAEhE,IAAI;EACJ,IAAI;EACJ,IAAI,WAAW,QAAQ;GACrB,KAAK;GACL,QAAQ,OAAO;EACjB,OAAO,IAAI,gBAAgB,QAAQ;GACjC,KAAK;GACL,QAAQ,OAAO;EACjB,OAAO,IAAI,iBAAiB,QAAQ;GAClC,KAAK;GACL,QAAQ,OAAO;EACjB,OAAO;GACL,KAAK;GACL,QAAQ,OAAO;EACjB;EAEA,IAAI;EACJ,IAAI,OAAO,UAAU,UAAU;GAC7B,IAAI,OAAO,KAAK,KAAK;GACrB,WAAW,IAAI,IAAI,OAAO;EAC5B,OACE,WAAW,GAAG,MAAM,MAAM,KAAK,QAAQ;EAGzC,OAAO,KAAK,GAAG,GAAG,KAAK,IAAI,SAAS,KAAK,GAAG;CAC9C;CACA,OAAO;AACT;AAEA,MAAa,iBACX,KACA,MACA,QACA,aACW;CACX,OAAQ,OAAO,YACb,oBAAoB,SAChB,qBACE,KACA,MACA,KAAK,aACL,OAAO,gBACP,QACF,IACAC,WAAS,OAAO,QAAQ,IACtB,OAAO,SAAS,MAAM,GAAG,IACzB,SAAS,IAAI,QAAQ,OAAO,YAAY,KAAK,YAAY,SAAS;AAC5E;AAEA,MAAa,iBACX,KACA,MACA,QACA,UACA,gBACuB;CACvB,IAAI,MAAM,OAAO;CACjB,IAAI,KAAK,OAAO;CAEhB,IAAI,QAAQ,QACV,IAAI,OAAO,OAAO,OAAO,UACvB,MAAM,qBACJ,KACA,MACA,KAAK,aACL,OAAO,IACP,QACF;MACK,IAAI,MAAM,QAAQ,OAAO,EAAE,GAChC,MAAM,kBAAkB,OAAO,GAC5B,KAAK,WACJ,qBAAqB,KAAK,MAAM,KAAK,aAAa,QAAQ,QAAQ,CACpE,CAAC,CACA,KAAK,IAAI,EAAE;MACT;EACL,MAAM,CAAC;EACP,KAAK,MAAM,OAAO,OAAO,IACvB,IAAI,KACF,qBAAqB,KAAK,MAAM,KAAK,aAAa,KAAK,QAAQ,CACjE;CAEJ;MACK,IAAI,YAAY,QAAQ;EAC7B,IAAI,aACF,MAAM,IAAI,MACR,oEACF;EAGF,MAAM,qBACJ,KACA,MACA,KAAK,aACL,OAAO,QACP,QACF;CACF,OACE,IAAI,OAAO,OAAO,SAAS,UACzB,MAAM,SAAS,IAAI,QAAQ,OAAO,IAAI;MAEtC,MAAM,OAAO,KAAK,MAAM,KAAK,QAAQ;CAIzC,OAAQ,OAAO,UAAU;AAC3B;AAEA,MAAM,eACJ,KACA,MACA,MACA,QACA,aACW;CACX,MAAM,OAAO,cAAc,KAAK,MAAM,QAAQ,QAAQ;CAEtD,IAAI,QAAQ,QACV,IAAI,OAAO,OAAO,OAAO,YAAY,MAAM,QAAQ,OAAO,EAAE,GAC1D,OAAO,eAAe,KAAK,IAAI,KAAK;MAC/B;EACL,IAAI,WAAW;EACf,IAAI,IAAI;EACR,KAAK,MAAM,OAAO,OAAO,IACvB,YACG,WAAW,GAAG,SAAS,QAAQ,MAChC,yBAAyB,KAAK,IAAI,KAAK,KAAK,KAAK,SAC/C,IAAI,QACJ,OAAO,GAAG,IACZ,EAAE;EAEN,OAAO;CACT;MACK,IAAI,YAAY,QACrB,OAAO;MAEP,OAAO,eAAe,KAAK,IAAI,KAAK;AAExC;AC3NA,MAAa,uBAAuB,MAAkB;CACpD,IACG,EAAE,EAAE,cAAc,EAAE,EAAE,eAAe,SACtC,EAAE,EAAE,oBACJ,EAAE,EAAE,KAAK,UACT,EAAE,EAAE,IAAI,UACR,EAAE,EAAE,QAEJ,OAAO;CAGT,OAAO,CADM,OAAO,KAAK,EAAE,CAChB,CAAC,CAAC,MAAM,QAAQ,0BAA0B,SAAS,GAAG,CAAC;AACpE;AAEA,MAAM,4BAAiD;CACrD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AClBA,IAAI;AAEJ,MAAa,iBACX,KACA,OACA,MACA,aAC+B;CAC/B,IAAI,MAAM;CAEV,MAAM,OAAO,QAAQ,KAAK,OAAO,MAAM,QAAQ;CAC/C,OAAO;CAEP,IAAI,KAAK,SACP,MAAM,mBAAmB,KAAK,MAAM,KAAK,SAAS,KAAK,QAAQ;CAGjE,IAAI,IAAI,KAAK,GAAG;CAEhB,IAAI,WAAW;EACb,MAAM,KAAK;EACX,YAAY,KAAA;EACZ,OAAO;CACT;AAEF;AAEA,MAAM,WACJ,KACA,OACA,MACA,aACG;CACH,YAAY,KAAA;CAEZ,IAAI,KAAK,MAAM;EACb,MAAM,EAAE,SAAS;EACjB,IAAI,MAAM,QAAQ,IAAI,GACpB,OAAO,KACJ,KAAK,SAAS,UAAU,KAAK,OAAO,MAAM,MAAM,QAAQ,CAAC,CAAC,CAC1D,KAAK,IAAI;EAGd,OAAO,UAAU,KAAK,OAAO,MAAM,MAAM,QAAQ;CACnD;CAEA,IAAI,MAAMC,uBAAqB,KAAK;CACpC,MAAM,QAAQ,2BAA2B,OAAO,KAAK,EAAE;CAEvD,IAAI,OACF,OAAO,IAAI;CAGb,IAAI,KAAK,MAAM,MAAM,QAAQ;CAE7B,OAAO;AACT;AAEA,MAAM,aACJ,KACA,OACA,MACA,MACA,aACG;CACH,IAAI;CACJ,IAAI;CACJ,IAAI,OAAO,SAAS,UAClB,IAAIC,eAAa,IAAI,GACnB,MAAM,KAAK,MAAM,KAAK,QAAQ,IAAI,MAAM;MACnC;EACL,OAAO,KAAK,EAAE;EAEd,IAAI,CAAC,KAAK,OACR,MAAM,IAAI,uBAAuB,KAAK,IAAI,EAAE;OAGzC,IAAI,CAAC,oBAAoB,IAAI,GAChC,MAAM,IAAI,uBAAuB,KAAK,IAAI,EAAE,IAC1C,YAAY,IAAIC,aAAW,IAAI,EAAE;OAGnC,MAAM,6BAA6B,IAAI;EAGzC,YAAY;CACd;MAEA,MAAM,oBAAoBC,iBAAe,KAAK,GAAG,IAAI;CAGvD,QAAQ,SAAS,KAAA,IAAY,KAAK,OAAO,QAAQ,QAAQ,QAAQ;AACnE;ACrGA,MAAa,iBACX,KACA,OACA,aACG;CACH,MAAM,aAAa,YAAY,KAAK,OAAO,QAAQ;CACnD,IAAI,YAAY,QAAQ,IAAI,IAAI,KAAK,UAAU,UAAU;AAC3D;AAEA,MAAa,eACX,KACA,OACA,aACuB;CACvB,OAAO,MAAM,QACT,KAAK,OACL,SAAS,GAAG,KACR,qBAAqB,IAA2B,KAAK,QAAQ,IAC7D,GACG,KAAK,SAAU,KAAoB,MAAM,KAAK,QAAQ,CAAC,CAAC,CACxD,KAAK,OAAO,CACrB,CAAC,CACA,KAAK,OAAO;AACjB;ACnBA,MAAa,kBACX,KACA,MACA,UACA,UACG;CACH,IAAI,IAAI,KACN,YAAY,MACT,KAAK,SAAS,aAAa,KAAK,MAAM,MAAM,QAAQ,CAAC,CAAC,CACtD,KAAK,IAAI,GACd;AACF;AAEA,MAAa,gBACX,KACA,MACA,OACA,aACG;CACH,IAAI,OAAO,UAAU,UACnB,OAAO,SAAS,KAAK,MAAM,OAAO,QAAQ;CAG5C,IAAIC,eAAa,KAAK,GACpB,OAAO,MAAM,MAAM,KAAK,QAAQ;CAGlC,MAAM,MAAgB,CAAC;CACvB,KAAK,MAAM,OAAO,OAAO;EACvB,MAAM,QAAQ,MAAM;EACpB,IAAI,KAAK,SAAS,KAAK,MAAM,KAAK,UAAU,KAAgB,CAAC;CAC/D;CACA,OAAO,IAAI,KAAK,IAAI;AACtB;AAEA,MAAM,YACJ,KACA,MACA,QACA,UACA,QACW;CACX,IAAI,KAAK,UAAU,SAAS;EAC1B,MAAM,SAAS,KAAK,QAAQ;EAC5B,MAAM,QACJ,QACC,CAAC,OAAO,SAAS,OAAO,UAAU,OAAOC,gBAAc,OAAO;EAEjE,OAAO,GAAG,MAAM,eAAe,eAAe,UAAU,GACtD,MAAM,UAAU,GAAG,SAAS,IAAI,QAAQ,IAAI,MAAM,QAAQ,EAAE,EAAE,MAAM,KACnE,OAAO,UAAU,KAAK,OAAO,GAC9B,MAAM,kBAAkB,KAAA,IACpB,KAAK,SAAS,IAAI,QAAQ,MAAM,aAAa,MAC7C,GACL,IAAI,MAAM,OAAO;CACpB;CAEA,OAAO,GAAG,qBAAqB,KAAK,MAAM,KAAK,aAAa,QAAQ,UAAU,IAAI,EAAE,GAClF,OAAO;AAEX;ACpDA,MAAa,eACX,KACA,MACA,QACA,aACG;CACH,IAAI,OAAO,WAAW,UAAU,OAAO,IAAI,OAAO;CAElD,IAAIC,eAAa,MAAM,GAAG,OAAO,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;CAEjE,MAAM,MAAgB,CAAC;CACvB,IAAI,OAAO,aACT,IAAI,KACF,gBACE,MAAM,QAAQ,OAAO,WAAW,IAC5B,OAAO,YACJ,KAAK,gBACJ,iBACE,KACA,MACA,KAAK,aACL,aACA,UACA,KAAA,GACA,IACF,CACF,CAAC,CACA,KAAK,IAAI,IACZ,iBACE,KACA,MACA,KAAK,aACL,OAAO,aACP,UACA,KAAA,GACA,IACF,GAER;CAGF,IAAI,OAAO,OACT,IAAI,KAAK,YAAY,aAAa,KAAK,MAAM,OAAO,OAAO,QAAQ,GAAG;CAGxE,OAAO,IAAI,IAAI,KAAK,GAAG,EAAE;AAC3B;AChCA,MAAa,gBACX,KACA,OACA,aACG;CACH,MAAM,EAAE,MAAM;CACd,MAAM,IAAI,uBAAuB,KAAK,CAAC;CACvC,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,EAAE;CAEnC,KAAK,MAAM,KAAK,MAAM,GAAG;EACvB,MAAM,IAAIC,eAAa,EAAE,CAAC,IACtB,EAAE,EAAE,MAAM,KAAK,QAAQ,IACvB,uBAAuB,KAAK,EAAE,CAAC;EACnC,IAAI,IAAI,KAAK,GAAG,EAAE,EAAE,GAAG,EAAE,IAAI,IAAI,MAAM,IAAI,KAAK;CAClD;AACF;AC5CA,MAAa,cACX,KACA,GACA,MACA,aACG;CACH,IAAI,EAAE,QAAQ,SAAS,YAAY,CAAC,EAAE,eAAe;EACnD,IAAI,IAAI,KAAK,OAAO,EAAE,IAAI,IAAI;EAC9B,MAAM,EAAE,eAAe,EAAE;EACzB,IAAI,YACF,IAAI,IAAI,KACN,MACAC,eAAa,UAAU,IACnB,WAAW,MAAM,KAAK,QAAQ,IAC9B,WAAW,KAAK,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAC/C;EAEF,IAAI,EAAE,IAAI,MAAM,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI;CACzC;AACF;AC+FA,MAAa,SACX,OACA,MACA,QACA,UACA,SACA,cACA,qBACG;CACH,MAAM,QAAQ,MAAM;CACpB,MAAM,MAAgB,CAAC;CACvB,MAAM,SAAS,QAAQ,UAAU,CAAC;CAClC,MAAM,MAAgB;EACZ;EACR,IAAI,MAAM;EACV,GAAG;EACH;EACA;EACA,YAAY,QAAQ;EACpB,gBAAgB,QAAQ;EACxB,cAAc,QAAQ;EACtB,eAAe;EACf;CACF;CAEA,IAAI,QACE;MAAA,MAAM,OAAO,eAAe;CAAA,OAC3B;EACL,IAAI,SAAS;EACb,IAAI,CAAC,cACH,wBAAwB,MAAM,SAAS,aAAa,SAAS,CAAC,EAAE,MAAM;CAE1E;CAEA,UAAU,KAAK,MAAM,IAAI;CAEzB,IAAI;CAEJ,IAAI;CACJ,IAAI;CAEJ,IAAI;CAEJ,IAAI,MAAM,OAAO;EACf,IAAI;EACJ,IAAI,UACF,KAAK,WAAW,gBAAgB,GAAG;OAEnC,KAAK,IAAI,SAAS,gBAAgB,GAAG;EAEvC,KAAK,MAAM,MAAM,MAAM,OACrB,GAAG,EAAE;CAET;CAEA,IAAI,QAAQ,SAAS,UAAU;EAC7B,MAAM,YAAY,MAAM,SAAS,MAAM;EACvC,IAAI,CAAC,WAAW,MAAM,IAAI,MAAM,wBAAwB,MAAM;EAE9D,IAAI,SAAS,UACX,SAAS,cAAc,KAAK,OAAO,OAAO,IAAI,UAAU,IAAI,QAAQ;OAC/D;GACL,MAAM,WAAW,IAAI,MAAM,MAAM,UAAU;GAE3C,IAAI,SAAS,UACX,SAAS,cAAc,KAAK,OAAO,OAAO,UAAU,QAAQ;QACvD,IAAI,SAAS,UAClB,SAAS,cAAc,KAAK,OAAO,OAAO,UAAU,QAAQ;QAE5D,MAAM,IAAI,MAAM,0BAA0B,MAAM;EAEpD;CACF,OAAO;EACL,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,IAAI,SAAS,UAAU;GACrB,MAAM,eAAe,MAAM,gBAAgB,MAAM;GACjD,IAAI,YAAY,MAAM,cAAc;IAClC,aAAa;IAEb,MAAM,iBAAiBC,SAAO,KAAc;IAG5C,IAAI,eAAe,EAAE,eAAe,cAClC,eAAe,EAAE,aAAa;SACzB,IAAI,eAAe,EAAE,eAAe,gBACzC,eAAe,EAAE,aAAa;IAGhC,MAAM,EAAE,IAAI,SAAS,iBAAiB,2BACpC,OACA,KACA,gBACA,eAAe,WAAW,IAC5B;IACA,MAAM,mBAAmB,SAAS,OAAO,GAAG,EAAE,CAAC;IAE/C,eAAe,EAAE,KAAK,eAAe,EAAE,SAAS,KAAA;IAEhD,eAAe,EAAE,MAAM,CAErB,IAAIC,SAAO,8BAA8B,GAAG,GAAG,CACjD;IAEA,IAAI,MAAM,cAAc;KACtB,MAAM,aAAa,MAAM,aAAa;KACtC,eAAa,gBAAyB,UAAmB;KACzD,eAAe,EAAE,OAAO;IAC1B;IAEA,eAAe,EAAE,OAAO,MAAM;IAC9B,eAAe,EAAE,gBAAgB,MAAM;IACvC,eAAe,EAAE,QAAQ,MAAM;IAE/B,MAAM,EAAE,SAAS,kBAAkB,2BACjC,OACA,KACA,gBACA,QACF;IAEA,IAAI,KAAK,aAAa,QAAQ,GAAG,aAAa,cAAc,QAAQ,CAAC;GACvE,OAAO;IACL,MAAM,SAASD,SAAO,KAAK;IAC3B,OAAO,EAAE,eAAe;IAExB,OAAO,EAAE,SAAS,KAAA;IAClB,iBAAiB,gBAAgB;KAC/B,IAAI,YAAY,UAAU;MACxB,OAAO,EAAE,eAAe,KAAA;MACxB,IAAI,YAAY,WAAW,GACzB,MAAM,IAAI,oBACR,QACA,4CAA4C,YAAY,SAAS,OACnE;MAEF;KACF;KAEA,OAAO,OACJ,MAAM,YAAY,EAAE,OAAO,EAAE,CAAC,CAC9B,cAAc;MACb,OAAO,EAAE,eAAe,KAAA;KAC1B,CAAC;IACL;IAEA,IAAI,cAAc;KAChB,MAAM,SAAS,MAAM,OAAO,UAAU,QAAQ,QAAQ;KACtD,IAAI,UAAU,QACZ,OAAO,gBAAgB;KAEzB,OAAO;IACT;GACF;EACF;EAEA,MAAM,YACH,MAAM,MAAM,MAAM,UAAU,IAAI,MAAM,MAAM,MAAM,MAAM;EAE3D,IAAI,MAAM,OACR,aAAa,KAAK,MAAM,OAAO,QAAQ;OAClC,IAAI,CAAC,YAAY;GACtB,mBAAmB,IAAI;GACvB,IAAI,KAAK,QAAQ;GAEjB,IAAI,MAAM,UACR,gBAAgB,KAAK,OAAO,MAAM,UAAU,QAAQ;GAGtD,eAAe,IAAI,SAAS;GAE5B,MAAM,UAAU,MAAM,QAAQ,CAAC,IAAI,KAAA;GACnC,oBAAoB,KAAK,OAAO,OAAO,UAAU,UAAU,OAAO;GAElE,aACI,MAAM,SAAS,MAAM,SACrB,cAAc,KAAK,OAAO,OAAO,QAAQ,KAC3C,KAAA;GAEF,IAAI,MAAM,MACR,YACE,KACA,OACA,OACA,QACF;GAGF,IAAI,MAAM,OAAO,MAAM,MAAM,MAAM,QACjC,sBAAsB,KAAK,OAAO,OAAO,QAAQ;GAGnD,IAAI,MAAM,OAAO;IACf,MAAM,QAAQ,MAAM,MAAM,KAAK,SAAS;KACtC,IAAIE,eAAa,IAAI,GACnB,OAAO,KAAK,MAAM,KAAK,QAAQ;UAC1B;MACL,MAAM,IAAK,QAAqB,QAAQ,IAAc;MACtD,OAAO,MAAM,KACT,IAAI,IACJ,qBACE,KACA,MAAM,GACN,MAAM,OACN,MACA,QACF;KACN;IACF,CAAC;IACD,IAAI,KAAK,YAAY,MAAM,KAAK,IAAI,GAAG;GACzC;GAEA,IAAI,MAAM,QAAQ,cAAc,KAAK,OAAO,QAAQ;GAEpD,IAAI,MAAM,QAAQ;IAChB,MAAM,SAAmB,CAAC;IAC1B,KAAK,MAAM,QAAQ,MAAM,QACvB,KAAK,MAAM,OAAO,MAChB,OAAO,KACL,IAAI,IAAI,OAAO,YAAY,KAAK,OAAO,KAAK,MAAM,QAAQ,GAC5D;IAGJ,IAAI,KAAK,UAAU,OAAO,KAAK,IAAI,GAAG;GACxC;EACF;EAEA,IAAI,MAAM,OACR,eAAe,KAAK,OAAO,UAAU,MAAM,KAAK;EAGlD,mBAAmB,KAAK,OAAO,SAAS;EAExC,WAAW,KAAK,OAAO,MAAM,QAAQ;EAErC,aACE,KACA,OACA,OACA,MAAM,YACN,KAAA,GACA,gBACF;EAIA,IAAI,iBAAiB,KAAA,KAAa,IAAI,YAAY,QAChD,IAAI,iBAAiB,MAAM,IAAI,WAAW,KAAK,IAAI;EAGrD,IAAI,qBAAqB,KAAA,KAAa,CAAC,YAAY,IAAI,OAAO,UAAU;GACtE,IAAI,oBAAoB,MAAM,IAAI;GAClC,6BAA6B;EAC/B;EAEA,SAAS,QAAQ,KAAK,MAAM,UAAU,aAAa;CACrD;CAEA,IAAI,CAAC,IAAI,SAAS;EAChB,OAAO,YAAY,IAAI,OAAO;EAC9B,IAAI,CAAC,QACH,4CAA4C,KAAK,MAAM;CAE3D;CAEA,IAAI,CAAC,UACC;MAAA,IAAI,OAAO,YAAY,UAAU,QAAQ;GAC3C,OAAO,WAAW,IAAI,OAAO;GAE7B,IAAI,IAAI,OAAO,SAAS,WAAW;IACjC,IAAI,4BACF,OAAO,QAAQ;IAGjB,MAAM,EAAE,YAAY,gBAAgB,IAAI,OAAO;IAE/C,MAAM,YAAY,CAChB,GAAI,aACA,OAAO,QAAQ,UAAU,CAAC,CAAC,KACxB,CAAC,SAAS,UACT,IAAI,QAAQ,sBAAsB,cAChC,KACA,SACA,KAAK,OACL,OACA,IACF,EAAE,UAAU,QAAQ,GACxB,IACAC,cACJ,GAAI,cACA,OAAO,QAAQ,WAAW,CAAC,CAAC,KACzB,CAAC,SAAS,UACT,KAAK,QAAQ,eACX,WAAW,OACP,0BAA0B,QAAQ,OAAO,KAAK,UAC9C,YAAY,QAAQ,KAAK,KAAK,YAAY,UAAU,QAAQ,YACjE,oCACL,IACAA,YACN;IAEA,OAAO,QAAQ,qBAAqB,SAAS,OAC3C,IAAI,iBAAiB,CACvB,EAAE,oBAAoB,UAAU,KAAK,IAAI,EAAE;GAC7C;EACF;;CAGF,IAAI,UAAU,QAAQ,aAAa,KAAK,QAAQ,QAAQ;CAExD,OAAO;AACT;ACjYA,MAAM,aAAa,SAA2B;CAC5C,OAAO;EAAE,GAAG,IAAI,EAAE;EAAY,GAAG,IAAI,EAAE;CAAa;CACpD,OAAO,CAAC;CACR,QAAQ,CAAC;AACX;AAEA,MAAa,iBAAiB,EAC5B,QAAQ,EAAE,eACwB,QAAQ,OAAO;AAEnD,MAAa,iBAAiB,EAAE,UAAoB,SAAkB;CACpE,IAAI,OAAO,QACT,IAAI,MACF,OAAO,OAAO,OAAO,SAAS;MAE9B,OAAO,SAAS,KAAA;AAGtB;AAEA,MAAa,aAAa,KAAe,SAA2B;CAClE,IAAI,CAAC,MAAM;CAEX,KAAK,MAAM,QAAQ,MAAM;EACvB,MAAM,QAAQ,KAAK,IAAI,WAAW;EAClC,IAAI,QAAQ,IAAI,UAAU,KAAK,GAAG,EAAE,MAClC,YAAU,OAAO,KAAK,KAAK,GAAG,KAAK,EAAE,EAAE,MAAM,KAAK,CAAC;OAEnD,kBAAkB,OAAO,KAAK,MAAM,KAAK,GAAG,EAAE,IAAI;CAEtD;AACF;AAEA,MAAa,kBACX,KACA,MACA,MACA,qBACgC;CAChC,IAAI;CAEJ,IAAI;CACJ,IAAI,OAAO,KAAK,MAAM,UACpB,KAAK,KAAK;MAEV,IAAI,QAAQ,IAAI,QAAQ;EACtB,MAAM,SAAU,IAAI,OAAO,WAAW,UAAU,GAAG;EACnD,KAAKC,eAAa,OAAO,OAAO,KAAK,IAAI;EACzC,KAAK,EAAE,EAAE;CACX,OAEE,MAAM,IAAI,MAAM,qBAAqB;CAIzC,IAAI,KAAK,GACP,QAAQC,aACN,MAAM,KAAK,GAAG,MAAM,IAAI,QAAQ,MAAM,IAAI,KAAA,GAAW,gBAAgB,CACvE;MAEA,QAAS,KAAK,EAAiB,MAAM,IAAI,QAAQ,IAAI,GAAG,EAAE;CAG5D,MAAM,IAAI,KAAK,KAAMC;CACrB,OAAO;EACL;EACA,KAAK,GAAG,EAAE,YAAY,eAAe,GAAG,GAAG,GAAG,GAC5C,EAAE,UAAU,IAAI,EAAE,QAAQ,KAAK,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,KAAK,GAChE,MACC,EAAE,eACE,kBACA,EAAE,kBACA,sBACA,GACP,GAAG,MAAM;CACZ;AACF;AAEA,MAAa,YACX,KACA,MACA,MACA,qBACW,eAAe,KAAK,MAAM,MAAM,gBAAgB,CAAC,CAAC;AAE/D,MAAa,mBAAmB,QAAkB;CAChD,MAAM,SAAU,IAAI,OAAO,WAAW,UAAU,GAAG;CACnD,MAAM,KAAKF,eAAa,OAAO,OAAO,KAAK,IAAI;CAC/C,OAAO,MAAM,MAAM;CACnB,OAAO;AACT;AAEA,MAAaG,kBACX,KACA,IACA,QACW;CACX,MAAM,SAAU,IAAI,OAAO,WAAW,UAAU,GAAG;CAEnD,OAAOH,eAAa,OAAO,OAAO,KAAK,IAAI;CAC3C,OAAO,MAAM,MAAM;CAMnB,CAHE,OAAO,MAAM,OAAO,MAAM,SAAS,OAClC,OAAO,OAAO,OAAO,OAAO,UAAU,CAAC,GAAA,CAEnC,KAAK,KAAK,UAAU,MAAM,GAAG;CACpC,OAAO;AACT;AAEA,MAAaI,eACX,OACA,KACA,GACA,MACA,IACA,qBACW;CACX,MAAM,SAAU,IAAI,OAAO,WAAW,UAAU,GAAG;CAEnD,IAAI,OAAO,OAAO,UAAU;EAC1B,MAAM,OAAOJ,eAAa,OAAO,OAAO,KAAK,IAAI;EAEjD,IAAI,IACF,GAAG,IAAI;EAGT,KAAK;CACP;CAEA,kBAAkB,OAAO,KAAK;EAAE,GAAG;EAAI;CAAE,GAAG,MAAM,gBAAgB;CAElE,OAAO;AACT;AAEA,MAAM,qBACJ,OACA,KACA,MACA,MACA,qBACG;CACH,MAAM,SAAU,IAAI,OAAO,WAAW,UAAU,GAAG;CAEnD,MAAM,SACH,UAAU,YAAY,OAAO,MAAM,OAAO,MAAM,SAAS,OACzD,OAAO,OAAO,OAAO,OAAO,UAAU,CAAC;CAE1C,MAAM,UAAoB,CAAC;CAC3B,OAAO,MAAM,KAAK,OAAO;CAEzB,MAAM,MAAM,SAAS,KAAK,MAAM,MAAM,gBAAgB;CAEtD,OAAO,KAAK,GAAG,SAAS,GAAG;CAE3B,OAAO,MAAM,IAAI;AACnB;AAEA,MAAa,gBACX,KACA,KACA,aACS;CACT,IAAI,CAAC,YAAY,IAAI,OAAO,QAAQ,OAAO,QAAQ;EACjD,MAAM,OAAiB,CAAC;EACxB,KAAK,MAAM,UAAU,IAAI,OAAO,OAAO,QACrC,KAAK,KAAK,GAAG,MAAM;EAGrB,IAAI,OAAO,UAAU,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI;CACnD;AACF;AAEA,MAAa,uBAAuB,QAAiC;CACnE,MAAM,SAAS;EACb,MAAM,IAAI,IAAI,KAAK,GAAG;EACtB,QAAQ,IAAI;CACd;CACA,aAAa,KAAK,MAAM;CACxB,OAAO;AACT;AAMA,MAAa,0BAAkD,KAAK,UAAU;CAC5E,MAAM,EAAE,YAAY,2BAA2B,OAAO,KAAK,KAAK;CAChE,OAAO,QAAQ,IAAI;AACrB;AAEA,0BAA0B,sBAAsB;ACxOhD,MAAa,+BACX,KACA,GACA,MACA,aACwB;CACxB,QACI,CAAC,YAAY,QAAQ,IAAI,OAAO,YAAa,EAAE,kBAAkB;AAEvE;AAEA,MAAa,sBACX,KACA,GACA,aACG;CACH,IAAI;CACJ,IAAI,CAAC,YAAY,CAAC,IAAI,SACpB,KAAKK,eAAa,KAAK,IAAI,QAAQ,IAAI,IAAI,KAAK,GAAG,CAAC;CAGtD,EAAE,eAAe,SAAS,UACxBC,YAAU,SAAS,KAAK,OAAO,MAAM,EAAE,IAAI,CAC7C;CAEA,IAAI,CAAC,YAAY,CAAC,IAAI,SAEpB,IAAI,MAAM,CAAC,WADK,IAAI,OAAO,UAAU,YACL,WAAW,GAAG,QAAQ,IAAI;AAE9D;ACmBA,MAAa,WACX,KACA,MACA,UACA,kBACc;CACd,IACG,CAAC,YAEA,QAEA,SAAS,YAET,SAAS,YACT,IAAI,OAAO,YACb,IAAI,EAAE,eAEN,mBAAmB,KAAK,IAAI,GAAG,QAAQ;CAGzC,OAAO;EACL,MAAM,IAAI,IAAI,KAAK,GAAG;EACtB,QAAQ,IAAI;EACZ;CACF;AACF;AAEA,MAAa,4BAA4B,UAA8B;CACrE,MAAM,QACJ,MAAM,UACL,OAAO,MAAM,EAAE,SAAS,WAAW,MAAM,EAAE,OAAO,KAAA;CAErD,IAAI,CAAC,OACH,MAAM,IAAI,uBACR,OACA,2EACF;CAGF,OAAO;AACT;AAEA,MAAa,yBAAyB,UACpC,MAAM,SAAS,MAAM,EAAE,YAAY,MAAM,UAAU,MAAM,EAAE,WACvD,IAAI,MAAM,MAAM,KAChB,KAAA;AAEN,MAAa,8BACX,OACA,OACuB;CACvB,IAAI,CAAC,IAAI,OAAO,sBAAsB,KAAK;CAE3C,MAAM,WAAW,MAAM,EAAE,YAAY,yBAAyB,KAAK;CACnE,OAAO,YAAY,OAAO,WAAW,IAAI,GAAG,KAAK,KAAA;AACnD;AAEA,MAAaC,0BAAwB,UACnC,oBACEC,iBAAe,KAAK,GACpB,MAAM,EAAE,YAAY,yBAAyB,KAAK,CACpD;AAEF,MAAa,gCAAgC,UAA8B;CACzE,MAAM,QAAQD,uBAAqB,KAAK;CACxC,MAAM,QAAQ,sBAAsB,KAAK;CACzC,OAAO,QAAQ,GAAG,MAAM,GAAG,UAAU;AACvC;AAEA,MAAa,uBACX,QACA,UACW;CACX,MAAM,IAAI,OAAO,WAAW,aAAa,OAAO,IAAI;CACpD,OAAO,IAAI,IAAI,EAAE,KAAK,MAAM,KAAK,IAAI,MAAM;AAC7C;AAEA,MAAa,iBACX,KACA,OACA,OACA,WACA,4BACW;CACX,IAAI,WAAW;CACf,MAAM,OAAiB,CAAC;CAExB,KAAK,MAAM,OAAO,OAAO;EACvB,MAAM,SAAS,MAAM;EACrB,IAAI,CAAC,2BAA2B,OAAO,KAAK,gBAC1C;EAGF,MAAM,YAAY,CAAC,OAAO,KAAK,WAAW,OAAO,KAAK,YAAY,KAAA;EAClE,MAAM,eAAe,sBAAsB,MAAM;EACjD,IACG,aAAa,OAAO,KAAK,QAC1B,aAAa,KAAK,YAClB,WAEA,WAAW;EAGb,MAAM,QAAQ,YACV,UAAU,MAAM,KAAK,IAAI,MAAM,EAAE,IACjC,IAAI,MAAM,KAAM,aAAa,OAAO,KAAK,QAAS,IAAI;EAE1D,KAAK,KACH,IAAI,IAAI,KAAK,QACX,aAAa,KAAK,WAAW,KAAK,aAAa,KAAK,aAAa,IAErE;CACF;CAEA,OAAO,WACH,gBAAgB,MAAM,QACtB,uBAAuB,MAAM,gDAC3B,KAAK,KAAK,IAAI,IACd;AACR;AAEA,MAAa,yBACX,WACqB;CACrB,OACG,OAAO,KAAK,WAAW,OAAO,SAC/B;AAEJ;AAEA,MAAaE,gBAAc,QAAa;CACtC,IAAI,UAAU,KAAK,OAAO,IAAI;CAC9B,MAAM,IAAI,MAAM,0CAA0C;AAC5D;AC5KA,SAAgB,kBACd,KACA,WAMA,OACA,KACA,QACA,UACA,QACA,IACA,UACA,eACA,eACA,kBACQ;CACR,IAAI;CACJ,IAAI;CAEJ,IAAI,iBAAiB,UAAU,QACxB;OAAA,MAAM,KAAK,UAAU,QACxB,IAAI,OAAO,MAAM,YAAY,cAAc,GACrC;OAAA,OAAO,EAAE,UAAU;IACrB,YAAY;IACZ,MAAM,kBACJ,KACA,WACA,OACA,KACA,MAAM,MACN,KAAA,GACA,KAAA,GACA,KAAA,GACA,KAAA,GACA,KAAA,GACA,KAAA,GACA,IACF;IACA;GACF;;;CAMN,IAAI,CAAC,KACH,IAAI,CAAC,QAAQ;EACX,YAAY,QAAQ;EACpB,MAAM,GAAG,WAAW,GAAG,SAAS,KAAK,GAAG,GAAG,IAAI;CACjD,OAAO;EACL,IAAI,YAAY,IACd,SAAS,MAAM,UAAU,sBAAsB,MAAgB;EAGjE,MAAM,EAAE,SAAS;EACjB,IAAI,UAAU,KAAK,aAAa,CAAC,eAC/B,MAAM,IAAI,KAAK,UAAU,MAAM,KAAK,QAAQ,EAAE;OACzC,IAAI,KAAK,UACd,MAAM,IAAI,KAAK,SAAS,MAAM,KAAK,QAAQ,EAAE;OACxC;GACL,MAAM,OAAO,KAAK,QAAQ;GAC1B,YAAY,SAAS;GAErB,IAAI,CAAC,QAAQ;IACX,MAAM,SAAS,CAAC,UAAU,UAAU,iBAAiB;IACrD,IAAI,QACF,WAAW,IAAI,OAAO;GAE1B;GAEA,MAAM,GAAG,WAAW,GAAG,SAAS,KAAK,GAAG,GAAG,KAAK;EAClD;CACF;CAGF,IACE,CAAC,UACD,CAAC,iBACA,QAAmB,KAAK,gBACzB,CAAE,OAAkB,KAAK,kBAEzB,OAAO;MACF,IAAI,UAAU,WAAW,KAAK,gBAAgB,CAAC,kBACpD,MAAM,SAAS,IAAI;CAGrB,IAAI,MAAM,CAAC,WACT,MAAM,GAAG,IAAI,IAAI,GAAG;CAGtB,OAAO;AACT;AAEA,MAAa,oBACX,KACA,WAQA,OACA,OACA,KACA,UACA,QACA,IACA,UACA,qBACG;CACH,IAAI;CACJ,IAAI;CAEJ,IAAI,QAAQ,KAAK;EACf,IAAI,YAAY,IACd,SAAS,MAAM,KAAA;EAGjB,MAAM,QAAQ,UAAU,eAAe;EACvC,IAAI,OACF,MAAM,SACF,cAAc,KAAK,OAAO,OAAgB,IAAI,IAC9C,IAAI,MAAM;OACT;GACL,MAAM,IAAI,MAAM,KAAK,IAAI;GACzB,YAAY;EACd;CACF,OAAO;EACL,MAAM,YAAY,qBAAqB,WAAW,KAAK;EACvD,MAAM,SAAS,IAAI,MAAM;EAEzB,MAAM,SAAS,UAAU,eAAe;EAExC,MAAM,MACJ,SAAS,OAAO,OAAO,WAAW,WAAW,MAAM,OAAO,KAAA;EAG5D,IAAI,YAAY,IACd,SAAS,MAAM,OAAO,sBAAsB,GAAG;EAGjD,IAAI,KAAK,KAAK,WACZ,MAAM,IAAI,IAAI,KAAK,UAAU,MAAM,KAAK,MAAM,EAAE;OAC3C,IAAI,KAAK,KAAK,MACnB,MAAM,IAAI,UAAU,KAAK,IAAI,KAAK,KAAK;OAClC,IAAI,KAAK,KAAK,UACnB,MAAM,IAAI,IAAI,KAAK,SAAS,MAAM,KAAK,MAAM,EAAE;OAC1C;GACL,MAAM,IAAI,UAAU,KAAK,IAAI;GAC7B,YAAY,QAAQ;EACtB;EAEA,IACE,CAAC,UACA,KAAgB,KAAK,gBACtB,CAAE,IAAe,KAAK,kBAEtB,OAAO;OACF,IAAI,UAAU,WAAW,KAAK,gBAAgB,CAAC,kBACpD,MAAM,SAAS,IAAI;CAEvB;CAEA,IAAI,MAAM,CAAC,WACT,MAAM,GAAG,IAAI,IAAI,GAAG;CAGtB,OAAO;AACT;AAEA,MAAa,wBACX,KACA,MAOA,OACA,QACA,UACA,kBAEA,YACE,KACA,MACA,OACA,QACA,UACA,KAAA,GACA,KAAA,GACA,KAAA,GACA,eACA,IACF;AAEF,MAAa,eACX,KACA,MAOA,OACA,QACA,UACA,QACA,IACA,UACA,eACA,qBACW;CACX,IAAI,QAAQ,OAAO,QAAQ,GAAG;CAC9B,IAAI,UAAU,IAAI;EAChB,MAAM,QAAQ,OAAO,MAAM,GAAG,KAAK;EACnC,MAAM,MAAM,OAAO,MAAM,QAAQ,CAAC;EAClC,OAAO,iBACL,KACA,MACA,OACA,OACA,KACA,UACA,QACA,IACA,UACA,gBACF;CACF;CAEA,OAAO,kBACL,KACA,MACA,OACA,QACA,MAAM,SACN,UACA,QACA,IACA,UACA,eACA,KAAA,GACA,gBACF;AACF;AAEA,MAAa,oBACX,KACA,MAIA,OACA,MACA,UACA,QACA,qBACW;CACX,OAAO,OAAO,SAAS,WACnB,YACE,KACA,MACA,OACA,MACA,UACA,QACA,KAAA,GACA,KAAA,GACA,KAAA,GACA,gBACF,IACC,KAAoB,MAAM,KAAK,QAAQ;AAC9C;AC7OA,MAAM,cAAc,IAAIC,gBAAcC,sBAAoB,CAAC,CACxD,SAAS,CAAC,CACV,MAAM,QAAiB;AAG1B,MAAM,gBAAgB,IAAIC,aAAWD,sBAAoB,CAAC,CACvD,SAAS,CAAC,CACV,MAAM,UAAmB;AAEJE,gBAAc,yBAAyB,SAAS;AAExE,MAAM,eAAeC,aAAW,SAAS,SAAS;AAElD,MAAM,mBAAmBC,iBAAe,SAAS,SAAS;AAE1D,MAAM,cAAcC,YAAU,SAAS,SAAS;AAEhD,MAAM,yBACJ,IAAK,yBACHL,sBACF,CAAC,CAAC,SAAS;AAEb,YAAY,KAAK,mBACf,cAAc,KAAK,mBACnB,aAAa,KAAK,mBAClB,iBAAiB,KAAK,mBACtB,YAAY,KAAK,mBACjB,uBAAuB,KAAK,mBAC1B;;;;;;;;;;;;;;ACiTJ,MAAM,qBACJ,GACA,MACA,UACA,KACA,UACA,mBACG;CACH,MAAM,QAAS,EAAY;CAC3B,KAAK,MAAM,OAAO,MAAM;EACtB,MAAM,SAAS,MAAM;EACrB,IAAI,CAAC,QAAQ;EAEb,IAAI,OAAO,KAAK,SAAS;GACvB,MAAM,UAAU;GAChB,IAAI,QAAQ,QACV,IAAI,eAAe,MACjB,eAAe,IAAI,CAAC,WAAW,KAAK,QAAQ;QAE5C,eAAe,OAAO;IACpB,QAAQ;IACR,YAAY,CAAC,QAAQ;GACvB;GAGJ;EACF;EAEA,gBAAgB,GAAG,QAAQ,GAAG;EAE9B,IAAI,QAAQ,KAAK;EAEjB,IAAI,OAAO,UAAU,YAAY;GAC/B,QAAQ,KAAK,OAAO,wBAClB,GACA,KACF;GAEA,IAAI,QAAQ,KAAK,GACf,QAAQ,KAAK,OAAO,aAClB,GACAM,wBAAsB,GAAY,KAAc,CAClD;EAEJ;EAEA,IACE,CAAC,IAAI,QAAQ,IAAI,GAAG,MAClB,UAAU,CAAC,OAAO,KAAK,YAAa,UAAU,aAChD,UAAU,KAAA,GACV;GACA,IAAI,QAAQ,IAAI,KAAK,IAAI,QAAQ,IAAI;GACrC,SAAS,OAAO,QAAQ,KAAK;EAC/B;CACF;AACF;AAEA,MAAM,qBACJ,GACA,KACA,MACA,mBACG;CACH,MAAM,QAAQ,KAAK;CACnB,KAAK,MAAM,OAAO,gBAAgB;EAChC,MAAM,EAAE,QAAQ,eAAe,eAAe;EAC9C,MAAM,QAAQ,WAAW,KAAK,MAAM,KAAK,EAAE;EAC3C,OAAO,OAAO,GAAG,KAAK,OAAO,YAAY,KAAK;CAChD;AACF;AAEA,MAAa,mBACX,GACA,QACA,QACG;CACH,IAAI,OAAO,KAAK,eAAe,OAAO,KAAK,UACzC,MAAM,IAAI,uBACR,GACA,sCACA,EAAE,QAAQ,IAAI,CAChB;AAEJ;AAGA,MAAa,mBAA8B;CACzC,yBAAS,IAAI,IAAI;CACjB,WAAW,KAAA;AACb;;;;;;;;;;AAWA,MAAa,iBACX,GACA,MACA,QAC+C;CAC/C,MAAM,WAA0B,CAAC;CACjC,MAAM,WAAY,EAAY,EAAE;CAEhC,OAAO,WAAW;EAAE,GAAG;EAAU,GAAG;CAAK,IAAI,EAAE,GAAG,KAAK;CAEvD,MAAM,iBAAiC,CAAC;CAExC,kBAAkB,GAAG,MAAM,GAAG,KAAK,UAAU,cAAc;CAE3D,kBAAkB,GAAG,KAAK,CAAC,IAAI,GAAG,cAAc;CAEhD,MAAM,UAAU,MAAM,KAAK,IAAI,QAAQ,KAAK,CAAC;CAU7C,OAAO;EAAE;EAAS,QAAA,CARhB,QAAQ,KAAK,QAEX,SAAS,QAAQ,CAACC,eAAa,KAAK,IAAI,KAAK,KAAK,SAAS,OACvD,SAAS,IAAI,CAAC,KAAK,IAAI,IACvB,KAAK,IACX,CAGqB;CAAE;AAC3B;;;;;;;;;;AAWA,MAAa,kBACX,GACA,MACA,QAC+C;CAC/C,MAAM,WAA0B,CAAC;CACjC,MAAM,WAAY,EAAY,EAAE;CAEhC,OAAO,KAAK,IACV,YAAY,UAAU;EAAE,GAAG;EAAU,GAAG;CAAK,MAAM,UAAU,EAAE,GAAG,KAAK,EACzE;CAEA,MAAM,iBAAiC,CAAC;CAExC,MAAM,MAAM,KAAK;CACjB,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KACvB,kBAAkB,GAAG,KAAK,IAAI,GAAG,KAAK,UAAU,cAAc;CAGhE,kBAAkB,GAAG,KAAK,MAAM,cAAc;CAE9C,MAAM,SAAS,MAAM,KAAK,MAAM;CAChC,MAAM,UAAU,MAAM,KAAK,IAAI,QAAQ,KAAK,CAAC;CAE7C,KAAK,IAAI,IAAI,GAAG,IAAI,KAAK,KAAK;EAC5B,MAAM,OAAO,KAAK;EAClB,OAAwB,KAAK,QAAQ,KAAK,QACxC,SAAS,QAAQ,KAAK,SAAS,KAAA,KAAa,CAACA,eAAa,KAAK,IAAI,IAC/D,SAAS,IAAI,CAAC,KAAK,IAAI,IACvB,KAAK,IACX;CACF;CAEA,OAAO;EAAE;EAAS;CAAO;AAC3B;;;;;;;;;;;;;;;AAgBA,MAAa,UACX,MACA,EACE,SACA,YACA,UAMF,MACA,cACG;CACH,MAAM,EAAE,MAAM;CAEd,IAAI,CAAC,EAAE,QAAQ,QACb,EAAE,YAAY;CAGhB,EAAE,OAAO;CAET,aAAa,aACR,EAAE,aAAaD,wBAAsB,MAAe,UAAmB,IACxE,EAAE;CAEN,IAAI,YAAY;EACd,IAAI,EAAE,YAAY;GAChB,MAAM,MAAM,qBACV,MACA,EAAE,YACF;IACE;IACA;GACF,GACA,SACF;GACA,UAAU,IAAI;GACd,SAAS,IAAI;GACb,EAAE,oBAAoB,IAAI;EAC5B;EAEA,IAAI,OAAO,SAAS,GAAG;GACrB,MAAM,iBAAiB,mBAAmB,GAAG,GAAG;GAChD,eAAe,MAAe,KAAK,cAAc;GAEjD,EAAE,iBAAiB;EACrB;CACF;CAEA,EAAE,UAAU;CACZ,EAAE,SAAS;CAEX,MAAM,EAAE,QAAQ,eAAe;CAE/B,IAAI,CAAC,QACC;MAAA,eAAe,QAAQ;GACzB,EAAE,aAAa;GACf,IAAI,MAAM,EAAE,gBAAgB;EAC9B;QACK,IAAI,MACL;MAAA,eAAe,SAAS,eAAe,cACzC,EAAE,aAAa;OACV,IAAI,eAAe,WAAW,eAAe,gBAClD,EAAE,aAAa;CAAA,OAEZ,IAAI,CAAC,cAAc,eAAe,OACvC,EAAE,aAAa,aAAc,WAAqB,EAAE,aAAa;MAC5D,IAAI,eAAe,SACxB,EAAE,aAAa;CAGjB,OAAO;AACT;AAWA,MAAaE,kBACX,OACA,SAC0B;CAC1B,gBAAgB,KAAyB;CACzC,MAAM,MAAM,UAAU;CACtB,MAAM,MAAM,cAAc,OAAO,MAAM,GAAG;CAK1C,OAAO,OAAO,OAAO,GAAG;AAC1B;;;;;;;;;;;;ACvkBA,MAAM,cACJ,OACA,MACA,MACA,WACA,SACe;CACf,gBAAgB,KAAyB;CAEzC,MAAM,MAAM,UAAU;CAEtB,MAAM,MACJ,SACC,MAAM,QAAQ,IAAI,IACf,eAAe,OAAO,MAAM,GAAG,IAC/B,cAAc,OAAO,MAAM,GAAG;CAEpC,OAAO,OACL,OACA;EACE,YAAY;EACZ,SAAS,KAAK,WAAW,CAAC;EAC1B,QAAQ,KAAK,UAAU,CAAC;CAC1B,GACA,MACA,SACF;AACF;;;;;;;;;AAUA,MAAa,wBACX,GACA,MACA,KAIA,SAKG;CACH,IAAI,CAAC,QAAQ,CAAC,sBAAsB,KAAK,EAAE,aACzC,MAAM,IAAI,MACR,+DACF;CAGF,MAAM,+BAAe,IAAI,IAAY;CACrC,KAAK,EAAE,QAAQ,SAAS,SAAS;EAC/B,IAAI,OAAO,SAAS,UAAU;GAC5B,MAAM,QAAQ,KAAK,QAAQ,GAAG;GAC9B,aAAa,IAAI,UAAU,KAAK,OAAO,KAAK,MAAM,QAAQ,CAAC,CAAC;EAC9D,OAAO,IAAI,QAAQ,cAAc,MAC/B,KAAK,MAAM,UAAU,KAAK,UACxB,aAAa,IAAI,MAAM;CAG7B,CAAC;CAED,MAAM,aAAa,IAAI,IAAY,YAAY;CAC/C,MAAM,oBAAoB,aAAa;CACvC,MAAM,YAAyB,CAAC;CAChC,IAAI,KAAK,SACP,KAAK,MAAM,gBAAgB,IAAI,QAAQ;EACrC,MAAM,SAAoB,CAAC;EAC3B,UAAU,KAAK,MAAM;EAErB,IAAI,QAAQ,SAAS,QAAQ,MAAM;GACjC,IAAI,CAAC,aAAa,IAAI,MAAM,GAAG;IAC7B,WAAW,IAAI,MAAM;IACrB,OAAO,KAAK,aAAa,EAAE;GAC7B;EACF,CAAC;CACH;CAGF,KAAK,MAAM,OAAO,cAAc;EAC9B,MAAM,SAAS,EAAE,MAAM;EACvB,IAAI,QAAQ,gBAAgB,MAAM,QAAQ,GAAG;CAC/C;CAEA,OAAO;EACL,SAAS,CAAC,GAAG,UAAU;EACvB;EACA,QAAQ;CACV;AACF;AAqCA,MAAa,wBAIX,GACA,OACA,SAC4B;CAC5B,OAAO,WAAW,GAAG,OAAO,MAAM,OAAO,IAAI;AAC/C"}
|