@payloadcms/drizzle 4.0.0-beta.3 → 4.0.0-beta.4

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.
@@ -8,6 +8,7 @@ type BuildPolymorphicJoinQueryArgs = {
8
8
  limit: number;
9
9
  locale?: string;
10
10
  page?: number;
11
+ pageSize?: number;
11
12
  path: string;
12
13
  shouldCount: boolean;
13
14
  sort?: string | string[];
@@ -26,13 +27,13 @@ type PolymorphicJoinQuery = {
26
27
  *
27
28
  * `field.collection` must contain at least one configured collection. Each mapped table must have
28
29
  * an `id` column and the column named by `field.on`. The supplied `limit` is used as-is; callers can
29
- * include an extra look-ahead row when they calculate pagination.
30
+ * include an extra look-ahead row and supply the original `pageSize` for offset calculation.
30
31
  *
31
32
  * @returns The stable projection name, the document projection, and the count projection when
32
33
  * `shouldCount` is true.
33
34
  * @throws If the join definition, target collection, mapped table, required columns, or sort shape
34
35
  * cannot be represented by the polymorphic query.
35
36
  */
36
- export declare const buildPolymorphicJoinQuery: ({ adapter, currentTableName, field, limit, locale, page, path, shouldCount, sort, where, }: BuildPolymorphicJoinQueryArgs) => PolymorphicJoinQuery;
37
+ export declare const buildPolymorphicJoinQuery: ({ adapter, currentTableName, field, limit, locale, page, pageSize, path, shouldCount, sort, where, }: BuildPolymorphicJoinQueryArgs) => PolymorphicJoinQuery;
37
38
  export {};
38
39
  //# sourceMappingURL=buildPolymorphicJoinQuery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"buildPolymorphicJoinQuery.d.ts","sourceRoot":"","sources":["../../src/find/buildPolymorphicJoinQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAKtC,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,KAAK,EAAE,MAAM,SAAS,CAAA;AAG7D,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,aAAa,CAAA;AAO/D,KAAK,6BAA6B,GAAG;IACnC,OAAO,EAAE,cAAc,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,EAAE,kBAAkB,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,OAAO,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACxB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,KAAK,oBAAoB,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACnB,SAAS,EAAE,GAAG,CAAC,OAAO,CAAA;CACvB,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,yBAAyB,+FAWnC,6BAA6B,KAAG,oBA6HlC,CAAA"}
1
+ {"version":3,"file":"buildPolymorphicJoinQuery.d.ts","sourceRoot":"","sources":["../../src/find/buildPolymorphicJoinQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAKtC,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,KAAK,EAAE,MAAM,SAAS,CAAA;AAG7D,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,aAAa,CAAA;AAO/D,KAAK,6BAA6B,GAAG;IACnC,OAAO,EAAE,cAAc,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,EAAE,kBAAkB,CAAA;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,OAAO,CAAA;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IACxB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,KAAK,oBAAoB,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,CAAA;IACnB,SAAS,EAAE,GAAG,CAAC,OAAO,CAAA;CACvB,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,yBAAyB,yGAYnC,6BAA6B,KAAG,oBAmJlC,CAAA"}
@@ -1,4 +1,4 @@
1
- import { asc, count, desc, eq, sql } from 'drizzle-orm';
1
+ import { and, asc, count, desc, eq, getTableName, sql } from 'drizzle-orm';
2
2
  import toSnakeCase from 'to-snake-case';
3
3
  import { jsonAggBuildObject } from '../utilities/json.js';
4
4
  import { buildPolymorphicJoinWhere } from './buildPolymorphicJoinWhere.js';
@@ -11,13 +11,13 @@ import { createPolymorphicJoinWherePlan } from './createPolymorphicJoinWherePlan
11
11
  *
12
12
  * `field.collection` must contain at least one configured collection. Each mapped table must have
13
13
  * an `id` column and the column named by `field.on`. The supplied `limit` is used as-is; callers can
14
- * include an extra look-ahead row when they calculate pagination.
14
+ * include an extra look-ahead row and supply the original `pageSize` for offset calculation.
15
15
  *
16
16
  * @returns The stable projection name, the document projection, and the count projection when
17
17
  * `shouldCount` is true.
18
18
  * @throws If the join definition, target collection, mapped table, required columns, or sort shape
19
19
  * cannot be represented by the polymorphic query.
20
- */ export const buildPolymorphicJoinQuery = ({ adapter, currentTableName, field, limit, locale, page, path, shouldCount, sort, where })=>{
20
+ */ export const buildPolymorphicJoinQuery = ({ adapter, currentTableName, field, limit, locale, page, pageSize = limit, path, shouldCount, sort, where })=>{
21
21
  if (!Array.isArray(field.collection)) {
22
22
  throw new Error('A polymorphic join requires a collection array');
23
23
  }
@@ -80,7 +80,18 @@ import { createPolymorphicJoinWherePlan } from './createPolymorphicJoinWherePlan
80
80
  where,
81
81
  wherePlan
82
82
  }) : undefined;
83
- let collectionQuery = db.select(selectFields).from(table).$dynamic();
83
+ const hasLocalizedWhere = [
84
+ ...wherePlan.values()
85
+ ].some((pathPlan)=>{
86
+ const collectionField = pathPlan.fieldsByCollection.get(collection);
87
+ return collectionField?.type === 'scalar' && collectionField.isLocalized;
88
+ });
89
+ const shouldDeduplicate = hasLocalizedWhere && (!locale || locale === 'all');
90
+ let collectionQuery = (shouldDeduplicate ? db.selectDistinct(selectFields) : db.select(selectFields)).from(table).$dynamic();
91
+ if (hasLocalizedWhere) {
92
+ const localesTable = adapter.tables[`${getTableName(table)}${adapter.localesSuffix}`];
93
+ collectionQuery = collectionQuery.leftJoin(localesTable, and(eq(table['id'], localesTable._parentID), locale && locale !== 'all' ? eq(localesTable._locale, locale) : undefined));
94
+ }
84
95
  if (collectionWhere) {
85
96
  collectionQuery = collectionQuery.where(collectionWhere);
86
97
  }
@@ -102,7 +113,7 @@ import { createPolymorphicJoinWherePlan } from './createPolymorphicJoinWherePlan
102
113
  limitOffsetSQL = sql` LIMIT ${limit}`;
103
114
  }
104
115
  if (page && limit !== 0) {
105
- const offset = (page - 1) * limit;
116
+ const offset = (page - 1) * pageSize;
106
117
  if (offset > 0) {
107
118
  limitOffsetSQL = sql`${limitOffsetSQL} OFFSET ${offset}`;
108
119
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/find/buildPolymorphicJoinQuery.ts"],"sourcesContent":["import type { SQL } from 'drizzle-orm'\nimport type { LibSQLDatabase } from 'drizzle-orm/libsql'\nimport type { SQLiteSelect } from 'drizzle-orm/sqlite-core'\n\nimport { asc, count, desc, eq, sql } from 'drizzle-orm'\nimport { type FlattenedJoinField, type Where } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter, GenericTable } from '../types.js'\nimport type { PolymorphicJoinWherePlan } from './createPolymorphicJoinWherePlan.js'\n\nimport { jsonAggBuildObject } from '../utilities/json.js'\nimport { buildPolymorphicJoinWhere } from './buildPolymorphicJoinWhere.js'\nimport { createPolymorphicJoinWherePlan } from './createPolymorphicJoinWherePlan.js'\n\ntype BuildPolymorphicJoinQueryArgs = {\n adapter: DrizzleAdapter\n currentTableName: string\n field: FlattenedJoinField\n limit: number\n locale?: string\n page?: number\n path: string\n shouldCount: boolean\n sort?: string | string[]\n where?: Where\n}\n\ntype PolymorphicJoinQuery = {\n columnName: string\n count?: SQL.Aliased\n documents: SQL.Aliased\n}\n\n/**\n * Builds the correlated document and optional count projections for a join that targets multiple\n * collections. Every collection branch exposes the same `id`, parent, `relationTo`, and sort\n * columns before the branches are combined. A missing sort field resolves to SQL NULL so targets\n * with different schemas can still share one ordered union.\n *\n * `field.collection` must contain at least one configured collection. Each mapped table must have\n * an `id` column and the column named by `field.on`. The supplied `limit` is used as-is; callers can\n * include an extra look-ahead row when they calculate pagination.\n *\n * @returns The stable projection name, the document projection, and the count projection when\n * `shouldCount` is true.\n * @throws If the join definition, target collection, mapped table, required columns, or sort shape\n * cannot be represented by the polymorphic query.\n */\nexport const buildPolymorphicJoinQuery = ({\n adapter,\n currentTableName,\n field,\n limit,\n locale,\n page,\n path,\n shouldCount,\n sort,\n where,\n}: BuildPolymorphicJoinQueryArgs): PolymorphicJoinQuery => {\n if (!Array.isArray(field.collection)) {\n throw new Error('A polymorphic join requires a collection array')\n }\n\n if (field.collection.length === 0) {\n throw new Error('A polymorphic join requires at least one collection')\n }\n\n if (Array.isArray(sort)) {\n throw new Error('Polymorphic joins do not support multiple sort fields')\n }\n\n const collections = field.collection\n const columnName = `${path.replaceAll('.', '_')}${field.name}`\n const db = adapter.drizzle as LibSQLDatabase\n const onPath = field.on.split('.').join('_')\n const collectionTables = collections.map((collection) => {\n if (!adapter.payload.collections[collection]) {\n throw new Error(`Unknown polymorphic join collection \"${collection}\"`)\n }\n\n const tableName = adapter.tableNameMap.get(toSnakeCase(collection))\n const table = tableName ? (adapter.tables[tableName] as GenericTable | undefined) : undefined\n\n if (!table) {\n throw new Error(`Polymorphic join collection \"${collection}\" has no database table`)\n }\n\n if (!table['id']) {\n throw new Error(`Polymorphic join collection \"${collection}\" has no \"id\" column`)\n }\n\n if (!table[onPath]) {\n throw new Error(`Polymorphic join collection \"${collection}\" has no \"${onPath}\" column`)\n }\n\n return { collection, table }\n })\n const sortField = getSortField({ adapter, collections, sort })\n const sortOrder = sortField.startsWith('-') ? desc : asc\n const sortPath = sortField.replace('-', '').split('.').join('_')\n const wherePlan: PolymorphicJoinWherePlan = where\n ? createPolymorphicJoinWherePlan({ adapter, collections, where })\n : new Map()\n let unionQuery: null | SQLiteSelect = null\n\n for (const { collection, table } of collectionTables) {\n const sortColumn = table[sortPath]\n const selectFields = {\n id: table['id'],\n parent: sql`${table[onPath]}`.as(onPath),\n relationTo: sql`${collection}`.as('relationTo'),\n sortPath: sql`${sortColumn ?? null}`.as('sortPath'),\n }\n const collectionWhere =\n where && Object.keys(where).length > 0\n ? buildPolymorphicJoinWhere({\n adapter,\n collection,\n locale,\n table,\n where,\n wherePlan,\n })\n : undefined\n let collectionQuery = db.select(selectFields).from(table).$dynamic()\n\n if (collectionWhere) {\n collectionQuery = collectionQuery.where(collectionWhere)\n }\n\n if (unionQuery === null) {\n unionQuery = collectionQuery as unknown as SQLiteSelect\n } else {\n unionQuery = unionQuery.unionAll(collectionQuery)\n }\n }\n\n const subQueryAlias = `${columnName}_subquery`\n const parentConstraint = eq(\n sql.raw(`\"${currentTableName}\".\"id\"`),\n sql.raw(`\"${subQueryAlias}\".\"${onPath}\"`),\n )\n const countExpression = shouldCount\n ? sql`${db\n .select({ count: count() })\n .from(sql`${unionQuery.as(subQueryAlias)}`)\n .where(parentConstraint)}`.as(`${columnName}_count`)\n : undefined\n\n unionQuery = unionQuery.orderBy(sortOrder(sql`\"sortPath\"`))\n\n const sortedUnionAlias = `${columnName}_sorted`\n let limitOffsetSQL = sql.empty()\n\n if (limit) {\n limitOffsetSQL = sql` LIMIT ${limit}`\n }\n\n if (page && limit !== 0) {\n const offset = (page - 1) * limit\n\n if (offset > 0) {\n limitOffsetSQL = sql`${limitOffsetSQL} OFFSET ${offset}`\n }\n }\n\n const parentWhere = sql.raw(`\"${sortedUnionAlias}\".\"${onPath}\" = \"${currentTableName}\".\"id\"`)\n const documents = sql`(\n SELECT ${jsonAggBuildObject(adapter, {\n id: sql.raw(`\"${subQueryAlias}\".\"id\"`),\n relationTo: sql.raw(`\"${subQueryAlias}\".\"relationTo\"`),\n })}\n FROM (\n SELECT * FROM ${sql`${unionQuery.as(sortedUnionAlias)}`}\n WHERE ${parentWhere}${limitOffsetSQL}\n ) AS ${sql.raw(`\"${subQueryAlias}\"`)}\n )`.as(columnName)\n\n return {\n columnName,\n count: countExpression,\n documents,\n }\n}\n\nconst getSortField = ({\n adapter,\n collections,\n sort,\n}: {\n adapter: DrizzleAdapter\n collections: string[]\n sort?: string\n}): string => {\n if (sort) {\n return sort\n }\n\n const hasCreatedAt = collections.some((collection) =>\n adapter.payload.collections[collection].config.fields.some(\n (field) => field.type === 'date' && field.name === 'createdAt',\n ),\n )\n\n return hasCreatedAt ? '-createdAt' : 'id'\n}\n"],"names":["asc","count","desc","eq","sql","toSnakeCase","jsonAggBuildObject","buildPolymorphicJoinWhere","createPolymorphicJoinWherePlan","buildPolymorphicJoinQuery","adapter","currentTableName","field","limit","locale","page","path","shouldCount","sort","where","Array","isArray","collection","Error","length","collections","columnName","replaceAll","name","db","drizzle","onPath","on","split","join","collectionTables","map","payload","tableName","tableNameMap","get","table","tables","undefined","sortField","getSortField","sortOrder","startsWith","sortPath","replace","wherePlan","Map","unionQuery","sortColumn","selectFields","id","parent","as","relationTo","collectionWhere","Object","keys","collectionQuery","select","from","$dynamic","unionAll","subQueryAlias","parentConstraint","raw","countExpression","orderBy","sortedUnionAlias","limitOffsetSQL","empty","offset","parentWhere","documents","hasCreatedAt","some","config","fields","type"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/find/buildPolymorphicJoinQuery.ts"],"sourcesContent":["import type { SQL } from 'drizzle-orm'\nimport type { LibSQLDatabase } from 'drizzle-orm/libsql'\nimport type { SQLiteSelect } from 'drizzle-orm/sqlite-core'\n\nimport { and, asc, count, desc, eq, getTableName, sql } from 'drizzle-orm'\nimport { type FlattenedJoinField, type Where } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter, GenericTable } from '../types.js'\nimport type { PolymorphicJoinWherePlan } from './createPolymorphicJoinWherePlan.js'\n\nimport { jsonAggBuildObject } from '../utilities/json.js'\nimport { buildPolymorphicJoinWhere } from './buildPolymorphicJoinWhere.js'\nimport { createPolymorphicJoinWherePlan } from './createPolymorphicJoinWherePlan.js'\n\ntype BuildPolymorphicJoinQueryArgs = {\n adapter: DrizzleAdapter\n currentTableName: string\n field: FlattenedJoinField\n limit: number\n locale?: string\n page?: number\n pageSize?: number\n path: string\n shouldCount: boolean\n sort?: string | string[]\n where?: Where\n}\n\ntype PolymorphicJoinQuery = {\n columnName: string\n count?: SQL.Aliased\n documents: SQL.Aliased\n}\n\n/**\n * Builds the correlated document and optional count projections for a join that targets multiple\n * collections. Every collection branch exposes the same `id`, parent, `relationTo`, and sort\n * columns before the branches are combined. A missing sort field resolves to SQL NULL so targets\n * with different schemas can still share one ordered union.\n *\n * `field.collection` must contain at least one configured collection. Each mapped table must have\n * an `id` column and the column named by `field.on`. The supplied `limit` is used as-is; callers can\n * include an extra look-ahead row and supply the original `pageSize` for offset calculation.\n *\n * @returns The stable projection name, the document projection, and the count projection when\n * `shouldCount` is true.\n * @throws If the join definition, target collection, mapped table, required columns, or sort shape\n * cannot be represented by the polymorphic query.\n */\nexport const buildPolymorphicJoinQuery = ({\n adapter,\n currentTableName,\n field,\n limit,\n locale,\n page,\n pageSize = limit,\n path,\n shouldCount,\n sort,\n where,\n}: BuildPolymorphicJoinQueryArgs): PolymorphicJoinQuery => {\n if (!Array.isArray(field.collection)) {\n throw new Error('A polymorphic join requires a collection array')\n }\n\n if (field.collection.length === 0) {\n throw new Error('A polymorphic join requires at least one collection')\n }\n\n if (Array.isArray(sort)) {\n throw new Error('Polymorphic joins do not support multiple sort fields')\n }\n\n const collections = field.collection\n const columnName = `${path.replaceAll('.', '_')}${field.name}`\n const db = adapter.drizzle as LibSQLDatabase\n const onPath = field.on.split('.').join('_')\n const collectionTables = collections.map((collection) => {\n if (!adapter.payload.collections[collection]) {\n throw new Error(`Unknown polymorphic join collection \"${collection}\"`)\n }\n\n const tableName = adapter.tableNameMap.get(toSnakeCase(collection))\n const table = tableName ? (adapter.tables[tableName] as GenericTable | undefined) : undefined\n\n if (!table) {\n throw new Error(`Polymorphic join collection \"${collection}\" has no database table`)\n }\n\n if (!table['id']) {\n throw new Error(`Polymorphic join collection \"${collection}\" has no \"id\" column`)\n }\n\n if (!table[onPath]) {\n throw new Error(`Polymorphic join collection \"${collection}\" has no \"${onPath}\" column`)\n }\n\n return { collection, table }\n })\n const sortField = getSortField({ adapter, collections, sort })\n const sortOrder = sortField.startsWith('-') ? desc : asc\n const sortPath = sortField.replace('-', '').split('.').join('_')\n const wherePlan: PolymorphicJoinWherePlan = where\n ? createPolymorphicJoinWherePlan({ adapter, collections, where })\n : new Map()\n let unionQuery: null | SQLiteSelect = null\n\n for (const { collection, table } of collectionTables) {\n const sortColumn = table[sortPath]\n const selectFields = {\n id: table['id'],\n parent: sql`${table[onPath]}`.as(onPath),\n relationTo: sql`${collection}`.as('relationTo'),\n sortPath: sql`${sortColumn ?? null}`.as('sortPath'),\n }\n const collectionWhere =\n where && Object.keys(where).length > 0\n ? buildPolymorphicJoinWhere({\n adapter,\n collection,\n locale,\n table,\n where,\n wherePlan,\n })\n : undefined\n const hasLocalizedWhere = [...wherePlan.values()].some((pathPlan) => {\n const collectionField = pathPlan.fieldsByCollection.get(collection)\n\n return collectionField?.type === 'scalar' && collectionField.isLocalized\n })\n const shouldDeduplicate = hasLocalizedWhere && (!locale || locale === 'all')\n let collectionQuery = (\n shouldDeduplicate ? db.selectDistinct(selectFields) : db.select(selectFields)\n )\n .from(table)\n .$dynamic()\n\n if (hasLocalizedWhere) {\n const localesTable = adapter.tables[`${getTableName(table)}${adapter.localesSuffix}`]\n\n collectionQuery = collectionQuery.leftJoin(\n localesTable,\n and(\n eq(table['id'], localesTable._parentID),\n locale && locale !== 'all' ? eq(localesTable._locale, locale) : undefined,\n ),\n )\n }\n\n if (collectionWhere) {\n collectionQuery = collectionQuery.where(collectionWhere)\n }\n\n if (unionQuery === null) {\n unionQuery = collectionQuery\n } else {\n unionQuery = unionQuery.unionAll(collectionQuery)\n }\n }\n\n const subQueryAlias = `${columnName}_subquery`\n const parentConstraint = eq(\n sql.raw(`\"${currentTableName}\".\"id\"`),\n sql.raw(`\"${subQueryAlias}\".\"${onPath}\"`),\n )\n const countExpression = shouldCount\n ? sql`${db\n .select({ count: count() })\n .from(sql`${unionQuery.as(subQueryAlias)}`)\n .where(parentConstraint)}`.as(`${columnName}_count`)\n : undefined\n\n unionQuery = unionQuery.orderBy(sortOrder(sql`\"sortPath\"`))\n\n const sortedUnionAlias = `${columnName}_sorted`\n let limitOffsetSQL = sql.empty()\n\n if (limit) {\n limitOffsetSQL = sql` LIMIT ${limit}`\n }\n\n if (page && limit !== 0) {\n const offset = (page - 1) * pageSize\n\n if (offset > 0) {\n limitOffsetSQL = sql`${limitOffsetSQL} OFFSET ${offset}`\n }\n }\n\n const parentWhere = sql.raw(`\"${sortedUnionAlias}\".\"${onPath}\" = \"${currentTableName}\".\"id\"`)\n const documents = sql`(\n SELECT ${jsonAggBuildObject(adapter, {\n id: sql.raw(`\"${subQueryAlias}\".\"id\"`),\n relationTo: sql.raw(`\"${subQueryAlias}\".\"relationTo\"`),\n })}\n FROM (\n SELECT * FROM ${sql`${unionQuery.as(sortedUnionAlias)}`}\n WHERE ${parentWhere}${limitOffsetSQL}\n ) AS ${sql.raw(`\"${subQueryAlias}\"`)}\n )`.as(columnName)\n\n return {\n columnName,\n count: countExpression,\n documents,\n }\n}\n\nconst getSortField = ({\n adapter,\n collections,\n sort,\n}: {\n adapter: DrizzleAdapter\n collections: string[]\n sort?: string\n}): string => {\n if (sort) {\n return sort\n }\n\n const hasCreatedAt = collections.some((collection) =>\n adapter.payload.collections[collection].config.fields.some(\n (field) => field.type === 'date' && field.name === 'createdAt',\n ),\n )\n\n return hasCreatedAt ? '-createdAt' : 'id'\n}\n"],"names":["and","asc","count","desc","eq","getTableName","sql","toSnakeCase","jsonAggBuildObject","buildPolymorphicJoinWhere","createPolymorphicJoinWherePlan","buildPolymorphicJoinQuery","adapter","currentTableName","field","limit","locale","page","pageSize","path","shouldCount","sort","where","Array","isArray","collection","Error","length","collections","columnName","replaceAll","name","db","drizzle","onPath","on","split","join","collectionTables","map","payload","tableName","tableNameMap","get","table","tables","undefined","sortField","getSortField","sortOrder","startsWith","sortPath","replace","wherePlan","Map","unionQuery","sortColumn","selectFields","id","parent","as","relationTo","collectionWhere","Object","keys","hasLocalizedWhere","values","some","pathPlan","collectionField","fieldsByCollection","type","isLocalized","shouldDeduplicate","collectionQuery","selectDistinct","select","from","$dynamic","localesTable","localesSuffix","leftJoin","_parentID","_locale","unionAll","subQueryAlias","parentConstraint","raw","countExpression","orderBy","sortedUnionAlias","limitOffsetSQL","empty","offset","parentWhere","documents","hasCreatedAt","config","fields"],"mappings":"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"}
@@ -271,7 +271,7 @@ const resolveWherePath = ({ adapter, collection, schemaPath, table, wherePlan })
271
271
  }
272
272
  return {
273
273
  type: 'scalar',
274
- column: fieldContext ? table[pathPlan.columnPath] : sql`null`,
274
+ column: fieldContext ? fieldContext.isLocalized ? adapter.tables[`${getTableName(table)}${adapter.localesSuffix}`][pathPlan.columnPath] : table[pathPlan.columnPath] : sql`null`,
275
275
  fieldContext,
276
276
  pathPlan,
277
277
  queryValueContext
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/find/buildPolymorphicJoinWhere.ts"],"sourcesContent":["import type { Column, SQL } from 'drizzle-orm'\n\nimport { and, getTableName, isNotNull, isNull, or, sql } from 'drizzle-orm'\nimport { type FlattenedField, type Operator, QueryError, type Where } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleResolvedOperator } from '../queries/operatorMap.js'\nimport type { DrizzleAdapter, GenericTable } from '../types.js'\nimport type {\n PolymorphicJoinWherePlan,\n ScalarWhereField,\n WherePathPlan,\n} from './createPolymorphicJoinWherePlan.js'\n\nimport { buildOperatorConstraint } from '../queries/buildOperatorConstraint.js'\nimport { sanitizeQueryValue } from '../queries/sanitizeQueryValue.js'\n\nconst supportedJSONQueryOperators = new Set(['contains', 'equals', 'exists', 'in', 'like'])\n\ntype BuildPolymorphicJoinWhereArgs = {\n adapter: DrizzleAdapter\n collection: string\n locale?: string\n table: GenericTable\n where: Where\n wherePlan: PolymorphicJoinWherePlan\n}\n\ntype ResolvedWherePath =\n | {\n column: Column | SQL\n fieldContext?: ScalarWhereField\n pathPlan: WherePathPlan\n queryValueContext: ScalarWhereField\n type: 'scalar'\n }\n | {\n fieldContext: FlattenedField\n jsonExpression: string\n pathPlan: WherePathPlan\n type: 'hasManySelect'\n }\n | {\n pathPlan: WherePathPlan\n type: 'invalid'\n }\n\n/**\n * Builds a where clause for one collection before the polymorphic branches are combined. A field\n * that is absent from this collection resolves to SQL NULL, and relationTo resolves to the current\n * collection slug.\n */\nexport const buildPolymorphicJoinWhere = ({\n adapter,\n collection,\n locale,\n table,\n where,\n wherePlan,\n}: BuildPolymorphicJoinWhereArgs): SQL | undefined => {\n const constraints: SQL[] = []\n\n for (const key in where) {\n if (['AND', 'OR'].includes(key.toUpperCase())) {\n if (!Array.isArray(where[key])) {\n throw new QueryError([{ path: key }])\n }\n\n const combine = key.toUpperCase() === 'AND' ? and : or\n const nestedConstraints = where[key].map((nestedWhere) =>\n buildPolymorphicJoinWhere({\n adapter,\n collection,\n locale,\n table,\n where: nestedWhere,\n wherePlan,\n }),\n )\n const nestedCondition = combine(...nestedConstraints)\n\n if (nestedCondition) {\n constraints.push(nestedCondition)\n }\n\n continue\n }\n\n const resolvedPath = resolveWherePath({\n adapter,\n collection,\n schemaPath: key,\n table,\n wherePlan,\n })\n\n for (let payloadOperator of Object.keys(where[key])) {\n const originalOperator = payloadOperator as Operator\n let value = where[key][payloadOperator]\n\n if (resolvedPath.type === 'invalid') {\n throw new QueryError([{ path: `${key}.${payloadOperator}` }])\n }\n\n if (resolvedPath.type === 'hasManySelect') {\n if (!supportedJSONQueryOperators.has(payloadOperator)) {\n throw new QueryError([{ path: `${key}.${payloadOperator}` }])\n }\n\n const sanitizedQueryValue = sanitizeQueryValue({\n adapter,\n field: resolvedPath.fieldContext,\n isUUID: false,\n operator: payloadOperator,\n relationOrPath: key,\n val: value,\n })\n\n if (sanitizedQueryValue === null) {\n throw new QueryError([{ path: `${key}.${originalOperator}` }])\n }\n\n if (sanitizedQueryValue.columns) {\n throw new QueryError([{ path: `${key}.${originalOperator}` }])\n }\n\n value = sanitizedQueryValue.value\n\n if (payloadOperator === 'in' && Array.isArray(value) && value.length === 0) {\n constraints.push(sql.raw('false'))\n continue\n }\n\n const jsonQueryOperator =\n payloadOperator === 'exists' ? 'exists' : sanitizedQueryValue.operator\n\n constraints.push(\n sql.raw(\n adapter.createJSONQuery({\n column: resolvedPath.jsonExpression,\n operator: jsonQueryOperator,\n pathSegments: [resolvedPath.pathPlan.columnPath],\n value,\n }),\n ),\n )\n continue\n }\n\n if (payloadOperator === '$raw') {\n if (typeof value !== 'string') {\n throw new QueryError([{ path: `${key}.${payloadOperator}` }])\n }\n\n constraints.push(sql.raw(value))\n continue\n }\n\n const { column, fieldContext, queryValueContext } = resolvedPath\n\n if (\n payloadOperator === 'like' &&\n (queryValueContext.field.type === 'number' ||\n queryValueContext.field.type === 'relationship' ||\n queryValueContext.field.type === 'upload' ||\n queryValueContext.isUUID)\n ) {\n payloadOperator = 'equals'\n }\n\n const sanitizedQueryValue = sanitizeQueryValue({\n adapter,\n field: queryValueContext.field,\n isUUID: queryValueContext.isUUID,\n operator: payloadOperator,\n relationOrPath: key,\n val: value,\n })\n\n if (sanitizedQueryValue === null) {\n throw new QueryError([{ path: `${key}.${originalOperator}` }])\n }\n\n if (sanitizedQueryValue.columns) {\n throw new QueryError([{ path: `${key}.${originalOperator}` }])\n }\n\n payloadOperator = sanitizedQueryValue.operator\n value = sanitizedQueryValue.value\n\n if (!(payloadOperator in adapter.operators)) {\n throw new QueryError([{ path: `${key}.${originalOperator}` }])\n }\n\n const resolvedOperator = payloadOperator as DrizzleResolvedOperator\n const operator = adapter.operators[resolvedOperator]\n const buildColumnConstraint = (constraintValue: unknown) => {\n if (!fieldContext) {\n return operator(column, constraintValue)\n }\n\n return buildOperatorConstraint({\n adapter,\n column,\n field: fieldContext.field,\n locale,\n originalOperator,\n path: key,\n resolvedOperator,\n value: constraintValue,\n })\n }\n\n if (originalOperator === 'equals' && value === null) {\n constraints.push(isNull(column))\n continue\n }\n\n if (originalOperator === 'not_equals') {\n if (value === null) {\n constraints.push(isNotNull(column))\n } else {\n const notEqualsConstraint = or(isNull(column), buildColumnConstraint(value))\n\n if (notEqualsConstraint) {\n constraints.push(notEqualsConstraint)\n }\n }\n continue\n }\n\n if (originalOperator === 'in' && Array.isArray(value) && value.includes(null)) {\n const nonNullValues = value.filter((item) => item !== null)\n const inConstraint = buildColumnConstraint(nonNullValues)\n const nullAwareInConstraint = or(isNull(column), inConstraint)\n\n if (nullAwareInConstraint) {\n constraints.push(nullAwareInConstraint)\n }\n continue\n }\n\n if (payloadOperator === 'like' && typeof value === 'string') {\n const wordConstraints = value.split(' ').map((word) => buildColumnConstraint(`%${word}%`))\n const wordCondition = and(...wordConstraints)\n\n if (wordCondition) {\n constraints.push(wordCondition)\n }\n continue\n }\n\n constraints.push(buildColumnConstraint(value))\n }\n }\n\n return and(...constraints)\n}\n\nconst resolveWherePath = ({\n adapter,\n collection,\n schemaPath,\n table,\n wherePlan,\n}: {\n schemaPath: string\n} & Omit<BuildPolymorphicJoinWhereArgs, 'locale' | 'where'>): ResolvedWherePath => {\n const pathPlan = wherePlan.get(schemaPath)\n\n if (!pathPlan) {\n throw new QueryError([{ path: schemaPath }])\n }\n\n if (pathPlan.type === 'invalid') {\n return { type: 'invalid', pathPlan }\n }\n\n if (schemaPath === 'relationTo') {\n return {\n type: 'scalar',\n column: sql`${collection}`,\n pathPlan,\n queryValueContext: {\n type: 'scalar',\n field: { name: 'relationTo', type: 'text' },\n isUUID: false,\n },\n }\n }\n\n if (pathPlan.type === 'hasManySelect') {\n const fieldContext = [...pathPlan.fieldsByCollection.values()].find(\n (field) => field.type === 'hasManySelect',\n )?.field\n\n if (!fieldContext) {\n return { type: 'invalid', pathPlan }\n }\n\n return {\n type: 'hasManySelect',\n fieldContext,\n jsonExpression: getHasManySelectExpression({\n adapter,\n collection,\n pathPlan,\n table,\n }),\n pathPlan,\n }\n }\n\n const collectionField = pathPlan.fieldsByCollection.get(collection)\n const fieldContext = collectionField?.type === 'scalar' ? collectionField : undefined\n const queryValueContext =\n fieldContext ??\n [...pathPlan.fieldsByCollection.values()].find(\n (field): field is ScalarWhereField => field.type === 'scalar',\n )\n\n if (!queryValueContext) {\n return { type: 'invalid', pathPlan }\n }\n\n return {\n type: 'scalar',\n column: fieldContext ? table[pathPlan.columnPath] : sql`null`,\n fieldContext,\n pathPlan,\n queryValueContext,\n }\n}\n\nconst getHasManySelectExpression = ({\n adapter,\n collection,\n pathPlan,\n table,\n}: {\n adapter: DrizzleAdapter\n collection: string\n pathPlan: WherePathPlan\n table: GenericTable\n}): string => {\n if (pathPlan.fieldsByCollection.get(collection)?.type !== 'hasManySelect') {\n return adapter.name === 'postgres' ? `'[]'::jsonb` : `'[]'`\n }\n\n const selectTablePath = pathPlan.schemaPath\n .split('.')\n .map((pathSegment) => toSnakeCase(pathSegment))\n .join('_')\n const valuesTableName = adapter.tableNameMap.get(`${toSnakeCase(collection)}_${selectTablePath}`)\n\n if (!valuesTableName) {\n throw new Error(\n `Polymorphic join collection \"${collection}\" has no value table for \"${pathPlan.schemaPath}\"`,\n )\n }\n\n let qualifiedValuesTableName = valuesTableName\n let parentTableName = getTableName(table)\n\n if (adapter.schemaName) {\n qualifiedValuesTableName = `\"${adapter.schemaName}\".\"${valuesTableName}\"`\n parentTableName = `\"${adapter.schemaName}\".\"${parentTableName}\"`\n }\n\n if (adapter.name === 'postgres') {\n return `(select coalesce(jsonb_agg(${qualifiedValuesTableName}.value), '[]'::jsonb) from ${qualifiedValuesTableName} where ${qualifiedValuesTableName}.parent_id = ${parentTableName}.id)`\n }\n\n return `(select json_group_array(${qualifiedValuesTableName}.value) from ${qualifiedValuesTableName} where ${qualifiedValuesTableName}.parent_id = ${parentTableName}.id)`\n}\n"],"names":["and","getTableName","isNotNull","isNull","or","sql","QueryError","toSnakeCase","buildOperatorConstraint","sanitizeQueryValue","supportedJSONQueryOperators","Set","buildPolymorphicJoinWhere","adapter","collection","locale","table","where","wherePlan","constraints","key","includes","toUpperCase","Array","isArray","path","combine","nestedConstraints","map","nestedWhere","nestedCondition","push","resolvedPath","resolveWherePath","schemaPath","payloadOperator","Object","keys","originalOperator","value","type","has","sanitizedQueryValue","field","fieldContext","isUUID","operator","relationOrPath","val","columns","length","raw","jsonQueryOperator","createJSONQuery","column","jsonExpression","pathSegments","pathPlan","columnPath","queryValueContext","operators","resolvedOperator","buildColumnConstraint","constraintValue","notEqualsConstraint","nonNullValues","filter","item","inConstraint","nullAwareInConstraint","wordConstraints","split","word","wordCondition","get","name","fieldsByCollection","values","find","getHasManySelectExpression","collectionField","undefined","selectTablePath","pathSegment","join","valuesTableName","tableNameMap","Error","qualifiedValuesTableName","parentTableName","schemaName"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/find/buildPolymorphicJoinWhere.ts"],"sourcesContent":["import type { Column, SQL } from 'drizzle-orm'\n\nimport { and, getTableName, isNotNull, isNull, or, sql } from 'drizzle-orm'\nimport { type FlattenedField, type Operator, QueryError, type Where } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleResolvedOperator } from '../queries/operatorMap.js'\nimport type { DrizzleAdapter, GenericTable } from '../types.js'\nimport type {\n PolymorphicJoinWherePlan,\n ScalarWhereField,\n WherePathPlan,\n} from './createPolymorphicJoinWherePlan.js'\n\nimport { buildOperatorConstraint } from '../queries/buildOperatorConstraint.js'\nimport { sanitizeQueryValue } from '../queries/sanitizeQueryValue.js'\n\nconst supportedJSONQueryOperators = new Set(['contains', 'equals', 'exists', 'in', 'like'])\n\ntype BuildPolymorphicJoinWhereArgs = {\n adapter: DrizzleAdapter\n collection: string\n locale?: string\n table: GenericTable\n where: Where\n wherePlan: PolymorphicJoinWherePlan\n}\n\ntype ResolvedWherePath =\n | {\n column: Column | SQL\n fieldContext?: ScalarWhereField\n pathPlan: WherePathPlan\n queryValueContext: ScalarWhereField\n type: 'scalar'\n }\n | {\n fieldContext: FlattenedField\n jsonExpression: string\n pathPlan: WherePathPlan\n type: 'hasManySelect'\n }\n | {\n pathPlan: WherePathPlan\n type: 'invalid'\n }\n\n/**\n * Builds a where clause for one collection before the polymorphic branches are combined. A field\n * that is absent from this collection resolves to SQL NULL, and relationTo resolves to the current\n * collection slug.\n */\nexport const buildPolymorphicJoinWhere = ({\n adapter,\n collection,\n locale,\n table,\n where,\n wherePlan,\n}: BuildPolymorphicJoinWhereArgs): SQL | undefined => {\n const constraints: SQL[] = []\n\n for (const key in where) {\n if (['AND', 'OR'].includes(key.toUpperCase())) {\n if (!Array.isArray(where[key])) {\n throw new QueryError([{ path: key }])\n }\n\n const combine = key.toUpperCase() === 'AND' ? and : or\n const nestedConstraints = where[key].map((nestedWhere) =>\n buildPolymorphicJoinWhere({\n adapter,\n collection,\n locale,\n table,\n where: nestedWhere,\n wherePlan,\n }),\n )\n const nestedCondition = combine(...nestedConstraints)\n\n if (nestedCondition) {\n constraints.push(nestedCondition)\n }\n\n continue\n }\n\n const resolvedPath = resolveWherePath({\n adapter,\n collection,\n schemaPath: key,\n table,\n wherePlan,\n })\n\n for (let payloadOperator of Object.keys(where[key])) {\n const originalOperator = payloadOperator as Operator\n let value = where[key][payloadOperator]\n\n if (resolvedPath.type === 'invalid') {\n throw new QueryError([{ path: `${key}.${payloadOperator}` }])\n }\n\n if (resolvedPath.type === 'hasManySelect') {\n if (!supportedJSONQueryOperators.has(payloadOperator)) {\n throw new QueryError([{ path: `${key}.${payloadOperator}` }])\n }\n\n const sanitizedQueryValue = sanitizeQueryValue({\n adapter,\n field: resolvedPath.fieldContext,\n isUUID: false,\n operator: payloadOperator,\n relationOrPath: key,\n val: value,\n })\n\n if (sanitizedQueryValue === null) {\n throw new QueryError([{ path: `${key}.${originalOperator}` }])\n }\n\n if (sanitizedQueryValue.columns) {\n throw new QueryError([{ path: `${key}.${originalOperator}` }])\n }\n\n value = sanitizedQueryValue.value\n\n if (payloadOperator === 'in' && Array.isArray(value) && value.length === 0) {\n constraints.push(sql.raw('false'))\n continue\n }\n\n const jsonQueryOperator =\n payloadOperator === 'exists' ? 'exists' : sanitizedQueryValue.operator\n\n constraints.push(\n sql.raw(\n adapter.createJSONQuery({\n column: resolvedPath.jsonExpression,\n operator: jsonQueryOperator,\n pathSegments: [resolvedPath.pathPlan.columnPath],\n value,\n }),\n ),\n )\n continue\n }\n\n if (payloadOperator === '$raw') {\n if (typeof value !== 'string') {\n throw new QueryError([{ path: `${key}.${payloadOperator}` }])\n }\n\n constraints.push(sql.raw(value))\n continue\n }\n\n const { column, fieldContext, queryValueContext } = resolvedPath\n\n if (\n payloadOperator === 'like' &&\n (queryValueContext.field.type === 'number' ||\n queryValueContext.field.type === 'relationship' ||\n queryValueContext.field.type === 'upload' ||\n queryValueContext.isUUID)\n ) {\n payloadOperator = 'equals'\n }\n\n const sanitizedQueryValue = sanitizeQueryValue({\n adapter,\n field: queryValueContext.field,\n isUUID: queryValueContext.isUUID,\n operator: payloadOperator,\n relationOrPath: key,\n val: value,\n })\n\n if (sanitizedQueryValue === null) {\n throw new QueryError([{ path: `${key}.${originalOperator}` }])\n }\n\n if (sanitizedQueryValue.columns) {\n throw new QueryError([{ path: `${key}.${originalOperator}` }])\n }\n\n payloadOperator = sanitizedQueryValue.operator\n value = sanitizedQueryValue.value\n\n if (!(payloadOperator in adapter.operators)) {\n throw new QueryError([{ path: `${key}.${originalOperator}` }])\n }\n\n const resolvedOperator = payloadOperator as DrizzleResolvedOperator\n const operator = adapter.operators[resolvedOperator]\n const buildColumnConstraint = (constraintValue: unknown) => {\n if (!fieldContext) {\n return operator(column, constraintValue)\n }\n\n return buildOperatorConstraint({\n adapter,\n column,\n field: fieldContext.field,\n locale,\n originalOperator,\n path: key,\n resolvedOperator,\n value: constraintValue,\n })\n }\n\n if (originalOperator === 'equals' && value === null) {\n constraints.push(isNull(column))\n continue\n }\n\n if (originalOperator === 'not_equals') {\n if (value === null) {\n constraints.push(isNotNull(column))\n } else {\n const notEqualsConstraint = or(isNull(column), buildColumnConstraint(value))\n\n if (notEqualsConstraint) {\n constraints.push(notEqualsConstraint)\n }\n }\n continue\n }\n\n if (originalOperator === 'in' && Array.isArray(value) && value.includes(null)) {\n const nonNullValues = value.filter((item) => item !== null)\n const inConstraint = buildColumnConstraint(nonNullValues)\n const nullAwareInConstraint = or(isNull(column), inConstraint)\n\n if (nullAwareInConstraint) {\n constraints.push(nullAwareInConstraint)\n }\n continue\n }\n\n if (payloadOperator === 'like' && typeof value === 'string') {\n const wordConstraints = value.split(' ').map((word) => buildColumnConstraint(`%${word}%`))\n const wordCondition = and(...wordConstraints)\n\n if (wordCondition) {\n constraints.push(wordCondition)\n }\n continue\n }\n\n constraints.push(buildColumnConstraint(value))\n }\n }\n\n return and(...constraints)\n}\n\nconst resolveWherePath = ({\n adapter,\n collection,\n schemaPath,\n table,\n wherePlan,\n}: {\n schemaPath: string\n} & Omit<BuildPolymorphicJoinWhereArgs, 'locale' | 'where'>): ResolvedWherePath => {\n const pathPlan = wherePlan.get(schemaPath)\n\n if (!pathPlan) {\n throw new QueryError([{ path: schemaPath }])\n }\n\n if (pathPlan.type === 'invalid') {\n return { type: 'invalid', pathPlan }\n }\n\n if (schemaPath === 'relationTo') {\n return {\n type: 'scalar',\n column: sql`${collection}`,\n pathPlan,\n queryValueContext: {\n type: 'scalar',\n field: { name: 'relationTo', type: 'text' },\n isUUID: false,\n },\n }\n }\n\n if (pathPlan.type === 'hasManySelect') {\n const fieldContext = [...pathPlan.fieldsByCollection.values()].find(\n (field) => field.type === 'hasManySelect',\n )?.field\n\n if (!fieldContext) {\n return { type: 'invalid', pathPlan }\n }\n\n return {\n type: 'hasManySelect',\n fieldContext,\n jsonExpression: getHasManySelectExpression({\n adapter,\n collection,\n pathPlan,\n table,\n }),\n pathPlan,\n }\n }\n\n const collectionField = pathPlan.fieldsByCollection.get(collection)\n const fieldContext = collectionField?.type === 'scalar' ? collectionField : undefined\n const queryValueContext =\n fieldContext ??\n [...pathPlan.fieldsByCollection.values()].find(\n (field): field is ScalarWhereField => field.type === 'scalar',\n )\n\n if (!queryValueContext) {\n return { type: 'invalid', pathPlan }\n }\n\n return {\n type: 'scalar',\n column: fieldContext\n ? fieldContext.isLocalized\n ? adapter.tables[`${getTableName(table)}${adapter.localesSuffix}`][pathPlan.columnPath]\n : table[pathPlan.columnPath]\n : sql`null`,\n fieldContext,\n pathPlan,\n queryValueContext,\n }\n}\n\nconst getHasManySelectExpression = ({\n adapter,\n collection,\n pathPlan,\n table,\n}: {\n adapter: DrizzleAdapter\n collection: string\n pathPlan: WherePathPlan\n table: GenericTable\n}): string => {\n if (pathPlan.fieldsByCollection.get(collection)?.type !== 'hasManySelect') {\n return adapter.name === 'postgres' ? `'[]'::jsonb` : `'[]'`\n }\n\n const selectTablePath = pathPlan.schemaPath\n .split('.')\n .map((pathSegment) => toSnakeCase(pathSegment))\n .join('_')\n const valuesTableName = adapter.tableNameMap.get(`${toSnakeCase(collection)}_${selectTablePath}`)\n\n if (!valuesTableName) {\n throw new Error(\n `Polymorphic join collection \"${collection}\" has no value table for \"${pathPlan.schemaPath}\"`,\n )\n }\n\n let qualifiedValuesTableName = valuesTableName\n let parentTableName = getTableName(table)\n\n if (adapter.schemaName) {\n qualifiedValuesTableName = `\"${adapter.schemaName}\".\"${valuesTableName}\"`\n parentTableName = `\"${adapter.schemaName}\".\"${parentTableName}\"`\n }\n\n if (adapter.name === 'postgres') {\n return `(select coalesce(jsonb_agg(${qualifiedValuesTableName}.value), '[]'::jsonb) from ${qualifiedValuesTableName} where ${qualifiedValuesTableName}.parent_id = ${parentTableName}.id)`\n }\n\n return `(select json_group_array(${qualifiedValuesTableName}.value) from ${qualifiedValuesTableName} where ${qualifiedValuesTableName}.parent_id = ${parentTableName}.id)`\n}\n"],"names":["and","getTableName","isNotNull","isNull","or","sql","QueryError","toSnakeCase","buildOperatorConstraint","sanitizeQueryValue","supportedJSONQueryOperators","Set","buildPolymorphicJoinWhere","adapter","collection","locale","table","where","wherePlan","constraints","key","includes","toUpperCase","Array","isArray","path","combine","nestedConstraints","map","nestedWhere","nestedCondition","push","resolvedPath","resolveWherePath","schemaPath","payloadOperator","Object","keys","originalOperator","value","type","has","sanitizedQueryValue","field","fieldContext","isUUID","operator","relationOrPath","val","columns","length","raw","jsonQueryOperator","createJSONQuery","column","jsonExpression","pathSegments","pathPlan","columnPath","queryValueContext","operators","resolvedOperator","buildColumnConstraint","constraintValue","notEqualsConstraint","nonNullValues","filter","item","inConstraint","nullAwareInConstraint","wordConstraints","split","word","wordCondition","get","name","fieldsByCollection","values","find","getHasManySelectExpression","collectionField","undefined","isLocalized","tables","localesSuffix","selectTablePath","pathSegment","join","valuesTableName","tableNameMap","Error","qualifiedValuesTableName","parentTableName","schemaName"],"mappings":"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"}
@@ -2,6 +2,7 @@ import { type FlattenedField, type Where } from 'payload';
2
2
  import type { DrizzleAdapter } from '../types.js';
