@payloadcms/drizzle 3.0.0-canary.67aae47 → 3.0.0-canary.6b9e4be

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.
@@ -83,166 +83,6 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
83
83
  }
84
84
  }
85
85
  switch(field.type){
86
- case 'text':
87
- {
88
- if (field.hasMany) {
89
- const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
90
- if (isLocalized) {
91
- hasLocalizedManyTextField = true;
92
- }
93
- if (field.index) {
94
- hasManyTextField = 'index';
95
- } else if (!hasManyTextField) {
96
- hasManyTextField = true;
97
- }
98
- if (field.unique) {
99
- throw new InvalidConfiguration('Unique is not supported in Postgres for hasMany text fields.');
100
- }
101
- } else {
102
- targetTable[fieldName] = withDefault(varchar(columnName), field);
103
- }
104
- break;
105
- }
106
- case 'email':
107
- case 'code':
108
- case 'textarea':
109
- {
110
- targetTable[fieldName] = withDefault(varchar(columnName), field);
111
- break;
112
- }
113
- case 'number':
114
- {
115
- if (field.hasMany) {
116
- const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
117
- if (isLocalized) {
118
- hasLocalizedManyNumberField = true;
119
- }
120
- if (field.index) {
121
- hasManyNumberField = 'index';
122
- } else if (!hasManyNumberField) {
123
- hasManyNumberField = true;
124
- }
125
- if (field.unique) {
126
- throw new InvalidConfiguration('Unique is not supported in Postgres for hasMany number fields.');
127
- }
128
- } else {
129
- targetTable[fieldName] = withDefault(numeric(columnName), field);
130
- }
131
- break;
132
- }
133
- case 'richText':
134
- case 'json':
135
- {
136
- targetTable[fieldName] = withDefault(jsonb(columnName), field);
137
- break;
138
- }
139
- case 'date':
140
- {
141
- targetTable[fieldName] = withDefault(timestamp(columnName, {
142
- mode: 'string',
143
- precision: 3,
144
- withTimezone: true
145
- }), field);
146
- break;
147
- }
148
- case 'point':
149
- {
150
- targetTable[fieldName] = withDefault(geometryColumn(columnName), field);
151
- if (!adapter.extensions.postgis) {
152
- adapter.extensions.postgis = true;
153
- }
154
- break;
155
- }
156
- case 'radio':
157
- case 'select':
158
- {
159
- const enumName = createTableName({
160
- adapter,
161
- config: field,
162
- parentTableName: newTableName,
163
- prefix: `enum_${newTableName}_`,
164
- target: 'enumName',
165
- throwValidationError
166
- });
167
- adapter.enums[enumName] = adapter.pgSchema.enum(enumName, field.options.map((option)=>{
168
- if (optionIsObject(option)) {
169
- return option.value;
170
- }
171
- return option;
172
- }));
173
- if (field.type === 'select' && field.hasMany) {
174
- const selectTableName = createTableName({
175
- adapter,
176
- config: field,
177
- parentTableName: newTableName,
178
- prefix: `${newTableName}_`,
179
- throwValidationError,
180
- versionsCustomName: versions
181
- });
182
- const baseColumns = {
183
- order: integer('order').notNull(),
184
- parent: parentIDColumnMap[parentIDColType]('parent_id').notNull(),
185
- value: adapter.enums[enumName]('value')
186
- };
187
- const baseExtraConfig = {
188
- orderIdx: (cols)=>index(`${selectTableName}_order_idx`).on(cols.order),
189
- parentFk: (cols)=>foreignKey({
190
- name: `${selectTableName}_parent_fk`,
191
- columns: [
192
- cols.parent
193
- ],
194
- foreignColumns: [
195
- adapter.tables[parentTableName].id
196
- ]
197
- }).onDelete('cascade'),
198
- parentIdx: (cols)=>index(`${selectTableName}_parent_idx`).on(cols.parent)
199
- };
200
- const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
201
- if (isLocalized) {
202
- baseColumns.locale = adapter.enums.enum__locales('locale').notNull();
203
- baseExtraConfig.localeIdx = (cols)=>index(`${selectTableName}_locale_idx`).on(cols.locale);
204
- }
205
- if (field.index) {
206
- baseExtraConfig.value = (cols)=>index(`${selectTableName}_value_idx`).on(cols.value);
207
- }
208
- buildTable({
209
- adapter,
210
- baseColumns,
211
- baseExtraConfig,
212
- disableNotNull,
213
- disableUnique,
214
- fields: [],
215
- rootTableName,
216
- tableName: selectTableName,
217
- versions
218
- });
219
- relationsToBuild.set(fieldName, {
220
- type: 'many',
221
- // selects have their own localized table, independent of the base table.
222
- localized: false,
223
- target: selectTableName
224
- });
225
- adapter.relations[`relations_${selectTableName}`] = relations(adapter.tables[selectTableName], ({ one })=>({
226
- parent: one(adapter.tables[parentTableName], {
227
- fields: [
228
- adapter.tables[selectTableName].parent
229
- ],
230
- references: [
231
- adapter.tables[parentTableName].id
232
- ],
233
- relationName: fieldName
234
- })
235
- }));
236
- } else {
237
- targetTable[fieldName] = withDefault(adapter.enums[enumName](columnName), field);
238
- }
239
- break;
240
- }
241
- case 'checkbox':
242
- {
243
- targetTable[fieldName] = withDefault(boolean(columnName), field);
244
- break;
245
- }
246
86
  case 'array':
247
87
  {
248
88
  const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull;
@@ -488,8 +328,76 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
488
328
  });
