@payloadcms/db-sqlite 3.0.0-beta.100

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 (90) hide show
  1. package/README.md +30 -0
  2. package/dist/connect.d.ts +3 -0
  3. package/dist/connect.d.ts.map +1 -0
  4. package/dist/connect.js +51 -0
  5. package/dist/connect.js.map +1 -0
  6. package/dist/countDistinct.d.ts +3 -0
  7. package/dist/countDistinct.d.ts.map +1 -0
  8. package/dist/countDistinct.js +24 -0
  9. package/dist/countDistinct.js.map +1 -0
  10. package/dist/createJSONQuery/convertPathToJSONTraversal.d.ts +2 -0
  11. package/dist/createJSONQuery/convertPathToJSONTraversal.d.ts.map +1 -0
  12. package/dist/createJSONQuery/convertPathToJSONTraversal.js +12 -0
  13. package/dist/createJSONQuery/convertPathToJSONTraversal.js.map +1 -0
  14. package/dist/createJSONQuery/index.d.ts +3 -0
  15. package/dist/createJSONQuery/index.d.ts.map +1 -0
  16. package/dist/createJSONQuery/index.js +54 -0
  17. package/dist/createJSONQuery/index.js.map +1 -0
  18. package/dist/createMigration.d.ts +3 -0
  19. package/dist/createMigration.d.ts.map +1 -0
  20. package/dist/createMigration.js +84 -0
  21. package/dist/createMigration.js.map +1 -0
  22. package/dist/defaultSnapshot.d.ts +3 -0
  23. package/dist/defaultSnapshot.d.ts.map +1 -0
  24. package/dist/defaultSnapshot.js +14 -0
  25. package/dist/defaultSnapshot.js.map +1 -0
  26. package/dist/deleteWhere.d.ts +3 -0
  27. package/dist/deleteWhere.d.ts.map +1 -0
  28. package/dist/deleteWhere.js +6 -0
  29. package/dist/deleteWhere.js.map +1 -0
  30. package/dist/dropDatabase.d.ts +3 -0
  31. package/dist/dropDatabase.d.ts.map +1 -0
  32. package/dist/dropDatabase.js +19 -0
  33. package/dist/dropDatabase.js.map +1 -0
  34. package/dist/execute.d.ts +3 -0
  35. package/dist/execute.d.ts.map +1 -0
  36. package/dist/execute.js +13 -0
  37. package/dist/execute.js.map +1 -0
  38. package/dist/getMigrationTemplate.d.ts +4 -0
  39. package/dist/getMigrationTemplate.d.ts.map +1 -0
  40. package/dist/getMigrationTemplate.js +13 -0
  41. package/dist/getMigrationTemplate.js.map +1 -0
  42. package/dist/index.d.ts +6 -0
  43. package/dist/index.d.ts.map +1 -0
  44. package/dist/index.js +116 -0
  45. package/dist/index.js.map +1 -0
  46. package/dist/init.d.ts +3 -0
  47. package/dist/init.d.ts.map +1 -0
  48. package/dist/init.js +99 -0
  49. package/dist/init.js.map +1 -0
  50. package/dist/insert.d.ts +3 -0
  51. package/dist/insert.d.ts.map +1 -0
  52. package/dist/insert.js +13 -0
  53. package/dist/insert.js.map +1 -0
  54. package/dist/requireDrizzleKit.d.ts +6 -0
  55. package/dist/requireDrizzleKit.d.ts.map +1 -0
  56. package/dist/requireDrizzleKit.js +13 -0
  57. package/dist/requireDrizzleKit.js.map +1 -0
  58. package/dist/schema/build.d.ts +49 -0
  59. package/dist/schema/build.d.ts.map +1 -0
  60. package/dist/schema/build.js +415 -0
  61. package/dist/schema/build.js.map +1 -0
  62. package/dist/schema/createIndex.d.ts +12 -0
  63. package/dist/schema/createIndex.d.ts.map +1 -0
  64. package/dist/schema/createIndex.js +20 -0
  65. package/dist/schema/createIndex.js.map +1 -0
  66. package/dist/schema/getIDColumn.d.ts +8 -0
  67. package/dist/schema/getIDColumn.d.ts.map +1 -0
  68. package/dist/schema/getIDColumn.js +24 -0
  69. package/dist/schema/getIDColumn.js.map +1 -0
  70. package/dist/schema/idToUUID.d.ts +3 -0
  71. package/dist/schema/idToUUID.d.ts.map +1 -0
  72. package/dist/schema/idToUUID.js +11 -0
  73. package/dist/schema/idToUUID.js.map +1 -0
  74. package/dist/schema/setColumnID.d.ts +10 -0
  75. package/dist/schema/setColumnID.d.ts.map +1 -0
  76. package/dist/schema/setColumnID.js +20 -0
  77. package/dist/schema/setColumnID.js.map +1 -0
  78. package/dist/schema/traverseFields.d.ts +42 -0
  79. package/dist/schema/traverseFields.d.ts.map +1 -0
  80. package/dist/schema/traverseFields.js +731 -0
  81. package/dist/schema/traverseFields.js.map +1 -0
  82. package/dist/schema/withDefault.d.ts +4 -0
  83. package/dist/schema/withDefault.d.ts.map +1 -0
  84. package/dist/schema/withDefault.js +12 -0
  85. package/dist/schema/withDefault.js.map +1 -0
  86. package/dist/types.d.ts +138 -0
  87. package/dist/types.d.ts.map +1 -0
  88. package/dist/types.js +3 -0
  89. package/dist/types.js.map +1 -0
  90. package/package.json +64 -0
