@payloadcms/drizzle 3.0.0-canary.5a7fb7d → 3.0.0-canary.67aae47

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 +2 -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 +2 -1
  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 +1 -1
  24. package/dist/exports/postgres.d.ts.map +1 -1
  25. package/dist/exports/postgres.js +1 -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 +38 -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 +287 -128
  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/postgres/countDistinct.d.ts.map +1 -1
  66. package/dist/postgres/countDistinct.js +2 -3
  67. package/dist/postgres/countDistinct.js.map +1 -1
  68. package/dist/postgres/createDatabase.d.ts.map +1 -1
  69. package/dist/postgres/createDatabase.js +4 -4
  70. package/dist/postgres/createDatabase.js.map +1 -1
  71. package/dist/postgres/createExtensions.d.ts +3 -0
  72. package/dist/postgres/createExtensions.d.ts.map +1 -0
  73. package/dist/postgres/createExtensions.js +16 -0
  74. package/dist/postgres/createExtensions.js.map +1 -0
  75. package/dist/postgres/createJSONQuery/index.d.ts +2 -9
  76. package/dist/postgres/createJSONQuery/index.d.ts.map +1 -1
  77. package/dist/postgres/createJSONQuery/index.js +34 -46
  78. package/dist/postgres/createJSONQuery/index.js.map +1 -1
  79. package/dist/postgres/defaultSnapshot.d.ts.map +1 -1
  80. package/dist/postgres/defaultSnapshot.js +2 -0
  81. package/dist/postgres/defaultSnapshot.js.map +1 -1
  82. package/dist/postgres/init.d.ts.map +1 -1
  83. package/dist/postgres/init.js +0 -1
  84. package/dist/postgres/init.js.map +1 -1
  85. package/dist/postgres/schema/build.d.ts +2 -3
  86. package/dist/postgres/schema/build.d.ts.map +1 -1
  87. package/dist/postgres/schema/build.js +12 -9
  88. package/dist/postgres/schema/build.js.map +1 -1
  89. package/dist/postgres/schema/createIndex.d.ts +2 -3
  90. package/dist/postgres/schema/createIndex.d.ts.map +1 -1
  91. package/dist/postgres/schema/createIndex.js +3 -3
  92. package/dist/postgres/schema/createIndex.js.map +1 -1
  93. package/dist/postgres/schema/geometryColumn.d.ts +12 -0
  94. package/dist/postgres/schema/geometryColumn.d.ts.map +1 -0
  95. package/dist/postgres/schema/geometryColumn.js +18 -0
  96. package/dist/postgres/schema/geometryColumn.js.map +1 -0
  97. package/dist/postgres/schema/traverseFields.d.ts +2 -3
  98. package/dist/postgres/schema/traverseFields.d.ts.map +1 -1
  99. package/dist/postgres/schema/traverseFields.js +14 -32
  100. package/dist/postgres/schema/traverseFields.js.map +1 -1
  101. package/dist/postgres/schema/withDefault.d.ts.map +1 -1
  102. package/dist/postgres/schema/withDefault.js +3 -0
  103. package/dist/postgres/schema/withDefault.js.map +1 -1
  104. package/dist/postgres/types.d.ts +3 -0
  105. package/dist/postgres/types.d.ts.map +1 -1
  106. package/dist/postgres/types.js.map +1 -1
  107. package/dist/queries/addJoinTable.d.ts +11 -0
  108. package/dist/queries/addJoinTable.d.ts.map +1 -0
  109. package/dist/queries/addJoinTable.js +13 -0
  110. package/dist/queries/addJoinTable.js.map +1 -0
  111. package/dist/queries/buildOrderBy.d.ts +2 -2
  112. package/dist/queries/buildOrderBy.d.ts.map +1 -1
  113. package/dist/queries/buildOrderBy.js +32 -28
  114. package/dist/queries/buildOrderBy.js.map +1 -1
  115. package/dist/queries/buildQuery.d.ts +3 -3
  116. package/dist/queries/buildQuery.d.ts.map +1 -1
  117. package/dist/queries/buildQuery.js.map +1 -1
  118. package/dist/queries/getTableColumnFromPath.d.ts +1 -2
  119. package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
  120. package/dist/queries/getTableColumnFromPath.js +78 -81
  121. package/dist/queries/getTableColumnFromPath.js.map +1 -1
  122. package/dist/queries/operatorMap.d.ts.map +1 -1
  123. package/dist/queries/operatorMap.js +0 -4
  124. package/dist/queries/operatorMap.js.map +1 -1
  125. package/dist/queries/parseParams.d.ts.map +1 -1
  126. package/dist/queries/parseParams.js +38 -5
  127. package/dist/queries/parseParams.js.map +1 -1
  128. package/dist/queries/sanitizeQueryValue.js +8 -2
  129. package/dist/queries/sanitizeQueryValue.js.map +1 -1
  130. package/dist/queryDrafts.d.ts.map +1 -1
  131. package/dist/queryDrafts.js +4 -1
  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 +1 -1
  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 +16 -2
  138. package/dist/transform/write/traverseFields.js.map +1 -1
  139. package/dist/types.d.ts +5 -3
  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/getNameFromDrizzleTable.d.ts +3 -0
  169. package/dist/utilities/getNameFromDrizzleTable.d.ts.map +1 -0
  170. package/dist/utilities/getNameFromDrizzleTable.js +6 -0
  171. package/dist/utilities/getNameFromDrizzleTable.js.map +1 -0
  172. package/dist/utilities/pushDevSchema.d.ts.map +1 -1
  173. package/dist/utilities/pushDevSchema.js +5 -0
  174. package/dist/utilities/pushDevSchema.js.map +1 -1
  175. package/package.json +6 -6
  176. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.d.ts +0 -2
  177. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.d.ts.map +0 -1
  178. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.js +0 -16
  179. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.js.map +0 -1
  180. package/dist/postgres/createJSONQuery/formatJSONPathSegment.d.ts +0 -2
  181. package/dist/postgres/createJSONQuery/formatJSONPathSegment.d.ts.map +0 -1
  182. package/dist/postgres/createJSONQuery/formatJSONPathSegment.js +0 -5
  183. package/dist/postgres/createJSONQuery/formatJSONPathSegment.js.map +0 -1
