@payloadcms/drizzle 3.0.0-canary.483db21 → 3.0.0-canary.4eb1bfc

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 (284) hide show
  1. package/dist/count.d.ts.map +1 -1
  2. package/dist/count.js +1 -1
  3. package/dist/count.js.map +1 -1
  4. package/dist/createGlobalVersion.d.ts +1 -1
  5. package/dist/createGlobalVersion.d.ts.map +1 -1
  6. package/dist/createGlobalVersion.js +4 -2
  7. package/dist/createGlobalVersion.js.map +1 -1
  8. package/dist/createTableName.d.ts.map +1 -1
  9. package/dist/createTableName.js +6 -2
  10. package/dist/createTableName.js.map +1 -1
  11. package/dist/createVersion.d.ts +1 -1
  12. package/dist/createVersion.d.ts.map +1 -1
  13. package/dist/createVersion.js +22 -14
  14. package/dist/createVersion.js.map +1 -1
  15. package/dist/deleteOne.d.ts.map +1 -1
  16. package/dist/deleteOne.js +5 -3
  17. package/dist/deleteOne.js.map +1 -1
  18. package/dist/deleteVersions.js +1 -1
  19. package/dist/deleteVersions.js.map +1 -1
  20. package/dist/destroy.d.ts.map +1 -1
  21. package/dist/destroy.js +3 -1
  22. package/dist/destroy.js.map +1 -1
  23. package/dist/exports/postgres.d.ts +14 -0
  24. package/dist/exports/postgres.d.ts.map +1 -0
  25. package/dist/exports/postgres.js +15 -0
  26. package/dist/exports/postgres.js.map +1 -0
  27. package/dist/find/buildFindManyArgs.d.ts +13 -7
  28. package/dist/find/buildFindManyArgs.d.ts.map +1 -1
  29. package/dist/find/buildFindManyArgs.js +5 -1
  30. package/dist/find/buildFindManyArgs.js.map +1 -1
  31. package/dist/find/findMany.d.ts +1 -1
  32. package/dist/find/findMany.d.ts.map +1 -1
  33. package/dist/find/findMany.js +6 -3
  34. package/dist/find/findMany.js.map +1 -1
  35. package/dist/find/traverseFields.d.ts +7 -3
  36. package/dist/find/traverseFields.d.ts.map +1 -1
  37. package/dist/find/traverseFields.js +91 -16
  38. package/dist/find/traverseFields.js.map +1 -1
  39. package/dist/find.d.ts.map +1 -1
  40. package/dist/find.js +2 -1
  41. package/dist/find.js.map +1 -1
  42. package/dist/findGlobalVersions.js +1 -1
  43. package/dist/findGlobalVersions.js.map +1 -1
  44. package/dist/findMigrationDir.d.ts.map +1 -1
  45. package/dist/findMigrationDir.js +3 -1
  46. package/dist/findMigrationDir.js.map +1 -1
  47. package/dist/findOne.d.ts +1 -1
  48. package/dist/findOne.d.ts.map +1 -1
  49. package/dist/findOne.js +2 -1
  50. package/dist/findOne.js.map +1 -1
  51. package/dist/findVersions.js +1 -1
  52. package/dist/findVersions.js.map +1 -1
  53. package/dist/index.d.ts +2 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +2 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/migrate.js +2 -7
  58. package/dist/migrate.js.map +1 -1
  59. package/dist/migrateDown.d.ts.map +1 -1
  60. package/dist/migrateDown.js +1 -1
  61. package/dist/migrateDown.js.map +1 -1
  62. package/dist/migrateFresh.d.ts.map +1 -1
  63. package/dist/migrateFresh.js +1 -0
  64. package/dist/migrateFresh.js.map +1 -1
  65. package/dist/migrateRefresh.d.ts.map +1 -1
  66. package/dist/migrateRefresh.js +2 -1
  67. package/dist/migrateRefresh.js.map +1 -1
  68. package/dist/migrateReset.d.ts.map +1 -1
  69. package/dist/migrateReset.js +4 -2
  70. package/dist/migrateReset.js.map +1 -1
  71. package/dist/migrateStatus.js +0 -1
  72. package/dist/migrateStatus.js.map +1 -1
  73. package/dist/postgres/countDistinct.d.ts +3 -0
  74. package/dist/postgres/countDistinct.d.ts.map +1 -0
  75. package/dist/postgres/countDistinct.js +24 -0
  76. package/dist/postgres/countDistinct.js.map +1 -0
  77. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.d.ts +2 -0
  78. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.d.ts.map +1 -0
  79. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.js +16 -0
  80. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.js.map +1 -0
  81. package/dist/postgres/createJSONQuery/formatJSONPathSegment.d.ts +2 -0
  82. package/dist/postgres/createJSONQuery/formatJSONPathSegment.d.ts.map +1 -0
  83. package/dist/postgres/createJSONQuery/formatJSONPathSegment.js +5 -0
  84. package/dist/postgres/createJSONQuery/formatJSONPathSegment.js.map +1 -0
  85. package/dist/postgres/createJSONQuery/index.d.ts +10 -0
  86. package/dist/postgres/createJSONQuery/index.d.ts.map +1 -0
  87. package/dist/postgres/createJSONQuery/index.js +54 -0
  88. package/dist/postgres/createJSONQuery/index.js.map +1 -0
  89. package/dist/postgres/createMigration.d.ts +3 -0
  90. package/dist/postgres/createMigration.d.ts.map +1 -0
  91. package/dist/postgres/createMigration.js +92 -0
  92. package/dist/postgres/createMigration.js.map +1 -0
  93. package/dist/postgres/defaultSnapshot.d.ts +3 -0
  94. package/dist/postgres/defaultSnapshot.d.ts.map +1 -0
  95. package/dist/postgres/defaultSnapshot.js +17 -0
  96. package/dist/postgres/defaultSnapshot.js.map +1 -0
  97. package/dist/postgres/deleteWhere.d.ts +3 -0
  98. package/dist/postgres/deleteWhere.d.ts.map +1 -0
  99. package/dist/postgres/deleteWhere.js +6 -0
  100. package/dist/postgres/deleteWhere.js.map +1 -0
  101. package/dist/postgres/dropDatabase.d.ts +3 -0
  102. package/dist/postgres/dropDatabase.d.ts.map +1 -0
  103. package/dist/postgres/dropDatabase.js +9 -0
  104. package/dist/postgres/dropDatabase.js.map +1 -0
  105. package/dist/postgres/execute.d.ts +3 -0
  106. package/dist/postgres/execute.d.ts.map +1 -0
  107. package/dist/postgres/execute.js +11 -0
  108. package/dist/postgres/execute.js.map +1 -0
  109. package/dist/postgres/getMigrationTemplate.d.ts +4 -0
  110. package/dist/postgres/getMigrationTemplate.d.ts.map +1 -0
  111. package/dist/postgres/getMigrationTemplate.js +13 -0
  112. package/dist/postgres/getMigrationTemplate.js.map +1 -0
  113. package/dist/postgres/init.d.ts +3 -0
  114. package/dist/postgres/init.d.ts.map +1 -0
  115. package/dist/postgres/init.js +104 -0
  116. package/dist/postgres/init.js.map +1 -0
  117. package/dist/postgres/insert.d.ts +3 -0
  118. package/dist/postgres/insert.d.ts.map +1 -0
  119. package/dist/postgres/insert.js +12 -0
  120. package/dist/postgres/insert.js.map +1 -0
  121. package/dist/postgres/requireDrizzleKit.d.ts +3 -0
  122. package/dist/postgres/requireDrizzleKit.d.ts.map +1 -0
  123. package/dist/postgres/requireDrizzleKit.js +5 -0
  124. package/dist/postgres/requireDrizzleKit.js.map +1 -0
  125. package/dist/postgres/schema/build.d.ts +40 -0
  126. package/dist/postgres/schema/build.d.ts.map +1 -0
  127. package/dist/postgres/schema/build.js +378 -0
  128. package/dist/postgres/schema/build.js.map +1 -0
  129. package/dist/postgres/schema/createIndex.d.ts +12 -0
  130. package/dist/postgres/schema/createIndex.d.ts.map +1 -0
  131. package/dist/postgres/schema/createIndex.js +20 -0
  132. package/dist/postgres/schema/createIndex.js.map +1 -0
  133. package/dist/postgres/schema/idToUUID.d.ts +3 -0
  134. package/dist/postgres/schema/idToUUID.d.ts.map +1 -0
  135. package/dist/postgres/schema/idToUUID.js +11 -0
  136. package/dist/postgres/schema/idToUUID.js.map +1 -0
  137. package/dist/postgres/schema/parentIDColumnMap.d.ts +4 -0
  138. package/dist/postgres/schema/parentIDColumnMap.d.ts.map +1 -0
  139. package/dist/postgres/schema/parentIDColumnMap.js +9 -0
  140. package/dist/postgres/schema/parentIDColumnMap.js.map +1 -0
  141. package/dist/postgres/schema/setColumnID.d.ts +11 -0
  142. package/dist/postgres/schema/setColumnID.d.ts.map +1 -0
  143. package/dist/postgres/schema/setColumnID.js +24 -0
  144. package/dist/postgres/schema/setColumnID.js.map +1 -0
  145. package/dist/postgres/schema/traverseFields.d.ts +40 -0
  146. package/dist/postgres/schema/traverseFields.d.ts.map +1 -0
  147. package/dist/postgres/schema/traverseFields.js +733 -0
  148. package/dist/postgres/schema/traverseFields.js.map +1 -0
  149. package/dist/postgres/schema/withDefault.d.ts +4 -0
  150. package/dist/postgres/schema/withDefault.d.ts.map +1 -0
  151. package/dist/postgres/schema/withDefault.js +12 -0
  152. package/dist/postgres/schema/withDefault.js.map +1 -0
  153. package/dist/postgres/types.d.ts +126 -0
  154. package/dist/postgres/types.d.ts.map +1 -0
  155. package/dist/postgres/types.js +3 -0
  156. package/dist/postgres/types.js.map +1 -0
  157. package/dist/queries/buildAndOrConditions.d.ts +1 -1
  158. package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
  159. package/dist/queries/buildAndOrConditions.js +2 -4
  160. package/dist/queries/buildAndOrConditions.js.map +1 -1
  161. package/dist/queries/buildOrderBy.d.ts +18 -0
  162. package/dist/queries/buildOrderBy.d.ts.map +1 -0
  163. package/dist/queries/buildOrderBy.js +52 -0
  164. package/dist/queries/buildOrderBy.js.map +1 -0
  165. package/dist/queries/buildQuery.d.ts +4 -4
  166. package/dist/queries/buildQuery.d.ts.map +1 -1
  167. package/dist/queries/buildQuery.js +12 -47
  168. package/dist/queries/buildQuery.js.map +1 -1
  169. package/dist/queries/getTableColumnFromPath.d.ts +8 -3
  170. package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
  171. package/dist/queries/getTableColumnFromPath.js +73 -23
  172. package/dist/queries/getTableColumnFromPath.js.map +1 -1
  173. package/dist/queries/operatorMap.d.ts.map +1 -1
  174. package/dist/queries/operatorMap.js.map +1 -1
  175. package/dist/queries/parseParams.d.ts +1 -1
  176. package/dist/queries/parseParams.d.ts.map +1 -1
  177. package/dist/queries/parseParams.js +52 -6
  178. package/dist/queries/parseParams.js.map +1 -1
  179. package/dist/queries/sanitizeQueryValue.d.ts +12 -1
  180. package/dist/queries/sanitizeQueryValue.d.ts.map +1 -1
  181. package/dist/queries/sanitizeQueryValue.js +77 -21
  182. package/dist/queries/sanitizeQueryValue.js.map +1 -1
  183. package/dist/queries/selectDistinct.d.ts +3 -4
  184. package/dist/queries/selectDistinct.d.ts.map +1 -1
  185. package/dist/queries/selectDistinct.js.map +1 -1
  186. package/dist/queryDrafts.d.ts.map +1 -1
  187. package/dist/queryDrafts.js +1 -2
  188. package/dist/queryDrafts.js.map +1 -1
  189. package/dist/transactions/beginTransaction.d.ts.map +1 -1
  190. package/dist/transactions/beginTransaction.js +5 -1
  191. package/dist/transactions/beginTransaction.js.map +1 -1
  192. package/dist/transactions/commitTransaction.d.ts.map +1 -1
  193. package/dist/transactions/commitTransaction.js +3 -1
  194. package/dist/transactions/commitTransaction.js.map +1 -1
  195. package/dist/transform/read/hasManyNumber.d.ts +2 -1
  196. package/dist/transform/read/hasManyNumber.d.ts.map +1 -1
  197. package/dist/transform/read/hasManyNumber.js +12 -2
  198. package/dist/transform/read/hasManyNumber.js.map +1 -1
  199. package/dist/transform/read/hasManyText.d.ts +2 -1
  200. package/dist/transform/read/hasManyText.d.ts.map +1 -1
  201. package/dist/transform/read/hasManyText.js +12 -2
  202. package/dist/transform/read/hasManyText.js.map +1 -1
  203. package/dist/transform/read/index.d.ts +3 -2
  204. package/dist/transform/read/index.d.ts.map +1 -1
  205. package/dist/transform/read/index.js +3 -2
  206. package/dist/transform/read/index.js.map +1 -1
  207. package/dist/transform/read/relationship.d.ts +2 -1
  208. package/dist/transform/read/relationship.d.ts.map +1 -1
  209. package/dist/transform/read/relationship.js +15 -6
  210. package/dist/transform/read/relationship.js.map +1 -1
  211. package/dist/transform/read/traverseFields.d.ts +10 -2
  212. package/dist/transform/read/traverseFields.d.ts.map +1 -1
  213. package/dist/transform/read/traverseFields.js +163 -55
  214. package/dist/transform/read/traverseFields.js.map +1 -1
  215. package/dist/transform/write/array.d.ts +6 -1
  216. package/dist/transform/write/array.d.ts.map +1 -1
  217. package/dist/transform/write/array.js +7 -3
  218. package/dist/transform/write/array.js.map +1 -1
  219. package/dist/transform/write/blocks.d.ts +8 -3
  220. package/dist/transform/write/blocks.d.ts.map +1 -1
  221. package/dist/transform/write/blocks.js +19 -7
  222. package/dist/transform/write/blocks.js.map +1 -1
  223. package/dist/transform/write/index.d.ts.map +1 -1
  224. package/dist/transform/write/index.js +1 -1
  225. package/dist/transform/write/index.js.map +1 -1
  226. package/dist/transform/write/relationships.d.ts.map +1 -1
  227. package/dist/transform/write/relationships.js +6 -2
  228. package/dist/transform/write/relationships.js.map +1 -1
  229. package/dist/transform/write/selects.d.ts.map +1 -1
  230. package/dist/transform/write/selects.js +1 -1
  231. package/dist/transform/write/selects.js.map +1 -1
  232. package/dist/transform/write/traverseFields.d.ts +6 -1
  233. package/dist/transform/write/traverseFields.d.ts.map +1 -1
  234. package/dist/transform/write/traverseFields.js +46 -17
  235. package/dist/transform/write/traverseFields.js.map +1 -1
  236. package/dist/types.d.ts +1 -1
  237. package/dist/types.d.ts.map +1 -1
  238. package/dist/types.js.map +1 -1
  239. package/dist/update.d.ts.map +1 -1
  240. package/dist/update.js +3 -2
  241. package/dist/update.js.map +1 -1
  242. package/dist/updateGlobalVersion.js +2 -2
  243. package/dist/updateGlobalVersion.js.map +1 -1
  244. package/dist/updateVersion.js +2 -2
  245. package/dist/updateVersion.js.map +1 -1
  246. package/dist/upsertRow/deleteExistingRowsByPath.d.ts.map +1 -1
  247. package/dist/upsertRow/deleteExistingRowsByPath.js +6 -2
  248. package/dist/upsertRow/deleteExistingRowsByPath.js.map +1 -1
  249. package/dist/upsertRow/index.d.ts +1 -1
  250. package/dist/upsertRow/index.d.ts.map +1 -1
  251. package/dist/upsertRow/index.js +50 -12
  252. package/dist/upsertRow/index.js.map +1 -1
  253. package/dist/upsertRow/insertArrays.d.ts.map +1 -1
  254. package/dist/upsertRow/insertArrays.js +5 -2
  255. package/dist/upsertRow/insertArrays.js.map +1 -1
  256. package/dist/upsertRow/types.d.ts +8 -5
  257. package/dist/upsertRow/types.d.ts.map +1 -1
  258. package/dist/upsertRow/types.js.map +1 -1
  259. package/dist/utilities/createBlocksMap.d.ts.map +1 -1
  260. package/dist/utilities/createBlocksMap.js +4 -2
  261. package/dist/utilities/createBlocksMap.js.map +1 -1
  262. package/dist/utilities/createRelationshipMap.d.ts.map +1 -1
  263. package/dist/utilities/createRelationshipMap.js +3 -1
  264. package/dist/utilities/createRelationshipMap.js.map +1 -1
  265. package/dist/utilities/executeSchemaHooks.d.ts +24 -0
  266. package/dist/utilities/executeSchemaHooks.d.ts.map +1 -0
  267. package/dist/utilities/executeSchemaHooks.js +21 -0
  268. package/dist/utilities/executeSchemaHooks.js.map +1 -0
  269. package/dist/utilities/extendDrizzleTable.d.ts +19 -0
  270. package/dist/utilities/extendDrizzleTable.d.ts.map +1 -0
  271. package/dist/utilities/extendDrizzleTable.js +38 -0
  272. package/dist/utilities/extendDrizzleTable.js.map +1 -0
  273. package/dist/utilities/getCollectionIdType.d.ts +7 -0
  274. package/dist/utilities/getCollectionIdType.d.ts.map +1 -0
  275. package/dist/utilities/getCollectionIdType.js +11 -0
  276. package/dist/utilities/getCollectionIdType.js.map +1 -0
  277. package/dist/utilities/hasLocalesTable.d.ts.map +1 -1
  278. package/dist/utilities/hasLocalesTable.js +12 -4
  279. package/dist/utilities/hasLocalesTable.js.map +1 -1
  280. package/dist/utilities/isPolymorphicRelationship.d.ts +6 -0
  281. package/dist/utilities/isPolymorphicRelationship.d.ts.map +1 -0
  282. package/dist/utilities/isPolymorphicRelationship.js +5 -0
  283. package/dist/utilities/isPolymorphicRelationship.js.map +1 -0
  284. package/package.json +16 -7