489
329
  break;
490
330
  }
491
- case 'tab':
331
+ case 'checkbox':
332
+ {
333
+ targetTable[fieldName] = withDefault(boolean(columnName), field);
334
+ break;
335
+ }
336
+ case 'code':
337
+ case 'email':
338
+ case 'textarea':
339
+ {
340
+ targetTable[fieldName] = withDefault(varchar(columnName), field);
341
+ break;
342
+ }
343
+ case 'collapsible':
344
+ case 'row':
345
+ {
346
+ const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull;
347
+ const { hasLocalizedField: rowHasLocalizedField, hasLocalizedManyNumberField: rowHasLocalizedManyNumberField, hasLocalizedManyTextField: rowHasLocalizedManyTextField, hasLocalizedRelationshipField: rowHasLocalizedRelationshipField, hasManyNumberField: rowHasManyNumberField, hasManyTextField: rowHasManyTextField } = traverseFields({
348
+ adapter,
349
+ columnPrefix,
350
+ columns,
351
+ disableNotNull: disableNotNullFromHere,
352
+ disableUnique,
353
+ fieldPrefix,
354
+ fields: field.fields,
355
+ forceLocalized,
356
+ indexes,
357
+ localesColumns,
358
+ localesIndexes,
359
+ newTableName,
360
+ parentTableName,
361
+ relationships,
362
+ relationsToBuild,
363
+ rootRelationsToBuild,
364
+ rootTableIDColType,
365
+ rootTableName,
366
+ uniqueRelationships,
367
+ versions,
368
+ withinLocalizedArrayOrBlock
369
+ });
370
+ if (rowHasLocalizedField) {
371
+ hasLocalizedField = true;
372
+ }
373
+ if (rowHasLocalizedRelationshipField) {
374
+ hasLocalizedRelationshipField = true;
375
+ }
376
+ if (rowHasManyTextField) {
377
+ hasManyTextField = true;
378
+ }
379
+ if (rowHasLocalizedManyTextField) {
380
+ hasLocalizedManyTextField = true;
381
+ }
382
+ if (rowHasManyNumberField) {
383
+ hasManyNumberField = true;
384
+ }
385
+ if (rowHasLocalizedManyNumberField) {
386
+ hasLocalizedManyNumberField = true;
387
+ }
388
+ break;
389
+ }
390
+ case 'date':
391
+ {
392
+ targetTable[fieldName] = withDefault(timestamp(columnName, {
393
+ mode: 'string',
394
+ precision: 3,
395
+ withTimezone: true
396
+ }), field);
397
+ break;
398
+ }
492
399
  case 'group':
