@payloadcms/drizzle 3.0.0-canary.d894ac7 → 3.0.0-canary.e198dc5

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 (229) 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/find/buildFindManyArgs.d.ts +13 -7
  24. package/dist/find/buildFindManyArgs.d.ts.map +1 -1
  25. package/dist/find/buildFindManyArgs.js +7 -1
  26. package/dist/find/buildFindManyArgs.js.map +1 -1
  27. package/dist/find/findMany.d.ts +1 -1
  28. package/dist/find/findMany.d.ts.map +1 -1
  29. package/dist/find/findMany.js +6 -3
  30. package/dist/find/findMany.js.map +1 -1
  31. package/dist/find/traverseFields.d.ts +7 -3
  32. package/dist/find/traverseFields.d.ts.map +1 -1
  33. package/dist/find/traverseFields.js +141 -16
  34. package/dist/find/traverseFields.js.map +1 -1
  35. package/dist/find.d.ts.map +1 -1
  36. package/dist/find.js +2 -1
  37. package/dist/find.js.map +1 -1
  38. package/dist/findGlobalVersions.js +1 -1
  39. package/dist/findGlobalVersions.js.map +1 -1
  40. package/dist/findMigrationDir.d.ts.map +1 -1
  41. package/dist/findMigrationDir.js +3 -1
  42. package/dist/findMigrationDir.js.map +1 -1
  43. package/dist/findOne.d.ts +1 -1
  44. package/dist/findOne.d.ts.map +1 -1
  45. package/dist/findOne.js +2 -1
  46. package/dist/findOne.js.map +1 -1
  47. package/dist/findVersions.js +1 -1
  48. package/dist/findVersions.js.map +1 -1
  49. package/dist/index.d.ts +2 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +2 -0
  52. package/dist/index.js.map +1 -1
  53. package/dist/migrate.js +1 -0
  54. package/dist/migrate.js.map +1 -1
  55. package/dist/migrateDown.d.ts.map +1 -1
  56. package/dist/migrateDown.js +1 -1
  57. package/dist/migrateDown.js.map +1 -1
  58. package/dist/migrateFresh.d.ts.map +1 -1
  59. package/dist/migrateFresh.js +1 -0
  60. package/dist/migrateFresh.js.map +1 -1
  61. package/dist/migrateRefresh.d.ts.map +1 -1
  62. package/dist/migrateRefresh.js +2 -1
  63. package/dist/migrateRefresh.js.map +1 -1
  64. package/dist/migrateReset.d.ts.map +1 -1
  65. package/dist/migrateReset.js +4 -2
  66. package/dist/migrateReset.js.map +1 -1
  67. package/dist/migrateStatus.js +0 -1
  68. package/dist/migrateStatus.js.map +1 -1
  69. package/dist/postgres/countDistinct.d.ts.map +1 -1
  70. package/dist/postgres/countDistinct.js +3 -3
  71. package/dist/postgres/countDistinct.js.map +1 -1
  72. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.d.ts.map +1 -1
  73. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.js +3 -1
  74. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.js.map +1 -1
  75. package/dist/postgres/createMigration.d.ts.map +1 -1
  76. package/dist/postgres/createMigration.js +1 -0
  77. package/dist/postgres/createMigration.js.map +1 -1
  78. package/dist/postgres/getMigrationTemplate.d.ts +1 -1
  79. package/dist/postgres/getMigrationTemplate.d.ts.map +1 -1
  80. package/dist/postgres/getMigrationTemplate.js +1 -1
  81. package/dist/postgres/getMigrationTemplate.js.map +1 -1
  82. package/dist/postgres/init.d.ts.map +1 -1
  83. package/dist/postgres/init.js +13 -3
  84. package/dist/postgres/init.js.map +1 -1
  85. package/dist/postgres/schema/build.d.ts +12 -3
  86. package/dist/postgres/schema/build.d.ts.map +1 -1
  87. package/dist/postgres/schema/build.js +18 -8
  88. package/dist/postgres/schema/build.js.map +1 -1
  89. package/dist/postgres/schema/createIndex.d.ts.map +1 -1
  90. package/dist/postgres/schema/createIndex.js +3 -1
  91. package/dist/postgres/schema/createIndex.js.map +1 -1
  92. package/dist/postgres/schema/traverseFields.d.ts +9 -3
  93. package/dist/postgres/schema/traverseFields.d.ts.map +1 -1
  94. package/dist/postgres/schema/traverseFields.js +191 -62
  95. package/dist/postgres/schema/traverseFields.js.map +1 -1
  96. package/dist/postgres/schema/withDefault.d.ts.map +1 -1
  97. package/dist/postgres/schema/withDefault.js +3 -1
  98. package/dist/postgres/schema/withDefault.js.map +1 -1
  99. package/dist/postgres/types.d.ts +20 -6
  100. package/dist/postgres/types.d.ts.map +1 -1
  101. package/dist/postgres/types.js.map +1 -1
  102. package/dist/queries/buildAndOrConditions.d.ts +1 -1
  103. package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
  104. package/dist/queries/buildAndOrConditions.js +2 -4
  105. package/dist/queries/buildAndOrConditions.js.map +1 -1
  106. package/dist/queries/buildOrderBy.d.ts +18 -0
  107. package/dist/queries/buildOrderBy.d.ts.map +1 -0
  108. package/dist/queries/buildOrderBy.js +52 -0
  109. package/dist/queries/buildOrderBy.js.map +1 -0
  110. package/dist/queries/buildQuery.d.ts +5 -4
  111. package/dist/queries/buildQuery.d.ts.map +1 -1
  112. package/dist/queries/buildQuery.js +12 -47
  113. package/dist/queries/buildQuery.js.map +1 -1
  114. package/dist/queries/getTableColumnFromPath.d.ts +8 -3
  115. package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
  116. package/dist/queries/getTableColumnFromPath.js +73 -23
  117. package/dist/queries/getTableColumnFromPath.js.map +1 -1
  118. package/dist/queries/operatorMap.d.ts.map +1 -1
  119. package/dist/queries/operatorMap.js.map +1 -1
  120. package/dist/queries/parseParams.d.ts +1 -1
  121. package/dist/queries/parseParams.d.ts.map +1 -1
  122. package/dist/queries/parseParams.js +52 -6
  123. package/dist/queries/parseParams.js.map +1 -1
  124. package/dist/queries/sanitizeQueryValue.d.ts +12 -1
  125. package/dist/queries/sanitizeQueryValue.d.ts.map +1 -1
  126. package/dist/queries/sanitizeQueryValue.js +77 -21
  127. package/dist/queries/sanitizeQueryValue.js.map +1 -1
  128. package/dist/queries/selectDistinct.d.ts +3 -4
  129. package/dist/queries/selectDistinct.d.ts.map +1 -1
  130. package/dist/queries/selectDistinct.js.map +1 -1
  131. package/dist/queryDrafts.d.ts.map +1 -1
  132. package/dist/queryDrafts.js +1 -2
  133. package/dist/queryDrafts.js.map +1 -1
  134. package/dist/transactions/beginTransaction.d.ts.map +1 -1
  135. package/dist/transactions/beginTransaction.js +5 -1
  136. package/dist/transactions/beginTransaction.js.map +1 -1
  137. package/dist/transactions/commitTransaction.d.ts.map +1 -1
  138. package/dist/transactions/commitTransaction.js +3 -1
  139. package/dist/transactions/commitTransaction.js.map +1 -1
  140. package/dist/transform/read/hasManyNumber.d.ts +2 -1
  141. package/dist/transform/read/hasManyNumber.d.ts.map +1 -1
  142. package/dist/transform/read/hasManyNumber.js +12 -2
  143. package/dist/transform/read/hasManyNumber.js.map +1 -1
  144. package/dist/transform/read/hasManyText.d.ts +2 -1
  145. package/dist/transform/read/hasManyText.d.ts.map +1 -1
  146. package/dist/transform/read/hasManyText.js +12 -2
  147. package/dist/transform/read/hasManyText.js.map +1 -1
  148. package/dist/transform/read/index.d.ts +3 -2
  149. package/dist/transform/read/index.d.ts.map +1 -1
  150. package/dist/transform/read/index.js +3 -2
  151. package/dist/transform/read/index.js.map +1 -1
  152. package/dist/transform/read/relationship.d.ts +2 -1
  153. package/dist/transform/read/relationship.d.ts.map +1 -1
  154. package/dist/transform/read/relationship.js +15 -6
  155. package/dist/transform/read/relationship.js.map +1 -1
  156. package/dist/transform/read/traverseFields.d.ts +10 -2
  157. package/dist/transform/read/traverseFields.d.ts.map +1 -1
  158. package/dist/transform/read/traverseFields.js +170 -56
  159. package/dist/transform/read/traverseFields.js.map +1 -1
  160. package/dist/transform/write/array.d.ts +6 -1
  161. package/dist/transform/write/array.d.ts.map +1 -1
  162. package/dist/transform/write/array.js +7 -3
  163. package/dist/transform/write/array.js.map +1 -1
  164. package/dist/transform/write/blocks.d.ts +8 -3
  165. package/dist/transform/write/blocks.d.ts.map +1 -1
  166. package/dist/transform/write/blocks.js +19 -7
  167. package/dist/transform/write/blocks.js.map +1 -1
  168. package/dist/transform/write/index.d.ts.map +1 -1
  169. package/dist/transform/write/index.js +1 -1
  170. package/dist/transform/write/index.js.map +1 -1
  171. package/dist/transform/write/relationships.d.ts.map +1 -1
  172. package/dist/transform/write/relationships.js +6 -2
  173. package/dist/transform/write/relationships.js.map +1 -1
  174. package/dist/transform/write/selects.d.ts.map +1 -1
  175. package/dist/transform/write/selects.js +1 -1
  176. package/dist/transform/write/selects.js.map +1 -1
  177. package/dist/transform/write/traverseFields.d.ts +6 -1
  178. package/dist/transform/write/traverseFields.d.ts.map +1 -1
  179. package/dist/transform/write/traverseFields.js +46 -17
  180. package/dist/transform/write/traverseFields.js.map +1 -1
  181. package/dist/types.d.ts +1 -1
  182. package/dist/types.d.ts.map +1 -1
  183. package/dist/types.js.map +1 -1
  184. package/dist/update.d.ts.map +1 -1
  185. package/dist/update.js +3 -2
  186. package/dist/update.js.map +1 -1
  187. package/dist/updateGlobalVersion.js +2 -2
  188. package/dist/updateGlobalVersion.js.map +1 -1
  189. package/dist/updateVersion.js +2 -2
  190. package/dist/updateVersion.js.map +1 -1
  191. package/dist/upsertRow/deleteExistingRowsByPath.d.ts.map +1 -1
  192. package/dist/upsertRow/deleteExistingRowsByPath.js +6 -2
  193. package/dist/upsertRow/deleteExistingRowsByPath.js.map +1 -1
  194. package/dist/upsertRow/index.d.ts +1 -1
  195. package/dist/upsertRow/index.d.ts.map +1 -1
  196. package/dist/upsertRow/index.js +50 -12
  197. package/dist/upsertRow/index.js.map +1 -1
  198. package/dist/upsertRow/insertArrays.d.ts.map +1 -1
  199. package/dist/upsertRow/insertArrays.js +5 -2
  200. package/dist/upsertRow/insertArrays.js.map +1 -1
  201. package/dist/upsertRow/types.d.ts +8 -5
  202. package/dist/upsertRow/types.d.ts.map +1 -1
  203. package/dist/upsertRow/types.js.map +1 -1
  204. package/dist/utilities/createBlocksMap.d.ts.map +1 -1
  205. package/dist/utilities/createBlocksMap.js +4 -2
  206. package/dist/utilities/createBlocksMap.js.map +1 -1
  207. package/dist/utilities/createRelationshipMap.d.ts.map +1 -1
  208. package/dist/utilities/createRelationshipMap.js +3 -1
  209. package/dist/utilities/createRelationshipMap.js.map +1 -1
  210. package/dist/utilities/executeSchemaHooks.d.ts +24 -0
  211. package/dist/utilities/executeSchemaHooks.d.ts.map +1 -0
  212. package/dist/utilities/executeSchemaHooks.js +21 -0
  213. package/dist/utilities/executeSchemaHooks.js.map +1 -0
  214. package/dist/utilities/extendDrizzleTable.d.ts +19 -0
  215. package/dist/utilities/extendDrizzleTable.d.ts.map +1 -0
  216. package/dist/utilities/extendDrizzleTable.js +38 -0
  217. package/dist/utilities/extendDrizzleTable.js.map +1 -0
  218. package/dist/utilities/getCollectionIdType.d.ts +7 -0
  219. package/dist/utilities/getCollectionIdType.d.ts.map +1 -0
  220. package/dist/utilities/getCollectionIdType.js +11 -0
  221. package/dist/utilities/getCollectionIdType.js.map +1 -0
  222. package/dist/utilities/hasLocalesTable.d.ts.map +1 -1
  223. package/dist/utilities/hasLocalesTable.js +12 -4
  224. package/dist/utilities/hasLocalesTable.js.map +1 -1
  225. package/dist/utilities/isPolymorphicRelationship.d.ts +6 -0
  226. package/dist/utilities/isPolymorphicRelationship.d.ts.map +1 -0
  227. package/dist/utilities/isPolymorphicRelationship.js +5 -0
  228. package/dist/utilities/isPolymorphicRelationship.js.map +1 -0
  229. package/package.json +9 -7
