@payloadcms/drizzle 3.0.0 → 3.0.1-canary.9494866

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 (37) hide show
  1. package/dist/postgres/schema/build.d.ts +40 -3
  2. package/dist/postgres/schema/build.d.ts.map +1 -1
  3. package/dist/postgres/schema/build.js +734 -2
  4. package/dist/postgres/schema/build.js.map +1 -1
  5. package/dist/postgres/schema/traverseFields.d.ts +0 -40
  6. package/dist/postgres/schema/traverseFields.d.ts.map +1 -1
  7. package/dist/postgres/schema/traverseFields.js +0 -741
  8. package/dist/postgres/schema/traverseFields.js.map +1 -1
  9. package/dist/queries/parseParams.d.ts +11 -0
  10. package/dist/queries/parseParams.d.ts.map +1 -1
  11. package/dist/queries/parseParams.js +23 -1
  12. package/dist/queries/parseParams.js.map +1 -1
  13. package/dist/transform/write/traverseFields.d.ts +52 -1
  14. package/dist/transform/write/traverseFields.d.ts.map +1 -1
  15. package/dist/transform/write/traverseFields.js +122 -2
  16. package/dist/transform/write/traverseFields.js.map +1 -1
  17. package/package.json +4 -4
  18. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.d.ts +0 -2
  19. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.d.ts.map +0 -1
  20. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.js +0 -16
  21. package/dist/postgres/createJSONQuery/convertPathToJSONTraversal.js.map +0 -1
  22. package/dist/postgres/createJSONQuery/formatJSONPathSegment.d.ts +0 -2
  23. package/dist/postgres/createJSONQuery/formatJSONPathSegment.d.ts.map +0 -1
  24. package/dist/postgres/createJSONQuery/formatJSONPathSegment.js +0 -5
  25. package/dist/postgres/createJSONQuery/formatJSONPathSegment.js.map +0 -1
  26. package/dist/queries/buildAndOrConditions.d.ts +0 -16
  27. package/dist/queries/buildAndOrConditions.d.ts.map +0 -1
  28. package/dist/queries/buildAndOrConditions.js +0 -26
  29. package/dist/queries/buildAndOrConditions.js.map +0 -1
  30. package/dist/transform/write/array.d.ts +0 -31
  31. package/dist/transform/write/array.d.ts.map +0 -1
  32. package/dist/transform/write/array.js +0 -62
  33. package/dist/transform/write/array.js.map +0 -1
  34. package/dist/transform/write/blocks.d.ts +0 -30
  35. package/dist/transform/write/blocks.d.ts.map +0 -1
  36. package/dist/transform/write/blocks.js +0 -66
  37. package/dist/transform/write/blocks.js.map +0 -1
