@payloadcms/db-sqlite 3.0.0-beta.69

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