@payloadcms/drizzle 3.0.0-canary.96477cf → 3.0.0-canary.98e0119

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.
Files changed (188) hide show
  1. package/dist/countGlobalVersions.d.ts +3 -0
  2. package/dist/countGlobalVersions.d.ts.map +1 -0
  3. package/dist/countGlobalVersions.js +27 -0
  4. package/dist/countGlobalVersions.js.map +1 -0
  5. package/dist/countVersions.d.ts +3 -0
  6. package/dist/countVersions.d.ts.map +1 -0
  7. package/dist/countVersions.js +27 -0
  8. package/dist/countVersions.js.map +1 -0
  9. package/dist/create.d.ts.map +1 -1
  10. package/dist/create.js +2 -1
  11. package/dist/create.js.map +1 -1
  12. package/dist/createGlobalVersion.d.ts +1 -1
  13. package/dist/createGlobalVersion.d.ts.map +1 -1
  14. package/dist/createGlobalVersion.js +4 -1
  15. package/dist/createGlobalVersion.js.map +1 -1
  16. package/dist/createVersion.d.ts +1 -1
  17. package/dist/createVersion.d.ts.map +1 -1
  18. package/dist/createVersion.js +4 -4
  19. package/dist/createVersion.js.map +1 -1
  20. package/dist/deleteOne.d.ts.map +1 -1
  21. package/dist/deleteOne.js +2 -1
  22. package/dist/deleteOne.js.map +1 -1
  23. package/dist/exports/postgres.d.ts +2 -1
  24. package/dist/exports/postgres.d.ts.map +1 -1
  25. package/dist/exports/postgres.js +2 -1
  26. package/dist/exports/postgres.js.map +1 -1
  27. package/dist/find/buildFindManyArgs.d.ts +4 -2
  28. package/dist/find/buildFindManyArgs.d.ts.map +1 -1
  29. package/dist/find/buildFindManyArgs.js +40 -21
  30. package/dist/find/buildFindManyArgs.js.map +1 -1
  31. package/dist/find/findMany.d.ts +2 -1
  32. package/dist/find/findMany.d.ts.map +1 -1
  33. package/dist/find/findMany.js +7 -5
  34. package/dist/find/findMany.js.map +1 -1
  35. package/dist/find/traverseFields.d.ts +13 -3
  36. package/dist/find/traverseFields.d.ts.map +1 -1
  37. package/dist/find/traverseFields.js +320 -105
  38. package/dist/find/traverseFields.js.map +1 -1
  39. package/dist/find.d.ts.map +1 -1
  40. package/dist/find.js +3 -2
  41. package/dist/find.js.map +1 -1
  42. package/dist/findGlobal.d.ts.map +1 -1
  43. package/dist/findGlobal.js +2 -1
  44. package/dist/findGlobal.js.map +1 -1
  45. package/dist/findGlobalVersions.d.ts.map +1 -1
  46. package/dist/findGlobalVersions.js +3 -2
  47. package/dist/findGlobalVersions.js.map +1 -1
  48. package/dist/findOne.d.ts +1 -1
  49. package/dist/findOne.d.ts.map +1 -1
  50. package/dist/findOne.js +2 -1
  51. package/dist/findOne.js.map +1 -1
  52. package/dist/findVersions.d.ts.map +1 -1
  53. package/dist/findVersions.js +3 -2
  54. package/dist/findVersions.js.map +1 -1
  55. package/dist/index.d.ts +3 -0
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +3 -0
  58. package/dist/index.js.map +1 -1
  59. package/dist/migrate.d.ts.map +1 -1
  60. package/dist/migrate.js +3 -0
  61. package/dist/migrate.js.map +1 -1
  62. package/dist/migrateFresh.d.ts.map +1 -1
  63. package/dist/migrateFresh.js +3 -0
  64. package/dist/migrateFresh.js.map +1 -1
  65. package/dist/migrateReset.js +1 -1
  66. package/dist/migrateReset.js.map +1 -1
  67. package/dist/postgres/countDistinct.d.ts.map +1 -1
  68. package/dist/postgres/countDistinct.js +2 -3
  69. package/dist/postgres/countDistinct.js.map +1 -1
  70. package/dist/postgres/createDatabase.d.ts +14 -0
  71. package/dist/postgres/createDatabase.d.ts.map +1 -0
  72. package/dist/postgres/createDatabase.js +76 -0
  73. package/dist/postgres/createDatabase.js.map +1 -0
  74. package/dist/postgres/createExtensions.d.ts +3 -0
  75. package/dist/postgres/createExtensions.d.ts.map +1 -0
  76. package/dist/postgres/createExtensions.js +16 -0
  77. package/dist/postgres/createExtensions.js.map +1 -0
  78. package/dist/postgres/createJSONQuery/index.d.ts +2 -9
  79. package/dist/postgres/createJSONQuery/index.d.ts.map +1 -1
  80. package/dist/postgres/createJSONQuery/index.js +34 -46
  81. package/dist/postgres/createJSONQuery/index.js.map +1 -1
  82. package/dist/postgres/createMigration.d.ts.map +1 -1
  83. package/dist/postgres/createMigration.js +1 -5
  84. package/dist/postgres/createMigration.js.map +1 -1
  85. package/dist/postgres/defaultSnapshot.d.ts.map +1 -1
  86. package/dist/postgres/defaultSnapshot.js +4 -1
  87. package/dist/postgres/defaultSnapshot.js.map +1 -1
  88. package/dist/postgres/schema/build.d.ts +3 -1
  89. package/dist/postgres/schema/build.d.ts.map +1 -1
  90. package/dist/postgres/schema/build.js +29 -3
  91. package/dist/postgres/schema/build.js.map +1 -1
  92. package/dist/postgres/schema/createIndex.d.ts +2 -3
  93. package/dist/postgres/schema/createIndex.d.ts.map +1 -1
  94. package/dist/postgres/schema/createIndex.js +3 -3
  95. package/dist/postgres/schema/createIndex.js.map +1 -1
  96. package/dist/postgres/schema/geometryColumn.d.ts +12 -0
  97. package/dist/postgres/schema/geometryColumn.d.ts.map +1 -0
  98. package/dist/postgres/schema/geometryColumn.js +18 -0
  99. package/dist/postgres/schema/geometryColumn.js.map +1 -0
  100. package/dist/postgres/schema/traverseFields.d.ts +3 -1
  101. package/dist/postgres/schema/traverseFields.d.ts.map +1 -1
  102. package/dist/postgres/schema/traverseFields.js +272 -262
  103. package/dist/postgres/schema/traverseFields.js.map +1 -1
  104. package/dist/postgres/schema/withDefault.d.ts.map +1 -1
  105. package/dist/postgres/schema/withDefault.js +3 -0
  106. package/dist/postgres/schema/withDefault.js.map +1 -1
  107. package/dist/postgres/types.d.ts +19 -3
  108. package/dist/postgres/types.d.ts.map +1 -1
  109. package/dist/postgres/types.js.map +1 -1
  110. package/dist/queries/addJoinTable.d.ts +11 -0
  111. package/dist/queries/addJoinTable.d.ts.map +1 -0
  112. package/dist/queries/addJoinTable.js +13 -0
  113. package/dist/queries/addJoinTable.js.map +1 -0
  114. package/dist/queries/buildOrderBy.d.ts +2 -2
  115. package/dist/queries/buildOrderBy.d.ts.map +1 -1
  116. package/dist/queries/buildOrderBy.js +32 -28
  117. package/dist/queries/buildOrderBy.js.map +1 -1
  118. package/dist/queries/buildQuery.d.ts +4 -3
  119. package/dist/queries/buildQuery.d.ts.map +1 -1
  120. package/dist/queries/buildQuery.js.map +1 -1
  121. package/dist/queries/getTableColumnFromPath.d.ts +1 -2
  122. package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
  123. package/dist/queries/getTableColumnFromPath.js +218 -221
  124. package/dist/queries/getTableColumnFromPath.js.map +1 -1
  125. package/dist/queries/operatorMap.d.ts.map +1 -1
  126. package/dist/queries/operatorMap.js +0 -4
  127. package/dist/queries/operatorMap.js.map +1 -1
  128. package/dist/queries/parseParams.d.ts.map +1 -1
  129. package/dist/queries/parseParams.js +38 -5
  130. package/dist/queries/parseParams.js.map +1 -1
  131. package/dist/queries/sanitizeQueryValue.d.ts.map +1 -1
  132. package/dist/queries/sanitizeQueryValue.js +12 -4
  133. package/dist/queries/sanitizeQueryValue.js.map +1 -1
  134. package/dist/queryDrafts.d.ts.map +1 -1
  135. package/dist/queryDrafts.js +5 -4
  136. package/dist/queryDrafts.js.map +1 -1
  137. package/dist/transform/read/traverseFields.d.ts.map +1 -1
  138. package/dist/transform/read/traverseFields.js +24 -18
  139. package/dist/transform/read/traverseFields.js.map +1 -1
  140. package/dist/transform/write/traverseFields.d.ts.map +1 -1
  141. package/dist/transform/write/traverseFields.js +16 -2
  142. package/dist/transform/write/traverseFields.js.map +1 -1
  143. package/dist/types.d.ts +5 -3
  144. package/dist/types.d.ts.map +1 -1
  145. package/dist/types.js.map +1 -1
  146. package/dist/update.d.ts.map +1 -1
  147. package/dist/update.js +2 -1
  148. package/dist/update.js.map +1 -1
  149. package/dist/updateGlobal.d.ts +1 -1
  150. package/dist/updateGlobal.d.ts.map +1 -1
  151. package/dist/updateGlobal.js +2 -1
  152. package/dist/updateGlobal.js.map +1 -1
  153. package/dist/updateGlobalVersion.d.ts +1 -1
  154. package/dist/updateGlobalVersion.d.ts.map +1 -1
  155. package/dist/updateGlobalVersion.js +2 -1
  156. package/dist/updateGlobalVersion.js.map +1 -1
  157. package/dist/updateVersion.d.ts +1 -1
  158. package/dist/updateVersion.d.ts.map +1 -1
  159. package/dist/updateVersion.js +2 -1
  160. package/dist/updateVersion.js.map +1 -1
  161. package/dist/upsertRow/index.d.ts +1 -1
  162. package/dist/upsertRow/index.d.ts.map +1 -1
  163. package/dist/upsertRow/index.js +4 -3
  164. package/dist/upsertRow/index.js.map +1 -1
  165. package/dist/upsertRow/types.d.ts +3 -1
  166. package/dist/upsertRow/types.d.ts.map +1 -1
  167. package/dist/upsertRow/types.js.map +1 -1
  168. package/dist/utilities/buildIndexName.d.ts +7 -0
  169. package/dist/utilities/buildIndexName.d.ts.map +1 -0
  170. package/dist/utilities/buildIndexName.js +14 -0
  171. package/dist/utilities/buildIndexName.js.map +1 -0
  172. package/dist/utilities/getNameFromDrizzleTable.d.ts +3 -0
  173. package/dist/utilities/getNameFromDrizzleTable.d.ts.map +1 -0
  174. package/dist/utilities/getNameFromDrizzleTable.js +6 -0
  175. package/dist/utilities/getNameFromDrizzleTable.js.map +1 -0
  176. package/dist/utilities/pushDevSchema.d.ts.map +1 -1
  177. package/dist/utilities/pushDevSchema.js +5 -0
  178. package/dist/utilities/pushDevSchema.js.map +1 -1
  179. package/license.md +22 -0
  180. package/package.json +14 -7
  181. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.d.ts +0 -2
  182. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.d.ts.map +0 -1
  183. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.js +0 -16
  184. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.js.map +0 -1
  185. package/dist/postgres/createJSONQuery/formatJSONPathSegment.d.ts +0 -2
  186. package/dist/postgres/createJSONQuery/formatJSONPathSegment.d.ts.map +0 -1
  187. package/dist/postgres/createJSONQuery/formatJSONPathSegment.js +0 -5
  188. package/dist/postgres/createJSONQuery/formatJSONPathSegment.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/find/findMany.ts"],"sourcesContent":["import type { Field, FindArgs, PayloadRequest, TypeWithID } from 'payload'\n\nimport { inArray } from 'drizzle-orm'\n\nimport type { DrizzleAdapter } from '../types.js'\nimport type { ChainedMethods } from './chainMethods.js'\n\nimport buildQuery from '../queries/buildQuery.js'\nimport { selectDistinct } from '../queries/selectDistinct.js'\nimport { transform } from '../transform/read/index.js'\nimport { buildFindManyArgs } from './buildFindManyArgs.js'\n\ntype Args = {\n adapter: DrizzleAdapter\n fields: Field[]\n tableName: string\n} & Omit<FindArgs, 'collection'>\n\nexport const findMany = async function find({\n adapter,\n fields,\n joins: joinQuery,\n limit: limitArg,\n locale,\n page = 1,\n pagination,\n req = {} as PayloadRequest,\n skip,\n sort,\n tableName,\n where: whereArg,\n}: Args) {\n const db = adapter.sessions[await req.transactionID]?.db || adapter.drizzle\n let limit = limitArg\n let totalDocs: number\n let totalPages: number\n let hasPrevPage: boolean\n let hasNextPage: boolean\n let pagingCounter: number\n const offset = skip || (page - 1) * limit\n\n if (limit === 0) {\n limit = undefined\n }\n\n const { joins, orderBy, selectFields, where } = buildQuery({\n adapter,\n fields,\n locale,\n sort,\n tableName,\n where: whereArg,\n })\n\n const orderedIDMap: Record<number | string, number> = {}\n let orderedIDs: (number | string)[]\n\n const selectDistinctMethods: ChainedMethods = []\n\n if (orderBy?.order && orderBy?.column) {\n selectDistinctMethods.push({\n args: [orderBy.order(orderBy.column)],\n method: 'orderBy',\n })\n }\n\n const findManyArgs = buildFindManyArgs({\n adapter,\n depth: 0,\n fields,\n joinQuery,\n joins,\n tableName,\n })\n\n selectDistinctMethods.push({ args: [offset], method: 'offset' })\n selectDistinctMethods.push({ args: [limit], method: 'limit' })\n\n const selectDistinctResult = await selectDistinct({\n adapter,\n chainedMethods: selectDistinctMethods,\n db,\n joins,\n selectFields,\n tableName,\n where,\n })\n\n if (selectDistinctResult) {\n if (selectDistinctResult.length === 0) {\n return {\n docs: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit,\n nextPage: null,\n page: 1,\n pagingCounter: 0,\n prevPage: null,\n totalDocs: 0,\n totalPages: 0,\n }\n } else {\n // set the id in an object for sorting later\n selectDistinctResult.forEach(({ id }, i) => {\n orderedIDMap[id] = i\n })\n orderedIDs = Object.keys(orderedIDMap)\n findManyArgs.where = inArray(adapter.tables[tableName].id, orderedIDs)\n }\n } else {\n findManyArgs.limit = limit\n findManyArgs.offset = offset\n findManyArgs.orderBy = orderBy.order(orderBy.column)\n\n if (where) {\n findManyArgs.where = where\n }\n }\n\n const findPromise = db.query[tableName].findMany(findManyArgs)\n\n if (pagination !== false && (orderedIDs ? orderedIDs?.length <= limit : true)) {\n totalDocs = await adapter.countDistinct({\n db,\n joins,\n tableName,\n where,\n })\n\n totalPages = typeof limit === 'number' && limit !== 0 ? Math.ceil(totalDocs / limit) : 1\n hasPrevPage = page > 1\n hasNextPage = totalPages > page\n pagingCounter = (page - 1) * limit + 1\n }\n\n const rawDocs = await findPromise\n // sort rawDocs from selectQuery\n if (Object.keys(orderedIDMap).length > 0) {\n rawDocs.sort((a, b) => orderedIDMap[a.id] - orderedIDMap[b.id])\n }\n\n if (pagination === false || !totalDocs) {\n totalDocs = rawDocs.length\n totalPages = 1\n pagingCounter = 1\n hasPrevPage = false\n hasNextPage = false\n }\n\n const docs = rawDocs.map((data: TypeWithID) => {\n return transform({\n adapter,\n config: adapter.payload.config,\n data,\n fields,\n joinQuery,\n })\n })\n\n return {\n docs,\n hasNextPage,\n hasPrevPage,\n limit: limitArg,\n nextPage: hasNextPage ? page + 1 : null,\n page,\n pagingCounter,\n prevPage: hasPrevPage ? page - 1 : null,\n totalDocs,\n totalPages,\n }\n}\n"],"names":["inArray","buildQuery","selectDistinct","transform","buildFindManyArgs","findMany","find","adapter","fields","joins","joinQuery","limit","limitArg","locale","page","pagination","req","skip","sort","tableName","where","whereArg","db","sessions","transactionID","drizzle","totalDocs","totalPages","hasPrevPage","hasNextPage","pagingCounter","offset","undefined","orderBy","selectFields","orderedIDMap","orderedIDs","selectDistinctMethods","order","column","push","args","method","findManyArgs","depth","selectDistinctResult","chainedMethods","length","docs","nextPage","prevPage","forEach","id","i","Object","keys","tables","findPromise","query","countDistinct","Math","ceil","rawDocs","a","b","map","data","config","payload"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/find/findMany.ts"],"sourcesContent":["import type { Field, FindArgs, PayloadRequest, TypeWithID } from 'payload'\n\nimport { inArray } from 'drizzle-orm'\n\nimport type { DrizzleAdapter } from '../types.js'\nimport type { ChainedMethods } from './chainMethods.js'\n\nimport buildQuery from '../queries/buildQuery.js'\nimport { selectDistinct } from '../queries/selectDistinct.js'\nimport { transform } from '../transform/read/index.js'\nimport { buildFindManyArgs } from './buildFindManyArgs.js'\n\ntype Args = {\n adapter: DrizzleAdapter\n fields: Field[]\n tableName: string\n versions?: boolean\n} & Omit<FindArgs, 'collection'>\n\nexport const findMany = async function find({\n adapter,\n fields,\n joins: joinQuery,\n limit: limitArg,\n locale,\n page = 1,\n pagination,\n req = {} as PayloadRequest,\n select,\n skip,\n sort,\n tableName,\n versions,\n where: whereArg,\n}: Args) {\n const db = adapter.sessions[await req.transactionID]?.db || adapter.drizzle\n let limit = limitArg\n let totalDocs: number\n let totalPages: number\n let hasPrevPage: boolean\n let hasNextPage: boolean\n let pagingCounter: number\n const offset = skip || (page - 1) * limit\n\n if (limit === 0) {\n limit = undefined\n }\n\n const { joins, orderBy, selectFields, where } = buildQuery({\n adapter,\n fields,\n locale,\n sort,\n tableName,\n where: whereArg,\n })\n\n const orderedIDMap: Record<number | string, number> = {}\n let orderedIDs: (number | string)[]\n\n const selectDistinctMethods: ChainedMethods = []\n\n if (orderBy) {\n selectDistinctMethods.push({\n args: [() => orderBy.map(({ column, order }) => order(column))],\n method: 'orderBy',\n })\n }\n\n const findManyArgs = buildFindManyArgs({\n adapter,\n depth: 0,\n fields,\n joinQuery,\n joins,\n select,\n tableName,\n versions,\n })\n\n selectDistinctMethods.push({ args: [offset], method: 'offset' })\n selectDistinctMethods.push({ args: [limit], method: 'limit' })\n\n const selectDistinctResult = await selectDistinct({\n adapter,\n chainedMethods: selectDistinctMethods,\n db,\n joins,\n selectFields,\n tableName,\n where,\n })\n\n if (selectDistinctResult) {\n if (selectDistinctResult.length === 0) {\n return {\n docs: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit,\n nextPage: null,\n page: 1,\n pagingCounter: 0,\n prevPage: null,\n totalDocs: 0,\n totalPages: 0,\n }\n } else {\n // set the id in an object for sorting later\n selectDistinctResult.forEach(({ id }, i) => {\n orderedIDMap[id] = i\n })\n orderedIDs = Object.keys(orderedIDMap)\n findManyArgs.where = inArray(adapter.tables[tableName].id, orderedIDs)\n }\n } else {\n findManyArgs.limit = limit\n findManyArgs.offset = offset\n findManyArgs.orderBy = () => orderBy.map(({ column, order }) => order(column))\n\n if (where) {\n findManyArgs.where = where\n }\n }\n\n const findPromise = db.query[tableName].findMany(findManyArgs)\n\n if (pagination !== false && (orderedIDs ? orderedIDs?.length <= limit : true)) {\n totalDocs = await adapter.countDistinct({\n db,\n joins,\n tableName,\n where,\n })\n\n totalPages = typeof limit === 'number' && limit !== 0 ? Math.ceil(totalDocs / limit) : 1\n hasPrevPage = page > 1\n hasNextPage = totalPages > page\n pagingCounter = (page - 1) * limit + 1\n }\n\n const rawDocs = await findPromise\n // sort rawDocs from selectQuery\n if (Object.keys(orderedIDMap).length > 0) {\n rawDocs.sort((a, b) => orderedIDMap[a.id] - orderedIDMap[b.id])\n }\n\n if (pagination === false || !totalDocs) {\n totalDocs = rawDocs.length\n totalPages = 1\n pagingCounter = 1\n hasPrevPage = false\n hasNextPage = false\n }\n\n const docs = rawDocs.map((data: TypeWithID) => {\n return transform({\n adapter,\n config: adapter.payload.config,\n data,\n fields,\n joinQuery,\n })\n })\n\n return {\n docs,\n hasNextPage,\n hasPrevPage,\n limit: limitArg,\n nextPage: hasNextPage ? page + 1 : null,\n page,\n pagingCounter,\n prevPage: hasPrevPage ? page - 1 : null,\n totalDocs,\n totalPages,\n }\n}\n"],"names":["inArray","buildQuery","selectDistinct","transform","buildFindManyArgs","findMany","find","adapter","fields","joins","joinQuery","limit","limitArg","locale","page","pagination","req","select","skip","sort","tableName","versions","where","whereArg","db","sessions","transactionID","drizzle","totalDocs","totalPages","hasPrevPage","hasNextPage","pagingCounter","offset","undefined","orderBy","selectFields","orderedIDMap","orderedIDs","selectDistinctMethods","push","args","map","column","order","method","findManyArgs","depth","selectDistinctResult","chainedMethods","length","docs","nextPage","prevPage","forEach","id","i","Object","keys","tables","findPromise","query","countDistinct","Math","ceil","rawDocs","a","b","data","config","payload"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { Field, JoinQuery } from 'payload';
1
+ import type { Field, JoinQuery, SelectMode, SelectType, TabAsField } from 'payload';
2
2
  import type { BuildQueryJoinAliases, DrizzleAdapter } from '../types.js';
3
3
  import type { Result } from './buildFindManyArgs.js';
4
4
  type TraverseFieldArgs = {
@@ -7,15 +7,25 @@ type TraverseFieldArgs = {
7
7
  currentArgs: Result;
8
8
  currentTableName: string;
9
9
  depth?: number;
10
- fields: Field[];
10
+ fields: (Field | TabAsField)[];
11
11
  joinQuery: JoinQuery;
12
12
  joins?: BuildQueryJoinAliases;
13
13
  locale?: string;
14
14
  path: string;
15
+ select?: SelectType;
16
+ selectAllOnCurrentLevel?: boolean;
17
+ selectMode?: SelectMode;
15
18
  tablePath: string;
16
19
  topLevelArgs: Record<string, unknown>;
17
20
  topLevelTableName: string;
21
+ versions?: boolean;
22
+ withinLocalizedField?: boolean;
23
+ withTabledFields: {
24
+ numbers?: boolean;
25
+ rels?: boolean;
26
+ texts?: boolean;
27
+ };
18
28
  };
19
- export declare const traverseFields: ({ _locales, adapter, currentArgs, currentTableName, depth, fields, joinQuery, joins, locale, path, tablePath, topLevelArgs, topLevelTableName, }: TraverseFieldArgs) => Record<string, unknown>;
29
+ export declare const traverseFields: ({ _locales, adapter, currentArgs, currentTableName, depth, fields, joinQuery, joins, locale, path, select, selectAllOnCurrentLevel, selectMode, tablePath, topLevelArgs, topLevelTableName, versions, withinLocalizedField, withTabledFields, }: TraverseFieldArgs) => Record<string, unknown>;
20
30
  export {};
21
31
  //# sourceMappingURL=traverseFields.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/find/traverseFields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAK/C,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAKpD,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,cAAc,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,SAAS,EAAE,SAAS,CAAA;IACpB,KAAK,CAAC,EAAE,qBAAqB,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrC,iBAAiB,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,eAAO,MAAM,cAAc,qJAcxB,iBAAiB,4BA+PnB,CAAA"}
1
+ {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/find/traverseFields.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAOnF,OAAO,KAAK,EAAE,qBAAqB,EAAkB,cAAc,EAAE,MAAM,aAAa,CAAA;AACxF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AAKpD,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,cAAc,CAAA;IACvB,WAAW,EAAE,MAAM,CAAA;IACnB,gBAAgB,EAAE,MAAM,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;IAC9B,SAAS,EAAE,SAAS,CAAA;IACpB,KAAK,CAAC,EAAE,qBAAqB,CAAA;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,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,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,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,oPAoBxB,iBAAiB,4BA6lBnB,CAAA"}
@@ -1,8 +1,9 @@
1
+ import { and, eq, sql } from 'drizzle-orm';
1
2
  import { fieldAffectsData, fieldIsVirtual, tabHasName } from 'payload/shared';
2
3
  import toSnakeCase from 'to-snake-case';
3
- import { buildOrderBy } from '../queries/buildOrderBy.js';
4
4
  import buildQuery from '../queries/buildQuery.js';
5
- export const traverseFields = ({ _locales, adapter, currentArgs, currentTableName, depth, fields, joinQuery = {}, joins, locale, path, tablePath, topLevelArgs, topLevelTableName })=>{
5
+ import { chainMethods } from './chainMethods.js';
6
+ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableName, depth, fields, joinQuery = {}, joins, locale, path, select, selectAllOnCurrentLevel = false, selectMode, tablePath, topLevelArgs, topLevelTableName, versions, withinLocalizedField = false, withTabledFields })=>{
6
7
  fields.forEach((field)=>{
7
8
  if (fieldIsVirtual(field)) {
8
9
  return;
@@ -15,7 +16,7 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
15
16
  currentArgs.with[`${path}${field.name}`] = true;
16
17
  }
17
18
  }
18
- if (field.type === 'collapsible' || field.type === 'row') {
19
+ if (field.type === 'collapsible' || field.type === 'row' || field.type === 'tab' && !tabHasName(field)) {
19
20
  traverseFields({
20
21
  _locales,
21
22
  adapter,
@@ -26,30 +27,37 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
26
27
  joinQuery,
27
28
  joins,
28
29
  path,
30
+ select,
31
+ selectMode,
29
32
  tablePath,
30
33
  topLevelArgs,
31
- topLevelTableName
34
+ topLevelTableName,
35
+ withTabledFields
32
36
  });
33
37
  return;
34
38
  }
35
39
  if (field.type === 'tabs') {
36
- field.tabs.forEach((tab)=>{
37
- const tabPath = tabHasName(tab) ? `${path}${tab.name}_` : path;
38
- const tabTablePath = tabHasName(tab) ? `${tablePath}${toSnakeCase(tab.name)}_` : tablePath;
39
- traverseFields({
40
- _locales,
41
- adapter,
42
- currentArgs,
43
- currentTableName,
44
- depth,
45
- fields: tab.fields,
46
- joinQuery,
47
- joins,
48
- path: tabPath,
49
- tablePath: tabTablePath,
50
- topLevelArgs,
51
- topLevelTableName
52
- });
40
+ traverseFields({
41
+ _locales,
42
+ adapter,
43
+ currentArgs,
44
+ currentTableName,
45
+ depth,
46
+ fields: field.tabs.map((tab)=>({
47
+ ...tab,
48
+ type: 'tab'
49
+ })),
50
+ joinQuery,
51
+ joins,
52
+ path,
53
+ select,
54
+ selectAllOnCurrentLevel,
55
+ selectMode,
56
+ tablePath,
57
+ topLevelArgs,
58
+ topLevelTableName,
59
+ versions,
60
+ withTabledFields
53
61
  });
54
62
  return;
55
63
  }
@@ -57,8 +65,17 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
57
65
  switch(field.type){
58
66
  case 'array':
59
67
  {
68
+ const arraySelect = selectAllOnCurrentLevel ? true : select?.[field.name];
69
+ if (select) {
70
+ if (selectMode === 'include' && typeof arraySelect === 'undefined' || selectMode === 'exclude' && arraySelect === false) {
71
+ break;
72
+ }
73
+ }
60
74
  const withArray = {
61
- columns: {
75
+ columns: typeof arraySelect === 'object' ? {
76
+ id: true,
77
+ _order: true
78
+ } : {
62
79
  _parentID: false
63
80
  },
64
81
  orderBy: ({ _order }, { asc })=>[
@@ -67,10 +84,20 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
67
84
  with: {}
68
85
  };
69
86
  const arrayTableName = adapter.tableNameMap.get(`${currentTableName}_${tablePath}${toSnakeCase(field.name)}`);
87
+ if (typeof arraySelect === 'object') {
88
+ if (adapter.tables[arrayTableName]._locale) {
89
+ withArray.columns._locale = true;
90
+ }
91
+ if (adapter.tables[arrayTableName]._uuid) {
92
+ withArray.columns._uuid = true;
93
+ }
94
+ }
70
95
  const arrayTableNameWithLocales = `${arrayTableName}${adapter.localesSuffix}`;
71
96
  if (adapter.tables[arrayTableNameWithLocales]) {
72
97
  withArray.with._locales = {
73
- columns: {
98
+ columns: typeof arraySelect === 'object' ? {
99
+ _locale: true
100
+ } : {
74
101
  id: false,
75
102
  _parentID: false
76
103
  },
@@ -87,67 +114,109 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
87
114
  fields: field.fields,
88
115
  joinQuery,
89
116
  path: '',
117
+ select: typeof arraySelect === 'object' ? arraySelect : undefined,
118
+ selectMode,
90
119
  tablePath: '',
91
120
  topLevelArgs,
92
- topLevelTableName
121
+ topLevelTableName,
122
+ withinLocalizedField: withinLocalizedField || field.localized,
123
+ withTabledFields
93
124
  });
94
- break;
95
- }
96
- case 'select':
97
- {
98
- if (field.hasMany) {
99
- const withSelect = {
100
- columns: {
101
- id: false,
102
- order: false,
103
- parent: false
104
- },
105
- orderBy: ({ order }, { asc })=>[
106
- asc(order)
107
- ]
108
- };
109
- currentArgs.with[`${path}${field.name}`] = withSelect;
125
+ if (typeof arraySelect === 'object' && withArray.with._locales && Object.keys(withArray.with._locales).length === 1) {
126
+ delete withArray.with._locales;
110
127
  }
111
128
  break;
112
129
  }
113
130
  case 'blocks':
114
- field.blocks.forEach((block)=>{
115
- const blockKey = `_blocks_${block.slug}`;
116
- if (!topLevelArgs[blockKey]) {
117
- const withBlock = {
118
- columns: {
119
- _parentID: false
120
- },
121
- orderBy: ({ _order }, { asc })=>[
122
- asc(_order)
123
- ],
124
- with: {}
125
- };
126
- const tableName = adapter.tableNameMap.get(`${topLevelTableName}_blocks_${toSnakeCase(block.slug)}`);
127
- if (adapter.tables[`${tableName}${adapter.localesSuffix}`]) {
128
- withBlock.with._locales = {
131
+ {
132
+ const blocksSelect = selectAllOnCurrentLevel ? true : select?.[field.name];
133
+ if (select) {
134
+ if (selectMode === 'include' && !blocksSelect || selectMode === 'exclude' && blocksSelect === false) {
135
+ break;
136
+ }
137
+ }
138
+ field.blocks.forEach((block)=>{
139
+ const blockKey = `_blocks_${block.slug}`;
140
+ let blockSelect;
141
+ let blockSelectMode = selectMode;
142
+ if (selectMode === 'include' && blocksSelect === true) {
143
+ blockSelect = true;
144
+ }
145
+ if (typeof blocksSelect === 'object') {
146
+ if (typeof blocksSelect[block.slug] === 'object') {
147
+ blockSelect = blocksSelect[block.slug];
148
+ } else if (selectMode === 'include' && typeof blocksSelect[block.slug] === 'undefined' || selectMode === 'exclude' && blocksSelect[block.slug] === false) {
149
+ blockSelect = {};
150
+ blockSelectMode = 'include';
151
+ } else if (selectMode === 'include' && blocksSelect[block.slug] === true) {
152
+ blockSelect = true;
153
+ }
154
+ }
155
+ if (!topLevelArgs[blockKey]) {
156
+ const withBlock = {
157
+ columns: typeof blockSelect === 'object' ? {
158
+ id: true,
159
+ _order: true,
160
+ _path: true
161
+ } : {
162
+ _parentID: false
163
+ },
164
+ orderBy: ({ _order }, { asc })=>[
165
+ asc(_order)
166
+ ],
129
167
  with: {}
130
168
  };
169
+ const tableName = adapter.tableNameMap.get(`${topLevelTableName}_blocks_${toSnakeCase(block.slug)}`);
170
+ if (typeof blockSelect === 'object') {
171
+ if (adapter.tables[tableName]._locale) {
172
+ withBlock.columns._locale = true;
173
+ }
174
+ if (adapter.tables[tableName]._uuid) {
175
+ withBlock.columns._uuid = true;
176
+ }
177
+ }
178
+ if (adapter.tables[`${tableName}${adapter.localesSuffix}`]) {
179
+ withBlock.with._locales = {
180
+ with: {}
181
+ };
182
+ if (typeof blockSelect === 'object') {
183
+ withBlock.with._locales.columns = {
184
+ _locale: true
185
+ };
186
+ }
187
+ }
188
+ topLevelArgs.with[blockKey] = withBlock;
189
+ traverseFields({
190
+ _locales: withBlock.with._locales,
191
+ adapter,
192
+ currentArgs: withBlock,
193
+ currentTableName: tableName,
194
+ depth,
195
+ fields: block.fields,
196
+ joinQuery,
197
+ path: '',
198
+ select: typeof blockSelect === 'object' ? blockSelect : undefined,
199
+ selectMode: blockSelectMode,
200
+ tablePath: '',
201
+ topLevelArgs,
202
+ topLevelTableName,
203
+ withinLocalizedField: withinLocalizedField || field.localized,
204
+ withTabledFields
205
+ });
206
+ if (typeof blockSelect === 'object' && withBlock.with._locales && Object.keys(withBlock.with._locales.columns).length === 1) {
207
+ delete withBlock.with._locales;
208
+ }
131
209
  }
132
- topLevelArgs.with[blockKey] = withBlock;
133
- traverseFields({
134
- _locales: withBlock.with._locales,
135
- adapter,
136
- currentArgs: withBlock,
137
- currentTableName: tableName,
138
- depth,
139
- fields: block.fields,
140
- joinQuery,
141
- path: '',
142
- tablePath: '',
143
- topLevelArgs,
144
- topLevelTableName
145
- });
146
- }
147
- });
148
- break;
210
+ });
211
+ break;
212
+ }
149
213
  case 'group':
214
+ case 'tab':
150
215
  {
216
+ const fieldSelect = select?.[field.name];
217
+ if (fieldSelect === false) {
218
+ break;
219
+ }
151
220
  traverseFields({
152
221
  _locales,
153
222
  adapter,
@@ -158,9 +227,15 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
158
227
  joinQuery,
159
228
  joins,
160
229
  path: `${path}${field.name}_`,
230
+ select: typeof fieldSelect === 'object' ? fieldSelect : undefined,
231
+ selectAllOnCurrentLevel: selectAllOnCurrentLevel || fieldSelect === true || selectMode === 'exclude' && typeof fieldSelect === 'undefined',
232
+ selectMode,
161
233
  tablePath: `${tablePath}${toSnakeCase(field.name)}_`,
162
234
  topLevelArgs,
163
- topLevelTableName
235
+ topLevelTableName,
236
+ versions,
237
+ withinLocalizedField: withinLocalizedField || field.localized,
238
+ withTabledFields
164
239
  });
165
240
  break;
166
241
  }
@@ -170,56 +245,196 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
170
245
  if (joinQuery === false) {
171
246
  break;
172
247
  }
173
- const { limit: limitArg = 10, sort, where } = joinQuery[`${path.replaceAll('_', '.')}${field.name}`] || {};
248
+ if (select && selectMode === 'include' && !select[field.name] || selectMode === 'exclude' && select[field.name] === false) {
249
+ break;
250
+ }
251
+ const joinSchemaPath = `${path.replaceAll('_', '.')}${field.name}`;
252
+ if (joinQuery[joinSchemaPath] === false) {
253
+ break;
254
+ }
255
+ const { limit: limitArg = field.defaultLimit ?? 10, sort = field.defaultSort, where } = joinQuery[joinSchemaPath] || {};
174
256
  let limit = limitArg;
175
257
  if (limit !== 0) {
176
258
  // get an additional document and slice it later to determine if there is a next page
177
259
  limit += 1;
178
260
  }
179
261
  const fields = adapter.payload.collections[field.collection].config.fields;
180
- const joinTableName = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${field.localized && adapter.payload.config.localization ? adapter.localesSuffix : ''}`;
181
- const selectFields = {};
182
- const orderBy = buildOrderBy({
262
+ const joinCollectionTableName = adapter.tableNameMap.get(toSnakeCase(field.collection));
263
+ const joins = [];
264
+ const buildQueryResult = buildQuery({
183
265
  adapter,
184
266
  fields,
185
- joins: [],
267
+ joins,
186
268
  locale,
187
- selectFields,
188
269
  sort,
189
- tableName: joinTableName
270
+ tableName: joinCollectionTableName,
271
+ where
190
272
  });
191
- const withJoin = {
192
- columns: selectFields,
193
- orderBy: ()=>[
194
- orderBy.order(orderBy.column)
195
- ]
196
- };
197
- if (limit) {
198
- withJoin.limit = limit;
199
- }
200
- if (field.localized) {
201
- withJoin.columns._locale = true;
202
- withJoin.columns._parentID = true;
273
+ let subQueryWhere = buildQueryResult.where;
274
+ const orderBy = buildQueryResult.orderBy;
275
+ let joinLocalesCollectionTableName;
276
+ const currentIDColumn = versions ? adapter.tables[currentTableName].parent : adapter.tables[currentTableName].id;
277
+ // Handle hasMany _rels table
278
+ if (field.hasMany) {
279
+ const joinRelsCollectionTableName = `${joinCollectionTableName}${adapter.relationshipsSuffix}`;
280
+ if (field.localized) {
281
+ joinLocalesCollectionTableName = joinRelsCollectionTableName;
282
+ }
283
+ let columnReferenceToCurrentID;
284
+ if (versions) {
285
+ columnReferenceToCurrentID = `${topLevelTableName.replace('_', '').replace(new RegExp(`${adapter.versionsSuffix}$`), '')}_id`;
286
+ } else {
287
+ columnReferenceToCurrentID = `${topLevelTableName}_id`;
288
+ }
289
+ joins.push({
290
+ type: 'innerJoin',
291
+ condition: and(eq(adapter.tables[joinRelsCollectionTableName].parent, adapter.tables[joinCollectionTableName].id), eq(sql.raw(`"${joinRelsCollectionTableName}"."${columnReferenceToCurrentID}"`), currentIDColumn), eq(adapter.tables[joinRelsCollectionTableName].path, field.on)),
292
+ table: adapter.tables[joinRelsCollectionTableName]
293
+ });
203
294
  } else {
204
- withJoin.columns.id = true;
205
- }
206
- if (where) {
207
- const { where: joinWhere } = buildQuery({
208
- adapter,
209
- fields,
210
- joins,
211
- locale,
212
- sort,
213
- tableName: joinTableName,
214
- where
295
+ // Handle localized without hasMany
296
+ const foreignColumn = field.on.replaceAll('.', '_');
297
+ if (field.localized) {
298
+ joinLocalesCollectionTableName = `${joinCollectionTableName}${adapter.localesSuffix}`;
299
+ joins.push({
300
+ type: 'innerJoin',
301
+ condition: and(eq(adapter.tables[joinLocalesCollectionTableName]._parentID, adapter.tables[joinCollectionTableName].id), eq(adapter.tables[joinLocalesCollectionTableName][foreignColumn], currentIDColumn)),
302
+ table: adapter.tables[joinLocalesCollectionTableName]
303
+ });
304
+ // Handle without localized and without hasMany, just a condition append to where. With localized the inner join handles eq.
305
+ } else {
306
+ const constraint = eq(adapter.tables[joinCollectionTableName][foreignColumn], currentIDColumn);
307
+ if (subQueryWhere) {
308
+ subQueryWhere = and(subQueryWhere, constraint);
309
+ } else {
310
+ subQueryWhere = constraint;
311
+ }
312
+ }
313
+ }
314
+ const chainedMethods = [];
315
+ joins.forEach(({ type, condition, table })=>{
316
+ chainedMethods.push({
317
+ args: [
318
+ table,
319
+ condition
320
+ ],
321
+ method: type ?? 'leftJoin'
322
+ });
323
+ });
324
+ if (limit !== 0) {
325
+ chainedMethods.push({
326
+ args: [
327
+ limit
328
+ ],
329
+ method: 'limit'
215
330
  });
216
- withJoin.where = ()=>joinWhere;
217
331
  }
218
- currentArgs.with[`${path.replaceAll('.', '_')}${field.name}`] = withJoin;
332
+ const db = adapter.drizzle;
333
+ const subQuery = chainMethods({
334
+ methods: chainedMethods,
335
+ query: db.select({
336
+ id: adapter.tables[joinCollectionTableName].id,
337
+ ...joinLocalesCollectionTableName && {
338
+ locale: adapter.tables[joinLocalesCollectionTableName].locale || adapter.tables[joinLocalesCollectionTableName]._locale
339
+ }
340
+ }).from(adapter.tables[joinCollectionTableName]).where(subQueryWhere).orderBy(()=>orderBy.map(({ column, order })=>order(column)))
341
+ });
342
+ const columnName = `${path.replaceAll('.', '_')}${field.name}`;
343
+ const jsonObjectSelect = field.localized ? sql.raw(`'_parentID', "id", '_locale', "${adapter.tables[joinLocalesCollectionTableName].locale ? 'locale' : '_locale'}"`) : sql.raw(`'id', "id"`);
344
+ if (adapter.name === 'sqlite') {
345
+ currentArgs.extras[columnName] = sql`
346
+ COALESCE((
347
+ SELECT json_group_array(json_object(${jsonObjectSelect}))
348
+ FROM (
349
+ ${subQuery}
350
+ ) AS ${sql.raw(`${columnName}_sub`)}
351
+ ), '[]')
352
+ `.as(columnName);
353
+ } else {
354
+ currentArgs.extras[columnName] = sql`
355
+ COALESCE((
356
+ SELECT json_agg(json_build_object(${jsonObjectSelect}))
357
+ FROM (
358
+ ${subQuery}
359
+ ) AS ${sql.raw(`${columnName}_sub`)}
360
+ ), '[]'::json)
361
+ `.as(columnName);
362
+ }
363
+ break;
364
+ }
365
+ case 'point':
366
+ {
367
+ if (adapter.name === 'sqlite') {
368
+ break;
369
+ }
370
+ const args = field.localized ? _locales : currentArgs;
371
+ if (!args.columns) {
372
+ args.columns = {};
373
+ }
374
+ if (!args.extras) {
375
+ args.extras = {};
376
+ }
377
+ const name = `${path}${field.name}`;
378
+ // Drizzle handles that poorly. See https://github.com/drizzle-team/drizzle-orm/issues/2526
379
+ // Additionally, this way we format the column value straight in the database using ST_AsGeoJSON
380
+ args.columns[name] = false;
381
+ let shouldSelect = false;
382
+ if (select || selectAllOnCurrentLevel) {
383
+ if (selectAllOnCurrentLevel || selectMode === 'include' && select[field.name] === true || selectMode === 'exclude' && typeof select[field.name] === 'undefined') {
384
+ shouldSelect = true;
385
+ }
386
+ } else {
387
+ shouldSelect = true;
388
+ }
389
+ if (shouldSelect) {
390
+ args.extras[name] = sql.raw(`ST_AsGeoJSON(${toSnakeCase(name)})::jsonb`).as(name);
391
+ }
392
+ break;
393
+ }
394
+ case 'select':
395
+ {
396
+ if (field.hasMany) {
397
+ if (select) {
398
+ if (selectMode === 'include' && !select[field.name] || selectMode === 'exclude' && select[field.name] === false) {
399
+ break;
400
+ }
401
+ }
402
+ const withSelect = {
403
+ columns: {
404
+ id: false,
405
+ order: false,
406
+ parent: false
407
+ },
408
+ orderBy: ({ order }, { asc })=>[
409
+ asc(order)
410
+ ]
411
+ };
412
+ currentArgs.with[`${path}${field.name}`] = withSelect;
413
+ }
219
414
  break;
220
415
  }
221
416
  default:
222
417
  {
418
+ if (!select && !selectAllOnCurrentLevel) {
419
+ break;
420
+ }
421
+ if (selectAllOnCurrentLevel || selectMode === 'include' && select[field.name] === true || selectMode === 'exclude' && typeof select[field.name] === 'undefined') {
422
+ const fieldPath = `${path}${field.name}`;
423
+ if ((field.localized || withinLocalizedField) && _locales) {
424
+ _locales.columns[fieldPath] = true;
425
+ } else if (adapter.tables[currentTableName]?.[fieldPath]) {
426
+ currentArgs.columns[fieldPath] = true;
427
+ }
428
+ if (!withTabledFields.rels && field.type === 'relationship' && (field.hasMany || Array.isArray(field.relationTo))) {
429
+ withTabledFields.rels = true;
430
+ }
431
+ if (!withTabledFields.numbers && field.type === 'number' && field.hasMany) {
432
+ withTabledFields.numbers = true;
433
+ }
434
+ if (!withTabledFields.texts && field.type === 'text' && field.hasMany) {
435
+ withTabledFields.texts = true;
436
+ }
437
+ }
223
438
  break;
224
439
  }
225
440
  }