@@ -1,7 +1,7 @@
1
1
  import { relations } from 'drizzle-orm';
2
- import { PgNumericBuilder, PgUUIDBuilder, PgVarcharBuilder, boolean, foreignKey, index, integer, jsonb, numeric, text, timestamp, varchar } from 'drizzle-orm/pg-core';
2
+ import { boolean, foreignKey, index, integer, jsonb, numeric, PgNumericBuilder, PgUUIDBuilder, PgVarcharBuilder, text, timestamp, varchar } from 'drizzle-orm/pg-core';
3
3
  import { InvalidConfiguration } from 'payload';
4
- import { fieldAffectsData, optionIsObject } from 'payload/shared';
4
+ import { fieldAffectsData, fieldIsVirtual, optionIsObject } from 'payload/shared';
5
5
  import toSnakeCase from 'to-snake-case';
6
6
  import { createTableName } from '../../createTableName.js';
7
7
  import { hasLocalesTable } from '../../utilities/hasLocalesTable.js';
@@ -11,7 +11,7 @@ import { createIndex } from './createIndex.js';
11
11
  import { idToUUID } from './idToUUID.js';
12
12
  import { parentIDColumnMap } from './parentIDColumnMap.js';
13
13
  import { withDefault } from './withDefault.js';
14
- export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull, disableUnique = false, fieldPrefix, fields, forceLocalized, indexes, localesColumns, localesIndexes, newTableName, parentTableName, relationsToBuild, relationships, rootRelationsToBuild, rootTableIDColType, rootTableName, versions })=>{
14
+ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull, disableUnique = false, fieldPrefix, fields, forceLocalized, indexes, joins, localesColumns, localesIndexes, newTableName, parentTableName, relationships, relationsToBuild, rootRelationsToBuild, rootTableIDColType, rootTableName, versions, withinLocalizedArrayOrBlock })=>{
15
15
  const throwValidationError = true;
16
16
  let hasLocalizedField = false;
17
17
  let hasLocalizedRelationshipField = false;
@@ -20,11 +20,22 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
20
20
  let hasManyNumberField = false;
21
21
  let hasLocalizedManyNumberField = false;
22
22
  let parentIDColType = 'integer';
23
- if (columns.id instanceof PgUUIDBuilder) parentIDColType = 'uuid';
24
- if (columns.id instanceof PgNumericBuilder) parentIDColType = 'numeric';
25
- if (columns.id instanceof PgVarcharBuilder) parentIDColType = 'varchar';
23
+ if (columns.id instanceof PgUUIDBuilder) {
24
+ parentIDColType = 'uuid';
25
+ }
26
+ if (columns.id instanceof PgNumericBuilder) {
27
+ parentIDColType = 'numeric';
28
+ }
29
+ if (columns.id instanceof PgVarcharBuilder) {
30
+ parentIDColType = 'varchar';
31
+ }
26
32
  fields.forEach((field)=>{
27
- if ('name' in field && field.name === 'id') return;
33
+ if ('name' in field && field.name === 'id') {
34
+ return;
35
+ }
36
+ if (fieldIsVirtual(field)) {
37
+ return;
38
+ }
28
39
  let columnName;
29
40
  let fieldName;
30
41
  let targetTable = columns;
@@ -56,7 +67,10 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
56
67
  adapter.fieldConstraints[rootTableName][`${columnName}_idx`] = constraintValue;
57
68
  }
58
69
  targetIndexes[`${newTableName}_${field.name}Idx`] = createIndex({
59
- name: fieldName,
70
+ name: field.localized ? [
71
+ fieldName,
72
+ '_locale'
73
+ ] : fieldName,
60
74
  columnName,
61
75
  tableName: newTableName,
62
76
  unique
@@ -67,7 +81,8 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
67
81
  case 'text':
68
82
  {
69
83
  if (field.hasMany) {
70
- if (field.localized) {
84
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
85
+ if (isLocalized) {
71
86
  hasLocalizedManyTextField = true;
72
87
  }
73
88
  if (field.index) {
@@ -93,7 +108,8 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
93
108
  case 'number':
94
109
  {
95
110
  if (field.hasMany) {
96
- if (field.localized) {
111
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
112
+ if (isLocalized) {
97
113
  hasLocalizedManyNumberField = true;
98
114
  }
99
115
  if (field.index) {
@@ -172,7 +188,8 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
172
188
  }).onDelete('cascade'),
173
189
  parentIdx: (cols)=>index(`${selectTableName}_parent_idx`).on(cols.parent)
174
190
  };
175
- if (field.localized) {
191
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
192
+ if (isLocalized) {
176
193
  baseColumns.locale = adapter.enums.enum__locales('locale').notNull();
177
194
  baseExtraConfig.localeIdx = (cols)=>index(`${selectTableName}_locale_idx`).on(cols.locale);
178
195
  }
@@ -208,7 +225,7 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
208
225
  })
209
226
  }));
210
227
  } else {
211
- targetTable[fieldName] = withDefault(adapter.enums[enumName](fieldName), field);
228
+ targetTable[fieldName] = withDefault(adapter.enums[enumName](columnName), field);
212
229
  }
213
230
  break;
214
231
  }
@@ -245,29 +262,44 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
245
262
  }).onDelete('cascade'),
246
263
  _parentIDIdx: (cols)=>index(`${arrayTableName}_parent_id_idx`).on(cols._parentID)
247
264
  };
