@payloadcms/drizzle 3.0.0-canary.518fabe → 3.0.0-canary.5a7fb7d

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 (144) hide show
  1. package/dist/count.js +1 -1
  2. package/dist/count.js.map +1 -1
  3. package/dist/createGlobalVersion.d.ts +1 -1
  4. package/dist/createGlobalVersion.d.ts.map +1 -1
  5. package/dist/createGlobalVersion.js +6 -2
  6. package/dist/createGlobalVersion.js.map +1 -1
  7. package/dist/createVersion.d.ts +1 -1
  8. package/dist/createVersion.d.ts.map +1 -1
  9. package/dist/createVersion.js +18 -13
  10. package/dist/createVersion.js.map +1 -1
  11. package/dist/deleteOne.d.ts.map +1 -1
  12. package/dist/deleteOne.js +5 -3
  13. package/dist/deleteOne.js.map +1 -1
  14. package/dist/deleteVersions.js +1 -1
  15. package/dist/deleteVersions.js.map +1 -1
  16. package/dist/exports/postgres.d.ts +1 -0
  17. package/dist/exports/postgres.d.ts.map +1 -1
  18. package/dist/exports/postgres.js +1 -0
  19. package/dist/exports/postgres.js.map +1 -1
  20. package/dist/find/buildFindManyArgs.d.ts +9 -3
  21. package/dist/find/buildFindManyArgs.d.ts.map +1 -1
  22. package/dist/find/buildFindManyArgs.js +6 -1
  23. package/dist/find/buildFindManyArgs.js.map +1 -1
  24. package/dist/find/findMany.d.ts +1 -1
  25. package/dist/find/findMany.d.ts.map +1 -1
  26. package/dist/find/findMany.js +6 -3
  27. package/dist/find/findMany.js.map +1 -1
  28. package/dist/find/traverseFields.d.ts +6 -3
  29. package/dist/find/traverseFields.d.ts.map +1 -1
  30. package/dist/find/traverseFields.js +125 -2
  31. package/dist/find/traverseFields.js.map +1 -1
  32. package/dist/find.d.ts.map +1 -1
  33. package/dist/find.js +2 -1
  34. package/dist/find.js.map +1 -1
  35. package/dist/findGlobalVersions.js +1 -1
  36. package/dist/findGlobalVersions.js.map +1 -1
  37. package/dist/findOne.d.ts +1 -1
  38. package/dist/findOne.d.ts.map +1 -1
  39. package/dist/findOne.js +2 -1
  40. package/dist/findOne.js.map +1 -1
  41. package/dist/findVersions.js +1 -1
  42. package/dist/findVersions.js.map +1 -1
  43. package/dist/index.d.ts +2 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +2 -0
  46. package/dist/index.js.map +1 -1
  47. package/dist/migrateReset.js +1 -1
  48. package/dist/migrateReset.js.map +1 -1
  49. package/dist/postgres/countDistinct.d.ts.map +1 -1
  50. package/dist/postgres/countDistinct.js +3 -3
  51. package/dist/postgres/countDistinct.js.map +1 -1
  52. package/dist/postgres/createDatabase.d.ts +14 -0
  53. package/dist/postgres/createDatabase.d.ts.map +1 -0
  54. package/dist/postgres/createDatabase.js +76 -0
  55. package/dist/postgres/createDatabase.js.map +1 -0
  56. package/dist/postgres/defaultSnapshot.d.ts.map +1 -1
  57. package/dist/postgres/defaultSnapshot.js +2 -1
  58. package/dist/postgres/defaultSnapshot.js.map +1 -1
  59. package/dist/postgres/init.d.ts.map +1 -1
  60. package/dist/postgres/init.js +13 -3
  61. package/dist/postgres/init.js.map +1 -1
  62. package/dist/postgres/schema/build.d.ts +5 -2
  63. package/dist/postgres/schema/build.d.ts.map +1 -1
  64. package/dist/postgres/schema/build.js +30 -6
  65. package/dist/postgres/schema/build.js.map +1 -1
  66. package/dist/postgres/schema/traverseFields.d.ts +5 -2
  67. package/dist/postgres/schema/traverseFields.d.ts.map +1 -1
  68. package/dist/postgres/schema/traverseFields.js +66 -17
  69. package/dist/postgres/schema/traverseFields.js.map +1 -1
  70. package/dist/postgres/types.d.ts +33 -6
  71. package/dist/postgres/types.d.ts.map +1 -1
  72. package/dist/postgres/types.js.map +1 -1
  73. package/dist/queries/buildAndOrConditions.d.ts +1 -1
  74. package/dist/queries/buildAndOrConditions.d.ts.map +1 -1
  75. package/dist/queries/buildAndOrConditions.js +2 -2
  76. package/dist/queries/buildAndOrConditions.js.map +1 -1
  77. package/dist/queries/buildOrderBy.d.ts +18 -0
  78. package/dist/queries/buildOrderBy.d.ts.map +1 -0
  79. package/dist/queries/buildOrderBy.js +52 -0
  80. package/dist/queries/buildOrderBy.js.map +1 -0
  81. package/dist/queries/buildQuery.d.ts +5 -4
  82. package/dist/queries/buildQuery.d.ts.map +1 -1
  83. package/dist/queries/buildQuery.js +12 -47
  84. package/dist/queries/buildQuery.js.map +1 -1
  85. package/dist/queries/getTableColumnFromPath.d.ts +8 -3
  86. package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
  87. package/dist/queries/getTableColumnFromPath.js +63 -16
  88. package/dist/queries/getTableColumnFromPath.js.map +1 -1
  89. package/dist/queries/parseParams.d.ts +1 -1
  90. package/dist/queries/parseParams.d.ts.map +1 -1
  91. package/dist/queries/parseParams.js +32 -4
  92. package/dist/queries/parseParams.js.map +1 -1
  93. package/dist/queries/sanitizeQueryValue.d.ts +12 -1
  94. package/dist/queries/sanitizeQueryValue.d.ts.map +1 -1
  95. package/dist/queries/sanitizeQueryValue.js +66 -16
  96. package/dist/queries/sanitizeQueryValue.js.map +1 -1
  97. package/dist/queryDrafts.d.ts.map +1 -1
  98. package/dist/queryDrafts.js +2 -4
  99. package/dist/queryDrafts.js.map +1 -1
  100. package/dist/transform/read/index.d.ts +3 -2
  101. package/dist/transform/read/index.d.ts.map +1 -1
  102. package/dist/transform/read/index.js +2 -1
  103. package/dist/transform/read/index.js.map +1 -1
  104. package/dist/transform/read/traverseFields.d.ts +6 -2
  105. package/dist/transform/read/traverseFields.d.ts.map +1 -1
  106. package/dist/transform/read/traverseFields.js +80 -8
  107. package/dist/transform/read/traverseFields.js.map +1 -1
  108. package/dist/transform/write/traverseFields.d.ts.map +1 -1
  109. package/dist/transform/write/traverseFields.js +8 -1
  110. package/dist/transform/write/traverseFields.js.map +1 -1
  111. package/dist/update.d.ts.map +1 -1
  112. package/dist/update.js +3 -2
  113. package/dist/update.js.map +1 -1
  114. package/dist/updateGlobalVersion.js +2 -2
  115. package/dist/updateGlobalVersion.js.map +1 -1
  116. package/dist/updateVersion.js +2 -2
  117. package/dist/updateVersion.js.map +1 -1
  118. package/dist/upsertRow/index.d.ts +1 -1
  119. package/dist/upsertRow/index.d.ts.map +1 -1
  120. package/dist/upsertRow/index.js +4 -2
  121. package/dist/upsertRow/index.js.map +1 -1
  122. package/dist/upsertRow/insertArrays.d.ts.map +1 -1
  123. package/dist/upsertRow/insertArrays.js +4 -1
  124. package/dist/upsertRow/insertArrays.js.map +1 -1
  125. package/dist/upsertRow/types.d.ts +4 -1
  126. package/dist/upsertRow/types.d.ts.map +1 -1
  127. package/dist/upsertRow/types.js.map +1 -1
  128. package/dist/utilities/executeSchemaHooks.d.ts +24 -0
  129. package/dist/utilities/executeSchemaHooks.d.ts.map +1 -0
  130. package/dist/utilities/executeSchemaHooks.js +21 -0
  131. package/dist/utilities/executeSchemaHooks.js.map +1 -0
  132. package/dist/utilities/extendDrizzleTable.d.ts +19 -0
  133. package/dist/utilities/extendDrizzleTable.d.ts.map +1 -0
  134. package/dist/utilities/extendDrizzleTable.js +38 -0
  135. package/dist/utilities/extendDrizzleTable.js.map +1 -0
  136. package/dist/utilities/getCollectionIdType.d.ts +7 -0
  137. package/dist/utilities/getCollectionIdType.d.ts.map +1 -0
  138. package/dist/utilities/getCollectionIdType.js +11 -0
  139. package/dist/utilities/getCollectionIdType.js.map +1 -0
  140. package/dist/utilities/isPolymorphicRelationship.d.ts +6 -0
  141. package/dist/utilities/isPolymorphicRelationship.d.ts.map +1 -0
  142. package/dist/utilities/isPolymorphicRelationship.js +5 -0
  143. package/dist/utilities/isPolymorphicRelationship.js.map +1 -0
  144. package/package.json +6 -6
@@ -1,7 +1,7 @@
1
1
  import { relations } from 'drizzle-orm';
2
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, relationships, relationsToBuild, rootRelationsToBuild, rootTableIDColType, rootTableName, versions, withinLocalizedArrayOrBlock })=>{
14
+ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull, disableRelsTableUnique, disableUnique = false, fieldPrefix, fields, forceLocalized, indexes, joins, localesColumns, localesIndexes, newTableName, parentTableName, relationships, relationsToBuild, rootRelationsToBuild, rootTableIDColType, rootTableName, uniqueRelationships, versions, withinLocalizedArrayOrBlock })=>{
15
15
  const throwValidationError = true;
16
16
  let hasLocalizedField = false;
17
17
  let hasLocalizedRelationshipField = false;
@@ -33,6 +33,9 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
33
33
  if ('name' in field && field.name === 'id') {
34
34
  return;
35
35
  }
36
+ if (fieldIsVirtual(field)) {
37
+ return;
38
+ }
36
39
  let columnName;
37
40
  let fieldName;
38
41
  let targetTable = columns;
@@ -47,14 +50,15 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
47
50
  targetTable = localesColumns;
48
51
  targetIndexes = localesIndexes;
49
52
  }
