@payloadcms/drizzle 3.0.0-canary.c696728 → 3.0.0-canary.c96fa61

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 (183) 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 -0
  24. package/dist/exports/postgres.d.ts.map +1 -1
  25. package/dist/exports/postgres.js +2 -0
  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 +304 -89
  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 +5 -0
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +5 -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/defaultSnapshot.d.ts.map +1 -1
  79. package/dist/postgres/defaultSnapshot.js +4 -1
  80. package/dist/postgres/defaultSnapshot.js.map +1 -1
  81. package/dist/postgres/init.d.ts.map +1 -1
  82. package/dist/postgres/init.js +10 -1
  83. package/dist/postgres/init.js.map +1 -1
  84. package/dist/postgres/schema/build.d.ts +3 -1
  85. package/dist/postgres/schema/build.d.ts.map +1 -1
  86. package/dist/postgres/schema/build.js +29 -3
  87. package/dist/postgres/schema/build.js.map +1 -1
  88. package/dist/postgres/schema/createIndex.d.ts +2 -3
  89. package/dist/postgres/schema/createIndex.d.ts.map +1 -1
  90. package/dist/postgres/schema/createIndex.js +3 -3
  91. package/dist/postgres/schema/createIndex.js.map +1 -1
  92. package/dist/postgres/schema/geometryColumn.d.ts +12 -0
  93. package/dist/postgres/schema/geometryColumn.d.ts.map +1 -0
  94. package/dist/postgres/schema/geometryColumn.js +18 -0
  95. package/dist/postgres/schema/geometryColumn.js.map +1 -0
  96. package/dist/postgres/schema/traverseFields.d.ts +3 -1
  97. package/dist/postgres/schema/traverseFields.d.ts.map +1 -1
  98. package/dist/postgres/schema/traverseFields.js +39 -29
  99. package/dist/postgres/schema/traverseFields.js.map +1 -1
  100. package/dist/postgres/schema/withDefault.d.ts.map +1 -1
  101. package/dist/postgres/schema/withDefault.js +3 -0
  102. package/dist/postgres/schema/withDefault.js.map +1 -1
  103. package/dist/postgres/types.d.ts +35 -6
  104. package/dist/postgres/types.d.ts.map +1 -1
  105. package/dist/postgres/types.js.map +1 -1
  106. package/dist/queries/addJoinTable.d.ts +11 -0
  107. package/dist/queries/addJoinTable.d.ts.map +1 -0
  108. package/dist/queries/addJoinTable.js +13 -0
  109. package/dist/queries/addJoinTable.js.map +1 -0
  110. package/dist/queries/buildOrderBy.d.ts +2 -2
  111. package/dist/queries/buildOrderBy.d.ts.map +1 -1
  112. package/dist/queries/buildOrderBy.js +32 -27
  113. package/dist/queries/buildOrderBy.js.map +1 -1
  114. package/dist/queries/buildQuery.d.ts +4 -3
  115. package/dist/queries/buildQuery.d.ts.map +1 -1
  116. package/dist/queries/buildQuery.js.map +1 -1
  117. package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
  118. package/dist/queries/getTableColumnFromPath.js +80 -70
  119. package/dist/queries/getTableColumnFromPath.js.map +1 -1
  120. package/dist/queries/operatorMap.d.ts.map +1 -1
  121. package/dist/queries/operatorMap.js +0 -4
  122. package/dist/queries/operatorMap.js.map +1 -1
  123. package/dist/queries/parseParams.d.ts.map +1 -1
  124. package/dist/queries/parseParams.js +29 -0
  125. package/dist/queries/parseParams.js.map +1 -1
  126. package/dist/queries/sanitizeQueryValue.d.ts +2 -1
  127. package/dist/queries/sanitizeQueryValue.d.ts.map +1 -1
  128. package/dist/queries/sanitizeQueryValue.js +21 -5
  129. package/dist/queries/sanitizeQueryValue.js.map +1 -1
  130. package/dist/queryDrafts.d.ts.map +1 -1
  131. package/dist/queryDrafts.js +5 -4
  132. package/dist/queryDrafts.js.map +1 -1
  133. package/dist/transform/read/traverseFields.d.ts.map +1 -1
  134. package/dist/transform/read/traverseFields.js +41 -7
  135. package/dist/transform/read/traverseFields.js.map +1 -1
  136. package/dist/transform/write/traverseFields.d.ts.map +1 -1
  137. package/dist/transform/write/traverseFields.js +17 -2
  138. package/dist/transform/write/traverseFields.js.map +1 -1
  139. package/dist/types.d.ts +2 -1
  140. package/dist/types.d.ts.map +1 -1
  141. package/dist/types.js.map +1 -1
  142. package/dist/update.d.ts.map +1 -1
  143. package/dist/update.js +2 -1
  144. package/dist/update.js.map +1 -1
  145. package/dist/updateGlobal.d.ts +1 -1
  146. package/dist/updateGlobal.d.ts.map +1 -1
  147. package/dist/updateGlobal.js +2 -1
  148. package/dist/updateGlobal.js.map +1 -1
  149. package/dist/updateGlobalVersion.d.ts +1 -1
  150. package/dist/updateGlobalVersion.d.ts.map +1 -1
  151. package/dist/updateGlobalVersion.js +2 -1
  152. package/dist/updateGlobalVersion.js.map +1 -1
  153. package/dist/updateVersion.d.ts +1 -1
  154. package/dist/updateVersion.d.ts.map +1 -1
  155. package/dist/updateVersion.js +2 -1
  156. package/dist/updateVersion.js.map +1 -1
  157. package/dist/upsertRow/index.d.ts +1 -1
  158. package/dist/upsertRow/index.d.ts.map +1 -1
  159. package/dist/upsertRow/index.js +4 -3
  160. package/dist/upsertRow/index.js.map +1 -1
  161. package/dist/upsertRow/types.d.ts +3 -1
  162. package/dist/upsertRow/types.d.ts.map +1 -1
  163. package/dist/upsertRow/types.js.map +1 -1
  164. package/dist/utilities/buildIndexName.d.ts +7 -0
  165. package/dist/utilities/buildIndexName.d.ts.map +1 -0
  166. package/dist/utilities/buildIndexName.js +14 -0
  167. package/dist/utilities/buildIndexName.js.map +1 -0
  168. package/dist/utilities/executeSchemaHooks.d.ts +24 -0
  169. package/dist/utilities/executeSchemaHooks.d.ts.map +1 -0
  170. package/dist/utilities/executeSchemaHooks.js +21 -0
  171. package/dist/utilities/executeSchemaHooks.js.map +1 -0
  172. package/dist/utilities/extendDrizzleTable.d.ts +19 -0
  173. package/dist/utilities/extendDrizzleTable.d.ts.map +1 -0
  174. package/dist/utilities/extendDrizzleTable.js +38 -0
  175. package/dist/utilities/extendDrizzleTable.js.map +1 -0
  176. package/dist/utilities/getNameFromDrizzleTable.d.ts +3 -0
  177. package/dist/utilities/getNameFromDrizzleTable.d.ts.map +1 -0
  178. package/dist/utilities/getNameFromDrizzleTable.js +6 -0
  179. package/dist/utilities/getNameFromDrizzleTable.js.map +1 -0
  180. package/dist/utilities/pushDevSchema.d.ts.map +1 -1
  181. package/dist/utilities/pushDevSchema.js +5 -0
  182. package/dist/utilities/pushDevSchema.js.map +1 -1
  183. package/package.json +7 -7