@@ -1,743 +1,2 @@
1
- import { relations } from 'drizzle-orm';
2
- import { boolean, foreignKey, index, integer, jsonb, numeric, PgNumericBuilder, PgUUIDBuilder, PgVarcharBuilder, text, timestamp, varchar } from 'drizzle-orm/pg-core';
3
- import { InvalidConfiguration } from 'payload';
4
- import { fieldAffectsData, fieldIsVirtual, optionIsObject } from 'payload/shared';
5
- import toSnakeCase from 'to-snake-case';
6
- import { createTableName } from '../../createTableName.js';
7
- import { buildIndexName } from '../../utilities/buildIndexName.js';
8
- import { hasLocalesTable } from '../../utilities/hasLocalesTable.js';
9
- import { validateExistingBlockIsIdentical } from '../../utilities/validateExistingBlockIsIdentical.js';
10
- import { buildTable } from './build.js';
11
- import { createIndex } from './createIndex.js';
12
- import { geometryColumn } from './geometryColumn.js';
13
- import { idToUUID } from './idToUUID.js';
14
- import { parentIDColumnMap } from './parentIDColumnMap.js';
15
- import { withDefault } from './withDefault.js';
16
- export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull, disableRelsTableUnique, disableUnique = false, fieldPrefix, fields, forceLocalized, indexes, localesColumns, localesIndexes, newTableName, parentTableName, relationships, relationsToBuild, rootRelationsToBuild, rootTableIDColType, rootTableName, uniqueRelationships, versions, withinLocalizedArrayOrBlock })=>{
17
- const throwValidationError = true;
18
- let hasLocalizedField = false;
19
- let hasLocalizedRelationshipField = false;
20
- let hasManyTextField = false;
21
- let hasLocalizedManyTextField = false;
22
- let hasManyNumberField = false;
23
- let hasLocalizedManyNumberField = false;
24
- let parentIDColType = 'integer';
25
- if (columns.id instanceof PgUUIDBuilder) {
26
- parentIDColType = 'uuid';
27
- }
28
- if (columns.id instanceof PgNumericBuilder) {
29
- parentIDColType = 'numeric';
30
- }
31
- if (columns.id instanceof PgVarcharBuilder) {
32
- parentIDColType = 'varchar';
33
- }
34
- fields.forEach((field)=>{
35
- if ('name' in field && field.name === 'id') {
36
- return;
37
- }
38
- if (fieldIsVirtual(field)) {
39
- return;
40
- }
41
- let columnName;
42
- let fieldName;
43
- let targetTable = columns;
44
- let targetIndexes = indexes;
45
- if (fieldAffectsData(field)) {
46
- columnName = `${columnPrefix || ''}${field.name[0] === '_' ? '_' : ''}${toSnakeCase(field.name)}`;
47
- fieldName = `${fieldPrefix?.replace('.', '_') || ''}${field.name}`;
48
- // If field is localized,
49
- // add the column to the locale table instead of main table
50
- if (adapter.payload.config.localization && (field.localized || forceLocalized) && field.type !== 'array' && field.type !== 'blocks' && ('hasMany' in field && field.hasMany !== true || !('hasMany' in field))) {
51
- hasLocalizedField = true;
52
- targetTable = localesColumns;
53
- targetIndexes = localesIndexes;
54
- }
55
- if ((field.unique || field.index || [
56
- 'relationship',
57
- 'upload'
58
- ].includes(field.type)) && ![
59
- 'array',
60
- 'blocks',
61
- 'group'
62
- ].includes(field.type) && !('hasMany' in field && field.hasMany === true) && !('relationTo' in field && Array.isArray(field.relationTo))) {
63
- const unique = disableUnique !== true && field.unique;
64
- if (unique) {
65
- const constraintValue = `${fieldPrefix || ''}${field.name}`;
66
- if (!adapter.fieldConstraints?.[rootTableName]) {
67
- adapter.fieldConstraints[rootTableName] = {};
68
- }
69
- adapter.fieldConstraints[rootTableName][`${columnName}_idx`] = constraintValue;
70
- }
71
- const indexName = buildIndexName({
72
- name: `${newTableName}_${columnName}`,
73
- adapter
74
- });
75
- targetIndexes[indexName] = createIndex({
76
- name: field.localized ? [
77
- fieldName,
78
- '_locale'
79
- ] : fieldName,
80
- indexName,
81
- unique
82
- });
83
- }
84
- }
85
- switch(field.type){
86
- case 'array':
87
- {
88
- const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull;
89
- const arrayTableName = createTableName({
90
- adapter,
91
- config: field,
92
- parentTableName: newTableName,
93
- prefix: `${newTableName}_`,
94
- throwValidationError,
95
- versionsCustomName: versions
96
- });
97
- const baseColumns = {
98
- _order: integer('_order').notNull(),
99
- _parentID: parentIDColumnMap[parentIDColType]('_parent_id').notNull()
100
- };
101
- const baseExtraConfig = {
102
- _orderIdx: (cols)=>index(`${arrayTableName}_order_idx`).on(cols._order),
103
- _parentIDFk: (cols)=>foreignKey({
104
- name: `${arrayTableName}_parent_id_fk`,
105
- columns: [
106
- cols['_parentID']
107
- ],
108
- foreignColumns: [
109
- adapter.tables[parentTableName].id
110
- ]
111
- }).onDelete('cascade'),
112
- _parentIDIdx: (cols)=>index(`${arrayTableName}_parent_id_idx`).on(cols._parentID)
113
- };
114
- const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
115
- if (isLocalized) {
116
- baseColumns._locale = adapter.enums.enum__locales('_locale').notNull();
117
- baseExtraConfig._localeIdx = (cols)=>index(`${arrayTableName}_locale_idx`).on(cols._locale);
118
- }
119
- const { hasLocalizedManyNumberField: subHasLocalizedManyNumberField, hasLocalizedManyTextField: subHasLocalizedManyTextField, hasLocalizedRelationshipField: subHasLocalizedRelationshipField, hasManyNumberField: subHasManyNumberField, hasManyTextField: subHasManyTextField, relationsToBuild: subRelationsToBuild } = buildTable({
120
- adapter,
121
- baseColumns,
122
- baseExtraConfig,
123
- disableNotNull: disableNotNullFromHere,
124
- disableRelsTableUnique: true,
125
- disableUnique,
126
- fields: disableUnique ? idToUUID(field.fields) : field.fields,
127
- rootRelationships: relationships,
128
- rootRelationsToBuild,
129
- rootTableIDColType,
130
- rootTableName,
131
- rootUniqueRelationships: uniqueRelationships,
132
- tableName: arrayTableName,
133
- versions,
134
- withinLocalizedArrayOrBlock: isLocalized
135
- });
136
- if (subHasLocalizedManyNumberField) {
137
- hasLocalizedManyNumberField = subHasLocalizedManyNumberField;
138
- }
139
- if (subHasLocalizedRelationshipField) {
140
- hasLocalizedRelationshipField = subHasLocalizedRelationshipField;
141
- }
142
- if (subHasLocalizedManyTextField) {
143
- hasLocalizedManyTextField = subHasLocalizedManyTextField;
144
- }
145
- if (subHasManyTextField) {
146
- if (!hasManyTextField || subHasManyTextField === 'index') {
147
- hasManyTextField = subHasManyTextField;
148
- }
149
- }
150
- if (subHasManyNumberField) {
151
- if (!hasManyNumberField || subHasManyNumberField === 'index') {
152
- hasManyNumberField = subHasManyNumberField;
153
- }
154
- }
155
- relationsToBuild.set(fieldName, {
156
- type: 'many',
157
- // arrays have their own localized table, independent of the base table.
158
- localized: false,
159
- target: arrayTableName
160
- });
161
- adapter.relations[`relations_${arrayTableName}`] = relations(adapter.tables[arrayTableName], ({ many, one })=>{
162
- const result = {
163
- _parentID: one(adapter.tables[parentTableName], {
164
- fields: [
165
- adapter.tables[arrayTableName]._parentID
166
- ],
167
- references: [
168
- adapter.tables[parentTableName].id
169
- ],
170
- relationName: fieldName
171
- })
172
- };
173
- if (hasLocalesTable(field.fields)) {
174
- result._locales = many(adapter.tables[`${arrayTableName}${adapter.localesSuffix}`], {
175
- relationName: '_locales'
176
- });
177
- }
178
- subRelationsToBuild.forEach(({ type, localized, target }, key)=>{
179
- if (type === 'one') {
180
- const arrayWithLocalized = localized ? `${arrayTableName}${adapter.localesSuffix}` : arrayTableName;
181
- result[key] = one(adapter.tables[target], {
182
- fields: [
183
- adapter.tables[arrayWithLocalized][key]
184
- ],
185
- references: [
186
- adapter.tables[target].id
187
- ],
188
- relationName: key
189
- });
190
- }
191
- if (type === 'many') {
192
- result[key] = many(adapter.tables[target], {
193
- relationName: key
194
- });
195
- }
196
- });
197
- return result;
198
- });
199
- break;
200
- }
201
- case 'blocks':
202
- {
203
- const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull;
204
- field.blocks.forEach((block)=>{
205
- const blockTableName = createTableName({
206
- adapter,
207
- config: block,
208
- parentTableName: rootTableName,
209
- prefix: `${rootTableName}_blocks_`,
210
- throwValidationError,
211
- versionsCustomName: versions
212
- });
213
- if (!adapter.tables[blockTableName]) {
214
- const baseColumns = {
215
- _order: integer('_order').notNull(),
216
- _parentID: parentIDColumnMap[rootTableIDColType]('_parent_id').notNull(),
217
- _path: text('_path').notNull()
218
- };
219
- const baseExtraConfig = {
220
- _orderIdx: (cols)=>index(`${blockTableName}_order_idx`).on(cols._order),
221
- _parentIdFk: (cols)=>foreignKey({
222
- name: `${blockTableName}_parent_id_fk`,
223
- columns: [
224
- cols._parentID
225
- ],
226
- foreignColumns: [
227
- adapter.tables[rootTableName].id
228
- ]
229
- }).onDelete('cascade'),
230
- _parentIDIdx: (cols)=>index(`${blockTableName}_parent_id_idx`).on(cols._parentID),
231
- _pathIdx: (cols)=>index(`${blockTableName}_path_idx`).on(cols._path)
232
- };
233
- const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock || forceLocalized;
234
- if (isLocalized) {
235
- baseColumns._locale = adapter.enums.enum__locales('_locale').notNull();
236
- baseExtraConfig._localeIdx = (cols)=>index(`${blockTableName}_locale_idx`).on(cols._locale);
237
- }
238
- const { hasLocalizedManyNumberField: subHasLocalizedManyNumberField, hasLocalizedManyTextField: subHasLocalizedManyTextField, hasLocalizedRelationshipField: subHasLocalizedRelationshipField, hasManyNumberField: subHasManyNumberField, hasManyTextField: subHasManyTextField, relationsToBuild: subRelationsToBuild } = buildTable({
239
- adapter,
240
- baseColumns,
241
- baseExtraConfig,
242
- disableNotNull: disableNotNullFromHere,
243
- disableRelsTableUnique: true,
244
- disableUnique,
245
- fields: disableUnique ? idToUUID(block.fields) : block.fields,
246
- rootRelationships: relationships,
247
- rootRelationsToBuild,
248
- rootTableIDColType,
249
- rootTableName,
250
- rootUniqueRelationships: uniqueRelationships,
251
- tableName: blockTableName,
252
- versions,
253
- withinLocalizedArrayOrBlock: isLocalized
254
- });
255
- if (subHasLocalizedManyNumberField) {
256
- hasLocalizedManyNumberField = subHasLocalizedManyNumberField;
257
- }
258
- if (subHasLocalizedRelationshipField) {
259
- hasLocalizedRelationshipField = subHasLocalizedRelationshipField;
260
- }
261
- if (subHasLocalizedManyTextField) {
262
- hasLocalizedManyTextField = subHasLocalizedManyTextField;
263
- }
264
- if (subHasManyTextField) {
265
- if (!hasManyTextField || subHasManyTextField === 'index') {
266
- hasManyTextField = subHasManyTextField;
267
- }
268
- }
269
- if (subHasManyNumberField) {
270
- if (!hasManyNumberField || subHasManyNumberField === 'index') {
271
- hasManyNumberField = subHasManyNumberField;
272
- }
273
- }
274
- adapter.relations[`relations_${blockTableName}`] = relations(adapter.tables[blockTableName], ({ many, one })=>{
275
- const result = {
276
- _parentID: one(adapter.tables[rootTableName], {
277
- fields: [
278
- adapter.tables[blockTableName]._parentID
279
- ],
280
- references: [
281
- adapter.tables[rootTableName].id
282
- ],
283
- relationName: `_blocks_${block.slug}`
284
- })
285
- };
286
- if (hasLocalesTable(block.fields)) {
287
- result._locales = many(adapter.tables[`${blockTableName}${adapter.localesSuffix}`], {
288
- relationName: '_locales'
289
- });
290
- }
291
- subRelationsToBuild.forEach(({ type, localized, target }, key)=>{
292
- if (type === 'one') {
293
- const blockWithLocalized = localized ? `${blockTableName}${adapter.localesSuffix}` : blockTableName;
294
- result[key] = one(adapter.tables[target], {
295
- fields: [
296
- adapter.tables[blockWithLocalized][key]
297
- ],
298
- references: [
299
- adapter.tables[target].id
300
- ],
301
- relationName: key
302
- });
303
- }
304
- if (type === 'many') {
305
- result[key] = many(adapter.tables[target], {
306
- relationName: key
307
- });
308
- }
309
- });
310
- return result;
311
- });
312
- } else if (process.env.NODE_ENV !== 'production' && !versions) {
313
- validateExistingBlockIsIdentical({
314
- block,
315
- localized: field.localized,
316
- rootTableName,
317
- table: adapter.tables[blockTableName],
318
- tableLocales: adapter.tables[`${blockTableName}${adapter.localesSuffix}`]
319
- });
320
- }
321
- // blocks relationships are defined from the collection or globals table down to the block, bypassing any subBlocks
322
- rootRelationsToBuild.set(`_blocks_${block.slug}`, {
323
- type: 'many',
324
- // blocks are not localized on the parent table
325
- localized: false,
326
- target: blockTableName
327
- });
328
- });
329
- break;
330
- }
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
- }
399
- case 'group':
400
- case 'tab':
401
- {
402
- if (!('name' in field)) {
403
- const { hasLocalizedField: groupHasLocalizedField, hasLocalizedManyNumberField: groupHasLocalizedManyNumberField, hasLocalizedManyTextField: groupHasLocalizedManyTextField, hasLocalizedRelationshipField: groupHasLocalizedRelationshipField, hasManyNumberField: groupHasManyNumberField, hasManyTextField: groupHasManyTextField } = traverseFields({
404
- adapter,
405
- columnPrefix,
406
- columns,
407
- disableNotNull,
408
- disableUnique,
409
- fieldPrefix,
410
- fields: field.fields,
411
- forceLocalized,
412
- indexes,
413
- localesColumns,
414
- localesIndexes,
415
- newTableName,
416
- parentTableName,
417
- relationships,
418
- relationsToBuild,
419
- rootRelationsToBuild,
420
- rootTableIDColType,
421
- rootTableName,
422
- uniqueRelationships,
423
- versions,
424
- withinLocalizedArrayOrBlock
425
- });
426
- if (groupHasLocalizedField) {
427
- hasLocalizedField = true;
428
- }
429
- if (groupHasLocalizedRelationshipField) {
430
- hasLocalizedRelationshipField = true;
431
- }
432
- if (groupHasManyTextField) {
433
- hasManyTextField = true;
434
- }
435
- if (groupHasLocalizedManyTextField) {
436
- hasLocalizedManyTextField = true;
437
- }
438
- if (groupHasManyNumberField) {
439
- hasManyNumberField = true;
440
- }
441
- if (groupHasLocalizedManyNumberField) {
442
- hasLocalizedManyNumberField = true;
443
- }
444
- break;
445
- }
446
- const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull;
447
- const { hasLocalizedField: groupHasLocalizedField, hasLocalizedManyNumberField: groupHasLocalizedManyNumberField, hasLocalizedManyTextField: groupHasLocalizedManyTextField, hasLocalizedRelationshipField: groupHasLocalizedRelationshipField, hasManyNumberField: groupHasManyNumberField, hasManyTextField: groupHasManyTextField } = traverseFields({
448
- adapter,
449
- columnPrefix: `${columnName}_`,
450
- columns,
451
- disableNotNull: disableNotNullFromHere,
452
- disableUnique,
453
- fieldPrefix: `${fieldName}.`,
454
- fields: field.fields,
455
- forceLocalized: field.localized,
456
- indexes,
457
- localesColumns,
458
- localesIndexes,
459
- newTableName: `${parentTableName}_${columnName}`,
460
- parentTableName,
461
- relationships,
462
- relationsToBuild,
463
- rootRelationsToBuild,
464
- rootTableIDColType,
465
- rootTableName,
466
- uniqueRelationships,
467
- versions,
468
- withinLocalizedArrayOrBlock: withinLocalizedArrayOrBlock || field.localized
469
- });
470
- if (groupHasLocalizedField) {
471
- hasLocalizedField = true;
472
- }
473
- if (groupHasLocalizedRelationshipField) {
474
- hasLocalizedRelationshipField = true;
475
- }
476
- if (groupHasManyTextField) {
477
- hasManyTextField = true;
478
- }
479
- if (groupHasLocalizedManyTextField) {
480
- hasLocalizedManyTextField = true;
481
- }
482
- if (groupHasManyNumberField) {
483
- hasManyNumberField = true;
484
- }
485
- if (groupHasLocalizedManyNumberField) {
486
- hasLocalizedManyNumberField = true;
487
- }
488
- break;
489
- }
490
- case 'json':
491
- case 'richText':
492
- {
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);
513
- }
514
- break;
515
- }
516
- case 'point':
517
- {
518
- targetTable[fieldName] = withDefault(geometryColumn(columnName), field);
519
- if (!adapter.extensions.postgis) {
520
- adapter.extensions.postgis = true;
521
- }
522
- break;
523
- }
524
- case 'radio':
525
- case 'select':
526
- {
527
- const enumName = createTableName({
528
- adapter,
529
- config: field,
530
- parentTableName: newTableName,
531
- prefix: `enum_${newTableName}_`,
532
- target: 'enumName',
533
- throwValidationError
534
- });
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);
606
- }
607
- break;
608
- }
609
- case 'relationship':
610
- case 'upload':
611
- if (Array.isArray(field.relationTo)) {
612
- field.relationTo.forEach((relation)=>{
613
- relationships.add(relation);
614
- if (field.unique && !disableUnique && !disableRelsTableUnique) {
615
- uniqueRelationships.add(relation);
616
- }
617
- });
618
- } else if (field.hasMany) {
619
- relationships.add(field.relationTo);
620
- if (field.unique && !disableUnique && !disableRelsTableUnique) {
621
- uniqueRelationships.add(field.relationTo);
622
- }
623
- } else {
624
- // simple relationships get a column on the targetTable with a foreign key to the relationTo table
625
- const relationshipConfig = adapter.payload.collections[field.relationTo].config;
626
- const tableName = adapter.tableNameMap.get(toSnakeCase(field.relationTo));
627
- // get the id type of the related collection
628
- let colType = adapter.idType === 'uuid' ? 'uuid' : 'integer';
629
- const relatedCollectionCustomID = relationshipConfig.fields.find((field)=>fieldAffectsData(field) && field.name === 'id');
630
- if (relatedCollectionCustomID?.type === 'number') {
631
- colType = 'numeric';
632
- }
633
- if (relatedCollectionCustomID?.type === 'text') {
634
- colType = 'varchar';
635
- }
636
- // make the foreign key column for relationship using the correct id column type
637
- targetTable[fieldName] = parentIDColumnMap[colType](`${columnName}_id`).references(()=>adapter.tables[tableName].id, {
638
- onDelete: 'set null'
639
- });
640
- // add relationship to table
641
- relationsToBuild.set(fieldName, {
642
- type: 'one',
643
- localized: adapter.payload.config.localization && (field.localized || forceLocalized),
644
- target: tableName
645
- });
646
- // add notNull when not required
647
- if (!disableNotNull && field.required && !field.admin?.condition) {
648
- targetTable[fieldName].notNull();
649
- }
650
- break;
651
- }
652
- if (Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock) {
653
- hasLocalizedRelationshipField = true;
654
- }
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
- default:
726
- break;
727
- }
728
- const condition = field.admin && field.admin.condition;
729
- if (!disableNotNull && targetTable[fieldName] && 'required' in field && field.required && !condition) {
730
- targetTable[fieldName].notNull();
731
- }
732
- });
733
- return {
734
- hasLocalizedField,
735
- hasLocalizedManyNumberField,
736
- hasLocalizedManyTextField,
737
- hasLocalizedRelationshipField,
738
- hasManyNumberField,
739
- hasManyTextField
740
- };
741
- };
742
1
 
743
2
  //# sourceMappingURL=traverseFields.js.map