@payloadcms/drizzle 3.0.0-canary.294ea5c → 3.0.0-canary.3eda767

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