248
- if (field.localized && adapter.payload.config.localization) {
265
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
266
+ if (isLocalized) {
249
267
  baseColumns._locale = adapter.enums.enum__locales('_locale').notNull();
250
268
  baseExtraConfig._localeIdx = (cols)=>index(`${arrayTableName}_locale_idx`).on(cols._locale);
251
269
  }
252
- const { hasManyNumberField: subHasManyNumberField, hasManyTextField: subHasManyTextField, relationsToBuild: subRelationsToBuild } = buildTable({
270
+ const { hasLocalizedManyNumberField: subHasLocalizedManyNumberField, hasLocalizedManyTextField: subHasLocalizedManyTextField, hasLocalizedRelationshipField: subHasLocalizedRelationshipField, hasManyNumberField: subHasManyNumberField, hasManyTextField: subHasManyTextField, relationsToBuild: subRelationsToBuild } = buildTable({
253
271
  adapter,
254
272
  baseColumns,
255
273
  baseExtraConfig,
256
274
  disableNotNull: disableNotNullFromHere,
257
275
  disableUnique,
258
276
  fields: disableUnique ? idToUUID(field.fields) : field.fields,
259
- rootRelationsToBuild,
260
277
  rootRelationships: relationships,
278
+ rootRelationsToBuild,
261
279
  rootTableIDColType,
262
280
  rootTableName,
263
281
  tableName: arrayTableName,
264
- versions
282
+ versions,
283
+ withinLocalizedArrayOrBlock: isLocalized
265
284
  });
285
+ if (subHasLocalizedManyNumberField) {
286
+ hasLocalizedManyNumberField = subHasLocalizedManyNumberField;
287
+ }
288
+ if (subHasLocalizedRelationshipField) {
289
+ hasLocalizedRelationshipField = subHasLocalizedRelationshipField;
290
+ }
291
+ if (subHasLocalizedManyTextField) {
292
+ hasLocalizedManyTextField = subHasLocalizedManyTextField;
293
+ }
266
294
  if (subHasManyTextField) {
267
- if (!hasManyTextField || subHasManyTextField === 'index') hasManyTextField = subHasManyTextField;
295
+ if (!hasManyTextField || subHasManyTextField === 'index') {
296
+ hasManyTextField = subHasManyTextField;
297
+ }
268
298
  }
269
299
  if (subHasManyNumberField) {
270
- if (!hasManyNumberField || subHasManyNumberField === 'index') hasManyNumberField = subHasManyNumberField;
300
+ if (!hasManyNumberField || subHasManyNumberField === 'index') {
301
+ hasManyNumberField = subHasManyNumberField;
302
+ }
271
303
  }
272
304
  relationsToBuild.set(fieldName, {
273
305
  type: 'many',
@@ -335,7 +367,6 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
335
367
  };
336
368
  const baseExtraConfig = {
337
369
  _orderIdx: (cols)=>index(`${blockTableName}_order_idx`).on(cols._order),
338
- _parentIDIdx: (cols)=>index(`${blockTableName}_parent_id_idx`).on(cols._parentID),
339
370
  _parentIdFk: (cols)=>foreignKey({
340
371
  name: `${blockTableName}_parent_id_fk`,
341
372
  columns: [
@@ -345,31 +376,47 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
345
376
  adapter.tables[rootTableName].id
346
377
  ]
347
378
  }).onDelete('cascade'),
379
+ _parentIDIdx: (cols)=>index(`${blockTableName}_parent_id_idx`).on(cols._parentID),
348
380
  _pathIdx: (cols)=>index(`${blockTableName}_path_idx`).on(cols._path)
349
381
  };
350
- if (field.localized && adapter.payload.config.localization) {
382
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
383
+ if (isLocalized) {
351
384
  baseColumns._locale = adapter.enums.enum__locales('_locale').notNull();
352
385
  baseExtraConfig._localeIdx = (cols)=>index(`${blockTableName}_locale_idx`).on(cols._locale);
353
386
  }
354
- const { hasManyNumberField: subHasManyNumberField, hasManyTextField: subHasManyTextField, relationsToBuild: subRelationsToBuild } = buildTable({
387
+ const { hasLocalizedManyNumberField: subHasLocalizedManyNumberField, hasLocalizedManyTextField: subHasLocalizedManyTextField, hasLocalizedRelationshipField: subHasLocalizedRelationshipField, hasManyNumberField: subHasManyNumberField, hasManyTextField: subHasManyTextField, relationsToBuild: subRelationsToBuild } = buildTable({
355
388
  adapter,
356
389
  baseColumns,
357
390
  baseExtraConfig,
358
391
  disableNotNull: disableNotNullFromHere,
359
392
  disableUnique,
360
393
  fields: disableUnique ? idToUUID(block.fields) : block.fields,
361
- rootRelationsToBuild,
362
394
  rootRelationships: relationships,
395
+ rootRelationsToBuild,
363
396
  rootTableIDColType,
364
397
  rootTableName,
365
398
  tableName: blockTableName,
366
- versions
399
+ versions,
400
+ withinLocalizedArrayOrBlock: isLocalized
367
401
  });
402
+ if (subHasLocalizedManyNumberField) {
403
+ hasLocalizedManyNumberField = subHasLocalizedManyNumberField;
404
+ }
405
+ if (subHasLocalizedRelationshipField) {
406
+ hasLocalizedRelationshipField = subHasLocalizedRelationshipField;
407
+ }
408
+ if (subHasLocalizedManyTextField) {
409
+ hasLocalizedManyTextField = subHasLocalizedManyTextField;
410
+ }
368
411
  if (subHasManyTextField) {
369
- if (!hasManyTextField || subHasManyTextField === 'index') hasManyTextField = subHasManyTextField;
412
+ if (!hasManyTextField || subHasManyTextField === 'index') {
413
+ hasManyTextField = subHasManyTextField;
414
+ }
370
415
  }
371
416
  if (subHasManyNumberField) {
372
- if (!hasManyNumberField || subHasManyNumberField === 'index') hasManyNumberField = subHasManyNumberField;
417
+ if (!hasManyNumberField || subHasManyNumberField === 'index') {
418
+ hasManyNumberField = subHasManyNumberField;
419
+ }
373
420
  }
374
421
  adapter.relations[`relations_${blockTableName}`] = relations(adapter.tables[blockTableName], ({ many, one })=>{
375
422
  const result = {
@@ -442,23 +489,37 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
442
489
  fields: field.fields,
443
490
  forceLocalized,
444
491
  indexes,
492
+ joins,
445
493
  localesColumns,
446
494
  localesIndexes,
447
495
  newTableName,
448
496
  parentTableName,
449
- relationsToBuild,
450
497
  relationships,
498
+ relationsToBuild,
451
499
  rootRelationsToBuild,
452
500
  rootTableIDColType,
453
501
  rootTableName,
454
- versions
502
+ versions,
503
+ withinLocalizedArrayOrBlock
455
504
  });
456
- if (groupHasLocalizedField) hasLocalizedField = true;
457
- if (groupHasLocalizedRelationshipField) hasLocalizedRelationshipField = true;
458
- if (groupHasManyTextField) hasManyTextField = true;
459
- if (groupHasLocalizedManyTextField) hasLocalizedManyTextField = true;
460
- if (groupHasManyNumberField) hasManyNumberField = true;
461
- if (groupHasLocalizedManyNumberField) hasLocalizedManyNumberField = true;
505
+ if (groupHasLocalizedField) {
506
+ hasLocalizedField = true;
507
+ }
508
+ if (groupHasLocalizedRelationshipField) {
509
+ hasLocalizedRelationshipField = true;
510
+ }
511
+ if (groupHasManyTextField) {
512
+ hasManyTextField = true;
513
+ }
514
+ if (groupHasLocalizedManyTextField) {
515
+ hasLocalizedManyTextField = true;
516
+ }
517
+ if (groupHasManyNumberField) {
518
+ hasManyNumberField = true;
519
+ }
520
+ if (groupHasLocalizedManyNumberField) {
521
+ hasLocalizedManyNumberField = true;
522
+ }
462
523
  break;
463
524
  }
464
525
  const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull;
@@ -472,23 +533,37 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
472
533
  fields: field.fields,
473
534
  forceLocalized: field.localized,
474
535
  indexes,
536
+ joins,
475
537
  localesColumns,
476
538
  localesIndexes,
477
539
  newTableName: `${parentTableName}_${columnName}`,
478
540
  parentTableName,
479
- relationsToBuild,
480
541
  relationships,
542
+ relationsToBuild,
481
543
  rootRelationsToBuild,
482
544
  rootTableIDColType,
483
545
  rootTableName,
484
- versions
546
+ versions,
547
+ withinLocalizedArrayOrBlock: withinLocalizedArrayOrBlock || field.localized
485
548
  });
486
- if (groupHasLocalizedField) hasLocalizedField = true;
487
- if (groupHasLocalizedRelationshipField) hasLocalizedRelationshipField = true;
488
- if (groupHasManyTextField) hasManyTextField = true;
489
- if (groupHasLocalizedManyTextField) hasLocalizedManyTextField = true;
490
- if (groupHasManyNumberField) hasManyNumberField = true;
491
- if (groupHasLocalizedManyNumberField) hasLocalizedManyNumberField = true;
549
+ if (groupHasLocalizedField) {
550
+ hasLocalizedField = true;
551
+ }
552
+ if (groupHasLocalizedRelationshipField) {
553
+ hasLocalizedRelationshipField = true;
554
+ }
555
+ if (groupHasManyTextField) {
556
+ hasManyTextField = true;
557
+ }
558
+ if (groupHasLocalizedManyTextField) {
559
+ hasLocalizedManyTextField = true;
560
+ }
561
+ if (groupHasManyNumberField) {
562
+ hasManyNumberField = true;
563
+ }
564
+ if (groupHasLocalizedManyNumberField) {
565
+ hasLocalizedManyNumberField = true;
566
+ }
492
567
  break;
493
568
  }
494
569
  case 'tabs':
@@ -507,23 +582,37 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
507
582
  })),
508
583
  forceLocalized,
509
584
  indexes,
585
+ joins,
510
586
  localesColumns,
511
587
  localesIndexes,
512
588
  newTableName,
513
589
  parentTableName,
514
- relationsToBuild,
515
590
  relationships,
591
+ relationsToBuild,
516
592
  rootRelationsToBuild,
517
593
  rootTableIDColType,
518
594
  rootTableName,
519
- versions
595
+ versions,
596
+ withinLocalizedArrayOrBlock
520
597
  });