400
+ case 'tab':
493
401
  {
494
402
  if (!('name' in field)) {
495
403
  const { hasLocalizedField: groupHasLocalizedField, hasLocalizedManyNumberField: groupHasLocalizedManyNumberField, hasLocalizedManyTextField: groupHasLocalizedManyTextField, hasLocalizedRelationshipField: groupHasLocalizedRelationshipField, hasManyNumberField: groupHasManyNumberField, hasManyTextField: groupHasManyTextField } = traverseFields({
@@ -579,99 +487,122 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
579
487
  }
580
488
  break;
581
489
  }
582
- case 'tabs':
490
+ case 'json':
491
+ case 'richText':
583
492
  {
584
- const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull;
585
- const { hasLocalizedField: tabHasLocalizedField, hasLocalizedManyNumberField: tabHasLocalizedManyNumberField, hasLocalizedManyTextField: tabHasLocalizedManyTextField, hasLocalizedRelationshipField: tabHasLocalizedRelationshipField, hasManyNumberField: tabHasManyNumberField, hasManyTextField: tabHasManyTextField } = traverseFields({
586
- adapter,
587
- columnPrefix,
588
- columns,
589
- disableNotNull: disableNotNullFromHere,
590
- disableUnique,
591
- fieldPrefix,
592
- fields: field.tabs.map((tab)=>({
593
- ...tab,
594
- type: 'tab'
595
- })),
596
- forceLocalized,
597
- indexes,
598
- localesColumns,
599
- localesIndexes,
600
- newTableName,
601
- parentTableName,
602
- relationships,
603
- relationsToBuild,
604
- rootRelationsToBuild,
605
- rootTableIDColType,
606
- rootTableName,
607
- uniqueRelationships,
608
- versions,
609
- withinLocalizedArrayOrBlock
610
- });
611
- if (tabHasLocalizedField) {
612
- hasLocalizedField = true;
613
- }
614
- if (tabHasLocalizedRelationshipField) {
615
- hasLocalizedRelationshipField = true;
616
- }
617
- if (tabHasManyTextField) {
618
- hasManyTextField = true;
619
- }
620
- if (tabHasLocalizedManyTextField) {
621
- hasLocalizedManyTextField = true;
622
- }
623
- if (tabHasManyNumberField) {
624
- hasManyNumberField = true;
493
+ targetTable[fieldName] = withDefault(jsonb(columnName), field);
494
+ break;
495
+ }
496
+ case 'number':
497
+ {
498
+ if (field.hasMany) {
499
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
500
+ if (isLocalized) {
501
+ hasLocalizedManyNumberField = true;
502
+ }
503
+ if (field.index) {
504
+ hasManyNumberField = 'index';
505
+ } else if (!hasManyNumberField) {
506
+ hasManyNumberField = true;
507
+ }
508
+ if (field.unique) {
509
+ throw new InvalidConfiguration('Unique is not supported in Postgres for hasMany number fields.');
510
+ }
511
+ } else {
512
+ targetTable[fieldName] = withDefault(numeric(columnName), field);
625
513
  }
626
- if (tabHasLocalizedManyNumberField) {
627
- hasLocalizedManyNumberField = true;
514
+ break;
515
+ }
516
+ case 'point':
517
+ {
518
+ targetTable[fieldName] = withDefault(geometryColumn(columnName), field);
519
+ if (!adapter.extensions.postgis) {
520
+ adapter.extensions.postgis = true;
628
521
  }
629
522
  break;
630
523
  }
631
- case 'row':
632
- case 'collapsible':
524
+ case 'radio':
525
+ case 'select':
633
526
  {
634
- const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull;
635
- const { hasLocalizedField: rowHasLocalizedField, hasLocalizedManyNumberField: rowHasLocalizedManyNumberField, hasLocalizedManyTextField: rowHasLocalizedManyTextField, hasLocalizedRelationshipField: rowHasLocalizedRelationshipField, hasManyNumberField: rowHasManyNumberField, hasManyTextField: rowHasManyTextField } = traverseFields({
527
+ const enumName = createTableName({
636
528
  adapter,
637
- columnPrefix,
638
- columns,
639
- disableNotNull: disableNotNullFromHere,
640
- disableUnique,
641
- fieldPrefix,
642
- fields: field.fields,
643
- forceLocalized,
644
- indexes,
645
- localesColumns,
646
- localesIndexes,
647
- newTableName,
648
- parentTableName,
649
- relationships,
650
- relationsToBuild,
651
- rootRelationsToBuild,
652
- rootTableIDColType,
653
- rootTableName,
654
- uniqueRelationships,
655
- versions,
656
- withinLocalizedArrayOrBlock
529
+ config: field,
530
+ parentTableName: newTableName,
531
+ prefix: `enum_${newTableName}_`,
532
+ target: 'enumName',
533
+ throwValidationError
657
534
  });
658
- if (rowHasLocalizedField) {
659
- hasLocalizedField = true;
660
- }
661
- if (rowHasLocalizedRelationshipField) {
662
- hasLocalizedRelationshipField = true;
663
- }
664
- if (rowHasManyTextField) {
665
- hasManyTextField = true;
666
- }
667
- if (rowHasLocalizedManyTextField) {
668
- hasLocalizedManyTextField = true;
669
- }
670
- if (rowHasManyNumberField) {
671
- hasManyNumberField = true;
672
- }
673
- if (rowHasLocalizedManyNumberField) {
674
- hasLocalizedManyNumberField = true;
535
+ adapter.enums[enumName] = adapter.pgSchema.enum(enumName, field.options.map((option)=>{
536
+ if (optionIsObject(option)) {
537
+ return option.value;
538
+ }
539
+ return option;
540
+ }));
541
+ if (field.type === 'select' && field.hasMany) {
542
+ const selectTableName = createTableName({
543
+ adapter,
544
+ config: field,
545
+ parentTableName: newTableName,
546
+ prefix: `${newTableName}_`,
547
+ throwValidationError,
548
+ versionsCustomName: versions
549
+ });
550
+ const baseColumns = {
551
+ order: integer('order').notNull(),
552
+ parent: parentIDColumnMap[parentIDColType]('parent_id').notNull(),
553
+ value: adapter.enums[enumName]('value')
554
+ };
555
+ const baseExtraConfig = {
556
+ orderIdx: (cols)=>index(`${selectTableName}_order_idx`).on(cols.order),
557
+ parentFk: (cols)=>foreignKey({
558
+ name: `${selectTableName}_parent_fk`,
559
+ columns: [
560
+ cols.parent
561
+ ],
562
+ foreignColumns: [
563
+ adapter.tables[parentTableName].id
564
+ ]
565
+ }).onDelete('cascade'),
566
+ parentIdx: (cols)=>index(`${selectTableName}_parent_idx`).on(cols.parent)
567
+ };
568
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
569
+ if (isLocalized) {
570
+ baseColumns.locale = adapter.enums.enum__locales('locale').notNull();
571
+ baseExtraConfig.localeIdx = (cols)=>index(`${selectTableName}_locale_idx`).on(cols.locale);
572
+ }
573
+ if (field.index) {
574
+ baseExtraConfig.value = (cols)=>index(`${selectTableName}_value_idx`).on(cols.value);
575
+ }
576
+ buildTable({
577
+ adapter,
578
+ baseColumns,
579
+ baseExtraConfig,
580
+ disableNotNull,
581
+ disableUnique,
582
+ fields: [],
583
+ rootTableName,
584
+ tableName: selectTableName,
585
+ versions
586
+ });
587
+ relationsToBuild.set(fieldName, {
588
+ type: 'many',
589
+ // selects have their own localized table, independent of the base table.
590
+ localized: false,
591
+ target: selectTableName
592
+ });
593
+ adapter.relations[`relations_${selectTableName}`] = relations(adapter.tables[selectTableName], ({ one })=>({
594
+ parent: one(adapter.tables[parentTableName], {
595
+ fields: [
596
+ adapter.tables[selectTableName].parent
597
+ ],
598
+ references: [
599
+ adapter.tables[parentTableName].id
600
+ ],
601
+ relationName: fieldName
602
+ })
603
+ }));
604
+ } else {
605
+ targetTable[fieldName] = withDefault(adapter.enums[enumName](columnName), field);
675
606
  }
676
607
  break;
677
608
  }
@@ -722,6 +653,75 @@ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull,
722
653
  hasLocalizedRelationshipField = true;
723
654
  }
724
655
  break;
656
+ case 'tabs':
657
+ {
658
+ const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull;
659
+ const { hasLocalizedField: tabHasLocalizedField, hasLocalizedManyNumberField: tabHasLocalizedManyNumberField, hasLocalizedManyTextField: tabHasLocalizedManyTextField, hasLocalizedRelationshipField: tabHasLocalizedRelationshipField, hasManyNumberField: tabHasManyNumberField, hasManyTextField: tabHasManyTextField } = traverseFields({
660
+ adapter,
661
+ columnPrefix,
662
+ columns,
663
+ disableNotNull: disableNotNullFromHere,
664
+ disableUnique,
665
+ fieldPrefix,
666
+ fields: field.tabs.map((tab)=>({
667
+ ...tab,
668
+ type: 'tab'
669
+ })),
670
+ forceLocalized,
671
+ indexes,
672
+ localesColumns,
673
+ localesIndexes,
674
+ newTableName,
675
+ parentTableName,
676
+ relationships,
677
+ relationsToBuild,
678
+ rootRelationsToBuild,
679
+ rootTableIDColType,
680
+ rootTableName,
681
+ uniqueRelationships,
682
+ versions,
683
+ withinLocalizedArrayOrBlock
684
+ });
685
+ if (tabHasLocalizedField) {
686
+ hasLocalizedField = true;
687
+ }
688
+ if (tabHasLocalizedRelationshipField) {
689
+ hasLocalizedRelationshipField = true;
690
+ }
691
+ if (tabHasManyTextField) {
692
+ hasManyTextField = true;
693
+ }
694
+ if (tabHasLocalizedManyTextField) {
695
+ hasLocalizedManyTextField = true;
696
+ }
697
+ if (tabHasManyNumberField) {
698
+ hasManyNumberField = true;
699
+ }
700
+ if (tabHasLocalizedManyNumberField) {
701
+ hasLocalizedManyNumberField = true;
702
+ }
703
+ break;
704
+ }
705
+ case 'text':
706
+ {
707
+ if (field.hasMany) {
708
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
709
+ if (isLocalized) {
710
+ hasLocalizedManyTextField = true;
711
+ }
712
+ if (field.index) {
713
+ hasManyTextField = 'index';
714
+ } else if (!hasManyTextField) {
715
+ hasManyTextField = true;
716
+ }
717
+ if (field.unique) {
718
+ throw new InvalidConfiguration('Unique is not supported in Postgres for hasMany text fields.');
719
+ }
720
+ } else {
721
+ targetTable[fieldName] = withDefault(varchar(columnName), field);
722
+ }
723
+ break;
724
+ }
725
725
  default:
726
726
  break;
727
727
  }