@@ -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":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAM/C,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,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,4BA8UnB,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"}
@@ -3,7 +3,7 @@ import { fieldAffectsData, fieldIsVirtual, tabHasName } from 'payload/shared';
3
3
  import toSnakeCase from 'to-snake-case';
4
4
  import buildQuery from '../queries/buildQuery.js';
5
5
  import { chainMethods } from './chainMethods.js';
6
- export const traverseFields = ({ _locales, adapter, currentArgs, currentTableName, depth, fields, joinQuery = {}, joins, locale, path, tablePath, topLevelArgs, topLevelTableName })=>{
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 })=>{
7
7
  fields.forEach((field)=>{
8
8
  if (fieldIsVirtual(field)) {
9
9
  return;
@@ -16,7 +16,7 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
16
16
  currentArgs.with[`${path}${field.name}`] = true;
17
17
  }
18
18
  }
19
- if (field.type === 'collapsible' || field.type === 'row') {
19
+ if (field.type === 'collapsible' || field.type === 'row' || field.type === 'tab' && !tabHasName(field)) {
20
20
  traverseFields({
21
21
  _locales,
22
22
  adapter,
@@ -27,30 +27,37 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
27
27
  joinQuery,
28
28
  joins,
29
29
  path,
30
+ select,
31
+ selectMode,
30
32
  tablePath,
31
33
  topLevelArgs,
32
- topLevelTableName
34
+ topLevelTableName,
35
+ withTabledFields
33
36
  });
34
37
  return;
35
38
  }
36
39
  if (field.type === 'tabs') {
37
- field.tabs.forEach((tab)=>{
38
- const tabPath = tabHasName(tab) ? `${path}${tab.name}_` : path;
39
- const tabTablePath = tabHasName(tab) ? `${tablePath}${toSnakeCase(tab.name)}_` : tablePath;
40
- traverseFields({
41
- _locales,
42
- adapter,
43
- currentArgs,
44
- currentTableName,
45
- depth,
46
- fields: tab.fields,
47
- joinQuery,
48
- joins,
49
- path: tabPath,
50
- tablePath: tabTablePath,
51
- topLevelArgs,
52
- topLevelTableName
53
- });
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
54
61
  });
55
62
  return;
56
63
  }
@@ -58,8 +65,17 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
58
65
  switch(field.type){
59
66
  case 'array':
60
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
+ }
61
74
  const withArray = {
62
- columns: {
75
+ columns: typeof arraySelect === 'object' ? {
76
+ id: true,
77
+ _order: true
78
+ } : {
63
79
  _parentID: false
64
80
  },
65
81
  orderBy: ({ _order }, { asc })=>[
@@ -68,10 +84,20 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
68
84
  with: {}
69
85
  };
70
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
+ }
71
95
  const arrayTableNameWithLocales = `${arrayTableName}${adapter.localesSuffix}`;
72
96
  if (adapter.tables[arrayTableNameWithLocales]) {
73
97
  withArray.with._locales = {
74
- columns: {
98
+ columns: typeof arraySelect === 'object' ? {
99
+ _locale: true
100
+ } : {
75
101
  id: false,
76
102
  _parentID: false
77
103
  },
@@ -88,15 +114,27 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
88
114
  fields: field.fields,
89
115
  joinQuery,
90
116
  path: '',
117
+ select: typeof arraySelect === 'object' ? arraySelect : undefined,
118
+ selectMode,
91
119
  tablePath: '',
92
120
  topLevelArgs,
93
- topLevelTableName
121
+ topLevelTableName,
122
+ withinLocalizedField: withinLocalizedField || field.localized,
123
+ withTabledFields
94
124
  });
125
+ if (typeof arraySelect === 'object' && withArray.with._locales && Object.keys(withArray.with._locales).length === 1) {
126
+ delete withArray.with._locales;
127
+ }
95
128
  break;
96
129
  }
97
130
  case 'select':
98
131
  {
99
132
  if (field.hasMany) {
133
+ if (select) {
134
+ if (selectMode === 'include' && !select[field.name] || selectMode === 'exclude' && select[field.name] === false) {
135
+ break;
136
+ }
137
+ }
100
138
  const withSelect = {
101
139
  columns: {
102
140
  id: false,
@@ -112,43 +150,95 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
112
150
  break;
113
151
  }
114
152
  case 'blocks':
115
- field.blocks.forEach((block)=>{
116
- const blockKey = `_blocks_${block.slug}`;
117
- if (!topLevelArgs[blockKey]) {
118
- const withBlock = {
119
- columns: {
120
- _parentID: false
121
- },
122
- orderBy: ({ _order }, { asc })=>[
123
- asc(_order)
124
- ],
125
- with: {}
126
- };
127
- const tableName = adapter.tableNameMap.get(`${topLevelTableName}_blocks_${toSnakeCase(block.slug)}`);
128
- if (adapter.tables[`${tableName}${adapter.localesSuffix}`]) {
129
- 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
+ ],
130
189
  with: {}
131
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
+ }
132
231
  }
133
- topLevelArgs.with[blockKey] = withBlock;
134
- traverseFields({
135
- _locales: withBlock.with._locales,
136
- adapter,
137
- currentArgs: withBlock,
138
- currentTableName: tableName,
139
- depth,
140
- fields: block.fields,
141
- joinQuery,
142
- path: '',
143
- tablePath: '',
144
- topLevelArgs,
145
- topLevelTableName
146
- });
147
- }
148
- });
149
- break;
232
+ });
233
+ break;
234
+ }
150
235
  case 'group':
236
+ case 'tab':
151
237
  {
238
+ const fieldSelect = select?.[field.name];
239
+ if (fieldSelect === false) {
240
+ break;
241
+ }
152
242
  traverseFields({
153
243
  _locales,
154
244
  adapter,
@@ -159,19 +249,61 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
159
249
  joinQuery,
160
250
  joins,
161
251
  path: `${path}${field.name}_`,
252
+ select: typeof fieldSelect === 'object' ? fieldSelect : undefined,
253
+ selectAllOnCurrentLevel: selectAllOnCurrentLevel || fieldSelect === true || selectMode === 'exclude' && typeof fieldSelect === 'undefined',
254
+ selectMode,
162
255
  tablePath: `${tablePath}${toSnakeCase(field.name)}_`,
163
256
  topLevelArgs,
164
- topLevelTableName
257
+ topLevelTableName,
258
+ versions,
259
+ withinLocalizedField: withinLocalizedField || field.localized,
260
+ withTabledFields
165
261
  });
166
262
  break;
167
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
+ }
168
293
  case 'join':
169
294
  {
170
295
  // when `joinsQuery` is false, do not join
171
296
  if (joinQuery === false) {
172
297
  break;
173
298
  }
174
- 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] || {};
175
307
  let limit = limitArg;
176
308
  if (limit !== 0) {
177
309
  // get an additional document and slice it later to determine if there is a next page
@@ -179,52 +311,89 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
179
311
  }
180
312
  const fields = adapter.payload.collections[field.collection].config.fields;
181
313
  const joinCollectionTableName = adapter.tableNameMap.get(toSnakeCase(field.collection));
182
- let joinTableName = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${field.localized && adapter.payload.config.localization ? adapter.localesSuffix : ''}`;
314
+ const joins = [];
315
+ const buildQueryResult = buildQuery({
316
+ adapter,
317
+ fields,
318
+ joins,
319
+ locale,
320
+ sort,
321
+ tableName: joinCollectionTableName,
322
+ where
323
+ });
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
183
329
  if (field.hasMany) {
184
- const db = adapter.drizzle;
330
+ const joinRelsCollectionTableName = `${joinCollectionTableName}${adapter.relationshipsSuffix}`;
185
331
  if (field.localized) {
186
- joinTableName = adapter.tableNameMap.get(toSnakeCase(field.collection));
332
+ joinLocalesCollectionTableName = joinRelsCollectionTableName;
187
333
  }
188
- const joinTable = `${joinTableName}${adapter.relationshipsSuffix}`;
189
- const joins = [
190
- {
191
- type: 'innerJoin',
192
- condition: and(eq(adapter.tables[joinTable].parent, adapter.tables[joinTableName].id), eq(sql.raw(`"${joinTable}"."${topLevelTableName}_id"`), adapter.tables[currentTableName].id), eq(adapter.tables[joinTable].path, field.on)),
193
- table: adapter.tables[joinTable]
194
- }
195
- ];
196
- const { orderBy, where: subQueryWhere } = buildQuery({
197
- adapter,
198
- fields,
199
- joins,
200
- locale,
201
- sort,
202
- tableName: joinCollectionTableName,
203
- where: {}
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]
204
344
  });
205
- const chainedMethods = [];
206
- joins.forEach(({ type, condition, table })=>{
207
- chainedMethods.push({
208
- args: [
209
- table,
210
- condition
211
- ],
212
- method: type ?? 'leftJoin'
345
+ } else {
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]
213
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'
214
373
  });
215
- const subQuery = chainMethods({
216
- methods: chainedMethods,
217
- query: db.select({
218
- id: adapter.tables[joinTableName].id,
219
- ...field.localized && {
220
- locale: adapter.tables[joinTable].locale
221
- }
222
- }).from(adapter.tables[joinTableName]).where(subQueryWhere).orderBy(orderBy.order(orderBy.column)).limit(limit)
374
+ });
375
+ if (limit !== 0) {
376
+ chainedMethods.push({
377
+ args: [
378
+ limit
379
+ ],
380
+ method: 'limit'
223
381
  });
224
- const columnName = `${path.replaceAll('.', '_')}${field.name}`;
225
- const jsonObjectSelect = field.localized ? sql.raw(`'_parentID', "id", '_locale', "locale"`) : sql.raw(`'id', "id"`);
226
- if (adapter.name === 'sqlite') {
227
- currentArgs.extras[columnName] = sql`
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`
228
397
  COALESCE((
229
398
  SELECT json_group_array(json_object(${jsonObjectSelect}))
230
399
  FROM (
@@ -232,8 +401,8 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
232
401
  ) AS ${sql.raw(`${columnName}_sub`)}
233
402
  ), '[]')
234
403
  `.as(columnName);
235
- } else {
236
- currentArgs.extras[columnName] = sql`
404
+ } else {
405
+ currentArgs.extras[columnName] = sql`
237
406
  COALESCE((
238
407
  SELECT json_agg(json_build_object(${jsonObjectSelect}))
239
408
  FROM (
@@ -241,41 +410,31 @@ export const traverseFields = ({ _locales, adapter, currentArgs, currentTableNam
241
410
  ) AS ${sql.raw(`${columnName}_sub`)}
242
411
  ), '[]'::json)
243
412
  `.as(columnName);
244
- }
245
- break;
246
- }
247
- const selectFields = {};
248
- const withJoin = {
249
- columns: selectFields
250
- };
251
- if (limit) {
252
- withJoin.limit = limit;
253
413
  }
254
- if (field.localized) {
255
- withJoin.columns._locale = true;
256
- withJoin.columns._parentID = true;
257
- } else {
258
- withJoin.columns.id = true;
259
- withJoin.columns.parent = true;
260
- }
261
- const { orderBy, where: joinWhere } = buildQuery({
262
- adapter,
263
- fields,
264
- joins,
265
- locale,
266
- sort,
267
- tableName: joinTableName,
268
- where
269
- });
270
- if (joinWhere) {
271
- withJoin.where = ()=>joinWhere;
272
- }
273
- withJoin.orderBy = orderBy.order(orderBy.column);
274
- currentArgs.with[`${path.replaceAll('.', '_')}${field.name}`] = withJoin;
275
414
  break;
276
415
  }
277
416
  default:
278
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
+ }
279
438
  break;
280
439
  }
281
440
  }