521
- if (tabHasLocalizedField) hasLocalizedField = true;
522
- if (tabHasLocalizedRelationshipField) hasLocalizedRelationshipField = true;
523
- if (tabHasManyTextField) hasManyTextField = true;
524
- if (tabHasLocalizedManyTextField) hasLocalizedManyTextField = true;
525
- if (tabHasManyNumberField) hasManyNumberField = true;
526
- if (tabHasLocalizedManyNumberField) hasLocalizedManyNumberField = true;
598
+ if (tabHasLocalizedField) {
599
+ hasLocalizedField = true;
600
+ }
601
+ if (tabHasLocalizedRelationshipField) {
602
+ hasLocalizedRelationshipField = true;
603
+ }
604
+ if (tabHasManyTextField) {
605
+ hasManyTextField = true;
606
+ }
607
+ if (tabHasLocalizedManyTextField) {
608
+ hasLocalizedManyTextField = true;
609
+ }
610
+ if (tabHasManyNumberField) {
611
+ hasManyNumberField = true;
612
+ }
613
+ if (tabHasLocalizedManyNumberField) {
614
+ hasLocalizedManyNumberField = true;
615
+ }
527
616
  break;
528
617
  }
529
618
  case 'row':
@@ -540,30 +629,44 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
540
629
  fields: field.fields,