3
3
  export type ScalarWhereField = {
4
4
  field: FlattenedField;
5
+ isLocalized?: boolean;
5
6
  isUUID: boolean;
6
7
  type: 'scalar';
7
8
  };
@@ -22,7 +23,7 @@ export type PolymorphicJoinWherePlan = Map<string, WherePathPlan>;
22
23
  * whether the path uses a scalar column or a has-many select value table. A field may be absent
23
24
  * from some target collections; those branches compare against SQL NULL or an empty JSON array.
24
25
  *
25
- * Paths are marked as invalid when their storage shapes conflict, require localized or separate-row
26
+ * Paths are marked as invalid when their storage shapes conflict, require separate-row
26
27
  * traversal, have no matching field, lack a required column, or collide after path flattening.
27
28
  *
28
29
  * @returns A plan keyed by each unique schema path in `where`.
@@ -1 +1 @@
1
- {"version":3,"file":"createPolymorphicJoinWherePlan.d.ts","sourceRoot":"","sources":["../../src/find/createPolymorphicJoinWherePlan.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAAkB,KAAK,KAAK,EAAE,MAAM,SAAS,CAAA;AAGzE,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,aAAa,CAAA;AAK/D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,cAAc,CAAA;IACrB,MAAM,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,QAAQ,CAAA;CACf,CAAA;AAED,KAAK,oBAAoB,GAAG;IAAE,KAAK,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,GAAG,gBAAgB,CAAA;AAE/F,MAAM,MAAM,aAAa,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;IACrD,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,eAAe,GAAG,SAAS,GAAG,QAAQ,CAAA;CAC7C,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;AAEjE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,8BAA8B,qCAIxC;IACD,OAAO,EAAE,cAAc,CAAA;IACvB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,KAAK,EAAE,KAAK,CAAA;CACb,KAAG,wBAoIH,CAAA"}
1
+ {"version":3,"file":"createPolymorphicJoinWherePlan.d.ts","sourceRoot":"","sources":["../../src/find/createPolymorphicJoinWherePlan.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAAkB,KAAK,KAAK,EAAE,MAAM,SAAS,CAAA;AAGzE,OAAO,KAAK,EAAE,cAAc,EAAgB,MAAM,aAAa,CAAA;AAK/D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,cAAc,CAAA;IACrB,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,MAAM,EAAE,OAAO,CAAA;IACf,IAAI,EAAE,QAAQ,CAAA;CACf,CAAA;AAED,KAAK,oBAAoB,GAAG;IAAE,KAAK,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,GAAG,gBAAgB,CAAA;AAE/F,MAAM,MAAM,aAAa,GAAG;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;IACrD,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,eAAe,GAAG,SAAS,GAAG,QAAQ,CAAA;CAC7C,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;AAEjE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,8BAA8B,qCAIxC;IACD,OAAO,EAAE,cAAc,CAAA;IACvB,WAAW,EAAE,MAAM,EAAE,CAAA;IACrB,KAAK,EAAE,KAAK,CAAA;CACb,KAAG,wBA0IH,CAAA"}
@@ -8,7 +8,7 @@ import { sanitizePathSegment } from '../utilities/sanitizePathSegment.js';
8
8
  * whether the path uses a scalar column or a has-many select value table. A field may be absent
9
9
  * from some target collections; those branches compare against SQL NULL or an empty JSON array.
10
10
  *
11
- * Paths are marked as invalid when their storage shapes conflict, require localized or separate-row
11
+ * Paths are marked as invalid when their storage shapes conflict, require separate-row
12
12
  * traversal, have no matching field, lack a required column, or collide after path flattening.
13
13
  *
14
14
  * @returns A plan keyed by each unique schema path in `where`.
@@ -27,7 +27,8 @@ import { sanitizePathSegment } from '../utilities/sanitizePathSegment.js';
27
27
  return {
28
28
  collection,
29
29
  collectionConfig,
30
- table
30
+ table,
31
+ tableName
31
32
  };
32
33
  });
33
34
  const schemaPathsByColumnPath = new Map();
@@ -46,7 +47,7 @@ import { sanitizePathSegment } from '../utilities/sanitizePathSegment.js';
46
47
  let hasManySelect = false;
47
48
  let hasUnsupportedFieldShape = false;
48
49
  const scalarQueryValueSignatures = new Set();