50
- if ((field.unique || field.index) && ![
53
+ if ((field.unique || field.index || [
54
+ 'relationship',
55
+ 'upload'
56
+ ].includes(field.type)) && ![
51
57
  'array',
52
58
  'blocks',
53
59
  'group',
54
- 'point',
55
- 'relationship',
56
- 'upload'
57
- ].includes(field.type) && !('hasMany' in field && field.hasMany === true)) {
60
+ 'point'
61
+ ].includes(field.type) && !('hasMany' in field && field.hasMany === true) && !('relationTo' in field && Array.isArray(field.relationTo))) {
58
62
  const unique = disableUnique !== true && field.unique;
59
63
  if (unique) {
60
64
  const constraintValue = `${fieldPrefix || ''}${field.name}`;
@@ -64,7 +68,10 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
64
68
  adapter.fieldConstraints[rootTableName][`${columnName}_idx`] = constraintValue;
65
69
  }
66
70
  targetIndexes[`${newTableName}_${field.name}Idx`] = createIndex({
67
- name: fieldName,
71
+ name: field.localized ? [
72
+ fieldName,
73
+ '_locale'
74
+ ] : fieldName,
68
75
  columnName,
69
76
  tableName: newTableName,
70
77
  unique
@@ -75,7 +82,7 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
75
82
  case 'text':
76
83
  {
77
84
  if (field.hasMany) {
78
- const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock;
85
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
79
86
  if (isLocalized) {
80
87
  hasLocalizedManyTextField = true;
81
88
  }
@@ -102,7 +109,7 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
102
109
  case 'number':
103
110
  {
104
111
  if (field.hasMany) {
105
- const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock;
112
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
106
113
  if (isLocalized) {
107
114
  hasLocalizedManyNumberField = true;
108
115
  }
@@ -182,7 +189,7 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
182
189
  }).onDelete('cascade'),
183
190
  parentIdx: (cols)=>index(`${selectTableName}_parent_idx`).on(cols.parent)
184
191
  };
185
- const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock;
192
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
186
193
  if (isLocalized) {
187
194
  baseColumns.locale = adapter.enums.enum__locales('locale').notNull();
188
195
  baseExtraConfig.localeIdx = (cols)=>index(`${selectTableName}_locale_idx`).on(cols.locale);
@@ -219,7 +226,7 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
219
226
  })
220
227
  }));
221
228
  } else {
222
- targetTable[fieldName] = withDefault(adapter.enums[enumName](fieldName), field);
229
+ targetTable[fieldName] = withDefault(adapter.enums[enumName](columnName), field);
223
230
  }
224
231
  break;
225
232
  }
@@ -256,7 +263,7 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
256
263
  }).onDelete('cascade'),
257
264
  _parentIDIdx: (cols)=>index(`${arrayTableName}_parent_id_idx`).on(cols._parentID)
258
265
  };
259
- const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock;
266
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
260
267
  if (isLocalized) {
261
268
  baseColumns._locale = adapter.enums.enum__locales('_locale').notNull();
262
269
  baseExtraConfig._localeIdx = (cols)=>index(`${arrayTableName}_locale_idx`).on(cols._locale);
@@ -266,12 +273,14 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
266
273
  baseColumns,
267
274
  baseExtraConfig,
268
275
  disableNotNull: disableNotNullFromHere,
276
+ disableRelsTableUnique: true,
269
277
  disableUnique,
270
278
  fields: disableUnique ? idToUUID(field.fields) : field.fields,
271
279
  rootRelationships: relationships,
272
280
  rootRelationsToBuild,
273
281
  rootTableIDColType,
274
282
  rootTableName,
283
+ rootUniqueRelationships: uniqueRelationships,
275
284
  tableName: arrayTableName,
276
285
  versions,
277
286
  withinLocalizedArrayOrBlock: isLocalized
@@ -373,7 +382,7 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
373
382
  _parentIDIdx: (cols)=>index(`${blockTableName}_parent_id_idx`).on(cols._parentID),
374
383
  _pathIdx: (cols)=>index(`${blockTableName}_path_idx`).on(cols._path)
375
384
  };
376
- const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock;
385
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
377
386
  if (isLocalized) {
378
387
  baseColumns._locale = adapter.enums.enum__locales('_locale').notNull();
379
388
  baseExtraConfig._localeIdx = (cols)=>index(`${blockTableName}_locale_idx`).on(cols._locale);
@@ -383,12 +392,14 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
383
392
  baseColumns,
384
393
  baseExtraConfig,
385
394
  disableNotNull: disableNotNullFromHere,
395
+ disableRelsTableUnique: true,
386
396
  disableUnique,
387
397
  fields: disableUnique ? idToUUID(block.fields) : block.fields,
388
398
  rootRelationships: relationships,
389
399
  rootRelationsToBuild,
390
400
  rootTableIDColType,
391
401
  rootTableName,
402
+ rootUniqueRelationships: uniqueRelationships,
392
403
  tableName: blockTableName,
393
404
  versions,
394
405
  withinLocalizedArrayOrBlock: isLocalized
@@ -483,6 +494,7 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
483
494
  fields: field.fields,
484
495
  forceLocalized,
485
496
  indexes,
497
+ joins,
486
498
  localesColumns,
487
499
  localesIndexes,
488
500
  newTableName,
@@ -492,6 +504,7 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
492
504
  rootRelationsToBuild,
493
505
  rootTableIDColType,
494
506
  rootTableName,
507
+ uniqueRelationships,
495
508
  versions,
496
509
  withinLocalizedArrayOrBlock
497
510
  });
@@ -526,6 +539,7 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
526
539
  fields: field.fields,
527
540
  forceLocalized: field.localized,
528
541
  indexes,
542
+ joins,
529
543
  localesColumns,
530
544
  localesIndexes,
531
545
  newTableName: `${parentTableName}_${columnName}`,
@@ -535,8 +549,9 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
535
549
  rootRelationsToBuild,
536
550
  rootTableIDColType,
537
551
  rootTableName,
552
+ uniqueRelationships,
538
553
  versions,
539
- withinLocalizedArrayOrBlock
554
+ withinLocalizedArrayOrBlock: withinLocalizedArrayOrBlock || field.localized
540
555
  });
541
556
  if (groupHasLocalizedField) {
542
557
  hasLocalizedField = true;
@@ -574,6 +589,7 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
574
589
  })),
575
590
  forceLocalized,
576
591
  indexes,
592
+ joins,
577
593
  localesColumns,
578
594
  localesIndexes,
579
595
  newTableName,
@@ -583,6 +599,7 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
583
599
  rootRelationsToBuild,
584
600
  rootTableIDColType,
585
601
  rootTableName,
602
+ uniqueRelationships,
586
603
  versions,
587
604
  withinLocalizedArrayOrBlock
588
605
  });
@@ -620,6 +637,7 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
620
637
  fields: field.fields,
621
638
  forceLocalized,
622
639
  indexes,
640
+ joins,
623
641
  localesColumns,
624
642
  localesIndexes,
625
643
  newTableName,
@@ -629,6 +647,7 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
629
647
  rootRelationsToBuild,
630
648
  rootTableIDColType,
631
649
  rootTableName,
650
+ uniqueRelationships,
632
651
  versions,
633
652
  withinLocalizedArrayOrBlock
634
653
  });
@@ -655,9 +674,17 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
655
674
  case 'relationship':
656
675
  case 'upload':
657
676
  if (Array.isArray(field.relationTo)) {
658
- 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
+ });
659
683
  } else if (field.hasMany) {
660
684
  relationships.add(field.relationTo);
685
+ if (field.unique && !disableUnique && !disableRelsTableUnique) {
686
+ uniqueRelationships.add(field.relationTo);
687
+ }
661
688
  } else {
662
689
  // simple relationships get a column on the targetTable with a foreign key to the relationTo table
663
690
  const relationshipConfig = adapter.payload.collections[field.relationTo].config;
@@ -678,7 +705,7 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
678
705
  // add relationship to table
679
706
  relationsToBuild.set(fieldName, {
680
707
  type: 'one',
681
- localized: adapter.payload.config.localization && field.localized,
708
+ localized: adapter.payload.config.localization && (field.localized || forceLocalized),
682
709
  target: tableName
683
710
  });
684
711
  // add notNull when not required
@@ -691,6 +718,28 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
691
718
  hasLocalizedRelationshipField = true;
692
719
  }
693
720
  break;
721
+ case 'join':
722
+ {
723
+ // fieldName could be 'posts' or 'group_posts'
724
+ // using `on` as the key for the relation
725
+ const localized = adapter.payload.config.localization && field.localized;
726
+ const fieldSchemaPath = `${fieldPrefix || ''}${field.name}`;
727
+ let target;
728
+ const joinConfig = joins[field.collection].find(({ schemaPath })=>fieldSchemaPath === schemaPath);
729
+ if (joinConfig.targetField.hasMany) {
730
+ target = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${adapter.relationshipsSuffix}`;
731
+ } else {
732
+ target = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${localized ? adapter.localesSuffix : ''}`;
733
+ }
734
+ relationsToBuild.set(fieldName, {
735
+ type: 'many',
736
+ // joins are not localized on the parent table
737
+ localized: false,
738
+ relationName: field.on.replaceAll('.', '_'),
739
+ target
740
+ });
741
+ break;
742
+ }
694
743
  default:
695
744
  break;