541
630
  forceLocalized,
542
631
  indexes,
632
+ joins,
543
633
  localesColumns,
544
634
  localesIndexes,
545
635
  newTableName,
546
636
  parentTableName,
547
- relationsToBuild,
548
637
  relationships,
638
+ relationsToBuild,
549
639
  rootRelationsToBuild,
550
640
  rootTableIDColType,
551
641
  rootTableName,
552
- versions
642
+ versions,
643
+ withinLocalizedArrayOrBlock
553
644
  });
554
- if (rowHasLocalizedField) hasLocalizedField = true;
555
- if (rowHasLocalizedRelationshipField) hasLocalizedRelationshipField = true;
556
- if (rowHasManyTextField) hasManyTextField = true;
557
- if (rowHasLocalizedManyTextField) hasLocalizedManyTextField = true;
558
- if (rowHasManyNumberField) hasManyNumberField = true;
559
- if (rowHasLocalizedManyNumberField) hasLocalizedManyNumberField = true;
645
+ if (rowHasLocalizedField) {
646
+ hasLocalizedField = true;
647
+ }
648
+ if (rowHasLocalizedRelationshipField) {
649
+ hasLocalizedRelationshipField = true;
650
+ }
651
+ if (rowHasManyTextField) {
652
+ hasManyTextField = true;
653
+ }
654
+ if (rowHasLocalizedManyTextField) {
655
+ hasLocalizedManyTextField = true;
656
+ }
657
+ if (rowHasManyNumberField) {
658
+ hasManyNumberField = true;
659
+ }
660
+ if (rowHasLocalizedManyNumberField) {
661
+ hasLocalizedManyNumberField = true;
662
+ }
560
663
  break;