49
- for (const { collection, collectionConfig, table } of collectionContexts){
50
+ for (const { collection, collectionConfig, table, tableName } of collectionContexts){
50
51
  const fieldAtPath = getFieldByPath({
51
52
  fields: collectionConfig.flattenedFields,
52
53
  path: schemaPath
@@ -78,7 +79,7 @@ import { sanitizePathSegment } from '../utilities/sanitizePathSegment.js';
78
79
  continue;
79
80
  }
80
81
  isFieldPresent = true;
81
- if (fieldAtPath.pathHasLocalized || pathHasSeparateRows({
82
+ if (pathHasSeparateRows({
82
83
  fields: collectionConfig.flattenedFields,
83
84
  path: schemaPath
84
85
  })) {
@@ -86,6 +87,10 @@ import { sanitizePathSegment } from '../utilities/sanitizePathSegment.js';
86
87
  continue;
87
88
  }
88
89
  if (fieldAtPath.field.type === 'select' && fieldAtPath.field.hasMany) {
90
+ if (fieldAtPath.pathHasLocalized) {
91
+ hasUnsupportedFieldShape = true;
92
+ continue;
93
+ }
89
94
  hasManySelect = true;
90
95
  fieldsByCollection.set(collection, {
91
96
  type: 'hasManySelect',
@@ -93,7 +98,8 @@ import { sanitizePathSegment } from '../utilities/sanitizePathSegment.js';
93
98
  });
94
99
  continue;
95
100
  }
96
- const fieldColumn = table[columnPath];
101
+ const fieldTable = fieldAtPath.pathHasLocalized ? adapter.tables[`${tableName}${adapter.localesSuffix}`] : table;
102
+ const fieldColumn = fieldTable?.[columnPath];
97
103
  if (!fieldColumn) {
98
104
  hasUnsupportedFieldShape = true;
99
105
  continue;
@@ -101,6 +107,9 @@ import { sanitizePathSegment } from '../utilities/sanitizePathSegment.js';
101
107
  fieldsByCollection.set(collection, {
102
108
  type: 'scalar',
103
109
  field: fieldAtPath.field,
110
+ ...fieldAtPath.pathHasLocalized && {
111
+ isLocalized: true
112
+ },
104
113
  isUUID: fieldColumn.columnType === 'PgUUID'
105
114
  });
106
115
  scalarQueryValueSignatures.add(getScalarQueryValueSignature({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/find/createPolymorphicJoinWherePlan.ts"],"sourcesContent":["import type { Column } from 'drizzle-orm'\n\nimport { type FlattenedField, getFieldByPath, type Where } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter, GenericTable } from '../types.js'\n\nimport { isUUIDType } from '../utilities/isUUIDType.js'\nimport { sanitizePathSegment } from '../utilities/sanitizePathSegment.js'\n\nexport type ScalarWhereField = {\n field: FlattenedField\n isUUID: boolean\n type: 'scalar'\n}\n\ntype CollectionWhereField = { field: FlattenedField; type: 'hasManySelect' } | ScalarWhereField\n\nexport type WherePathPlan = {\n columnPath: string\n fieldsByCollection: Map<string, CollectionWhereField>\n schemaPath: string\n type: 'hasManySelect' | 'invalid' | 'scalar'\n}\n\nexport type PolymorphicJoinWherePlan = Map<string, WherePathPlan>\n\n/**\n * Analyzes every leaf path in a polymorphic join where clause before SQL is built. Each plan entry\n * records the flattened column path, the compatible field shape for each target collection, and\n * whether the path uses a scalar column or a has-many select value table. A field may be absent\n * from some target collections; those branches compare against SQL NULL or an empty JSON array.\n *\n * Paths are marked as invalid when their storage shapes conflict, require localized or separate-row\n * traversal, have no matching field, lack a required column, or collide after path flattening.\n *\n * @returns A plan keyed by each unique schema path in `where`.\n * @throws If a target collection or its mapped database table is not available in the adapter.\n */\nexport const createPolymorphicJoinWherePlan = ({\n adapter,\n collections,\n where,\n}: {\n adapter: DrizzleAdapter\n collections: string[]\n where: Where\n}): PolymorphicJoinWherePlan => {\n const collectionContexts = collections.map((collection) => {\n const collectionConfig = adapter.payload.collections[collection]?.config\n\n if (!collectionConfig) {\n throw new Error(`Unknown polymorphic join collection \"${collection}\"`)\n }\n\n const tableName = adapter.tableNameMap.get(toSnakeCase(collection))\n const table = tableName ? (adapter.tables[tableName] as GenericTable | undefined) : undefined\n\n if (!table) {\n throw new Error(`Polymorphic join collection \"${collection}\" has no database table`)\n }\n\n return { collection, collectionConfig, table }\n })\n const schemaPathsByColumnPath = new Map<string, Set<string>>()\n const schemaPaths = new Set(getWhereSchemaPaths(where))\n\n for (const schemaPath of schemaPaths) {\n const columnPath = getColumnPath(schemaPath)\n const paths = schemaPathsByColumnPath.get(columnPath) ?? new Set<string>()\n\n paths.add(schemaPath)\n schemaPathsByColumnPath.set(columnPath, paths)\n }\n\n const plan: PolymorphicJoinWherePlan = new Map()\n\n for (const schemaPath of schemaPaths) {\n const columnPath = getColumnPath(schemaPath)\n const fieldsByCollection = new Map<string, CollectionWhereField>()\n let isFieldPresent = schemaPath === 'id' || schemaPath === 'relationTo'\n let hasManySelect = false\n let hasUnsupportedFieldShape = false\n const scalarQueryValueSignatures = new Set<string>()\n\n for (const { collection, collectionConfig, table } of collectionContexts) {\n const fieldAtPath = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: schemaPath,\n })\n\n if (schemaPath === 'id') {\n const idColumn = table['id'] as Column | undefined\n\n if (!idColumn) {\n hasUnsupportedFieldShape = true\n } else {\n scalarQueryValueSignatures.add(`id:${idColumn.getSQLType()}`)\n fieldsByCollection.set(collection, {\n type: 'scalar',\n field:\n fieldAtPath?.field ??\n ({\n name: 'id',\n type: isUUIDType(adapter.idType) ? 'text' : 'number',\n } as FlattenedField),\n isUUID: !fieldAtPath && isUUIDType(adapter.idType),\n })\n }\n\n continue\n }\n\n if (!fieldAtPath) {\n if (\n pathHasUnsupportedNestedContainer({\n fields: collectionConfig.flattenedFields,\n path: schemaPath,\n })\n ) {\n hasUnsupportedFieldShape = true\n }\n\n continue\n }\n\n isFieldPresent = true\n\n if (\n fieldAtPath.pathHasLocalized ||\n pathHasSeparateRows({ fields: collectionConfig.flattenedFields, path: schemaPath })\n ) {\n hasUnsupportedFieldShape = true\n continue\n }\n\n if (fieldAtPath.field.type === 'select' && fieldAtPath.field.hasMany) {\n hasManySelect = true\n fieldsByCollection.set(collection, {\n type: 'hasManySelect',\n field: fieldAtPath.field,\n })\n continue\n }\n\n const fieldColumn = table[columnPath] as Column | undefined\n\n if (!fieldColumn) {\n hasUnsupportedFieldShape = true\n continue\n }\n\n fieldsByCollection.set(collection, {\n type: 'scalar',\n field: fieldAtPath.field,\n isUUID: fieldColumn.columnType === 'PgUUID',\n })\n scalarQueryValueSignatures.add(\n getScalarQueryValueSignature({ column: fieldColumn, field: fieldAtPath.field }),\n )\n }\n\n const hasColumnPathCollision = (schemaPathsByColumnPath.get(columnPath)?.size ?? 0) > 1\n const isInvalid =\n hasColumnPathCollision ||\n !isFieldPresent ||\n hasUnsupportedFieldShape ||\n (hasManySelect && scalarQueryValueSignatures.size > 0) ||\n scalarQueryValueSignatures.size > 1\n\n plan.set(schemaPath, {\n type: isInvalid ? 'invalid' : hasManySelect ? 'hasManySelect' : 'scalar',\n columnPath,\n fieldsByCollection,\n schemaPath,\n })\n }\n\n return plan\n}\n\nconst textQueryFieldTypes = new Set<FlattenedField['type']>([\n 'code',\n 'email',\n 'slug',\n 'text',\n 'textarea',\n])\n\nconst getScalarQueryValueSignature = ({\n column,\n field,\n}: {\n column: Column\n field: FlattenedField\n}): string => {\n if (field.type === 'select' || field.type === 'radio') {\n const optionValues = field.options.map((option) =>\n typeof option === 'string' ? option : option.value,\n )\n\n return `${field.type}:${JSON.stringify(optionValues)}`\n }\n\n if (textQueryFieldTypes.has(field.type)) {\n return 'text'\n }\n\n return `${field.type}:${column.getSQLType()}`\n}\n\nconst getWhereSchemaPaths = (where: Where): string[] => {\n const paths: string[] = []\n\n for (const key in where) {\n if (['AND', 'OR'].includes(key.toUpperCase())) {\n if (Array.isArray(where[key])) {\n for (const nestedWhere of where[key]) {\n paths.push(...getWhereSchemaPaths(nestedWhere))\n }\n }\n } else {\n paths.push(key)\n }\n }\n\n return paths\n}\n\nconst getColumnPath = (schemaPath: string): string =>\n schemaPath\n .split('.')\n .map((segment) => sanitizePathSegment(segment))\n .join('_')\n\nconst pathHasSeparateRows = ({ fields, path }: { fields: FlattenedField[]; path: string }) => {\n const pathSegments = path.split('.')\n\n for (let segmentIndex = 1; segmentIndex < pathSegments.length; segmentIndex++) {\n const fieldAtParentPath = getFieldByPath({\n fields,\n path: pathSegments.slice(0, segmentIndex).join('.'),\n })\n\n if (fieldAtParentPath?.field.type === 'array' || fieldAtParentPath?.field.type === 'blocks') {\n return true\n }\n }\n\n return false\n}\n\nconst pathHasUnsupportedNestedContainer = ({\n fields,\n path,\n}: {\n fields: FlattenedField[]\n path: string\n}) => {\n const pathSegments = path.split('.')\n\n for (let segmentIndex = 1; segmentIndex < pathSegments.length; segmentIndex++) {\n const fieldAtParentPath = getFieldByPath({\n fields,\n path: pathSegments.slice(0, segmentIndex).join('.'),\n })\n\n if (!fieldAtParentPath) {\n return false\n }\n\n if (!['group', 'tab'].includes(fieldAtParentPath.field.type)) {\n return true\n }\n }\n\n return false\n}\n"],"names":["getFieldByPath","toSnakeCase","isUUIDType","sanitizePathSegment","createPolymorphicJoinWherePlan","adapter","collections","where","collectionContexts","map","collection","collectionConfig","payload","config","Error","tableName","tableNameMap","get","table","tables","undefined","schemaPathsByColumnPath","Map","schemaPaths","Set","getWhereSchemaPaths","schemaPath","columnPath","getColumnPath","paths","add","set","plan","fieldsByCollection","isFieldPresent","hasManySelect","hasUnsupportedFieldShape","scalarQueryValueSignatures","fieldAtPath","fields","flattenedFields","path","idColumn","getSQLType","type","field","name","idType","isUUID","pathHasUnsupportedNestedContainer","pathHasLocalized","pathHasSeparateRows","hasMany","fieldColumn","columnType","getScalarQueryValueSignature","column","hasColumnPathCollision","size","isInvalid","textQueryFieldTypes","optionValues","options","option","value","JSON","stringify","has","key","includes","toUpperCase","Array","isArray","nestedWhere","push","split","segment","join","pathSegments","segmentIndex","length","fieldAtParentPath","slice"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/find/createPolymorphicJoinWherePlan.ts"],"sourcesContent":["import type { Column } from 'drizzle-orm'\n\nimport { type FlattenedField, getFieldByPath, type Where } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter, GenericTable } from '../types.js'\n\nimport { isUUIDType } from '../utilities/isUUIDType.js'\nimport { sanitizePathSegment } from '../utilities/sanitizePathSegment.js'\n\nexport type ScalarWhereField = {\n field: FlattenedField\n isLocalized?: boolean\n isUUID: boolean\n type: 'scalar'\n}\n\ntype CollectionWhereField = { field: FlattenedField; type: 'hasManySelect' } | ScalarWhereField\n\nexport type WherePathPlan = {\n columnPath: string\n fieldsByCollection: Map<string, CollectionWhereField>\n schemaPath: string\n type: 'hasManySelect' | 'invalid' | 'scalar'\n}\n\nexport type PolymorphicJoinWherePlan = Map<string, WherePathPlan>\n\n/**\n * Analyzes every leaf path in a polymorphic join where clause before SQL is built. Each plan entry\n * records the flattened column path, the compatible field shape for each target collection, and\n * whether the path uses a scalar column or a has-many select value table. A field may be absent\n * from some target collections; those branches compare against SQL NULL or an empty JSON array.\n *\n * Paths are marked as invalid when their storage shapes conflict, require separate-row\n * traversal, have no matching field, lack a required column, or collide after path flattening.\n *\n * @returns A plan keyed by each unique schema path in `where`.\n * @throws If a target collection or its mapped database table is not available in the adapter.\n */\nexport const createPolymorphicJoinWherePlan = ({\n adapter,\n collections,\n where,\n}: {\n adapter: DrizzleAdapter\n collections: string[]\n where: Where\n}): PolymorphicJoinWherePlan => {\n const collectionContexts = collections.map((collection) => {\n const collectionConfig = adapter.payload.collections[collection]?.config\n\n if (!collectionConfig) {\n throw new Error(`Unknown polymorphic join collection \"${collection}\"`)\n }\n\n const tableName = adapter.tableNameMap.get(toSnakeCase(collection))\n const table = tableName ? (adapter.tables[tableName] as GenericTable | undefined) : undefined\n\n if (!table) {\n throw new Error(`Polymorphic join collection \"${collection}\" has no database table`)\n }\n\n return { collection, collectionConfig, table, tableName }\n })\n const schemaPathsByColumnPath = new Map<string, Set<string>>()\n const schemaPaths = new Set(getWhereSchemaPaths(where))\n\n for (const schemaPath of schemaPaths) {\n const columnPath = getColumnPath(schemaPath)\n const paths = schemaPathsByColumnPath.get(columnPath) ?? new Set<string>()\n\n paths.add(schemaPath)\n schemaPathsByColumnPath.set(columnPath, paths)\n }\n\n const plan: PolymorphicJoinWherePlan = new Map()\n\n for (const schemaPath of schemaPaths) {\n const columnPath = getColumnPath(schemaPath)\n const fieldsByCollection = new Map<string, CollectionWhereField>()\n let isFieldPresent = schemaPath === 'id' || schemaPath === 'relationTo'\n let hasManySelect = false\n let hasUnsupportedFieldShape = false\n const scalarQueryValueSignatures = new Set<string>()\n\n for (const { collection, collectionConfig, table, tableName } of collectionContexts) {\n const fieldAtPath = getFieldByPath({\n fields: collectionConfig.flattenedFields,\n path: schemaPath,\n })\n\n if (schemaPath === 'id') {\n const idColumn = table['id'] as Column | undefined\n\n if (!idColumn) {\n hasUnsupportedFieldShape = true\n } else {\n scalarQueryValueSignatures.add(`id:${idColumn.getSQLType()}`)\n fieldsByCollection.set(collection, {\n type: 'scalar',\n field:\n fieldAtPath?.field ??\n ({\n name: 'id',\n type: isUUIDType(adapter.idType) ? 'text' : 'number',\n } as FlattenedField),\n isUUID: !fieldAtPath && isUUIDType(adapter.idType),\n })\n }\n\n continue\n }\n\n if (!fieldAtPath) {\n if (\n pathHasUnsupportedNestedContainer({\n fields: collectionConfig.flattenedFields,\n path: schemaPath,\n })\n ) {\n hasUnsupportedFieldShape = true\n }\n\n continue\n }\n\n isFieldPresent = true\n\n if (pathHasSeparateRows({ fields: collectionConfig.flattenedFields, path: schemaPath })) {\n hasUnsupportedFieldShape = true\n continue\n }\n\n if (fieldAtPath.field.type === 'select' && fieldAtPath.field.hasMany) {\n if (fieldAtPath.pathHasLocalized) {\n hasUnsupportedFieldShape = true\n continue\n }\n\n hasManySelect = true\n fieldsByCollection.set(collection, {\n type: 'hasManySelect',\n field: fieldAtPath.field,\n })\n continue\n }\n\n const fieldTable = fieldAtPath.pathHasLocalized\n ? adapter.tables[`${tableName}${adapter.localesSuffix}`]\n : table\n const fieldColumn = fieldTable?.[columnPath] as Column | undefined\n\n if (!fieldColumn) {\n hasUnsupportedFieldShape = true\n continue\n }\n\n fieldsByCollection.set(collection, {\n type: 'scalar',\n field: fieldAtPath.field,\n ...(fieldAtPath.pathHasLocalized && { isLocalized: true }),\n isUUID: fieldColumn.columnType === 'PgUUID',\n })\n scalarQueryValueSignatures.add(\n getScalarQueryValueSignature({ column: fieldColumn, field: fieldAtPath.field }),\n )\n }\n\n const hasColumnPathCollision = (schemaPathsByColumnPath.get(columnPath)?.size ?? 0) > 1\n const isInvalid =\n hasColumnPathCollision ||\n !isFieldPresent ||\n hasUnsupportedFieldShape ||\n (hasManySelect && scalarQueryValueSignatures.size > 0) ||\n scalarQueryValueSignatures.size > 1\n\n plan.set(schemaPath, {\n type: isInvalid ? 'invalid' : hasManySelect ? 'hasManySelect' : 'scalar',\n columnPath,\n fieldsByCollection,\n schemaPath,\n })\n }\n\n return plan\n}\n\nconst textQueryFieldTypes = new Set<FlattenedField['type']>([\n 'code',\n 'email',\n 'slug',\n 'text',\n 'textarea',\n])\n\nconst getScalarQueryValueSignature = ({\n column,\n field,\n}: {\n column: Column\n field: FlattenedField\n}): string => {\n if (field.type === 'select' || field.type === 'radio') {\n const optionValues = field.options.map((option) =>\n typeof option === 'string' ? option : option.value,\n )\n\n return `${field.type}:${JSON.stringify(optionValues)}`\n }\n\n if (textQueryFieldTypes.has(field.type)) {\n return 'text'\n }\n\n return `${field.type}:${column.getSQLType()}`\n}\n\nconst getWhereSchemaPaths = (where: Where): string[] => {\n const paths: string[] = []\n\n for (const key in where) {\n if (['AND', 'OR'].includes(key.toUpperCase())) {\n if (Array.isArray(where[key])) {\n for (const nestedWhere of where[key]) {\n paths.push(...getWhereSchemaPaths(nestedWhere))\n }\n }\n } else {\n paths.push(key)\n }\n }\n\n return paths\n}\n\nconst getColumnPath = (schemaPath: string): string =>\n schemaPath\n .split('.')\n .map((segment) => sanitizePathSegment(segment))\n .join('_')\n\nconst pathHasSeparateRows = ({ fields, path }: { fields: FlattenedField[]; path: string }) => {\n const pathSegments = path.split('.')\n\n for (let segmentIndex = 1; segmentIndex < pathSegments.length; segmentIndex++) {\n const fieldAtParentPath = getFieldByPath({\n fields,\n path: pathSegments.slice(0, segmentIndex).join('.'),\n })\n\n if (fieldAtParentPath?.field.type === 'array' || fieldAtParentPath?.field.type === 'blocks') {\n return true\n }\n }\n\n return false\n}\n\nconst pathHasUnsupportedNestedContainer = ({\n fields,\n path,\n}: {\n fields: FlattenedField[]\n path: string\n}) => {\n const pathSegments = path.split('.')\n\n for (let segmentIndex = 1; segmentIndex < pathSegments.length; segmentIndex++) {\n const fieldAtParentPath = getFieldByPath({\n fields,\n path: pathSegments.slice(0, segmentIndex).join('.'),\n })\n\n if (!fieldAtParentPath) {\n return false\n }\n\n if (!['group', 'tab'].includes(fieldAtParentPath.field.type)) {\n return true\n }\n }\n\n return false\n}\n"],"names":["getFieldByPath","toSnakeCase","isUUIDType","sanitizePathSegment","createPolymorphicJoinWherePlan","adapter","collections","where","collectionContexts","map","collection","collectionConfig","payload","config","Error","tableName","tableNameMap","get","table","tables","undefined","schemaPathsByColumnPath","Map","schemaPaths","Set","getWhereSchemaPaths","schemaPath","columnPath","getColumnPath","paths","add","set","plan","fieldsByCollection","isFieldPresent","hasManySelect","hasUnsupportedFieldShape","scalarQueryValueSignatures","fieldAtPath","fields","flattenedFields","path","idColumn","getSQLType","type","field","name","idType","isUUID","pathHasUnsupportedNestedContainer","pathHasSeparateRows","hasMany","pathHasLocalized","fieldTable","localesSuffix","fieldColumn","isLocalized","columnType","getScalarQueryValueSignature","column","hasColumnPathCollision","size","isInvalid","textQueryFieldTypes","optionValues","options","option","value","JSON","stringify","has","key","includes","toUpperCase","Array","isArray","nestedWhere","push","split","segment","join","pathSegments","segmentIndex","length","fieldAtParentPath","slice"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/find/traverseFields.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,cAAc,EAEnB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,UAAU,EAEhB,MAAM,SAAS,CAAA;AAIhB,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAcpD,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,cAAc,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,SAAS,EAAE,SAAS,CAAA;IACpB,KAAK,CAAC,EAAE,qBAAqB,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,iBAAiB,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gBAAgB,EAAE;QAChB,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,IAAI,CAAC,EAAE,OAAO,CAAA;QACd,KAAK,CAAC,EAAE,OAAO,CAAA;KAChB,CAAA;CACF,CAAA;AAED,eAAO,MAAM,cAAc,iSAuBxB,iBAAiB,4BA0oBnB,CAAA"}
1
+ {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/find/traverseFields.ts"],"names":[],"mappings":"AAIA,OAAO,EAIL,KAAK,cAAc,EAEnB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,UAAU,EAEhB,MAAM,SAAS,CAAA;AAIhB,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAcpD,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,cAAc,CAAA;IACvB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,SAAS,EAAE,SAAS,CAAA;IACpB,KAAK,CAAC,EAAE,qBAAqB,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,iBAAiB,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,gBAAgB,EAAE;QAChB,OAAO,CAAC,EAAE,OAAO,CAAA;QACjB,IAAI,CAAC,EAAE,OAAO,CAAA;QACd,KAAK,CAAC,EAAE,OAAO,CAAA;KAChB,CAAA;CACF,CAAA;AAED,eAAO,MAAM,cAAc,iSAuBxB,iBAAiB,4BA2oBnB,CAAA"}
@@ -258,6 +258,7 @@ export const traverseFields = ({ _locales, adapter, collectionSlug, currentArgs,
258
258
  limit,
259
259
  locale,
260
260
  page,
261
+ pageSize: limitArg,
261
262
  path,
262
263
  shouldCount,
263
264
  sort,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/find/traverseFields.ts"],"sourcesContent":["import type { LibSQLDatabase } from 'drizzle-orm/libsql'\nimport type { SQLiteSelect } from 'drizzle-orm/sqlite-core'\n\nimport { count, sql } from 'drizzle-orm'\nimport {\n appendVersionToQueryKey,\n buildVersionCollectionFields,\n combineQueries,\n type FlattenedField,\n getQueryDraftsSort,\n type JoinQuery,\n type SelectMode,\n type SelectType,\n type Where,\n} from 'payload'\nimport { fieldIsVirtual, fieldShouldBeLocalized, hasDraftsEnabled } from 'payload/shared'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { BuildQueryJoinAliases, DrizzleAdapter } from '../types.js'\nimport type { Result } from './buildFindManyArgs.js'\n\nimport { buildQuery } from '../queries/buildQuery.js'\nimport { getTableAlias } from '../queries/getTableAlias.js'\nimport { getArrayRelationName } from '../utilities/getArrayRelationName.js'\nimport { getNameFromDrizzleTable } from '../utilities/getNameFromDrizzleTable.js'\nimport { jsonAggBuildObject } from '../utilities/json.js'\nimport { rawConstraint } from '../utilities/rawConstraint.js'\nimport {\n InternalBlockTableNameIndex,\n resolveBlockTableName,\n} from '../utilities/validateExistingBlockIsIdentical.js'\nimport { buildPolymorphicJoinQuery } from './buildPolymorphicJoinQuery.js'\n\ntype TraverseFieldArgs = {\n _locales: Result\n adapter: DrizzleAdapter\n collectionSlug?: string\n currentArgs: Result\n currentTableName: string\n depth?: number\n draftsEnabled?: boolean\n fields: FlattenedField[]\n forceWithFields?: boolean\n joinQuery: JoinQuery\n joins?: BuildQueryJoinAliases\n locale?: string\n parentIsLocalized?: boolean\n path: string\n select?: SelectType\n selectAllOnCurrentLevel?: boolean\n selectMode?: SelectMode\n tablePath: string\n topLevelArgs: Record<string, unknown>\n topLevelTableName: string\n versions?: boolean\n withTabledFields: {\n numbers?: boolean\n rels?: boolean\n texts?: boolean\n }\n}\n\nexport const traverseFields = ({\n _locales,\n adapter,\n collectionSlug,\n currentArgs,\n currentTableName,\n depth,\n draftsEnabled,\n fields,\n forceWithFields,\n joinQuery = {},\n joins,\n locale,\n parentIsLocalized = false,\n path,\n select,\n selectAllOnCurrentLevel = false,\n selectMode,\n tablePath,\n topLevelArgs,\n topLevelTableName,\n versions,\n withTabledFields,\n}: TraverseFieldArgs) => {\n fields.forEach((field) => {\n if (fieldIsVirtual(field)) {\n return\n }\n\n const isFieldLocalized = fieldShouldBeLocalized({\n field,\n parentIsLocalized,\n })\n\n // handle simple relationship\n if (\n depth > 0 &&\n (field.type === 'upload' || field.type === 'relationship') &&\n !field.hasMany &&\n typeof field.relationTo === 'string'\n ) {\n if (isFieldLocalized) {\n _locales.with[`${path}${field.name}`] = true\n } else {\n currentArgs.with[`${path}${field.name}`] = true\n }\n }\n\n switch (field.type) {\n case 'array': {\n const arraySelect = selectAllOnCurrentLevel ? true : select?.[field.name]\n\n if (select) {\n if (\n (selectMode === 'include' && typeof arraySelect === 'undefined') ||\n (selectMode === 'exclude' && arraySelect === false)\n ) {\n break\n }\n }\n\n const withArray: Result = {\n columns:\n typeof arraySelect === 'object'\n ? {\n id: true,\n _order: true,\n }\n : {\n _parentID: false,\n },\n orderBy: ({ _order }, { asc }) => [asc(_order)],\n with: {},\n }\n\n const arrayTableName = adapter.tableNameMap.get(\n `${currentTableName}_${tablePath}${toSnakeCase(field.name)}`,\n )\n\n if (typeof arraySelect === 'object') {\n if (adapter.tables[arrayTableName]._locale) {\n withArray.columns._locale = true\n }\n\n if (adapter.tables[arrayTableName]._uuid) {\n withArray.columns._uuid = true\n }\n }\n\n const arrayTableNameWithLocales = `${arrayTableName}${adapter.localesSuffix}`\n\n if (adapter.tables[arrayTableNameWithLocales]) {\n withArray.with._locales = {\n columns:\n typeof arraySelect === 'object'\n ? {\n _locale: true,\n }\n : {\n id: false,\n _parentID: false,\n },\n with: {},\n }\n }\n\n const relationName = getArrayRelationName({\n field,\n path: `${path}${field.name}`,\n tableName: arrayTableName,\n })\n\n currentArgs.with[relationName] = withArray\n\n traverseFields({\n _locales: withArray.with._locales,\n adapter,\n currentArgs: withArray,\n currentTableName: arrayTableName,\n depth,\n draftsEnabled,\n fields: field.flattenedFields,\n forceWithFields,\n joinQuery,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: '',\n select: typeof arraySelect === 'object' ? arraySelect : undefined,\n selectMode,\n tablePath: '',\n topLevelArgs,\n topLevelTableName,\n withTabledFields,\n })\n\n if (\n typeof arraySelect === 'object' &&\n withArray.with._locales &&\n Object.keys(withArray.with._locales).length === 1\n ) {\n delete withArray.with._locales\n }\n\n break\n }\n\n case 'blocks': {\n const blocksSelect = selectAllOnCurrentLevel ? true : select?.[field.name]\n\n if (select) {\n if (\n (selectMode === 'include' && !blocksSelect) ||\n (selectMode === 'exclude' && blocksSelect === false)\n ) {\n break\n }\n }\n\n if (adapter.blocksAsJSON) {\n if (select || selectAllOnCurrentLevel) {\n const fieldPath = `${path}${field.name}`\n\n if ((isFieldLocalized || parentIsLocalized) && _locales) {\n _locales.columns[fieldPath] = true\n } else if (adapter.tables[currentTableName]?.[fieldPath]) {\n currentArgs.columns[fieldPath] = true\n }\n }\n\n break\n }\n\n field.blocks.forEach((_block) => {\n const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block\n const blockKey = `_blocks_${block.slug}${!block[InternalBlockTableNameIndex] ? '' : `_${block[InternalBlockTableNameIndex]}`}`\n\n let blockSelect: boolean | SelectType | undefined\n\n let blockSelectMode = selectMode\n\n if (selectMode === 'include' && blocksSelect === true) {\n blockSelect = true\n }\n\n if (typeof blocksSelect === 'object') {\n if (typeof blocksSelect[block.slug] === 'object') {\n blockSelect = blocksSelect[block.slug]\n } else if (\n (selectMode === 'include' && typeof blocksSelect[block.slug] === 'undefined') ||\n (selectMode === 'exclude' && blocksSelect[block.slug] === false)\n ) {\n blockSelect = {}\n blockSelectMode = 'include'\n } else if (selectMode === 'include' && Boolean(blocksSelect[block.slug])) {\n blockSelect = true\n }\n }\n\n if (!topLevelArgs[blockKey]) {\n const withBlock: Result = {\n columns:\n typeof blockSelect === 'object'\n ? {\n id: true,\n _order: true,\n _path: true,\n }\n : {\n _parentID: false,\n },\n orderBy: ({ _order }, { asc }) => [asc(_order)],\n with: {},\n }\n\n const tableName = resolveBlockTableName(\n block,\n adapter.tableNameMap.get(`${topLevelTableName}_blocks_${toSnakeCase(block.slug)}`),\n )\n\n if (typeof blockSelect === 'object') {\n if (adapter.tables[tableName]._locale) {\n withBlock.columns._locale = true\n }\n\n if (adapter.tables[tableName]._uuid) {\n withBlock.columns._uuid = true\n }\n }\n\n if (adapter.tables[`${tableName}${adapter.localesSuffix}`]) {\n withBlock.with._locales = {\n with: {},\n }\n\n if (typeof blockSelect === 'object') {\n withBlock.with._locales.columns = {\n _locale: true,\n }\n }\n }\n topLevelArgs.with[blockKey] = withBlock\n\n traverseFields({\n _locales: withBlock.with._locales,\n adapter,\n currentArgs: withBlock,\n currentTableName: tableName,\n depth,\n draftsEnabled,\n fields: block.flattenedFields,\n forceWithFields: blockSelect === true,\n joinQuery,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: '',\n select: typeof blockSelect === 'object' ? blockSelect : undefined,\n selectMode: blockSelectMode,\n tablePath: '',\n topLevelArgs,\n topLevelTableName,\n withTabledFields,\n })\n\n if (\n typeof blockSelect === 'object' &&\n withBlock.with._locales &&\n Object.keys(withBlock.with._locales.columns).length === 1\n ) {\n delete withBlock.with._locales\n }\n }\n })\n\n break\n }\n\n case 'group':\n case 'tab': {\n const fieldSelect = select?.[field.name]\n\n if (fieldSelect === false) {\n break\n }\n\n traverseFields({\n _locales,\n adapter,\n collectionSlug,\n currentArgs,\n currentTableName,\n depth,\n draftsEnabled,\n fields: field.flattenedFields,\n forceWithFields,\n joinQuery,\n joins,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: `${path}${field.name}_`,\n select: typeof fieldSelect === 'object' ? fieldSelect : undefined,\n selectAllOnCurrentLevel:\n selectAllOnCurrentLevel ||\n fieldSelect === true ||\n (selectMode === 'exclude' && typeof fieldSelect === 'undefined'),\n selectMode,\n tablePath: `${tablePath}${toSnakeCase(field.name)}_`,\n topLevelArgs,\n topLevelTableName,\n versions,\n withTabledFields,\n })\n\n break\n }\n case 'join': {\n // when `joinsQuery` is false, do not join\n if (joinQuery === false) {\n break\n }\n\n if (\n (select && selectMode === 'include' && !select[field.name]) ||\n (selectMode === 'exclude' && select[field.name] === false)\n ) {\n break\n }\n\n const joinSchemaPath = `${path.replaceAll('_', '.')}${field.name}`\n\n if (joinQuery[joinSchemaPath] === false) {\n break\n }\n\n const {\n count: shouldCount = false,\n limit: limitArg = field.defaultLimit ?? 10,\n page,\n sort = field.defaultSort,\n where,\n } = joinQuery[joinSchemaPath] || {}\n let limit = limitArg\n\n if (limit !== 0) {\n // get an additional document and slice it later to determine if there is a next page\n limit += 1\n }\n\n if (Array.isArray(field.collection)) {\n const polymorphicJoinQuery = buildPolymorphicJoinQuery({\n adapter,\n currentTableName,\n field,\n limit,\n locale,\n page,\n path,\n shouldCount,\n sort,\n where,\n })\n\n currentArgs.extras[polymorphicJoinQuery.columnName] = polymorphicJoinQuery.documents\n\n if (polymorphicJoinQuery.count) {\n currentArgs.extras[`${polymorphicJoinQuery.columnName}_count`] =\n polymorphicJoinQuery.count\n }\n } else {\n const db = adapter.drizzle as LibSQLDatabase\n const useDrafts =\n (versions || draftsEnabled) &&\n hasDraftsEnabled(adapter.payload.collections[field.collection].config)\n\n const fields = useDrafts\n ? buildVersionCollectionFields(\n adapter.payload.config,\n adapter.payload.collections[field.collection].config,\n true,\n )\n : adapter.payload.collections[field.collection].config.flattenedFields\n\n const joinCollectionTableName = adapter.tableNameMap.get(\n useDrafts\n ? `_${toSnakeCase(field.collection)}${adapter.versionsSuffix}`\n : toSnakeCase(field.collection),\n )\n\n const joins: BuildQueryJoinAliases = []\n\n const currentIDColumn = versions\n ? adapter.tables[currentTableName].parent\n : adapter.tables[currentTableName].id\n\n let joinQueryWhere: Where\n\n const currentIDRaw = sql.raw(\n `\"${getNameFromDrizzleTable(currentIDColumn.table)}\".\"${currentIDColumn.name}\"`,\n )\n\n if (Array.isArray(field.targetField.relationTo)) {\n joinQueryWhere = {\n [field.on]: {\n equals: {\n relationTo: collectionSlug,\n value: rawConstraint(currentIDRaw),\n },\n },\n }\n } else {\n joinQueryWhere = {\n [field.on]: {\n equals: rawConstraint(currentIDRaw),\n },\n }\n }\n\n if (where && Object.keys(where).length) {\n joinQueryWhere = {\n and: [joinQueryWhere, where],\n }\n }\n\n if (useDrafts) {\n joinQueryWhere = combineQueries(appendVersionToQueryKey(joinQueryWhere), {\n latest: { equals: true },\n })\n }\n\n const columnName = `${path.replaceAll('.', '_')}${field.name}`\n\n const subQueryAlias = `${columnName}_alias`\n\n const { newAliasTable } = getTableAlias({\n adapter,\n tableName: joinCollectionTableName,\n })\n\n const {\n orderBy,\n selectFields,\n where: subQueryWhere,\n } = buildQuery({\n adapter,\n aliasTable: newAliasTable,\n fields,\n joins,\n locale,\n parentIsLocalized,\n selectLocale: true,\n sort: useDrafts\n ? getQueryDraftsSort({\n collectionConfig: adapter.payload.collections[field.collection].config,\n sort,\n })\n : sort,\n tableName: joinCollectionTableName,\n where: joinQueryWhere,\n })\n\n for (let key in selectFields) {\n const val = selectFields[key]\n\n if (val.table && getNameFromDrizzleTable(val.table) === joinCollectionTableName) {\n delete selectFields[key]\n key = key.split('.').pop()\n selectFields[key] = newAliasTable[key]\n }\n }\n\n if (useDrafts) {\n selectFields.parent = newAliasTable.parent\n }\n\n let query: SQLiteSelect = db\n .select(selectFields as any)\n .from(newAliasTable)\n .where(subQueryWhere)\n .orderBy(() => orderBy.map(({ column, order }) => order(column)))\n .$dynamic()\n\n joins.forEach(({ type, condition, table }) => {\n query = query[type ?? 'leftJoin'](table, condition)\n })\n\n if (page && limit !== 0) {\n const offset = (page - 1) * limit - 1\n if (offset > 0) {\n query = query.offset(offset)\n }\n }\n\n if (limit !== 0) {\n query = query.limit(limit)\n }\n\n const subQuery = query.as(subQueryAlias)\n\n if (shouldCount) {\n let countSubquery: SQLiteSelect = db\n .select(selectFields as any)\n\n .from(newAliasTable)\n .where(subQueryWhere)\n .$dynamic()\n\n joins.forEach(({ type, condition, table }) => {\n countSubquery = countSubquery[type ?? 'leftJoin'](table, condition)\n })\n\n currentArgs.extras[`${columnName}_count`] = sql`${db\n .select({\n count: count(),\n })\n .from(sql`${countSubquery.as(`${subQueryAlias}_count_subquery`)}`)}`.as(\n `${subQueryAlias}_count`,\n )\n }\n\n currentArgs.extras[columnName] = sql`${db\n .select({\n result: jsonAggBuildObject(adapter, {\n id: sql.raw(`\"${subQueryAlias}\".${useDrafts ? 'parent_id' : 'id'}`),\n ...(selectFields._locale && {\n locale: sql.raw(`\"${subQueryAlias}\".${selectFields._locale.name}`),\n }),\n }),\n })\n .from(sql`${subQuery}`)}`.as(subQueryAlias)\n }\n\n break\n }\n\n case 'point': {\n if (adapter.name === 'sqlite') {\n break\n }\n\n const args = isFieldLocalized ? _locales : currentArgs\n if (!args.columns) {\n args.columns = {}\n }\n\n if (!args.extras) {\n args.extras = {}\n }\n\n const name = `${path}${field.name}`\n\n // Drizzle handles that poorly. See https://github.com/drizzle-team/drizzle-orm/issues/2526\n // Additionally, this way we format the column value straight in the database using ST_AsGeoJSON\n args.columns[name] = false\n\n let shouldSelect = false\n\n if (select || selectAllOnCurrentLevel) {\n if (\n selectAllOnCurrentLevel ||\n (selectMode === 'include' && Boolean(select[field.name])) ||\n (selectMode === 'exclude' && typeof select[field.name] === 'undefined')\n ) {\n shouldSelect = true\n }\n } else {\n shouldSelect = true\n }\n const tableName = fieldShouldBeLocalized({ field, parentIsLocalized })\n ? `${currentTableName}${adapter.localesSuffix}`\n : currentTableName\n\n if (shouldSelect) {\n args.extras[name] = sql\n .raw(`ST_AsGeoJSON(\"${adapter.tables[tableName][name].name}\")::jsonb`)\n .as(name)\n }\n break\n }\n\n case 'select': {\n if (select && !selectAllOnCurrentLevel) {\n if (\n (selectMode === 'include' && !select[field.name]) ||\n (selectMode === 'exclude' && select[field.name] === false)\n ) {\n break\n }\n }\n\n if (field.hasMany) {\n const withSelect: Result = {\n columns: {\n id: false,\n order: false,\n parent: false,\n },\n orderBy: ({ order }, { asc }) => [asc(order)],\n }\n\n currentArgs.with[`${path}${field.name}`] = withSelect\n break\n }\n\n if (select || selectAllOnCurrentLevel) {\n const fieldPath = `${path}${field.name}`\n\n if ((isFieldLocalized || parentIsLocalized) && _locales) {\n _locales.columns[fieldPath] = true\n } else if (adapter.tables[currentTableName]?.[fieldPath]) {\n currentArgs.columns[fieldPath] = true\n }\n }\n\n break\n }\n\n default: {\n if (forceWithFields) {\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n (field.hasMany || Array.isArray(field.relationTo))\n ) {\n withTabledFields.rels = true\n }\n\n if (field.type === 'number' && field.hasMany) {\n withTabledFields.numbers = true\n }\n\n if (field.type === 'text' && field.hasMany) {\n withTabledFields.texts = true\n }\n }\n\n if (!select && !selectAllOnCurrentLevel) {\n break\n }\n\n if (\n selectAllOnCurrentLevel ||\n (selectMode === 'include' && Boolean(select[field.name])) ||\n (selectMode === 'exclude' && typeof select[field.name] === 'undefined')\n ) {\n const fieldPath = `${path}${field.name}`\n\n if ((isFieldLocalized || parentIsLocalized) && _locales) {\n _locales.columns[fieldPath] = true\n } else if (adapter.tables[currentTableName]?.[fieldPath]) {\n currentArgs.columns[fieldPath] = true\n }\n\n if (\n !withTabledFields.rels &&\n (field.type === 'relationship' || field.type === 'upload') &&\n (field.hasMany || Array.isArray(field.relationTo))\n ) {\n withTabledFields.rels = true\n }\n\n if (!withTabledFields.numbers && field.type === 'number' && field.hasMany) {\n withTabledFields.numbers = true\n }\n\n if (!withTabledFields.texts && field.type === 'text' && field.hasMany) {\n withTabledFields.texts = true\n }\n }\n\n break\n }\n }\n })\n\n return topLevelArgs\n}\n"],"names":["count","sql","appendVersionToQueryKey","buildVersionCollectionFields","combineQueries","getQueryDraftsSort","fieldIsVirtual","fieldShouldBeLocalized","hasDraftsEnabled","toSnakeCase","buildQuery","getTableAlias","getArrayRelationName","getNameFromDrizzleTable","jsonAggBuildObject","rawConstraint","InternalBlockTableNameIndex","resolveBlockTableName","buildPolymorphicJoinQuery","traverseFields","_locales","adapter","collectionSlug","currentArgs","currentTableName","depth","draftsEnabled","fields","forceWithFields","joinQuery","joins","locale","parentIsLocalized","path","select","selectAllOnCurrentLevel","selectMode","tablePath","topLevelArgs","topLevelTableName","versions","withTabledFields","forEach","field","isFieldLocalized","type","hasMany","relationTo","with","name","arraySelect","withArray","columns","id","_order","_parentID","orderBy","asc","arrayTableName","tableNameMap","get","tables","_locale","_uuid","arrayTableNameWithLocales","localesSuffix","relationName","tableName","flattenedFields","localized","undefined","Object","keys","length","blocksSelect","blocksAsJSON","fieldPath","blocks","_block","block","payload","blockKey","slug","blockSelect","blockSelectMode","Boolean","withBlock","_path","fieldSelect","joinSchemaPath","replaceAll","shouldCount","limit","limitArg","defaultLimit","page","sort","defaultSort","where","Array","isArray","collection","polymorphicJoinQuery","extras","columnName","documents","db","drizzle","useDrafts","collections","config","joinCollectionTableName","versionsSuffix","currentIDColumn","parent","joinQueryWhere","currentIDRaw","raw","table","targetField","on","equals","value","and","latest","subQueryAlias","newAliasTable","selectFields","subQueryWhere","aliasTable","selectLocale","collectionConfig","key","val","split","pop","query","from","map","column","order","$dynamic","condition","offset","subQuery","as","countSubquery","result","args","shouldSelect","withSelect","rels","numbers","texts"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/find/traverseFields.ts"],"sourcesContent":["import type { LibSQLDatabase } from 'drizzle-orm/libsql'\nimport type { SQLiteSelect } from 'drizzle-orm/sqlite-core'\n\nimport { count, sql } from 'drizzle-orm'\nimport {\n appendVersionToQueryKey,\n buildVersionCollectionFields,\n combineQueries,\n type FlattenedField,\n getQueryDraftsSort,\n type JoinQuery,\n type SelectMode,\n type SelectType,\n type Where,\n} from 'payload'\nimport { fieldIsVirtual, fieldShouldBeLocalized, hasDraftsEnabled } from 'payload/shared'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { BuildQueryJoinAliases, DrizzleAdapter } from '../types.js'\nimport type { Result } from './buildFindManyArgs.js'\n\nimport { buildQuery } from '../queries/buildQuery.js'\nimport { getTableAlias } from '../queries/getTableAlias.js'\nimport { getArrayRelationName } from '../utilities/getArrayRelationName.js'\nimport { getNameFromDrizzleTable } from '../utilities/getNameFromDrizzleTable.js'\nimport { jsonAggBuildObject } from '../utilities/json.js'\nimport { rawConstraint } from '../utilities/rawConstraint.js'\nimport {\n InternalBlockTableNameIndex,\n resolveBlockTableName,\n} from '../utilities/validateExistingBlockIsIdentical.js'\nimport { buildPolymorphicJoinQuery } from './buildPolymorphicJoinQuery.js'\n\ntype TraverseFieldArgs = {\n _locales: Result\n adapter: DrizzleAdapter\n collectionSlug?: string\n currentArgs: Result\n currentTableName: string\n depth?: number\n draftsEnabled?: boolean\n fields: FlattenedField[]\n forceWithFields?: boolean\n joinQuery: JoinQuery\n joins?: BuildQueryJoinAliases\n locale?: string\n parentIsLocalized?: boolean\n path: string\n select?: SelectType\n selectAllOnCurrentLevel?: boolean\n selectMode?: SelectMode\n tablePath: string\n topLevelArgs: Record<string, unknown>\n topLevelTableName: string\n versions?: boolean\n withTabledFields: {\n numbers?: boolean\n rels?: boolean\n texts?: boolean\n }\n}\n\nexport const traverseFields = ({\n _locales,\n adapter,\n collectionSlug,\n currentArgs,\n currentTableName,\n depth,\n draftsEnabled,\n fields,\n forceWithFields,\n joinQuery = {},\n joins,\n locale,\n parentIsLocalized = false,\n path,\n select,\n selectAllOnCurrentLevel = false,\n selectMode,\n tablePath,\n topLevelArgs,\n topLevelTableName,\n versions,\n withTabledFields,\n}: TraverseFieldArgs) => {\n fields.forEach((field) => {\n if (fieldIsVirtual(field)) {\n return\n }\n\n const isFieldLocalized = fieldShouldBeLocalized({\n field,\n parentIsLocalized,\n })\n\n // handle simple relationship\n if (\n depth > 0 &&\n (field.type === 'upload' || field.type === 'relationship') &&\n !field.hasMany &&\n typeof field.relationTo === 'string'\n ) {\n if (isFieldLocalized) {\n _locales.with[`${path}${field.name}`] = true\n } else {\n currentArgs.with[`${path}${field.name}`] = true\n }\n }\n\n switch (field.type) {\n case 'array': {\n const arraySelect = selectAllOnCurrentLevel ? true : select?.[field.name]\n\n if (select) {\n if (\n (selectMode === 'include' && typeof arraySelect === 'undefined') ||\n (selectMode === 'exclude' && arraySelect === false)\n ) {\n break\n }\n }\n\n const withArray: Result = {\n columns:\n typeof arraySelect === 'object'\n ? {\n id: true,\n _order: true,\n }\n : {\n _parentID: false,\n },\n orderBy: ({ _order }, { asc }) => [asc(_order)],\n with: {},\n }\n\n const arrayTableName = adapter.tableNameMap.get(\n `${currentTableName}_${tablePath}${toSnakeCase(field.name)}`,\n )\n\n if (typeof arraySelect === 'object') {\n if (adapter.tables[arrayTableName]._locale) {\n withArray.columns._locale = true\n }\n\n if (adapter.tables[arrayTableName]._uuid) {\n withArray.columns._uuid = true\n }\n }\n\n const arrayTableNameWithLocales = `${arrayTableName}${adapter.localesSuffix}`\n\n if (adapter.tables[arrayTableNameWithLocales]) {\n withArray.with._locales = {\n columns:\n typeof arraySelect === 'object'\n ? {\n _locale: true,\n }\n : {\n id: false,\n _parentID: false,\n },\n with: {},\n }\n }\n\n const relationName = getArrayRelationName({\n field,\n path: `${path}${field.name}`,\n tableName: arrayTableName,\n })\n\n currentArgs.with[relationName] = withArray\n\n traverseFields({\n _locales: withArray.with._locales,\n adapter,\n currentArgs: withArray,\n currentTableName: arrayTableName,\n depth,\n draftsEnabled,\n fields: field.flattenedFields,\n forceWithFields,\n joinQuery,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: '',\n select: typeof arraySelect === 'object' ? arraySelect : undefined,\n selectMode,\n tablePath: '',\n topLevelArgs,\n topLevelTableName,\n withTabledFields,\n })\n\n if (\n typeof arraySelect === 'object' &&\n withArray.with._locales &&\n Object.keys(withArray.with._locales).length === 1\n ) {\n delete withArray.with._locales\n }\n\n break\n }\n\n case 'blocks': {\n const blocksSelect = selectAllOnCurrentLevel ? true : select?.[field.name]\n\n if (select) {\n if (\n (selectMode === 'include' && !blocksSelect) ||\n (selectMode === 'exclude' && blocksSelect === false)\n ) {\n break\n }\n }\n\n if (adapter.blocksAsJSON) {\n if (select || selectAllOnCurrentLevel) {\n const fieldPath = `${path}${field.name}`\n\n if ((isFieldLocalized || parentIsLocalized) && _locales) {\n _locales.columns[fieldPath] = true\n } else if (adapter.tables[currentTableName]?.[fieldPath]) {\n currentArgs.columns[fieldPath] = true\n }\n }\n\n break\n }\n\n field.blocks.forEach((_block) => {\n const block = typeof _block === 'string' ? adapter.payload.blocks[_block] : _block\n const blockKey = `_blocks_${block.slug}${!block[InternalBlockTableNameIndex] ? '' : `_${block[InternalBlockTableNameIndex]}`}`\n\n let blockSelect: boolean | SelectType | undefined\n\n let blockSelectMode = selectMode\n\n if (selectMode === 'include' && blocksSelect === true) {\n blockSelect = true\n }\n\n if (typeof blocksSelect === 'object') {\n if (typeof blocksSelect[block.slug] === 'object') {\n blockSelect = blocksSelect[block.slug]\n } else if (\n (selectMode === 'include' && typeof blocksSelect[block.slug] === 'undefined') ||\n (selectMode === 'exclude' && blocksSelect[block.slug] === false)\n ) {\n blockSelect = {}\n blockSelectMode = 'include'\n } else if (selectMode === 'include' && Boolean(blocksSelect[block.slug])) {\n blockSelect = true\n }\n }\n\n if (!topLevelArgs[blockKey]) {\n const withBlock: Result = {\n columns:\n typeof blockSelect === 'object'\n ? {\n id: true,\n _order: true,\n _path: true,\n }\n : {\n _parentID: false,\n },\n orderBy: ({ _order }, { asc }) => [asc(_order)],\n with: {},\n }\n\n const tableName = resolveBlockTableName(\n block,\n adapter.tableNameMap.get(`${topLevelTableName}_blocks_${toSnakeCase(block.slug)}`),\n )\n\n if (typeof blockSelect === 'object') {\n if (adapter.tables[tableName]._locale) {\n withBlock.columns._locale = true\n }\n\n if (adapter.tables[tableName]._uuid) {\n withBlock.columns._uuid = true\n }\n }\n\n if (adapter.tables[`${tableName}${adapter.localesSuffix}`]) {\n withBlock.with._locales = {\n with: {},\n }\n\n if (typeof blockSelect === 'object') {\n withBlock.with._locales.columns = {\n _locale: true,\n }\n }\n }\n topLevelArgs.with[blockKey] = withBlock\n\n traverseFields({\n _locales: withBlock.with._locales,\n adapter,\n currentArgs: withBlock,\n currentTableName: tableName,\n depth,\n draftsEnabled,\n fields: block.flattenedFields,\n forceWithFields: blockSelect === true,\n joinQuery,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: '',\n select: typeof blockSelect === 'object' ? blockSelect : undefined,\n selectMode: blockSelectMode,\n tablePath: '',\n topLevelArgs,\n topLevelTableName,\n withTabledFields,\n })\n\n if (\n typeof blockSelect === 'object' &&\n withBlock.with._locales &&\n Object.keys(withBlock.with._locales.columns).length === 1\n ) {\n delete withBlock.with._locales\n }\n }\n })\n\n break\n }\n\n case 'group':\n case 'tab': {\n const fieldSelect = select?.[field.name]\n\n if (fieldSelect === false) {\n break\n }\n\n traverseFields({\n _locales,\n adapter,\n collectionSlug,\n currentArgs,\n currentTableName,\n depth,\n draftsEnabled,\n fields: field.flattenedFields,\n forceWithFields,\n joinQuery,\n joins,\n locale,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: `${path}${field.name}_`,\n select: typeof fieldSelect === 'object' ? fieldSelect : undefined,\n selectAllOnCurrentLevel:\n selectAllOnCurrentLevel ||\n fieldSelect === true ||\n (selectMode === 'exclude' && typeof fieldSelect === 'undefined'),\n selectMode,\n tablePath: `${tablePath}${toSnakeCase(field.name)}_`,\n topLevelArgs,\n topLevelTableName,\n versions,\n withTabledFields,\n })\n\n break\n }\n case 'join': {\n // when `joinsQuery` is false, do not join\n if (joinQuery === false) {\n break\n }\n\n if (\n (select && selectMode === 'include' && !select[field.name]) ||\n (selectMode === 'exclude' && select[field.name] === false)\n ) {\n break\n }\n\n const joinSchemaPath = `${path.replaceAll('_', '.')}${field.name}`\n\n if (joinQuery[joinSchemaPath] === false) {\n break\n }\n\n const {\n count: shouldCount = false,\n limit: limitArg = field.defaultLimit ?? 10,\n page,\n sort = field.defaultSort,\n where,\n } = joinQuery[joinSchemaPath] || {}\n let limit = limitArg\n\n if (limit !== 0) {\n // get an additional document and slice it later to determine if there is a next page\n limit += 1\n }\n\n if (Array.isArray(field.collection)) {\n const polymorphicJoinQuery = buildPolymorphicJoinQuery({\n adapter,\n currentTableName,\n field,\n limit,\n locale,\n page,\n pageSize: limitArg,\n path,\n shouldCount,\n sort,\n where,\n })\n\n currentArgs.extras[polymorphicJoinQuery.columnName] = polymorphicJoinQuery.documents\n\n if (polymorphicJoinQuery.count) {\n currentArgs.extras[`${polymorphicJoinQuery.columnName}_count`] =\n polymorphicJoinQuery.count\n }\n } else {\n const db = adapter.drizzle as LibSQLDatabase\n const useDrafts =\n (versions || draftsEnabled) &&\n hasDraftsEnabled(adapter.payload.collections[field.collection].config)\n\n const fields = useDrafts\n ? buildVersionCollectionFields(\n adapter.payload.config,\n adapter.payload.collections[field.collection].config,\n true,\n )\n : adapter.payload.collections[field.collection].config.flattenedFields\n\n const joinCollectionTableName = adapter.tableNameMap.get(\n useDrafts\n ? `_${toSnakeCase(field.collection)}${adapter.versionsSuffix}`\n : toSnakeCase(field.collection),\n )\n\n const joins: BuildQueryJoinAliases = []\n\n const currentIDColumn = versions\n ? adapter.tables[currentTableName].parent\n : adapter.tables[currentTableName].id\n\n let joinQueryWhere: Where\n\n const currentIDRaw = sql.raw(\n `\"${getNameFromDrizzleTable(currentIDColumn.table)}\".\"${currentIDColumn.name}\"`,\n )\n\n if (Array.isArray(field.targetField.relationTo)) {\n joinQueryWhere = {\n [field.on]: {\n equals: {\n relationTo: collectionSlug,\n value: rawConstraint(currentIDRaw),\n },\n },\n }\n } else {\n joinQueryWhere = {\n [field.on]: {\n equals: rawConstraint(currentIDRaw),\n },\n }\n }\n\n if (where && Object.keys(where).length) {\n joinQueryWhere = {\n and: [joinQueryWhere, where],\n }\n }\n\n if (useDrafts) {\n joinQueryWhere = combineQueries(appendVersionToQueryKey(joinQueryWhere), {\n latest: { equals: true },\n })\n }\n\n const columnName = `${path.replaceAll('.', '_')}${field.name}`\n\n const subQueryAlias = `${columnName}_alias`\n\n const { newAliasTable } = getTableAlias({\n adapter,\n tableName: joinCollectionTableName,\n })\n\n const {\n orderBy,\n selectFields,\n where: subQueryWhere,\n } = buildQuery({\n adapter,\n aliasTable: newAliasTable,\n fields,\n joins,\n locale,\n parentIsLocalized,\n selectLocale: true,\n sort: useDrafts\n ? getQueryDraftsSort({\n collectionConfig: adapter.payload.collections[field.collection].config,\n sort,\n })\n : sort,\n tableName: joinCollectionTableName,\n where: joinQueryWhere,\n })\n\n for (let key in selectFields) {\n const val = selectFields[key]\n\n if (val.table && getNameFromDrizzleTable(val.table) === joinCollectionTableName) {\n delete selectFields[key]\n key = key.split('.').pop()\n selectFields[key] = newAliasTable[key]\n }\n }\n\n if (useDrafts) {\n selectFields.parent = newAliasTable.parent\n }\n\n let query: SQLiteSelect = db\n .select(selectFields as any)\n .from(newAliasTable)\n .where(subQueryWhere)\n .orderBy(() => orderBy.map(({ column, order }) => order(column)))\n .$dynamic()\n\n joins.forEach(({ type, condition, table }) => {\n query = query[type ?? 'leftJoin'](table, condition)\n })\n\n if (page && limit !== 0) {\n const offset = (page - 1) * limit - 1\n if (offset > 0) {\n query = query.offset(offset)\n }\n }\n\n if (limit !== 0) {\n query = query.limit(limit)\n }\n\n const subQuery = query.as(subQueryAlias)\n\n if (shouldCount) {\n let countSubquery: SQLiteSelect = db\n .select(selectFields as any)\n\n .from(newAliasTable)\n .where(subQueryWhere)\n .$dynamic()\n\n joins.forEach(({ type, condition, table }) => {\n countSubquery = countSubquery[type ?? 'leftJoin'](table, condition)\n })\n\n currentArgs.extras[`${columnName}_count`] = sql`${db\n .select({\n count: count(),\n })\n .from(sql`${countSubquery.as(`${subQueryAlias}_count_subquery`)}`)}`.as(\n `${subQueryAlias}_count`,\n )\n }\n\n currentArgs.extras[columnName] = sql`${db\n .select({\n result: jsonAggBuildObject(adapter, {\n id: sql.raw(`\"${subQueryAlias}\".${useDrafts ? 'parent_id' : 'id'}`),\n ...(selectFields._locale && {\n locale: sql.raw(`\"${subQueryAlias}\".${selectFields._locale.name}`),\n }),\n }),\n })\n .from(sql`${subQuery}`)}`.as(subQueryAlias)\n }\n\n break\n }\n\n case 'point': {\n if (adapter.name === 'sqlite') {\n break\n }\n\n const args = isFieldLocalized ? _locales : currentArgs\n if (!args.columns) {\n args.columns = {}\n }\n\n if (!args.extras) {\n args.extras = {}\n }\n\n const name = `${path}${field.name}`\n\n // Drizzle handles that poorly. See https://github.com/drizzle-team/drizzle-orm/issues/2526\n // Additionally, this way we format the column value straight in the database using ST_AsGeoJSON\n args.columns[name] = false\n\n let shouldSelect = false\n\n if (select || selectAllOnCurrentLevel) {\n if (\n selectAllOnCurrentLevel ||\n (selectMode === 'include' && Boolean(select[field.name])) ||\n (selectMode === 'exclude' && typeof select[field.name] === 'undefined')\n ) {\n shouldSelect = true\n }\n } else {\n shouldSelect = true\n }\n const tableName = fieldShouldBeLocalized({ field, parentIsLocalized })\n ? `${currentTableName}${adapter.localesSuffix}`\n : currentTableName\n\n if (shouldSelect) {\n args.extras[name] = sql\n .raw(`ST_AsGeoJSON(\"${adapter.tables[tableName][name].name}\")::jsonb`)\n .as(name)\n }\n break\n }\n\n case 'select': {\n if (select && !selectAllOnCurrentLevel) {\n if (\n (selectMode === 'include' && !select[field.name]) ||\n (selectMode === 'exclude' && select[field.name] === false)\n ) {\n break\n }\n }\n\n if (field.hasMany) {\n const withSelect: Result = {\n columns: {\n id: false,\n order: false,\n parent: false,\n },\n orderBy: ({ order }, { asc }) => [asc(order)],\n }\n\n currentArgs.with[`${path}${field.name}`] = withSelect\n break\n }\n\n if (select || selectAllOnCurrentLevel) {\n const fieldPath = `${path}${field.name}`\n\n if ((isFieldLocalized || parentIsLocalized) && _locales) {\n _locales.columns[fieldPath] = true\n } else if (adapter.tables[currentTableName]?.[fieldPath]) {\n currentArgs.columns[fieldPath] = true\n }\n }\n\n break\n }\n\n default: {\n if (forceWithFields) {\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n (field.hasMany || Array.isArray(field.relationTo))\n ) {\n withTabledFields.rels = true\n }\n\n if (field.type === 'number' && field.hasMany) {\n withTabledFields.numbers = true\n }\n\n if (field.type === 'text' && field.hasMany) {\n withTabledFields.texts = true\n }\n }\n\n if (!select && !selectAllOnCurrentLevel) {\n break\n }\n\n if (\n selectAllOnCurrentLevel ||\n (selectMode === 'include' && Boolean(select[field.name])) ||\n (selectMode === 'exclude' && typeof select[field.name] === 'undefined')\n ) {\n const fieldPath = `${path}${field.name}`\n\n if ((isFieldLocalized || parentIsLocalized) && _locales) {\n _locales.columns[fieldPath] = true\n } else if (adapter.tables[currentTableName]?.[fieldPath]) {\n currentArgs.columns[fieldPath] = true\n }\n\n if (\n !withTabledFields.rels &&\n (field.type === 'relationship' || field.type === 'upload') &&\n (field.hasMany || Array.isArray(field.relationTo))\n ) {\n withTabledFields.rels = true\n }\n\n if (!withTabledFields.numbers && field.type === 'number' && field.hasMany) {\n withTabledFields.numbers = true\n }\n\n if (!withTabledFields.texts && field.type === 'text' && field.hasMany) {\n withTabledFields.texts = true\n }\n }\n\n break\n }\n }\n })\n\n return topLevelArgs\n}\n"],"names":["count","sql","appendVersionToQueryKey","buildVersionCollectionFields","combineQueries","getQueryDraftsSort","fieldIsVirtual","fieldShouldBeLocalized","hasDraftsEnabled","toSnakeCase","buildQuery","getTableAlias","getArrayRelationName","getNameFromDrizzleTable","jsonAggBuildObject","rawConstraint","InternalBlockTableNameIndex","resolveBlockTableName","buildPolymorphicJoinQuery","traverseFields","_locales","adapter","collectionSlug","currentArgs","currentTableName","depth","draftsEnabled","fields","forceWithFields","joinQuery","joins","locale","parentIsLocalized","path","select","selectAllOnCurrentLevel","selectMode","tablePath","topLevelArgs","topLevelTableName","versions","withTabledFields","forEach","field","isFieldLocalized","type","hasMany","relationTo","with","name","arraySelect","withArray","columns","id","_order","_parentID","orderBy","asc","arrayTableName","tableNameMap","get","tables","_locale","_uuid","arrayTableNameWithLocales","localesSuffix","relationName","tableName","flattenedFields","localized","undefined","Object","keys","length","blocksSelect","blocksAsJSON","fieldPath","blocks","_block","block","payload","blockKey","slug","blockSelect","blockSelectMode","Boolean","withBlock","_path","fieldSelect","joinSchemaPath","replaceAll","shouldCount","limit","limitArg","defaultLimit","page","sort","defaultSort","where","Array","isArray","collection","polymorphicJoinQuery","pageSize","extras","columnName","documents","db","drizzle","useDrafts","collections","config","joinCollectionTableName","versionsSuffix","currentIDColumn","parent","joinQueryWhere","currentIDRaw","raw","table","targetField","on","equals","value","and","latest","subQueryAlias","newAliasTable","selectFields","subQueryWhere","aliasTable","selectLocale","collectionConfig","key","val","split","pop","query","from","map","column","order","$dynamic","condition","offset","subQuery","as","countSubquery","result","args","shouldSelect","withSelect","rels","numbers","texts"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/transform/read/traverseFields.ts"],"sourcesContent":["import type { FlattenedBlock, FlattenedField, JoinQuery, SanitizedConfig } from 'payload'\n\nimport { fieldIsVirtual, fieldShouldBeLocalized } from 'payload/shared'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter } from '../../types.js'\nimport type { BlocksMap } from '../../utilities/createBlocksMap.js'\n\nimport { getArrayRelationName } from '../../utilities/getArrayRelationName.js'\nimport { resolveBlockTableName } from '../../utilities/validateExistingBlockIsIdentical.js'\nimport { transformHasManyNumber } from './hasManyNumber.js'\nimport { transformHasManyText } from './hasManyText.js'\nimport { transformRelationship } from './relationship.js'\n\ntype TraverseFieldsArgs = {\n /**\n * The DB adapter\n */\n adapter: DrizzleAdapter\n /**\n * Pre-formatted blocks map\n */\n blocks: BlocksMap\n /**\n * The full Payload config\n */\n config: SanitizedConfig\n currentTableName: string\n /**\n * The data reference to be mutated within this recursive function\n */\n dataRef: Record<string, unknown>\n /**\n * Data that needs to be removed from the result after all fields have populated\n */\n deletions: (() => void)[]\n /**\n * Column prefix can be built up by group and named tab fields\n */\n fieldPrefix: string\n /**\n * An array of Payload fields to traverse\n */\n fields: FlattenedField[]\n /**\n *\n */\n joinQuery?: JoinQuery\n /**\n * All hasMany number fields, as returned by Drizzle, keyed on an object by field path\n */\n numbers: Record<string, Record<string, unknown>[]>\n parentIsLocalized: boolean\n /**\n * The current field path (in dot notation), used to merge in relationships\n */\n path: string\n /**\n * All related documents, as returned by Drizzle, keyed on an object by field path\n */\n relationships: Record<string, Record<string, unknown>[]>\n /**\n * Data structure representing the nearest table from db\n */\n table: Record<string, unknown>\n tablePath: string\n /**\n * All hasMany text fields, as returned by Drizzle, keyed on an object by field path\n */\n texts: Record<string, Record<string, unknown>[]>\n topLevelTableName: string\n /**\n * Set to a locale if this group of fields is within a localized array or block.\n */\n withinArrayOrBlockLocale?: string\n}\n\n// Traverse fields recursively, transforming data\n// for each field type into required Payload shape\nexport const traverseFields = <T extends Record<string, unknown>>({\n adapter,\n blocks,\n config,\n currentTableName,\n dataRef,\n deletions,\n fieldPrefix,\n fields,\n joinQuery,\n numbers,\n parentIsLocalized,\n path,\n relationships,\n table,\n tablePath,\n texts,\n topLevelTableName,\n withinArrayOrBlockLocale,\n}: TraverseFieldsArgs): T => {\n const sanitizedPath = path ? `${path}.` : path\n const localeCodes =\n adapter.payload.config.localization && adapter.payload.config.localization.localeCodes\n\n const formatted = fields.reduce((result, field) => {\n if (fieldIsVirtual(field)) {\n return result\n }\n\n const fieldName = `${fieldPrefix || ''}${field.name}`\n let fieldData = table[fieldName]\n const localizedFieldData = {}\n const valuesToTransform: {\n ref: Record<string, unknown>\n table: Record<string, unknown>\n }[] = []\n\n if (fieldPrefix) {\n deletions.push(() => delete table[fieldName])\n }\n\n const isLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n if (field.type === 'array') {\n const arrayTableName = adapter.tableNameMap.get(\n `${currentTableName}_${tablePath}${toSnakeCase(field.name)}`,\n )\n\n fieldData = table[getArrayRelationName({ field, path: fieldName, tableName: arrayTableName })]\n\n if (Array.isArray(fieldData)) {\n if (isLocalized) {\n result[field.name] = fieldData.reduce((arrayResult, row) => {\n if (typeof row._locale === 'string') {\n if (!arrayResult[row._locale]) {\n arrayResult[row._locale] = []\n }\n const locale = row._locale\n const data = {}\n delete row._locale\n if (row._uuid) {\n row.id = row._uuid\n delete row._uuid\n }\n\n const rowResult = traverseFields<T>({\n adapter,\n blocks,\n config,\n currentTableName: arrayTableName,\n dataRef: data,\n deletions,\n fieldPrefix: '',\n fields: field.flattenedFields,\n numbers,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: `${sanitizedPath}${field.name}.${row._order - 1}`,\n relationships,\n table: row,\n tablePath: '',\n texts,\n topLevelTableName,\n withinArrayOrBlockLocale: locale,\n })\n\n if ('_order' in rowResult) {\n delete rowResult._order\n }\n\n arrayResult[locale].push(rowResult)\n }\n\n return arrayResult\n }, {})\n } else {\n result[field.name] = fieldData.reduce((acc, row, i) => {\n if (row._uuid) {\n row.id = row._uuid\n delete row._uuid\n }\n\n if ('_order' in row) {\n delete row._order\n }\n\n if (\n !withinArrayOrBlockLocale ||\n (withinArrayOrBlockLocale && withinArrayOrBlockLocale === row._locale)\n ) {\n if (row._locale) {\n delete row._locale\n }\n\n acc.push(\n traverseFields<T>({\n adapter,\n blocks,\n config,\n currentTableName: arrayTableName,\n dataRef: row,\n deletions,\n fieldPrefix: '',\n fields: field.flattenedFields,\n numbers,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: `${sanitizedPath}${field.name}.${i}`,\n relationships,\n table: row,\n tablePath: '',\n texts,\n topLevelTableName,\n withinArrayOrBlockLocale,\n }),\n )\n }\n\n return acc\n }, [])\n }\n }\n\n return result\n }\n\n if (field.type === 'blocks' && !adapter.blocksAsJSON) {\n const blockFieldPath = `${sanitizedPath}${field.name}`\n const blocksByPath = blocks[blockFieldPath]\n\n if (Array.isArray(blocksByPath)) {\n if (isLocalized) {\n result[field.name] = {}\n\n blocksByPath.forEach((row) => {\n if (row._uuid) {\n row.id = row._uuid\n delete row._uuid\n }\n if (typeof row._locale === 'string') {\n if (!result[field.name][row._locale]) {\n result[field.name][row._locale] = []\n }\n result[field.name][row._locale].push(row)\n delete row._locale\n }\n })\n\n Object.entries(result[field.name]).forEach(([locale, localizedBlocks]) => {\n result[field.name][locale] = localizedBlocks.map((row) => {\n const block =\n adapter.payload.blocks[row.blockType] ??\n (field.blocks.find(\n (block) => typeof block !== 'string' && block.slug === row.blockType,\n ) as FlattenedBlock | undefined)\n\n const tableName = resolveBlockTableName(\n block,\n adapter.tableNameMap.get(`${topLevelTableName}_blocks_${toSnakeCase(block.slug)}`),\n )\n\n if (block) {\n const blockResult = traverseFields<T>({\n adapter,\n blocks,\n config,\n currentTableName: tableName,\n dataRef: row,\n deletions,\n fieldPrefix: '',\n fields: block.flattenedFields,\n numbers,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: `${blockFieldPath}.${row._order - 1}`,\n relationships,\n table: row,\n tablePath: '',\n texts,\n topLevelTableName,\n withinArrayOrBlockLocale: locale,\n })\n\n delete blockResult._order\n return blockResult\n }\n\n return {}\n })\n })\n } else {\n // Add locale-specific index to have a proper blockFieldPath for current locale\n // because blocks can be in the same array for different locales!\n if (withinArrayOrBlockLocale && config.localization) {\n for (const locale of config.localization.localeCodes) {\n let localeIndex = 0\n\n for (let i = 0; i < blocksByPath.length; i++) {\n const row = blocksByPath[i]\n if (row._locale === locale) {\n row._index = localeIndex\n localeIndex++\n }\n }\n }\n }\n\n result[field.name] = blocksByPath.reduce((acc, row, i) => {\n delete row._order\n if (row._uuid) {\n row.id = row._uuid\n delete row._uuid\n }\n\n if (typeof row.blockType !== 'string') {\n return acc\n }\n\n const block =\n adapter.payload.blocks[row.blockType] ??\n (field.blocks.find(\n (block) => typeof block !== 'string' && block.slug === row.blockType,\n ) as FlattenedBlock | undefined)\n\n if (block) {\n if (\n !withinArrayOrBlockLocale ||\n (withinArrayOrBlockLocale && withinArrayOrBlockLocale === row._locale)\n ) {\n if (row._locale) {\n delete row._locale\n }\n if (typeof row._index === 'number') {\n i = row._index\n delete row._index\n }\n\n const tableName = resolveBlockTableName(\n block,\n adapter.tableNameMap.get(\n `${topLevelTableName}_blocks_${toSnakeCase(block.slug)}`,\n ),\n )\n\n acc.push(\n traverseFields<T>({\n adapter,\n blocks,\n config,\n currentTableName: tableName,\n dataRef: row,\n deletions,\n fieldPrefix: '',\n fields: block.flattenedFields,\n numbers,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: `${blockFieldPath}.${i}`,\n relationships,\n table: row,\n tablePath: '',\n texts,\n topLevelTableName,\n withinArrayOrBlockLocale,\n }),\n )\n\n return acc\n }\n } else {\n acc.push({})\n }\n\n return acc\n }, [])\n }\n }\n\n return result\n }\n\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n (Array.isArray(field.relationTo) || field.hasMany)\n ) {\n const relationPathMatch = relationships[`${sanitizedPath}${field.name}`]\n\n if (!relationPathMatch) {\n if ('hasMany' in field && field.hasMany) {\n if (isLocalized && config.localization && config.localization.locales) {\n result[field.name] = {\n [config.localization.defaultLocale]: [],\n }\n } else {\n result[field.name] = []\n }\n }\n\n return result\n }\n\n if (isLocalized) {\n result[field.name] = {}\n const relationsByLocale: Record<string, Record<string, unknown>[]> = {}\n\n relationPathMatch.forEach((row) => {\n if (typeof row.locale === 'string') {\n if (!relationsByLocale[row.locale]) {\n relationsByLocale[row.locale] = []\n }\n relationsByLocale[row.locale].push(row)\n }\n })\n\n Object.entries(relationsByLocale).forEach(([locale, relations]) => {\n transformRelationship({\n field,\n locale,\n ref: result,\n relations,\n })\n })\n } else {\n transformRelationship({\n field,\n ref: result,\n relations: relationPathMatch,\n withinArrayOrBlockLocale,\n })\n }\n return result\n }\n\n if (field.type === 'join') {\n const { count, limit = field.defaultLimit ?? 10 } =\n joinQuery?.[`${fieldPrefix.replaceAll('_', '.')}${field.name}`] || {}\n\n // raw hasMany results from SQLite\n if (typeof fieldData === 'string') {\n fieldData = JSON.parse(fieldData)\n }\n\n let fieldResult:\n | { docs: unknown[]; hasNextPage: boolean; totalDocs?: number }\n | Record<string, { docs: unknown[]; hasNextPage: boolean; totalDocs?: number }>\n if (Array.isArray(fieldData)) {\n if (isLocalized && adapter.payload.config.localization) {\n fieldResult = fieldData.reduce(\n (joinResult, row) => {\n if (typeof row.locale === 'string') {\n joinResult[row.locale].docs.push(row.id)\n }\n\n return joinResult\n },\n\n // initialize with defaults so empty won't be undefined\n adapter.payload.config.localization.localeCodes.reduce((acc, code) => {\n acc[code] = {\n docs: [],\n hasNextPage: false,\n }\n return acc\n }, {}),\n )\n Object.keys(fieldResult).forEach((locale) => {\n fieldResult[locale].hasNextPage = fieldResult[locale].docs.length > limit\n fieldResult[locale].docs = fieldResult[locale].docs.slice(0, limit)\n })\n } else {\n const hasNextPage = limit !== 0 && fieldData.length > limit\n fieldResult = {\n docs: (hasNextPage ? fieldData.slice(0, limit) : fieldData).map(\n ({ id, relationTo }) => {\n if (relationTo) {\n return { relationTo, value: id }\n }\n return { id }\n },\n ),\n hasNextPage,\n }\n }\n }\n\n if (count) {\n const countPath = `${fieldName}_count`\n if (typeof table[countPath] !== 'undefined') {\n let value = Number(table[countPath])\n if (Number.isNaN(value)) {\n value = 0\n }\n fieldResult.totalDocs = value\n }\n }\n\n result[field.name] = fieldResult\n return result\n }\n\n if (field.type === 'text' && field?.hasMany) {\n const textPathMatch = texts[`${sanitizedPath}${field.name}`]\n if (!textPathMatch) {\n result[field.name] =\n isLocalized && localeCodes\n ? Object.fromEntries(localeCodes.map((locale) => [locale, []]))\n : []\n return result\n }\n\n if (isLocalized) {\n result[field.name] = {}\n const textsByLocale: Record<string, Record<string, unknown>[]> = {}\n\n textPathMatch.forEach((row) => {\n if (typeof row.locale === 'string') {\n if (!textsByLocale[row.locale]) {\n textsByLocale[row.locale] = []\n }\n textsByLocale[row.locale].push(row)\n }\n })\n\n Object.entries(textsByLocale).forEach(([locale, texts]) => {\n transformHasManyText({\n field,\n locale,\n ref: result,\n textRows: texts,\n })\n })\n } else {\n transformHasManyText({\n field,\n ref: result,\n textRows: textPathMatch,\n withinArrayOrBlockLocale,\n })\n }\n\n return result\n }\n\n if (field.type === 'number' && field.hasMany) {\n const numberPathMatch = numbers[`${sanitizedPath}${field.name}`]\n if (!numberPathMatch) {\n result[field.name] =\n isLocalized && localeCodes\n ? Object.fromEntries(localeCodes.map((locale) => [locale, []]))\n : []\n return result\n }\n\n if (isLocalized) {\n result[field.name] = {}\n const numbersByLocale: Record<string, Record<string, unknown>[]> = {}\n\n numberPathMatch.forEach((row) => {\n if (typeof row.locale === 'string') {\n if (!numbersByLocale[row.locale]) {\n numbersByLocale[row.locale] = []\n }\n numbersByLocale[row.locale].push(row)\n }\n })\n\n Object.entries(numbersByLocale).forEach(([locale, numbers]) => {\n transformHasManyNumber({\n field,\n locale,\n numberRows: numbers,\n ref: result,\n })\n })\n } else {\n transformHasManyNumber({\n field,\n numberRows: numberPathMatch,\n ref: result,\n withinArrayOrBlockLocale,\n })\n }\n\n return result\n }\n\n if (field.type === 'select' && field.hasMany) {\n if (Array.isArray(fieldData)) {\n if (isLocalized) {\n result[field.name] = fieldData.reduce((selectResult, row) => {\n if (typeof row.locale === 'string') {\n if (!selectResult[row.locale]) {\n selectResult[row.locale] = []\n }\n selectResult[row.locale].push(row.value)\n }\n\n return selectResult\n }, {})\n } else {\n let selectData = fieldData\n if (withinArrayOrBlockLocale) {\n selectData = selectData.filter(({ locale }) => locale === withinArrayOrBlockLocale)\n }\n result[field.name] = selectData.map(({ value }) => value)\n }\n }\n return result\n }\n\n if (isLocalized && Array.isArray(table._locales)) {\n if (!table._locales.length && localeCodes) {\n localeCodes.forEach((_locale) => (table._locales as unknown[]).push({ _locale }))\n }\n\n table._locales.forEach((localeRow) => {\n valuesToTransform.push({\n ref: localizedFieldData,\n table: {\n ...table,\n ...localeRow,\n },\n })\n })\n } else {\n valuesToTransform.push({ ref: result, table })\n }\n\n valuesToTransform.forEach(({ ref, table }) => {\n const fieldData = table[`${fieldPrefix || ''}${field.name}`]\n const locale = table?._locale\n let val = fieldData\n\n switch (field.type) {\n case 'date': {\n if (typeof fieldData === 'string') {\n val = new Date(fieldData).toISOString()\n }\n\n break\n }\n\n case 'group':\n case 'tab': {\n const groupFieldPrefix = `${fieldPrefix || ''}${field.name}_`\n const groupData = {}\n const locale = table._locale as string\n const refKey = isLocalized && locale ? locale : field.name\n\n if (isLocalized && locale) {\n delete table._locale\n }\n ref[refKey] = traverseFields<Record<string, unknown>>({\n adapter,\n blocks,\n config,\n currentTableName,\n dataRef: groupData as Record<string, unknown>,\n deletions,\n fieldPrefix: groupFieldPrefix,\n fields: field.flattenedFields,\n joinQuery,\n numbers,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: `${sanitizedPath}${field.name}`,\n relationships,\n table,\n tablePath: `${tablePath}${toSnakeCase(field.name)}_`,\n texts,\n topLevelTableName,\n withinArrayOrBlockLocale: locale || withinArrayOrBlockLocale,\n })\n\n return\n }\n\n case 'number': {\n if (typeof fieldData === 'string') {\n val = Number.parseFloat(fieldData)\n }\n\n break\n }\n\n case 'point': {\n if (typeof fieldData === 'string') {\n val = JSON.parse(fieldData)\n }\n\n break\n }\n\n case 'relationship':\n case 'upload': {\n if (\n val &&\n typeof field.relationTo === 'string' &&\n adapter.payload.collections[field.relationTo].customIDType === 'number'\n ) {\n val = Number(val)\n }\n\n break\n }\n case 'text': {\n if (typeof fieldData === 'string') {\n val = String(fieldData)\n }\n\n break\n }\n\n default: {\n break\n }\n }\n if (typeof locale === 'string') {\n ref[locale] = val\n } else {\n result[field.name] = val\n }\n })\n\n if (Object.keys(localizedFieldData).length > 0) {\n result[field.name] = localizedFieldData\n }\n\n return result\n }, dataRef)\n\n if (Array.isArray(table._locales)) {\n deletions.push(() => delete table._locales)\n }\n\n return formatted as T\n}\n"],"names":["fieldIsVirtual","fieldShouldBeLocalized","toSnakeCase","getArrayRelationName","resolveBlockTableName","transformHasManyNumber","transformHasManyText","transformRelationship","traverseFields","adapter","blocks","config","currentTableName","dataRef","deletions","fieldPrefix","fields","joinQuery","numbers","parentIsLocalized","path","relationships","table","tablePath","texts","topLevelTableName","withinArrayOrBlockLocale","sanitizedPath","localeCodes","payload","localization","formatted","reduce","result","field","fieldName","name","fieldData","localizedFieldData","valuesToTransform","push","isLocalized","type","arrayTableName","tableNameMap","get","tableName","Array","isArray","arrayResult","row","_locale","locale","data","_uuid","id","rowResult","flattenedFields","localized","_order","acc","i","blocksAsJSON","blockFieldPath","blocksByPath","forEach","Object","entries","localizedBlocks","map","block","blockType","find","slug","blockResult","localeIndex","length","_index","relationTo","hasMany","relationPathMatch","locales","defaultLocale","relationsByLocale","relations","ref","count","limit","defaultLimit","replaceAll","JSON","parse","fieldResult","joinResult","docs","code","hasNextPage","keys","slice","value","countPath","Number","isNaN","totalDocs","textPathMatch","fromEntries","textsByLocale","textRows","numberPathMatch","numbersByLocale","numberRows","selectResult","selectData","filter","_locales","localeRow","val","Date","toISOString","groupFieldPrefix","groupData","refKey","parseFloat","collections","customIDType","String"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/transform/read/traverseFields.ts"],"sourcesContent":["import type { FlattenedBlock, FlattenedField, JoinQuery, SanitizedConfig } from 'payload'\n\nimport { fieldIsVirtual, fieldShouldBeLocalized } from 'payload/shared'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter } from '../../types.js'\nimport type { BlocksMap } from '../../utilities/createBlocksMap.js'\n\nimport { getArrayRelationName } from '../../utilities/getArrayRelationName.js'\nimport { resolveBlockTableName } from '../../utilities/validateExistingBlockIsIdentical.js'\nimport { transformHasManyNumber } from './hasManyNumber.js'\nimport { transformHasManyText } from './hasManyText.js'\nimport { transformRelationship } from './relationship.js'\n\ntype TraverseFieldsArgs = {\n /**\n * The DB adapter\n */\n adapter: DrizzleAdapter\n /**\n * Pre-formatted blocks map\n */\n blocks: BlocksMap\n /**\n * The full Payload config\n */\n config: SanitizedConfig\n currentTableName: string\n /**\n * The data reference to be mutated within this recursive function\n */\n dataRef: Record<string, unknown>\n /**\n * Data that needs to be removed from the result after all fields have populated\n */\n deletions: (() => void)[]\n /**\n * Column prefix can be built up by group and named tab fields\n */\n fieldPrefix: string\n /**\n * An array of Payload fields to traverse\n */\n fields: FlattenedField[]\n /**\n *\n */\n joinQuery?: JoinQuery\n /**\n * All hasMany number fields, as returned by Drizzle, keyed on an object by field path\n */\n numbers: Record<string, Record<string, unknown>[]>\n parentIsLocalized: boolean\n /**\n * The current field path (in dot notation), used to merge in relationships\n */\n path: string\n /**\n * All related documents, as returned by Drizzle, keyed on an object by field path\n */\n relationships: Record<string, Record<string, unknown>[]>\n /**\n * Data structure representing the nearest table from db\n */\n table: Record<string, unknown>\n tablePath: string\n /**\n * All hasMany text fields, as returned by Drizzle, keyed on an object by field path\n */\n texts: Record<string, Record<string, unknown>[]>\n topLevelTableName: string\n /**\n * Set to a locale if this group of fields is within a localized array or block.\n */\n withinArrayOrBlockLocale?: string\n}\n\n// Traverse fields recursively, transforming data\n// for each field type into required Payload shape\nexport const traverseFields = <T extends Record<string, unknown>>({\n adapter,\n blocks,\n config,\n currentTableName,\n dataRef,\n deletions,\n fieldPrefix,\n fields,\n joinQuery,\n numbers,\n parentIsLocalized,\n path,\n relationships,\n table,\n tablePath,\n texts,\n topLevelTableName,\n withinArrayOrBlockLocale,\n}: TraverseFieldsArgs): T => {\n const sanitizedPath = path ? `${path}.` : path\n const localeCodes =\n adapter.payload.config.localization && adapter.payload.config.localization.localeCodes\n\n const formatted = fields.reduce((result, field) => {\n if (fieldIsVirtual(field)) {\n return result\n }\n\n const fieldName = `${fieldPrefix || ''}${field.name}`\n let fieldData = table[fieldName]\n const localizedFieldData = {}\n const valuesToTransform: {\n ref: Record<string, unknown>\n table: Record<string, unknown>\n }[] = []\n\n if (fieldPrefix) {\n deletions.push(() => delete table[fieldName])\n }\n\n const isLocalized = fieldShouldBeLocalized({ field, parentIsLocalized })\n\n if (field.type === 'array') {\n const arrayTableName = adapter.tableNameMap.get(\n `${currentTableName}_${tablePath}${toSnakeCase(field.name)}`,\n )\n\n fieldData = table[getArrayRelationName({ field, path: fieldName, tableName: arrayTableName })]\n\n if (Array.isArray(fieldData)) {\n if (isLocalized) {\n result[field.name] = fieldData.reduce((arrayResult, row) => {\n if (typeof row._locale === 'string') {\n if (!arrayResult[row._locale]) {\n arrayResult[row._locale] = []\n }\n const locale = row._locale\n const data = {}\n delete row._locale\n if (row._uuid) {\n row.id = row._uuid\n delete row._uuid\n }\n\n const rowResult = traverseFields<T>({\n adapter,\n blocks,\n config,\n currentTableName: arrayTableName,\n dataRef: data,\n deletions,\n fieldPrefix: '',\n fields: field.flattenedFields,\n numbers,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: `${sanitizedPath}${field.name}.${row._order - 1}`,\n relationships,\n table: row,\n tablePath: '',\n texts,\n topLevelTableName,\n withinArrayOrBlockLocale: locale,\n })\n\n if ('_order' in rowResult) {\n delete rowResult._order\n }\n\n arrayResult[locale].push(rowResult)\n }\n\n return arrayResult\n }, {})\n } else {\n result[field.name] = fieldData.reduce((acc, row, i) => {\n if (row._uuid) {\n row.id = row._uuid\n delete row._uuid\n }\n\n if ('_order' in row) {\n delete row._order\n }\n\n if (\n !withinArrayOrBlockLocale ||\n (withinArrayOrBlockLocale && withinArrayOrBlockLocale === row._locale)\n ) {\n if (row._locale) {\n delete row._locale\n }\n\n acc.push(\n traverseFields<T>({\n adapter,\n blocks,\n config,\n currentTableName: arrayTableName,\n dataRef: row,\n deletions,\n fieldPrefix: '',\n fields: field.flattenedFields,\n numbers,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: `${sanitizedPath}${field.name}.${i}`,\n relationships,\n table: row,\n tablePath: '',\n texts,\n topLevelTableName,\n withinArrayOrBlockLocale,\n }),\n )\n }\n\n return acc\n }, [])\n }\n }\n\n return result\n }\n\n if (field.type === 'blocks' && !adapter.blocksAsJSON) {\n const blockFieldPath = `${sanitizedPath}${field.name}`\n const blocksByPath = blocks[blockFieldPath]\n\n if (Array.isArray(blocksByPath)) {\n if (isLocalized) {\n result[field.name] = {}\n\n blocksByPath.forEach((row) => {\n if (row._uuid) {\n row.id = row._uuid\n delete row._uuid\n }\n if (typeof row._locale === 'string') {\n if (!result[field.name][row._locale]) {\n result[field.name][row._locale] = []\n }\n result[field.name][row._locale].push(row)\n delete row._locale\n }\n })\n\n Object.entries(result[field.name]).forEach(([locale, localizedBlocks]) => {\n result[field.name][locale] = localizedBlocks.map((row) => {\n const block =\n adapter.payload.blocks[row.blockType] ??\n (field.blocks.find(\n (block) => typeof block !== 'string' && block.slug === row.blockType,\n ) as FlattenedBlock | undefined)\n\n const tableName = resolveBlockTableName(\n block,\n adapter.tableNameMap.get(`${topLevelTableName}_blocks_${toSnakeCase(block.slug)}`),\n )\n\n if (block) {\n const blockResult = traverseFields<T>({\n adapter,\n blocks,\n config,\n currentTableName: tableName,\n dataRef: row,\n deletions,\n fieldPrefix: '',\n fields: block.flattenedFields,\n numbers,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: `${blockFieldPath}.${row._order - 1}`,\n relationships,\n table: row,\n tablePath: '',\n texts,\n topLevelTableName,\n withinArrayOrBlockLocale: locale,\n })\n\n delete blockResult._order\n return blockResult\n }\n\n return {}\n })\n })\n } else {\n // Add locale-specific index to have a proper blockFieldPath for current locale\n // because blocks can be in the same array for different locales!\n if (withinArrayOrBlockLocale && config.localization) {\n for (const locale of config.localization.localeCodes) {\n let localeIndex = 0\n\n for (let i = 0; i < blocksByPath.length; i++) {\n const row = blocksByPath[i]\n if (row._locale === locale) {\n row._index = localeIndex\n localeIndex++\n }\n }\n }\n }\n\n result[field.name] = blocksByPath.reduce((acc, row, i) => {\n delete row._order\n if (row._uuid) {\n row.id = row._uuid\n delete row._uuid\n }\n\n if (typeof row.blockType !== 'string') {\n return acc\n }\n\n const block =\n adapter.payload.blocks[row.blockType] ??\n (field.blocks.find(\n (block) => typeof block !== 'string' && block.slug === row.blockType,\n ) as FlattenedBlock | undefined)\n\n if (block) {\n if (\n !withinArrayOrBlockLocale ||\n (withinArrayOrBlockLocale && withinArrayOrBlockLocale === row._locale)\n ) {\n if (row._locale) {\n delete row._locale\n }\n if (typeof row._index === 'number') {\n i = row._index\n delete row._index\n }\n\n const tableName = resolveBlockTableName(\n block,\n adapter.tableNameMap.get(\n `${topLevelTableName}_blocks_${toSnakeCase(block.slug)}`,\n ),\n )\n\n acc.push(\n traverseFields<T>({\n adapter,\n blocks,\n config,\n currentTableName: tableName,\n dataRef: row,\n deletions,\n fieldPrefix: '',\n fields: block.flattenedFields,\n numbers,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: `${blockFieldPath}.${i}`,\n relationships,\n table: row,\n tablePath: '',\n texts,\n topLevelTableName,\n withinArrayOrBlockLocale,\n }),\n )\n\n return acc\n }\n } else {\n acc.push({})\n }\n\n return acc\n }, [])\n }\n }\n\n return result\n }\n\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n (Array.isArray(field.relationTo) || field.hasMany)\n ) {\n const relationPathMatch = relationships[`${sanitizedPath}${field.name}`]\n\n if (!relationPathMatch) {\n if ('hasMany' in field && field.hasMany) {\n if (isLocalized && config.localization && config.localization.locales) {\n result[field.name] = {\n [config.localization.defaultLocale]: [],\n }\n } else {\n result[field.name] = []\n }\n }\n\n return result\n }\n\n if (isLocalized) {\n result[field.name] = {}\n const relationsByLocale: Record<string, Record<string, unknown>[]> = {}\n\n relationPathMatch.forEach((row) => {\n if (typeof row.locale === 'string') {\n if (!relationsByLocale[row.locale]) {\n relationsByLocale[row.locale] = []\n }\n relationsByLocale[row.locale].push(row)\n }\n })\n\n Object.entries(relationsByLocale).forEach(([locale, relations]) => {\n transformRelationship({\n field,\n locale,\n ref: result,\n relations,\n })\n })\n } else {\n transformRelationship({\n field,\n ref: result,\n relations: relationPathMatch,\n withinArrayOrBlockLocale,\n })\n }\n return result\n }\n\n if (field.type === 'join') {\n const { count, limit = field.defaultLimit ?? 10 } =\n joinQuery?.[`${fieldPrefix.replaceAll('_', '.')}${field.name}`] || {}\n\n // raw hasMany results from SQLite\n if (typeof fieldData === 'string') {\n fieldData = JSON.parse(fieldData)\n }\n\n let fieldResult:\n | { docs: unknown[]; hasNextPage: boolean; totalDocs?: number }\n | Record<string, { docs: unknown[]; hasNextPage: boolean; totalDocs?: number }>\n if (Array.isArray(fieldData)) {\n if (isLocalized && adapter.payload.config.localization) {\n fieldResult = fieldData.reduce(\n (joinResult, row) => {\n if (typeof row.locale === 'string') {\n joinResult[row.locale].docs.push(row.id)\n }\n\n return joinResult\n },\n\n // initialize with defaults so empty won't be undefined\n adapter.payload.config.localization.localeCodes.reduce((acc, code) => {\n acc[code] = {\n docs: [],\n hasNextPage: false,\n }\n return acc\n }, {}),\n )\n Object.keys(fieldResult).forEach((locale) => {\n fieldResult[locale].hasNextPage = fieldResult[locale].docs.length > limit\n fieldResult[locale].docs = fieldResult[locale].docs.slice(0, limit)\n })\n } else {\n const hasNextPage = limit !== 0 && fieldData.length > limit\n fieldResult = {\n docs: (hasNextPage ? fieldData.slice(0, limit) : fieldData).map(\n ({ id, relationTo }) => {\n if (relationTo) {\n return { relationTo, value: id }\n }\n return { id }\n },\n ),\n hasNextPage,\n }\n }\n }\n\n if (count) {\n const countPath = `${fieldName}_count`\n if (typeof table[countPath] !== 'undefined') {\n let value = Number(table[countPath])\n if (Number.isNaN(value)) {\n value = 0\n }\n fieldResult.totalDocs = value\n }\n }\n\n result[field.name] = fieldResult\n return result\n }\n\n if (field.type === 'text' && field?.hasMany) {\n const textPathMatch = texts[`${sanitizedPath}${field.name}`]\n if (!textPathMatch) {\n result[field.name] =\n isLocalized && localeCodes\n ? Object.fromEntries(localeCodes.map((locale) => [locale, []]))\n : []\n return result\n }\n\n if (isLocalized) {\n result[field.name] = {}\n const textsByLocale: Record<string, Record<string, unknown>[]> = {}\n\n textPathMatch.forEach((row) => {\n if (typeof row.locale === 'string') {\n if (!textsByLocale[row.locale]) {\n textsByLocale[row.locale] = []\n }\n textsByLocale[row.locale].push(row)\n }\n })\n\n Object.entries(textsByLocale).forEach(([locale, texts]) => {\n transformHasManyText({\n field,\n locale,\n ref: result,\n textRows: texts,\n })\n })\n } else {\n transformHasManyText({\n field,\n ref: result,\n textRows: textPathMatch,\n withinArrayOrBlockLocale,\n })\n }\n\n return result\n }\n\n if (field.type === 'number' && field.hasMany) {\n const numberPathMatch = numbers[`${sanitizedPath}${field.name}`]\n if (!numberPathMatch) {\n result[field.name] =\n isLocalized && localeCodes\n ? Object.fromEntries(localeCodes.map((locale) => [locale, []]))\n : []\n return result\n }\n\n if (isLocalized) {\n result[field.name] = {}\n const numbersByLocale: Record<string, Record<string, unknown>[]> = {}\n\n numberPathMatch.forEach((row) => {\n if (typeof row.locale === 'string') {\n if (!numbersByLocale[row.locale]) {\n numbersByLocale[row.locale] = []\n }\n numbersByLocale[row.locale].push(row)\n }\n })\n\n Object.entries(numbersByLocale).forEach(([locale, numbers]) => {\n transformHasManyNumber({\n field,\n locale,\n numberRows: numbers,\n ref: result,\n })\n })\n } else {\n transformHasManyNumber({\n field,\n numberRows: numberPathMatch,\n ref: result,\n withinArrayOrBlockLocale,\n })\n }\n\n return result\n }\n\n if (field.type === 'select' && field.hasMany) {\n if (Array.isArray(fieldData)) {\n if (isLocalized) {\n result[field.name] = fieldData.reduce((selectResult, row) => {\n if (typeof row.locale === 'string') {\n if (!selectResult[row.locale]) {\n selectResult[row.locale] = []\n }\n selectResult[row.locale].push(row.value)\n }\n\n return selectResult\n }, {})\n } else {\n let selectData = fieldData\n if (withinArrayOrBlockLocale) {\n selectData = selectData.filter(({ locale }) => locale === withinArrayOrBlockLocale)\n }\n result[field.name] = selectData.map(({ value }) => value)\n }\n }\n return result\n }\n\n if (isLocalized && Array.isArray(table._locales)) {\n if (!table._locales.length && localeCodes) {\n localeCodes.forEach((_locale) => (table._locales as unknown[]).push({ _locale }))\n }\n\n table._locales.forEach((localeRow) => {\n valuesToTransform.push({\n ref: localizedFieldData,\n table: {\n ...table,\n ...localeRow,\n },\n })\n })\n } else {\n valuesToTransform.push({ ref: result, table })\n }\n\n valuesToTransform.forEach(({ ref, table }) => {\n const fieldData = table[`${fieldPrefix || ''}${field.name}`]\n const locale = table?._locale\n let val = fieldData\n\n switch (field.type) {\n case 'date': {\n if (typeof fieldData === 'string') {\n val = new Date(fieldData).toISOString()\n }\n\n break\n }\n\n case 'group':\n case 'tab': {\n const groupFieldPrefix = `${fieldPrefix || ''}${field.name}_`\n const groupData = {}\n const locale = table._locale as string\n const refKey = isLocalized && locale ? locale : field.name\n\n if (isLocalized && locale) {\n delete table._locale\n }\n ref[refKey] = traverseFields<Record<string, unknown>>({\n adapter,\n blocks,\n config,\n currentTableName,\n dataRef: groupData,\n deletions,\n fieldPrefix: groupFieldPrefix,\n fields: field.flattenedFields,\n joinQuery,\n numbers,\n parentIsLocalized: parentIsLocalized || field.localized,\n path: `${sanitizedPath}${field.name}`,\n relationships,\n table,\n tablePath: `${tablePath}${toSnakeCase(field.name)}_`,\n texts,\n topLevelTableName,\n withinArrayOrBlockLocale: locale || withinArrayOrBlockLocale,\n })\n\n return\n }\n\n case 'number': {\n if (typeof fieldData === 'string') {\n val = Number.parseFloat(fieldData)\n }\n\n break\n }\n\n case 'point': {\n if (typeof fieldData === 'string') {\n val = JSON.parse(fieldData)\n }\n\n break\n }\n\n case 'relationship':\n case 'upload': {\n if (\n val &&\n typeof field.relationTo === 'string' &&\n adapter.payload.collections[field.relationTo].customIDType === 'number'\n ) {\n val = Number(val)\n }\n\n break\n }\n case 'text': {\n if (typeof fieldData === 'string') {\n val = String(fieldData)\n }\n\n break\n }\n\n default: {\n break\n }\n }\n if (typeof locale === 'string') {\n ref[locale] = val\n } else {\n result[field.name] = val\n }\n })\n\n if (Object.keys(localizedFieldData).length > 0) {\n result[field.name] = localizedFieldData\n }\n\n return result\n }, dataRef)\n\n if (Array.isArray(table._locales)) {\n deletions.push(() => delete table._locales)\n }\n\n return formatted as T\n}\n"],"names":["fieldIsVirtual","fieldShouldBeLocalized","toSnakeCase","getArrayRelationName","resolveBlockTableName","transformHasManyNumber","transformHasManyText","transformRelationship","traverseFields","adapter","blocks","config","currentTableName","dataRef","deletions","fieldPrefix","fields","joinQuery","numbers","parentIsLocalized","path","relationships","table","tablePath","texts","topLevelTableName","withinArrayOrBlockLocale","sanitizedPath","localeCodes","payload","localization","formatted","reduce","result","field","fieldName","name","fieldData","localizedFieldData","valuesToTransform","push","isLocalized","type","arrayTableName","tableNameMap","get","tableName","Array","isArray","arrayResult","row","_locale","locale","data","_uuid","id","rowResult","flattenedFields","localized","_order","acc","i","blocksAsJSON","blockFieldPath","blocksByPath","forEach","Object","entries","localizedBlocks","map","block","blockType","find","slug","blockResult","localeIndex","length","_index","relationTo","hasMany","relationPathMatch","locales","defaultLocale","relationsByLocale","relations","ref","count","limit","defaultLimit","replaceAll","JSON","parse","fieldResult","joinResult","docs","code","hasNextPage","keys","slice","value","countPath","Number","isNaN","totalDocs","textPathMatch","fromEntries","textsByLocale","textRows","numberPathMatch","numbersByLocale","numberRows","selectResult","selectData","filter","_locales","localeRow","val","Date","toISOString","groupFieldPrefix","groupData","refKey","parseFloat","collections","customIDType","String"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/upsertRow/index.ts"],"sourcesContent":["import type { LibSQLDatabase } from 'drizzle-orm/libsql'\nimport type { SelectedFields } from 'drizzle-orm/sqlite-core'\nimport type { TypeWithID } from 'payload'\n\nimport { and, desc, eq, isNull, or } from 'drizzle-orm'\n\nimport type { BlockRowToInsert } from '../transform/write/types.js'\nimport type { Args } from './types.js'\n\ntype RelationshipRow = {\n [key: string]: number | string | undefined // For relationship ID columns like categoriesID, moviesID, etc.\n id?: number | string\n locale?: string\n order: number\n parent: number | string // Drizzle table uses 'parent' key\n path: string\n}\n\nimport { buildFindManyArgs } from '../find/buildFindManyArgs.js'\nimport { transform } from '../transform/read/index.js'\nimport { transformForWrite } from '../transform/write/index.js'\nimport { markWrite } from '../utilities/readAfterWrite.js'\nimport { deleteExistingArrayRows } from './deleteExistingArrayRows.js'\nimport { deleteExistingRowsByPath } from './deleteExistingRowsByPath.js'\nimport { handleUpsertError } from './handleUpsertError.js'\nimport { insertArrays } from './insertArrays.js'\nimport { shouldUseOptimizedUpsertRow } from './shouldUseOptimizedUpsertRow.js'\n\n/**\n * If `id` is provided, it will update the row with that ID.\n * If `where` is provided, it will update the row that matches the `where`\n * If neither `id` nor `where` is provided, it will create a new row.\n *\n * adapter function replaces the entire row and does not support partial updates.\n */\nexport const upsertRow = async <T extends Record<string, unknown> | TypeWithID>({\n id,\n adapter,\n collectionSlug,\n data,\n db,\n fields,\n globalSlug,\n ignoreResult,\n // TODO:\n // When we support joins for write operations (create/update) - pass collectionSlug to the buildFindManyArgs\n // Make a new argument in upsertRow.ts and pass the slug from every operation.\n customID,\n joinQuery: _joinQuery,\n operation,\n path = '',\n req,\n select,\n tableName,\n upsertTarget,\n where,\n}: Args): Promise<null | T> => {\n if (operation === 'create' && !data.createdAt) {\n data.createdAt = new Date().toISOString()\n }\n\n markWrite(adapter)\n\n let insertedRow: Record<string, unknown> = { id }\n if (id && shouldUseOptimizedUpsertRow({ data, fields })) {\n try {\n const transformedForWrite = transformForWrite({\n adapter,\n data,\n enableAtomicWrites: true,\n fields,\n tableName,\n })\n const { row } = transformedForWrite\n const { arraysToPush } = transformedForWrite\n\n const drizzle = db as LibSQLDatabase\n const updateWhere = where\n ? and(eq(adapter.tables[tableName].id, id), where)\n : eq(adapter.tables[tableName].id, id)\n\n // First, handle $push arrays\n\n if (arraysToPush && Object.keys(arraysToPush)?.length) {\n await insertArrays({\n adapter,\n arrays: [arraysToPush],\n db,\n parentRows: [insertedRow],\n uuidMap: {},\n })\n }\n\n // If row.updatedAt is not set, delete it to avoid triggering hasDataToUpdate. `updatedAt` may be explicitly set to null to\n // disable triggering hasDataToUpdate.\n if (typeof row.updatedAt === 'undefined' || row.updatedAt === null) {\n delete row.updatedAt\n }\n\n const hasDataToUpdate = row && Object.keys(row)?.length\n\n // Then, handle regular row update\n if (ignoreResult) {\n if (hasDataToUpdate) {\n // Only update row if there is something to update.\n // Example: if the data only consists of a single $push, calling insertArrays is enough - we don't need to update the row.\n await drizzle.update(adapter.tables[tableName]).set(row).where(updateWhere)\n }\n return ignoreResult === 'idOnly' ? ({ id } as T) : null\n }\n\n const findManyArgs = buildFindManyArgs({\n adapter,\n depth: 0,\n fields,\n joinQuery: false,\n select,\n tableName,\n })\n\n const findManyKeysLength = Object.keys(findManyArgs).length\n const hasOnlyColumns = Object.keys(findManyArgs.columns || {}).length > 0\n\n if (!hasDataToUpdate) {\n // Nothing to update => just fetch current row and return\n findManyArgs.where = updateWhere\n\n const doc = await db.query[tableName].findFirst(findManyArgs)\n\n if (!doc) {\n return null\n }\n\n return transform<T>({\n adapter,\n config: adapter.payload.config,\n data: doc,\n fields,\n joinQuery: false,\n tableName,\n })\n }\n\n if (findManyKeysLength === 0 || hasOnlyColumns) {\n // Optimization - No need for joins => can simply use returning(). This is optimal for very simple collections\n // without complex fields that live in separate tables like blocks, arrays, relationships, etc.\n\n const selectedFields: SelectedFields = {}\n if (hasOnlyColumns) {\n for (const [column, enabled] of Object.entries(findManyArgs.columns)) {\n if (enabled) {\n selectedFields[column] = adapter.tables[tableName][column]\n }\n }\n }\n\n const docs = await drizzle\n .update(adapter.tables[tableName])\n .set(row)\n .where(updateWhere)\n .returning(Object.keys(selectedFields).length ? selectedFields : undefined)\n\n if (!docs[0]) {\n return null\n }\n\n return transform<T>({\n adapter,\n config: adapter.payload.config,\n data: docs[0],\n fields,\n joinQuery: false,\n tableName,\n })\n }\n\n // DB Update that needs the result, potentially with joins => need to update first, then find. returning() does not work with joins.\n\n const docs = await drizzle\n .update(adapter.tables[tableName])\n .set(row)\n .where(updateWhere)\n .returning({\n id: adapter.tables[tableName].id,\n })\n\n if (!docs[0]) {\n return null\n }\n\n insertedRow = docs[0]\n\n findManyArgs.where = eq(adapter.tables[tableName].id, insertedRow.id)\n\n const doc = await db.query[tableName].findFirst(findManyArgs)\n\n return transform<T>({\n adapter,\n config: adapter.payload.config,\n data: doc,\n fields,\n joinQuery: false,\n tableName,\n })\n } catch (error) {\n handleUpsertError({ id, adapter, collectionSlug, error, globalSlug, req, tableName })\n }\n }\n // Split out the incoming data into the corresponding:\n // base row, locales, relationships, blocks, and arrays\n const rowToInsert = transformForWrite({\n adapter,\n data,\n enableAtomicWrites: false,\n fields,\n path,\n tableName,\n })\n\n if (customID) {\n rowToInsert.row.id = customID\n }\n\n // First, we insert the main row\n try {\n if (operation === 'update') {\n const target = upsertTarget || adapter.tables[tableName].id\n\n // Check if we only have relationship operations and no main row data to update\n // Exclude timestamp-only updates when we only have relationship operations.\n // Localized field updates live in the `_locales` table, so the main row may only\n // contain timestamps — in that case the parent row's `updatedAt` must still bump.\n const rowKeys = Object.keys(rowToInsert.row)\n const hasLocalizedData = Object.keys(rowToInsert.locales).length > 0\n const hasMainRowData =\n rowKeys.length > 0 &&\n (hasLocalizedData || !rowKeys.every((key) => key === 'updatedAt' || key === 'createdAt'))\n\n if (hasMainRowData) {\n if (id) {\n rowToInsert.row.id = id\n ;[insertedRow] = await adapter.insert({\n db,\n onConflictDoUpdate: where\n ? { set: rowToInsert.row, target, where }\n : { set: rowToInsert.row, target },\n tableName,\n values: rowToInsert.row,\n })\n } else {\n ;[insertedRow] = await adapter.insert({\n db,\n onConflictDoUpdate: { set: rowToInsert.row, target, where },\n tableName,\n values: rowToInsert.row,\n })\n }\n\n if (!insertedRow) {\n return null\n }\n } else {\n // No main row data to update, just use the existing ID\n insertedRow = { id }\n }\n } else {\n if (adapter.allowIDOnCreate && data.id) {\n rowToInsert.row.id = data.id\n }\n ;[insertedRow] = await adapter.insert({\n db,\n tableName,\n values: rowToInsert.row,\n })\n }\n\n const localesToInsert: Record<string, unknown>[] = []\n const relationsToInsert: Record<string, unknown>[] = []\n const textsToInsert: Record<string, unknown>[] = []\n const numbersToInsert: Record<string, unknown>[] = []\n const blocksToInsert: { [blockType: string]: BlockRowToInsert[] } = {}\n const selectsToInsert: { [selectTableName: string]: Record<string, unknown>[] } = {}\n\n // If there are locale rows with data, add the parent and locale to each\n if (Object.keys(rowToInsert.locales).length > 0) {\n Object.entries(rowToInsert.locales).forEach(([locale, localeRow]) => {\n localeRow._parentID = insertedRow.id\n localeRow._locale = locale\n localesToInsert.push(localeRow)\n })\n }\n\n // If there are relationships, add parent to each\n if (rowToInsert.relationships.length > 0) {\n rowToInsert.relationships.forEach((relation) => {\n relation.parent = insertedRow.id\n relationsToInsert.push(relation)\n })\n }\n\n // If there are texts, add parent to each\n if (rowToInsert.texts.length > 0) {\n rowToInsert.texts.forEach((textRow) => {\n textRow.parent = insertedRow.id\n textsToInsert.push(textRow)\n })\n }\n\n // If there are numbers, add parent to each\n if (rowToInsert.numbers.length > 0) {\n rowToInsert.numbers.forEach((numberRow) => {\n numberRow.parent = insertedRow.id\n numbersToInsert.push(numberRow)\n })\n }\n\n // If there are selects, add parent to each, and then\n // store by table name and rows\n if (Object.keys(rowToInsert.selects).length > 0) {\n Object.entries(rowToInsert.selects).forEach(([selectTableName, selectRows]) => {\n selectsToInsert[selectTableName] = []\n\n selectRows.forEach((row) => {\n if (typeof row.parent === 'undefined') {\n row.parent = insertedRow.id\n }\n\n selectsToInsert[selectTableName].push(row)\n })\n })\n }\n\n // If there are blocks, add parent to each, and then\n // store by table name and rows\n Object.keys(rowToInsert.blocks).forEach((tableName) => {\n rowToInsert.blocks[tableName].forEach((blockRow) => {\n blockRow.row._parentID = insertedRow.id\n if (!blocksToInsert[tableName]) {\n blocksToInsert[tableName] = []\n }\n if (blockRow.row.uuid) {\n delete blockRow.row.uuid\n }\n blocksToInsert[tableName].push(blockRow)\n })\n })\n\n // //////////////////////////////////\n // INSERT LOCALES\n // //////////////////////////////////\n\n if (localesToInsert.length > 0) {\n const localeTableName = `${tableName}${adapter.localesSuffix}`\n const localeTable = adapter.tables[`${tableName}${adapter.localesSuffix}`]\n\n if (operation === 'update') {\n await adapter.deleteWhere({\n db,\n tableName: localeTableName,\n where: eq(localeTable._parentID, insertedRow.id),\n })\n }\n\n await adapter.insert({\n db,\n tableName: localeTableName,\n values: localesToInsert,\n })\n }\n\n // //////////////////////////////////\n // INSERT RELATIONSHIPS\n // //////////////////////////////////\n\n const relationshipsTableName = `${tableName}${adapter.relationshipsSuffix}`\n\n if (operation === 'update') {\n // Filter out specific item deletions (those with itemToRemove) from general path deletions\n const generalRelationshipDeletes = rowToInsert.relationshipsToDelete.filter(\n (rel) => !('itemToRemove' in rel),\n )\n\n await deleteExistingRowsByPath({\n adapter,\n db,\n localeColumnName: 'locale',\n parentColumnName: 'parent',\n parentID: insertedRow.id,\n pathColumnName: 'path',\n rows: [...relationsToInsert, ...generalRelationshipDeletes],\n tableName: relationshipsTableName,\n })\n }\n\n if (relationsToInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: relationshipsTableName,\n values: relationsToInsert,\n })\n }\n\n // //////////////////////////////////\n // HANDLE RELATIONSHIP $push OPERATIONS\n // //////////////////////////////////\n\n if (rowToInsert.relationshipsToAppend.length > 0) {\n // Prepare all relationships for batch insert (order will be set after max query)\n const relationshipsToInsert = rowToInsert.relationshipsToAppend.map((rel) => {\n const parentId = id || insertedRow.id\n const row: Record<string, unknown> = {\n parent: parentId as number | string, // Use 'parent' key for Drizzle table\n path: rel.path,\n }\n\n // Only add locale if this relationship table has a locale column\n const relationshipTable = adapter.rawTables[relationshipsTableName]\n if (rel.locale && relationshipTable && relationshipTable.columns.locale) {\n row.locale = rel.locale\n }\n\n if (rel.relationTo) {\n // Use camelCase key for Drizzle table (e.g., categoriesID not categories_id)\n row[`${rel.relationTo}ID`] = rel.value\n }\n\n return row\n })\n\n if (relationshipsToInsert.length > 0) {\n // Check for potential duplicates\n const relationshipTable = adapter.tables[relationshipsTableName]\n\n if (relationshipTable) {\n // Build conditions only if we have relationships to check\n if (relationshipsToInsert.length === 0) {\n return // No relationships to insert\n }\n\n const conditions = relationshipsToInsert.map((row: RelationshipRow) => {\n const parts = [\n eq(relationshipTable.parent, row.parent),\n eq(relationshipTable.path, row.path),\n ]\n\n // Add locale condition\n if (row.locale !== undefined && relationshipTable.locale) {\n parts.push(eq(relationshipTable.locale, row.locale))\n } else if (relationshipTable.locale) {\n parts.push(isNull(relationshipTable.locale))\n }\n\n // Add all relationship ID matches using schema fields\n for (const [key, value] of Object.entries(row)) {\n if (key.endsWith('ID') && value != null) {\n const column = relationshipTable[key]\n if (column && typeof column === 'object') {\n parts.push(eq(column, value))\n }\n }\n }\n\n return and(...parts)\n })\n\n // Get both existing relationships AND max order in a single query\n let existingRels: Record<string, unknown>[] = []\n let maxOrder = 0\n\n if (conditions.length > 0) {\n // Query for existing relationships\n existingRels = await (db as any)\n .select()\n .from(relationshipTable)\n .where(or(...conditions))\n }\n\n // Get max order for this parent across all paths in a single query\n const parentId = id || insertedRow.id\n const maxOrderResult = await (db as any)\n .select({ maxOrder: relationshipTable.order })\n .from(relationshipTable)\n .where(eq(relationshipTable.parent, parentId))\n .orderBy(desc(relationshipTable.order))\n .limit(1)\n\n if (maxOrderResult.length > 0 && maxOrderResult[0].maxOrder) {\n maxOrder = maxOrderResult[0].maxOrder\n }\n\n // Set order values for all relationships based on max order\n relationshipsToInsert.forEach((row, index) => {\n row.order = maxOrder + index + 1\n })\n\n // Filter out relationships that already exist\n const relationshipsToActuallyInsert = relationshipsToInsert.filter((newRow) => {\n return !existingRels.some((existingRow: Record<string, unknown>) => {\n // Check if this relationship already exists\n let matches = existingRow.parent === newRow.parent && existingRow.path === newRow.path\n\n if (newRow.locale !== undefined) {\n matches = matches && existingRow.locale === newRow.locale\n }\n\n // Check relationship value matches - convert to camelCase for comparison\n for (const key of Object.keys(newRow)) {\n if (key.endsWith('ID')) {\n // Now using camelCase keys\n matches = matches && existingRow[key] === newRow[key]\n }\n }\n\n return matches\n })\n })\n\n // Insert only non-duplicate relationships\n if (relationshipsToActuallyInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: relationshipsTableName,\n values: relationshipsToActuallyInsert,\n })\n }\n }\n }\n }\n\n // //////////////////////////////////\n // HANDLE RELATIONSHIP $remove OPERATIONS\n // //////////////////////////////////\n\n if (rowToInsert.relationshipsToDelete.some((rel) => 'itemToRemove' in rel)) {\n const relationshipTable = adapter.tables[relationshipsTableName]\n\n if (relationshipTable) {\n for (const relToDelete of rowToInsert.relationshipsToDelete) {\n if ('itemToRemove' in relToDelete && relToDelete.itemToRemove) {\n const item = relToDelete.itemToRemove\n const parentId = (id || insertedRow.id) as number | string\n\n const conditions = [\n eq(relationshipTable.parent, parentId),\n eq(relationshipTable.path, relToDelete.path),\n ]\n\n // Add locale condition if this relationship table has a locale column\n if (adapter.rawTables[relationshipsTableName]?.columns.locale) {\n if (relToDelete.locale) {\n conditions.push(eq(relationshipTable.locale, relToDelete.locale))\n } else {\n conditions.push(isNull(relationshipTable.locale))\n }\n }\n\n // Handle polymorphic vs simple relationships\n if (typeof item === 'object' && 'relationTo' in item) {\n // Polymorphic relationship - convert to camelCase key\n const camelKey = `${item.relationTo}ID`\n if (relationshipTable[camelKey]) {\n conditions.push(eq(relationshipTable[camelKey], item.value))\n }\n } else if (relToDelete.relationTo) {\n // Simple relationship - convert to camelCase key\n const camelKey = `${relToDelete.relationTo}ID`\n if (relationshipTable[camelKey]) {\n conditions.push(eq(relationshipTable[camelKey], item))\n }\n }\n\n // Execute DELETE using Drizzle query builder\n await adapter.deleteWhere({\n db,\n tableName: relationshipsTableName,\n where: and(...conditions),\n })\n }\n }\n }\n }\n\n // //////////////////////////////////\n // INSERT hasMany TEXTS\n // //////////////////////////////////\n\n const textsTableName = `${tableName}_texts`\n\n if (operation === 'update') {\n await deleteExistingRowsByPath({\n adapter,\n db,\n localeColumnName: 'locale',\n parentColumnName: 'parent',\n parentID: insertedRow.id,\n pathColumnName: 'path',\n rows: [...textsToInsert, ...rowToInsert.textsToDelete],\n tableName: textsTableName,\n })\n }\n\n if (textsToInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: textsTableName,\n values: textsToInsert,\n })\n }\n\n // //////////////////////////////////\n // INSERT hasMany NUMBERS\n // //////////////////////////////////\n\n const numbersTableName = `${tableName}_numbers`\n\n if (operation === 'update') {\n await deleteExistingRowsByPath({\n adapter,\n db,\n localeColumnName: 'locale',\n parentColumnName: 'parent',\n parentID: insertedRow.id,\n pathColumnName: 'path',\n rows: [...numbersToInsert, ...rowToInsert.numbersToDelete],\n tableName: numbersTableName,\n })\n }\n\n if (numbersToInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: numbersTableName,\n values: numbersToInsert,\n })\n }\n\n // //////////////////////////////////\n // INSERT BLOCKS\n // //////////////////////////////////\n\n const insertedBlockRows: Record<string, Record<string, unknown>[]> = {}\n\n if (operation === 'update') {\n for (const tableName of rowToInsert.blocksToDelete) {\n const blockTable = adapter.tables[tableName]\n await adapter.deleteWhere({\n db,\n tableName,\n where: eq(blockTable._parentID, insertedRow.id),\n })\n }\n }\n\n // When versions are enabled, adapter is used to track mapping between blocks/arrays ObjectID to their numeric generated representation, then we use it for nested to arrays/blocks select hasMany in versions.\n const arraysBlocksUUIDMap: Record<string, number | string> = {}\n\n for (const [tableName, blockRows] of Object.entries(blocksToInsert)) {\n insertedBlockRows[tableName] = await adapter.insert({\n db,\n tableName,\n values: blockRows.map(({ row }) => row),\n })\n\n insertedBlockRows[tableName].forEach((row, i) => {\n blockRows[i].row = row\n if (\n typeof row._uuid === 'string' &&\n (typeof row.id === 'string' || typeof row.id === 'number')\n ) {\n arraysBlocksUUIDMap[row._uuid] = row.id\n }\n })\n\n const blockLocaleIndexMap: number[] = []\n\n const blockLocaleRowsToInsert = blockRows.reduce((acc, blockRow, i) => {\n if (Object.entries(blockRow.locales).length > 0) {\n Object.entries(blockRow.locales).forEach(([blockLocale, blockLocaleData]) => {\n if (Object.keys(blockLocaleData).length > 0) {\n blockLocaleData._parentID = blockRow.row.id\n blockLocaleData._locale = blockLocale\n acc.push(blockLocaleData)\n blockLocaleIndexMap.push(i)\n }\n })\n }\n\n return acc\n }, [])\n\n if (blockLocaleRowsToInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: `${tableName}${adapter.localesSuffix}`,\n values: blockLocaleRowsToInsert,\n })\n }\n\n await insertArrays({\n adapter,\n arrays: blockRows.map(({ arrays }) => arrays),\n db,\n parentRows: insertedBlockRows[tableName],\n uuidMap: arraysBlocksUUIDMap,\n })\n }\n\n // //////////////////////////////////\n // INSERT ARRAYS RECURSIVELY\n // //////////////////////////////////\n\n if (operation === 'update') {\n for (const arrayTableName of Object.keys(rowToInsert.arrays)) {\n await deleteExistingArrayRows({\n adapter,\n db,\n parentID: insertedRow.id,\n tableName: arrayTableName,\n })\n }\n }\n\n await insertArrays({\n adapter,\n arrays: [rowToInsert.arrays, rowToInsert.arraysToPush],\n db,\n parentRows: [insertedRow, insertedRow],\n uuidMap: arraysBlocksUUIDMap,\n })\n\n // //////////////////////////////////\n // INSERT hasMany SELECTS\n // //////////////////////////////////\n\n for (const [selectTableName, tableRows] of Object.entries(selectsToInsert)) {\n const selectTable = adapter.tables[selectTableName]\n if (operation === 'update') {\n await adapter.deleteWhere({\n db,\n tableName: selectTableName,\n where: eq(selectTable.parent, insertedRow.id),\n })\n }\n\n if (Object.keys(arraysBlocksUUIDMap).length > 0) {\n tableRows.forEach((row: RelationshipRow) => {\n if (row.parent in arraysBlocksUUIDMap) {\n row.parent = arraysBlocksUUIDMap[row.parent]\n }\n })\n }\n\n if (tableRows.length) {\n await adapter.insert({\n db,\n tableName: selectTableName,\n values: tableRows,\n })\n }\n }\n } catch (error) {\n handleUpsertError({ id, adapter, collectionSlug, error, globalSlug, req, tableName })\n }\n\n if (ignoreResult === 'idOnly') {\n return { id: insertedRow.id } as T\n }\n\n if (ignoreResult) {\n return data as T\n }\n\n // //////////////////////////////////\n // RETRIEVE NEWLY UPDATED ROW\n // //////////////////////////////////\n\n const findManyArgs = buildFindManyArgs({\n adapter,\n depth: 0,\n fields,\n joinQuery: false,\n select,\n tableName,\n })\n\n findManyArgs.where = eq(adapter.tables[tableName].id, insertedRow.id)\n\n const doc = await db.query[tableName].findFirst(findManyArgs)\n\n // //////////////////////////////////\n // TRANSFORM DATA\n // //////////////////////////////////\n\n const result = transform<T>({\n adapter,\n config: adapter.payload.config,\n data: doc,\n fields,\n joinQuery: false,\n tableName,\n })\n\n return result\n}\n"],"names":["and","desc","eq","isNull","or","buildFindManyArgs","transform","transformForWrite","markWrite","deleteExistingArrayRows","deleteExistingRowsByPath","handleUpsertError","insertArrays","shouldUseOptimizedUpsertRow","upsertRow","id","adapter","collectionSlug","data","db","fields","globalSlug","ignoreResult","customID","joinQuery","_joinQuery","operation","path","req","select","tableName","upsertTarget","where","createdAt","Date","toISOString","insertedRow","transformedForWrite","enableAtomicWrites","row","arraysToPush","drizzle","updateWhere","tables","Object","keys","length","arrays","parentRows","uuidMap","updatedAt","hasDataToUpdate","update","set","findManyArgs","depth","findManyKeysLength","hasOnlyColumns","columns","doc","query","findFirst","config","payload","selectedFields","column","enabled","entries","docs","returning","undefined","error","rowToInsert","target","rowKeys","hasLocalizedData","locales","hasMainRowData","every","key","insert","onConflictDoUpdate","values","allowIDOnCreate","localesToInsert","relationsToInsert","textsToInsert","numbersToInsert","blocksToInsert","selectsToInsert","forEach","locale","localeRow","_parentID","_locale","push","relationships","relation","parent","texts","textRow","numbers","numberRow","selects","selectTableName","selectRows","blocks","blockRow","uuid","localeTableName","localesSuffix","localeTable","deleteWhere","relationshipsTableName","relationshipsSuffix","generalRelationshipDeletes","relationshipsToDelete","filter","rel","localeColumnName","parentColumnName","parentID","pathColumnName","rows","relationshipsToAppend","relationshipsToInsert","map","parentId","relationshipTable","rawTables","relationTo","value","conditions","parts","endsWith","existingRels","maxOrder","from","maxOrderResult","order","orderBy","limit","index","relationshipsToActuallyInsert","newRow","some","existingRow","matches","relToDelete","itemToRemove","item","camelKey","textsTableName","textsToDelete","numbersTableName","numbersToDelete","insertedBlockRows","blocksToDelete","blockTable","arraysBlocksUUIDMap","blockRows","i","_uuid","blockLocaleIndexMap","blockLocaleRowsToInsert","reduce","acc","blockLocale","blockLocaleData","arrayTableName","tableRows","selectTable","result"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/upsertRow/index.ts"],"sourcesContent":["import type { LibSQLDatabase } from 'drizzle-orm/libsql'\nimport type { SelectedFields } from 'drizzle-orm/sqlite-core'\nimport type { TypeWithID } from 'payload'\n\nimport { and, desc, eq, isNull, or } from 'drizzle-orm'\n\nimport type { BlockRowToInsert } from '../transform/write/types.js'\nimport type { Args } from './types.js'\n\ntype RelationshipRow = {\n [key: string]: number | string | undefined // For relationship ID columns like categoriesID, moviesID, etc.\n id?: number | string\n locale?: string\n order: number\n parent: number | string // Drizzle table uses 'parent' key\n path: string\n}\n\nimport { buildFindManyArgs } from '../find/buildFindManyArgs.js'\nimport { transform } from '../transform/read/index.js'\nimport { transformForWrite } from '../transform/write/index.js'\nimport { markWrite } from '../utilities/readAfterWrite.js'\nimport { deleteExistingArrayRows } from './deleteExistingArrayRows.js'\nimport { deleteExistingRowsByPath } from './deleteExistingRowsByPath.js'\nimport { handleUpsertError } from './handleUpsertError.js'\nimport { insertArrays } from './insertArrays.js'\nimport { shouldUseOptimizedUpsertRow } from './shouldUseOptimizedUpsertRow.js'\n\n/**\n * If `id` is provided, it will update the row with that ID.\n * If `where` is provided, it will update the row that matches the `where`\n * If neither `id` nor `where` is provided, it will create a new row.\n *\n * adapter function replaces the entire row and does not support partial updates.\n */\nexport const upsertRow = async <T extends Record<string, unknown> | TypeWithID>({\n id,\n adapter,\n collectionSlug,\n data,\n db,\n fields,\n globalSlug,\n ignoreResult,\n // TODO:\n // When we support joins for write operations (create/update) - pass collectionSlug to the buildFindManyArgs\n // Make a new argument in upsertRow.ts and pass the slug from every operation.\n customID,\n joinQuery: _joinQuery,\n operation,\n path = '',\n req,\n select,\n tableName,\n upsertTarget,\n where,\n}: Args): Promise<null | T> => {\n if (operation === 'create' && !data.createdAt) {\n data.createdAt = new Date().toISOString()\n }\n\n markWrite(adapter)\n\n let insertedRow: Record<string, unknown> = { id }\n if (id && shouldUseOptimizedUpsertRow({ data, fields })) {\n try {\n const transformedForWrite = transformForWrite({\n adapter,\n data,\n enableAtomicWrites: true,\n fields,\n tableName,\n })\n const { row } = transformedForWrite\n const { arraysToPush } = transformedForWrite\n\n const drizzle = db as LibSQLDatabase\n const updateWhere = where\n ? and(eq(adapter.tables[tableName].id, id), where)\n : eq(adapter.tables[tableName].id, id)\n\n // First, handle $push arrays\n\n if (arraysToPush && Object.keys(arraysToPush)?.length) {\n await insertArrays({\n adapter,\n arrays: [arraysToPush],\n db,\n parentRows: [insertedRow],\n uuidMap: {},\n })\n }\n\n // If row.updatedAt is not set, delete it to avoid triggering hasDataToUpdate. `updatedAt` may be explicitly set to null to\n // disable triggering hasDataToUpdate.\n if (typeof row.updatedAt === 'undefined' || row.updatedAt === null) {\n delete row.updatedAt\n }\n\n const hasDataToUpdate = row && Object.keys(row)?.length\n\n // Then, handle regular row update\n if (ignoreResult) {\n if (hasDataToUpdate) {\n // Only update row if there is something to update.\n // Example: if the data only consists of a single $push, calling insertArrays is enough - we don't need to update the row.\n await drizzle.update(adapter.tables[tableName]).set(row).where(updateWhere)\n }\n return ignoreResult === 'idOnly' ? ({ id } as T) : null\n }\n\n const findManyArgs = buildFindManyArgs({\n adapter,\n depth: 0,\n fields,\n joinQuery: false,\n select,\n tableName,\n })\n\n const findManyKeysLength = Object.keys(findManyArgs).length\n const hasOnlyColumns = Object.keys(findManyArgs.columns || {}).length > 0\n\n if (!hasDataToUpdate) {\n // Nothing to update => just fetch current row and return\n findManyArgs.where = updateWhere\n\n const doc = await db.query[tableName].findFirst(findManyArgs)\n\n if (!doc) {\n return null\n }\n\n return transform<T>({\n adapter,\n config: adapter.payload.config,\n data: doc,\n fields,\n joinQuery: false,\n tableName,\n })\n }\n\n if (findManyKeysLength === 0 || hasOnlyColumns) {\n // Optimization - No need for joins => can simply use returning(). This is optimal for very simple collections\n // without complex fields that live in separate tables like blocks, arrays, relationships, etc.\n\n const selectedFields: SelectedFields = {}\n if (hasOnlyColumns) {\n for (const [column, enabled] of Object.entries(findManyArgs.columns)) {\n if (enabled) {\n selectedFields[column] = adapter.tables[tableName][column]\n }\n }\n }\n\n const docs = await drizzle\n .update(adapter.tables[tableName])\n .set(row)\n .where(updateWhere)\n .returning(Object.keys(selectedFields).length ? selectedFields : undefined)\n\n if (!docs[0]) {\n return null\n }\n\n return transform<T>({\n adapter,\n config: adapter.payload.config,\n data: docs[0],\n fields,\n joinQuery: false,\n tableName,\n })\n }\n\n // DB Update that needs the result, potentially with joins => need to update first, then find. returning() does not work with joins.\n\n const docs = await drizzle\n .update(adapter.tables[tableName])\n .set(row)\n .where(updateWhere)\n .returning({\n id: adapter.tables[tableName].id,\n })\n\n if (!docs[0]) {\n return null\n }\n\n insertedRow = docs[0]\n\n findManyArgs.where = eq(adapter.tables[tableName].id, insertedRow.id)\n\n const doc = await db.query[tableName].findFirst(findManyArgs)\n\n return transform<T>({\n adapter,\n config: adapter.payload.config,\n data: doc,\n fields,\n joinQuery: false,\n tableName,\n })\n } catch (error) {\n handleUpsertError({ id, adapter, collectionSlug, error, globalSlug, req, tableName })\n }\n }\n // Split out the incoming data into the corresponding:\n // base row, locales, relationships, blocks, and arrays\n const rowToInsert = transformForWrite({\n adapter,\n data,\n enableAtomicWrites: false,\n fields,\n path,\n tableName,\n })\n\n if (customID) {\n rowToInsert.row.id = customID\n }\n\n // First, we insert the main row\n try {\n if (operation === 'update') {\n const target = upsertTarget || adapter.tables[tableName].id\n\n // Check if we only have relationship operations and no main row data to update\n // Exclude timestamp-only updates when we only have relationship operations.\n // Localized field updates live in the `_locales` table, so the main row may only\n // contain timestamps — in that case the parent row's `updatedAt` must still bump.\n const rowKeys = Object.keys(rowToInsert.row)\n const hasLocalizedData = Object.keys(rowToInsert.locales).length > 0\n const hasMainRowData =\n rowKeys.length > 0 &&\n (hasLocalizedData || !rowKeys.every((key) => key === 'updatedAt' || key === 'createdAt'))\n\n if (hasMainRowData) {\n if (id) {\n rowToInsert.row.id = id\n ;[insertedRow] = await adapter.insert({\n db,\n onConflictDoUpdate: where\n ? { set: rowToInsert.row, target, where }\n : { set: rowToInsert.row, target },\n tableName,\n values: rowToInsert.row,\n })\n } else {\n ;[insertedRow] = await adapter.insert({\n db,\n onConflictDoUpdate: { set: rowToInsert.row, target, where },\n tableName,\n values: rowToInsert.row,\n })\n }\n\n if (!insertedRow) {\n return null\n }\n } else {\n // No main row data to update, just use the existing ID\n insertedRow = { id }\n }\n } else {\n if (adapter.allowIDOnCreate && data.id) {\n rowToInsert.row.id = data.id\n }\n ;[insertedRow] = await adapter.insert({\n db,\n tableName,\n values: rowToInsert.row,\n })\n }\n\n const localesToInsert: Record<string, unknown>[] = []\n const relationsToInsert: Record<string, unknown>[] = []\n const textsToInsert: Record<string, unknown>[] = []\n const numbersToInsert: Record<string, unknown>[] = []\n const blocksToInsert: { [blockType: string]: BlockRowToInsert[] } = {}\n const selectsToInsert: { [selectTableName: string]: Record<string, unknown>[] } = {}\n\n // If there are locale rows with data, add the parent and locale to each\n if (Object.keys(rowToInsert.locales).length > 0) {\n Object.entries(rowToInsert.locales).forEach(([locale, localeRow]) => {\n localeRow._parentID = insertedRow.id\n localeRow._locale = locale\n localesToInsert.push(localeRow)\n })\n }\n\n // If there are relationships, add parent to each\n if (rowToInsert.relationships.length > 0) {\n rowToInsert.relationships.forEach((relation) => {\n relation.parent = insertedRow.id\n relationsToInsert.push(relation)\n })\n }\n\n // If there are texts, add parent to each\n if (rowToInsert.texts.length > 0) {\n rowToInsert.texts.forEach((textRow) => {\n textRow.parent = insertedRow.id\n textsToInsert.push(textRow)\n })\n }\n\n // If there are numbers, add parent to each\n if (rowToInsert.numbers.length > 0) {\n rowToInsert.numbers.forEach((numberRow) => {\n numberRow.parent = insertedRow.id\n numbersToInsert.push(numberRow)\n })\n }\n\n // If there are selects, add parent to each, and then\n // store by table name and rows\n if (Object.keys(rowToInsert.selects).length > 0) {\n Object.entries(rowToInsert.selects).forEach(([selectTableName, selectRows]) => {\n selectsToInsert[selectTableName] = []\n\n selectRows.forEach((row) => {\n if (typeof row.parent === 'undefined') {\n row.parent = insertedRow.id\n }\n\n selectsToInsert[selectTableName].push(row)\n })\n })\n }\n\n // If there are blocks, add parent to each, and then\n // store by table name and rows\n Object.keys(rowToInsert.blocks).forEach((tableName) => {\n rowToInsert.blocks[tableName].forEach((blockRow) => {\n blockRow.row._parentID = insertedRow.id\n if (!blocksToInsert[tableName]) {\n blocksToInsert[tableName] = []\n }\n if (blockRow.row.uuid) {\n delete blockRow.row.uuid\n }\n blocksToInsert[tableName].push(blockRow)\n })\n })\n\n // //////////////////////////////////\n // INSERT LOCALES\n // //////////////////////////////////\n\n if (localesToInsert.length > 0) {\n const localeTableName = `${tableName}${adapter.localesSuffix}`\n const localeTable = adapter.tables[`${tableName}${adapter.localesSuffix}`]\n\n if (operation === 'update') {\n await adapter.deleteWhere({\n db,\n tableName: localeTableName,\n where: eq(localeTable._parentID, insertedRow.id),\n })\n }\n\n await adapter.insert({\n db,\n tableName: localeTableName,\n values: localesToInsert,\n })\n }\n\n // //////////////////////////////////\n // INSERT RELATIONSHIPS\n // //////////////////////////////////\n\n const relationshipsTableName = `${tableName}${adapter.relationshipsSuffix}`\n\n if (operation === 'update') {\n // Filter out specific item deletions (those with itemToRemove) from general path deletions\n const generalRelationshipDeletes = rowToInsert.relationshipsToDelete.filter(\n (rel) => !('itemToRemove' in rel),\n )\n\n await deleteExistingRowsByPath({\n adapter,\n db,\n localeColumnName: 'locale',\n parentColumnName: 'parent',\n parentID: insertedRow.id,\n pathColumnName: 'path',\n rows: [...relationsToInsert, ...generalRelationshipDeletes],\n tableName: relationshipsTableName,\n })\n }\n\n if (relationsToInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: relationshipsTableName,\n values: relationsToInsert,\n })\n }\n\n // //////////////////////////////////\n // HANDLE RELATIONSHIP $push OPERATIONS\n // //////////////////////////////////\n\n if (rowToInsert.relationshipsToAppend.length > 0) {\n // Prepare all relationships for batch insert (order will be set after max query)\n const relationshipsToInsert = rowToInsert.relationshipsToAppend.map((rel) => {\n const parentId = id || insertedRow.id\n const row: Record<string, unknown> = {\n parent: parentId, // Use 'parent' key for Drizzle table\n path: rel.path,\n }\n\n // Only add locale if this relationship table has a locale column\n const relationshipTable = adapter.rawTables[relationshipsTableName]\n if (rel.locale && relationshipTable && relationshipTable.columns.locale) {\n row.locale = rel.locale\n }\n\n if (rel.relationTo) {\n // Use camelCase key for Drizzle table (e.g., categoriesID not categories_id)\n row[`${rel.relationTo}ID`] = rel.value\n }\n\n return row\n })\n\n if (relationshipsToInsert.length > 0) {\n // Check for potential duplicates\n const relationshipTable = adapter.tables[relationshipsTableName]\n\n if (relationshipTable) {\n // Build conditions only if we have relationships to check\n if (relationshipsToInsert.length === 0) {\n return // No relationships to insert\n }\n\n const conditions = relationshipsToInsert.map((row: RelationshipRow) => {\n const parts = [\n eq(relationshipTable.parent, row.parent),\n eq(relationshipTable.path, row.path),\n ]\n\n // Add locale condition\n if (row.locale !== undefined && relationshipTable.locale) {\n parts.push(eq(relationshipTable.locale, row.locale))\n } else if (relationshipTable.locale) {\n parts.push(isNull(relationshipTable.locale))\n }\n\n // Add all relationship ID matches using schema fields\n for (const [key, value] of Object.entries(row)) {\n if (key.endsWith('ID') && value != null) {\n const column = relationshipTable[key]\n if (column && typeof column === 'object') {\n parts.push(eq(column, value))\n }\n }\n }\n\n return and(...parts)\n })\n\n // Get both existing relationships AND max order in a single query\n let existingRels: Record<string, unknown>[] = []\n let maxOrder = 0\n\n if (conditions.length > 0) {\n // Query for existing relationships\n existingRels = await (db as any)\n .select()\n .from(relationshipTable)\n .where(or(...conditions))\n }\n\n // Get max order for this parent across all paths in a single query\n const parentId = id || insertedRow.id\n const maxOrderResult = await (db as any)\n .select({ maxOrder: relationshipTable.order })\n .from(relationshipTable)\n .where(eq(relationshipTable.parent, parentId))\n .orderBy(desc(relationshipTable.order))\n .limit(1)\n\n if (maxOrderResult.length > 0 && maxOrderResult[0].maxOrder) {\n maxOrder = maxOrderResult[0].maxOrder\n }\n\n // Set order values for all relationships based on max order\n relationshipsToInsert.forEach((row, index) => {\n row.order = maxOrder + index + 1\n })\n\n // Filter out relationships that already exist\n const relationshipsToActuallyInsert = relationshipsToInsert.filter((newRow) => {\n return !existingRels.some((existingRow: Record<string, unknown>) => {\n // Check if this relationship already exists\n let matches = existingRow.parent === newRow.parent && existingRow.path === newRow.path\n\n if (newRow.locale !== undefined) {\n matches = matches && existingRow.locale === newRow.locale\n }\n\n // Check relationship value matches - convert to camelCase for comparison\n for (const key of Object.keys(newRow)) {\n if (key.endsWith('ID')) {\n // Now using camelCase keys\n matches = matches && existingRow[key] === newRow[key]\n }\n }\n\n return matches\n })\n })\n\n // Insert only non-duplicate relationships\n if (relationshipsToActuallyInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: relationshipsTableName,\n values: relationshipsToActuallyInsert,\n })\n }\n }\n }\n }\n\n // //////////////////////////////////\n // HANDLE RELATIONSHIP $remove OPERATIONS\n // //////////////////////////////////\n\n if (rowToInsert.relationshipsToDelete.some((rel) => 'itemToRemove' in rel)) {\n const relationshipTable = adapter.tables[relationshipsTableName]\n\n if (relationshipTable) {\n for (const relToDelete of rowToInsert.relationshipsToDelete) {\n if ('itemToRemove' in relToDelete && relToDelete.itemToRemove) {\n const item = relToDelete.itemToRemove\n const parentId = (id || insertedRow.id) as number | string\n\n const conditions = [\n eq(relationshipTable.parent, parentId),\n eq(relationshipTable.path, relToDelete.path),\n ]\n\n // Add locale condition if this relationship table has a locale column\n if (adapter.rawTables[relationshipsTableName]?.columns.locale) {\n if (relToDelete.locale) {\n conditions.push(eq(relationshipTable.locale, relToDelete.locale))\n } else {\n conditions.push(isNull(relationshipTable.locale))\n }\n }\n\n // Handle polymorphic vs simple relationships\n if (typeof item === 'object' && 'relationTo' in item) {\n // Polymorphic relationship - convert to camelCase key\n const camelKey = `${item.relationTo}ID`\n if (relationshipTable[camelKey]) {\n conditions.push(eq(relationshipTable[camelKey], item.value))\n }\n } else if (relToDelete.relationTo) {\n // Simple relationship - convert to camelCase key\n const camelKey = `${relToDelete.relationTo}ID`\n if (relationshipTable[camelKey]) {\n conditions.push(eq(relationshipTable[camelKey], item))\n }\n }\n\n // Execute DELETE using Drizzle query builder\n await adapter.deleteWhere({\n db,\n tableName: relationshipsTableName,\n where: and(...conditions),\n })\n }\n }\n }\n }\n\n // //////////////////////////////////\n // INSERT hasMany TEXTS\n // //////////////////////////////////\n\n const textsTableName = `${tableName}_texts`\n\n if (operation === 'update') {\n await deleteExistingRowsByPath({\n adapter,\n db,\n localeColumnName: 'locale',\n parentColumnName: 'parent',\n parentID: insertedRow.id,\n pathColumnName: 'path',\n rows: [...textsToInsert, ...rowToInsert.textsToDelete],\n tableName: textsTableName,\n })\n }\n\n if (textsToInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: textsTableName,\n values: textsToInsert,\n })\n }\n\n // //////////////////////////////////\n // INSERT hasMany NUMBERS\n // //////////////////////////////////\n\n const numbersTableName = `${tableName}_numbers`\n\n if (operation === 'update') {\n await deleteExistingRowsByPath({\n adapter,\n db,\n localeColumnName: 'locale',\n parentColumnName: 'parent',\n parentID: insertedRow.id,\n pathColumnName: 'path',\n rows: [...numbersToInsert, ...rowToInsert.numbersToDelete],\n tableName: numbersTableName,\n })\n }\n\n if (numbersToInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: numbersTableName,\n values: numbersToInsert,\n })\n }\n\n // //////////////////////////////////\n // INSERT BLOCKS\n // //////////////////////////////////\n\n const insertedBlockRows: Record<string, Record<string, unknown>[]> = {}\n\n if (operation === 'update') {\n for (const tableName of rowToInsert.blocksToDelete) {\n const blockTable = adapter.tables[tableName]\n await adapter.deleteWhere({\n db,\n tableName,\n where: eq(blockTable._parentID, insertedRow.id),\n })\n }\n }\n\n // When versions are enabled, adapter is used to track mapping between blocks/arrays ObjectID to their numeric generated representation, then we use it for nested to arrays/blocks select hasMany in versions.\n const arraysBlocksUUIDMap: Record<string, number | string> = {}\n\n for (const [tableName, blockRows] of Object.entries(blocksToInsert)) {\n insertedBlockRows[tableName] = await adapter.insert({\n db,\n tableName,\n values: blockRows.map(({ row }) => row),\n })\n\n insertedBlockRows[tableName].forEach((row, i) => {\n blockRows[i].row = row\n if (\n typeof row._uuid === 'string' &&\n (typeof row.id === 'string' || typeof row.id === 'number')\n ) {\n arraysBlocksUUIDMap[row._uuid] = row.id\n }\n })\n\n const blockLocaleIndexMap: number[] = []\n\n const blockLocaleRowsToInsert = blockRows.reduce((acc, blockRow, i) => {\n if (Object.entries(blockRow.locales).length > 0) {\n Object.entries(blockRow.locales).forEach(([blockLocale, blockLocaleData]) => {\n if (Object.keys(blockLocaleData).length > 0) {\n blockLocaleData._parentID = blockRow.row.id\n blockLocaleData._locale = blockLocale\n acc.push(blockLocaleData)\n blockLocaleIndexMap.push(i)\n }\n })\n }\n\n return acc\n }, [])\n\n if (blockLocaleRowsToInsert.length > 0) {\n await adapter.insert({\n db,\n tableName: `${tableName}${adapter.localesSuffix}`,\n values: blockLocaleRowsToInsert,\n })\n }\n\n await insertArrays({\n adapter,\n arrays: blockRows.map(({ arrays }) => arrays),\n db,\n parentRows: insertedBlockRows[tableName],\n uuidMap: arraysBlocksUUIDMap,\n })\n }\n\n // //////////////////////////////////\n // INSERT ARRAYS RECURSIVELY\n // //////////////////////////////////\n\n if (operation === 'update') {\n for (const arrayTableName of Object.keys(rowToInsert.arrays)) {\n await deleteExistingArrayRows({\n adapter,\n db,\n parentID: insertedRow.id,\n tableName: arrayTableName,\n })\n }\n }\n\n await insertArrays({\n adapter,\n arrays: [rowToInsert.arrays, rowToInsert.arraysToPush],\n db,\n parentRows: [insertedRow, insertedRow],\n uuidMap: arraysBlocksUUIDMap,\n })\n\n // //////////////////////////////////\n // INSERT hasMany SELECTS\n // //////////////////////////////////\n\n for (const [selectTableName, tableRows] of Object.entries(selectsToInsert)) {\n const selectTable = adapter.tables[selectTableName]\n if (operation === 'update') {\n await adapter.deleteWhere({\n db,\n tableName: selectTableName,\n where: eq(selectTable.parent, insertedRow.id),\n })\n }\n\n if (Object.keys(arraysBlocksUUIDMap).length > 0) {\n tableRows.forEach((row: RelationshipRow) => {\n if (row.parent in arraysBlocksUUIDMap) {\n row.parent = arraysBlocksUUIDMap[row.parent]\n }\n })\n }\n\n if (tableRows.length) {\n await adapter.insert({\n db,\n tableName: selectTableName,\n values: tableRows,\n })\n }\n }\n } catch (error) {\n handleUpsertError({ id, adapter, collectionSlug, error, globalSlug, req, tableName })\n }\n\n if (ignoreResult === 'idOnly') {\n return { id: insertedRow.id } as T\n }\n\n if (ignoreResult) {\n return data as T\n }\n\n // //////////////////////////////////\n // RETRIEVE NEWLY UPDATED ROW\n // //////////////////////////////////\n\n const findManyArgs = buildFindManyArgs({\n adapter,\n depth: 0,\n fields,\n joinQuery: false,\n select,\n tableName,\n })\n\n findManyArgs.where = eq(adapter.tables[tableName].id, insertedRow.id)\n\n const doc = await db.query[tableName].findFirst(findManyArgs)\n\n // //////////////////////////////////\n // TRANSFORM DATA\n // //////////////////////////////////\n\n const result = transform<T>({\n adapter,\n config: adapter.payload.config,\n data: doc,\n fields,\n joinQuery: false,\n tableName,\n })\n\n return result\n}\n"],"names":["and","desc","eq","isNull","or","buildFindManyArgs","transform","transformForWrite","markWrite","deleteExistingArrayRows","deleteExistingRowsByPath","handleUpsertError","insertArrays","shouldUseOptimizedUpsertRow","upsertRow","id","adapter","collectionSlug","data","db","fields","globalSlug","ignoreResult","customID","joinQuery","_joinQuery","operation","path","req","select","tableName","upsertTarget","where","createdAt","Date","toISOString","insertedRow","transformedForWrite","enableAtomicWrites","row","arraysToPush","drizzle","updateWhere","tables","Object","keys","length","arrays","parentRows","uuidMap","updatedAt","hasDataToUpdate","update","set","findManyArgs","depth","findManyKeysLength","hasOnlyColumns","columns","doc","query","findFirst","config","payload","selectedFields","column","enabled","entries","docs","returning","undefined","error","rowToInsert","target","rowKeys","hasLocalizedData","locales","hasMainRowData","every","key","insert","onConflictDoUpdate","values","allowIDOnCreate","localesToInsert","relationsToInsert","textsToInsert","numbersToInsert","blocksToInsert","selectsToInsert","forEach","locale","localeRow","_parentID","_locale","push","relationships","relation","parent","texts","textRow","numbers","numberRow","selects","selectTableName","selectRows","blocks","blockRow","uuid","localeTableName","localesSuffix","localeTable","deleteWhere","relationshipsTableName","relationshipsSuffix","generalRelationshipDeletes","relationshipsToDelete","filter","rel","localeColumnName","parentColumnName","parentID","pathColumnName","rows","relationshipsToAppend","relationshipsToInsert","map","parentId","relationshipTable","rawTables","relationTo","value","conditions","parts","endsWith","existingRels","maxOrder","from","maxOrderResult","order","orderBy","limit","index","relationshipsToActuallyInsert","newRow","some","existingRow","matches","relToDelete","itemToRemove","item","camelKey","textsTableName","textsToDelete","numbersTableName","numbersToDelete","insertedBlockRows","blocksToDelete","blockTable","arraysBlocksUUIDMap","blockRows","i","_uuid","blockLocaleIndexMap","blockLocaleRowsToInsert","reduce","acc","blockLocale","blockLocaleData","arrayTableName","tableRows","selectTable","result"],"mappings":"AAIA,SAASA,GAAG,EAAEC,IAAI,EAAEC,EAAE,EAAEC,MAAM,EAAEC,EAAE,QAAQ,cAAa;AAcvD,SAASC,iBAAiB,QAAQ,+BAA8B;AAChE,SAASC,SAAS,QAAQ,6BAA4B;AACtD,SAASC,iBAAiB,QAAQ,8BAA6B;AAC/D,SAASC,SAAS,QAAQ,iCAAgC;AAC1D,SAASC,uBAAuB,QAAQ,+BAA8B;AACtE,SAASC,wBAAwB,QAAQ,gCAA+B;AACxE,SAASC,iBAAiB,QAAQ,yBAAwB;AAC1D,SAASC,YAAY,QAAQ,oBAAmB;AAChD,SAASC,2BAA2B,QAAQ,mCAAkC;AAE9E;;;;;;CAMC,GACD,OAAO,MAAMC,YAAY,OAAuD,EAC9EC,EAAE,EACFC,OAAO,EACPC,cAAc,EACdC,IAAI,EACJC,EAAE,EACFC,MAAM,EACNC,UAAU,EACVC,YAAY,EACZ,QAAQ;AACR,4GAA4G;AAC5G,8EAA8E;AAC9EC,QAAQ,EACRC,WAAWC,UAAU,EACrBC,SAAS,EACTC,OAAO,EAAE,EACTC,GAAG,EACHC,MAAM,EACNC,SAAS,EACTC,YAAY,EACZC,KAAK,EACA;IACL,IAAIN,cAAc,YAAY,CAACR,KAAKe,SAAS,EAAE;QAC7Cf,KAAKe,SAAS,GAAG,IAAIC,OAAOC,WAAW;IACzC;IAEA3B,UAAUQ;IAEV,IAAIoB,cAAuC;QAAErB;IAAG;IAChD,IAAIA,MAAMF,4BAA4B;QAAEK;QAAME;IAAO,IAAI;QACvD,IAAI;YACF,MAAMiB,sBAAsB9B,kBAAkB;gBAC5CS;gBACAE;gBACAoB,oBAAoB;gBACpBlB;gBACAU;YACF;YACA,MAAM,EAAES,GAAG,EAAE,GAAGF;YAChB,MAAM,EAAEG,YAAY,EAAE,GAAGH;YAEzB,MAAMI,UAAUtB;YAChB,MAAMuB,cAAcV,QAChBhC,IAAIE,GAAGc,QAAQ2B,MAAM,CAACb,UAAU,CAACf,EAAE,EAAEA,KAAKiB,SAC1C9B,GAAGc,QAAQ2B,MAAM,CAACb,UAAU,CAACf,EAAE,EAAEA;YAErC,6BAA6B;YAE7B,IAAIyB,gBAAgBI,OAAOC,IAAI,CAACL,eAAeM,QAAQ;gBACrD,MAAMlC,aAAa;oBACjBI;oBACA+B,QAAQ;wBAACP;qBAAa;oBACtBrB;oBACA6B,YAAY;wBAACZ;qBAAY;oBACzBa,SAAS,CAAC;gBACZ;YACF;YAEA,2HAA2H;YAC3H,sCAAsC;YACtC,IAAI,OAAOV,IAAIW,SAAS,KAAK,eAAeX,IAAIW,SAAS,KAAK,MAAM;gBAClE,OAAOX,IAAIW,SAAS;YACtB;YAEA,MAAMC,kBAAkBZ,OAAOK,OAAOC,IAAI,CAACN,MAAMO;YAEjD,kCAAkC;YAClC,IAAIxB,cAAc;gBAChB,IAAI6B,iBAAiB;oBACnB,mDAAmD;oBACnD,0HAA0H;oBAC1H,MAAMV,QAAQW,MAAM,CAACpC,QAAQ2B,MAAM,CAACb,UAAU,EAAEuB,GAAG,CAACd,KAAKP,KAAK,CAACU;gBACjE;gBACA,OAAOpB,iBAAiB,WAAY;oBAAEP;gBAAG,IAAU;YACrD;YAEA,MAAMuC,eAAejD,kBAAkB;gBACrCW;gBACAuC,OAAO;gBACPnC;gBACAI,WAAW;gBACXK;gBACAC;YACF;YAEA,MAAM0B,qBAAqBZ,OAAOC,IAAI,CAACS,cAAcR,MAAM;YAC3D,MAAMW,iBAAiBb,OAAOC,IAAI,CAACS,aAAaI,OAAO,IAAI,CAAC,GAAGZ,MAAM,GAAG;YAExE,IAAI,CAACK,iBAAiB;gBACpB,yDAAyD;gBACzDG,aAAatB,KAAK,GAAGU;gBAErB,MAAMiB,MAAM,MAAMxC,GAAGyC,KAAK,CAAC9B,UAAU,CAAC+B,SAAS,CAACP;gBAEhD,IAAI,CAACK,KAAK;oBACR,OAAO;gBACT;gBAEA,OAAOrD,UAAa;oBAClBU;oBACA8C,QAAQ9C,QAAQ+C,OAAO,CAACD,MAAM;oBAC9B5C,MAAMyC;oBACNvC;oBACAI,WAAW;oBACXM;gBACF;YACF;YAEA,IAAI0B,uBAAuB,KAAKC,gBAAgB;gBAC9C,8GAA8G;gBAC9G,+FAA+F;gBAE/F,MAAMO,iBAAiC,CAAC;gBACxC,IAAIP,gBAAgB;oBAClB,KAAK,MAAM,CAACQ,QAAQC,QAAQ,IAAItB,OAAOuB,OAAO,CAACb,aAAaI,OAAO,EAAG;wBACpE,IAAIQ,SAAS;4BACXF,cAAc,CAACC,OAAO,GAAGjD,QAAQ2B,MAAM,CAACb,UAAU,CAACmC,OAAO;wBAC5D;oBACF;gBACF;gBAEA,MAAMG,OAAO,MAAM3B,QAChBW,MAAM,CAACpC,QAAQ2B,MAAM,CAACb,UAAU,EAChCuB,GAAG,CAACd,KACJP,KAAK,CAACU,aACN2B,SAAS,CAACzB,OAAOC,IAAI,CAACmB,gBAAgBlB,MAAM,GAAGkB,iBAAiBM;gBAEnE,IAAI,CAACF,IAAI,CAAC,EAAE,EAAE;oBACZ,OAAO;gBACT;gBAEA,OAAO9D,UAAa;oBAClBU;oBACA8C,QAAQ9C,QAAQ+C,OAAO,CAACD,MAAM;oBAC9B5C,MAAMkD,IAAI,CAAC,EAAE;oBACbhD;oBACAI,WAAW;oBACXM;gBACF;YACF;YAEA,oIAAoI;YAEpI,MAAMsC,OAAO,MAAM3B,QAChBW,MAAM,CAACpC,QAAQ2B,MAAM,CAACb,UAAU,EAChCuB,GAAG,CAACd,KACJP,KAAK,CAACU,aACN2B,SAAS,CAAC;gBACTtD,IAAIC,QAAQ2B,MAAM,CAACb,UAAU,CAACf,EAAE;YAClC;YAEF,IAAI,CAACqD,IAAI,CAAC,EAAE,EAAE;gBACZ,OAAO;YACT;YAEAhC,cAAcgC,IAAI,CAAC,EAAE;YAErBd,aAAatB,KAAK,GAAG9B,GAAGc,QAAQ2B,MAAM,CAACb,UAAU,CAACf,EAAE,EAAEqB,YAAYrB,EAAE;YAEpE,MAAM4C,MAAM,MAAMxC,GAAGyC,KAAK,CAAC9B,UAAU,CAAC+B,SAAS,CAACP;YAEhD,OAAOhD,UAAa;gBAClBU;gBACA8C,QAAQ9C,QAAQ+C,OAAO,CAACD,MAAM;gBAC9B5C,MAAMyC;gBACNvC;gBACAI,WAAW;gBACXM;YACF;QACF,EAAE,OAAOyC,OAAO;YACd5D,kBAAkB;gBAAEI;gBAAIC;gBAASC;gBAAgBsD;gBAAOlD;gBAAYO;gBAAKE;YAAU;QACrF;IACF;IACA,sDAAsD;IACtD,uDAAuD;IACvD,MAAM0C,cAAcjE,kBAAkB;QACpCS;QACAE;QACAoB,oBAAoB;QACpBlB;QACAO;QACAG;IACF;IAEA,IAAIP,UAAU;QACZiD,YAAYjC,GAAG,CAACxB,EAAE,GAAGQ;IACvB;IAEA,gCAAgC;IAChC,IAAI;QACF,IAAIG,cAAc,UAAU;YAC1B,MAAM+C,SAAS1C,gBAAgBf,QAAQ2B,MAAM,CAACb,UAAU,CAACf,EAAE;YAE3D,+EAA+E;YAC/E,4EAA4E;YAC5E,iFAAiF;YACjF,kFAAkF;YAClF,MAAM2D,UAAU9B,OAAOC,IAAI,CAAC2B,YAAYjC,GAAG;YAC3C,MAAMoC,mBAAmB/B,OAAOC,IAAI,CAAC2B,YAAYI,OAAO,EAAE9B,MAAM,GAAG;YACnE,MAAM+B,iBACJH,QAAQ5B,MAAM,GAAG,KAChB6B,CAAAA,oBAAoB,CAACD,QAAQI,KAAK,CAAC,CAACC,MAAQA,QAAQ,eAAeA,QAAQ,YAAW;YAEzF,IAAIF,gBAAgB;gBAClB,IAAI9D,IAAI;oBACNyD,YAAYjC,GAAG,CAACxB,EAAE,GAAGA;oBACpB,CAACqB,YAAY,GAAG,MAAMpB,QAAQgE,MAAM,CAAC;wBACpC7D;wBACA8D,oBAAoBjD,QAChB;4BAAEqB,KAAKmB,YAAYjC,GAAG;4BAAEkC;4BAAQzC;wBAAM,IACtC;4BAAEqB,KAAKmB,YAAYjC,GAAG;4BAAEkC;wBAAO;wBACnC3C;wBACAoD,QAAQV,YAAYjC,GAAG;oBACzB;gBACF,OAAO;;oBACJ,CAACH,YAAY,GAAG,MAAMpB,QAAQgE,MAAM,CAAC;wBACpC7D;wBACA8D,oBAAoB;4BAAE5B,KAAKmB,YAAYjC,GAAG;4BAAEkC;4BAAQzC;wBAAM;wBAC1DF;wBACAoD,QAAQV,YAAYjC,GAAG;oBACzB;gBACF;gBAEA,IAAI,CAACH,aAAa;oBAChB,OAAO;gBACT;YACF,OAAO;gBACL,uDAAuD;gBACvDA,cAAc;oBAAErB;gBAAG;YACrB;QACF,OAAO;YACL,IAAIC,QAAQmE,eAAe,IAAIjE,KAAKH,EAAE,EAAE;gBACtCyD,YAAYjC,GAAG,CAACxB,EAAE,GAAGG,KAAKH,EAAE;YAC9B;;YACC,CAACqB,YAAY,GAAG,MAAMpB,QAAQgE,MAAM,CAAC;gBACpC7D;gBACAW;gBACAoD,QAAQV,YAAYjC,GAAG;YACzB;QACF;QAEA,MAAM6C,kBAA6C,EAAE;QACrD,MAAMC,oBAA+C,EAAE;QACvD,MAAMC,gBAA2C,EAAE;QACnD,MAAMC,kBAA6C,EAAE;QACrD,MAAMC,iBAA8D,CAAC;QACrE,MAAMC,kBAA4E,CAAC;QAEnF,wEAAwE;QACxE,IAAI7C,OAAOC,IAAI,CAAC2B,YAAYI,OAAO,EAAE9B,MAAM,GAAG,GAAG;YAC/CF,OAAOuB,OAAO,CAACK,YAAYI,OAAO,EAAEc,OAAO,CAAC,CAAC,CAACC,QAAQC,UAAU;gBAC9DA,UAAUC,SAAS,GAAGzD,YAAYrB,EAAE;gBACpC6E,UAAUE,OAAO,GAAGH;gBACpBP,gBAAgBW,IAAI,CAACH;YACvB;QACF;QAEA,iDAAiD;QACjD,IAAIpB,YAAYwB,aAAa,CAAClD,MAAM,GAAG,GAAG;YACxC0B,YAAYwB,aAAa,CAACN,OAAO,CAAC,CAACO;gBACjCA,SAASC,MAAM,GAAG9D,YAAYrB,EAAE;gBAChCsE,kBAAkBU,IAAI,CAACE;YACzB;QACF;QAEA,yCAAyC;QACzC,IAAIzB,YAAY2B,KAAK,CAACrD,MAAM,GAAG,GAAG;YAChC0B,YAAY2B,KAAK,CAACT,OAAO,CAAC,CAACU;gBACzBA,QAAQF,MAAM,GAAG9D,YAAYrB,EAAE;gBAC/BuE,cAAcS,IAAI,CAACK;YACrB;QACF;QAEA,2CAA2C;QAC3C,IAAI5B,YAAY6B,OAAO,CAACvD,MAAM,GAAG,GAAG;YAClC0B,YAAY6B,OAAO,CAACX,OAAO,CAAC,CAACY;gBAC3BA,UAAUJ,MAAM,GAAG9D,YAAYrB,EAAE;gBACjCwE,gBAAgBQ,IAAI,CAACO;YACvB;QACF;QAEA,qDAAqD;QACrD,+BAA+B;QAC/B,IAAI1D,OAAOC,IAAI,CAAC2B,YAAY+B,OAAO,EAAEzD,MAAM,GAAG,GAAG;YAC/CF,OAAOuB,OAAO,CAACK,YAAY+B,OAAO,EAAEb,OAAO,CAAC,CAAC,CAACc,iBAAiBC,WAAW;gBACxEhB,eAAe,CAACe,gBAAgB,GAAG,EAAE;gBAErCC,WAAWf,OAAO,CAAC,CAACnD;oBAClB,IAAI,OAAOA,IAAI2D,MAAM,KAAK,aAAa;wBACrC3D,IAAI2D,MAAM,GAAG9D,YAAYrB,EAAE;oBAC7B;oBAEA0E,eAAe,CAACe,gBAAgB,CAACT,IAAI,CAACxD;gBACxC;YACF;QACF;QAEA,oDAAoD;QACpD,+BAA+B;QAC/BK,OAAOC,IAAI,CAAC2B,YAAYkC,MAAM,EAAEhB,OAAO,CAAC,CAAC5D;YACvC0C,YAAYkC,MAAM,CAAC5E,UAAU,CAAC4D,OAAO,CAAC,CAACiB;gBACrCA,SAASpE,GAAG,CAACsD,SAAS,GAAGzD,YAAYrB,EAAE;gBACvC,IAAI,CAACyE,cAAc,CAAC1D,UAAU,EAAE;oBAC9B0D,cAAc,CAAC1D,UAAU,GAAG,EAAE;gBAChC;gBACA,IAAI6E,SAASpE,GAAG,CAACqE,IAAI,EAAE;oBACrB,OAAOD,SAASpE,GAAG,CAACqE,IAAI;gBAC1B;gBACApB,cAAc,CAAC1D,UAAU,CAACiE,IAAI,CAACY;YACjC;QACF;QAEA,qCAAqC;QACrC,iBAAiB;QACjB,qCAAqC;QAErC,IAAIvB,gBAAgBtC,MAAM,GAAG,GAAG;YAC9B,MAAM+D,kBAAkB,GAAG/E,YAAYd,QAAQ8F,aAAa,EAAE;YAC9D,MAAMC,cAAc/F,QAAQ2B,MAAM,CAAC,GAAGb,YAAYd,QAAQ8F,aAAa,EAAE,CAAC;YAE1E,IAAIpF,cAAc,UAAU;gBAC1B,MAAMV,QAAQgG,WAAW,CAAC;oBACxB7F;oBACAW,WAAW+E;oBACX7E,OAAO9B,GAAG6G,YAAYlB,SAAS,EAAEzD,YAAYrB,EAAE;gBACjD;YACF;YAEA,MAAMC,QAAQgE,MAAM,CAAC;gBACnB7D;gBACAW,WAAW+E;gBACX3B,QAAQE;YACV;QACF;QAEA,qCAAqC;QACrC,uBAAuB;QACvB,qCAAqC;QAErC,MAAM6B,yBAAyB,GAAGnF,YAAYd,QAAQkG,mBAAmB,EAAE;QAE3E,IAAIxF,cAAc,UAAU;YAC1B,2FAA2F;YAC3F,MAAMyF,6BAA6B3C,YAAY4C,qBAAqB,CAACC,MAAM,CACzE,CAACC,MAAQ,CAAE,CAAA,kBAAkBA,GAAE;YAGjC,MAAM5G,yBAAyB;gBAC7BM;gBACAG;gBACAoG,kBAAkB;gBAClBC,kBAAkB;gBAClBC,UAAUrF,YAAYrB,EAAE;gBACxB2G,gBAAgB;gBAChBC,MAAM;uBAAItC;uBAAsB8B;iBAA2B;gBAC3DrF,WAAWmF;YACb;QACF;QAEA,IAAI5B,kBAAkBvC,MAAM,GAAG,GAAG;YAChC,MAAM9B,QAAQgE,MAAM,CAAC;gBACnB7D;gBACAW,WAAWmF;gBACX/B,QAAQG;YACV;QACF;QAEA,qCAAqC;QACrC,uCAAuC;QACvC,qCAAqC;QAErC,IAAIb,YAAYoD,qBAAqB,CAAC9E,MAAM,GAAG,GAAG;YAChD,iFAAiF;YACjF,MAAM+E,wBAAwBrD,YAAYoD,qBAAqB,CAACE,GAAG,CAAC,CAACR;gBACnE,MAAMS,WAAWhH,MAAMqB,YAAYrB,EAAE;gBACrC,MAAMwB,MAA+B;oBACnC2D,QAAQ6B;oBACRpG,MAAM2F,IAAI3F,IAAI;gBAChB;gBAEA,iEAAiE;gBACjE,MAAMqG,oBAAoBhH,QAAQiH,SAAS,CAAChB,uBAAuB;gBACnE,IAAIK,IAAI3B,MAAM,IAAIqC,qBAAqBA,kBAAkBtE,OAAO,CAACiC,MAAM,EAAE;oBACvEpD,IAAIoD,MAAM,GAAG2B,IAAI3B,MAAM;gBACzB;gBAEA,IAAI2B,IAAIY,UAAU,EAAE;oBAClB,6EAA6E;oBAC7E3F,GAAG,CAAC,GAAG+E,IAAIY,UAAU,CAAC,EAAE,CAAC,CAAC,GAAGZ,IAAIa,KAAK;gBACxC;gBAEA,OAAO5F;YACT;YAEA,IAAIsF,sBAAsB/E,MAAM,GAAG,GAAG;gBACpC,iCAAiC;gBACjC,MAAMkF,oBAAoBhH,QAAQ2B,MAAM,CAACsE,uBAAuB;gBAEhE,IAAIe,mBAAmB;oBACrB,0DAA0D;oBAC1D,IAAIH,sBAAsB/E,MAAM,KAAK,GAAG;wBACtC,QAAO,6BAA6B;oBACtC;oBAEA,MAAMsF,aAAaP,sBAAsBC,GAAG,CAAC,CAACvF;wBAC5C,MAAM8F,QAAQ;4BACZnI,GAAG8H,kBAAkB9B,MAAM,EAAE3D,IAAI2D,MAAM;4BACvChG,GAAG8H,kBAAkBrG,IAAI,EAAEY,IAAIZ,IAAI;yBACpC;wBAED,uBAAuB;wBACvB,IAAIY,IAAIoD,MAAM,KAAKrB,aAAa0D,kBAAkBrC,MAAM,EAAE;4BACxD0C,MAAMtC,IAAI,CAAC7F,GAAG8H,kBAAkBrC,MAAM,EAAEpD,IAAIoD,MAAM;wBACpD,OAAO,IAAIqC,kBAAkBrC,MAAM,EAAE;4BACnC0C,MAAMtC,IAAI,CAAC5F,OAAO6H,kBAAkBrC,MAAM;wBAC5C;wBAEA,sDAAsD;wBACtD,KAAK,MAAM,CAACZ,KAAKoD,MAAM,IAAIvF,OAAOuB,OAAO,CAAC5B,KAAM;4BAC9C,IAAIwC,IAAIuD,QAAQ,CAAC,SAASH,SAAS,MAAM;gCACvC,MAAMlE,SAAS+D,iBAAiB,CAACjD,IAAI;gCACrC,IAAId,UAAU,OAAOA,WAAW,UAAU;oCACxCoE,MAAMtC,IAAI,CAAC7F,GAAG+D,QAAQkE;gCACxB;4BACF;wBACF;wBAEA,OAAOnI,OAAOqI;oBAChB;oBAEA,kEAAkE;oBAClE,IAAIE,eAA0C,EAAE;oBAChD,IAAIC,WAAW;oBAEf,IAAIJ,WAAWtF,MAAM,GAAG,GAAG;wBACzB,mCAAmC;wBACnCyF,eAAe,MAAM,AAACpH,GACnBU,MAAM,GACN4G,IAAI,CAACT,mBACLhG,KAAK,CAAC5B,MAAMgI;oBACjB;oBAEA,mEAAmE;oBACnE,MAAML,WAAWhH,MAAMqB,YAAYrB,EAAE;oBACrC,MAAM2H,iBAAiB,MAAM,AAACvH,GAC3BU,MAAM,CAAC;wBAAE2G,UAAUR,kBAAkBW,KAAK;oBAAC,GAC3CF,IAAI,CAACT,mBACLhG,KAAK,CAAC9B,GAAG8H,kBAAkB9B,MAAM,EAAE6B,WACnCa,OAAO,CAAC3I,KAAK+H,kBAAkBW,KAAK,GACpCE,KAAK,CAAC;oBAET,IAAIH,eAAe5F,MAAM,GAAG,KAAK4F,cAAc,CAAC,EAAE,CAACF,QAAQ,EAAE;wBAC3DA,WAAWE,cAAc,CAAC,EAAE,CAACF,QAAQ;oBACvC;oBAEA,4DAA4D;oBAC5DX,sBAAsBnC,OAAO,CAAC,CAACnD,KAAKuG;wBAClCvG,IAAIoG,KAAK,GAAGH,WAAWM,QAAQ;oBACjC;oBAEA,8CAA8C;oBAC9C,MAAMC,gCAAgClB,sBAAsBR,MAAM,CAAC,CAAC2B;wBAClE,OAAO,CAACT,aAAaU,IAAI,CAAC,CAACC;4BACzB,4CAA4C;4BAC5C,IAAIC,UAAUD,YAAYhD,MAAM,KAAK8C,OAAO9C,MAAM,IAAIgD,YAAYvH,IAAI,KAAKqH,OAAOrH,IAAI;4BAEtF,IAAIqH,OAAOrD,MAAM,KAAKrB,WAAW;gCAC/B6E,UAAUA,WAAWD,YAAYvD,MAAM,KAAKqD,OAAOrD,MAAM;4BAC3D;4BAEA,yEAAyE;4BACzE,KAAK,MAAMZ,OAAOnC,OAAOC,IAAI,CAACmG,QAAS;gCACrC,IAAIjE,IAAIuD,QAAQ,CAAC,OAAO;oCACtB,2BAA2B;oCAC3Ba,UAAUA,WAAWD,WAAW,CAACnE,IAAI,KAAKiE,MAAM,CAACjE,IAAI;gCACvD;4BACF;4BAEA,OAAOoE;wBACT;oBACF;oBAEA,0CAA0C;oBAC1C,IAAIJ,8BAA8BjG,MAAM,GAAG,GAAG;wBAC5C,MAAM9B,QAAQgE,MAAM,CAAC;4BACnB7D;4BACAW,WAAWmF;4BACX/B,QAAQ6D;wBACV;oBACF;gBACF;YACF;QACF;QAEA,qCAAqC;QACrC,yCAAyC;QACzC,qCAAqC;QAErC,IAAIvE,YAAY4C,qBAAqB,CAAC6B,IAAI,CAAC,CAAC3B,MAAQ,kBAAkBA,MAAM;YAC1E,MAAMU,oBAAoBhH,QAAQ2B,MAAM,CAACsE,uBAAuB;YAEhE,IAAIe,mBAAmB;gBACrB,KAAK,MAAMoB,eAAe5E,YAAY4C,qBAAqB,CAAE;oBAC3D,IAAI,kBAAkBgC,eAAeA,YAAYC,YAAY,EAAE;wBAC7D,MAAMC,OAAOF,YAAYC,YAAY;wBACrC,MAAMtB,WAAYhH,MAAMqB,YAAYrB,EAAE;wBAEtC,MAAMqH,aAAa;4BACjBlI,GAAG8H,kBAAkB9B,MAAM,EAAE6B;4BAC7B7H,GAAG8H,kBAAkBrG,IAAI,EAAEyH,YAAYzH,IAAI;yBAC5C;wBAED,sEAAsE;wBACtE,IAAIX,QAAQiH,SAAS,CAAChB,uBAAuB,EAAEvD,QAAQiC,QAAQ;4BAC7D,IAAIyD,YAAYzD,MAAM,EAAE;gCACtByC,WAAWrC,IAAI,CAAC7F,GAAG8H,kBAAkBrC,MAAM,EAAEyD,YAAYzD,MAAM;4BACjE,OAAO;gCACLyC,WAAWrC,IAAI,CAAC5F,OAAO6H,kBAAkBrC,MAAM;4BACjD;wBACF;wBAEA,6CAA6C;wBAC7C,IAAI,OAAO2D,SAAS,YAAY,gBAAgBA,MAAM;4BACpD,sDAAsD;4BACtD,MAAMC,WAAW,GAAGD,KAAKpB,UAAU,CAAC,EAAE,CAAC;4BACvC,IAAIF,iBAAiB,CAACuB,SAAS,EAAE;gCAC/BnB,WAAWrC,IAAI,CAAC7F,GAAG8H,iBAAiB,CAACuB,SAAS,EAAED,KAAKnB,KAAK;4BAC5D;wBACF,OAAO,IAAIiB,YAAYlB,UAAU,EAAE;4BACjC,iDAAiD;4BACjD,MAAMqB,WAAW,GAAGH,YAAYlB,UAAU,CAAC,EAAE,CAAC;4BAC9C,IAAIF,iBAAiB,CAACuB,SAAS,EAAE;gCAC/BnB,WAAWrC,IAAI,CAAC7F,GAAG8H,iBAAiB,CAACuB,SAAS,EAAED;4BAClD;wBACF;wBAEA,6CAA6C;wBAC7C,MAAMtI,QAAQgG,WAAW,CAAC;4BACxB7F;4BACAW,WAAWmF;4BACXjF,OAAOhC,OAAOoI;wBAChB;oBACF;gBACF;YACF;QACF;QAEA,qCAAqC;QACrC,uBAAuB;QACvB,qCAAqC;QAErC,MAAMoB,iBAAiB,GAAG1H,UAAU,MAAM,CAAC;QAE3C,IAAIJ,cAAc,UAAU;YAC1B,MAAMhB,yBAAyB;gBAC7BM;gBACAG;gBACAoG,kBAAkB;gBAClBC,kBAAkB;gBAClBC,UAAUrF,YAAYrB,EAAE;gBACxB2G,gBAAgB;gBAChBC,MAAM;uBAAIrC;uBAAkBd,YAAYiF,aAAa;iBAAC;gBACtD3H,WAAW0H;YACb;QACF;QAEA,IAAIlE,cAAcxC,MAAM,GAAG,GAAG;YAC5B,MAAM9B,QAAQgE,MAAM,CAAC;gBACnB7D;gBACAW,WAAW0H;gBACXtE,QAAQI;YACV;QACF;QAEA,qCAAqC;QACrC,yBAAyB;QACzB,qCAAqC;QAErC,MAAMoE,mBAAmB,GAAG5H,UAAU,QAAQ,CAAC;QAE/C,IAAIJ,cAAc,UAAU;YAC1B,MAAMhB,yBAAyB;gBAC7BM;gBACAG;gBACAoG,kBAAkB;gBAClBC,kBAAkB;gBAClBC,UAAUrF,YAAYrB,EAAE;gBACxB2G,gBAAgB;gBAChBC,MAAM;uBAAIpC;uBAAoBf,YAAYmF,eAAe;iBAAC;gBAC1D7H,WAAW4H;YACb;QACF;QAEA,IAAInE,gBAAgBzC,MAAM,GAAG,GAAG;YAC9B,MAAM9B,QAAQgE,MAAM,CAAC;gBACnB7D;gBACAW,WAAW4H;gBACXxE,QAAQK;YACV;QACF;QAEA,qCAAqC;QACrC,gBAAgB;QAChB,qCAAqC;QAErC,MAAMqE,oBAA+D,CAAC;QAEtE,IAAIlI,cAAc,UAAU;YAC1B,KAAK,MAAMI,aAAa0C,YAAYqF,cAAc,CAAE;gBAClD,MAAMC,aAAa9I,QAAQ2B,MAAM,CAACb,UAAU;gBAC5C,MAAMd,QAAQgG,WAAW,CAAC;oBACxB7F;oBACAW;oBACAE,OAAO9B,GAAG4J,WAAWjE,SAAS,EAAEzD,YAAYrB,EAAE;gBAChD;YACF;QACF;QAEA,+MAA+M;QAC/M,MAAMgJ,sBAAuD,CAAC;QAE9D,KAAK,MAAM,CAACjI,WAAWkI,UAAU,IAAIpH,OAAOuB,OAAO,CAACqB,gBAAiB;YACnEoE,iBAAiB,CAAC9H,UAAU,GAAG,MAAMd,QAAQgE,MAAM,CAAC;gBAClD7D;gBACAW;gBACAoD,QAAQ8E,UAAUlC,GAAG,CAAC,CAAC,EAAEvF,GAAG,EAAE,GAAKA;YACrC;YAEAqH,iBAAiB,CAAC9H,UAAU,CAAC4D,OAAO,CAAC,CAACnD,KAAK0H;gBACzCD,SAAS,CAACC,EAAE,CAAC1H,GAAG,GAAGA;gBACnB,IACE,OAAOA,IAAI2H,KAAK,KAAK,YACpB,CAAA,OAAO3H,IAAIxB,EAAE,KAAK,YAAY,OAAOwB,IAAIxB,EAAE,KAAK,QAAO,GACxD;oBACAgJ,mBAAmB,CAACxH,IAAI2H,KAAK,CAAC,GAAG3H,IAAIxB,EAAE;gBACzC;YACF;YAEA,MAAMoJ,sBAAgC,EAAE;YAExC,MAAMC,0BAA0BJ,UAAUK,MAAM,CAAC,CAACC,KAAK3D,UAAUsD;gBAC/D,IAAIrH,OAAOuB,OAAO,CAACwC,SAAS/B,OAAO,EAAE9B,MAAM,GAAG,GAAG;oBAC/CF,OAAOuB,OAAO,CAACwC,SAAS/B,OAAO,EAAEc,OAAO,CAAC,CAAC,CAAC6E,aAAaC,gBAAgB;wBACtE,IAAI5H,OAAOC,IAAI,CAAC2H,iBAAiB1H,MAAM,GAAG,GAAG;4BAC3C0H,gBAAgB3E,SAAS,GAAGc,SAASpE,GAAG,CAACxB,EAAE;4BAC3CyJ,gBAAgB1E,OAAO,GAAGyE;4BAC1BD,IAAIvE,IAAI,CAACyE;4BACTL,oBAAoBpE,IAAI,CAACkE;wBAC3B;oBACF;gBACF;gBAEA,OAAOK;YACT,GAAG,EAAE;YAEL,IAAIF,wBAAwBtH,MAAM,GAAG,GAAG;gBACtC,MAAM9B,QAAQgE,MAAM,CAAC;oBACnB7D;oBACAW,WAAW,GAAGA,YAAYd,QAAQ8F,aAAa,EAAE;oBACjD5B,QAAQkF;gBACV;YACF;YAEA,MAAMxJ,aAAa;gBACjBI;gBACA+B,QAAQiH,UAAUlC,GAAG,CAAC,CAAC,EAAE/E,MAAM,EAAE,GAAKA;gBACtC5B;gBACA6B,YAAY4G,iBAAiB,CAAC9H,UAAU;gBACxCmB,SAAS8G;YACX;QACF;QAEA,qCAAqC;QACrC,4BAA4B;QAC5B,qCAAqC;QAErC,IAAIrI,cAAc,UAAU;YAC1B,KAAK,MAAM+I,kBAAkB7H,OAAOC,IAAI,CAAC2B,YAAYzB,MAAM,EAAG;gBAC5D,MAAMtC,wBAAwB;oBAC5BO;oBACAG;oBACAsG,UAAUrF,YAAYrB,EAAE;oBACxBe,WAAW2I;gBACb;YACF;QACF;QAEA,MAAM7J,aAAa;YACjBI;YACA+B,QAAQ;gBAACyB,YAAYzB,MAAM;gBAAEyB,YAAYhC,YAAY;aAAC;YACtDrB;YACA6B,YAAY;gBAACZ;gBAAaA;aAAY;YACtCa,SAAS8G;QACX;QAEA,qCAAqC;QACrC,yBAAyB;QACzB,qCAAqC;QAErC,KAAK,MAAM,CAACvD,iBAAiBkE,UAAU,IAAI9H,OAAOuB,OAAO,CAACsB,iBAAkB;YAC1E,MAAMkF,cAAc3J,QAAQ2B,MAAM,CAAC6D,gBAAgB;YACnD,IAAI9E,cAAc,UAAU;gBAC1B,MAAMV,QAAQgG,WAAW,CAAC;oBACxB7F;oBACAW,WAAW0E;oBACXxE,OAAO9B,GAAGyK,YAAYzE,MAAM,EAAE9D,YAAYrB,EAAE;gBAC9C;YACF;YAEA,IAAI6B,OAAOC,IAAI,CAACkH,qBAAqBjH,MAAM,GAAG,GAAG;gBAC/C4H,UAAUhF,OAAO,CAAC,CAACnD;oBACjB,IAAIA,IAAI2D,MAAM,IAAI6D,qBAAqB;wBACrCxH,IAAI2D,MAAM,GAAG6D,mBAAmB,CAACxH,IAAI2D,MAAM,CAAC;oBAC9C;gBACF;YACF;YAEA,IAAIwE,UAAU5H,MAAM,EAAE;gBACpB,MAAM9B,QAAQgE,MAAM,CAAC;oBACnB7D;oBACAW,WAAW0E;oBACXtB,QAAQwF;gBACV;YACF;QACF;IACF,EAAE,OAAOnG,OAAO;QACd5D,kBAAkB;YAAEI;YAAIC;YAASC;YAAgBsD;YAAOlD;YAAYO;YAAKE;QAAU;IACrF;IAEA,IAAIR,iBAAiB,UAAU;QAC7B,OAAO;YAAEP,IAAIqB,YAAYrB,EAAE;QAAC;IAC9B;IAEA,IAAIO,cAAc;QAChB,OAAOJ;IACT;IAEA,qCAAqC;IACrC,6BAA6B;IAC7B,qCAAqC;IAErC,MAAMoC,eAAejD,kBAAkB;QACrCW;QACAuC,OAAO;QACPnC;QACAI,WAAW;QACXK;QACAC;IACF;IAEAwB,aAAatB,KAAK,GAAG9B,GAAGc,QAAQ2B,MAAM,CAACb,UAAU,CAACf,EAAE,EAAEqB,YAAYrB,EAAE;IAEpE,MAAM4C,MAAM,MAAMxC,GAAGyC,KAAK,CAAC9B,UAAU,CAAC+B,SAAS,CAACP;IAEhD,qCAAqC;IACrC,iBAAiB;IACjB,qCAAqC;IAErC,MAAMsH,SAAStK,UAAa;QAC1BU;QACA8C,QAAQ9C,QAAQ+C,OAAO,CAACD,MAAM;QAC9B5C,MAAMyC;QACNvC;QACAI,WAAW;QACXM;IACF;IAEA,OAAO8I;AACT,EAAC"}
@@ -2,7 +2,7 @@ import { extendDrizzleTable } from './extendDrizzleTable.js';
2
2
  export const executeSchemaHooks = async ({ type, adapter })=>{
3
3
  for (const hook of adapter[type]){
4
4
  const result = await hook({
5
- adapter: adapter,
5
+ adapter,
6
6
  extendTable: extendDrizzleTable,
7
7
  schema: {
8
8
  enums: adapter.enums,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/executeSchemaHooks.ts"],"sourcesContent":["import type { DrizzleAdapter } from '../types.js'\n\nimport { extendDrizzleTable } from './extendDrizzleTable.js'\n\ntype DatabaseSchema = {\n enums?: DrizzleAdapter['enums']\n relations: Record<string, any>\n tables: DrizzleAdapter['tables']\n}\n\ntype Adapter = {\n afterSchemaInit: DatabaseSchemaHook[]\n beforeSchemaInit: DatabaseSchemaHook[]\n} & DatabaseSchema\n\ntype DatabaseSchemaHookArgs = {\n adapter: Record<string, unknown>\n extendTable: typeof extendDrizzleTable\n schema: DatabaseSchema\n}\n\ntype DatabaseSchemaHook = (args: DatabaseSchemaHookArgs) => DatabaseSchema | Promise<DatabaseSchema>\n\ntype Args = {\n adapter: Adapter\n type: 'afterSchemaInit' | 'beforeSchemaInit'\n}\n\nexport const executeSchemaHooks = async ({ type, adapter }: Args): Promise<void> => {\n for (const hook of (adapter as unknown as Adapter)[type]) {\n const result = await hook({\n adapter: adapter as unknown as Adapter,\n extendTable: extendDrizzleTable,\n schema: {\n enums: adapter.enums,\n relations: adapter.relations,\n tables: adapter.tables,\n },\n })\n if (result.enums) {\n adapter.enums = result.enums\n }\n\n adapter.tables = result.tables\n adapter.relations = result.relations\n }\n}\n"],"names":["extendDrizzleTable","executeSchemaHooks","type","adapter","hook","result","extendTable","schema","enums","relations","tables"],"mappings":"AAEA,SAASA,kBAAkB,QAAQ,0BAAyB;AA0B5D,OAAO,MAAMC,qBAAqB,OAAO,EAAEC,IAAI,EAAEC,OAAO,EAAQ;IAC9D,KAAK,MAAMC,QAAQ,AAACD,OAA8B,CAACD,KAAK,CAAE;QACxD,MAAMG,SAAS,MAAMD,KAAK;YACxBD,SAASA;YACTG,aAAaN;YACbO,QAAQ;gBACNC,OAAOL,QAAQK,KAAK;gBACpBC,WAAWN,QAAQM,SAAS;gBAC5BC,QAAQP,QAAQO,MAAM;YACxB;QACF;QACA,IAAIL,OAAOG,KAAK,EAAE;YAChBL,QAAQK,KAAK,GAAGH,OAAOG,KAAK;QAC9B;QAEAL,QAAQO,MAAM,GAAGL,OAAOK,MAAM;QAC9BP,QAAQM,SAAS,GAAGJ,OAAOI,SAAS;IACtC;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/executeSchemaHooks.ts"],"sourcesContent":["import type { DrizzleAdapter } from '../types.js'\n\nimport { extendDrizzleTable } from './extendDrizzleTable.js'\n\ntype DatabaseSchema = {\n enums?: DrizzleAdapter['enums']\n relations: Record<string, any>\n tables: DrizzleAdapter['tables']\n}\n\ntype Adapter = {\n afterSchemaInit: DatabaseSchemaHook[]\n beforeSchemaInit: DatabaseSchemaHook[]\n} & DatabaseSchema\n\ntype DatabaseSchemaHookArgs = {\n adapter: Record<string, unknown>\n extendTable: typeof extendDrizzleTable\n schema: DatabaseSchema\n}\n\ntype DatabaseSchemaHook = (args: DatabaseSchemaHookArgs) => DatabaseSchema | Promise<DatabaseSchema>\n\ntype Args = {\n adapter: Adapter\n type: 'afterSchemaInit' | 'beforeSchemaInit'\n}\n\nexport const executeSchemaHooks = async ({ type, adapter }: Args): Promise<void> => {\n for (const hook of adapter[type]) {\n const result = await hook({\n adapter,\n extendTable: extendDrizzleTable,\n schema: {\n enums: adapter.enums,\n relations: adapter.relations,\n tables: adapter.tables,\n },\n })\n if (result.enums) {\n adapter.enums = result.enums\n }\n\n adapter.tables = result.tables\n adapter.relations = result.relations\n }\n}\n"],"names":["extendDrizzleTable","executeSchemaHooks","type","adapter","hook","result","extendTable","schema","enums","relations","tables"],"mappings":"AAEA,SAASA,kBAAkB,QAAQ,0BAAyB;AA0B5D,OAAO,MAAMC,qBAAqB,OAAO,EAAEC,IAAI,EAAEC,OAAO,EAAQ;IAC9D,KAAK,MAAMC,QAAQD,OAAO,CAACD,KAAK,CAAE;QAChC,MAAMG,SAAS,MAAMD,KAAK;YACxBD;YACAG,aAAaN;YACbO,QAAQ;gBACNC,OAAOL,QAAQK,KAAK;gBACpBC,WAAWN,QAAQM,SAAS;gBAC5BC,QAAQP,QAAQO,MAAM;YACxB;QACF;QACA,IAAIL,OAAOG,KAAK,EAAE;YAChBL,QAAQK,KAAK,GAAGH,OAAOG,KAAK;QAC9B;QAEAL,QAAQO,MAAM,GAAGL,OAAOK,MAAM;QAC9BP,QAAQM,SAAS,GAAGJ,OAAOI,SAAS;IACtC;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/getTransaction.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport type { DrizzleAdapter } from '../types.js'\n\nimport { shouldReadFromPrimary } from './readAfterWrite.js'\n\n/**\n * Returns current db transaction instance from req or adapter.drizzle itself\n *\n * If a transaction session doesn't exist (e.g., it was already committed/rolled back),\n * falls back to the default adapter.drizzle instance to prevent errors.\n *\n * When read replicas are configured and a write happened recently, returns the\n * unwrapped primary to avoid replication-lag stale reads.\n */\nexport const getTransaction = async <T extends DrizzleAdapter = DrizzleAdapter>(\n adapter: T,\n req?: Partial<PayloadRequest>,\n): Promise<T['drizzle']> => {\n if (!req?.transactionID) {\n if (shouldReadFromPrimary(adapter)) {\n return adapter.primaryDrizzle as T['drizzle']\n }\n return adapter.drizzle\n }\n\n return (adapter.sessions[await req.transactionID]?.db as T['drizzle']) || adapter.drizzle\n}\n"],"names":["shouldReadFromPrimary","getTransaction","adapter","req","transactionID","primaryDrizzle","drizzle","sessions","db"],"mappings":"AAIA,SAASA,qBAAqB,QAAQ,sBAAqB;AAE3D;;;;;;;;CAQC,GACD,OAAO,MAAMC,iBAAiB,OAC5BC,SACAC;IAEA,IAAI,CAACA,KAAKC,eAAe;QACvB,IAAIJ,sBAAsBE,UAAU;YAClC,OAAOA,QAAQG,cAAc;QAC/B;QACA,OAAOH,QAAQI,OAAO;IACxB;IAEA,OAAO,AAACJ,QAAQK,QAAQ,CAAC,MAAMJ,IAAIC,aAAa,CAAC,EAAEI,MAAuBN,QAAQI,OAAO;AAC3F,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/getTransaction.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport type { DrizzleAdapter } from '../types.js'\n\nimport { shouldReadFromPrimary } from './readAfterWrite.js'\n\n/**\n * Returns current db transaction instance from req or adapter.drizzle itself\n *\n * If a transaction session doesn't exist (e.g., it was already committed/rolled back),\n * falls back to the default adapter.drizzle instance to prevent errors.\n *\n * When read replicas are configured and a write happened recently, returns the\n * unwrapped primary to avoid replication-lag stale reads.\n */\nexport const getTransaction = async <T extends DrizzleAdapter = DrizzleAdapter>(\n adapter: T,\n req?: Partial<PayloadRequest>,\n): Promise<T['drizzle']> => {\n if (!req?.transactionID) {\n if (shouldReadFromPrimary(adapter)) {\n return adapter.primaryDrizzle\n }\n return adapter.drizzle\n }\n\n return (adapter.sessions[await req.transactionID]?.db as T['drizzle']) || adapter.drizzle\n}\n"],"names":["shouldReadFromPrimary","getTransaction","adapter","req","transactionID","primaryDrizzle","drizzle","sessions","db"],"mappings":"AAIA,SAASA,qBAAqB,QAAQ,sBAAqB;AAE3D;;;;;;;;CAQC,GACD,OAAO,MAAMC,iBAAiB,OAC5BC,SACAC;IAEA,IAAI,CAACA,KAAKC,eAAe;QACvB,IAAIJ,sBAAsBE,UAAU;YAClC,OAAOA,QAAQG,cAAc;QAC/B;QACA,OAAOH,QAAQI,OAAO;IACxB;IAEA,OAAO,AAACJ,QAAQK,QAAQ,CAAC,MAAMJ,IAAIC,aAAa,CAAC,EAAEI,MAAuBN,QAAQI,OAAO;AAC3F,EAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@payloadcms/drizzle",
3
- "version": "4.0.0-beta.3",
3
+ "version": "4.0.0-beta.4",
4
4
  "description": "A library of shared functions used by different payload database adapters",
5
5
  "homepage": "https://payloadcms.com",
6
6
  "license": "MIT",
@@ -54,19 +54,16 @@
54
54
  "@libsql/client": "0.14.0",
55
55
  "@types/pg": "8.20.0",
56
56
  "@types/to-snake-case": "1.0.0",
57
- "@payloadcms/eslint-config": "3.28.0",
58
- "payload": "4.0.0-beta.3"
57
+ "payload": "4.0.0-beta.4"
59
58
  },
60
59
  "peerDependencies": {
61
- "payload": "4.0.0-beta.3"
60
+ "payload": "4.0.0-beta.4"
62
61
  },
63
62
  "scripts": {
64
63
  "build": "pnpm build:swc && pnpm build:types",
65
64
  "build:debug": "pnpm build",
66
65
  "build:swc": "swc ./src -d ./dist --config-file .swcrc --strip-leading-paths",
67
66
  "build:types": "tsc --emitDeclarationOnly --outDir dist",
68
- "clean": "rimraf -g {dist,*.tsbuildinfo}",
69
- "lint": "eslint .",
70
- "lint:fix": "eslint . --fix"
67
+ "clean": "rimraf -g {dist,*.tsbuildinfo}"
71
68
  }
72
69
  }