@@ -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,15 +114,27 @@ 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
  });
125
+ if (typeof arraySelect === 'object' && withArray.with._locales && Object.keys(withArray.with._locales).length === 1) {
126
+ delete withArray.with._locales;
127
+ }
94
128
  break;
95
129
  }
96
130
  case 'select':
97
131
  {
98
132
  if (field.hasMany) {
133
+ if (select) {
134
+ if (selectMode === 'include' && !select[field.name] || selectMode === 'exclude' && select[field.name] === false) {
135
+ break;
136
+ }
137
+ }
99
138
  const withSelect = {
100
139
  columns: {
101
140
  id: false,
@@ -111,43 +150,95 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
111
150
  break;
112
151
  }
113
152
  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 = {
153
+ {
154
+ const blocksSelect = selectAllOnCurrentLevel ? true : select?.[field.name];
155
+ if (select) {
156
+ if (selectMode === 'include' && !blocksSelect || selectMode === 'exclude' && blocksSelect === false) {
157
+ break;
158
+ }
159
+ }
160
+ field.blocks.forEach((block)=>{
161
+ const blockKey = `_blocks_${block.slug}`;
162
+ let blockSelect;
163
+ let blockSelectMode = selectMode;
164
+ if (selectMode === 'include' && blocksSelect === true) {
165
+ blockSelect = true;
166
+ }
167
+ if (typeof blocksSelect === 'object') {
168
+ if (typeof blocksSelect[block.slug] === 'object') {
169
+ blockSelect = blocksSelect[block.slug];
170
+ } else if (selectMode === 'include' && typeof blocksSelect[block.slug] === 'undefined' || selectMode === 'exclude' && blocksSelect[block.slug] === false) {
171
+ blockSelect = {};
172
+ blockSelectMode = 'include';
173
+ } else if (selectMode === 'include' && blocksSelect[block.slug] === true) {
174
+ blockSelect = true;
175
+ }
176
+ }
177
+ if (!topLevelArgs[blockKey]) {
178
+ const withBlock = {
179
+ columns: typeof blockSelect === 'object' ? {
180
+ id: true,
181
+ _order: true,
182
+ _path: true
183
+ } : {
184
+ _parentID: false
185
+ },
186
+ orderBy: ({ _order }, { asc })=>[
187
+ asc(_order)
188
+ ],
129
189
  with: {}
130
190
  };
191
+ const tableName = adapter.tableNameMap.get(`${topLevelTableName}_blocks_${toSnakeCase(block.slug)}`);
192
+ if (typeof blockSelect === 'object') {
193
+ if (adapter.tables[tableName]._locale) {
194
+ withBlock.columns._locale = true;
195
+ }
196
+ if (adapter.tables[tableName]._uuid) {
197
+ withBlock.columns._uuid = true;
198
+ }
199
+ }
200
+ if (adapter.tables[`${tableName}${adapter.localesSuffix}`]) {
201
+ withBlock.with._locales = {
202
+ with: {}
203
+ };
204
+ if (typeof blockSelect === 'object') {
205
+ withBlock.with._locales.columns = {
206
+ _locale: true
207
+ };
208
+ }
209
+ }
210
+ topLevelArgs.with[blockKey] = withBlock;
211
+ traverseFields({
212
+ _locales: withBlock.with._locales,
213
+ adapter,
214
+ currentArgs: withBlock,
215
+ currentTableName: tableName,
216
+ depth,
217
+ fields: block.fields,
218
+ joinQuery,
219
+ path: '',
220
+ select: typeof blockSelect === 'object' ? blockSelect : undefined,
221
+ selectMode: blockSelectMode,
222
+ tablePath: '',
223
+ topLevelArgs,
224
+ topLevelTableName,
225
+ withinLocalizedField: withinLocalizedField || field.localized,
226
+ withTabledFields
227
+ });
228
+ if (typeof blockSelect === 'object' && withBlock.with._locales && Object.keys(withBlock.with._locales.columns).length === 1) {
229
+ delete withBlock.with._locales;
230
+ }
131
231
  }
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;
232
+ });
233
+ break;
234
+ }
149
235
  case 'group':
236
+ case 'tab':
150
237
  {
238
+ const fieldSelect = select?.[field.name];
239
+ if (fieldSelect === false) {
240
+ break;
241
+ }
151
242
  traverseFields({
152
243
  _locales,
153
244
  adapter,
@@ -158,68 +249,192 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
158
249
  joinQuery,
159
250
  joins,
160
251
  path: `${path}${field.name}_`,
252
+ select: typeof fieldSelect === 'object' ? fieldSelect : undefined,
253
+ selectAllOnCurrentLevel: selectAllOnCurrentLevel || fieldSelect === true || selectMode === 'exclude' && typeof fieldSelect === 'undefined',
254
+ selectMode,
161
255
  tablePath: `${tablePath}${toSnakeCase(field.name)}_`,
162
256
  topLevelArgs,
163
- topLevelTableName
257
+ topLevelTableName,
258
+ versions,
259
+ withinLocalizedField: withinLocalizedField || field.localized,
260
+ withTabledFields
164
261
  });
165
262
  break;
166
263
  }
264
+ case 'point':
265
+ {
266
+ if (adapter.name === 'sqlite') {
267
+ break;
268
+ }
269
+ const args = field.localized ? _locales : currentArgs;
270
+ if (!args.columns) {
271
+ args.columns = {};
272
+ }
273
+ if (!args.extras) {
274
+ args.extras = {};
275
+ }
276
+ const name = `${path}${field.name}`;
277
+ // Drizzle handles that poorly. See https://github.com/drizzle-team/drizzle-orm/issues/2526
278
+ // Additionally, this way we format the column value straight in the database using ST_AsGeoJSON
279
+ args.columns[name] = false;
280
+ let shouldSelect = false;
281
+ if (select || selectAllOnCurrentLevel) {
282
+ if (selectAllOnCurrentLevel || selectMode === 'include' && select[field.name] === true || selectMode === 'exclude' && typeof select[field.name] === 'undefined') {
283
+ shouldSelect = true;
284
+ }
285
+ } else {
286
+ shouldSelect = true;
287
+ }
288
+ if (shouldSelect) {
289
+ args.extras[name] = sql.raw(`ST_AsGeoJSON(${toSnakeCase(name)})::jsonb`).as(name);
290
+ }
291
+ break;
292
+ }
167
293
  case 'join':
168
294
  {
169
295
  // when `joinsQuery` is false, do not join
170
296
  if (joinQuery === false) {
171
297
  break;
172
298
  }
173
- const { limit: limitArg = 10, sort, where } = joinQuery[`${path.replaceAll('_', '.')}${field.name}`] || {};
299
+ if (select && selectMode === 'include' && !select[field.name] || selectMode === 'exclude' && select[field.name] === false) {
300
+ break;
301
+ }
302
+ const joinSchemaPath = `${path.replaceAll('_', '.')}${field.name}`;
303
+ if (joinQuery[joinSchemaPath] === false) {
304
+ break;
305
+ }
306
+ const { limit: limitArg = field.defaultLimit ?? 10, sort = field.defaultSort, where } = joinQuery[joinSchemaPath] || {};
174
307
  let limit = limitArg;
175
308
  if (limit !== 0) {
176
309
  // get an additional document and slice it later to determine if there is a next page
177
310
  limit += 1;
178
311
  }
179
312
  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({
313
+ const joinCollectionTableName = adapter.tableNameMap.get(toSnakeCase(field.collection));
314
+ const joins = [];
315
+ const buildQueryResult = buildQuery({
183
316
  adapter,
184
317
  fields,
185
- joins: [],
318
+ joins,
186
319
  locale,
187
- selectFields,
188
320
  sort,
189
- tableName: joinTableName
321
+ tableName: joinCollectionTableName,
322
+ where
190
323
  });
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;
324
+ let subQueryWhere = buildQueryResult.where;
325
+ const orderBy = buildQueryResult.orderBy;
326
+ let joinLocalesCollectionTableName;
327
+ const currentIDColumn = versions ? adapter.tables[currentTableName].parent : adapter.tables[currentTableName].id;
328
+ // Handle hasMany _rels table
329
+ if (field.hasMany) {
330
+ const joinRelsCollectionTableName = `${joinCollectionTableName}${adapter.relationshipsSuffix}`;
331
+ if (field.localized) {
332
+ joinLocalesCollectionTableName = joinRelsCollectionTableName;
333
+ }
334
+ let columnReferenceToCurrentID;
335
+ if (versions) {
336
+ columnReferenceToCurrentID = `${topLevelTableName.replace('_', '').replace(new RegExp(`${adapter.versionsSuffix}$`), '')}_id`;
337
+ } else {
338
+ columnReferenceToCurrentID = `${topLevelTableName}_id`;
339
+ }
340
+ joins.push({
341
+ type: 'innerJoin',
342
+ condition: and(eq(adapter.tables[joinRelsCollectionTableName].parent, adapter.tables[joinCollectionTableName].id), eq(sql.raw(`"${joinRelsCollectionTableName}"."${columnReferenceToCurrentID}"`), currentIDColumn), eq(adapter.tables[joinRelsCollectionTableName].path, field.on)),
343
+ table: adapter.tables[joinRelsCollectionTableName]
344
+ });
203
345
  } 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
346
+ // Handle localized without hasMany
347
+ const foreignColumn = field.on.replaceAll('.', '_');
348
+ if (field.localized) {
349
+ joinLocalesCollectionTableName = `${joinCollectionTableName}${adapter.localesSuffix}`;
350
+ joins.push({
351
+ type: 'innerJoin',
352
+ condition: and(eq(adapter.tables[joinLocalesCollectionTableName]._parentID, adapter.tables[joinCollectionTableName].id), eq(adapter.tables[joinLocalesCollectionTableName][foreignColumn], currentIDColumn)),
353
+ table: adapter.tables[joinLocalesCollectionTableName]
354
+ });
355
+ // Handle without localized and without hasMany, just a condition append to where. With localized the inner join handles eq.
356
+ } else {
357
+ const constraint = eq(adapter.tables[joinCollectionTableName][foreignColumn], currentIDColumn);
358
+ if (subQueryWhere) {
359
+ subQueryWhere = and(subQueryWhere, constraint);
360
+ } else {
361
+ subQueryWhere = constraint;
362
+ }
363
+ }
364
+ }
365
+ const chainedMethods = [];
366
+ joins.forEach(({ type, condition, table })=>{
367
+ chainedMethods.push({
368
+ args: [
369
+ table,
370
+ condition
371
+ ],
372
+ method: type ?? 'leftJoin'
215
373
  });
216
- withJoin.where = ()=>joinWhere;
374
+ });
375
+ if (limit !== 0) {
376
+ chainedMethods.push({
377
+ args: [
378
+ limit
379
+ ],
380
+ method: 'limit'
381
+ });
382
+ }
383
+ const db = adapter.drizzle;
384
+ const subQuery = chainMethods({
385
+ methods: chainedMethods,
386
+ query: db.select({
387
+ id: adapter.tables[joinCollectionTableName].id,
388
+ ...joinLocalesCollectionTableName && {
389
+ locale: adapter.tables[joinLocalesCollectionTableName].locale || adapter.tables[joinLocalesCollectionTableName]._locale
390
+ }
391
+ }).from(adapter.tables[joinCollectionTableName]).where(subQueryWhere).orderBy(()=>orderBy.map(({ column, order })=>order(column)))
392
+ });
393
+ const columnName = `${path.replaceAll('.', '_')}${field.name}`;
394
+ const jsonObjectSelect = field.localized ? sql.raw(`'_parentID', "id", '_locale', "${adapter.tables[joinLocalesCollectionTableName].locale ? 'locale' : '_locale'}"`) : sql.raw(`'id', "id"`);
395
+ if (adapter.name === 'sqlite') {
396
+ currentArgs.extras[columnName] = sql`
397
+ COALESCE((
398
+ SELECT json_group_array(json_object(${jsonObjectSelect}))
399
+ FROM (
400
+ ${subQuery}
401
+ ) AS ${sql.raw(`${columnName}_sub`)}
402
+ ), '[]')
403
+ `.as(columnName);
404
+ } else {
405
+ currentArgs.extras[columnName] = sql`
406
+ COALESCE((
407
+ SELECT json_agg(json_build_object(${jsonObjectSelect}))
408
+ FROM (
409
+ ${subQuery}
410
+ ) AS ${sql.raw(`${columnName}_sub`)}
411
+ ), '[]'::json)
412
+ `.as(columnName);
217
413
  }
218
- currentArgs.with[`${path.replaceAll('.', '_')}${field.name}`] = withJoin;
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
  }