@@ -1,10 +1,11 @@
1
- /* eslint-disable no-await-in-loop */ import { and, isNotNull, isNull, ne, notInArray, or, sql } from 'drizzle-orm';
1
+ import { and, isNotNull, isNull, ne, notInArray, or, sql } from 'drizzle-orm';
2
+ import { PgUUID } from 'drizzle-orm/pg-core';
2
3
  import { QueryError } from 'payload';
3
4
  import { validOperators } from 'payload/shared';
4
5
  import { buildAndOrConditions } from './buildAndOrConditions.js';
5
6
  import { getTableColumnFromPath } from './getTableColumnFromPath.js';
6
7
  import { sanitizeQueryValue } from './sanitizeQueryValue.js';
7
- export async function parseParams({ adapter, fields, joins, locale, selectFields, tableName, where }) {
8
+ export function parseParams({ adapter, fields, joins, locale, selectFields, tableName, where }) {
8
9
  let result;
9
10
  const constraints = [];
10
11
  if (typeof where === 'object' && Object.keys(where).length > 0) {
@@ -19,7 +20,7 @@ export async function parseParams({ adapter, fields, joins, locale, selectFields
19
20
  conditionOperator = or;
20
21
  }
21
22
  if (Array.isArray(condition)) {
22
- const builtConditions = await buildAndOrConditions({
23
+ const builtConditions = buildAndOrConditions({
23
24
  adapter,
24
25
  fields,
25
26
  joins,
@@ -40,7 +41,7 @@ export async function parseParams({ adapter, fields, joins, locale, selectFields
40
41
  for (let operator of Object.keys(pathOperators)){
41
42
  if (validOperators.includes(operator)) {
42
43
  const val = where[relationOrPath][operator];
43
- const { columnName, constraints: queryConstraints, field, getNotNullColumnByValue, pathSegments, rawColumn, table } = getTableColumnFromPath({
44
+ const { columnName, columns, constraints: queryConstraints, field, getNotNullColumnByValue, pathSegments, rawColumn, table } = getTableColumnFromPath({
44
45
  adapter,
45
46
  collectionPath: relationOrPath,
46
47
  fields,
@@ -91,7 +92,12 @@ export async function parseParams({ adapter, fields, joins, locale, selectFields
91
92
  wildcard: ''
92
93
  },
93
94
  exists: {
94
- operator: val === true ? 'is not null' : 'is null'
95
+ operator: val === true ? 'is not null' : 'is null',
96
+ wildcard: ''
97
+ },
98
+ in: {
99
+ operator: 'in',
100
+ wildcard: ''
95
101
  },
96
102
  like: {
97
103
  operator: 'like',
@@ -100,11 +106,24 @@ export async function parseParams({ adapter, fields, joins, locale, selectFields
100
106
  not_equals: {
101
107
  operator: '<>',
102
108
  wildcard: ''
109
+ },
110
+ not_in: {
111
+ operator: 'not in',
112
+ wildcard: ''
103
113
  }
104
114
  };
105
115
  let formattedValue = val;
106
116
  if (adapter.name === 'sqlite' && operator === 'equals' && !isNaN(val)) {
107
117
  formattedValue = val;
118
+ } else if ([
119
+ 'in',
120
+ 'not_in'
121
+ ].includes(operator) && Array.isArray(val)) {
122
+ if (adapter.name === 'sqlite') {
123
+ formattedValue = `(${val.map((v)=>`${v}`).join(',')})`;
124
+ } else {
125
+ formattedValue = `(${val.map((v)=>`'${v}'`).join(', ')})`;
126
+ }
108
127
  } else {
109
128
  formattedValue = `'${operatorKeys[operator].wildcard}${val}${operatorKeys[operator].wildcard}'`;
110
129
  }
@@ -136,7 +155,9 @@ export async function parseParams({ adapter, fields, joins, locale, selectFields
136
155
  }
137
156
  const sanitizedQueryValue = sanitizeQueryValue({
138
157
  adapter,
158
+ columns,
139
159
  field,
160
+ isUUID: table?.[columnName] instanceof PgUUID,
140
161
  operator,
141
162
  relationOrPath,
142
163
  val
@@ -144,7 +165,32 @@ export async function parseParams({ adapter, fields, joins, locale, selectFields
144
165
  if (sanitizedQueryValue === null) {
145
166
  break;
146
167
  }
147
- const { operator: queryOperator, value: queryValue } = sanitizedQueryValue;
168
+ const { columns: queryColumns, operator: queryOperator, value: queryValue } = sanitizedQueryValue;
169
+ // Handle polymorphic relationships by value
170
+ if (queryColumns) {
171
+ if (!queryColumns.length) {
172
+ break;
173
+ }
174
+ let wrapOperator = or;
175
+ if (queryValue === null && [
176
+ 'equals',
177
+ 'not_equals'
178
+ ].includes(operator)) {
179
+ if (operator === 'equals') {
180
+ wrapOperator = and;
181
+ }
182
+ constraints.push(wrapOperator(...queryColumns.map(({ rawColumn })=>operator === 'equals' ? isNull(rawColumn) : isNotNull(rawColumn))));
183
+ break;
184
+ }
185
+ if ([
186
+ 'not_equals',
187
+ 'not_in'
188
+ ].includes(operator)) {
189
+ wrapOperator = and;
190
+ }
191
+ constraints.push(wrapOperator(...queryColumns.map(({ rawColumn, value })=>adapter.operators[queryOperator](rawColumn, value))));
192
+ break;
193
+ }
148
194
  if (queryOperator === 'not_equals' && queryValue !== null) {
149
195
  constraints.push(or(isNull(rawColumn || table[columnName]), /* eslint-disable @typescript-eslint/no-explicit-any */ ne(rawColumn || table[columnName], queryValue)));
150
196
  break;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/queries/parseParams.ts"],"sourcesContent":["/* eslint-disable no-await-in-loop */\nimport type { SQL } from 'drizzle-orm'\nimport type { Field, Operator, Where } from 'payload'\n\nimport { and, isNotNull, isNull, ne, notInArray, or, sql } from 'drizzle-orm'\nimport { QueryError } from 'payload'\nimport { validOperators } from 'payload/shared'\n\nimport type { DrizzleAdapter, GenericColumn } from '../types.js'\nimport type { BuildQueryJoinAliases } from './buildQuery.js'\n\nimport { buildAndOrConditions } from './buildAndOrConditions.js'\nimport { getTableColumnFromPath } from './getTableColumnFromPath.js'\nimport { sanitizeQueryValue } from './sanitizeQueryValue.js'\n\ntype Args = {\n adapter: DrizzleAdapter\n fields: Field[]\n joins: BuildQueryJoinAliases\n locale: string\n selectFields: Record<string, GenericColumn>\n tableName: string\n where: Where\n}\n\nexport async function parseParams({\n adapter,\n fields,\n joins,\n locale,\n selectFields,\n tableName,\n where,\n}: Args): Promise<SQL> {\n let result: SQL\n const constraints: SQL[] = []\n\n if (typeof where === 'object' && Object.keys(where).length > 0) {\n // We need to determine if the whereKey is an AND, OR, or a schema path\n for (const relationOrPath of Object.keys(where)) {\n if (relationOrPath) {\n const condition = where[relationOrPath]\n let conditionOperator: typeof and | typeof or\n if (relationOrPath.toLowerCase() === 'and') {\n conditionOperator = and\n } else if (relationOrPath.toLowerCase() === 'or') {\n conditionOperator = or\n }\n if (Array.isArray(condition)) {\n const builtConditions = await buildAndOrConditions({\n adapter,\n fields,\n joins,\n locale,\n selectFields,\n tableName,\n where: condition,\n })\n if (builtConditions.length > 0) {\n result = conditionOperator(...builtConditions)\n }\n } else {\n // It's a path - and there can be multiple comparisons on a single path.\n // For example - title like 'test' and title not equal to 'tester'\n // So we need to loop on keys again here to handle each operator independently\n const pathOperators = where[relationOrPath]\n if (typeof pathOperators === 'object') {\n for (let operator of Object.keys(pathOperators)) {\n if (validOperators.includes(operator as Operator)) {\n const val = where[relationOrPath][operator]\n const {\n columnName,\n constraints: queryConstraints,\n field,\n getNotNullColumnByValue,\n pathSegments,\n rawColumn,\n table,\n } = getTableColumnFromPath({\n adapter,\n collectionPath: relationOrPath,\n fields,\n joins,\n locale,\n pathSegments: relationOrPath.replace(/__/g, '.').split('.'),\n selectFields,\n tableName,\n value: val,\n })\n\n queryConstraints.forEach(({ columnName: col, table: constraintTable, value }) => {\n if (typeof value === 'string' && value.indexOf('%') > -1) {\n constraints.push(adapter.operators.like(constraintTable[col], value))\n } else {\n constraints.push(adapter.operators.equals(constraintTable[col], value))\n }\n })\n\n if (\n ['json', 'richText'].includes(field.type) &&\n Array.isArray(pathSegments) &&\n pathSegments.length > 1\n ) {\n const segments = pathSegments.slice(1)\n segments.unshift(table[columnName].name)\n\n if (field.type === 'richText') {\n // use the table name from the nearest join to handle blocks, arrays, etc. or use the tableName arg\n const jsonTable =\n joins.length === 0\n ? tableName\n : joins[joins.length - 1].table[\n Object.getOwnPropertySymbols(joins[joins.length - 1].table)[0]\n ]\n const jsonQuery = adapter.createJSONQuery({\n operator,\n pathSegments: segments,\n table: jsonTable,\n treatAsArray: ['children'],\n treatRootAsArray: true,\n value: val,\n })\n\n constraints.push(sql.raw(jsonQuery))\n break\n }\n\n const jsonQuery = adapter.convertPathToJSONTraversal(pathSegments)\n const operatorKeys = {\n contains: { operator: 'like', wildcard: '%' },\n equals: { operator: '=', wildcard: '' },\n exists: { operator: val === true ? 'is not null' : 'is null' },\n like: { operator: 'like', wildcard: '%' },\n not_equals: { operator: '<>', wildcard: '' },\n }\n\n let formattedValue = val\n if (adapter.name === 'sqlite' && operator === 'equals' && !isNaN(val)) {\n formattedValue = val\n } else {\n formattedValue = `'${operatorKeys[operator].wildcard}${val}${operatorKeys[operator].wildcard}'`\n }\n if (operator === 'exists') {\n formattedValue = ''\n }\n\n constraints.push(\n sql.raw(\n `${table[columnName].name}${jsonQuery} ${operatorKeys[operator].operator} ${formattedValue}`,\n ),\n )\n\n break\n }\n\n if (getNotNullColumnByValue) {\n const columnName = getNotNullColumnByValue(val)\n if (columnName) {\n constraints.push(isNotNull(table[columnName]))\n } else {\n throw new QueryError([{ path: relationOrPath }])\n }\n break\n }\n\n if (\n operator === 'like' &&\n (field.type === 'number' || table[columnName].columnType === 'PgUUID')\n ) {\n operator = 'equals'\n }\n\n if (operator === 'like') {\n constraints.push(\n and(\n ...val\n .split(' ')\n .map((word) => adapter.operators.like(table[columnName], `%${word}%`)),\n ),\n )\n break\n }\n\n const sanitizedQueryValue = sanitizeQueryValue({\n adapter,\n field,\n operator,\n relationOrPath,\n val,\n })\n\n if (sanitizedQueryValue === null) {\n break\n }\n\n const { operator: queryOperator, value: queryValue } = sanitizedQueryValue\n\n if (queryOperator === 'not_equals' && queryValue !== null) {\n constraints.push(\n or(\n isNull(rawColumn || table[columnName]),\n /* eslint-disable @typescript-eslint/no-explicit-any */\n ne<any>(rawColumn || table[columnName], queryValue),\n ),\n )\n break\n }\n\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n Array.isArray(queryValue) &&\n operator === 'not_in'\n ) {\n constraints.push(\n sql`(${notInArray(table[columnName], queryValue)} OR\n ${table[columnName]}\n IS\n NULL)`,\n )\n\n break\n }\n\n if (operator === 'equals' && queryValue === null) {\n constraints.push(isNull(rawColumn || table[columnName]))\n break\n }\n\n if (operator === 'not_equals' && queryValue === null) {\n constraints.push(isNotNull(rawColumn || table[columnName]))\n break\n }\n\n constraints.push(\n adapter.operators[queryOperator](rawColumn || table[columnName], queryValue),\n )\n }\n }\n }\n }\n }\n }\n }\n if (constraints.length > 0) {\n if (result) {\n result = and(result, ...constraints)\n } else {\n result = and(...constraints)\n }\n }\n if (constraints.length === 1 && !result) {\n ;[result] = constraints\n }\n\n return result\n}\n"],"names":["and","isNotNull","isNull","ne","notInArray","or","sql","QueryError","validOperators","buildAndOrConditions","getTableColumnFromPath","sanitizeQueryValue","parseParams","adapter","fields","joins","locale","selectFields","tableName","where","result","constraints","Object","keys","length","relationOrPath","condition","conditionOperator","toLowerCase","Array","isArray","builtConditions","pathOperators","operator","includes","val","columnName","queryConstraints","field","getNotNullColumnByValue","pathSegments","rawColumn","table","collectionPath","replace","split","value","forEach","col","constraintTable","indexOf","push","operators","like","equals","type","segments","slice","unshift","name","jsonTable","getOwnPropertySymbols","jsonQuery","createJSONQuery","treatAsArray","treatRootAsArray","raw","convertPathToJSONTraversal","operatorKeys","contains","wildcard","exists","not_equals","formattedValue","isNaN","path","columnType","map","word","sanitizedQueryValue","queryOperator","queryValue"],"mappings":"AAAA,mCAAmC,GAInC,SAASA,GAAG,EAAEC,SAAS,EAAEC,MAAM,EAAEC,EAAE,EAAEC,UAAU,EAAEC,EAAE,EAAEC,GAAG,QAAQ,cAAa;AAC7E,SAASC,UAAU,QAAQ,UAAS;AACpC,SAASC,cAAc,QAAQ,iBAAgB;AAK/C,SAASC,oBAAoB,QAAQ,4BAA2B;AAChE,SAASC,sBAAsB,QAAQ,8BAA6B;AACpE,SAASC,kBAAkB,QAAQ,0BAAyB;AAY5D,OAAO,eAAeC,YAAY,EAChCC,OAAO,EACPC,MAAM,EACNC,KAAK,EACLC,MAAM,EACNC,YAAY,EACZC,SAAS,EACTC,KAAK,EACA;IACL,IAAIC;IACJ,MAAMC,cAAqB,EAAE;IAE7B,IAAI,OAAOF,UAAU,YAAYG,OAAOC,IAAI,CAACJ,OAAOK,MAAM,GAAG,GAAG;QAC9D,uEAAuE;QACvE,KAAK,MAAMC,kBAAkBH,OAAOC,IAAI,CAACJ,OAAQ;YAC/C,IAAIM,gBAAgB;gBAClB,MAAMC,YAAYP,KAAK,CAACM,eAAe;gBACvC,IAAIE;gBACJ,IAAIF,eAAeG,WAAW,OAAO,OAAO;oBAC1CD,oBAAoB3B;gBACtB,OAAO,IAAIyB,eAAeG,WAAW,OAAO,MAAM;oBAChDD,oBAAoBtB;gBACtB;gBACA,IAAIwB,MAAMC,OAAO,CAACJ,YAAY;oBAC5B,MAAMK,kBAAkB,MAAMtB,qBAAqB;wBACjDI;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC;wBACAC,OAAOO;oBACT;oBACA,IAAIK,gBAAgBP,MAAM,GAAG,GAAG;wBAC9BJ,SAASO,qBAAqBI;oBAChC;gBACF,OAAO;oBACL,wEAAwE;oBACxE,kEAAkE;oBAClE,8EAA8E;oBAC9E,MAAMC,gBAAgBb,KAAK,CAACM,eAAe;oBAC3C,IAAI,OAAOO,kBAAkB,UAAU;wBACrC,KAAK,IAAIC,YAAYX,OAAOC,IAAI,CAACS,eAAgB;4BAC/C,IAAIxB,eAAe0B,QAAQ,CAACD,WAAuB;gCACjD,MAAME,MAAMhB,KAAK,CAACM,eAAe,CAACQ,SAAS;gCAC3C,MAAM,EACJG,UAAU,EACVf,aAAagB,gBAAgB,EAC7BC,KAAK,EACLC,uBAAuB,EACvBC,YAAY,EACZC,SAAS,EACTC,KAAK,EACN,GAAGhC,uBAAuB;oCACzBG;oCACA8B,gBAAgBlB;oCAChBX;oCACAC;oCACAC;oCACAwB,cAAcf,eAAemB,OAAO,CAAC,OAAO,KAAKC,KAAK,CAAC;oCACvD5B;oCACAC;oCACA4B,OAAOX;gCACT;gCAEAE,iBAAiBU,OAAO,CAAC,CAAC,EAAEX,YAAYY,GAAG,EAAEN,OAAOO,eAAe,EAAEH,KAAK,EAAE;oCAC1E,IAAI,OAAOA,UAAU,YAAYA,MAAMI,OAAO,CAAC,OAAO,CAAC,GAAG;wCACxD7B,YAAY8B,IAAI,CAACtC,QAAQuC,SAAS,CAACC,IAAI,CAACJ,eAAe,CAACD,IAAI,EAAEF;oCAChE,OAAO;wCACLzB,YAAY8B,IAAI,CAACtC,QAAQuC,SAAS,CAACE,MAAM,CAACL,eAAe,CAACD,IAAI,EAAEF;oCAClE;gCACF;gCAEA,IACE;oCAAC;oCAAQ;iCAAW,CAACZ,QAAQ,CAACI,MAAMiB,IAAI,KACxC1B,MAAMC,OAAO,CAACU,iBACdA,aAAahB,MAAM,GAAG,GACtB;oCACA,MAAMgC,WAAWhB,aAAaiB,KAAK,CAAC;oCACpCD,SAASE,OAAO,CAAChB,KAAK,CAACN,WAAW,CAACuB,IAAI;oCAEvC,IAAIrB,MAAMiB,IAAI,KAAK,YAAY;wCAC7B,mGAAmG;wCACnG,MAAMK,YACJ7C,MAAMS,MAAM,KAAK,IACbN,YACAH,KAAK,CAACA,MAAMS,MAAM,GAAG,EAAE,CAACkB,KAAK,CAC3BpB,OAAOuC,qBAAqB,CAAC9C,KAAK,CAACA,MAAMS,MAAM,GAAG,EAAE,CAACkB,KAAK,CAAC,CAAC,EAAE,CAC/D;wCACP,MAAMoB,YAAYjD,QAAQkD,eAAe,CAAC;4CACxC9B;4CACAO,cAAcgB;4CACdd,OAAOkB;4CACPI,cAAc;gDAAC;6CAAW;4CAC1BC,kBAAkB;4CAClBnB,OAAOX;wCACT;wCAEAd,YAAY8B,IAAI,CAAC7C,IAAI4D,GAAG,CAACJ;wCACzB;oCACF;oCAEA,MAAMA,YAAYjD,QAAQsD,0BAA0B,CAAC3B;oCACrD,MAAM4B,eAAe;wCACnBC,UAAU;4CAAEpC,UAAU;4CAAQqC,UAAU;wCAAI;wCAC5ChB,QAAQ;4CAAErB,UAAU;4CAAKqC,UAAU;wCAAG;wCACtCC,QAAQ;4CAAEtC,UAAUE,QAAQ,OAAO,gBAAgB;wCAAU;wCAC7DkB,MAAM;4CAAEpB,UAAU;4CAAQqC,UAAU;wCAAI;wCACxCE,YAAY;4CAAEvC,UAAU;4CAAMqC,UAAU;wCAAG;oCAC7C;oCAEA,IAAIG,iBAAiBtC;oCACrB,IAAItB,QAAQ8C,IAAI,KAAK,YAAY1B,aAAa,YAAY,CAACyC,MAAMvC,MAAM;wCACrEsC,iBAAiBtC;oCACnB,OAAO;wCACLsC,iBAAiB,CAAC,CAAC,EAAEL,YAAY,CAACnC,SAAS,CAACqC,QAAQ,CAAC,EAAEnC,IAAI,EAAEiC,YAAY,CAACnC,SAAS,CAACqC,QAAQ,CAAC,CAAC,CAAC;oCACjG;oCACA,IAAIrC,aAAa,UAAU;wCACzBwC,iBAAiB;oCACnB;oCAEApD,YAAY8B,IAAI,CACd7C,IAAI4D,GAAG,CACL,CAAC,EAAExB,KAAK,CAACN,WAAW,CAACuB,IAAI,CAAC,EAAEG,UAAU,CAAC,EAAEM,YAAY,CAACnC,SAAS,CAACA,QAAQ,CAAC,CAAC,EAAEwC,eAAe,CAAC;oCAIhG;gCACF;gCAEA,IAAIlC,yBAAyB;oCAC3B,MAAMH,aAAaG,wBAAwBJ;oCAC3C,IAAIC,YAAY;wCACdf,YAAY8B,IAAI,CAAClD,UAAUyC,KAAK,CAACN,WAAW;oCAC9C,OAAO;wCACL,MAAM,IAAI7B,WAAW;4CAAC;gDAAEoE,MAAMlD;4CAAe;yCAAE;oCACjD;oCACA;gCACF;gCAEA,IACEQ,aAAa,UACZK,CAAAA,MAAMiB,IAAI,KAAK,YAAYb,KAAK,CAACN,WAAW,CAACwC,UAAU,KAAK,QAAO,GACpE;oCACA3C,WAAW;gCACb;gCAEA,IAAIA,aAAa,QAAQ;oCACvBZ,YAAY8B,IAAI,CACdnD,OACKmC,IACAU,KAAK,CAAC,KACNgC,GAAG,CAAC,CAACC,OAASjE,QAAQuC,SAAS,CAACC,IAAI,CAACX,KAAK,CAACN,WAAW,EAAE,CAAC,CAAC,EAAE0C,KAAK,CAAC,CAAC;oCAG1E;gCACF;gCAEA,MAAMC,sBAAsBpE,mBAAmB;oCAC7CE;oCACAyB;oCACAL;oCACAR;oCACAU;gCACF;gCAEA,IAAI4C,wBAAwB,MAAM;oCAChC;gCACF;gCAEA,MAAM,EAAE9C,UAAU+C,aAAa,EAAElC,OAAOmC,UAAU,EAAE,GAAGF;gCAEvD,IAAIC,kBAAkB,gBAAgBC,eAAe,MAAM;oCACzD5D,YAAY8B,IAAI,CACd9C,GACEH,OAAOuC,aAAaC,KAAK,CAACN,WAAW,GACrC,qDAAqD,GACrDjC,GAAQsC,aAAaC,KAAK,CAACN,WAAW,EAAE6C;oCAG5C;gCACF;gCAEA,IACE,AAAC3C,CAAAA,MAAMiB,IAAI,KAAK,kBAAkBjB,MAAMiB,IAAI,KAAK,QAAO,KACxD1B,MAAMC,OAAO,CAACmD,eACdhD,aAAa,UACb;oCACAZ,YAAY8B,IAAI,CACd7C,GAAG,CAAC,CAAC,EAAEF,WAAWsC,KAAK,CAACN,WAAW,EAAE6C,YAAY;oBACjD,EAAEvC,KAAK,CAACN,WAAW,CAAC;;yBAEf,CAAC;oCAGR;gCACF;gCAEA,IAAIH,aAAa,YAAYgD,eAAe,MAAM;oCAChD5D,YAAY8B,IAAI,CAACjD,OAAOuC,aAAaC,KAAK,CAACN,WAAW;oCACtD;gCACF;gCAEA,IAAIH,aAAa,gBAAgBgD,eAAe,MAAM;oCACpD5D,YAAY8B,IAAI,CAAClD,UAAUwC,aAAaC,KAAK,CAACN,WAAW;oCACzD;gCACF;gCAEAf,YAAY8B,IAAI,CACdtC,QAAQuC,SAAS,CAAC4B,cAAc,CAACvC,aAAaC,KAAK,CAACN,WAAW,EAAE6C;4BAErE;wBACF;oBACF;gBACF;YACF;QACF;IACF;IACA,IAAI5D,YAAYG,MAAM,GAAG,GAAG;QAC1B,IAAIJ,QAAQ;YACVA,SAASpB,IAAIoB,WAAWC;QAC1B,OAAO;YACLD,SAASpB,OAAOqB;QAClB;IACF;IACA,IAAIA,YAAYG,MAAM,KAAK,KAAK,CAACJ,QAAQ;QACtC,CAACA,OAAO,GAAGC;IACd;IAEA,OAAOD;AACT"}
1
+ {"version":3,"sources":["../../src/queries/parseParams.ts"],"sourcesContent":["import type { SQL } from 'drizzle-orm'\nimport type { Field, Operator, Where } from 'payload'\n\nimport { and, isNotNull, isNull, ne, notInArray, or, sql } from 'drizzle-orm'\nimport { PgUUID } from 'drizzle-orm/pg-core'\nimport { QueryError } from 'payload'\nimport { validOperators } from 'payload/shared'\n\nimport type { DrizzleAdapter, GenericColumn } from '../types.js'\nimport type { BuildQueryJoinAliases } from './buildQuery.js'\n\nimport { buildAndOrConditions } from './buildAndOrConditions.js'\nimport { getTableColumnFromPath } from './getTableColumnFromPath.js'\nimport { sanitizeQueryValue } from './sanitizeQueryValue.js'\n\ntype Args = {\n adapter: DrizzleAdapter\n fields: Field[]\n joins: BuildQueryJoinAliases\n locale: string\n selectFields: Record<string, GenericColumn>\n tableName: string\n where: Where\n}\n\nexport function parseParams({\n adapter,\n fields,\n joins,\n locale,\n selectFields,\n tableName,\n where,\n}: Args): SQL {\n let result: SQL\n const constraints: SQL[] = []\n\n if (typeof where === 'object' && Object.keys(where).length > 0) {\n // We need to determine if the whereKey is an AND, OR, or a schema path\n for (const relationOrPath of Object.keys(where)) {\n if (relationOrPath) {\n const condition = where[relationOrPath]\n let conditionOperator: typeof and | typeof or\n if (relationOrPath.toLowerCase() === 'and') {\n conditionOperator = and\n } else if (relationOrPath.toLowerCase() === 'or') {\n conditionOperator = or\n }\n if (Array.isArray(condition)) {\n const builtConditions = buildAndOrConditions({\n adapter,\n fields,\n joins,\n locale,\n selectFields,\n tableName,\n where: condition,\n })\n if (builtConditions.length > 0) {\n result = conditionOperator(...builtConditions)\n }\n } else {\n // It's a path - and there can be multiple comparisons on a single path.\n // For example - title like 'test' and title not equal to 'tester'\n // So we need to loop on keys again here to handle each operator independently\n const pathOperators = where[relationOrPath]\n if (typeof pathOperators === 'object') {\n for (let operator of Object.keys(pathOperators)) {\n if (validOperators.includes(operator as Operator)) {\n const val = where[relationOrPath][operator]\n\n const {\n columnName,\n columns,\n constraints: queryConstraints,\n field,\n getNotNullColumnByValue,\n pathSegments,\n rawColumn,\n table,\n } = getTableColumnFromPath({\n adapter,\n collectionPath: relationOrPath,\n fields,\n joins,\n locale,\n pathSegments: relationOrPath.replace(/__/g, '.').split('.'),\n selectFields,\n tableName,\n value: val,\n })\n\n queryConstraints.forEach(({ columnName: col, table: constraintTable, value }) => {\n if (typeof value === 'string' && value.indexOf('%') > -1) {\n constraints.push(adapter.operators.like(constraintTable[col], value))\n } else {\n constraints.push(adapter.operators.equals(constraintTable[col], value))\n }\n })\n\n if (\n ['json', 'richText'].includes(field.type) &&\n Array.isArray(pathSegments) &&\n pathSegments.length > 1\n ) {\n const segments = pathSegments.slice(1)\n segments.unshift(table[columnName].name)\n\n if (field.type === 'richText') {\n // use the table name from the nearest join to handle blocks, arrays, etc. or use the tableName arg\n const jsonTable =\n joins.length === 0\n ? tableName\n : joins[joins.length - 1].table[\n Object.getOwnPropertySymbols(joins[joins.length - 1].table)[0]\n ]\n const jsonQuery = adapter.createJSONQuery({\n operator,\n pathSegments: segments,\n table: jsonTable,\n treatAsArray: ['children'],\n treatRootAsArray: true,\n value: val,\n })\n\n constraints.push(sql.raw(jsonQuery))\n break\n }\n\n const jsonQuery = adapter.convertPathToJSONTraversal(pathSegments)\n const operatorKeys: Record<string, { operator: string; wildcard: string }> = {\n contains: { operator: 'like', wildcard: '%' },\n equals: { operator: '=', wildcard: '' },\n exists: { operator: val === true ? 'is not null' : 'is null', wildcard: '' },\n in: { operator: 'in', wildcard: '' },\n like: { operator: 'like', wildcard: '%' },\n not_equals: { operator: '<>', wildcard: '' },\n not_in: { operator: 'not in', wildcard: '' },\n }\n\n let formattedValue = val\n if (adapter.name === 'sqlite' && operator === 'equals' && !isNaN(val)) {\n formattedValue = val\n } else if (['in', 'not_in'].includes(operator) && Array.isArray(val)) {\n if (adapter.name === 'sqlite') {\n formattedValue = `(${val.map((v) => `${v}`).join(',')})`\n } else {\n formattedValue = `(${val.map((v) => `'${v}'`).join(', ')})`\n }\n } else {\n formattedValue = `'${operatorKeys[operator].wildcard}${val}${operatorKeys[operator].wildcard}'`\n }\n if (operator === 'exists') {\n formattedValue = ''\n }\n\n constraints.push(\n sql.raw(\n `${table[columnName].name}${jsonQuery} ${operatorKeys[operator].operator} ${formattedValue}`,\n ),\n )\n\n break\n }\n\n if (getNotNullColumnByValue) {\n const columnName = getNotNullColumnByValue(val)\n if (columnName) {\n constraints.push(isNotNull(table[columnName]))\n } else {\n throw new QueryError([{ path: relationOrPath }])\n }\n break\n }\n\n if (\n operator === 'like' &&\n (field.type === 'number' || table[columnName].columnType === 'PgUUID')\n ) {\n operator = 'equals'\n }\n\n if (operator === 'like') {\n constraints.push(\n and(\n ...val\n .split(' ')\n .map((word) => adapter.operators.like(table[columnName], `%${word}%`)),\n ),\n )\n break\n }\n\n const sanitizedQueryValue = sanitizeQueryValue({\n adapter,\n columns,\n field,\n isUUID: table?.[columnName] instanceof PgUUID,\n operator,\n relationOrPath,\n val,\n })\n\n if (sanitizedQueryValue === null) {\n break\n }\n\n const {\n columns: queryColumns,\n operator: queryOperator,\n value: queryValue,\n } = sanitizedQueryValue\n\n // Handle polymorphic relationships by value\n if (queryColumns) {\n if (!queryColumns.length) {\n break\n }\n\n let wrapOperator = or\n\n if (queryValue === null && ['equals', 'not_equals'].includes(operator)) {\n if (operator === 'equals') {\n wrapOperator = and\n }\n\n constraints.push(\n wrapOperator(\n ...queryColumns.map(({ rawColumn }) =>\n operator === 'equals' ? isNull(rawColumn) : isNotNull(rawColumn),\n ),\n ),\n )\n break\n }\n\n if (['not_equals', 'not_in'].includes(operator)) {\n wrapOperator = and\n }\n\n constraints.push(\n wrapOperator(\n ...queryColumns.map(({ rawColumn, value }) =>\n adapter.operators[queryOperator](rawColumn, value),\n ),\n ),\n )\n\n break\n }\n\n if (queryOperator === 'not_equals' && queryValue !== null) {\n constraints.push(\n or(\n isNull(rawColumn || table[columnName]),\n /* eslint-disable @typescript-eslint/no-explicit-any */\n ne<any>(rawColumn || table[columnName], queryValue),\n ),\n )\n break\n }\n\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n Array.isArray(queryValue) &&\n operator === 'not_in'\n ) {\n constraints.push(\n sql`(${notInArray(table[columnName], queryValue)} OR\n ${table[columnName]}\n IS\n NULL)`,\n )\n\n break\n }\n\n if (operator === 'equals' && queryValue === null) {\n constraints.push(isNull(rawColumn || table[columnName]))\n break\n }\n\n if (operator === 'not_equals' && queryValue === null) {\n constraints.push(isNotNull(rawColumn || table[columnName]))\n break\n }\n\n constraints.push(\n adapter.operators[queryOperator](rawColumn || table[columnName], queryValue),\n )\n }\n }\n }\n }\n }\n }\n }\n if (constraints.length > 0) {\n if (result) {\n result = and(result, ...constraints)\n } else {\n result = and(...constraints)\n }\n }\n if (constraints.length === 1 && !result) {\n ;[result] = constraints\n }\n\n return result\n}\n"],"names":["and","isNotNull","isNull","ne","notInArray","or","sql","PgUUID","QueryError","validOperators","buildAndOrConditions","getTableColumnFromPath","sanitizeQueryValue","parseParams","adapter","fields","joins","locale","selectFields","tableName","where","result","constraints","Object","keys","length","relationOrPath","condition","conditionOperator","toLowerCase","Array","isArray","builtConditions","pathOperators","operator","includes","val","columnName","columns","queryConstraints","field","getNotNullColumnByValue","pathSegments","rawColumn","table","collectionPath","replace","split","value","forEach","col","constraintTable","indexOf","push","operators","like","equals","type","segments","slice","unshift","name","jsonTable","getOwnPropertySymbols","jsonQuery","createJSONQuery","treatAsArray","treatRootAsArray","raw","convertPathToJSONTraversal","operatorKeys","contains","wildcard","exists","in","not_equals","not_in","formattedValue","isNaN","map","v","join","path","columnType","word","sanitizedQueryValue","isUUID","queryColumns","queryOperator","queryValue","wrapOperator"],"mappings":"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"}
@@ -1,13 +1,24 @@
1
+ import type { SQL } from 'drizzle-orm';
1
2
  import { type Field, type TabAsField } from 'payload';
2
3
  import type { DrizzleAdapter } from '../types.js';
3
4
  type SanitizeQueryValueArgs = {
4
5
  adapter: DrizzleAdapter;
6
+ columns?: {
7
+ idType: 'number' | 'text' | 'uuid';
8
+ rawColumn: SQL<unknown>;
9
+ }[];
5
10
  field: Field | TabAsField;
11
+ isUUID: boolean;
6
12
  operator: string;
7
13
  relationOrPath: string;
8
14
  val: any;
9
15
  };
10
- export declare const sanitizeQueryValue: ({ adapter, field, operator: operatorArg, relationOrPath, val, }: SanitizeQueryValueArgs) => {
16
+ type SanitizedColumn = {
17
+ rawColumn: SQL<unknown>;
18
+ value: unknown;
19
+ };
20
+ export declare const sanitizeQueryValue: ({ adapter, columns, field, isUUID, operator: operatorArg, relationOrPath, val, }: SanitizeQueryValueArgs) => {
21
+ columns?: SanitizedColumn[];
11
22
  operator: string;
12
23
  value: unknown;
13
24
  };
@@ -1 +1 @@
1
- {"version":3,"file":"sanitizeQueryValue.d.ts","sourceRoot":"","sources":["../../src/queries/sanitizeQueryValue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,KAAK,EAAE,KAAK,UAAU,EAAkC,MAAM,SAAS,CAAA;AAG/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEjD,KAAK,sBAAsB,GAAG;IAC5B,OAAO,EAAE,cAAc,CAAA;IACvB,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,GAAG,EAAE,GAAG,CAAA;CACT,CAAA;AAED,eAAO,MAAM,kBAAkB,oEAM5B,sBAAsB,KAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CA2H7D,CAAA"}
1
+ {"version":3,"file":"sanitizeQueryValue.d.ts","sourceRoot":"","sources":["../../src/queries/sanitizeQueryValue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAEtC,OAAO,EAA4C,KAAK,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAA;AAI/F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAKjD,KAAK,sBAAsB,GAAG;IAC5B,OAAO,EAAE,cAAc,CAAA;IACvB,OAAO,CAAC,EAAE;QACR,MAAM,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAA;QAClC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;KACxB,EAAE,CAAA;IACH,KAAK,EAAE,KAAK,GAAG,UAAU,CAAA;IACzB,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,GAAG,EAAE,GAAG,CAAA;CACT,CAAA;AAED,KAAK,eAAe,GAAG;IACrB,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAA;IACvB,KAAK,EAAE,OAAO,CAAA;CACf,CAAA;AAED,eAAO,MAAM,kBAAkB,qFAQ5B,sBAAsB,KAAG;IAC1B,OAAO,CAAC,EAAE,eAAe,EAAE,CAAA;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;CAoMf,CAAA"}
@@ -1,12 +1,18 @@
1
1
  import { APIError, createArrayFromCommaDelineated } from 'payload';
2
2
  import { fieldAffectsData } from 'payload/shared';
3
- export const sanitizeQueryValue = ({ adapter, field, operator: operatorArg, relationOrPath, val })=>{
3
+ import { validate as uuidValidate } from 'uuid';
4
+ import { getCollectionIdType } from '../utilities/getCollectionIdType.js';
5
+ import { isPolymorphicRelationship } from '../utilities/isPolymorphicRelationship.js';
6
+ export const sanitizeQueryValue = ({ adapter, columns, field, isUUID, operator: operatorArg, relationOrPath, val })=>{
4
7
  let operator = operatorArg;
5
8
  let formattedValue = val;
6
- if (!fieldAffectsData(field)) return {
7
- operator,
8
- value: formattedValue
9
- };
9
+ let formattedColumns;
10
+ if (!fieldAffectsData(field)) {
11
+ return {
12
+ operator,
13
+ value: formattedValue
14
+ };
15
+ }
10
16
  if ((field.type === 'relationship' || field.type === 'upload') && !relationOrPath.endsWith('relationTo') && Array.isArray(formattedValue)) {
11
17
  const allPossibleIDTypes = [];
12
18
  formattedValue.forEach((val)=>{
@@ -22,8 +28,12 @@ export const sanitizeQueryValue = ({ adapter, field, operator: operatorArg, rela
22
28
  }
23
29
  // Cast incoming values as proper searchable types
24
30
  if (field.type === 'checkbox' && typeof val === 'string') {
25
- if (val.toLowerCase() === 'true') formattedValue = true;
26
- if (val.toLowerCase() === 'false') formattedValue = false;
31
+ if (val.toLowerCase() === 'true') {
32
+ formattedValue = true;
33
+ }
34
+ if (val.toLowerCase() === 'false') {
35
+ formattedValue = false;
36
+ }
27
37
  }
28
38
  if ([
29
39
  'all',
@@ -42,6 +52,14 @@ export const sanitizeQueryValue = ({ adapter, field, operator: operatorArg, rela
42
52
  }
43
53
  if (field.type === 'number' && typeof formattedValue === 'string') {
44
54
  formattedValue = Number(val);
55
+ if (Number.isNaN(formattedValue)) {
56
+ formattedValue = null;
57
+ }
58
+ }
59
+ if (isUUID && typeof formattedValue === 'string') {
60
+ if (!uuidValidate(val)) {
61
+ formattedValue = null;
62
+ }
45
63
  }
46
64
  if (field.type === 'date' && operator !== 'exists') {
47
65
  if (typeof val === 'string') {
@@ -52,7 +70,9 @@ export const sanitizeQueryValue = ({ adapter, field, operator: operatorArg, rela
52
70
  value: undefined
53
71
  };
54
72
  }
55
- } else if (typeof val === 'number') formattedValue = new Date(val).toISOString();
73
+ } else if (typeof val === 'number') {
74
+ formattedValue = new Date(val).toISOString();
75
+ }
56
76
  }
57
77
  if (field.type === 'relationship' || field.type === 'upload') {
58
78
  if (val === 'null') {
@@ -61,20 +81,55 @@ export const sanitizeQueryValue = ({ adapter, field, operator: operatorArg, rela
61
81
  // convert the value to the idType of the relationship
62
82
  let idType;
63
83
  if (typeof field.relationTo === 'string') {
64
- const collection = adapter.payload.collections[field.relationTo];
65
- const mixedType = collection.customIDType || adapter.idType;
66
- const typeMap = {
67
- number: 'number',
68
- serial: 'number',
69
- text: 'text',
70
- uuid: 'text'
71
- };
72
- idType = typeMap[mixedType];
84
+ idType = getCollectionIdType({
85
+ adapter,
86
+ collection: adapter.payload.collections[field.relationTo]
87
+ });
73
88
  } else {
74
- // LIMITATION: Only cast to the first relationTo id type,
75
- // otherwise we need to make the db cast which is inefficient
76
- const collection = adapter.payload.collections[field.relationTo[0]];
77
- idType = collection.customIDType || adapter.idType === 'uuid' ? 'text' : 'number';
89
+ if (isPolymorphicRelationship(val)) {
90
+ if (operator !== 'equals') {
91
+ throw new APIError(`Only 'equals' operator is supported for polymorphic relationship object notation. Given - ${operator}`);
92
+ }
93
+ idType = getCollectionIdType({
94
+ adapter,
95
+ collection: adapter.payload.collections[val.relationTo]
96
+ });
97
+ return {
98
+ operator,
99
+ value: idType === 'number' ? Number(val.value) : String(val.value)
100
+ };
101
+ }
102
+ formattedColumns = columns.map(({ idType, rawColumn })=>{
103
+ let formattedValue;
104
+ if (Array.isArray(val)) {
105
+ formattedValue = val.map((eachVal)=>{
106
+ let formattedValue;
107
+ if (idType === 'number') {
108
+ formattedValue = Number(eachVal);
109
+ if (Number.isNaN(formattedValue)) {
110
+ return null;
111
+ }
112
+ } else {
113
+ if (idType === 'uuid' && !uuidValidate(eachVal)) {
114
+ return null;
115
+ }
116
+ formattedValue = String(eachVal);
117
+ }
118
+ return formattedValue;
119
+ }).filter(Boolean);
120
+ } else if (idType === 'number') {
121
+ formattedValue = Number(val);
122
+ if (Number.isNaN(formattedValue)) {
123
+ return null;
124
+ }
125
+ } else {
126
+ formattedValue = String(val);
127
+ }
128
+ return {
129
+ rawColumn,
130
+ value: formattedValue
131
+ };
132
+ }).filter(Boolean);
78
133
  }
79
134
  if (Array.isArray(formattedValue)) {
80
135
  formattedValue = formattedValue.map((value)=>{
@@ -112,6 +167,7 @@ export const sanitizeQueryValue = ({ adapter, field, operator: operatorArg, rela
112
167
  }
113
168
  }
114
169
  return {
170
+ columns: formattedColumns,
115
171
  operator,
116
172
  value: formattedValue
117
173
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/queries/sanitizeQueryValue.ts"],"sourcesContent":["import { APIError, type Field, type TabAsField, createArrayFromCommaDelineated } from 'payload'\nimport { fieldAffectsData } from 'payload/shared'\n\nimport type { DrizzleAdapter } from '../types.js'\n\ntype SanitizeQueryValueArgs = {\n adapter: DrizzleAdapter\n field: Field | TabAsField\n operator: string\n relationOrPath: string\n val: any\n}\n\nexport const sanitizeQueryValue = ({\n adapter,\n field,\n operator: operatorArg,\n relationOrPath,\n val,\n}: SanitizeQueryValueArgs): { operator: string; value: unknown } => {\n let operator = operatorArg\n let formattedValue = val\n\n if (!fieldAffectsData(field)) return { operator, value: formattedValue }\n\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n !relationOrPath.endsWith('relationTo') &&\n Array.isArray(formattedValue)\n ) {\n const allPossibleIDTypes: (number | string)[] = []\n formattedValue.forEach((val) => {\n if (adapter.idType !== 'uuid' && typeof val === 'string') {\n allPossibleIDTypes.push(val, parseInt(val))\n } else if (typeof val === 'string') {\n allPossibleIDTypes.push(val)\n } else {\n allPossibleIDTypes.push(val, String(val))\n }\n })\n formattedValue = allPossibleIDTypes\n }\n\n // Cast incoming values as proper searchable types\n if (field.type === 'checkbox' && typeof val === 'string') {\n if (val.toLowerCase() === 'true') formattedValue = true\n if (val.toLowerCase() === 'false') formattedValue = false\n }\n\n if (['all', 'in', 'not_in'].includes(operator)) {\n if (typeof formattedValue === 'string') {\n formattedValue = createArrayFromCommaDelineated(formattedValue)\n\n if (field.type === 'number') {\n formattedValue = formattedValue.map((arrayVal) => parseFloat(arrayVal))\n }\n }\n\n if (!Array.isArray(formattedValue) || formattedValue.length === 0) {\n return null\n }\n }\n\n if (field.type === 'number' && typeof formattedValue === 'string') {\n formattedValue = Number(val)\n }\n\n if (field.type === 'date' && operator !== 'exists') {\n if (typeof val === 'string') {\n formattedValue = new Date(val).toISOString()\n if (Number.isNaN(Date.parse(formattedValue))) {\n return { operator, value: undefined }\n }\n } else if (typeof val === 'number') formattedValue = new Date(val).toISOString()\n }\n\n if (field.type === 'relationship' || field.type === 'upload') {\n if (val === 'null') {\n formattedValue = null\n } else if (!(formattedValue === null || typeof formattedValue === 'boolean')) {\n // convert the value to the idType of the relationship\n let idType: 'number' | 'text'\n if (typeof field.relationTo === 'string') {\n const collection = adapter.payload.collections[field.relationTo]\n const mixedType: 'number' | 'serial' | 'text' | 'uuid' =\n collection.customIDType || adapter.idType\n const typeMap: Record<string, 'number' | 'text'> = {\n number: 'number',\n serial: 'number',\n text: 'text',\n uuid: 'text',\n }\n idType = typeMap[mixedType]\n } else {\n // LIMITATION: Only cast to the first relationTo id type,\n // otherwise we need to make the db cast which is inefficient\n const collection = adapter.payload.collections[field.relationTo[0]]\n idType = collection.customIDType || adapter.idType === 'uuid' ? 'text' : 'number'\n }\n if (Array.isArray(formattedValue)) {\n formattedValue = formattedValue.map((value) => {\n if (idType === 'number') {\n return Number(value)\n }\n if (idType === 'text') {\n return String(value)\n }\n return value\n })\n } else {\n if (idType === 'number') {\n formattedValue = Number(val)\n }\n if (idType === 'text') {\n formattedValue = String(val)\n }\n }\n }\n }\n\n if ('hasMany' in field && field.hasMany && operator === 'contains') {\n operator = 'equals'\n }\n\n if (operator === 'near' || operator === 'within' || operator === 'intersects') {\n throw new APIError(\n `Querying with '${operator}' is not supported with the postgres database adapter.`,\n )\n }\n\n if (operator === 'contains') {\n formattedValue = `%${formattedValue}%`\n }\n\n if (operator === 'exists') {\n formattedValue = formattedValue === 'true' || formattedValue === true\n if (formattedValue === false) {\n operator = 'isNull'\n }\n }\n\n return { operator, value: formattedValue }\n}\n"],"names":["APIError","createArrayFromCommaDelineated","fieldAffectsData","sanitizeQueryValue","adapter","field","operator","operatorArg","relationOrPath","val","formattedValue","value","type","endsWith","Array","isArray","allPossibleIDTypes","forEach","idType","push","parseInt","String","toLowerCase","includes","map","arrayVal","parseFloat","length","Number","Date","toISOString","isNaN","parse","undefined","relationTo","collection","payload","collections","mixedType","customIDType","typeMap","number","serial","text","uuid","hasMany"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/queries/sanitizeQueryValue.ts"],"sourcesContent":["import type { SQL } from 'drizzle-orm'\n\nimport { APIError, createArrayFromCommaDelineated, type Field, type TabAsField } from 'payload'\nimport { fieldAffectsData } from 'payload/shared'\nimport { validate as uuidValidate } from 'uuid'\n\nimport type { DrizzleAdapter } from '../types.js'\n\nimport { getCollectionIdType } from '../utilities/getCollectionIdType.js'\nimport { isPolymorphicRelationship } from '../utilities/isPolymorphicRelationship.js'\n\ntype SanitizeQueryValueArgs = {\n adapter: DrizzleAdapter\n columns?: {\n idType: 'number' | 'text' | 'uuid'\n rawColumn: SQL<unknown>\n }[]\n field: Field | TabAsField\n isUUID: boolean\n operator: string\n relationOrPath: string\n val: any\n}\n\ntype SanitizedColumn = {\n rawColumn: SQL<unknown>\n value: unknown\n}\n\nexport const sanitizeQueryValue = ({\n adapter,\n columns,\n field,\n isUUID,\n operator: operatorArg,\n relationOrPath,\n val,\n}: SanitizeQueryValueArgs): {\n columns?: SanitizedColumn[]\n operator: string\n value: unknown\n} => {\n let operator = operatorArg\n let formattedValue = val\n let formattedColumns: SanitizedColumn[]\n\n if (!fieldAffectsData(field)) {\n return { operator, value: formattedValue }\n }\n\n if (\n (field.type === 'relationship' || field.type === 'upload') &&\n !relationOrPath.endsWith('relationTo') &&\n Array.isArray(formattedValue)\n ) {\n const allPossibleIDTypes: (number | string)[] = []\n formattedValue.forEach((val) => {\n if (adapter.idType !== 'uuid' && typeof val === 'string') {\n allPossibleIDTypes.push(val, parseInt(val))\n } else if (typeof val === 'string') {\n allPossibleIDTypes.push(val)\n } else {\n allPossibleIDTypes.push(val, String(val))\n }\n })\n formattedValue = allPossibleIDTypes\n }\n\n // Cast incoming values as proper searchable types\n if (field.type === 'checkbox' && typeof val === 'string') {\n if (val.toLowerCase() === 'true') {\n formattedValue = true\n }\n if (val.toLowerCase() === 'false') {\n formattedValue = false\n }\n }\n\n if (['all', 'in', 'not_in'].includes(operator)) {\n if (typeof formattedValue === 'string') {\n formattedValue = createArrayFromCommaDelineated(formattedValue)\n\n if (field.type === 'number') {\n formattedValue = formattedValue.map((arrayVal) => parseFloat(arrayVal))\n }\n }\n\n if (!Array.isArray(formattedValue) || formattedValue.length === 0) {\n return null\n }\n }\n\n if (field.type === 'number' && typeof formattedValue === 'string') {\n formattedValue = Number(val)\n\n if (Number.isNaN(formattedValue)) {\n formattedValue = null\n }\n }\n\n if (isUUID && typeof formattedValue === 'string') {\n if (!uuidValidate(val)) {\n formattedValue = null\n }\n }\n\n if (field.type === 'date' && operator !== 'exists') {\n if (typeof val === 'string') {\n formattedValue = new Date(val).toISOString()\n if (Number.isNaN(Date.parse(formattedValue))) {\n return { operator, value: undefined }\n }\n } else if (typeof val === 'number') {\n formattedValue = new Date(val).toISOString()\n }\n }\n\n if (field.type === 'relationship' || field.type === 'upload') {\n if (val === 'null') {\n formattedValue = null\n } else if (!(formattedValue === null || typeof formattedValue === 'boolean')) {\n // convert the value to the idType of the relationship\n let idType: 'number' | 'text'\n if (typeof field.relationTo === 'string') {\n idType = getCollectionIdType({\n adapter,\n collection: adapter.payload.collections[field.relationTo],\n })\n } else {\n if (isPolymorphicRelationship(val)) {\n if (operator !== 'equals') {\n throw new APIError(\n `Only 'equals' operator is supported for polymorphic relationship object notation. Given - ${operator}`,\n )\n }\n idType = getCollectionIdType({\n adapter,\n collection: adapter.payload.collections[val.relationTo],\n })\n\n return {\n operator,\n value: idType === 'number' ? Number(val.value) : String(val.value),\n }\n }\n\n formattedColumns = columns\n .map(({ idType, rawColumn }) => {\n let formattedValue: number | number[] | string | string[]\n\n if (Array.isArray(val)) {\n formattedValue = val\n .map((eachVal) => {\n let formattedValue: number | string\n\n if (idType === 'number') {\n formattedValue = Number(eachVal)\n\n if (Number.isNaN(formattedValue)) {\n return null\n }\n } else {\n if (idType === 'uuid' && !uuidValidate(eachVal)) {\n return null\n }\n\n formattedValue = String(eachVal)\n }\n\n return formattedValue\n })\n .filter(Boolean) as number[] | string[]\n } else if (idType === 'number') {\n formattedValue = Number(val)\n\n if (Number.isNaN(formattedValue)) {\n return null\n }\n } else {\n formattedValue = String(val)\n }\n\n return {\n rawColumn,\n value: formattedValue,\n }\n })\n .filter(Boolean)\n }\n if (Array.isArray(formattedValue)) {\n formattedValue = formattedValue.map((value) => {\n if (idType === 'number') {\n return Number(value)\n }\n if (idType === 'text') {\n return String(value)\n }\n return value\n })\n } else {\n if (idType === 'number') {\n formattedValue = Number(val)\n }\n if (idType === 'text') {\n formattedValue = String(val)\n }\n }\n }\n }\n\n if ('hasMany' in field && field.hasMany && operator === 'contains') {\n operator = 'equals'\n }\n\n if (operator === 'near' || operator === 'within' || operator === 'intersects') {\n throw new APIError(\n `Querying with '${operator}' is not supported with the postgres database adapter.`,\n )\n }\n\n if (operator === 'contains') {\n formattedValue = `%${formattedValue}%`\n }\n\n if (operator === 'exists') {\n formattedValue = formattedValue === 'true' || formattedValue === true\n if (formattedValue === false) {\n operator = 'isNull'\n }\n }\n\n return {\n columns: formattedColumns,\n operator,\n value: formattedValue,\n }\n}\n"],"names":["APIError","createArrayFromCommaDelineated","fieldAffectsData","validate","uuidValidate","getCollectionIdType","isPolymorphicRelationship","sanitizeQueryValue","adapter","columns","field","isUUID","operator","operatorArg","relationOrPath","val","formattedValue","formattedColumns","value","type","endsWith","Array","isArray","allPossibleIDTypes","forEach","idType","push","parseInt","String","toLowerCase","includes","map","arrayVal","parseFloat","length","Number","isNaN","Date","toISOString","parse","undefined","relationTo","collection","payload","collections","rawColumn","eachVal","filter","Boolean","hasMany"],"mappings":"AAEA,SAASA,QAAQ,EAAEC,8BAA8B,QAAqC,UAAS;AAC/F,SAASC,gBAAgB,QAAQ,iBAAgB;AACjD,SAASC,YAAYC,YAAY,QAAQ,OAAM;AAI/C,SAASC,mBAAmB,QAAQ,sCAAqC;AACzE,SAASC,yBAAyB,QAAQ,4CAA2C;AAoBrF,OAAO,MAAMC,qBAAqB,CAAC,EACjCC,OAAO,EACPC,OAAO,EACPC,KAAK,EACLC,MAAM,EACNC,UAAUC,WAAW,EACrBC,cAAc,EACdC,GAAG,EACoB;IAKvB,IAAIH,WAAWC;IACf,IAAIG,iBAAiBD;IACrB,IAAIE;IAEJ,IAAI,CAACf,iBAAiBQ,QAAQ;QAC5B,OAAO;YAAEE;YAAUM,OAAOF;QAAe;IAC3C;IAEA,IACE,AAACN,CAAAA,MAAMS,IAAI,KAAK,kBAAkBT,MAAMS,IAAI,KAAK,QAAO,KACxD,CAACL,eAAeM,QAAQ,CAAC,iBACzBC,MAAMC,OAAO,CAACN,iBACd;QACA,MAAMO,qBAA0C,EAAE;QAClDP,eAAeQ,OAAO,CAAC,CAACT;YACtB,IAAIP,QAAQiB,MAAM,KAAK,UAAU,OAAOV,QAAQ,UAAU;gBACxDQ,mBAAmBG,IAAI,CAACX,KAAKY,SAASZ;YACxC,OAAO,IAAI,OAAOA,QAAQ,UAAU;gBAClCQ,mBAAmBG,IAAI,CAACX;YAC1B,OAAO;gBACLQ,mBAAmBG,IAAI,CAACX,KAAKa,OAAOb;YACtC;QACF;QACAC,iBAAiBO;IACnB;IAEA,kDAAkD;IAClD,IAAIb,MAAMS,IAAI,KAAK,cAAc,OAAOJ,QAAQ,UAAU;QACxD,IAAIA,IAAIc,WAAW,OAAO,QAAQ;YAChCb,iBAAiB;QACnB;QACA,IAAID,IAAIc,WAAW,OAAO,SAAS;YACjCb,iBAAiB;QACnB;IACF;IAEA,IAAI;QAAC;QAAO;QAAM;KAAS,CAACc,QAAQ,CAAClB,WAAW;QAC9C,IAAI,OAAOI,mBAAmB,UAAU;YACtCA,iBAAiBf,+BAA+Be;YAEhD,IAAIN,MAAMS,IAAI,KAAK,UAAU;gBAC3BH,iBAAiBA,eAAee,GAAG,CAAC,CAACC,WAAaC,WAAWD;YAC/D;QACF;QAEA,IAAI,CAACX,MAAMC,OAAO,CAACN,mBAAmBA,eAAekB,MAAM,KAAK,GAAG;YACjE,OAAO;QACT;IACF;IAEA,IAAIxB,MAAMS,IAAI,KAAK,YAAY,OAAOH,mBAAmB,UAAU;QACjEA,iBAAiBmB,OAAOpB;QAExB,IAAIoB,OAAOC,KAAK,CAACpB,iBAAiB;YAChCA,iBAAiB;QACnB;IACF;IAEA,IAAIL,UAAU,OAAOK,mBAAmB,UAAU;QAChD,IAAI,CAACZ,aAAaW,MAAM;YACtBC,iBAAiB;QACnB;IACF;IAEA,IAAIN,MAAMS,IAAI,KAAK,UAAUP,aAAa,UAAU;QAClD,IAAI,OAAOG,QAAQ,UAAU;YAC3BC,iBAAiB,IAAIqB,KAAKtB,KAAKuB,WAAW;YAC1C,IAAIH,OAAOC,KAAK,CAACC,KAAKE,KAAK,CAACvB,kBAAkB;gBAC5C,OAAO;oBAAEJ;oBAAUM,OAAOsB;gBAAU;YACtC;QACF,OAAO,IAAI,OAAOzB,QAAQ,UAAU;YAClCC,iBAAiB,IAAIqB,KAAKtB,KAAKuB,WAAW;QAC5C;IACF;IAEA,IAAI5B,MAAMS,IAAI,KAAK,kBAAkBT,MAAMS,IAAI,KAAK,UAAU;QAC5D,IAAIJ,QAAQ,QAAQ;YAClBC,iBAAiB;QACnB,OAAO,IAAI,CAAEA,CAAAA,mBAAmB,QAAQ,OAAOA,mBAAmB,SAAQ,GAAI;YAC5E,sDAAsD;YACtD,IAAIS;YACJ,IAAI,OAAOf,MAAM+B,UAAU,KAAK,UAAU;gBACxChB,SAASpB,oBAAoB;oBAC3BG;oBACAkC,YAAYlC,QAAQmC,OAAO,CAACC,WAAW,CAAClC,MAAM+B,UAAU,CAAC;gBAC3D;YACF,OAAO;gBACL,IAAInC,0BAA0BS,MAAM;oBAClC,IAAIH,aAAa,UAAU;wBACzB,MAAM,IAAIZ,SACR,CAAC,0FAA0F,EAAEY,SAAS,CAAC;oBAE3G;oBACAa,SAASpB,oBAAoB;wBAC3BG;wBACAkC,YAAYlC,QAAQmC,OAAO,CAACC,WAAW,CAAC7B,IAAI0B,UAAU,CAAC;oBACzD;oBAEA,OAAO;wBACL7B;wBACAM,OAAOO,WAAW,WAAWU,OAAOpB,IAAIG,KAAK,IAAIU,OAAOb,IAAIG,KAAK;oBACnE;gBACF;gBAEAD,mBAAmBR,QAChBsB,GAAG,CAAC,CAAC,EAAEN,MAAM,EAAEoB,SAAS,EAAE;oBACzB,IAAI7B;oBAEJ,IAAIK,MAAMC,OAAO,CAACP,MAAM;wBACtBC,iBAAiBD,IACdgB,GAAG,CAAC,CAACe;4BACJ,IAAI9B;4BAEJ,IAAIS,WAAW,UAAU;gCACvBT,iBAAiBmB,OAAOW;gCAExB,IAAIX,OAAOC,KAAK,CAACpB,iBAAiB;oCAChC,OAAO;gCACT;4BACF,OAAO;gCACL,IAAIS,WAAW,UAAU,CAACrB,aAAa0C,UAAU;oCAC/C,OAAO;gCACT;gCAEA9B,iBAAiBY,OAAOkB;4BAC1B;4BAEA,OAAO9B;wBACT,GACC+B,MAAM,CAACC;oBACZ,OAAO,IAAIvB,WAAW,UAAU;wBAC9BT,iBAAiBmB,OAAOpB;wBAExB,IAAIoB,OAAOC,KAAK,CAACpB,iBAAiB;4BAChC,OAAO;wBACT;oBACF,OAAO;wBACLA,iBAAiBY,OAAOb;oBAC1B;oBAEA,OAAO;wBACL8B;wBACA3B,OAAOF;oBACT;gBACF,GACC+B,MAAM,CAACC;YACZ;YACA,IAAI3B,MAAMC,OAAO,CAACN,iBAAiB;gBACjCA,iBAAiBA,eAAee,GAAG,CAAC,CAACb;oBACnC,IAAIO,WAAW,UAAU;wBACvB,OAAOU,OAAOjB;oBAChB;oBACA,IAAIO,WAAW,QAAQ;wBACrB,OAAOG,OAAOV;oBAChB;oBACA,OAAOA;gBACT;YACF,OAAO;gBACL,IAAIO,WAAW,UAAU;oBACvBT,iBAAiBmB,OAAOpB;gBAC1B;gBACA,IAAIU,WAAW,QAAQ;oBACrBT,iBAAiBY,OAAOb;gBAC1B;YACF;QACF;IACF;IAEA,IAAI,aAAaL,SAASA,MAAMuC,OAAO,IAAIrC,aAAa,YAAY;QAClEA,WAAW;IACb;IAEA,IAAIA,aAAa,UAAUA,aAAa,YAAYA,aAAa,cAAc;QAC7E,MAAM,IAAIZ,SACR,CAAC,eAAe,EAAEY,SAAS,sDAAsD,CAAC;IAEtF;IAEA,IAAIA,aAAa,YAAY;QAC3BI,iBAAiB,CAAC,CAAC,EAAEA,eAAe,CAAC,CAAC;IACxC;IAEA,IAAIJ,aAAa,UAAU;QACzBI,iBAAiBA,mBAAmB,UAAUA,mBAAmB;QACjE,IAAIA,mBAAmB,OAAO;YAC5BJ,WAAW;QACb;IACF;IAEA,OAAO;QACLH,SAASQ;QACTL;QACAM,OAAOF;IACT;AACF,EAAC"}
@@ -1,8 +1,7 @@
1
1
  import type { QueryPromise, SQL } from 'drizzle-orm';
2
2
  import type { ChainedMethods } from '../find/chainMethods.js';
3
- import type { DrizzleAdapter, DrizzleTransaction } from '../types.js';
3
+ import type { DrizzleAdapter, DrizzleTransaction, GenericColumn } from '../types.js';
4
4
  import type { BuildQueryJoinAliases } from './buildQuery.js';
5
- import { type GenericColumn } from '../types.js';
6
5
  type Args = {
7
6
  adapter: DrizzleAdapter;
8
7
  chainedMethods?: ChainedMethods;
@@ -15,8 +14,8 @@ type Args = {
15
14
  /**
16
15
  * Selects distinct records from a table only if there are joins that need to be used, otherwise return null
17
16
  */
18
- export declare const selectDistinct: ({ adapter, chainedMethods, db, joins, selectFields, tableName, where, }: Args) => QueryPromise<Record<string, GenericColumn> & {
17
+ export declare const selectDistinct: ({ adapter, chainedMethods, db, joins, selectFields, tableName, where, }: Args) => QueryPromise<{
19
18
  id: number | string;
20
- }[]>;
19
+ }[] & Record<string, GenericColumn>>;
21
20
  export {};
22
21
  //# sourceMappingURL=selectDistinct.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"selectDistinct.d.ts","sourceRoot":"","sources":["../../src/queries/selectDistinct.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAInB,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAG5D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAA;AAEhD,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,cAAc,CAAA;IACvB,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,EAAE,EAAE,cAAc,CAAC,SAAS,CAAC,GAAG,kBAAkB,CAAA;IAClD,KAAK,EAAE,qBAAqB,CAAA;IAC5B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC3C,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,GAAG,CAAA;CACX,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,4EAQxB,IAAI,KAAG,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG;IAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EAAE,CAgC/E,CAAA"}
1
+ {"version":3,"file":"selectDistinct.d.ts","sourceRoot":"","sources":["../../src/queries/selectDistinct.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAGpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC7D,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,aAAa,EAId,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAI5D,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,cAAc,CAAA;IACvB,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,EAAE,EAAE,cAAc,CAAC,SAAS,CAAC,GAAG,kBAAkB,CAAA;IAClD,KAAK,EAAE,qBAAqB,CAAA;IAC5B,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC3C,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,GAAG,CAAA;CACX,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,4EAQxB,IAAI,KAAG,YAAY,CAAC;IAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAgC/E,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/queries/selectDistinct.ts"],"sourcesContent":["import type { QueryPromise, SQL } from 'drizzle-orm'\nimport type { SQLiteColumn } from 'drizzle-orm/sqlite-core'\n\nimport type { ChainedMethods } from '../find/chainMethods.js'\nimport type {\n DrizzleAdapter,\n DrizzleTransaction,\n GenericPgColumn,\n TransactionPg,\n TransactionSQLite,\n} from '../types.js'\nimport type { BuildQueryJoinAliases } from './buildQuery.js'\n\nimport { chainMethods } from '../find/chainMethods.js'\nimport { type GenericColumn } from '../types.js'\n\ntype Args = {\n adapter: DrizzleAdapter\n chainedMethods?: ChainedMethods\n db: DrizzleAdapter['drizzle'] | DrizzleTransaction\n joins: BuildQueryJoinAliases\n selectFields: Record<string, GenericColumn>\n tableName: string\n where: SQL\n}\n\n/**\n * Selects distinct records from a table only if there are joins that need to be used, otherwise return null\n */\nexport const selectDistinct = ({\n adapter,\n chainedMethods = [],\n db,\n joins,\n selectFields,\n tableName,\n where,\n}: Args): QueryPromise<Record<string, GenericColumn> & { id: number | string }[]> => {\n if (Object.keys(joins).length > 0) {\n if (where) {\n chainedMethods.push({ args: [where], method: 'where' })\n }\n\n joins.forEach(({ condition, table }) => {\n chainedMethods.push({\n args: [table, condition],\n method: 'leftJoin',\n })\n })\n\n let query\n const table = adapter.tables[tableName]\n\n if (adapter.name === 'postgres') {\n query = (db as TransactionPg)\n .selectDistinct(selectFields as Record<string, GenericPgColumn>)\n .from(table)\n }\n if (adapter.name === 'sqlite') {\n query = (db as TransactionSQLite)\n .selectDistinct(selectFields as Record<string, SQLiteColumn>)\n .from(table)\n }\n\n return chainMethods({\n methods: chainedMethods,\n query,\n })\n }\n}\n"],"names":["chainMethods","selectDistinct","adapter","chainedMethods","db","joins","selectFields","tableName","where","Object","keys","length","push","args","method","forEach","condition","table","query","tables","name","from","methods"],"mappings":"AAaA,SAASA,YAAY,QAAQ,0BAAyB;AAatD;;CAEC,GACD,OAAO,MAAMC,iBAAiB,CAAC,EAC7BC,OAAO,EACPC,iBAAiB,EAAE,EACnBC,EAAE,EACFC,KAAK,EACLC,YAAY,EACZC,SAAS,EACTC,KAAK,EACA;IACL,IAAIC,OAAOC,IAAI,CAACL,OAAOM,MAAM,GAAG,GAAG;QACjC,IAAIH,OAAO;YACTL,eAAeS,IAAI,CAAC;gBAAEC,MAAM;oBAACL;iBAAM;gBAAEM,QAAQ;YAAQ;QACvD;QAEAT,MAAMU,OAAO,CAAC,CAAC,EAAEC,SAAS,EAAEC,KAAK,EAAE;YACjCd,eAAeS,IAAI,CAAC;gBAClBC,MAAM;oBAACI;oBAAOD;iBAAU;gBACxBF,QAAQ;YACV;QACF;QAEA,IAAII;QACJ,MAAMD,QAAQf,QAAQiB,MAAM,CAACZ,UAAU;QAEvC,IAAIL,QAAQkB,IAAI,KAAK,YAAY;YAC/BF,QAAQ,AAACd,GACNH,cAAc,CAACK,cACfe,IAAI,CAACJ;QACV;QACA,IAAIf,QAAQkB,IAAI,KAAK,UAAU;YAC7BF,QAAQ,AAACd,GACNH,cAAc,CAACK,cACfe,IAAI,CAACJ;QACV;QAEA,OAAOjB,aAAa;YAClBsB,SAASnB;YACTe;QACF;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/queries/selectDistinct.ts"],"sourcesContent":["import type { QueryPromise, SQL } from 'drizzle-orm'\nimport type { SQLiteColumn } from 'drizzle-orm/sqlite-core'\n\nimport type { ChainedMethods } from '../find/chainMethods.js'\nimport type {\n DrizzleAdapter,\n DrizzleTransaction,\n GenericColumn,\n GenericPgColumn,\n TransactionPg,\n TransactionSQLite,\n} from '../types.js'\nimport type { BuildQueryJoinAliases } from './buildQuery.js'\n\nimport { chainMethods } from '../find/chainMethods.js'\n\ntype Args = {\n adapter: DrizzleAdapter\n chainedMethods?: ChainedMethods\n db: DrizzleAdapter['drizzle'] | DrizzleTransaction\n joins: BuildQueryJoinAliases\n selectFields: Record<string, GenericColumn>\n tableName: string\n where: SQL\n}\n\n/**\n * Selects distinct records from a table only if there are joins that need to be used, otherwise return null\n */\nexport const selectDistinct = ({\n adapter,\n chainedMethods = [],\n db,\n joins,\n selectFields,\n tableName,\n where,\n}: Args): QueryPromise<{ id: number | string }[] & Record<string, GenericColumn>> => {\n if (Object.keys(joins).length > 0) {\n if (where) {\n chainedMethods.push({ args: [where], method: 'where' })\n }\n\n joins.forEach(({ condition, table }) => {\n chainedMethods.push({\n args: [table, condition],\n method: 'leftJoin',\n })\n })\n\n let query\n const table = adapter.tables[tableName]\n\n if (adapter.name === 'postgres') {\n query = (db as TransactionPg)\n .selectDistinct(selectFields as Record<string, GenericPgColumn>)\n .from(table)\n }\n if (adapter.name === 'sqlite') {\n query = (db as TransactionSQLite)\n .selectDistinct(selectFields as Record<string, SQLiteColumn>)\n .from(table)\n }\n\n return chainMethods({\n methods: chainedMethods,\n query,\n })\n }\n}\n"],"names":["chainMethods","selectDistinct","adapter","chainedMethods","db","joins","selectFields","tableName","where","Object","keys","length","push","args","method","forEach","condition","table","query","tables","name","from","methods"],"mappings":"AAcA,SAASA,YAAY,QAAQ,0BAAyB;AAYtD;;CAEC,GACD,OAAO,MAAMC,iBAAiB,CAAC,EAC7BC,OAAO,EACPC,iBAAiB,EAAE,EACnBC,EAAE,EACFC,KAAK,EACLC,YAAY,EACZC,SAAS,EACTC,KAAK,EACA;IACL,IAAIC,OAAOC,IAAI,CAACL,OAAOM,MAAM,GAAG,GAAG;QACjC,IAAIH,OAAO;YACTL,eAAeS,IAAI,CAAC;gBAAEC,MAAM;oBAACL;iBAAM;gBAAEM,QAAQ;YAAQ;QACvD;QAEAT,MAAMU,OAAO,CAAC,CAAC,EAAEC,SAAS,EAAEC,KAAK,EAAE;YACjCd,eAAeS,IAAI,CAAC;gBAClBC,MAAM;oBAACI;oBAAOD;iBAAU;gBACxBF,QAAQ;YACV;QACF;QAEA,IAAII;QACJ,MAAMD,QAAQf,QAAQiB,MAAM,CAACZ,UAAU;QAEvC,IAAIL,QAAQkB,IAAI,KAAK,YAAY;YAC/BF,QAAQ,AAACd,GACNH,cAAc,CAACK,cACfe,IAAI,CAACJ;QACV;QACA,IAAIf,QAAQkB,IAAI,KAAK,UAAU;YAC7BF,QAAQ,AAACd,GACNH,cAAc,CAACK,cACfe,IAAI,CAACJ;QACV;QAEA,OAAOjB,aAAa;YAClBsB,SAASnB;YACTe;QACF;IACF;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"queryDrafts.d.ts","sourceRoot":"","sources":["../src/queryDrafts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,WAAW,EAA6B,MAAM,SAAS,CAAA;AASrF,eAAO,MAAM,WAAW,EAAE,WAuCzB,CAAA"}
1
+ {"version":3,"file":"queryDrafts.d.ts","sourceRoot":"","sources":["../src/queryDrafts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,WAAW,EAA6B,MAAM,SAAS,CAAA;AASrF,eAAO,MAAM,WAAW,EAAE,WAsCzB,CAAA"}
@@ -4,7 +4,7 @@ import { findMany } from './find/findMany.js';
4
4
  export const queryDrafts = async function queryDrafts({ collection, limit, locale, page = 1, pagination, req = {}, sort, where }) {
5
5
  const collectionConfig = this.payload.collections[collection].config;
6
6
  const tableName = this.tableNameMap.get(`_${toSnakeCase(collectionConfig.slug)}${this.versionsSuffix}`);
7
- const fields = buildVersionCollectionFields(collectionConfig);
7
+ const fields = buildVersionCollectionFields(this.payload.config, collectionConfig);
8
8
  const combinedWhere = combineQueries({
9
9
  latest: {
10
10
  equals: true
@@ -25,7 +25,6 @@ export const queryDrafts = async function queryDrafts({ collection, limit, local
25
25
  return {
26
26
  ...result,
27
27
  docs: result.docs.map((doc)=>{
28
- // eslint-disable-next-line no-param-reassign
29
28
  doc = {
30
29
  id: doc.parent,
31
30
  ...doc.version,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/queryDrafts.ts"],"sourcesContent":["import type { PayloadRequest, QueryDrafts, SanitizedCollectionConfig } from 'payload'\n\nimport { buildVersionCollectionFields, combineQueries } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter } from './types.js'\n\nimport { findMany } from './find/findMany.js'\n\nexport const queryDrafts: QueryDrafts = async function queryDrafts(\n this: DrizzleAdapter,\n { collection, limit, locale, page = 1, pagination, req = {} as PayloadRequest, sort, where },\n) {\n const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config\n const tableName = this.tableNameMap.get(\n `_${toSnakeCase(collectionConfig.slug)}${this.versionsSuffix}`,\n )\n const fields = buildVersionCollectionFields(collectionConfig)\n\n const combinedWhere = combineQueries({ latest: { equals: true } }, where)\n\n const result = await findMany({\n adapter: this,\n fields,\n limit,\n locale,\n page,\n pagination,\n req,\n sort,\n tableName,\n where: combinedWhere,\n })\n\n return {\n ...result,\n docs: result.docs.map((doc) => {\n // eslint-disable-next-line no-param-reassign\n doc = {\n id: doc.parent,\n ...doc.version,\n createdAt: doc.createdAt,\n updatedAt: doc.updatedAt,\n }\n\n return doc\n }),\n }\n}\n"],"names":["buildVersionCollectionFields","combineQueries","toSnakeCase","findMany","queryDrafts","collection","limit","locale","page","pagination","req","sort","where","collectionConfig","payload","collections","config","tableName","tableNameMap","get","slug","versionsSuffix","fields","combinedWhere","latest","equals","result","adapter","docs","map","doc","id","parent","version","createdAt","updatedAt"],"mappings":"AAEA,SAASA,4BAA4B,EAAEC,cAAc,QAAQ,UAAS;AACtE,OAAOC,iBAAiB,gBAAe;AAIvC,SAASC,QAAQ,QAAQ,qBAAoB;AAE7C,OAAO,MAAMC,cAA2B,eAAeA,YAErD,EAAEC,UAAU,EAAEC,KAAK,EAAEC,MAAM,EAAEC,OAAO,CAAC,EAAEC,UAAU,EAAEC,MAAM,CAAC,CAAmB,EAAEC,IAAI,EAAEC,KAAK,EAAE;IAE5F,MAAMC,mBAA8C,IAAI,CAACC,OAAO,CAACC,WAAW,CAACV,WAAW,CAACW,MAAM;IAC/F,MAAMC,YAAY,IAAI,CAACC,YAAY,CAACC,GAAG,CACrC,CAAC,CAAC,EAAEjB,YAAYW,iBAAiBO,IAAI,EAAE,EAAE,IAAI,CAACC,cAAc,CAAC,CAAC;IAEhE,MAAMC,SAAStB,6BAA6Ba;IAE5C,MAAMU,gBAAgBtB,eAAe;QAAEuB,QAAQ;YAAEC,QAAQ;QAAK;IAAE,GAAGb;IAEnE,MAAMc,SAAS,MAAMvB,SAAS;QAC5BwB,SAAS,IAAI;QACbL;QACAhB;QACAC;QACAC;QACAC;QACAC;QACAC;QACAM;QACAL,OAAOW;IACT;IAEA,OAAO;QACL,GAAGG,MAAM;QACTE,MAAMF,OAAOE,IAAI,CAACC,GAAG,CAAC,CAACC;YACrB,6CAA6C;YAC7CA,MAAM;gBACJC,IAAID,IAAIE,MAAM;gBACd,GAAGF,IAAIG,OAAO;gBACdC,WAAWJ,IAAII,SAAS;gBACxBC,WAAWL,IAAIK,SAAS;YAC1B;YAEA,OAAOL;QACT;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../src/queryDrafts.ts"],"sourcesContent":["import type { PayloadRequest, QueryDrafts, SanitizedCollectionConfig } from 'payload'\n\nimport { buildVersionCollectionFields, combineQueries } from 'payload'\nimport toSnakeCase from 'to-snake-case'\n\nimport type { DrizzleAdapter } from './types.js'\n\nimport { findMany } from './find/findMany.js'\n\nexport const queryDrafts: QueryDrafts = async function queryDrafts(\n this: DrizzleAdapter,\n { collection, limit, locale, page = 1, pagination, req = {} as PayloadRequest, sort, where },\n) {\n const collectionConfig: SanitizedCollectionConfig = this.payload.collections[collection].config\n const tableName = this.tableNameMap.get(\n `_${toSnakeCase(collectionConfig.slug)}${this.versionsSuffix}`,\n )\n const fields = buildVersionCollectionFields(this.payload.config, collectionConfig)\n\n const combinedWhere = combineQueries({ latest: { equals: true } }, where)\n\n const result = await findMany({\n adapter: this,\n fields,\n limit,\n locale,\n page,\n pagination,\n req,\n sort,\n tableName,\n where: combinedWhere,\n })\n\n return {\n ...result,\n docs: result.docs.map((doc) => {\n doc = {\n id: doc.parent,\n ...doc.version,\n createdAt: doc.createdAt,\n updatedAt: doc.updatedAt,\n }\n\n return doc\n }),\n }\n}\n"],"names":["buildVersionCollectionFields","combineQueries","toSnakeCase","findMany","queryDrafts","collection","limit","locale","page","pagination","req","sort","where","collectionConfig","payload","collections","config","tableName","tableNameMap","get","slug","versionsSuffix","fields","combinedWhere","latest","equals","result","adapter","docs","map","doc","id","parent","version","createdAt","updatedAt"],"mappings":"AAEA,SAASA,4BAA4B,EAAEC,cAAc,QAAQ,UAAS;AACtE,OAAOC,iBAAiB,gBAAe;AAIvC,SAASC,QAAQ,QAAQ,qBAAoB;AAE7C,OAAO,MAAMC,cAA2B,eAAeA,YAErD,EAAEC,UAAU,EAAEC,KAAK,EAAEC,MAAM,EAAEC,OAAO,CAAC,EAAEC,UAAU,EAAEC,MAAM,CAAC,CAAmB,EAAEC,IAAI,EAAEC,KAAK,EAAE;IAE5F,MAAMC,mBAA8C,IAAI,CAACC,OAAO,CAACC,WAAW,CAACV,WAAW,CAACW,MAAM;IAC/F,MAAMC,YAAY,IAAI,CAACC,YAAY,CAACC,GAAG,CACrC,CAAC,CAAC,EAAEjB,YAAYW,iBAAiBO,IAAI,EAAE,EAAE,IAAI,CAACC,cAAc,CAAC,CAAC;IAEhE,MAAMC,SAAStB,6BAA6B,IAAI,CAACc,OAAO,CAACE,MAAM,EAAEH;IAEjE,MAAMU,gBAAgBtB,eAAe;QAAEuB,QAAQ;YAAEC,QAAQ;QAAK;IAAE,GAAGb;IAEnE,MAAMc,SAAS,MAAMvB,SAAS;QAC5BwB,SAAS,IAAI;QACbL;QACAhB;QACAC;QACAC;QACAC;QACAC;QACAC;QACAM;QACAL,OAAOW;IACT;IAEA,OAAO;QACL,GAAGG,MAAM;QACTE,MAAMF,OAAOE,IAAI,CAACC,GAAG,CAAC,CAACC;YACrBA,MAAM;gBACJC,IAAID,IAAIE,MAAM;gBACd,GAAGF,IAAIG,OAAO;gBACdC,WAAWJ,IAAII,SAAS;gBACxBC,WAAWL,IAAIK,SAAS;YAC1B;YAEA,OAAOL;QACT;IACF;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"beginTransaction.d.ts","sourceRoot":"","sources":["../../src/transactions/beginTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAM/C,eAAO,MAAM,gBAAgB,EAAE,gBA0D9B,CAAA"}
1
+ {"version":3,"file":"beginTransaction.d.ts","sourceRoot":"","sources":["../../src/transactions/beginTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAM/C,eAAO,MAAM,gBAAgB,EAAE,gBA2D9B,CAAA"}
@@ -24,6 +24,7 @@ export const beginTransaction = async function beginTransaction(options) {
24
24
  return done;
25
25
  };
26
26
  reject = ()=>{
27
+ // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
27
28
  rej();
28
29
  return done;
29
30
  };
@@ -41,7 +42,10 @@ export const beginTransaction = async function beginTransaction(options) {
41
42
  resolve
42
43
  };
43
44
  } catch (err) {
44
- this.payload.logger.error(`Error: cannot begin transaction: ${err.message}`, err);
45
+ this.payload.logger.error({
46
+ err,
47
+ msg: `Error: cannot begin transaction: ${err.message}`
48
+ });
45
49
  process.exit(1);
46
50
  }
47
51
  return id;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/transactions/beginTransaction.ts"],"sourcesContent":["import type { BeginTransaction } from 'payload'\n\nimport { v4 as uuid } from 'uuid'\n\nimport type { DrizzleAdapter, DrizzleTransaction } from '../types.js'\n\nexport const beginTransaction: BeginTransaction = async function beginTransaction(\n this: DrizzleAdapter,\n options: DrizzleAdapter['transactionOptions'],\n) {\n let id\n try {\n id = uuid()\n\n let reject: () => Promise<void>\n let resolve: () => Promise<void>\n let transaction: DrizzleTransaction\n\n let transactionReady: () => void\n\n // Await initialization here\n // Prevent race conditions where the adapter may be\n // re-initializing, and `this.drizzle` is potentially undefined\n await this.initializing\n\n // Drizzle only exposes a transactions API that is sufficient if you\n // can directly pass around the `tx` argument. But our operations are spread\n // over many files and we don't want to pass the `tx` around like that,\n // so instead, we \"lift\" up the `resolve` and `reject` methods\n // and will call them in our respective transaction methods\n const done = this.drizzle\n .transaction(async (tx) => {\n transaction = tx\n await new Promise<void>((res, rej) => {\n resolve = () => {\n res()\n return done\n }\n reject = () => {\n rej()\n return done\n }\n transactionReady()\n })\n }, options || this.transactionOptions)\n .catch(() => {\n // swallow\n })\n\n // Need to wait until the transaction is ready\n // before binding its `resolve` and `reject` methods below\n await new Promise<void>((resolve) => (transactionReady = resolve))\n\n this.sessions[id] = {\n db: transaction,\n reject,\n resolve,\n }\n } catch (err) {\n this.payload.logger.error(`Error: cannot begin transaction: ${err.message}`, err)\n process.exit(1)\n }\n\n return id\n}\n"],"names":["v4","uuid","beginTransaction","options","id","reject","resolve","transaction","transactionReady","initializing","done","drizzle","tx","Promise","res","rej","transactionOptions","catch","sessions","db","err","payload","logger","error","message","process","exit"],"mappings":"AAEA,SAASA,MAAMC,IAAI,QAAQ,OAAM;AAIjC,OAAO,MAAMC,mBAAqC,eAAeA,iBAE/DC,OAA6C;IAE7C,IAAIC;IACJ,IAAI;QACFA,KAAKH;QAEL,IAAII;QACJ,IAAIC;QACJ,IAAIC;QAEJ,IAAIC;QAEJ,4BAA4B;QAC5B,mDAAmD;QACnD,+DAA+D;QAC/D,MAAM,IAAI,CAACC,YAAY;QAEvB,oEAAoE;QACpE,4EAA4E;QAC5E,uEAAuE;QACvE,8DAA8D;QAC9D,2DAA2D;QAC3D,MAAMC,OAAO,IAAI,CAACC,OAAO,CACtBJ,WAAW,CAAC,OAAOK;YAClBL,cAAcK;YACd,MAAM,IAAIC,QAAc,CAACC,KAAKC;gBAC5BT,UAAU;oBACRQ;oBACA,OAAOJ;gBACT;gBACAL,SAAS;oBACPU;oBACA,OAAOL;gBACT;gBACAF;YACF;QACF,GAAGL,WAAW,IAAI,CAACa,kBAAkB,EACpCC,KAAK,CAAC;QACL,UAAU;QACZ;QAEF,8CAA8C;QAC9C,0DAA0D;QAC1D,MAAM,IAAIJ,QAAc,CAACP,UAAaE,mBAAmBF;QAEzD,IAAI,CAACY,QAAQ,CAACd,GAAG,GAAG;YAClBe,IAAIZ;YACJF;YACAC;QACF;IACF,EAAE,OAAOc,KAAK;QACZ,IAAI,CAACC,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC,CAAC,iCAAiC,EAAEH,IAAII,OAAO,CAAC,CAAC,EAAEJ;QAC7EK,QAAQC,IAAI,CAAC;IACf;IAEA,OAAOtB;AACT,EAAC"}
1
+ {"version":3,"sources":["../../src/transactions/beginTransaction.ts"],"sourcesContent":["import type { BeginTransaction } from 'payload'\n\nimport { v4 as uuid } from 'uuid'\n\nimport type { DrizzleAdapter, DrizzleTransaction } from '../types.js'\n\nexport const beginTransaction: BeginTransaction = async function beginTransaction(\n this: DrizzleAdapter,\n options: DrizzleAdapter['transactionOptions'],\n) {\n let id\n try {\n id = uuid()\n\n let reject: () => Promise<void>\n let resolve: () => Promise<void>\n let transaction: DrizzleTransaction\n\n let transactionReady: () => void\n\n // Await initialization here\n // Prevent race conditions where the adapter may be\n // re-initializing, and `this.drizzle` is potentially undefined\n await this.initializing\n\n // Drizzle only exposes a transactions API that is sufficient if you\n // can directly pass around the `tx` argument. But our operations are spread\n // over many files and we don't want to pass the `tx` around like that,\n // so instead, we \"lift\" up the `resolve` and `reject` methods\n // and will call them in our respective transaction methods\n const done = this.drizzle\n .transaction(async (tx) => {\n transaction = tx\n await new Promise<void>((res, rej) => {\n resolve = () => {\n res()\n return done\n }\n reject = () => {\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n rej()\n return done\n }\n transactionReady()\n })\n }, options || this.transactionOptions)\n .catch(() => {\n // swallow\n })\n\n // Need to wait until the transaction is ready\n // before binding its `resolve` and `reject` methods below\n await new Promise<void>((resolve) => (transactionReady = resolve))\n\n this.sessions[id] = {\n db: transaction,\n reject,\n resolve,\n }\n } catch (err) {\n this.payload.logger.error({ err, msg: `Error: cannot begin transaction: ${err.message}` })\n process.exit(1)\n }\n\n return id\n}\n"],"names":["v4","uuid","beginTransaction","options","id","reject","resolve","transaction","transactionReady","initializing","done","drizzle","tx","Promise","res","rej","transactionOptions","catch","sessions","db","err","payload","logger","error","msg","message","process","exit"],"mappings":"AAEA,SAASA,MAAMC,IAAI,QAAQ,OAAM;AAIjC,OAAO,MAAMC,mBAAqC,eAAeA,iBAE/DC,OAA6C;IAE7C,IAAIC;IACJ,IAAI;QACFA,KAAKH;QAEL,IAAII;QACJ,IAAIC;QACJ,IAAIC;QAEJ,IAAIC;QAEJ,4BAA4B;QAC5B,mDAAmD;QACnD,+DAA+D;QAC/D,MAAM,IAAI,CAACC,YAAY;QAEvB,oEAAoE;QACpE,4EAA4E;QAC5E,uEAAuE;QACvE,8DAA8D;QAC9D,2DAA2D;QAC3D,MAAMC,OAAO,IAAI,CAACC,OAAO,CACtBJ,WAAW,CAAC,OAAOK;YAClBL,cAAcK;YACd,MAAM,IAAIC,QAAc,CAACC,KAAKC;gBAC5BT,UAAU;oBACRQ;oBACA,OAAOJ;gBACT;gBACAL,SAAS;oBACP,2EAA2E;oBAC3EU;oBACA,OAAOL;gBACT;gBACAF;YACF;QACF,GAAGL,WAAW,IAAI,CAACa,kBAAkB,EACpCC,KAAK,CAAC;QACL,UAAU;QACZ;QAEF,8CAA8C;QAC9C,0DAA0D;QAC1D,MAAM,IAAIJ,QAAc,CAACP,UAAaE,mBAAmBF;QAEzD,IAAI,CAACY,QAAQ,CAACd,GAAG,GAAG;YAClBe,IAAIZ;YACJF;YACAC;QACF;IACF,EAAE,OAAOc,KAAK;QACZ,IAAI,CAACC,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC;YAAEH;YAAKI,KAAK,CAAC,iCAAiC,EAAEJ,IAAIK,OAAO,CAAC,CAAC;QAAC;QACxFC,QAAQC,IAAI,CAAC;IACf;IAEA,OAAOvB;AACT,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"commitTransaction.d.ts","sourceRoot":"","sources":["../../src/transactions/commitTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAEhD,eAAO,MAAM,iBAAiB,EAAE,iBAe/B,CAAA"}
1
+ {"version":3,"file":"commitTransaction.d.ts","sourceRoot":"","sources":["../../src/transactions/commitTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAEhD,eAAO,MAAM,iBAAiB,EAAE,iBAiB/B,CAAA"}
@@ -1,5 +1,7 @@
1
1
  export const commitTransaction = async function commitTransaction(id) {
2
- if (id instanceof Promise) return;
2
+ if (id instanceof Promise) {
3
+ return;
4
+ }
3
5
  // if the session was deleted it has already been aborted
4
6
  if (!this.sessions[id]) {
5
7
  return;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/transactions/commitTransaction.ts"],"sourcesContent":["import type { CommitTransaction } from 'payload'\n\nexport const commitTransaction: CommitTransaction = async function commitTransaction(id) {\n if (id instanceof Promise) return\n\n // if the session was deleted it has already been aborted\n if (!this.sessions[id]) {\n return\n }\n\n try {\n await this.sessions[id].resolve()\n } catch (err: unknown) {\n await this.sessions[id].reject()\n }\n\n delete this.sessions[id]\n}\n"],"names":["commitTransaction","id","Promise","sessions","resolve","err","reject"],"mappings":"AAEA,OAAO,MAAMA,oBAAuC,eAAeA,kBAAkBC,EAAE;IACrF,IAAIA,cAAcC,SAAS;IAE3B,yDAAyD;IACzD,IAAI,CAAC,IAAI,CAACC,QAAQ,CAACF,GAAG,EAAE;QACtB;IACF;IAEA,IAAI;QACF,MAAM,IAAI,CAACE,QAAQ,CAACF,GAAG,CAACG,OAAO;IACjC,EAAE,OAAOC,KAAc;QACrB,MAAM,IAAI,CAACF,QAAQ,CAACF,GAAG,CAACK,MAAM;IAChC;IAEA,OAAO,IAAI,CAACH,QAAQ,CAACF,GAAG;AAC1B,EAAC"}
1
+ {"version":3,"sources":["../../src/transactions/commitTransaction.ts"],"sourcesContent":["import type { CommitTransaction } from 'payload'\n\nexport const commitTransaction: CommitTransaction = async function commitTransaction(id) {\n if (id instanceof Promise) {\n return\n }\n\n // if the session was deleted it has already been aborted\n if (!this.sessions[id]) {\n return\n }\n\n try {\n await this.sessions[id].resolve()\n } catch (err: unknown) {\n await this.sessions[id].reject()\n }\n\n delete this.sessions[id]\n}\n"],"names":["commitTransaction","id","Promise","sessions","resolve","err","reject"],"mappings":"AAEA,OAAO,MAAMA,oBAAuC,eAAeA,kBAAkBC,EAAE;IACrF,IAAIA,cAAcC,SAAS;QACzB;IACF;IAEA,yDAAyD;IACzD,IAAI,CAAC,IAAI,CAACC,QAAQ,CAACF,GAAG,EAAE;QACtB;IACF;IAEA,IAAI;QACF,MAAM,IAAI,CAACE,QAAQ,CAACF,GAAG,CAACG,OAAO;IACjC,EAAE,OAAOC,KAAc;QACrB,MAAM,IAAI,CAACF,QAAQ,CAACF,GAAG,CAACK,MAAM;IAChC;IAEA,OAAO,IAAI,CAACH,QAAQ,CAACF,GAAG;AAC1B,EAAC"}
@@ -4,7 +4,8 @@ type Args = {
4
4
  locale?: string;
5
5
  numberRows: Record<string, unknown>[];
6
6
  ref: Record<string, unknown>;
7
+ withinArrayOrBlockLocale?: string;
7
8
  };
8
- export declare const transformHasManyNumber: ({ field, locale, numberRows, ref }: Args) => void;
9
+ export declare const transformHasManyNumber: ({ field, locale, numberRows, ref, withinArrayOrBlockLocale, }: Args) => void;
9
10
  export {};
10
11
  //# sourceMappingURL=hasManyNumber.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hasManyNumber.d.ts","sourceRoot":"","sources":["../../../src/transform/read/hasManyNumber.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,KAAK,IAAI,GAAG;IACV,KAAK,EAAE,WAAW,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACrC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC7B,CAAA;AAED,eAAO,MAAM,sBAAsB,uCAAwC,IAAI,SAQ9E,CAAA"}
1
+ {"version":3,"file":"hasManyNumber.d.ts","sourceRoot":"","sources":["../../../src/transform/read/hasManyNumber.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAE1C,KAAK,IAAI,GAAG;IACV,KAAK,EAAE,WAAW,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;IACrC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC5B,wBAAwB,CAAC,EAAE,MAAM,CAAA;CAClC,CAAA;AAED,eAAO,MAAM,sBAAsB,kEAMhC,IAAI,SAoBN,CAAA"}