696
745
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/postgres/schema/traverseFields.ts"],"sourcesContent":["import type { Relation } from 'drizzle-orm'\nimport type { IndexBuilder, PgColumnBuilder } from 'drizzle-orm/pg-core'\nimport type { Field, TabAsField } from 'payload'\n\nimport { relations } from 'drizzle-orm'\nimport {\n boolean,\n foreignKey,\n index,\n integer,\n jsonb,\n numeric,\n PgNumericBuilder,\n PgUUIDBuilder,\n PgVarcharBuilder,\n text,\n timestamp,\n varchar,\n} from 'drizzle-orm/pg-core'\nimport { InvalidConfiguration } from 'payload'\nimport { fieldAffectsData, optionIsObject } from 'payload/shared'\nimport toSnakeCase from 'to-snake-case'\n\nimport type {\n BaseExtraConfig,\n BasePostgresAdapter,\n GenericColumns,\n IDType,\n RelationMap,\n} from '../types.js'\n\nimport { createTableName } from '../../createTableName.js'\nimport { hasLocalesTable } from '../../utilities/hasLocalesTable.js'\nimport { validateExistingBlockIsIdentical } from '../../utilities/validateExistingBlockIsIdentical.js'\nimport { buildTable } from './build.js'\nimport { createIndex } from './createIndex.js'\nimport { idToUUID } from './idToUUID.js'\nimport { parentIDColumnMap } from './parentIDColumnMap.js'\nimport { withDefault } from './withDefault.js'\n\ntype Args = {\n adapter: BasePostgresAdapter\n columnPrefix?: string\n columns: Record<string, PgColumnBuilder>\n disableNotNull: boolean\n disableUnique?: boolean\n fieldPrefix?: string\n fields: (Field | TabAsField)[]\n forceLocalized?: boolean\n indexes: Record<string, (cols: GenericColumns) => IndexBuilder>\n localesColumns: Record<string, PgColumnBuilder>\n localesIndexes: Record<string, (cols: GenericColumns) => IndexBuilder>\n newTableName: string\n parentTableName: string\n relationships: Set<string>\n relationsToBuild: RelationMap\n rootRelationsToBuild?: RelationMap\n rootTableIDColType: string\n rootTableName: string\n versions: boolean\n /**\n * Tracks whether or not this table is built\n * from the result of a localized array or block field at some point\n */\n withinLocalizedArrayOrBlock?: boolean\n}\n\ntype Result = {\n hasLocalizedField: boolean\n hasLocalizedManyNumberField: boolean\n hasLocalizedManyTextField: boolean\n hasLocalizedRelationshipField: boolean\n hasManyNumberField: 'index' | boolean\n hasManyTextField: 'index' | boolean\n}\n\nexport const traverseFields = ({\n adapter,\n columnPrefix,\n columns,\n disableNotNull,\n disableUnique = false,\n fieldPrefix,\n fields,\n forceLocalized,\n indexes,\n localesColumns,\n localesIndexes,\n newTableName,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n versions,\n withinLocalizedArrayOrBlock,\n}: Args): Result => {\n const throwValidationError = true\n let hasLocalizedField = false\n let hasLocalizedRelationshipField = false\n let hasManyTextField: 'index' | boolean = false\n let hasLocalizedManyTextField = false\n let hasManyNumberField: 'index' | boolean = false\n let hasLocalizedManyNumberField = false\n\n let parentIDColType: IDType = 'integer'\n if (columns.id instanceof PgUUIDBuilder) {\n parentIDColType = 'uuid'\n }\n if (columns.id instanceof PgNumericBuilder) {\n parentIDColType = 'numeric'\n }\n if (columns.id instanceof PgVarcharBuilder) {\n parentIDColType = 'varchar'\n }\n\n fields.forEach((field) => {\n if ('name' in field && field.name === 'id') {\n return\n }\n let columnName: string\n let fieldName: string\n\n let targetTable = columns\n let targetIndexes = indexes\n\n if (fieldAffectsData(field)) {\n columnName = `${columnPrefix || ''}${field.name[0] === '_' ? '_' : ''}${toSnakeCase(\n field.name,\n )}`\n fieldName = `${fieldPrefix?.replace('.', '_') || ''}${field.name}`\n\n // If field is localized,\n // add the column to the locale table instead of main table\n if (\n adapter.payload.config.localization &&\n (field.localized || forceLocalized) &&\n field.type !== 'array' &&\n field.type !== 'blocks' &&\n (('hasMany' in field && field.hasMany !== true) || !('hasMany' in field))\n ) {\n hasLocalizedField = true\n targetTable = localesColumns\n targetIndexes = localesIndexes\n }\n\n if (\n (field.unique || field.index) &&\n !['array', 'blocks', 'group', 'point', 'relationship', 'upload'].includes(field.type) &&\n !('hasMany' in field && field.hasMany === true)\n ) {\n const unique = disableUnique !== true && field.unique\n if (unique) {\n const constraintValue = `${fieldPrefix || ''}${field.name}`\n if (!adapter.fieldConstraints?.[rootTableName]) {\n adapter.fieldConstraints[rootTableName] = {}\n }\n adapter.fieldConstraints[rootTableName][`${columnName}_idx`] = constraintValue\n }\n targetIndexes[`${newTableName}_${field.name}Idx`] = createIndex({\n name: fieldName,\n columnName,\n tableName: newTableName,\n unique,\n })\n }\n }\n\n switch (field.type) {\n case 'text': {\n if (field.hasMany) {\n const isLocalized =\n Boolean(field.localized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock\n\n if (isLocalized) {\n hasLocalizedManyTextField = true\n }\n\n if (field.index) {\n hasManyTextField = 'index'\n } else if (!hasManyTextField) {\n hasManyTextField = true\n }\n\n if (field.unique) {\n throw new InvalidConfiguration(\n 'Unique is not supported in Postgres for hasMany text fields.',\n )\n }\n } else {\n targetTable[fieldName] = withDefault(varchar(columnName), field)\n }\n break\n }\n case 'email':\n case 'code':\n case 'textarea': {\n targetTable[fieldName] = withDefault(varchar(columnName), field)\n break\n }\n\n case 'number': {\n if (field.hasMany) {\n const isLocalized =\n Boolean(field.localized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock\n\n if (isLocalized) {\n hasLocalizedManyNumberField = true\n }\n\n if (field.index) {\n hasManyNumberField = 'index'\n } else if (!hasManyNumberField) {\n hasManyNumberField = true\n }\n\n if (field.unique) {\n throw new InvalidConfiguration(\n 'Unique is not supported in Postgres for hasMany number fields.',\n )\n }\n } else {\n targetTable[fieldName] = withDefault(numeric(columnName), field)\n }\n break\n }\n\n case 'richText':\n case 'json': {\n targetTable[fieldName] = withDefault(jsonb(columnName), field)\n break\n }\n\n case 'date': {\n targetTable[fieldName] = withDefault(\n timestamp(columnName, {\n mode: 'string',\n precision: 3,\n withTimezone: true,\n }),\n field,\n )\n break\n }\n\n case 'point': {\n break\n }\n\n case 'radio':\n case 'select': {\n const enumName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `enum_${newTableName}_`,\n target: 'enumName',\n throwValidationError,\n })\n\n adapter.enums[enumName] = adapter.pgSchema.enum(\n enumName,\n field.options.map((option) => {\n if (optionIsObject(option)) {\n return option.value\n }\n\n return option\n }) as [string, ...string[]],\n )\n\n if (field.type === 'select' && field.hasMany) {\n const selectTableName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `${newTableName}_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n const baseColumns: Record<string, PgColumnBuilder> = {\n order: integer('order').notNull(),\n parent: parentIDColumnMap[parentIDColType]('parent_id').notNull(),\n value: adapter.enums[enumName]('value'),\n }\n\n const baseExtraConfig: BaseExtraConfig = {\n orderIdx: (cols) => index(`${selectTableName}_order_idx`).on(cols.order),\n parentFk: (cols) =>\n foreignKey({\n name: `${selectTableName}_parent_fk`,\n columns: [cols.parent],\n foreignColumns: [adapter.tables[parentTableName].id],\n }).onDelete('cascade'),\n parentIdx: (cols) => index(`${selectTableName}_parent_idx`).on(cols.parent),\n }\n\n const isLocalized =\n Boolean(field.localized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock\n\n if (isLocalized) {\n baseColumns.locale = adapter.enums.enum__locales('locale').notNull()\n baseExtraConfig.localeIdx = (cols) =>\n index(`${selectTableName}_locale_idx`).on(cols.locale)\n }\n\n if (field.index) {\n baseExtraConfig.value = (cols) => index(`${selectTableName}_value_idx`).on(cols.value)\n }\n\n buildTable({\n adapter,\n baseColumns,\n baseExtraConfig,\n disableNotNull,\n disableUnique,\n fields: [],\n rootTableName,\n tableName: selectTableName,\n versions,\n })\n\n relationsToBuild.set(fieldName, {\n type: 'many',\n // selects have their own localized table, independent of the base table.\n localized: false,\n target: selectTableName,\n })\n\n adapter.relations[`relations_${selectTableName}`] = relations(\n adapter.tables[selectTableName],\n ({ one }) => ({\n parent: one(adapter.tables[parentTableName], {\n fields: [adapter.tables[selectTableName].parent],\n references: [adapter.tables[parentTableName].id],\n relationName: fieldName,\n }),\n }),\n )\n } else {\n targetTable[fieldName] = withDefault(adapter.enums[enumName](fieldName), field)\n }\n break\n }\n\n case 'checkbox': {\n targetTable[fieldName] = withDefault(boolean(columnName), field)\n break\n }\n\n case 'array': {\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n const arrayTableName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `${newTableName}_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n\n const baseColumns: Record<string, PgColumnBuilder> = {\n _order: integer('_order').notNull(),\n _parentID: parentIDColumnMap[parentIDColType]('_parent_id').notNull(),\n }\n\n const baseExtraConfig: BaseExtraConfig = {\n _orderIdx: (cols) => index(`${arrayTableName}_order_idx`).on(cols._order),\n _parentIDFk: (cols) =>\n foreignKey({\n name: `${arrayTableName}_parent_id_fk`,\n columns: [cols['_parentID']],\n foreignColumns: [adapter.tables[parentTableName].id],\n }).onDelete('cascade'),\n _parentIDIdx: (cols) => index(`${arrayTableName}_parent_id_idx`).on(cols._parentID),\n }\n\n const isLocalized =\n Boolean(field.localized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock\n\n if (isLocalized) {\n baseColumns._locale = adapter.enums.enum__locales('_locale').notNull()\n baseExtraConfig._localeIdx = (cols) =>\n index(`${arrayTableName}_locale_idx`).on(cols._locale)\n }\n\n const {\n hasLocalizedManyNumberField: subHasLocalizedManyNumberField,\n hasLocalizedManyTextField: subHasLocalizedManyTextField,\n hasLocalizedRelationshipField: subHasLocalizedRelationshipField,\n hasManyNumberField: subHasManyNumberField,\n hasManyTextField: subHasManyTextField,\n relationsToBuild: subRelationsToBuild,\n } = buildTable({\n adapter,\n baseColumns,\n baseExtraConfig,\n disableNotNull: disableNotNullFromHere,\n disableUnique,\n fields: disableUnique ? idToUUID(field.fields) : field.fields,\n rootRelationships: relationships,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n tableName: arrayTableName,\n versions,\n withinLocalizedArrayOrBlock: isLocalized,\n })\n\n if (subHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = subHasLocalizedManyNumberField\n }\n\n if (subHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = subHasLocalizedRelationshipField\n }\n\n if (subHasLocalizedManyTextField) {\n hasLocalizedManyTextField = subHasLocalizedManyTextField\n }\n\n if (subHasManyTextField) {\n if (!hasManyTextField || subHasManyTextField === 'index') {\n hasManyTextField = subHasManyTextField\n }\n }\n if (subHasManyNumberField) {\n if (!hasManyNumberField || subHasManyNumberField === 'index') {\n hasManyNumberField = subHasManyNumberField\n }\n }\n\n relationsToBuild.set(fieldName, {\n type: 'many',\n // arrays have their own localized table, independent of the base table.\n localized: false,\n target: arrayTableName,\n })\n\n adapter.relations[`relations_${arrayTableName}`] = relations(\n adapter.tables[arrayTableName],\n ({ many, one }) => {\n const result: Record<string, Relation<string>> = {\n _parentID: one(adapter.tables[parentTableName], {\n fields: [adapter.tables[arrayTableName]._parentID],\n references: [adapter.tables[parentTableName].id],\n relationName: fieldName,\n }),\n }\n\n if (hasLocalesTable(field.fields)) {\n result._locales = many(adapter.tables[`${arrayTableName}${adapter.localesSuffix}`], {\n relationName: '_locales',\n })\n }\n\n subRelationsToBuild.forEach(({ type, localized, target }, key) => {\n if (type === 'one') {\n const arrayWithLocalized = localized\n ? `${arrayTableName}${adapter.localesSuffix}`\n : arrayTableName\n result[key] = one(adapter.tables[target], {\n fields: [adapter.tables[arrayWithLocalized][key]],\n references: [adapter.tables[target].id],\n relationName: key,\n })\n }\n if (type === 'many') {\n result[key] = many(adapter.tables[target], { relationName: key })\n }\n })\n\n return result\n },\n )\n\n break\n }\n\n case 'blocks': {\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n field.blocks.forEach((block) => {\n const blockTableName = createTableName({\n adapter,\n config: block,\n parentTableName: rootTableName,\n prefix: `${rootTableName}_blocks_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n if (!adapter.tables[blockTableName]) {\n const baseColumns: Record<string, PgColumnBuilder> = {\n _order: integer('_order').notNull(),\n _parentID: parentIDColumnMap[rootTableIDColType]('_parent_id').notNull(),\n _path: text('_path').notNull(),\n }\n\n const baseExtraConfig: BaseExtraConfig = {\n _orderIdx: (cols) => index(`${blockTableName}_order_idx`).on(cols._order),\n _parentIdFk: (cols) =>\n foreignKey({\n name: `${blockTableName}_parent_id_fk`,\n columns: [cols._parentID],\n foreignColumns: [adapter.tables[rootTableName].id],\n }).onDelete('cascade'),\n _parentIDIdx: (cols) => index(`${blockTableName}_parent_id_idx`).on(cols._parentID),\n _pathIdx: (cols) => index(`${blockTableName}_path_idx`).on(cols._path),\n }\n\n const isLocalized =\n Boolean(field.localized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock\n\n if (isLocalized) {\n baseColumns._locale = adapter.enums.enum__locales('_locale').notNull()\n baseExtraConfig._localeIdx = (cols) =>\n index(`${blockTableName}_locale_idx`).on(cols._locale)\n }\n\n const {\n hasLocalizedManyNumberField: subHasLocalizedManyNumberField,\n hasLocalizedManyTextField: subHasLocalizedManyTextField,\n hasLocalizedRelationshipField: subHasLocalizedRelationshipField,\n hasManyNumberField: subHasManyNumberField,\n hasManyTextField: subHasManyTextField,\n relationsToBuild: subRelationsToBuild,\n } = buildTable({\n adapter,\n baseColumns,\n baseExtraConfig,\n disableNotNull: disableNotNullFromHere,\n disableUnique,\n fields: disableUnique ? idToUUID(block.fields) : block.fields,\n rootRelationships: relationships,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n tableName: blockTableName,\n versions,\n withinLocalizedArrayOrBlock: isLocalized,\n })\n\n if (subHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = subHasLocalizedManyNumberField\n }\n\n if (subHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = subHasLocalizedRelationshipField\n }\n\n if (subHasLocalizedManyTextField) {\n hasLocalizedManyTextField = subHasLocalizedManyTextField\n }\n\n if (subHasManyTextField) {\n if (!hasManyTextField || subHasManyTextField === 'index') {\n hasManyTextField = subHasManyTextField\n }\n }\n\n if (subHasManyNumberField) {\n if (!hasManyNumberField || subHasManyNumberField === 'index') {\n hasManyNumberField = subHasManyNumberField\n }\n }\n\n adapter.relations[`relations_${blockTableName}`] = relations(\n adapter.tables[blockTableName],\n ({ many, one }) => {\n const result: Record<string, Relation<string>> = {\n _parentID: one(adapter.tables[rootTableName], {\n fields: [adapter.tables[blockTableName]._parentID],\n references: [adapter.tables[rootTableName].id],\n relationName: `_blocks_${block.slug}`,\n }),\n }\n\n if (hasLocalesTable(block.fields)) {\n result._locales = many(\n adapter.tables[`${blockTableName}${adapter.localesSuffix}`],\n { relationName: '_locales' },\n )\n }\n\n subRelationsToBuild.forEach(({ type, localized, target }, key) => {\n if (type === 'one') {\n const blockWithLocalized = localized\n ? `${blockTableName}${adapter.localesSuffix}`\n : blockTableName\n result[key] = one(adapter.tables[target], {\n fields: [adapter.tables[blockWithLocalized][key]],\n references: [adapter.tables[target].id],\n relationName: key,\n })\n }\n if (type === 'many') {\n result[key] = many(adapter.tables[target], { relationName: key })\n }\n })\n\n return result\n },\n )\n } else if (process.env.NODE_ENV !== 'production' && !versions) {\n validateExistingBlockIsIdentical({\n block,\n localized: field.localized,\n rootTableName,\n table: adapter.tables[blockTableName],\n tableLocales: adapter.tables[`${blockTableName}${adapter.localesSuffix}`],\n })\n }\n // blocks relationships are defined from the collection or globals table down to the block, bypassing any subBlocks\n rootRelationsToBuild.set(`_blocks_${block.slug}`, {\n type: 'many',\n // blocks are not localized on the parent table\n localized: false,\n target: blockTableName,\n })\n })\n\n break\n }\n\n case 'tab':\n case 'group': {\n if (!('name' in field)) {\n const {\n hasLocalizedField: groupHasLocalizedField,\n hasLocalizedManyNumberField: groupHasLocalizedManyNumberField,\n hasLocalizedManyTextField: groupHasLocalizedManyTextField,\n hasLocalizedRelationshipField: groupHasLocalizedRelationshipField,\n hasManyNumberField: groupHasManyNumberField,\n hasManyTextField: groupHasManyTextField,\n } = traverseFields({\n adapter,\n columnPrefix,\n columns,\n disableNotNull,\n disableUnique,\n fieldPrefix,\n fields: field.fields,\n forceLocalized,\n indexes,\n localesColumns,\n localesIndexes,\n newTableName,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n versions,\n withinLocalizedArrayOrBlock,\n })\n\n if (groupHasLocalizedField) {\n hasLocalizedField = true\n }\n if (groupHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = true\n }\n if (groupHasManyTextField) {\n hasManyTextField = true\n }\n if (groupHasLocalizedManyTextField) {\n hasLocalizedManyTextField = true\n }\n if (groupHasManyNumberField) {\n hasManyNumberField = true\n }\n if (groupHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = true\n }\n break\n }\n\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n const {\n hasLocalizedField: groupHasLocalizedField,\n hasLocalizedManyNumberField: groupHasLocalizedManyNumberField,\n hasLocalizedManyTextField: groupHasLocalizedManyTextField,\n hasLocalizedRelationshipField: groupHasLocalizedRelationshipField,\n hasManyNumberField: groupHasManyNumberField,\n hasManyTextField: groupHasManyTextField,\n } = traverseFields({\n adapter,\n columnPrefix: `${columnName}_`,\n columns,\n disableNotNull: disableNotNullFromHere,\n disableUnique,\n fieldPrefix: `${fieldName}.`,\n fields: field.fields,\n forceLocalized: field.localized,\n indexes,\n localesColumns,\n localesIndexes,\n newTableName: `${parentTableName}_${columnName}`,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n versions,\n withinLocalizedArrayOrBlock,\n })\n\n if (groupHasLocalizedField) {\n hasLocalizedField = true\n }\n if (groupHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = true\n }\n if (groupHasManyTextField) {\n hasManyTextField = true\n }\n if (groupHasLocalizedManyTextField) {\n hasLocalizedManyTextField = true\n }\n if (groupHasManyNumberField) {\n hasManyNumberField = true\n }\n if (groupHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = true\n }\n break\n }\n\n case 'tabs': {\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n const {\n hasLocalizedField: tabHasLocalizedField,\n hasLocalizedManyNumberField: tabHasLocalizedManyNumberField,\n hasLocalizedManyTextField: tabHasLocalizedManyTextField,\n hasLocalizedRelationshipField: tabHasLocalizedRelationshipField,\n hasManyNumberField: tabHasManyNumberField,\n hasManyTextField: tabHasManyTextField,\n } = traverseFields({\n adapter,\n columnPrefix,\n columns,\n disableNotNull: disableNotNullFromHere,\n disableUnique,\n fieldPrefix,\n fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),\n forceLocalized,\n indexes,\n localesColumns,\n localesIndexes,\n newTableName,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n versions,\n withinLocalizedArrayOrBlock,\n })\n\n if (tabHasLocalizedField) {\n hasLocalizedField = true\n }\n if (tabHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = true\n }\n if (tabHasManyTextField) {\n hasManyTextField = true\n }\n if (tabHasLocalizedManyTextField) {\n hasLocalizedManyTextField = true\n }\n if (tabHasManyNumberField) {\n hasManyNumberField = true\n }\n if (tabHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = true\n }\n break\n }\n\n case 'row':\n case 'collapsible': {\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n const {\n hasLocalizedField: rowHasLocalizedField,\n hasLocalizedManyNumberField: rowHasLocalizedManyNumberField,\n hasLocalizedManyTextField: rowHasLocalizedManyTextField,\n hasLocalizedRelationshipField: rowHasLocalizedRelationshipField,\n hasManyNumberField: rowHasManyNumberField,\n hasManyTextField: rowHasManyTextField,\n } = traverseFields({\n adapter,\n columnPrefix,\n columns,\n disableNotNull: disableNotNullFromHere,\n disableUnique,\n fieldPrefix,\n fields: field.fields,\n forceLocalized,\n indexes,\n localesColumns,\n localesIndexes,\n newTableName,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n versions,\n withinLocalizedArrayOrBlock,\n })\n\n if (rowHasLocalizedField) {\n hasLocalizedField = true\n }\n if (rowHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = true\n }\n if (rowHasManyTextField) {\n hasManyTextField = true\n }\n if (rowHasLocalizedManyTextField) {\n hasLocalizedManyTextField = true\n }\n if (rowHasManyNumberField) {\n hasManyNumberField = true\n }\n if (rowHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = true\n }\n break\n }\n\n case 'relationship':\n case 'upload':\n if (Array.isArray(field.relationTo)) {\n field.relationTo.forEach((relation) => relationships.add(relation))\n } else if (field.hasMany) {\n relationships.add(field.relationTo)\n } else {\n // simple relationships get a column on the targetTable with a foreign key to the relationTo table\n const relationshipConfig = adapter.payload.collections[field.relationTo].config\n\n const tableName = adapter.tableNameMap.get(toSnakeCase(field.relationTo))\n\n // get the id type of the related collection\n let colType = adapter.idType === 'uuid' ? 'uuid' : 'integer'\n const relatedCollectionCustomID = relationshipConfig.fields.find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n )\n if (relatedCollectionCustomID?.type === 'number') {\n colType = 'numeric'\n }\n if (relatedCollectionCustomID?.type === 'text') {\n colType = 'varchar'\n }\n\n // make the foreign key column for relationship using the correct id column type\n targetTable[fieldName] = parentIDColumnMap[colType](`${columnName}_id`).references(\n () => adapter.tables[tableName].id,\n { onDelete: 'set null' },\n )\n\n // add relationship to table\n relationsToBuild.set(fieldName, {\n type: 'one',\n localized: adapter.payload.config.localization && field.localized,\n target: tableName,\n })\n\n // add notNull when not required\n if (!disableNotNull && field.required && !field.admin?.condition) {\n targetTable[fieldName].notNull()\n }\n break\n }\n\n if (\n Boolean(field.localized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock\n ) {\n hasLocalizedRelationshipField = true\n }\n\n break\n\n default:\n break\n }\n\n const condition = field.admin && field.admin.condition\n\n if (\n !disableNotNull &&\n targetTable[fieldName] &&\n 'required' in field &&\n field.required &&\n !condition\n ) {\n targetTable[fieldName].notNull()\n }\n })\n\n return {\n hasLocalizedField,\n hasLocalizedManyNumberField,\n hasLocalizedManyTextField,\n hasLocalizedRelationshipField,\n hasManyNumberField,\n hasManyTextField,\n }\n}\n"],"names":["relations","boolean","foreignKey","index","integer","jsonb","numeric","PgNumericBuilder","PgUUIDBuilder","PgVarcharBuilder","text","timestamp","varchar","InvalidConfiguration","fieldAffectsData","optionIsObject","toSnakeCase","createTableName","hasLocalesTable","validateExistingBlockIsIdentical","buildTable","createIndex","idToUUID","parentIDColumnMap","withDefault","traverseFields","adapter","columnPrefix","columns","disableNotNull","disableUnique","fieldPrefix","fields","forceLocalized","indexes","localesColumns","localesIndexes","newTableName","parentTableName","relationships","relationsToBuild","rootRelationsToBuild","rootTableIDColType","rootTableName","versions","withinLocalizedArrayOrBlock","throwValidationError","hasLocalizedField","hasLocalizedRelationshipField","hasManyTextField","hasLocalizedManyTextField","hasManyNumberField","hasLocalizedManyNumberField","parentIDColType","id","forEach","field","name","columnName","fieldName","targetTable","targetIndexes","replace","payload","config","localization","localized","type","hasMany","unique","includes","constraintValue","fieldConstraints","tableName","isLocalized","Boolean","mode","precision","withTimezone","enumName","prefix","target","enums","pgSchema","enum","options","map","option","value","selectTableName","versionsCustomName","baseColumns","order","notNull","parent","baseExtraConfig","orderIdx","cols","on","parentFk","foreignColumns","tables","onDelete","parentIdx","locale","enum__locales","localeIdx","set","one","references","relationName","disableNotNullFromHere","admin","condition","arrayTableName","_order","_parentID","_orderIdx","_parentIDFk","_parentIDIdx","_locale","_localeIdx","subHasLocalizedManyNumberField","subHasLocalizedManyTextField","subHasLocalizedRelationshipField","subHasManyNumberField","subHasManyTextField","subRelationsToBuild","rootRelationships","many","result","_locales","localesSuffix","key","arrayWithLocalized","blocks","block","blockTableName","_path","_parentIdFk","_pathIdx","slug","blockWithLocalized","process","env","NODE_ENV","table","tableLocales","groupHasLocalizedField","groupHasLocalizedManyNumberField","groupHasLocalizedManyTextField","groupHasLocalizedRelationshipField","groupHasManyNumberField","groupHasManyTextField","tabHasLocalizedField","tabHasLocalizedManyNumberField","tabHasLocalizedManyTextField","tabHasLocalizedRelationshipField","tabHasManyNumberField","tabHasManyTextField","tabs","tab","rowHasLocalizedField","rowHasLocalizedManyNumberField","rowHasLocalizedManyTextField","rowHasLocalizedRelationshipField","rowHasManyNumberField","rowHasManyTextField","Array","isArray","relationTo","relation","add","relationshipConfig","collections","tableNameMap","get","colType","idType","relatedCollectionCustomID","find","required"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/postgres/schema/traverseFields.ts"],"sourcesContent":["import type { Relation } from 'drizzle-orm'\nimport type { IndexBuilder, PgColumnBuilder } from 'drizzle-orm/pg-core'\nimport type { Field, SanitizedJoins, TabAsField } from 'payload'\n\nimport { relations } from 'drizzle-orm'\nimport {\n boolean,\n foreignKey,\n index,\n integer,\n jsonb,\n numeric,\n PgNumericBuilder,\n PgUUIDBuilder,\n PgVarcharBuilder,\n text,\n timestamp,\n varchar,\n} from 'drizzle-orm/pg-core'\nimport { InvalidConfiguration } from 'payload'\nimport { fieldAffectsData, fieldIsVirtual, optionIsObject } from 'payload/shared'\nimport toSnakeCase from 'to-snake-case'\n\nimport type {\n BaseExtraConfig,\n BasePostgresAdapter,\n GenericColumns,\n IDType,\n RelationMap,\n} from '../types.js'\n\nimport { createTableName } from '../../createTableName.js'\nimport { hasLocalesTable } from '../../utilities/hasLocalesTable.js'\nimport { validateExistingBlockIsIdentical } from '../../utilities/validateExistingBlockIsIdentical.js'\nimport { buildTable } from './build.js'\nimport { createIndex } from './createIndex.js'\nimport { idToUUID } from './idToUUID.js'\nimport { parentIDColumnMap } from './parentIDColumnMap.js'\nimport { withDefault } from './withDefault.js'\n\ntype Args = {\n adapter: BasePostgresAdapter\n columnPrefix?: string\n columns: Record<string, PgColumnBuilder>\n disableNotNull: boolean\n disableRelsTableUnique?: boolean\n disableUnique?: boolean\n fieldPrefix?: string\n fields: (Field | TabAsField)[]\n forceLocalized?: boolean\n indexes: Record<string, (cols: GenericColumns) => IndexBuilder>\n joins?: SanitizedJoins\n localesColumns: Record<string, PgColumnBuilder>\n localesIndexes: Record<string, (cols: GenericColumns) => IndexBuilder>\n newTableName: string\n parentTableName: string\n relationships: Set<string>\n relationsToBuild: RelationMap\n rootRelationsToBuild?: RelationMap\n rootTableIDColType: string\n rootTableName: string\n uniqueRelationships: Set<string>\n versions: boolean\n /**\n * Tracks whether or not this table is built\n * from the result of a localized array or block field at some point\n */\n withinLocalizedArrayOrBlock?: boolean\n}\n\ntype Result = {\n hasLocalizedField: boolean\n hasLocalizedManyNumberField: boolean\n hasLocalizedManyTextField: boolean\n hasLocalizedRelationshipField: boolean\n hasManyNumberField: 'index' | boolean\n hasManyTextField: 'index' | boolean\n}\n\nexport const traverseFields = ({\n adapter,\n columnPrefix,\n columns,\n disableNotNull,\n disableRelsTableUnique,\n disableUnique = false,\n fieldPrefix,\n fields,\n forceLocalized,\n indexes,\n joins,\n localesColumns,\n localesIndexes,\n newTableName,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n uniqueRelationships,\n versions,\n withinLocalizedArrayOrBlock,\n}: Args): Result => {\n const throwValidationError = true\n let hasLocalizedField = false\n let hasLocalizedRelationshipField = false\n let hasManyTextField: 'index' | boolean = false\n let hasLocalizedManyTextField = false\n let hasManyNumberField: 'index' | boolean = false\n let hasLocalizedManyNumberField = false\n\n let parentIDColType: IDType = 'integer'\n if (columns.id instanceof PgUUIDBuilder) {\n parentIDColType = 'uuid'\n }\n if (columns.id instanceof PgNumericBuilder) {\n parentIDColType = 'numeric'\n }\n if (columns.id instanceof PgVarcharBuilder) {\n parentIDColType = 'varchar'\n }\n\n fields.forEach((field) => {\n if ('name' in field && field.name === 'id') {\n return\n }\n if (fieldIsVirtual(field)) {\n return\n }\n\n let columnName: string\n let fieldName: string\n\n let targetTable = columns\n let targetIndexes = indexes\n\n if (fieldAffectsData(field)) {\n columnName = `${columnPrefix || ''}${field.name[0] === '_' ? '_' : ''}${toSnakeCase(\n field.name,\n )}`\n fieldName = `${fieldPrefix?.replace('.', '_') || ''}${field.name}`\n\n // If field is localized,\n // add the column to the locale table instead of main table\n if (\n adapter.payload.config.localization &&\n (field.localized || forceLocalized) &&\n field.type !== 'array' &&\n field.type !== 'blocks' &&\n (('hasMany' in field && field.hasMany !== true) || !('hasMany' in field))\n ) {\n hasLocalizedField = true\n targetTable = localesColumns\n targetIndexes = localesIndexes\n }\n\n if (\n (field.unique || field.index || ['relationship', 'upload'].includes(field.type)) &&\n !['array', 'blocks', 'group', 'point'].includes(field.type) &&\n !('hasMany' in field && field.hasMany === true) &&\n !('relationTo' in field && Array.isArray(field.relationTo))\n ) {\n const unique = disableUnique !== true && field.unique\n if (unique) {\n const constraintValue = `${fieldPrefix || ''}${field.name}`\n if (!adapter.fieldConstraints?.[rootTableName]) {\n adapter.fieldConstraints[rootTableName] = {}\n }\n adapter.fieldConstraints[rootTableName][`${columnName}_idx`] = constraintValue\n }\n targetIndexes[`${newTableName}_${field.name}Idx`] = createIndex({\n name: field.localized ? [fieldName, '_locale'] : fieldName,\n columnName,\n tableName: newTableName,\n unique,\n })\n }\n }\n\n switch (field.type) {\n case 'text': {\n if (field.hasMany) {\n const isLocalized =\n Boolean(field.localized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n hasLocalizedManyTextField = true\n }\n\n if (field.index) {\n hasManyTextField = 'index'\n } else if (!hasManyTextField) {\n hasManyTextField = true\n }\n\n if (field.unique) {\n throw new InvalidConfiguration(\n 'Unique is not supported in Postgres for hasMany text fields.',\n )\n }\n } else {\n targetTable[fieldName] = withDefault(varchar(columnName), field)\n }\n break\n }\n case 'email':\n case 'code':\n case 'textarea': {\n targetTable[fieldName] = withDefault(varchar(columnName), field)\n break\n }\n\n case 'number': {\n if (field.hasMany) {\n const isLocalized =\n Boolean(field.localized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n hasLocalizedManyNumberField = true\n }\n\n if (field.index) {\n hasManyNumberField = 'index'\n } else if (!hasManyNumberField) {\n hasManyNumberField = true\n }\n\n if (field.unique) {\n throw new InvalidConfiguration(\n 'Unique is not supported in Postgres for hasMany number fields.',\n )\n }\n } else {\n targetTable[fieldName] = withDefault(numeric(columnName), field)\n }\n break\n }\n\n case 'richText':\n case 'json': {\n targetTable[fieldName] = withDefault(jsonb(columnName), field)\n break\n }\n\n case 'date': {\n targetTable[fieldName] = withDefault(\n timestamp(columnName, {\n mode: 'string',\n precision: 3,\n withTimezone: true,\n }),\n field,\n )\n break\n }\n\n case 'point': {\n break\n }\n\n case 'radio':\n case 'select': {\n const enumName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `enum_${newTableName}_`,\n target: 'enumName',\n throwValidationError,\n })\n\n adapter.enums[enumName] = adapter.pgSchema.enum(\n enumName,\n field.options.map((option) => {\n if (optionIsObject(option)) {\n return option.value\n }\n\n return option\n }) as [string, ...string[]],\n )\n\n if (field.type === 'select' && field.hasMany) {\n const selectTableName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `${newTableName}_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n const baseColumns: Record<string, PgColumnBuilder> = {\n order: integer('order').notNull(),\n parent: parentIDColumnMap[parentIDColType]('parent_id').notNull(),\n value: adapter.enums[enumName]('value'),\n }\n\n const baseExtraConfig: BaseExtraConfig = {\n orderIdx: (cols) => index(`${selectTableName}_order_idx`).on(cols.order),\n parentFk: (cols) =>\n foreignKey({\n name: `${selectTableName}_parent_fk`,\n columns: [cols.parent],\n foreignColumns: [adapter.tables[parentTableName].id],\n }).onDelete('cascade'),\n parentIdx: (cols) => index(`${selectTableName}_parent_idx`).on(cols.parent),\n }\n\n const isLocalized =\n Boolean(field.localized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n baseColumns.locale = adapter.enums.enum__locales('locale').notNull()\n baseExtraConfig.localeIdx = (cols) =>\n index(`${selectTableName}_locale_idx`).on(cols.locale)\n }\n\n if (field.index) {\n baseExtraConfig.value = (cols) => index(`${selectTableName}_value_idx`).on(cols.value)\n }\n\n buildTable({\n adapter,\n baseColumns,\n baseExtraConfig,\n disableNotNull,\n disableUnique,\n fields: [],\n rootTableName,\n tableName: selectTableName,\n versions,\n })\n\n relationsToBuild.set(fieldName, {\n type: 'many',\n // selects have their own localized table, independent of the base table.\n localized: false,\n target: selectTableName,\n })\n\n adapter.relations[`relations_${selectTableName}`] = relations(\n adapter.tables[selectTableName],\n ({ one }) => ({\n parent: one(adapter.tables[parentTableName], {\n fields: [adapter.tables[selectTableName].parent],\n references: [adapter.tables[parentTableName].id],\n relationName: fieldName,\n }),\n }),\n )\n } else {\n targetTable[fieldName] = withDefault(adapter.enums[enumName](columnName), field)\n }\n break\n }\n\n case 'checkbox': {\n targetTable[fieldName] = withDefault(boolean(columnName), field)\n break\n }\n\n case 'array': {\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n const arrayTableName = createTableName({\n adapter,\n config: field,\n parentTableName: newTableName,\n prefix: `${newTableName}_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n\n const baseColumns: Record<string, PgColumnBuilder> = {\n _order: integer('_order').notNull(),\n _parentID: parentIDColumnMap[parentIDColType]('_parent_id').notNull(),\n }\n\n const baseExtraConfig: BaseExtraConfig = {\n _orderIdx: (cols) => index(`${arrayTableName}_order_idx`).on(cols._order),\n _parentIDFk: (cols) =>\n foreignKey({\n name: `${arrayTableName}_parent_id_fk`,\n columns: [cols['_parentID']],\n foreignColumns: [adapter.tables[parentTableName].id],\n }).onDelete('cascade'),\n _parentIDIdx: (cols) => index(`${arrayTableName}_parent_id_idx`).on(cols._parentID),\n }\n\n const isLocalized =\n Boolean(field.localized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n baseColumns._locale = adapter.enums.enum__locales('_locale').notNull()\n baseExtraConfig._localeIdx = (cols) =>\n index(`${arrayTableName}_locale_idx`).on(cols._locale)\n }\n\n const {\n hasLocalizedManyNumberField: subHasLocalizedManyNumberField,\n hasLocalizedManyTextField: subHasLocalizedManyTextField,\n hasLocalizedRelationshipField: subHasLocalizedRelationshipField,\n hasManyNumberField: subHasManyNumberField,\n hasManyTextField: subHasManyTextField,\n relationsToBuild: subRelationsToBuild,\n } = buildTable({\n adapter,\n baseColumns,\n baseExtraConfig,\n disableNotNull: disableNotNullFromHere,\n disableRelsTableUnique: true,\n disableUnique,\n fields: disableUnique ? idToUUID(field.fields) : field.fields,\n rootRelationships: relationships,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n rootUniqueRelationships: uniqueRelationships,\n tableName: arrayTableName,\n versions,\n withinLocalizedArrayOrBlock: isLocalized,\n })\n\n if (subHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = subHasLocalizedManyNumberField\n }\n\n if (subHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = subHasLocalizedRelationshipField\n }\n\n if (subHasLocalizedManyTextField) {\n hasLocalizedManyTextField = subHasLocalizedManyTextField\n }\n\n if (subHasManyTextField) {\n if (!hasManyTextField || subHasManyTextField === 'index') {\n hasManyTextField = subHasManyTextField\n }\n }\n if (subHasManyNumberField) {\n if (!hasManyNumberField || subHasManyNumberField === 'index') {\n hasManyNumberField = subHasManyNumberField\n }\n }\n\n relationsToBuild.set(fieldName, {\n type: 'many',\n // arrays have their own localized table, independent of the base table.\n localized: false,\n target: arrayTableName,\n })\n\n adapter.relations[`relations_${arrayTableName}`] = relations(\n adapter.tables[arrayTableName],\n ({ many, one }) => {\n const result: Record<string, Relation<string>> = {\n _parentID: one(adapter.tables[parentTableName], {\n fields: [adapter.tables[arrayTableName]._parentID],\n references: [adapter.tables[parentTableName].id],\n relationName: fieldName,\n }),\n }\n\n if (hasLocalesTable(field.fields)) {\n result._locales = many(adapter.tables[`${arrayTableName}${adapter.localesSuffix}`], {\n relationName: '_locales',\n })\n }\n\n subRelationsToBuild.forEach(({ type, localized, target }, key) => {\n if (type === 'one') {\n const arrayWithLocalized = localized\n ? `${arrayTableName}${adapter.localesSuffix}`\n : arrayTableName\n result[key] = one(adapter.tables[target], {\n fields: [adapter.tables[arrayWithLocalized][key]],\n references: [adapter.tables[target].id],\n relationName: key,\n })\n }\n if (type === 'many') {\n result[key] = many(adapter.tables[target], { relationName: key })\n }\n })\n\n return result\n },\n )\n\n break\n }\n\n case 'blocks': {\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n field.blocks.forEach((block) => {\n const blockTableName = createTableName({\n adapter,\n config: block,\n parentTableName: rootTableName,\n prefix: `${rootTableName}_blocks_`,\n throwValidationError,\n versionsCustomName: versions,\n })\n if (!adapter.tables[blockTableName]) {\n const baseColumns: Record<string, PgColumnBuilder> = {\n _order: integer('_order').notNull(),\n _parentID: parentIDColumnMap[rootTableIDColType]('_parent_id').notNull(),\n _path: text('_path').notNull(),\n }\n\n const baseExtraConfig: BaseExtraConfig = {\n _orderIdx: (cols) => index(`${blockTableName}_order_idx`).on(cols._order),\n _parentIdFk: (cols) =>\n foreignKey({\n name: `${blockTableName}_parent_id_fk`,\n columns: [cols._parentID],\n foreignColumns: [adapter.tables[rootTableName].id],\n }).onDelete('cascade'),\n _parentIDIdx: (cols) => index(`${blockTableName}_parent_id_idx`).on(cols._parentID),\n _pathIdx: (cols) => index(`${blockTableName}_path_idx`).on(cols._path),\n }\n\n const isLocalized =\n Boolean(field.localized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock ||\n forceLocalized\n\n if (isLocalized) {\n baseColumns._locale = adapter.enums.enum__locales('_locale').notNull()\n baseExtraConfig._localeIdx = (cols) =>\n index(`${blockTableName}_locale_idx`).on(cols._locale)\n }\n\n const {\n hasLocalizedManyNumberField: subHasLocalizedManyNumberField,\n hasLocalizedManyTextField: subHasLocalizedManyTextField,\n hasLocalizedRelationshipField: subHasLocalizedRelationshipField,\n hasManyNumberField: subHasManyNumberField,\n hasManyTextField: subHasManyTextField,\n relationsToBuild: subRelationsToBuild,\n } = buildTable({\n adapter,\n baseColumns,\n baseExtraConfig,\n disableNotNull: disableNotNullFromHere,\n disableRelsTableUnique: true,\n disableUnique,\n fields: disableUnique ? idToUUID(block.fields) : block.fields,\n rootRelationships: relationships,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n rootUniqueRelationships: uniqueRelationships,\n tableName: blockTableName,\n versions,\n withinLocalizedArrayOrBlock: isLocalized,\n })\n\n if (subHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = subHasLocalizedManyNumberField\n }\n\n if (subHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = subHasLocalizedRelationshipField\n }\n\n if (subHasLocalizedManyTextField) {\n hasLocalizedManyTextField = subHasLocalizedManyTextField\n }\n\n if (subHasManyTextField) {\n if (!hasManyTextField || subHasManyTextField === 'index') {\n hasManyTextField = subHasManyTextField\n }\n }\n\n if (subHasManyNumberField) {\n if (!hasManyNumberField || subHasManyNumberField === 'index') {\n hasManyNumberField = subHasManyNumberField\n }\n }\n\n adapter.relations[`relations_${blockTableName}`] = relations(\n adapter.tables[blockTableName],\n ({ many, one }) => {\n const result: Record<string, Relation<string>> = {\n _parentID: one(adapter.tables[rootTableName], {\n fields: [adapter.tables[blockTableName]._parentID],\n references: [adapter.tables[rootTableName].id],\n relationName: `_blocks_${block.slug}`,\n }),\n }\n\n if (hasLocalesTable(block.fields)) {\n result._locales = many(\n adapter.tables[`${blockTableName}${adapter.localesSuffix}`],\n { relationName: '_locales' },\n )\n }\n\n subRelationsToBuild.forEach(({ type, localized, target }, key) => {\n if (type === 'one') {\n const blockWithLocalized = localized\n ? `${blockTableName}${adapter.localesSuffix}`\n : blockTableName\n result[key] = one(adapter.tables[target], {\n fields: [adapter.tables[blockWithLocalized][key]],\n references: [adapter.tables[target].id],\n relationName: key,\n })\n }\n if (type === 'many') {\n result[key] = many(adapter.tables[target], { relationName: key })\n }\n })\n\n return result\n },\n )\n } else if (process.env.NODE_ENV !== 'production' && !versions) {\n validateExistingBlockIsIdentical({\n block,\n localized: field.localized,\n rootTableName,\n table: adapter.tables[blockTableName],\n tableLocales: adapter.tables[`${blockTableName}${adapter.localesSuffix}`],\n })\n }\n // blocks relationships are defined from the collection or globals table down to the block, bypassing any subBlocks\n rootRelationsToBuild.set(`_blocks_${block.slug}`, {\n type: 'many',\n // blocks are not localized on the parent table\n localized: false,\n target: blockTableName,\n })\n })\n\n break\n }\n\n case 'tab':\n case 'group': {\n if (!('name' in field)) {\n const {\n hasLocalizedField: groupHasLocalizedField,\n hasLocalizedManyNumberField: groupHasLocalizedManyNumberField,\n hasLocalizedManyTextField: groupHasLocalizedManyTextField,\n hasLocalizedRelationshipField: groupHasLocalizedRelationshipField,\n hasManyNumberField: groupHasManyNumberField,\n hasManyTextField: groupHasManyTextField,\n } = traverseFields({\n adapter,\n columnPrefix,\n columns,\n disableNotNull,\n disableUnique,\n fieldPrefix,\n fields: field.fields,\n forceLocalized,\n indexes,\n joins,\n localesColumns,\n localesIndexes,\n newTableName,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n uniqueRelationships,\n versions,\n withinLocalizedArrayOrBlock,\n })\n\n if (groupHasLocalizedField) {\n hasLocalizedField = true\n }\n if (groupHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = true\n }\n if (groupHasManyTextField) {\n hasManyTextField = true\n }\n if (groupHasLocalizedManyTextField) {\n hasLocalizedManyTextField = true\n }\n if (groupHasManyNumberField) {\n hasManyNumberField = true\n }\n if (groupHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = true\n }\n break\n }\n\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n const {\n hasLocalizedField: groupHasLocalizedField,\n hasLocalizedManyNumberField: groupHasLocalizedManyNumberField,\n hasLocalizedManyTextField: groupHasLocalizedManyTextField,\n hasLocalizedRelationshipField: groupHasLocalizedRelationshipField,\n hasManyNumberField: groupHasManyNumberField,\n hasManyTextField: groupHasManyTextField,\n } = traverseFields({\n adapter,\n columnPrefix: `${columnName}_`,\n columns,\n disableNotNull: disableNotNullFromHere,\n disableUnique,\n fieldPrefix: `${fieldName}.`,\n fields: field.fields,\n forceLocalized: field.localized,\n indexes,\n joins,\n localesColumns,\n localesIndexes,\n newTableName: `${parentTableName}_${columnName}`,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n uniqueRelationships,\n versions,\n withinLocalizedArrayOrBlock: withinLocalizedArrayOrBlock || field.localized,\n })\n\n if (groupHasLocalizedField) {\n hasLocalizedField = true\n }\n if (groupHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = true\n }\n if (groupHasManyTextField) {\n hasManyTextField = true\n }\n if (groupHasLocalizedManyTextField) {\n hasLocalizedManyTextField = true\n }\n if (groupHasManyNumberField) {\n hasManyNumberField = true\n }\n if (groupHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = true\n }\n break\n }\n\n case 'tabs': {\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n\n const {\n hasLocalizedField: tabHasLocalizedField,\n hasLocalizedManyNumberField: tabHasLocalizedManyNumberField,\n hasLocalizedManyTextField: tabHasLocalizedManyTextField,\n hasLocalizedRelationshipField: tabHasLocalizedRelationshipField,\n hasManyNumberField: tabHasManyNumberField,\n hasManyTextField: tabHasManyTextField,\n } = traverseFields({\n adapter,\n columnPrefix,\n columns,\n disableNotNull: disableNotNullFromHere,\n disableUnique,\n fieldPrefix,\n fields: field.tabs.map((tab) => ({ ...tab, type: 'tab' })),\n forceLocalized,\n indexes,\n joins,\n localesColumns,\n localesIndexes,\n newTableName,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n uniqueRelationships,\n versions,\n withinLocalizedArrayOrBlock,\n })\n\n if (tabHasLocalizedField) {\n hasLocalizedField = true\n }\n if (tabHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = true\n }\n if (tabHasManyTextField) {\n hasManyTextField = true\n }\n if (tabHasLocalizedManyTextField) {\n hasLocalizedManyTextField = true\n }\n if (tabHasManyNumberField) {\n hasManyNumberField = true\n }\n if (tabHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = true\n }\n break\n }\n\n case 'row':\n case 'collapsible': {\n const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull\n const {\n hasLocalizedField: rowHasLocalizedField,\n hasLocalizedManyNumberField: rowHasLocalizedManyNumberField,\n hasLocalizedManyTextField: rowHasLocalizedManyTextField,\n hasLocalizedRelationshipField: rowHasLocalizedRelationshipField,\n hasManyNumberField: rowHasManyNumberField,\n hasManyTextField: rowHasManyTextField,\n } = traverseFields({\n adapter,\n columnPrefix,\n columns,\n disableNotNull: disableNotNullFromHere,\n disableUnique,\n fieldPrefix,\n fields: field.fields,\n forceLocalized,\n indexes,\n joins,\n localesColumns,\n localesIndexes,\n newTableName,\n parentTableName,\n relationships,\n relationsToBuild,\n rootRelationsToBuild,\n rootTableIDColType,\n rootTableName,\n uniqueRelationships,\n versions,\n withinLocalizedArrayOrBlock,\n })\n\n if (rowHasLocalizedField) {\n hasLocalizedField = true\n }\n if (rowHasLocalizedRelationshipField) {\n hasLocalizedRelationshipField = true\n }\n if (rowHasManyTextField) {\n hasManyTextField = true\n }\n if (rowHasLocalizedManyTextField) {\n hasLocalizedManyTextField = true\n }\n if (rowHasManyNumberField) {\n hasManyNumberField = true\n }\n if (rowHasLocalizedManyNumberField) {\n hasLocalizedManyNumberField = true\n }\n break\n }\n\n case 'relationship':\n case 'upload':\n if (Array.isArray(field.relationTo)) {\n field.relationTo.forEach((relation) => {\n relationships.add(relation)\n if (field.unique && !disableUnique && !disableRelsTableUnique) {\n uniqueRelationships.add(relation)\n }\n })\n } else if (field.hasMany) {\n relationships.add(field.relationTo)\n if (field.unique && !disableUnique && !disableRelsTableUnique) {\n uniqueRelationships.add(field.relationTo)\n }\n } else {\n // simple relationships get a column on the targetTable with a foreign key to the relationTo table\n const relationshipConfig = adapter.payload.collections[field.relationTo].config\n\n const tableName = adapter.tableNameMap.get(toSnakeCase(field.relationTo))\n\n // get the id type of the related collection\n let colType = adapter.idType === 'uuid' ? 'uuid' : 'integer'\n const relatedCollectionCustomID = relationshipConfig.fields.find(\n (field) => fieldAffectsData(field) && field.name === 'id',\n )\n if (relatedCollectionCustomID?.type === 'number') {\n colType = 'numeric'\n }\n if (relatedCollectionCustomID?.type === 'text') {\n colType = 'varchar'\n }\n\n // make the foreign key column for relationship using the correct id column type\n targetTable[fieldName] = parentIDColumnMap[colType](`${columnName}_id`).references(\n () => adapter.tables[tableName].id,\n { onDelete: 'set null' },\n )\n\n // add relationship to table\n relationsToBuild.set(fieldName, {\n type: 'one',\n localized: adapter.payload.config.localization && (field.localized || forceLocalized),\n target: tableName,\n })\n\n // add notNull when not required\n if (!disableNotNull && field.required && !field.admin?.condition) {\n targetTable[fieldName].notNull()\n }\n break\n }\n\n if (\n Boolean(field.localized && adapter.payload.config.localization) ||\n withinLocalizedArrayOrBlock\n ) {\n hasLocalizedRelationshipField = true\n }\n\n break\n\n case 'join': {\n // fieldName could be 'posts' or 'group_posts'\n // using `on` as the key for the relation\n const localized = adapter.payload.config.localization && field.localized\n const fieldSchemaPath = `${fieldPrefix || ''}${field.name}`\n let target: string\n const joinConfig = joins[field.collection].find(\n ({ schemaPath }) => fieldSchemaPath === schemaPath,\n )\n if (joinConfig.targetField.hasMany) {\n target = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${adapter.relationshipsSuffix}`\n } else {\n target = `${adapter.tableNameMap.get(toSnakeCase(field.collection))}${localized ? adapter.localesSuffix : ''}`\n }\n relationsToBuild.set(fieldName, {\n type: 'many',\n // joins are not localized on the parent table\n localized: false,\n relationName: field.on.replaceAll('.', '_'),\n target,\n })\n break\n }\n\n default:\n break\n }\n\n const condition = field.admin && field.admin.condition\n\n if (\n !disableNotNull &&\n targetTable[fieldName] &&\n 'required' in field &&\n field.required &&\n !condition\n ) {\n targetTable[fieldName].notNull()\n }\n })\n\n return {\n hasLocalizedField,\n hasLocalizedManyNumberField,\n hasLocalizedManyTextField,\n hasLocalizedRelationshipField,\n hasManyNumberField,\n hasManyTextField,\n }\n}\n"],"names":["relations","boolean","foreignKey","index","integer","jsonb","numeric","PgNumericBuilder","PgUUIDBuilder","PgVarcharBuilder","text","timestamp","varchar","InvalidConfiguration","fieldAffectsData","fieldIsVirtual","optionIsObject","toSnakeCase","createTableName","hasLocalesTable","validateExistingBlockIsIdentical","buildTable","createIndex","idToUUID","parentIDColumnMap","withDefault","traverseFields","adapter","columnPrefix","columns","disableNotNull","disableRelsTableUnique","disableUnique","fieldPrefix","fields","forceLocalized","indexes","joins","localesColumns","localesIndexes","newTableName","parentTableName","relationships","relationsToBuild","rootRelationsToBuild","rootTableIDColType","rootTableName","uniqueRelationships","versions","withinLocalizedArrayOrBlock","throwValidationError","hasLocalizedField","hasLocalizedRelationshipField","hasManyTextField","hasLocalizedManyTextField","hasManyNumberField","hasLocalizedManyNumberField","parentIDColType","id","forEach","field","name","columnName","fieldName","targetTable","targetIndexes","replace","payload","config","localization","localized","type","hasMany","unique","includes","Array","isArray","relationTo","constraintValue","fieldConstraints","tableName","isLocalized","Boolean","mode","precision","withTimezone","enumName","prefix","target","enums","pgSchema","enum","options","map","option","value","selectTableName","versionsCustomName","baseColumns","order","notNull","parent","baseExtraConfig","orderIdx","cols","on","parentFk","foreignColumns","tables","onDelete","parentIdx","locale","enum__locales","localeIdx","set","one","references","relationName","disableNotNullFromHere","admin","condition","arrayTableName","_order","_parentID","_orderIdx","_parentIDFk","_parentIDIdx","_locale","_localeIdx","subHasLocalizedManyNumberField","subHasLocalizedManyTextField","subHasLocalizedRelationshipField","subHasManyNumberField","subHasManyTextField","subRelationsToBuild","rootRelationships","rootUniqueRelationships","many","result","_locales","localesSuffix","key","arrayWithLocalized","blocks","block","blockTableName","_path","_parentIdFk","_pathIdx","slug","blockWithLocalized","process","env","NODE_ENV","table","tableLocales","groupHasLocalizedField","groupHasLocalizedManyNumberField","groupHasLocalizedManyTextField","groupHasLocalizedRelationshipField","groupHasManyNumberField","groupHasManyTextField","tabHasLocalizedField","tabHasLocalizedManyNumberField","tabHasLocalizedManyTextField","tabHasLocalizedRelationshipField","tabHasManyNumberField","tabHasManyTextField","tabs","tab","rowHasLocalizedField","rowHasLocalizedManyNumberField","rowHasLocalizedManyTextField","rowHasLocalizedRelationshipField","rowHasManyNumberField","rowHasManyTextField","relation","add","relationshipConfig","collections","tableNameMap","get","colType","idType","relatedCollectionCustomID","find","required","fieldSchemaPath","joinConfig","collection","schemaPath","targetField","relationshipsSuffix","replaceAll"],"mappings":"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"}
@@ -4,12 +4,13 @@ import type { NodePgDatabase } from 'drizzle-orm/node-postgres';
4
4
  import type { ForeignKeyBuilder, IndexBuilder, PgColumn, PgEnum, pgEnum, PgInsertOnConflictDoUpdateConfig, PgSchema, PgTableWithColumns, UniqueConstraintBuilder } from 'drizzle-orm/pg-core';
5
5
  import type { PgTableFn } from 'drizzle-orm/pg-core/table';
6
6
  import type { Payload, PayloadRequest } from 'payload';
7
- import type { QueryResult } from 'pg';
8
- import type { Operators } from '../index.js';
7
+ import type { ClientConfig, QueryResult } from 'pg';
8
+ import type { extendDrizzleTable, Operators } from '../index.js';
9
9
  import type { BuildQueryJoinAliases, DrizzleAdapter, TransactionPg } from '../types.js';
10
10
  export type BaseExtraConfig = Record<string, (cols: GenericColumns) => ForeignKeyBuilder | IndexBuilder | UniqueConstraintBuilder>;
11
11
  export type RelationMap = Map<string, {
12
12
  localized: boolean;
13
+ relationName?: string;
13
14
  target: string;
14
15
  type: 'many' | 'one';
15
16
  }>;
@@ -52,14 +53,39 @@ export type Insert = (args: {
52
53
  tableName: string;
53
54
  values: Record<string, unknown> | Record<string, unknown>[];
54
55
  }) => Promise<Record<string, unknown>[]>;
56
+ export type CreateDatabase = (args?: {
57
+ /**
58
+ * Name of a database, defaults to the current one
59
+ */
60
+ name?: string;
61
+ /**
62
+ * Schema to create in addition to 'public'. Defaults from adapter.schemaName if exists.
63
+ */
64
+ schemaName?: string;
65
+ }) => Promise<boolean>;
55
66
  type Schema = {
56
67
  enum: typeof pgEnum;
57
- table: PgTableFn;
68
+ table: PgTableFn<string>;
58
69
  } | PgSchema;
70
+ type PostgresSchema = {
71
+ enums: Record<string, GenericEnum>;
72
+ relations: Record<string, GenericRelation>;
73
+ tables: Record<string, PgTableWithColumns<any>>;
74
+ };
75
+ type PostgresSchemaHookArgs = {
76
+ adapter: PostgresDrizzleAdapter;
77
+ extendTable: typeof extendDrizzleTable;
78
+ schema: PostgresSchema;
79
+ };
80
+ export type PostgresSchemaHook = (args: PostgresSchemaHookArgs) => PostgresSchema | Promise<PostgresSchema>;
59
81
  export type BasePostgresAdapter = {
82
+ afterSchemaInit: PostgresSchemaHook[];
83
+ beforeSchemaInit: PostgresSchemaHook[];
60
84
  countDistinct: CountDistinct;
85
+ createDatabase: CreateDatabase;
61
86
  defaultDrizzleSnapshot: DrizzleSnapshotJSON;
62
87
  deleteWhere: DeleteWhere;
88
+ disableCreateDatabase: boolean;
63
89
  drizzle: PostgresDB;
64
90
  dropDatabase: DropDatabase;
65
91
  enums: Record<string, GenericEnum>;
@@ -75,7 +101,8 @@ export type BasePostgresAdapter = {
75
101
  localesSuffix?: string;
76
102
  logger: DrizzleConfig['logger'];
77
103
  operators: Operators;
78
- pgSchema?: Schema;
104
+ pgSchema: Schema;
105
+ poolOptions?: ClientConfig;
79
106
  prodMigrations?: {
80
107
  down: (args: MigrateDownArgs) => Promise<void>;
81
108
  name: string;
@@ -102,11 +129,11 @@ export type PostgresDrizzleAdapter = Omit<DrizzleAdapter, 'countDistinct' | 'del
102
129
  export type IDType = 'integer' | 'numeric' | 'uuid' | 'varchar';
103
130
  export type MigrateUpArgs = {
104
131
  payload: Payload;
105
- req?: Partial<PayloadRequest>;
132
+ req: PayloadRequest;
106
133
  };
107
134
  export type MigrateDownArgs = {
108
135
  payload: Payload;
109
- req?: Partial<PayloadRequest>;
136
+ req: PayloadRequest;
110
137
  };
111
138
  export {};
112
139
  //# sourceMappingURL=types.d.ts.map