561
664
  }
562
665
  case 'relationship':
563
666
  case 'upload':
564
667
  if (Array.isArray(field.relationTo)) {
565
668
  field.relationTo.forEach((relation)=>relationships.add(relation));
566
- } else if (field.type === 'relationship' && field.hasMany) {
669
+ } else if (field.hasMany) {
567
670
  relationships.add(field.relationTo);
568
671
  } else {
569
672
  // simple relationships get a column on the targetTable with a foreign key to the relationTo table
@@ -572,8 +675,12 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
572
675
  // get the id type of the related collection
573
676
  let colType = adapter.idType === 'uuid' ? 'uuid' : 'integer';
574
677
  const relatedCollectionCustomID = relationshipConfig.fields.find((field)=>fieldAffectsData(field) && field.name === 'id');
575
- if (relatedCollectionCustomID?.type === 'number') colType = 'numeric';
576
- if (relatedCollectionCustomID?.type === 'text') colType = 'varchar';
678
+ if (relatedCollectionCustomID?.type === 'number') {
679
+ colType = 'numeric';
680
+ }
681
+ if (relatedCollectionCustomID?.type === 'text') {
682
+ colType = 'varchar';
683
+ }
577
684
  // make the foreign key column for relationship using the correct id column type
578
685
  targetTable[fieldName] = parentIDColumnMap[colType](`${columnName}_id`).references(()=>adapter.tables[tableName].id, {
579
686
  onDelete: 'set null'
@@ -581,7 +688,7 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
581
688
  // add relationship to table
582
689
  relationsToBuild.set(fieldName, {
583
690
  type: 'one',
584
- localized: adapter.payload.config.localization && field.localized,
691
+ localized: adapter.payload.config.localization && (field.localized || forceLocalized),
585
692
  target: tableName
586
693
  });
587
694
  // add notNull when not required
@@ -590,10 +697,32 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
590
697
  }
591
698
  break;
592
699
  }
593
- if (adapter.payload.config.localization && field.localized) {
700
+ if (Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock) {
594
701
  hasLocalizedRelationshipField = true;
595
702
  }
596
703
  break;
704
+ case 'join':
705
+ {
706
+ // fieldName could be 'posts' or 'group_posts'
707
+ // using `on` as the key for the relation
708
+ const localized = adapter.payload.config.localization && field.localized;
709
+ const fieldSchemaPath = `${fieldPrefix || ''}${field.name}`;
710
+ let target;
711
+ const joinConfig = joins[field.collection].find(({ schemaPath })=>fieldSchemaPath === schemaPath);
712
+ if (joinConfig.targetField.hasMany) {
713
+ target = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${adapter.relationshipsSuffix}`;
714
+ } else {
715
+ target = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${localized ? adapter.localesSuffix : ''}`;
716
+ }
717
+ relationsToBuild.set(fieldName, {
718
+ type: 'many',
719
+ // joins are not localized on the parent table
720
+ localized: false,
721
+ relationName: field.on.replaceAll('.', '_'),
722
+ target
723
+ });
724
+ break;
725
+ }
597
726
  default:
598
727
  break;
599
728
  }