@payloadcms/drizzle 3.0.0-canary.2c2c95f

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 (290) hide show
  1. package/README.md +3 -0
  2. package/dist/count.d.ts +3 -0
  3. package/dist/count.d.ts.map +1 -0
  4. package/dist/count.js +25 -0
  5. package/dist/count.js.map +1 -0
  6. package/dist/create.d.ts +3 -0
  7. package/dist/create.d.ts.map +1 -0
  8. package/dist/create.js +19 -0
  9. package/dist/create.js.map +1 -0
  10. package/dist/createGlobal.d.ts +4 -0
  11. package/dist/createGlobal.d.ts.map +1 -0
  12. package/dist/createGlobal.js +19 -0
  13. package/dist/createGlobal.js.map +1 -0
  14. package/dist/createGlobalVersion.d.ts +4 -0
  15. package/dist/createGlobalVersion.d.ts.map +1 -0
  16. package/dist/createGlobalVersion.js +36 -0
  17. package/dist/createGlobalVersion.js.map +1 -0
  18. package/dist/createTableName.d.ts +31 -0
  19. package/dist/createTableName.d.ts.map +1 -0
  20. package/dist/createTableName.js +31 -0
  21. package/dist/createTableName.js.map +1 -0
  22. package/dist/createVersion.d.ts +4 -0
  23. package/dist/createVersion.d.ts.map +1 -0
  24. package/dist/createVersion.js +43 -0
  25. package/dist/createVersion.js.map +1 -0
  26. package/dist/deleteMany.d.ts +3 -0
  27. package/dist/deleteMany.d.ts.map +1 -0
  28. package/dist/deleteMany.js +32 -0
  29. package/dist/deleteMany.js.map +1 -0
  30. package/dist/deleteOne.d.ts +3 -0
  31. package/dist/deleteOne.d.ts.map +1 -0
  32. package/dist/deleteOne.js +63 -0
  33. package/dist/deleteOne.js.map +1 -0
  34. package/dist/deleteVersions.d.ts +3 -0
  35. package/dist/deleteVersions.d.ts.map +1 -0
  36. package/dist/deleteVersions.js +35 -0
  37. package/dist/deleteVersions.js.map +1 -0
  38. package/dist/destroy.d.ts +3 -0
  39. package/dist/destroy.d.ts.map +1 -0
  40. package/dist/destroy.js +15 -0
  41. package/dist/destroy.js.map +1 -0
  42. package/dist/find/buildFindManyArgs.d.ts +17 -0
  43. package/dist/find/buildFindManyArgs.d.ts.map +1 -0
  44. package/dist/find/buildFindManyArgs.js +65 -0
  45. package/dist/find/buildFindManyArgs.js.map +1 -0
  46. package/dist/find/chainMethods.d.ts +16 -0
  47. package/dist/find/chainMethods.d.ts.map +1 -0
  48. package/dist/find/chainMethods.js +12 -0
  49. package/dist/find/chainMethods.js.map +1 -0
  50. package/dist/find/findMany.d.ts +21 -0
  51. package/dist/find/findMany.d.ts.map +1 -0
  52. package/dist/find/findMany.js +141 -0
  53. package/dist/find/findMany.js.map +1 -0
  54. package/dist/find/traverseFields.d.ts +17 -0
  55. package/dist/find/traverseFields.d.ts.map +1 -0
  56. package/dist/find/traverseFields.js +156 -0
  57. package/dist/find/traverseFields.js.map +1 -0
  58. package/dist/find.d.ts +3 -0
  59. package/dist/find.d.ts.map +1 -0
  60. package/dist/find.js +21 -0
  61. package/dist/find.js.map +1 -0
  62. package/dist/findGlobal.d.ts +3 -0
  63. package/dist/findGlobal.d.ts.map +1 -0
  64. package/dist/findGlobal.js +23 -0
  65. package/dist/findGlobal.js.map +1 -0
  66. package/dist/findGlobalVersions.d.ts +3 -0
  67. package/dist/findGlobalVersions.d.ts.map +1 -0
  68. package/dist/findGlobalVersions.js +24 -0
  69. package/dist/findGlobalVersions.js.map +1 -0
  70. package/dist/findMigrationDir.d.ts +16 -0
  71. package/dist/findMigrationDir.d.ts.map +1 -0
  72. package/dist/findMigrationDir.js +36 -0
  73. package/dist/findMigrationDir.js.map +1 -0
  74. package/dist/findOne.d.ts +4 -0
  75. package/dist/findOne.d.ts.map +1 -0
  76. package/dist/findOne.js +21 -0
  77. package/dist/findOne.js.map +1 -0
  78. package/dist/findVersions.d.ts +3 -0
  79. package/dist/findVersions.d.ts.map +1 -0
  80. package/dist/findVersions.js +24 -0
  81. package/dist/findVersions.js.map +1 -0
  82. package/dist/index.d.ts +38 -0
  83. package/dist/index.d.ts.map +1 -0
  84. package/dist/index.js +38 -0
  85. package/dist/index.js.map +1 -0
  86. package/dist/migrate.d.ts +3 -0
  87. package/dist/migrate.d.ts.map +1 -0
  88. package/dist/migrate.js +97 -0
  89. package/dist/migrate.js.map +1 -0
  90. package/dist/migrateDown.d.ts +3 -0
  91. package/dist/migrateDown.d.ts.map +1 -0
  92. package/dist/migrateDown.js +63 -0
  93. package/dist/migrateDown.js.map +1 -0
  94. package/dist/migrateFresh.d.ts +8 -0
  95. package/dist/migrateFresh.d.ts.map +1 -0
  96. package/dist/migrateFresh.js +75 -0
  97. package/dist/migrateFresh.js.map +1 -0
  98. package/dist/migrateRefresh.d.ts +6 -0
  99. package/dist/migrateRefresh.d.ts.map +1 -0
  100. package/dist/migrateRefresh.js +102 -0
  101. package/dist/migrateRefresh.js.map +1 -0
  102. package/dist/migrateReset.d.ts +6 -0
  103. package/dist/migrateReset.d.ts.map +1 -0
  104. package/dist/migrateReset.js +82 -0
  105. package/dist/migrateReset.js.map +1 -0
  106. package/dist/migrateStatus.d.ts +3 -0
  107. package/dist/migrateStatus.d.ts.map +1 -0
  108. package/dist/migrateStatus.js +44 -0
  109. package/dist/migrateStatus.js.map +1 -0
  110. package/dist/queries/buildAndOrConditions.d.ts +16 -0
  111. package/dist/queries/buildAndOrConditions.d.ts.map +1 -0
  112. package/dist/queries/buildAndOrConditions.js +28 -0
  113. package/dist/queries/buildAndOrConditions.js.map +1 -0
  114. package/dist/queries/buildQuery.d.ts +29 -0
  115. package/dist/queries/buildQuery.d.ts.map +1 -0
  116. package/dist/queries/buildQuery.js +72 -0
  117. package/dist/queries/buildQuery.js.map +1 -0
  118. package/dist/queries/getTableAlias.d.ts +13 -0
  119. package/dist/queries/getTableAlias.d.ts.map +1 -0
  120. package/dist/queries/getTableAlias.js +20 -0
  121. package/dist/queries/getTableAlias.js.map +1 -0
  122. package/dist/queries/getTableColumnFromPath.d.ts +51 -0
  123. package/dist/queries/getTableColumnFromPath.d.ts.map +1 -0
  124. package/dist/queries/getTableColumnFromPath.js +532 -0
  125. package/dist/queries/getTableColumnFromPath.js.map +1 -0
  126. package/dist/queries/operatorMap.d.ts +6 -0
  127. package/dist/queries/operatorMap.d.ts.map +1 -0
  128. package/dist/queries/operatorMap.js +24 -0
  129. package/dist/queries/operatorMap.js.map +1 -0
  130. package/dist/queries/parseParams.d.ts +16 -0
  131. package/dist/queries/parseParams.d.ts.map +1 -0
  132. package/dist/queries/parseParams.js +188 -0
  133. package/dist/queries/parseParams.js.map +1 -0
  134. package/dist/queries/sanitizeQueryValue.d.ts +15 -0
  135. package/dist/queries/sanitizeQueryValue.d.ts.map +1 -0
  136. package/dist/queries/sanitizeQueryValue.js +120 -0
  137. package/dist/queries/sanitizeQueryValue.js.map +1 -0
  138. package/dist/queries/selectDistinct.d.ts +22 -0
  139. package/dist/queries/selectDistinct.d.ts.map +1 -0
  140. package/dist/queries/selectDistinct.js +38 -0
  141. package/dist/queries/selectDistinct.js.map +1 -0
  142. package/dist/queryDrafts.d.ts +3 -0
  143. package/dist/queryDrafts.d.ts.map +1 -0
  144. package/dist/queryDrafts.js +40 -0
  145. package/dist/queryDrafts.js.map +1 -0
  146. package/dist/transactions/beginTransaction.d.ts +3 -0
  147. package/dist/transactions/beginTransaction.d.ts.map +1 -0
  148. package/dist/transactions/beginTransaction.js +51 -0
  149. package/dist/transactions/beginTransaction.js.map +1 -0
  150. package/dist/transactions/commitTransaction.d.ts +3 -0
  151. package/dist/transactions/commitTransaction.d.ts.map +1 -0
  152. package/dist/transactions/commitTransaction.js +15 -0
  153. package/dist/transactions/commitTransaction.js.map +1 -0
  154. package/dist/transactions/rollbackTransaction.d.ts +3 -0
  155. package/dist/transactions/rollbackTransaction.d.ts.map +1 -0
  156. package/dist/transactions/rollbackTransaction.js +14 -0
  157. package/dist/transactions/rollbackTransaction.js.map +1 -0
  158. package/dist/transform/read/hasManyNumber.d.ts +10 -0
  159. package/dist/transform/read/hasManyNumber.d.ts.map +1 -0
  160. package/dist/transform/read/hasManyNumber.js +10 -0
  161. package/dist/transform/read/hasManyNumber.js.map +1 -0
  162. package/dist/transform/read/hasManyText.d.ts +10 -0
  163. package/dist/transform/read/hasManyText.d.ts.map +1 -0
  164. package/dist/transform/read/hasManyText.js +10 -0
  165. package/dist/transform/read/hasManyText.js.map +1 -0
  166. package/dist/transform/read/index.d.ts +13 -0
  167. package/dist/transform/read/index.d.ts.map +1 -0
  168. package/dist/transform/read/index.js +44 -0
  169. package/dist/transform/read/index.js.map +1 -0
  170. package/dist/transform/read/relationship.d.ts +10 -0
  171. package/dist/transform/read/relationship.d.ts.map +1 -0
  172. package/dist/transform/read/relationship.js +60 -0
  173. package/dist/transform/read/relationship.js.map +1 -0
  174. package/dist/transform/read/traverseFields.d.ts +57 -0
  175. package/dist/transform/read/traverseFields.d.ts.map +1 -0
  176. package/dist/transform/read/traverseFields.js +435 -0
  177. package/dist/transform/read/traverseFields.js.map +1 -0
  178. package/dist/transform/write/array.d.ts +26 -0
  179. package/dist/transform/write/array.d.ts.map +1 -0
  180. package/dist/transform/write/array.js +58 -0
  181. package/dist/transform/write/array.js.map +1 -0
  182. package/dist/transform/write/blocks.d.ts +25 -0
  183. package/dist/transform/write/blocks.d.ts.map +1 -0
  184. package/dist/transform/write/blocks.js +54 -0
  185. package/dist/transform/write/blocks.js.map +1 -0
  186. package/dist/transform/write/index.d.ts +13 -0
  187. package/dist/transform/write/index.d.ts.map +1 -0
  188. package/dist/transform/write/index.js +41 -0
  189. package/dist/transform/write/index.js.map +1 -0
  190. package/dist/transform/write/numbers.d.ts +8 -0
  191. package/dist/transform/write/numbers.d.ts.map +1 -0
  192. package/dist/transform/write/numbers.js +11 -0
  193. package/dist/transform/write/numbers.js.map +1 -0
  194. package/dist/transform/write/relationships.d.ts +10 -0
  195. package/dist/transform/write/relationships.d.ts.map +1 -0
  196. package/dist/transform/write/relationships.js +23 -0
  197. package/dist/transform/write/relationships.js.map +1 -0
  198. package/dist/transform/write/selects.d.ts +8 -0
  199. package/dist/transform/write/selects.d.ts.map +1 -0
  200. package/dist/transform/write/selects.js +20 -0
  201. package/dist/transform/write/selects.js.map +1 -0
  202. package/dist/transform/write/texts.d.ts +8 -0
  203. package/dist/transform/write/texts.d.ts.map +1 -0
  204. package/dist/transform/write/texts.js +11 -0
  205. package/dist/transform/write/texts.js.map +1 -0
  206. package/dist/transform/write/traverseFields.d.ts +50 -0
  207. package/dist/transform/write/traverseFields.d.ts.map +1 -0
  208. package/dist/transform/write/traverseFields.js +452 -0
  209. package/dist/transform/write/traverseFields.js.map +1 -0
  210. package/dist/transform/write/types.d.ts +43 -0
  211. package/dist/transform/write/types.d.ts.map +1 -0
  212. package/dist/transform/write/types.js +3 -0
  213. package/dist/transform/write/types.js.map +1 -0
  214. package/dist/types.d.ts +145 -0
  215. package/dist/types.d.ts.map +1 -0
  216. package/dist/types.js +3 -0
  217. package/dist/types.js.map +1 -0
  218. package/dist/update.d.ts +3 -0
  219. package/dist/update.d.ts.map +1 -0
  220. package/dist/update.js +54 -0
  221. package/dist/update.js.map +1 -0
  222. package/dist/updateGlobal.d.ts +4 -0
  223. package/dist/updateGlobal.d.ts.map +1 -0
  224. package/dist/updateGlobal.js +25 -0
  225. package/dist/updateGlobal.js.map +1 -0
  226. package/dist/updateGlobalVersion.d.ts +4 -0
  227. package/dist/updateGlobalVersion.d.ts.map +1 -0
  228. package/dist/updateGlobalVersion.js +36 -0
  229. package/dist/updateGlobalVersion.js.map +1 -0
  230. package/dist/updateVersion.d.ts +4 -0
  231. package/dist/updateVersion.d.ts.map +1 -0
  232. package/dist/updateVersion.js +36 -0
  233. package/dist/updateVersion.js.map +1 -0
  234. package/dist/upsertRow/deleteExistingArrayRows.d.ts +10 -0
  235. package/dist/upsertRow/deleteExistingArrayRows.d.ts.map +1 -0
  236. package/dist/upsertRow/deleteExistingArrayRows.js +14 -0
  237. package/dist/upsertRow/deleteExistingArrayRows.js.map +1 -0
  238. package/dist/upsertRow/deleteExistingRowsByPath.d.ts +14 -0
  239. package/dist/upsertRow/deleteExistingRowsByPath.d.ts.map +1 -0
  240. package/dist/upsertRow/deleteExistingRowsByPath.js +41 -0
  241. package/dist/upsertRow/deleteExistingRowsByPath.js.map +1 -0
  242. package/dist/upsertRow/index.d.ts +4 -0
  243. package/dist/upsertRow/index.d.ts.map +1 -0
  244. package/dist/upsertRow/index.js +337 -0
  245. package/dist/upsertRow/index.js.map +1 -0
  246. package/dist/upsertRow/insertArrays.d.ts +13 -0
  247. package/dist/upsertRow/insertArrays.d.ts.map +1 -0
  248. package/dist/upsertRow/insertArrays.js +76 -0
  249. package/dist/upsertRow/insertArrays.js.map +1 -0
  250. package/dist/upsertRow/types.d.ts +32 -0
  251. package/dist/upsertRow/types.d.ts.map +1 -0
  252. package/dist/upsertRow/types.js +3 -0
  253. package/dist/upsertRow/types.js.map +1 -0
  254. package/dist/utilities/appendPrefixToKeys.d.ts +2 -0
  255. package/dist/utilities/appendPrefixToKeys.d.ts.map +1 -0
  256. package/dist/utilities/appendPrefixToKeys.js +6 -0
  257. package/dist/utilities/appendPrefixToKeys.js.map +1 -0
  258. package/dist/utilities/createBlocksMap.d.ts +5 -0
  259. package/dist/utilities/createBlocksMap.d.ts.map +1 -0
  260. package/dist/utilities/createBlocksMap.js +29 -0
  261. package/dist/utilities/createBlocksMap.js.map +1 -0
  262. package/dist/utilities/createRelationshipMap.d.ts +2 -0
  263. package/dist/utilities/createRelationshipMap.d.ts.map +1 -0
  264. package/dist/utilities/createRelationshipMap.js +19 -0
  265. package/dist/utilities/createRelationshipMap.js.map +1 -0
  266. package/dist/utilities/hasLocalesTable.d.ts +3 -0
  267. package/dist/utilities/hasLocalesTable.d.ts.map +1 -0
  268. package/dist/utilities/hasLocalesTable.js +11 -0
  269. package/dist/utilities/hasLocalesTable.js.map +1 -0
  270. package/dist/utilities/isArrayOfRows.d.ts +2 -0
  271. package/dist/utilities/isArrayOfRows.d.ts.map +1 -0
  272. package/dist/utilities/isArrayOfRows.js +5 -0
  273. package/dist/utilities/isArrayOfRows.js.map +1 -0
  274. package/dist/utilities/migrationTableExists.d.ts +3 -0
  275. package/dist/utilities/migrationTableExists.d.ts.map +1 -0
  276. package/dist/utilities/migrationTableExists.js +25 -0
  277. package/dist/utilities/migrationTableExists.js.map +1 -0
  278. package/dist/utilities/parseError.d.ts +5 -0
  279. package/dist/utilities/parseError.d.ts.map +1 -0
  280. package/dist/utilities/parseError.js +15 -0
  281. package/dist/utilities/parseError.js.map +1 -0
  282. package/dist/utilities/pushDevSchema.d.ts +9 -0
  283. package/dist/utilities/pushDevSchema.d.ts.map +1 -0
  284. package/dist/utilities/pushDevSchema.js +53 -0
  285. package/dist/utilities/pushDevSchema.js.map +1 -0
  286. package/dist/utilities/validateExistingBlockIsIdentical.d.ts +11 -0
  287. package/dist/utilities/validateExistingBlockIsIdentical.d.ts.map +1 -0
  288. package/dist/utilities/validateExistingBlockIsIdentical.js +76 -0
  289. package/dist/utilities/validateExistingBlockIsIdentical.js.map +1 -0
  290. package/package.json +53 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/queries/operatorMap.ts"],"sourcesContent":["import {\n type Column,\n type SQL,\n type SQLWrapper,\n and,\n eq,\n gt,\n gte,\n ilike,\n inArray,\n isNotNull,\n isNull,\n lt,\n lte,\n ne,\n notInArray,\n or,\n} from 'drizzle-orm'\n\ntype OperatorKeys =\n | 'and'\n | 'contains'\n | 'equals'\n | 'exists'\n | 'greater_than'\n | 'greater_than_equal'\n | 'in'\n | 'isNull'\n | 'less_than'\n | 'less_than_equal'\n | 'like'\n | 'not_equals'\n | 'not_in'\n | 'or'\n\nexport type Operators = Record<OperatorKeys, (column: Column, value: SQLWrapper | unknown) => SQL>\n\nexport const operatorMap: Operators = {\n and,\n contains: ilike,\n equals: eq,\n exists: isNotNull,\n greater_than: gt,\n greater_than_equal: gte,\n in: inArray,\n isNull, // handles exists: false\n less_than: lt,\n less_than_equal: lte,\n like: ilike,\n not_equals: ne,\n // TODO: geojson queries\n // intersects: intersects,\n // near: near,\n // within: within,\n // all: all,\n not_in: notInArray,\n or,\n}\n"],"names":["and","eq","gt","gte","ilike","inArray","isNotNull","isNull","lt","lte","ne","notInArray","or","operatorMap","contains","equals","exists","greater_than","greater_than_equal","in","less_than","less_than_equal","like","not_equals","not_in"],"mappings":"AAAA,SAIEA,GAAG,EACHC,EAAE,EACFC,EAAE,EACFC,GAAG,EACHC,KAAK,EACLC,OAAO,EACPC,SAAS,EACTC,MAAM,EACNC,EAAE,EACFC,GAAG,EACHC,EAAE,EACFC,UAAU,EACVC,EAAE,QACG,cAAa;AAoBpB,OAAO,MAAMC,cAAyB;IACpCb;IACAc,UAAUV;IACVW,QAAQd;IACRe,QAAQV;IACRW,cAAcf;IACdgB,oBAAoBf;IACpBgB,IAAId;IACJE;IACAa,WAAWZ;IACXa,iBAAiBZ;IACjBa,MAAMlB;IACNmB,YAAYb;IACZ,wBAAwB;IACxB,0BAA0B;IAC1B,cAAc;IACd,kBAAkB;IAClB,YAAY;IACZc,QAAQb;IACRC;AACF,EAAC"}
@@ -0,0 +1,16 @@
1
+ import type { SQL } from 'drizzle-orm';
2
+ import type { Field, Where } from 'payload';
3
+ import type { DrizzleAdapter, GenericColumn } from '../types.js';
4
+ import type { BuildQueryJoinAliases } from './buildQuery.js';
5
+ type Args = {
6
+ adapter: DrizzleAdapter;
7
+ fields: Field[];
8
+ joins: BuildQueryJoinAliases;
9
+ locale: string;
10
+ selectFields: Record<string, GenericColumn>;
11
+ tableName: string;
12
+ where: Where;
13
+ };
14
+ export declare function parseParams({ adapter, fields, joins, locale, selectFields, tableName, where, }: Args): Promise<SQL>;
15
+ export {};
16
+ //# sourceMappingURL=parseParams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseParams.d.ts","sourceRoot":"","sources":["../../src/queries/parseParams.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,KAAK,EAAE,KAAK,EAAY,KAAK,EAAE,MAAM,SAAS,CAAA;AAMrD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAA;AAM5D,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,cAAc,CAAA;IACvB,MAAM,EAAE,KAAK,EAAE,CAAA;IACf,KAAK,EAAE,qBAAqB,CAAA;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IAC3C,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,KAAK,CAAA;CACb,CAAA;AAED,wBAAsB,WAAW,CAAC,EAChC,OAAO,EACP,MAAM,EACN,KAAK,EACL,MAAM,EACN,YAAY,EACZ,SAAS,EACT,KAAK,GACN,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CA8NrB"}
@@ -0,0 +1,188 @@
1
+ /* eslint-disable no-await-in-loop */ import { and, isNotNull, isNull, ne, notInArray, or, sql } from 'drizzle-orm';
2
+ import { QueryError } from 'payload';
3
+ import { validOperators } from 'payload/shared';
4
+ import { buildAndOrConditions } from './buildAndOrConditions.js';
5
+ import { getTableColumnFromPath } from './getTableColumnFromPath.js';
6
+ import { sanitizeQueryValue } from './sanitizeQueryValue.js';
7
+ export async function parseParams({ adapter, fields, joins, locale, selectFields, tableName, where }) {
8
+ let result;
9
+ const constraints = [];
10
+ if (typeof where === 'object' && Object.keys(where).length > 0) {
11
+ // We need to determine if the whereKey is an AND, OR, or a schema path
12
+ for (const relationOrPath of Object.keys(where)){
13
+ if (relationOrPath) {
14
+ const condition = where[relationOrPath];
15
+ let conditionOperator;
16
+ if (relationOrPath.toLowerCase() === 'and') {
17
+ conditionOperator = and;
18
+ } else if (relationOrPath.toLowerCase() === 'or') {
19
+ conditionOperator = or;
20
+ }
21
+ if (Array.isArray(condition)) {
22
+ const builtConditions = await buildAndOrConditions({
23
+ adapter,
24
+ fields,
25
+ joins,
26
+ locale,
27
+ selectFields,
28
+ tableName,
29
+ where: condition
30
+ });
31
+ if (builtConditions.length > 0) {
32
+ result = conditionOperator(...builtConditions);
33
+ }
34
+ } else {
35
+ // It's a path - and there can be multiple comparisons on a single path.
36
+ // For example - title like 'test' and title not equal to 'tester'
37
+ // So we need to loop on keys again here to handle each operator independently
38
+ const pathOperators = where[relationOrPath];
39
+ if (typeof pathOperators === 'object') {
40
+ for (let operator of Object.keys(pathOperators)){
41
+ if (validOperators.includes(operator)) {
42
+ const val = where[relationOrPath][operator];
43
+ const { columnName, constraints: queryConstraints, field, getNotNullColumnByValue, pathSegments, rawColumn, table } = getTableColumnFromPath({
44
+ adapter,
45
+ collectionPath: relationOrPath,
46
+ fields,
47
+ joins,
48
+ locale,
49
+ pathSegments: relationOrPath.replace(/__/g, '.').split('.'),
50
+ selectFields,
51
+ tableName,
52
+ value: val
53
+ });
54
+ queryConstraints.forEach(({ columnName: col, table: constraintTable, value })=>{
55
+ if (typeof value === 'string' && value.indexOf('%') > -1) {
56
+ constraints.push(adapter.operators.like(constraintTable[col], value));
57
+ } else {
58
+ constraints.push(adapter.operators.equals(constraintTable[col], value));
59
+ }
60
+ });
61
+ if ([
62
+ 'json',
63
+ 'richText'
64
+ ].includes(field.type) && Array.isArray(pathSegments) && pathSegments.length > 1) {
65
+ const segments = pathSegments.slice(1);
66
+ segments.unshift(table[columnName].name);
67
+ if (field.type === 'richText') {
68
+ // use the table name from the nearest join to handle blocks, arrays, etc. or use the tableName arg
69
+ const jsonTable = joins.length === 0 ? tableName : joins[joins.length - 1].table[Object.getOwnPropertySymbols(joins[joins.length - 1].table)[0]];
70
+ const jsonQuery = adapter.createJSONQuery({
71
+ operator,
72
+ pathSegments: segments,
73
+ table: jsonTable,
74
+ treatAsArray: [
75
+ 'children'
76
+ ],
77
+ treatRootAsArray: true,
78
+ value: val
79
+ });
80
+ constraints.push(sql.raw(jsonQuery));
81
+ break;
82
+ }
83
+ const jsonQuery = adapter.convertPathToJSONTraversal(pathSegments);
84
+ const operatorKeys = {
85
+ contains: {
86
+ operator: 'like',
87
+ wildcard: '%'
88
+ },
89
+ equals: {
90
+ operator: '=',
91
+ wildcard: ''
92
+ },
93
+ exists: {
94
+ operator: val === true ? 'is not null' : 'is null'
95
+ },
96
+ like: {
97
+ operator: 'like',
98
+ wildcard: '%'
99
+ },
100
+ not_equals: {
101
+ operator: '<>',
102
+ wildcard: ''
103
+ }
104
+ };
105
+ let formattedValue = val;
106
+ if (adapter.name === 'sqlite' && operator === 'equals' && !isNaN(val)) {
107
+ formattedValue = val;
108
+ } else {
109
+ formattedValue = `'${operatorKeys[operator].wildcard}${val}${operatorKeys[operator].wildcard}'`;
110
+ }
111
+ if (operator === 'exists') {
112
+ formattedValue = '';
113
+ }
114
+ constraints.push(sql.raw(`${table[columnName].name}${jsonQuery} ${operatorKeys[operator].operator} ${formattedValue}`));
115
+ break;
116
+ }
117
+ if (getNotNullColumnByValue) {
118
+ const columnName = getNotNullColumnByValue(val);
119
+ if (columnName) {
120
+ constraints.push(isNotNull(table[columnName]));
121
+ } else {
122
+ throw new QueryError([
123
+ {
124
+ path: relationOrPath
125
+ }
126
+ ]);
127
+ }
128
+ break;
129
+ }
130
+ if (operator === 'like' && (field.type === 'number' || table[columnName].columnType === 'PgUUID')) {
131
+ operator = 'equals';
132
+ }
133
+ if (operator === 'like') {
134
+ constraints.push(and(...val.split(' ').map((word)=>adapter.operators.like(table[columnName], `%${word}%`))));
135
+ break;
136
+ }
137
+ const sanitizedQueryValue = sanitizeQueryValue({
138
+ adapter,
139
+ field,
140
+ operator,
141
+ relationOrPath,
142
+ val
143
+ });
144
+ if (sanitizedQueryValue === null) {
145
+ break;
146
+ }
147
+ const { operator: queryOperator, value: queryValue } = sanitizedQueryValue;
148
+ if (queryOperator === 'not_equals' && queryValue !== null) {
149
+ constraints.push(or(isNull(rawColumn || table[columnName]), /* eslint-disable @typescript-eslint/no-explicit-any */ ne(rawColumn || table[columnName], queryValue)));
150
+ break;
151
+ }
152
+ if ((field.type === 'relationship' || field.type === 'upload') && Array.isArray(queryValue) && operator === 'not_in') {
153
+ constraints.push(sql`(${notInArray(table[columnName], queryValue)} OR
154
+ ${table[columnName]}
155
+ IS
156
+ NULL)`);
157
+ break;
158
+ }
159
+ if (operator === 'equals' && queryValue === null) {
160
+ constraints.push(isNull(rawColumn || table[columnName]));
161
+ break;
162
+ }
163
+ if (operator === 'not_equals' && queryValue === null) {
164
+ constraints.push(isNotNull(rawColumn || table[columnName]));
165
+ break;
166
+ }
167
+ constraints.push(adapter.operators[queryOperator](rawColumn || table[columnName], queryValue));
168
+ }
169
+ }
170
+ }
171
+ }
172
+ }
173
+ }
174
+ }
175
+ if (constraints.length > 0) {
176
+ if (result) {
177
+ result = and(result, ...constraints);
178
+ } else {
179
+ result = and(...constraints);
180
+ }
181
+ }
182
+ if (constraints.length === 1 && !result) {
183
+ [result] = constraints;
184
+ }
185
+ return result;
186
+ }
187
+
188
+ //# sourceMappingURL=parseParams.js.map
@@ -0,0 +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":"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"}
@@ -0,0 +1,15 @@
1
+ import { type Field, type TabAsField } from 'payload';
2
+ import type { DrizzleAdapter } from '../types.js';
3
+ type SanitizeQueryValueArgs = {
4
+ adapter: DrizzleAdapter;
5
+ field: Field | TabAsField;
6
+ operator: string;
7
+ relationOrPath: string;
8
+ val: any;
9
+ };
10
+ export declare const sanitizeQueryValue: ({ adapter, field, operator: operatorArg, relationOrPath, val, }: SanitizeQueryValueArgs) => {
11
+ operator: string;
12
+ value: unknown;
13
+ };
14
+ export {};
15
+ //# sourceMappingURL=sanitizeQueryValue.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,120 @@
1
+ import { APIError, createArrayFromCommaDelineated } from 'payload';
2
+ import { fieldAffectsData } from 'payload/shared';
3
+ export const sanitizeQueryValue = ({ adapter, field, operator: operatorArg, relationOrPath, val })=>{
4
+ let operator = operatorArg;
5
+ let formattedValue = val;
6
+ if (!fieldAffectsData(field)) return {
7
+ operator,
8
+ value: formattedValue
9
+ };
10
+ if ((field.type === 'relationship' || field.type === 'upload') && !relationOrPath.endsWith('relationTo') && Array.isArray(formattedValue)) {
11
+ const allPossibleIDTypes = [];
12
+ formattedValue.forEach((val)=>{
13
+ if (adapter.idType !== 'uuid' && typeof val === 'string') {
14
+ allPossibleIDTypes.push(val, parseInt(val));
15
+ } else if (typeof val === 'string') {
16
+ allPossibleIDTypes.push(val);
17
+ } else {
18
+ allPossibleIDTypes.push(val, String(val));
19
+ }
20
+ });
21
+ formattedValue = allPossibleIDTypes;
22
+ }
23
+ // Cast incoming values as proper searchable types
24
+ if (field.type === 'checkbox' && typeof val === 'string') {
25
+ if (val.toLowerCase() === 'true') formattedValue = true;
26
+ if (val.toLowerCase() === 'false') formattedValue = false;
27
+ }
28
+ if ([
29
+ 'all',
30
+ 'in',
31
+ 'not_in'
32
+ ].includes(operator)) {
33
+ if (typeof formattedValue === 'string') {
34
+ formattedValue = createArrayFromCommaDelineated(formattedValue);
35
+ if (field.type === 'number') {
36
+ formattedValue = formattedValue.map((arrayVal)=>parseFloat(arrayVal));
37
+ }
38
+ }
39
+ if (!Array.isArray(formattedValue) || formattedValue.length === 0) {
40
+ return null;
41
+ }
42
+ }
43
+ if (field.type === 'number' && typeof formattedValue === 'string') {
44
+ formattedValue = Number(val);
45
+ }
46
+ if (field.type === 'date' && operator !== 'exists') {
47
+ if (typeof val === 'string') {
48
+ formattedValue = new Date(val).toISOString();
49
+ if (Number.isNaN(Date.parse(formattedValue))) {
50
+ return {
51
+ operator,
52
+ value: undefined
53
+ };
54
+ }
55
+ } else if (typeof val === 'number') formattedValue = new Date(val).toISOString();
56
+ }
57
+ if (field.type === 'relationship' || field.type === 'upload') {
58
+ if (val === 'null') {
59
+ formattedValue = null;
60
+ } else if (!(formattedValue === null || typeof formattedValue === 'boolean')) {
61
+ // convert the value to the idType of the relationship
62
+ let idType;
63
+ 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];
73
+ } 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';
78
+ }
79
+ if (Array.isArray(formattedValue)) {
80
+ formattedValue = formattedValue.map((value)=>{
81
+ if (idType === 'number') {
82
+ return Number(value);
83
+ }
84
+ if (idType === 'text') {
85
+ return String(value);
86
+ }
87
+ return value;
88
+ });
89
+ } else {
90
+ if (idType === 'number') {
91
+ formattedValue = Number(val);
92
+ }
93
+ if (idType === 'text') {
94
+ formattedValue = String(val);
95
+ }
96
+ }
97
+ }
98
+ }
99
+ if ('hasMany' in field && field.hasMany && operator === 'contains') {
100
+ operator = 'equals';
101
+ }
102
+ if (operator === 'near' || operator === 'within' || operator === 'intersects') {
103
+ throw new APIError(`Querying with '${operator}' is not supported with the postgres database adapter.`);
104
+ }
105
+ if (operator === 'contains') {
106
+ formattedValue = `%${formattedValue}%`;
107
+ }
108
+ if (operator === 'exists') {
109
+ formattedValue = formattedValue === 'true' || formattedValue === true;
110
+ if (formattedValue === false) {
111
+ operator = 'isNull';
112
+ }
113
+ }
114
+ return {
115
+ operator,
116
+ value: formattedValue
117
+ };
118
+ };
119
+
120
+ //# sourceMappingURL=sanitizeQueryValue.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,22 @@
1
+ import type { QueryPromise, SQL } from 'drizzle-orm';
2
+ import type { ChainedMethods } from '../find/chainMethods.js';
3
+ import type { DrizzleAdapter, DrizzleTransaction } from '../types.js';
4
+ import type { BuildQueryJoinAliases } from './buildQuery.js';
5
+ import { type GenericColumn } from '../types.js';
6
+ type Args = {
7
+ adapter: DrizzleAdapter;
8
+ chainedMethods?: ChainedMethods;
9
+ db: DrizzleAdapter['drizzle'] | DrizzleTransaction;
10
+ joins: BuildQueryJoinAliases;
11
+ selectFields: Record<string, GenericColumn>;
12
+ tableName: string;
13
+ where: SQL;
14
+ };
15
+ /**
16
+ * Selects distinct records from a table only if there are joins that need to be used, otherwise return null
17
+ */
18
+ export declare const selectDistinct: ({ adapter, chainedMethods, db, joins, selectFields, tableName, where, }: Args) => QueryPromise<Record<string, GenericColumn> & {
19
+ id: number | string;
20
+ }[]>;
21
+ export {};
22
+ //# sourceMappingURL=selectDistinct.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,38 @@
1
+ import { chainMethods } from '../find/chainMethods.js';
2
+ /**
3
+ * Selects distinct records from a table only if there are joins that need to be used, otherwise return null
4
+ */ export const selectDistinct = ({ adapter, chainedMethods = [], db, joins, selectFields, tableName, where })=>{
5
+ if (Object.keys(joins).length > 0) {
6
+ if (where) {
7
+ chainedMethods.push({
8
+ args: [
9
+ where
10
+ ],
11
+ method: 'where'
12
+ });
13
+ }
14
+ joins.forEach(({ condition, table })=>{
15
+ chainedMethods.push({
16
+ args: [
17
+ table,
18
+ condition
19
+ ],
20
+ method: 'leftJoin'
21
+ });
22
+ });
23
+ let query;
24
+ const table = adapter.tables[tableName];
25
+ if (adapter.name === 'postgres') {
26
+ query = db.selectDistinct(selectFields).from(table);
27
+ }
28
+ if (adapter.name === 'sqlite') {
29
+ query = db.selectDistinct(selectFields).from(table);
30
+ }
31
+ return chainMethods({
32
+ methods: chainedMethods,
33
+ query
34
+ });
35
+ }
36
+ };
37
+
38
+ //# sourceMappingURL=selectDistinct.js.map
@@ -0,0 +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"}
@@ -0,0 +1,3 @@
1
+ import type { QueryDrafts } from 'payload';
2
+ export declare const queryDrafts: QueryDrafts;
3
+ //# sourceMappingURL=queryDrafts.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,40 @@
1
+ import { buildVersionCollectionFields, combineQueries } from 'payload';
2
+ import toSnakeCase from 'to-snake-case';
3
+ import { findMany } from './find/findMany.js';
4
+ export const queryDrafts = async function queryDrafts({ collection, limit, locale, page = 1, pagination, req = {}, sort, where }) {
5
+ const collectionConfig = this.payload.collections[collection].config;
6
+ const tableName = this.tableNameMap.get(`_${toSnakeCase(collectionConfig.slug)}${this.versionsSuffix}`);
7
+ const fields = buildVersionCollectionFields(collectionConfig);
8
+ const combinedWhere = combineQueries({
9
+ latest: {
10
+ equals: true
11
+ }
12
+ }, where);
13
+ const result = await findMany({
14
+ adapter: this,
15
+ fields,
16
+ limit,
17
+ locale,
18
+ page,
19
+ pagination,
20
+ req,
21
+ sort,
22
+ tableName,
23
+ where: combinedWhere
24
+ });
25
+ return {
26
+ ...result,
27
+ docs: result.docs.map((doc)=>{
28
+ // eslint-disable-next-line no-param-reassign
29
+ doc = {
30
+ id: doc.parent,
31
+ ...doc.version,
32
+ createdAt: doc.createdAt,
33
+ updatedAt: doc.updatedAt
34
+ };
35
+ return doc;
36
+ })
37
+ };
38
+ };
39
+
40
+ //# sourceMappingURL=queryDrafts.js.map
@@ -0,0 +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"}
@@ -0,0 +1,3 @@
1
+ import type { BeginTransaction } from 'payload';
2
+ export declare const beginTransaction: BeginTransaction;
3
+ //# sourceMappingURL=beginTransaction.d.ts.map
@@ -0,0 +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,gBA2D9B,CAAA"}
@@ -0,0 +1,51 @@
1
+ import { v4 as uuid } from 'uuid';
2
+ export const beginTransaction = async function beginTransaction() {
3
+ let id;
4
+ try {
5
+ id = uuid();
6
+ let reject;
7
+ let resolve;
8
+ let transaction;
9
+ let transactionReady;
10
+ // Await initialization here
11
+ // Prevent race conditions where the adapter may be
12
+ // re-initializing, and `this.drizzle` is potentially undefined
13
+ await this.initializing;
14
+ // Drizzle only exposes a transactions API that is sufficient if you
15
+ // can directly pass around the `tx` argument. But our operations are spread
16
+ // over many files and we don't want to pass the `tx` around like that,
17
+ // so instead, we "lift" up the `resolve` and `reject` methods
18
+ // and will call them in our respective transaction methods
19
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
20
+ const done = this.drizzle.transaction(async (tx)=>{
21
+ transaction = tx;
22
+ await new Promise((res, rej)=>{
23
+ resolve = ()=>{
24
+ res();
25
+ return done;
26
+ };
27
+ reject = ()=>{
28
+ rej();
29
+ return done;
30
+ };
31
+ transactionReady();
32
+ });
33
+ }).catch(()=>{
34
+ // swallow
35
+ });
36
+ // Need to wait until the transaction is ready
37
+ // before binding its `resolve` and `reject` methods below
38
+ await new Promise((resolve)=>transactionReady = resolve);
39
+ this.sessions[id] = {
40
+ db: transaction,
41
+ reject,
42
+ resolve
43
+ };
44
+ } catch (err) {
45
+ this.payload.logger.error(`Error: cannot begin transaction: ${err.message}`, err);
46
+ process.exit(1);
47
+ }
48
+ return id;
49
+ };
50
+
51
+ //# sourceMappingURL=beginTransaction.js.map
@@ -0,0 +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) {\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\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\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 })\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","id","reject","resolve","transaction","transactionReady","initializing","done","drizzle","tx","Promise","res","rej","catch","sessions","db","err","payload","logger","error","message","process","exit"],"mappings":"AAEA,SAASA,MAAMC,IAAI,QAAQ,OAAM;AAIjC,OAAO,MAAMC,mBAAqC,eAAeA;IAG/D,IAAIC;IACJ,IAAI;QACFA,KAAKF;QAEL,IAAIG;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;QAE3D,mEAAmE;QACnE,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,GACCQ,KAAK,CAAC;QACL,UAAU;QACZ;QAEF,8CAA8C;QAC9C,0DAA0D;QAC1D,MAAM,IAAIH,QAAc,CAACP,UAAaE,mBAAmBF;QAEzD,IAAI,CAACW,QAAQ,CAACb,GAAG,GAAG;YAClBc,IAAIX;YACJF;YACAC;QACF;IACF,EAAE,OAAOa,KAAK;QACZ,IAAI,CAACC,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC,CAAC,iCAAiC,EAAEH,IAAII,OAAO,CAAC,CAAC,EAAEJ;QAC7EK,QAAQC,IAAI,CAAC;IACf;IAEA,OAAOrB;AACT,EAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CommitTransaction } from 'payload';
2
+ export declare const commitTransaction: CommitTransaction;
3
+ //# sourceMappingURL=commitTransaction.d.ts.map
@@ -0,0 +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"}