@@ -0,0 +1,731 @@
1
+ import { createTableName, hasLocalesTable, validateExistingBlockIsIdentical } from '@payloadcms/drizzle';
2
+ import { relations } from 'drizzle-orm';
3
+ import { foreignKey, index, integer, numeric, SQLiteIntegerBuilder, SQLiteNumericBuilder, SQLiteTextBuilder, text } from 'drizzle-orm/sqlite-core';
4
+ import { InvalidConfiguration } from 'payload';
5
+ import { fieldAffectsData, optionIsObject } from 'payload/shared';
6
+ import toSnakeCase from 'to-snake-case';
7
+ import { buildTable } from './build.js';
8
+ import { createIndex } from './createIndex.js';
9
+ import { getIDColumn } from './getIDColumn.js';
10
+ import { idToUUID } from './idToUUID.js';
11
+ import { withDefault } from './withDefault.js';
12
+ export const traverseFields = ({ adapter, columnPrefix, columns, disableNotNull, disableUnique = false, fieldPrefix, fields, forceLocalized, indexes, locales, localesColumns, localesIndexes, newTableName, parentTableName, relationships, relationsToBuild, rootRelationsToBuild, rootTableIDColType, rootTableName, versions, withinLocalizedArrayOrBlock })=>{
13
+ let hasLocalizedField = false;
14
+ let hasLocalizedRelationshipField = false;
15
+ let hasManyTextField = false;
16
+ let hasLocalizedManyTextField = false;
17
+ let hasManyNumberField = false;
18
+ let hasLocalizedManyNumberField = false;
19
+ let parentIDColType = 'integer';
20
+ if (columns.id instanceof SQLiteIntegerBuilder) {
21
+ parentIDColType = 'integer';
22
+ }
23
+ if (columns.id instanceof SQLiteNumericBuilder) {
24
+ parentIDColType = 'numeric';
25
+ }
26
+ if (columns.id instanceof SQLiteTextBuilder) {
27
+ parentIDColType = 'text';
28
+ }
29
+ fields.forEach((field)=>{
30
+ if ('name' in field && field.name === 'id') {
31
+ return;
32
+ }
33
+ let columnName;
34
+ let fieldName;
35
+ let targetTable = columns;
36
+ let targetIndexes = indexes;
37
+ if (fieldAffectsData(field)) {
38
+ columnName = `${columnPrefix || ''}${field.name[0] === '_' ? '_' : ''}${toSnakeCase(field.name)}`;
39
+ fieldName = `${fieldPrefix?.replace('.', '_') || ''}${field.name}`;
40
+ // If field is localized,
41
+ // add the column to the locale table instead of main table
42
+ if (adapter.payload.config.localization && (field.localized || forceLocalized) && field.type !== 'array' && field.type !== 'blocks' && ('hasMany' in field && field.hasMany !== true || !('hasMany' in field))) {
43
+ hasLocalizedField = true;
44
+ targetTable = localesColumns;
45
+ targetIndexes = localesIndexes;
46
+ }
47
+ if ((field.unique || field.index) && ![
48
+ 'array',
49
+ 'blocks',
50
+ 'group',
51
+ 'point',
52
+ 'relationship',
53
+ 'upload'
54
+ ].includes(field.type) && !('hasMany' in field && field.hasMany === true)) {
55
+ const unique = disableUnique !== true && field.unique;
56
+ if (unique) {
57
+ const constraintValue = `${fieldPrefix || ''}${field.name}`;
58
+ if (!adapter.fieldConstraints?.[rootTableName]) {
59
+ adapter.fieldConstraints[rootTableName] = {};
60
+ }
61
+ adapter.fieldConstraints[rootTableName][`${columnName}_idx`] = constraintValue;
62
+ }
63
+ targetIndexes[`${newTableName}_${field.name}Idx`] = createIndex({
64
+ name: fieldName,
65
+ columnName,
66
+ tableName: newTableName,
67
+ unique
68
+ });
69
+ }
70
+ }
71
+ switch(field.type){
72
+ case 'text':
73
+ {
74
+ if (field.hasMany) {
75
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock;
76
+ if (isLocalized) {
77
+ hasLocalizedManyTextField = true;
78
+ }
79
+ if (field.index) {
80
+ hasManyTextField = 'index';
81
+ } else if (!hasManyTextField) {
82
+ hasManyTextField = true;
83
+ }
84
+ if (field.unique) {
85
+ throw new InvalidConfiguration('Unique is not supported in SQLite for hasMany text fields.');
86
+ }
87
+ } else {
88
+ targetTable[fieldName] = withDefault(text(columnName), field);
89
+ }
90
+ break;
91
+ }
92
+ case 'email':
93
+ case 'code':
94
+ case 'textarea':
95
+ {
96
+ targetTable[fieldName] = withDefault(text(columnName), field);
97
+ break;
98
+ }
99
+ case 'number':
100
+ {
101
+ if (field.hasMany) {
102
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock;
103
+ if (isLocalized) {
104
+ hasLocalizedManyNumberField = true;
105
+ }
106
+ if (field.index) {
107
+ hasManyNumberField = 'index';
108
+ } else if (!hasManyNumberField) {
109
+ hasManyNumberField = true;
110
+ }
111
+ if (field.unique) {
112
+ throw new InvalidConfiguration('Unique is not supported in Postgres for hasMany number fields.');
113
+ }
114
+ } else {
115
+ targetTable[fieldName] = withDefault(numeric(columnName), field);
116
+ }
117
+ break;
118
+ }
119
+ case 'richText':
120
+ case 'json':
121
+ {
122
+ targetTable[fieldName] = withDefault(text(columnName, {
123
+ mode: 'json'
124
+ }), field);
125
+ break;
126
+ }
127
+ case 'date':
128
+ {
129
+ targetTable[fieldName] = withDefault(text(columnName), field);
130
+ break;
131
+ }
132
+ case 'point':
133
+ {
134
+ break;
135
+ }
136
+ case 'radio':
137
+ case 'select':
138
+ {
139
+ const options = field.options.map((option)=>{
140
+ if (optionIsObject(option)) {
141
+ return option.value;
142
+ }
143
+ return option;
144
+ });
145
+ if (field.type === 'select' && field.hasMany) {
146
+ const selectTableName = createTableName({
147
+ adapter,
148
+ config: field,
149
+ parentTableName: newTableName,
150
+ prefix: `${newTableName}_`,
151
+ versionsCustomName: versions
152
+ });
153
+ const baseColumns = {
154
+ order: integer('order').notNull(),
155
+ parent: getIDColumn({
156
+ name: 'parent_id',
157
+ type: parentIDColType,
158
+ notNull: true,
159
+ primaryKey: false
160
+ }),
161
+ value: text('value', {
162
+ enum: options
163
+ })
164
+ };
165
+ const baseExtraConfig = {
166
+ orderIdx: (cols)=>index(`${selectTableName}_order_idx`).on(cols.order),
167
+ parentFk: (cols)=>foreignKey({
168
+ name: `${selectTableName}_parent_fk`,
169
+ columns: [
170
+ cols.parent
171
+ ],
172
+ foreignColumns: [
173
+ adapter.tables[parentTableName].id
174
+ ]
175
+ }).onDelete('cascade'),
176
+ parentIdx: (cols)=>index(`${selectTableName}_parent_idx`).on(cols.parent)
177
+ };
178
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock;
179
+ if (isLocalized) {
180
+ baseColumns.locale = text('locale', {
181
+ enum: locales
182
+ }).notNull();
183
+ baseExtraConfig.localeIdx = (cols)=>index(`${selectTableName}_locale_idx`).on(cols.locale);
184
+ }
185
+ if (field.index) {
186
+ baseExtraConfig.value = (cols)=>index(`${selectTableName}_value_idx`).on(cols.value);
187
+ }
188
+ buildTable({
189
+ adapter,
190
+ baseColumns,
191
+ baseExtraConfig,
192
+ disableNotNull,
193
+ disableUnique,
194
+ fields: [],
195
+ rootTableName,
196
+ tableName: selectTableName,
197
+ versions
198
+ });
199
+ relationsToBuild.set(fieldName, {
200
+ type: 'many',
201
+ // selects have their own localized table, independent of the base table.
202
+ localized: false,
203
+ target: selectTableName
204
+ });
205
+ adapter.relations[`relations_${selectTableName}`] = relations(adapter.tables[selectTableName], ({ one })=>({
206
+ parent: one(adapter.tables[parentTableName], {
207
+ fields: [
208
+ adapter.tables[selectTableName].parent
209
+ ],
210
+ references: [
211
+ adapter.tables[parentTableName].id
212
+ ],
213
+ relationName: fieldName
214
+ })
215
+ }));
216
+ } else {
217
+ targetTable[fieldName] = withDefault(text(fieldName, {
218
+ enum: options
219
+ }), field);
220
+ }
221
+ break;
222
+ }
223
+ case 'checkbox':
224
+ {
225
+ targetTable[fieldName] = withDefault(integer(columnName, {
226
+ mode: 'boolean'
227
+ }), field);
228
+ break;
229
+ }
230
+ case 'array':
231
+ {
232
+ const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull;
233
+ const arrayTableName = createTableName({
234
+ adapter,
235
+ config: field,
236
+ parentTableName: newTableName,
237
+ prefix: `${newTableName}_`,
238
+ versionsCustomName: versions
239
+ });
240
+ const baseColumns = {
241
+ _order: integer('_order').notNull(),
242
+ _parentID: getIDColumn({
243
+ name: '_parent_id',
244
+ type: parentIDColType,
245
+ notNull: true,
246
+ primaryKey: false
247
+ })
248
+ };
249
+ const baseExtraConfig = {
250
+ _orderIdx: (cols)=>index(`${arrayTableName}_order_idx`).on(cols._order),
251
+ _parentIDFk: (cols)=>foreignKey({
252
+ name: `${arrayTableName}_parent_id_fk`,
253
+ columns: [
254
+ cols['_parentID']
255
+ ],
256
+ foreignColumns: [
257
+ adapter.tables[parentTableName].id
258
+ ]
259
+ }).onDelete('cascade'),
260
+ _parentIDIdx: (cols)=>index(`${arrayTableName}_parent_id_idx`).on(cols._parentID)
261
+ };
262
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock;
263
+ if (isLocalized) {
264
+ baseColumns._locale = text('_locale', {
265
+ enum: locales
266
+ }).notNull();
267
+ baseExtraConfig._localeIdx = (cols)=>index(`${arrayTableName}_locale_idx`).on(cols._locale);
268
+ }
269
+ const { hasLocalizedManyNumberField: subHasLocalizedManyNumberField, hasLocalizedManyTextField: subHasLocalizedManyTextField, hasLocalizedRelationshipField: subHasLocalizedRelationshipField, hasManyNumberField: subHasManyNumberField, hasManyTextField: subHasManyTextField, relationsToBuild: subRelationsToBuild } = buildTable({
270
+ adapter,
271
+ baseColumns,
272
+ baseExtraConfig,
273
+ disableNotNull: disableNotNullFromHere,
274
+ disableUnique,
275
+ fields: disableUnique ? idToUUID(field.fields) : field.fields,
276
+ rootRelationships: relationships,
277
+ rootRelationsToBuild,
278
+ rootTableIDColType,
279
+ rootTableName,
280
+ tableName: arrayTableName,
281
+ versions,
282
+ withinLocalizedArrayOrBlock: isLocalized
283
+ });
284
+ if (subHasLocalizedManyNumberField) {
285
+ hasLocalizedManyNumberField = subHasLocalizedManyNumberField;
286
+ }
287
+ if (subHasLocalizedRelationshipField) {
288
+ hasLocalizedRelationshipField = subHasLocalizedRelationshipField;
289
+ }
290
+ if (subHasLocalizedManyTextField) {
291
+ hasLocalizedManyTextField = subHasLocalizedManyTextField;
292
+ }
293
+ if (subHasManyTextField) {
294
+ if (!hasManyTextField || subHasManyTextField === 'index') {
295
+ hasManyTextField = subHasManyTextField;
296
+ }
297
+ }
298
+ if (subHasManyNumberField) {
299
+ if (!hasManyNumberField || subHasManyNumberField === 'index') {
300
+ hasManyNumberField = subHasManyNumberField;
301
+ }
302
+ }
303
+ relationsToBuild.set(fieldName, {
304
+ type: 'many',
305
+ // arrays have their own localized table, independent of the base table.
306
+ localized: false,
307
+ target: arrayTableName
308
+ });
309
+ adapter.relations[`relations_${arrayTableName}`] = relations(adapter.tables[arrayTableName], ({ many, one })=>{
310
+ const result = {
311
+ _parentID: one(adapter.tables[parentTableName], {
312
+ fields: [
313
+ adapter.tables[arrayTableName]._parentID
314
+ ],
315
+ references: [
316
+ adapter.tables[parentTableName].id
317
+ ],
318
+ relationName: fieldName
319
+ })
320
+ };
321
+ if (hasLocalesTable(field.fields)) {
322
+ result._locales = many(adapter.tables[`${arrayTableName}${adapter.localesSuffix}`], {
323
+ relationName: '_locales'
324
+ });
325
+ }
326
+ subRelationsToBuild.forEach(({ type, localized, target }, key)=>{
327
+ if (type === 'one') {
328
+ const arrayWithLocalized = localized ? `${arrayTableName}${adapter.localesSuffix}` : arrayTableName;
329
+ result[key] = one(adapter.tables[target], {
330
+ fields: [
331
+ adapter.tables[arrayWithLocalized][key]
332
+ ],
333
+ references: [
334
+ adapter.tables[target].id
335
+ ],
336
+ relationName: key
337
+ });
338
+ }
339
+ if (type === 'many') {
340
+ result[key] = many(adapter.tables[target], {
341
+ relationName: key
342
+ });
343
+ }
344
+ });
345
+ return result;
346
+ });
347
+ break;
348
+ }
349
+ case 'blocks':
350
+ {
351
+ const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull;
352
+ field.blocks.forEach((block)=>{
353
+ const blockTableName = createTableName({
354
+ adapter,
355
+ config: block,
356
+ parentTableName: rootTableName,
357
+ prefix: `${rootTableName}_blocks_`,
358
+ versionsCustomName: versions
359
+ });
360
+ if (!adapter.tables[blockTableName]) {
361
+ const baseColumns = {
362
+ _order: integer('_order').notNull(),
363
+ _parentID: getIDColumn({
364
+ name: '_parent_id',
365
+ type: rootTableIDColType,
366
+ notNull: true,
367
+ primaryKey: false
368
+ }),
369
+ _path: text('_path').notNull()
370
+ };
371
+ const baseExtraConfig = {
372
+ _orderIdx: (cols)=>index(`${blockTableName}_order_idx`).on(cols._order),
373
+ _parentIdFk: (cols)=>foreignKey({
374
+ name: `${blockTableName}_parent_id_fk`,
375
+ columns: [
376
+ cols._parentID
377
+ ],
378
+ foreignColumns: [
379
+ adapter.tables[rootTableName].id
380
+ ]
381
+ }).onDelete('cascade'),
382
+ _parentIDIdx: (cols)=>index(`${blockTableName}_parent_id_idx`).on(cols._parentID),
383
+ _pathIdx: (cols)=>index(`${blockTableName}_path_idx`).on(cols._path)
384
+ };
385
+ const isLocalized = Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock;
386
+ if (isLocalized) {
387
+ baseColumns._locale = text('_locale', {
388
+ enum: locales
389
+ }).notNull();
390
+ baseExtraConfig._localeIdx = (cols)=>index(`${blockTableName}_locale_idx`).on(cols._locale);
391
+ }
392
+ const { hasLocalizedManyNumberField: subHasLocalizedManyNumberField, hasLocalizedManyTextField: subHasLocalizedManyTextField, hasLocalizedRelationshipField: subHasLocalizedRelationshipField, hasManyNumberField: subHasManyNumberField, hasManyTextField: subHasManyTextField, relationsToBuild: subRelationsToBuild } = buildTable({
393
+ adapter,
394
+ baseColumns,
395
+ baseExtraConfig,
396
+ disableNotNull: disableNotNullFromHere,
397
+ disableUnique,
398
+ fields: disableUnique ? idToUUID(block.fields) : block.fields,
399
+ rootRelationships: relationships,
400
+ rootRelationsToBuild,
401
+ rootTableIDColType,
402
+ rootTableName,
403
+ tableName: blockTableName,
404
+ versions,
405
+ withinLocalizedArrayOrBlock: isLocalized
406
+ });
407
+ if (subHasLocalizedManyNumberField) {
408
+ hasLocalizedManyNumberField = subHasLocalizedManyNumberField;
409
+ }
410
+ if (subHasLocalizedRelationshipField) {
411
+ hasLocalizedRelationshipField = subHasLocalizedRelationshipField;
412
+ }
413
+ if (subHasLocalizedManyTextField) {
414
+ hasLocalizedManyTextField = subHasLocalizedManyTextField;
415
+ }
416
+ if (subHasManyTextField) {
417
+ if (!hasManyTextField || subHasManyTextField === 'index') {
418
+ hasManyTextField = subHasManyTextField;
419
+ }
420
+ }
421
+ if (subHasManyNumberField) {
422
+ if (!hasManyNumberField || subHasManyNumberField === 'index') {
423
+ hasManyNumberField = subHasManyNumberField;
424
+ }
425
+ }
426
+ adapter.relations[`relations_${blockTableName}`] = relations(adapter.tables[blockTableName], ({ many, one })=>{
427
+ const result = {
428
+ _parentID: one(adapter.tables[rootTableName], {
429
+ fields: [
430
+ adapter.tables[blockTableName]._parentID
431
+ ],
432
+ references: [
433
+ adapter.tables[rootTableName].id
434
+ ],
435
+ relationName: `_blocks_${block.slug}`
436
+ })
437
+ };
438
+ if (hasLocalesTable(block.fields)) {
439
+ result._locales = many(adapter.tables[`${blockTableName}${adapter.localesSuffix}`], {
440
+ relationName: '_locales'
441
+ });
442
+ }
443
+ subRelationsToBuild.forEach(({ type, localized, target }, key)=>{
444
+ if (type === 'one') {
445
+ const blockWithLocalized = localized ? `${blockTableName}${adapter.localesSuffix}` : blockTableName;
446
+ result[key] = one(adapter.tables[target], {
447
+ fields: [
448
+ adapter.tables[blockWithLocalized][key]
449
+ ],
450
+ references: [
451
+ adapter.tables[target].id
452
+ ],
453
+ relationName: key
454
+ });
455
+ }
456
+ if (type === 'many') {
457
+ result[key] = many(adapter.tables[target], {
458
+ relationName: key
459
+ });
460
+ }
461
+ });
462
+ return result;
463
+ });
464
+ } else if (process.env.NODE_ENV !== 'production' && !versions) {
465
+ validateExistingBlockIsIdentical({
466
+ block,
467
+ localized: field.localized,
468
+ rootTableName,
469
+ table: adapter.tables[blockTableName],
470
+ tableLocales: adapter.tables[`${blockTableName}${adapter.localesSuffix}`]
471
+ });
472
+ }
473
+ // blocks relationships are defined from the collection or globals table down to the block, bypassing any subBlocks
474
+ rootRelationsToBuild.set(`_blocks_${block.slug}`, {
475
+ type: 'many',
476
+ // blocks are not localized on the parent table
477
+ localized: false,
478
+ target: blockTableName
479
+ });
480
+ });
481
+ break;
482
+ }
483
+ case 'tab':
484
+ case 'group':
485
+ {
486
+ if (!('name' in field)) {
487
+ const { hasLocalizedField: groupHasLocalizedField, hasLocalizedManyNumberField: groupHasLocalizedManyNumberField, hasLocalizedManyTextField: groupHasLocalizedManyTextField, hasLocalizedRelationshipField: groupHasLocalizedRelationshipField, hasManyNumberField: groupHasManyNumberField, hasManyTextField: groupHasManyTextField } = traverseFields({
488
+ adapter,
489
+ columnPrefix,
490
+ columns,
491
+ disableNotNull,
492
+ disableUnique,
493
+ fieldPrefix,
494
+ fields: field.fields,
495
+ forceLocalized,
496
+ indexes,
497
+ locales,
498
+ localesColumns,
499
+ localesIndexes,
500
+ newTableName,
501
+ parentTableName,
502
+ relationships,
503
+ relationsToBuild,
504
+ rootRelationsToBuild,
505
+ rootTableIDColType,
506
+ rootTableName,
507
+ versions,
508
+ withinLocalizedArrayOrBlock
509
+ });
510
+ if (groupHasLocalizedField) {
511
+ hasLocalizedField = true;
512
+ }
513
+ if (groupHasLocalizedRelationshipField) {
514
+ hasLocalizedRelationshipField = true;
515
+ }
516
+ if (groupHasManyTextField) {
517
+ hasManyTextField = true;
518
+ }
519
+ if (groupHasLocalizedManyTextField) {
520
+ hasLocalizedManyTextField = true;
521
+ }
522
+ if (groupHasManyNumberField) {
523
+ hasManyNumberField = true;
524
+ }
525
+ if (groupHasLocalizedManyNumberField) {
526
+ hasLocalizedManyNumberField = true;
527
+ }
528
+ break;
529
+ }
530
+ const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull;
531
+ const { hasLocalizedField: groupHasLocalizedField, hasLocalizedManyNumberField: groupHasLocalizedManyNumberField, hasLocalizedManyTextField: groupHasLocalizedManyTextField, hasLocalizedRelationshipField: groupHasLocalizedRelationshipField, hasManyNumberField: groupHasManyNumberField, hasManyTextField: groupHasManyTextField } = traverseFields({
532
+ adapter,
533
+ columnPrefix: `${columnName}_`,
534
+ columns,
535
+ disableNotNull: disableNotNullFromHere,
536
+ disableUnique,
537
+ fieldPrefix: `${fieldName}.`,
538
+ fields: field.fields,
539
+ forceLocalized: field.localized,
540
+ indexes,
541
+ locales,
542
+ localesColumns,
543
+ localesIndexes,
544
+ newTableName: `${parentTableName}_${columnName}`,
545
+ parentTableName,
546
+ relationships,
547
+ relationsToBuild,
548
+ rootRelationsToBuild,
549
+ rootTableIDColType,
550
+ rootTableName,
551
+ versions,
552
+ withinLocalizedArrayOrBlock
553
+ });
554
+ if (groupHasLocalizedField) {
555
+ hasLocalizedField = true;
556
+ }
557
+ if (groupHasLocalizedRelationshipField) {
558
+ hasLocalizedRelationshipField = true;
559
+ }
560
+ if (groupHasManyTextField) {
561
+ hasManyTextField = true;
562
+ }
563
+ if (groupHasLocalizedManyTextField) {
564
+ hasLocalizedManyTextField = true;
565
+ }
566
+ if (groupHasManyNumberField) {
567
+ hasManyNumberField = true;
568
+ }
569
+ if (groupHasLocalizedManyNumberField) {
570
+ hasLocalizedManyNumberField = true;
571
+ }
572
+ break;
573
+ }
574
+ case 'tabs':
575
+ {
576
+ const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull;
577
+ const { hasLocalizedField: tabHasLocalizedField, hasLocalizedManyNumberField: tabHasLocalizedManyNumberField, hasLocalizedManyTextField: tabHasLocalizedManyTextField, hasLocalizedRelationshipField: tabHasLocalizedRelationshipField, hasManyNumberField: tabHasManyNumberField, hasManyTextField: tabHasManyTextField } = traverseFields({
578
+ adapter,
579
+ columnPrefix,
580
+ columns,
581
+ disableNotNull: disableNotNullFromHere,
582
+ disableUnique,
583
+ fieldPrefix,
584
+ fields: field.tabs.map((tab)=>({
585
+ ...tab,
586
+ type: 'tab'
587
+ })),
588
+ forceLocalized,
589
+ indexes,
590
+ locales,
591
+ localesColumns,
592
+ localesIndexes,
593
+ newTableName,
594
+ parentTableName,
595
+ relationships,
596
+ relationsToBuild,
597
+ rootRelationsToBuild,
598
+ rootTableIDColType,
599
+ rootTableName,
600
+ versions,
601
+ withinLocalizedArrayOrBlock
602
+ });
603
+ if (tabHasLocalizedField) {
604
+ hasLocalizedField = true;
605
+ }
606
+ if (tabHasLocalizedRelationshipField) {
607
+ hasLocalizedRelationshipField = true;
608
+ }
609
+ if (tabHasManyTextField) {
610
+ hasManyTextField = true;
611
+ }
612
+ if (tabHasLocalizedManyTextField) {
613
+ hasLocalizedManyTextField = true;
614
+ }
615
+ if (tabHasManyNumberField) {
616
+ hasManyNumberField = true;
617
+ }
618
+ if (tabHasLocalizedManyNumberField) {
619
+ hasLocalizedManyNumberField = true;
620
+ }
621
+ break;
622
+ }
623
+ case 'row':
624
+ case 'collapsible':
625
+ {
626
+ const disableNotNullFromHere = Boolean(field.admin?.condition) || disableNotNull;
627
+ const { hasLocalizedField: rowHasLocalizedField, hasLocalizedManyNumberField: rowHasLocalizedManyNumberField, hasLocalizedManyTextField: rowHasLocalizedManyTextField, hasLocalizedRelationshipField: rowHasLocalizedRelationshipField, hasManyNumberField: rowHasManyNumberField, hasManyTextField: rowHasManyTextField } = traverseFields({
628
+ adapter,
629
+ columnPrefix,
630
+ columns,
631
+ disableNotNull: disableNotNullFromHere,
632
+ disableUnique,
633
+ fieldPrefix,
634
+ fields: field.fields,
635
+ forceLocalized,
636
+ indexes,
637
+ locales,
638
+ localesColumns,
639
+ localesIndexes,
640
+ newTableName,
641
+ parentTableName,
642
+ relationships,
643
+ relationsToBuild,
644
+ rootRelationsToBuild,
645
+ rootTableIDColType,
646
+ rootTableName,
647
+ versions,
648
+ withinLocalizedArrayOrBlock
649
+ });
650
+ if (rowHasLocalizedField) {
651
+ hasLocalizedField = true;
652
+ }
653
+ if (rowHasLocalizedRelationshipField) {
654
+ hasLocalizedRelationshipField = true;
655
+ }
656
+ if (rowHasManyTextField) {
657
+ hasManyTextField = true;
658
+ }
659
+ if (rowHasLocalizedManyTextField) {
660
+ hasLocalizedManyTextField = true;
661
+ }
662
+ if (rowHasManyNumberField) {
663
+ hasManyNumberField = true;
664
+ }
665
+ if (rowHasLocalizedManyNumberField) {
666
+ hasLocalizedManyNumberField = true;
667
+ }
668
+ break;
669
+ }
670
+ case 'relationship':
671
+ case 'upload':
672
+ if (Array.isArray(field.relationTo)) {
673
+ field.relationTo.forEach((relation)=>relationships.add(relation));
674
+ } else if (field.hasMany) {
675
+ relationships.add(field.relationTo);
676
+ } else {
677
+ // simple relationships get a column on the targetTable with a foreign key to the relationTo table
678
+ const relationshipConfig = adapter.payload.collections[field.relationTo].config;
679
+ const tableName = adapter.tableNameMap.get(toSnakeCase(field.relationTo));
680
+ // get the id type of the related collection
681
+ let colType = 'integer';
682
+ const relatedCollectionCustomID = relationshipConfig.fields.find((field)=>fieldAffectsData(field) && field.name === 'id');
683
+ if (relatedCollectionCustomID?.type === 'number') {
684
+ colType = 'numeric';
685
+ }
686
+ if (relatedCollectionCustomID?.type === 'text') {
687
+ colType = 'text';
688
+ }
689
+ // make the foreign key column for relationship using the correct id column type
690
+ targetTable[fieldName] = getIDColumn({
691
+ name: `${columnName}_id`,
692
+ type: colType,
693
+ primaryKey: false
694
+ }).references(()=>adapter.tables[tableName].id, {
695
+ onDelete: 'set null'
696
+ });
697
+ // add relationship to table
698
+ relationsToBuild.set(fieldName, {
699
+ type: 'one',
700
+ localized: adapter.payload.config.localization && field.localized,
701
+ target: tableName
702
+ });
703
+ // add notNull when not required
704
+ if (!disableNotNull && field.required && !field.admin?.condition) {
705
+ targetTable[fieldName].notNull();
706
+ }
707
+ break;
708
+ }
709
+ if (Boolean(field.localized && adapter.payload.config.localization) || withinLocalizedArrayOrBlock) {
710
+ hasLocalizedRelationshipField = true;
711
+ }
712
+ break;
713
+ default:
714
+ break;
715
+ }
716
+ const condition = field.admin && field.admin.condition;
717
+ if (!disableNotNull && targetTable[fieldName] && 'required' in field && field.required && !condition) {
718
+ targetTable[fieldName].notNull();
719
+ }
720
+ });
721
+ return {
722
+ hasLocalizedField,
723
+ hasLocalizedManyNumberField,
724
+ hasLocalizedManyTextField,
725
+ hasLocalizedRelationshipField,
726
+ hasManyNumberField,
727
+ hasManyTextField
728
+ };
729
+ };
730
+
731
+ //# sourceMappingURL=traverseFields.js.map