@payloadcms/db-sqlite 3.0.0-canary.2c2c95f

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 +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/generateDrizzleJSON.d.ts +3 -0
  39. package/dist/generateDrizzleJSON.d.ts.map +1 -0
  40. package/dist/generateDrizzleJSON.js +8 -0
  41. package/dist/generateDrizzleJSON.js.map +1 -0
  42. package/dist/getMigrationTemplate.d.ts +3 -0
  43. package/dist/getMigrationTemplate.d.ts.map +1 -0
  44. package/dist/getMigrationTemplate.js +12 -0
  45. package/dist/getMigrationTemplate.js.map +1 -0
  46. package/dist/index.d.ts +6 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +116 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/init.d.ts +3 -0
  51. package/dist/init.d.ts.map +1 -0
  52. package/dist/init.js +88 -0
  53. package/dist/init.js.map +1 -0
  54. package/dist/insert.d.ts +3 -0
  55. package/dist/insert.d.ts.map +1 -0
  56. package/dist/insert.js +13 -0
  57. package/dist/insert.js.map +1 -0
  58. package/dist/requireDrizzleKit.d.ts +3 -0
  59. package/dist/requireDrizzleKit.d.ts.map +1 -0
  60. package/dist/requireDrizzleKit.js +10 -0
  61. package/dist/requireDrizzleKit.js.map +1 -0
  62. package/dist/schema/build.d.ts +49 -0
  63. package/dist/schema/build.d.ts.map +1 -0
  64. package/dist/schema/build.js +407 -0
  65. package/dist/schema/build.js.map +1 -0
  66. package/dist/schema/createIndex.d.ts +12 -0
  67. package/dist/schema/createIndex.d.ts.map +1 -0
  68. package/dist/schema/createIndex.js +18 -0
  69. package/dist/schema/createIndex.js.map +1 -0
  70. package/dist/schema/getIDColumn.d.ts +8 -0
  71. package/dist/schema/getIDColumn.d.ts.map +1 -0
  72. package/dist/schema/getIDColumn.js +24 -0
  73. package/dist/schema/getIDColumn.js.map +1 -0
  74. package/dist/schema/idToUUID.d.ts +3 -0
  75. package/dist/schema/idToUUID.d.ts.map +1 -0
  76. package/dist/schema/idToUUID.js +11 -0
  77. package/dist/schema/idToUUID.js.map +1 -0
  78. package/dist/schema/setColumnID.d.ts +10 -0
  79. package/dist/schema/setColumnID.d.ts.map +1 -0
  80. package/dist/schema/setColumnID.js +20 -0
  81. package/dist/schema/setColumnID.js.map +1 -0
  82. package/dist/schema/traverseFields.d.ts +37 -0
  83. package/dist/schema/traverseFields.d.ts.map +1 -0
  84. package/dist/schema/traverseFields.js +633 -0
  85. package/dist/schema/traverseFields.js.map +1 -0
  86. package/dist/types.d.ts +136 -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 +62 -0
@@ -0,0 +1,37 @@
1
+ import type { IndexBuilder, SQLiteColumnBuilder } from 'drizzle-orm/sqlite-core';
2
+ import type { Field, TabAsField } from 'payload';
3
+ import type { GenericColumns, IDType, SQLiteAdapter } from '../types.js';
4
+ import type { RelationMap } from './build.js';
5
+ type Args = {
6
+ adapter: SQLiteAdapter;
7
+ columnPrefix?: string;
8
+ columns: Record<string, SQLiteColumnBuilder>;
9
+ disableNotNull: boolean;
10
+ disableUnique?: boolean;
11
+ fieldPrefix?: string;
12
+ fields: (Field | TabAsField)[];
13
+ forceLocalized?: boolean;
14
+ indexes: Record<string, (cols: GenericColumns) => IndexBuilder>;
15
+ locales: [string, ...string[]];
16
+ localesColumns: Record<string, SQLiteColumnBuilder>;
17
+ localesIndexes: Record<string, (cols: GenericColumns) => IndexBuilder>;
18
+ newTableName: string;
19
+ parentTableName: string;
20
+ relationsToBuild: RelationMap;
21
+ relationships: Set<string>;
22
+ rootRelationsToBuild?: RelationMap;
23
+ rootTableIDColType: IDType;
24
+ rootTableName: string;
25
+ versions: boolean;
26
+ };
27
+ type Result = {
28
+ hasLocalizedField: boolean;
29
+ hasLocalizedManyNumberField: boolean;
30
+ hasLocalizedManyTextField: boolean;
31
+ hasLocalizedRelationshipField: boolean;
32
+ hasManyNumberField: 'index' | boolean;
33
+ hasManyTextField: 'index' | boolean;
34
+ };
35
+ export declare const traverseFields: ({ adapter, columnPrefix, columns, disableNotNull, disableUnique, fieldPrefix, fields, forceLocalized, indexes, locales, localesColumns, localesIndexes, newTableName, parentTableName, relationsToBuild, relationships, rootRelationsToBuild, rootTableIDColType, rootTableName, versions, }: Args) => Result;
36
+ export {};
37
+ //# sourceMappingURL=traverseFields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverseFields.d.ts","sourceRoot":"","sources":["../../src/schema/traverseFields.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAChF,OAAO,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAsBhD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AACxE,OAAO,KAAK,EAAmB,WAAW,EAAE,MAAM,YAAY,CAAA;AAO9D,KAAK,IAAI,GAAG;IACV,OAAO,EAAE,aAAa,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;IAC5C,cAAc,EAAE,OAAO,CAAA;IACvB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,CAAC,KAAK,GAAG,UAAU,CAAC,EAAE,CAAA;IAC9B,cAAc,CAAC,EAAE,OAAO,CAAA;IACxB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,YAAY,CAAC,CAAA;IAC/D,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAA;IAC9B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;IACnD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,YAAY,CAAC,CAAA;IACtE,YAAY,EAAE,MAAM,CAAA;IACpB,eAAe,EAAE,MAAM,CAAA;IACvB,gBAAgB,EAAE,WAAW,CAAA;IAC7B,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC1B,oBAAoB,CAAC,EAAE,WAAW,CAAA;IAClC,kBAAkB,EAAE,MAAM,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,KAAK,MAAM,GAAG;IACZ,iBAAiB,EAAE,OAAO,CAAA;IAC1B,2BAA2B,EAAE,OAAO,CAAA;IACpC,yBAAyB,EAAE,OAAO,CAAA;IAClC,6BAA6B,EAAE,OAAO,CAAA;IACtC,kBAAkB,EAAE,OAAO,GAAG,OAAO,CAAA;IACrC,gBAAgB,EAAE,OAAO,GAAG,OAAO,CAAA;CACpC,CAAA;AAED,eAAO,MAAM,cAAc,iSAqBxB,IAAI,KAAG,MA4rBT,CAAA"}
@@ -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